diff options
author | Junio C Hamano <junkio@cox.net> | 2006-04-10 16:39:11 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-04-10 16:45:19 -0700 |
commit | a8baa7b9f5c8e338c09d63097f14372aca68e13f (patch) | |
tree | b194ad2948ea2e797c062eb67f4d1a9f75c7b3a8 /tree-diff.c | |
parent | 6d46a23bf6e009487166f044b8c759aa734b8f90 (diff) | |
download | git-a8baa7b9f5c8e338c09d63097f14372aca68e13f.tar.gz |
tree-diff: do not assume we use only one pathspec
The way tree-diff was set up assumed we would use only one set
of pathspec during the entire life of the program. Move the
pathspec related static variables out to diff_options structure
so that we can filter commits with one set of paths while show
the actual diffs using different set of paths.
I suspect this breaks blame.c, and makes "git log paths..." to
default to the --full-diff, the latter of which is dealt with
the next commit.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'tree-diff.c')
-rw-r--r-- | tree-diff.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/tree-diff.c b/tree-diff.c index 701fbba65c..1cdf8aa908 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -5,11 +5,6 @@ #include "diff.h" #include "tree.h" -// What paths are we interested in? -static int nr_paths = 0; -static const char **paths = NULL; -static int *pathlens = NULL; - static char *malloc_base(const char *base, const char *path, int pathlen) { int baselen = strlen(base); @@ -72,14 +67,14 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const return 0; } -static int interesting(struct tree_desc *desc, const char *base) +static int interesting(struct tree_desc *desc, const char *base, struct diff_options *opt) { const char *path; unsigned mode; int i; int baselen, pathlen; - if (!nr_paths) + if (!opt->nr_paths) return 1; (void)tree_entry_extract(desc, &path, &mode); @@ -87,9 +82,9 @@ static int interesting(struct tree_desc *desc, const char *base) pathlen = strlen(path); baselen = strlen(base); - for (i=0; i < nr_paths; i++) { - const char *match = paths[i]; - int matchlen = pathlens[i]; + for (i=0; i < opt->nr_paths; i++) { + const char *match = opt->paths[i]; + int matchlen = opt->pathlens[i]; if (baselen >= matchlen) { /* If it doesn't match, move along... */ @@ -129,7 +124,7 @@ static int interesting(struct tree_desc *desc, const char *base) static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base) { while (desc->size) { - if (interesting(desc, base)) + if (interesting(desc, base, opt)) show_entry(opt, prefix, desc, base); update_tree_entry(desc); } @@ -167,11 +162,11 @@ static int show_entry(struct diff_options *opt, const char *prefix, struct tree_ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt) { while (t1->size | t2->size) { - if (nr_paths && t1->size && !interesting(t1, base)) { + if (opt->nr_paths && t1->size && !interesting(t1, base, opt)) { update_tree_entry(t1); continue; } - if (nr_paths && t2->size && !interesting(t2, base)) { + if (opt->nr_paths && t2->size && !interesting(t2, base, opt)) { update_tree_entry(t2); continue; } @@ -229,19 +224,28 @@ static int count_paths(const char **paths) return i; } -void diff_tree_setup_paths(const char **p) +void diff_tree_release_paths(struct diff_options *opt) { + free(opt->pathlens); +} + +void diff_tree_setup_paths(const char **p, struct diff_options *opt) +{ + opt->nr_paths = 0; + opt->pathlens = NULL; + opt->paths = NULL; + if (p) { int i; - paths = p; - nr_paths = count_paths(paths); - if (nr_paths == 0) { - pathlens = NULL; + opt->paths = p; + opt->nr_paths = count_paths(p); + if (opt->nr_paths == 0) { + opt->pathlens = NULL; return; } - pathlens = xmalloc(nr_paths * sizeof(int)); - for (i=0; i<nr_paths; i++) - pathlens[i] = strlen(paths[i]); + opt->pathlens = xmalloc(opt->nr_paths * sizeof(int)); + for (i=0; i < opt->nr_paths; i++) + opt->pathlens[i] = strlen(p[i]); } } |