projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix filename verification when in a subdirectory
[git.git]
/
diff.c
diff --git
a/diff.c
b/diff.c
index
14ffc77
..
903afa1
100644
(file)
--- a/
diff.c
+++ b/
diff.c
@@
-202,6
+202,8
@@
struct diffstat_t {
int alloc;
struct diffstat_file {
char *name;
int alloc;
struct diffstat_file {
char *name;
+ unsigned is_unmerged:1;
+ unsigned is_binary:1;
unsigned int added, deleted;
} **files;
};
unsigned int added, deleted;
} **files;
};
@@
-245,16
+247,17
@@
static void show_stats(struct diffstat_t* data)
if (data->nr == 0)
return;
if (data->nr == 0)
return;
- printf("---\n");
-
for (i = 0; i < data->nr; i++) {
struct diffstat_file *file = data->files[i];
for (i = 0; i < data->nr; i++) {
struct diffstat_file *file = data->files[i];
- if (max_change < file->added + file->deleted)
- max_change = file->added + file->deleted;
len = strlen(file->name);
if (max_len < len)
max_len = len;
len = strlen(file->name);
if (max_len < len)
max_len = len;
+
+ if (file->is_binary || file->is_unmerged)
+ continue;
+ if (max_change < file->added + file->deleted)
+ max_change = file->added + file->deleted;
}
for (i = 0; i < data->nr; i++) {
}
for (i = 0; i < data->nr; i++) {
@@
-266,7
+269,7
@@
static void show_stats(struct diffstat_t* data)
char *qname = xmalloc(len + 1);
quote_c_style(name, qname, NULL, 0);
free(name);
char *qname = xmalloc(len + 1);
quote_c_style(name, qname, NULL, 0);
free(name);
- name = qname;
+
data->files[i]->name =
name = qname;
}
/*
}
/*
@@
-294,13
+297,17
@@
static void show_stats(struct diffstat_t* data)
if (max + len > 70)
max = 70 - len;
if (max + len > 70)
max = 70 - len;
- if (added < 0) {
- /* binary file */
+ if (data->files[i]->is_binary) {
printf(" %s%-*s | Bin\n", prefix, len, name);
printf(" %s%-*s | Bin\n", prefix, len, name);
- continue;
- } else if (added + deleted == 0) {
+ goto free_diffstat_file;
+ }
+ else if (data->files[i]->is_unmerged) {
+ printf(" %s%-*s | Unmerged\n", prefix, len, name);
+ goto free_diffstat_file;
+ }
+ else if (added + deleted == 0) {
total_files--;
total_files--;
-
continu
e;
+
goto free_diffstat_fil
e;
}
add = added;
}
add = added;
@@
-314,11
+321,11
@@
static void show_stats(struct diffstat_t* data)
add = (add * max + max_change / 2) / max_change;
del = total - add;
}
add = (add * max + max_change / 2) / max_change;
del = total - add;
}
- /* TODO: binary */
printf(" %s%-*s |%5d %.*s%.*s\n", prefix,
len, name, added + deleted,
add, pluses, del, minuses);
printf(" %s%-*s |%5d %.*s%.*s\n", prefix,
len, name, added + deleted,
add, pluses, del, minuses);
- free(name);
+ free_diffstat_file:
+ free(data->files[i]->name);
free(data->files[i]);
}
free(data->files);
free(data->files[i]);
}
free(data->files);
@@
-426,11
+433,16
@@
static void builtin_diffstat(const char *name_a, const char *name_b,
data = diffstat_add(diffstat, name_a ? name_a : name_b);
data = diffstat_add(diffstat, name_a ? name_a : name_b);
+ if (!one || !two) {
+ data->is_unmerged = 1;
+ return;
+ }
+
if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
die("unable to read files to diff");
if (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2))
if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
die("unable to read files to diff");
if (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2))
- data->
added = -
1;
+ data->
is_binary =
1;
else {
/* Crazy xdl interfaces.. */
xpparam_t xpp;
else {
/* Crazy xdl interfaces.. */
xpparam_t xpp;
@@
-438,8
+450,8
@@
static void builtin_diffstat(const char *name_a, const char *name_b,
xdemitcb_t ecb;
xpp.flags = XDF_NEED_MINIMAL;
xdemitcb_t ecb;
xpp.flags = XDF_NEED_MINIMAL;
- xecfg.ctxlen =
3
;
- xecfg.flags =
XDL_EMIT_FUNCNAMES
;
+ xecfg.ctxlen =
0
;
+ xecfg.flags =
0
;
ecb.outf = xdiff_outf;
ecb.priv = diffstat;
xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb);
ecb.outf = xdiff_outf;
ecb.priv = diffstat;
xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb);
@@
-1018,6
+1030,16
@@
int diff_setup_done(struct diff_options *options)
options->detect_rename != DIFF_DETECT_COPY) ||
(0 <= options->rename_limit && !options->detect_rename))
return -1;
options->detect_rename != DIFF_DETECT_COPY) ||
(0 <= options->rename_limit && !options->detect_rename))
return -1;
+
+ /*
+ * These cases always need recursive; we do not drop caller-supplied
+ * recursive bits for other formats here.
+ */
+ if ((options->output_format == DIFF_FORMAT_PATCH) ||
+ (options->output_format == DIFF_FORMAT_DIFFSTAT) ||
+ (options->with_stat))
+ options->recursive = 1;
+
if (options->detect_rename && options->rename_limit < 0)
options->rename_limit = diff_rename_limit_default;
if (options->setup & DIFF_SETUP_USE_CACHE) {
if (options->detect_rename && options->rename_limit < 0)
options->rename_limit = diff_rename_limit_default;
if (options->setup & DIFF_SETUP_USE_CACHE) {
@@
-1049,6
+1071,10
@@
int diff_opt_parse(struct diff_options *options, const char **av, int ac)
}
else if (!strcmp(arg, "--stat"))
options->output_format = DIFF_FORMAT_DIFFSTAT;
}
else if (!strcmp(arg, "--stat"))
options->output_format = DIFF_FORMAT_DIFFSTAT;
+ else if (!strcmp(arg, "--patch-with-stat")) {
+ options->output_format = DIFF_FORMAT_PATCH;
+ options->with_stat = 1;
+ }
else if (!strcmp(arg, "-z"))
options->line_termination = 0;
else if (!strncmp(arg, "-l", 2))
else if (!strcmp(arg, "-z"))
options->line_termination = 0;
else if (!strncmp(arg, "-l", 2))
@@
-1518,7
+1544,7
@@
void diff_flush(struct diff_options *options)
int diff_output_format = options->output_format;
struct diffstat_t *diffstat = NULL;
int diff_output_format = options->output_format;
struct diffstat_t *diffstat = NULL;
- if (diff_output_format == DIFF_FORMAT_DIFFSTAT) {
+ if (diff_output_format == DIFF_FORMAT_DIFFSTAT
|| options->with_stat
) {
diffstat = xcalloc(sizeof (struct diffstat_t), 1);
diffstat->xm.consume = diffstat_consume;
}
diffstat = xcalloc(sizeof (struct diffstat_t), 1);
diffstat->xm.consume = diffstat_consume;
}
@@
-1530,6
+1556,17
@@
void diff_flush(struct diff_options *options)
}
putchar(options->line_termination);
}
}
putchar(options->line_termination);
}
+ if (options->with_stat) {
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ flush_one_pair(p, DIFF_FORMAT_DIFFSTAT, options,
+ diffstat);
+ }
+ show_stats(diffstat);
+ free(diffstat);
+ diffstat = NULL;
+ putchar(options->line_termination);
+ }
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
flush_one_pair(p, diff_output_format, options, diffstat);
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
flush_one_pair(p, diff_output_format, options, diffstat);