From a13ba129cdc66b60eef177696084ff80034069b7 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Sun, 9 Apr 2006 15:43:17 +0200 Subject: Improve the git-diff-tree -c/-cc documentation This tries to clarify the -c/-cc documentation and clean up the style and grammar. Signed-off-by: Petr Baudis Signed-off-by: Junio C Hamano --- Documentation/git-diff-tree.txt | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt index 9153e4cf2..216916985 100644 --- a/Documentation/git-diff-tree.txt +++ b/Documentation/git-diff-tree.txt @@ -60,7 +60,8 @@ separated with a single space are given. -m:: By default, "git-diff-tree --stdin" does not show differences for merge commits. With this flag, it shows - differences to that commit from all of its parents. + differences to that commit from all of its parents. See + also '-c'. -s:: By default, "git-diff-tree --stdin" shows differences, @@ -81,19 +82,25 @@ separated with a single space are given. git-diff-tree outputs a line with the commit ID when applicable. This flag suppressed the commit ID output. --c,--cc:: - These flags change the way a merge commit is displayed +-c:: + This flag changes the way a merge commit is displayed (which means it is useful only when the command is given one , or '--stdin'). It shows the differences - from each of the parents to the merge result - simultaneously, instead of showing pairwise diff between - a parent and the result one at a time, which '-m' option - output does. '--cc' further compresses the output by - omiting hunks that show differences from only one + from each of the parents to the merge result simultaneously + instead of showing pairwise diff between a parent and the + result one at a time (which is what the '-m' option does). + Furthermore, it lists only files which were modified + from all parents. + +-cc:: + This flag changes the way a merge commit patch is displayed, + in a similar way to the '-c' option. It implies the '-c' + and '-p' options and further compresses the patch output + by omitting hunks that show differences from only one parent, or show the same change from all but one parent for an Octopus merge. When this optimization makes all hunks disappear, the commit itself and the commit log - message is not shown, just like any other "empty diff" cases. + message is not shown, just like in any other "empty diff" case. --always:: Show the commit itself and the commit log message even -- cgit v1.2.1 From 77882f60d9df2fd410ba7d732b01738315643c05 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 10 Apr 2006 15:57:24 -0700 Subject: Retire diffcore-pathspec. Nobody except diff-stages used it -- the callers instead filtered the input to diffcore themselves. Make diff-stages do that as well and retire diffcore-pathspec. Signed-off-by: Junio C Hamano --- Makefile | 2 +- diff-stages.c | 17 +++++++------ diff.c | 2 -- diff.h | 1 - diffcore-pathspec.c | 70 ----------------------------------------------------- 5 files changed, 11 insertions(+), 81 deletions(-) delete mode 100644 diffcore-pathspec.c diff --git a/Makefile b/Makefile index 6b10eaa41..a979205ec 100644 --- a/Makefile +++ b/Makefile @@ -197,7 +197,7 @@ LIB_H = \ tree-walk.h DIFF_OBJS = \ - diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \ + diff.o diffcore-break.o diffcore-order.o \ diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \ diffcore-delta.o diff --git a/diff-stages.c b/diff-stages.c index 9968d6ce1..dcd20e79e 100644 --- a/diff-stages.c +++ b/diff-stages.c @@ -11,15 +11,17 @@ static const char diff_stages_usage[] = "git-diff-stages [] [...]" COMMON_DIFF_OPTIONS_HELP; -static void diff_stages(int stage1, int stage2) +static void diff_stages(int stage1, int stage2, const char **pathspec) { int i = 0; while (i < active_nr) { struct cache_entry *ce, *stages[4] = { NULL, }; struct cache_entry *one, *two; const char *name; - int len; + int len, skip; + ce = active_cache[i]; + skip = !ce_path_match(ce, pathspec); len = ce_namelen(ce); name = ce->name; for (;;) { @@ -34,7 +36,8 @@ static void diff_stages(int stage1, int stage2) } one = stages[stage1]; two = stages[stage2]; - if (!one && !two) + + if (skip || (!one && !two)) continue; if (!one) diff_addremove(&diff_options, '+', ntohl(two->ce_mode), @@ -54,8 +57,8 @@ static void diff_stages(int stage1, int stage2) int main(int ac, const char **av) { int stage1, stage2; - - setup_git_directory(); + const char *prefix = setup_git_directory(); + const char **pathspec = NULL; git_config(git_diff_config); read_cache(); @@ -89,12 +92,12 @@ int main(int ac, const char **av) usage(diff_stages_usage); av += 3; /* The rest from av[0] are for paths restriction. */ - diff_options.paths = av; + pathspec = get_pathspec(prefix, av); if (diff_setup_done(&diff_options) < 0) usage(diff_stages_usage); - diff_stages(stage1, stage2); + diff_stages(stage1, stage2, pathspec); diffcore_std(&diff_options); diff_flush(&diff_options); return 0; diff --git a/diff.c b/diff.c index 30e4d50b9..2fa285a8e 100644 --- a/diff.c +++ b/diff.c @@ -1375,8 +1375,6 @@ static void diffcore_apply_filter(const char *filter) void diffcore_std(struct diff_options *options) { - if (options->paths && options->paths[0]) - diffcore_pathspec(options->paths); if (options->break_opt != -1) diffcore_break(options->break_opt); if (options->detect_rename) diff --git a/diff.h b/diff.h index 0cebec113..a02ef2820 100644 --- a/diff.h +++ b/diff.h @@ -20,7 +20,6 @@ typedef void (*add_remove_fn_t)(struct diff_options *options, const char *base, const char *path); struct diff_options { - const char **paths; const char *filter; const char *orderfile; const char *pickaxe; diff --git a/diffcore-pathspec.c b/diffcore-pathspec.c deleted file mode 100644 index 139fe882f..000000000 --- a/diffcore-pathspec.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2005 Junio C Hamano - */ -#include "cache.h" -#include "diff.h" -#include "diffcore.h" - -struct path_spec { - const char *spec; - int len; -}; - -static int matches_pathspec(const char *name, struct path_spec *s, int cnt) -{ - int i; - int namelen; - - if (cnt == 0) - return 1; - - namelen = strlen(name); - for (i = 0; i < cnt; i++) { - int len = s[i].len; - if (namelen < len) - continue; - if (memcmp(s[i].spec, name, len)) - continue; - if (s[i].spec[len-1] == '/' || - name[len] == 0 || - name[len] == '/') - return 1; - if (!len) - return 1; - } - return 0; -} - -void diffcore_pathspec(const char **pathspec) -{ - struct diff_queue_struct *q = &diff_queued_diff; - int i, speccnt; - struct diff_queue_struct outq; - struct path_spec *spec; - - outq.queue = NULL; - outq.nr = outq.alloc = 0; - - for (i = 0; pathspec[i]; i++) - ; - speccnt = i; - if (!speccnt) - return; - - spec = xmalloc(sizeof(*spec) * speccnt); - for (i = 0; pathspec[i]; i++) { - spec[i].spec = pathspec[i]; - spec[i].len = strlen(pathspec[i]); - } - - for (i = 0; i < q->nr; i++) { - struct diff_filepair *p = q->queue[i]; - if (matches_pathspec(p->two->path, spec, speccnt)) - diff_q(&outq, p); - else - diff_free_filepair(p); - } - free(q->queue); - *q = outq; - return; -} -- cgit v1.2.1 From 91730800e975e208364261a691cbf28c5afe3bce Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 10 Apr 2006 17:37:58 -0700 Subject: Retire git-log.sh Signed-off-by: Junio C Hamano --- Makefile | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a979205ec..523952686 100644 --- a/Makefile +++ b/Makefile @@ -116,7 +116,7 @@ SCRIPT_SH = \ git-add.sh git-bisect.sh git-branch.sh git-checkout.sh \ git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \ git-count-objects.sh git-diff.sh git-fetch.sh \ - git-format-patch.sh git-log.sh git-ls-remote.sh \ + git-format-patch.sh git-ls-remote.sh \ git-merge-one-file.sh git-parse-remote.sh \ git-prune.sh git-pull.sh git-push.sh git-rebase.sh \ git-repack.sh git-request-pull.sh git-reset.sh \ @@ -167,6 +167,8 @@ PROGRAMS = \ git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \ git-describe$X git-merge-tree$X git-blame$X git-imap-send$X +BUILT_INS = git-log$X + # what 'all' will build and 'install' will install, in gitexecdir ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) @@ -448,7 +450,7 @@ LIB_OBJS += $(COMPAT_OBJS) export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir ### Build rules -all: $(ALL_PROGRAMS) git$X gitk +all: $(ALL_PROGRAMS) git$X $(BUILT_INS) gitk all: $(MAKE) -C templates @@ -461,6 +463,9 @@ git$X: git.c common-cmds.h $(GITLIBS) $(ALL_CFLAGS) -o $@ $(filter %.c,$^) \ $(ALL_LDFLAGS) $(LIBS) +$(BUILT_INS): git$X + rm -f $@ && ln git$X $@ + common-cmds.h: Documentation/git-*.txt ./generate-cmdlist.sh > $@ @@ -642,7 +647,7 @@ rpm: dist clean: rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \ - $(LIB_FILE) $(XDIFF_LIB) + $(LIB_FILE) $(XDIFF_LIB) $(BUILT_INS) rm -f $(ALL_PROGRAMS) git$X rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags rm -rf $(GIT_TARNAME) -- cgit v1.2.1 From 944e3a88fe9fa767a9e0100661026992755ab917 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 10 Apr 2006 17:37:58 -0700 Subject: Retire git-log.sh (take#2) ... and install a replacement properly. Signed-off-by: Junio C Hamano --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 523952686..c0409f35e 100644 --- a/Makefile +++ b/Makefile @@ -170,7 +170,7 @@ PROGRAMS = \ BUILT_INS = git-log$X # what 'all' will build and 'install' will install, in gitexecdir -ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) +ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(BUILT_INS) $(SCRIPTS) # Backward compatibility -- to be removed after 1.0 PROGRAMS += git-ssh-pull$X git-ssh-push$X @@ -450,7 +450,7 @@ LIB_OBJS += $(COMPAT_OBJS) export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir ### Build rules -all: $(ALL_PROGRAMS) git$X $(BUILT_INS) gitk +all: $(ALL_PROGRAMS) git$X gitk all: $(MAKE) -C templates @@ -647,7 +647,7 @@ rpm: dist clean: rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \ - $(LIB_FILE) $(XDIFF_LIB) $(BUILT_INS) + $(LIB_FILE) $(XDIFF_LIB) rm -f $(ALL_PROGRAMS) git$X rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags rm -rf $(GIT_TARNAME) -- cgit v1.2.1 From 86ff1d2012cc5e074d54c0823154019b99ca03f0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 10 Apr 2006 17:36:53 -0700 Subject: diff-* --patch-with-raw This new flag outputs the diff-raw output and diff-patch output at the same time. Requested by Cogito. Signed-off-by: Junio C Hamano --- combine-diff.c | 11 ++++++++ diff.c | 82 +++++++++++++++++++++++++++++++++++----------------------- diff.h | 1 + 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/combine-diff.c b/combine-diff.c index eb0d757f4..011bb8db2 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -832,6 +832,7 @@ const char *diff_tree_combined_merge(const unsigned char *sha1, diffopts = *opt; diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; + diffopts.with_raw = 0; diffopts.recursive = 1; /* count parents */ @@ -858,6 +859,16 @@ const char *diff_tree_combined_merge(const unsigned char *sha1, num_paths++; } if (num_paths) { + if (opt->with_raw) { + int saved_format = opt->output_format; + opt->output_format = DIFF_FORMAT_RAW; + for (p = paths; p; p = p->next) { + if (show_combined_diff(p, num_parent, dense, + header, opt)) + header = NULL; + } + opt->output_format = saved_format; + } for (p = paths; p; p = p->next) { if (show_combined_diff(p, num_parent, dense, header, opt)) diff --git a/diff.c b/diff.c index 2fa285a8e..99d76d01e 100644 --- a/diff.c +++ b/diff.c @@ -862,6 +862,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) const char *arg = av[0]; if (!strcmp(arg, "-p") || !strcmp(arg, "-u")) options->output_format = DIFF_FORMAT_PATCH; + else if (!strcmp(arg, "--patch-with-raw")) { + options->output_format = DIFF_FORMAT_PATCH; + options->with_raw = 1; + } else if (!strcmp(arg, "-z")) options->line_termination = 0; else if (!strncmp(arg, "-l", 2)) @@ -1048,13 +1052,13 @@ const char *diff_unique_abbrev(const unsigned char *sha1, int len) static void diff_flush_raw(struct diff_filepair *p, int line_termination, int inter_name_termination, - struct diff_options *options) + struct diff_options *options, + int output_format) { int two_paths; char status[10]; int abbrev = options->abbrev; const char *path_one, *path_two; - int output_format = options->output_format; path_one = p->one->path; path_two = p->two->path; @@ -1270,46 +1274,58 @@ static void diff_resolve_rename_copy(void) diff_debug_queue("resolve-rename-copy done", q); } -void diff_flush(struct diff_options *options) +static void flush_one_pair(struct diff_filepair *p, + int diff_output_format, + struct diff_options *options) { - struct diff_queue_struct *q = &diff_queued_diff; - int i; int inter_name_termination = '\t'; - int diff_output_format = options->output_format; int line_termination = options->line_termination; - if (!line_termination) inter_name_termination = 0; - for (i = 0; i < q->nr; i++) { - struct diff_filepair *p = q->queue[i]; - - switch (p->status) { - case DIFF_STATUS_UNKNOWN: + switch (p->status) { + case DIFF_STATUS_UNKNOWN: + break; + case 0: + die("internal error in diff-resolve-rename-copy"); + break; + default: + switch (diff_output_format) { + case DIFF_FORMAT_PATCH: + diff_flush_patch(p, options); break; - case 0: - die("internal error in diff-resolve-rename-copy"); + case DIFF_FORMAT_RAW: + case DIFF_FORMAT_NAME_STATUS: + diff_flush_raw(p, line_termination, + inter_name_termination, + options, diff_output_format); + break; + case DIFF_FORMAT_NAME: + diff_flush_name(p, + inter_name_termination, + line_termination); + break; + case DIFF_FORMAT_NO_OUTPUT: break; - default: - switch (diff_output_format) { - case DIFF_FORMAT_PATCH: - diff_flush_patch(p, options); - break; - case DIFF_FORMAT_RAW: - case DIFF_FORMAT_NAME_STATUS: - diff_flush_raw(p, line_termination, - inter_name_termination, - options); - break; - case DIFF_FORMAT_NAME: - diff_flush_name(p, - inter_name_termination, - line_termination); - break; - case DIFF_FORMAT_NO_OUTPUT: - break; - } } + } +} + +void diff_flush(struct diff_options *options) +{ + struct diff_queue_struct *q = &diff_queued_diff; + int i; + int diff_output_format = options->output_format; + + if (options->with_raw) { + for (i = 0; i < q->nr; i++) { + struct diff_filepair *p = q->queue[i]; + flush_one_pair(p, DIFF_FORMAT_RAW, options); + } + } + for (i = 0; i < q->nr; i++) { + struct diff_filepair *p = q->queue[i]; + flush_one_pair(p, diff_output_format, options); diff_free_filepair(p); } free(q->queue); diff --git a/diff.h b/diff.h index a02ef2820..07b153b56 100644 --- a/diff.h +++ b/diff.h @@ -24,6 +24,7 @@ struct diff_options { const char *orderfile; const char *pickaxe; unsigned recursive:1, + with_raw:1, tree_in_recursive:1, full_index:1; int break_opt; -- cgit v1.2.1