summaryrefslogtreecommitdiff
path: root/tree-diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-04-10 16:39:11 -0700
committerJunio C Hamano <junkio@cox.net>2006-04-10 16:45:19 -0700
commita8baa7b9f5c8e338c09d63097f14372aca68e13f (patch)
treeb194ad2948ea2e797c062eb67f4d1a9f75c7b3a8 /tree-diff.c
parent6d46a23bf6e009487166f044b8c759aa734b8f90 (diff)
downloadgit-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.c46
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]);
}
}