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 | |
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>
-rw-r--r-- | diff-tree.c | 2 | ||||
-rw-r--r-- | diff.h | 6 | ||||
-rw-r--r-- | revision.c | 2 | ||||
-rw-r--r-- | tree-diff.c | 46 |
4 files changed, 32 insertions, 24 deletions
diff --git a/diff-tree.c b/diff-tree.c index 2a088d11cf..2b79dd0a68 100644 --- a/diff-tree.c +++ b/diff-tree.c @@ -120,7 +120,7 @@ int main(int argc, const char **argv) if (opt->diffopt.output_format == DIFF_FORMAT_PATCH) opt->diffopt.recursive = 1; - diff_tree_setup_paths(get_pathspec(prefix, argv)); + diff_tree_setup_paths(get_pathspec(prefix, argv), opt); diff_setup_done(&opt->diffopt); switch (nr_sha1) { @@ -38,11 +38,15 @@ struct diff_options { int setup; int abbrev; + int nr_paths; + const char **paths; + int *pathlens; change_fn_t change; add_remove_fn_t add_remove; }; -extern void diff_tree_setup_paths(const char **paths); +extern void diff_tree_setup_paths(const char **paths, struct diff_options *); +extern void diff_tree_release_paths(struct diff_options *); extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt); extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, diff --git a/revision.c b/revision.c index fe26562381..634f9a5ccb 100644 --- a/revision.c +++ b/revision.c @@ -707,7 +707,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->limited = 1; if (revs->prune_data) { - diff_tree_setup_paths(revs->prune_data); + diff_tree_setup_paths(revs->prune_data, &diff_opt); revs->prune_fn = try_to_simplify_commit; } 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]); } } |