summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/diff-options.txt3
-rw-r--r--diff.c40
-rw-r--r--diff.h3
-rw-r--r--git.c10
4 files changed, 48 insertions, 8 deletions
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 447e522a7b..c183dc9da0 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -10,6 +10,9 @@
--stat::
Generate a diffstat instead of a patch.
+--patch-with-stat::
+ Generate patch and prepend its diffstat.
+
-z::
\0 line termination on output
diff --git a/diff.c b/diff.c
index f1b672d2dc..b54bbfa627 100644
--- a/diff.c
+++ b/diff.c
@@ -202,6 +202,8 @@ struct diffstat_t {
int alloc;
struct diffstat_file {
char *name;
+ unsigned is_unmerged:1;
+ unsigned is_binary:1;
unsigned int added, deleted;
} **files;
};
@@ -245,11 +247,11 @@ static void show_stats(struct diffstat_t* data)
if (data->nr == 0)
return;
- printf("---\n");
-
for (i = 0; i < data->nr; i++) {
struct diffstat_file *file = data->files[i];
+ if (file->is_binary || file->is_unmerged)
+ continue;
if (max_change < file->added + file->deleted)
max_change = file->added + file->deleted;
len = strlen(file->name);
@@ -294,11 +296,15 @@ static void show_stats(struct diffstat_t* data)
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);
goto free_diffstat_file;
- } else if (added + deleted == 0) {
+ }
+ 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--;
goto free_diffstat_file;
}
@@ -426,11 +432,16 @@ static void builtin_diffstat(const char *name_a, const char *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))
- data->added = -1;
+ data->is_binary = 1;
else {
/* Crazy xdl interfaces.. */
xpparam_t xpp;
@@ -1049,6 +1060,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, "--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))
@@ -1518,7 +1533,7 @@ void diff_flush(struct diff_options *options)
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;
}
@@ -1530,6 +1545,17 @@ void diff_flush(struct diff_options *options)
}
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);
diff --git a/diff.h b/diff.h
index 2f8aff2cd4..f783baef14 100644
--- a/diff.h
+++ b/diff.h
@@ -25,6 +25,7 @@ struct diff_options {
const char *pickaxe;
unsigned recursive:1,
with_raw:1,
+ with_stat:1,
tree_in_recursive:1,
full_index:1;
int break_opt;
@@ -120,6 +121,8 @@ extern void diffcore_std_no_resolve(struct diff_options *);
" --patch-with-raw\n" \
" output both a patch and the diff-raw format.\n" \
" --stat show diffstat instead of patch.\n" \
+" --patch-with-stat\n" \
+" output a patch and prepend its diffstat.\n" \
" --name-only show only names of changed files.\n" \
" --name-status show names and status of changed files.\n" \
" --full-index show full object name on index lines.\n" \
diff --git a/git.c b/git.c
index c87accfa1a..2e0ae5e58e 100644
--- a/git.c
+++ b/git.c
@@ -333,8 +333,10 @@ static int cmd_log_wc(int argc, const char **argv, char **envp,
pretty_print_commit(opt->commit_format, commit, ~0, buf,
LOGSIZE, wcopt->abbrev);
printf("%s\n", buf);
- if (wcopt->do_diff)
+ if (wcopt->do_diff) {
+ printf("---\n");
log_tree_commit(opt, commit);
+ }
shown = 1;
free(commit->buffer);
commit->buffer = NULL;
@@ -392,6 +394,12 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
};
int i;
+ /* Turn "git cmd --help" into "git help cmd" */
+ if (argc > 1 && !strcmp(argv[1], "--help")) {
+ argv[1] = argv[0];
+ argv[0] = cmd = "help";
+ }
+
for (i = 0; i < ARRAY_SIZE(commands); i++) {
struct cmd_struct *p = commands+i;
if (strcmp(p->cmd, cmd))