Merge branch 'lt/rev'
authorJunio C Hamano <junkio@cox.net>
Mon, 10 Apr 2006 22:58:41 +0000 (15:58 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 10 Apr 2006 22:58:41 +0000 (15:58 -0700)
* lt/rev:
  Make "--parents" logs also be incremental

Documentation/git-diff-tree.txt
Makefile
diff-stages.c
diff.c
diff.h
diffcore-pathspec.c [deleted file]

index 9153e4c..2169169 100644 (file)
@@ -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 <tree-ish>, 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
index 6b10eaa..a979205 100644 (file)
--- 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
 
index 9968d6c..dcd20e7 100644 (file)
@@ -11,15 +11,17 @@ static const char diff_stages_usage[] =
 "git-diff-stages [<common diff options>] <stage1> <stage2> [<path>...]"
 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 30e4d50..2fa285a 100644 (file)
--- 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 0cebec1..a02ef28 100644 (file)
--- 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 (file)
index 139fe88..0000000
+++ /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;
-}