1
0
mirror of https://github.com/git/git.git synced 2025-03-16 11:55:16 +00:00

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>
This commit is contained in:
Junio C Hamano 2006-04-10 16:39:11 -07:00
parent 6d46a23bf6
commit a8baa7b9f5
4 changed files with 32 additions and 24 deletions

@ -120,7 +120,7 @@ int main(int argc, const char **argv)
if (opt->diffopt.output_format == DIFF_FORMAT_PATCH) if (opt->diffopt.output_format == DIFF_FORMAT_PATCH)
opt->diffopt.recursive = 1; 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); diff_setup_done(&opt->diffopt);
switch (nr_sha1) { switch (nr_sha1) {

6
diff.h

@ -38,11 +38,15 @@ struct diff_options {
int setup; int setup;
int abbrev; int abbrev;
int nr_paths;
const char **paths;
int *pathlens;
change_fn_t change; change_fn_t change;
add_remove_fn_t add_remove; 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, extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
const char *base, struct diff_options *opt); const char *base, struct diff_options *opt);
extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new,

@ -707,7 +707,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
revs->limited = 1; revs->limited = 1;
if (revs->prune_data) { 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; revs->prune_fn = try_to_simplify_commit;
} }

@ -5,11 +5,6 @@
#include "diff.h" #include "diff.h"
#include "tree.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) static char *malloc_base(const char *base, const char *path, int pathlen)
{ {
int baselen = strlen(base); int baselen = strlen(base);
@ -72,14 +67,14 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
return 0; 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; const char *path;
unsigned mode; unsigned mode;
int i; int i;
int baselen, pathlen; int baselen, pathlen;
if (!nr_paths) if (!opt->nr_paths)
return 1; return 1;
(void)tree_entry_extract(desc, &path, &mode); (void)tree_entry_extract(desc, &path, &mode);
@ -87,9 +82,9 @@ static int interesting(struct tree_desc *desc, const char *base)
pathlen = strlen(path); pathlen = strlen(path);
baselen = strlen(base); baselen = strlen(base);
for (i=0; i < nr_paths; i++) { for (i=0; i < opt->nr_paths; i++) {
const char *match = paths[i]; const char *match = opt->paths[i];
int matchlen = pathlens[i]; int matchlen = opt->pathlens[i];
if (baselen >= matchlen) { if (baselen >= matchlen) {
/* If it doesn't match, move along... */ /* 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) static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base)
{ {
while (desc->size) { while (desc->size) {
if (interesting(desc, base)) if (interesting(desc, base, opt))
show_entry(opt, prefix, desc, base); show_entry(opt, prefix, desc, base);
update_tree_entry(desc); 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) int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt)
{ {
while (t1->size | t2->size) { 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); update_tree_entry(t1);
continue; continue;
} }
if (nr_paths && t2->size && !interesting(t2, base)) { if (opt->nr_paths && t2->size && !interesting(t2, base, opt)) {
update_tree_entry(t2); update_tree_entry(t2);
continue; continue;
} }
@ -229,19 +224,28 @@ static int count_paths(const char **paths)
return i; 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) { if (p) {
int i; int i;
paths = p; opt->paths = p;
nr_paths = count_paths(paths); opt->nr_paths = count_paths(p);
if (nr_paths == 0) { if (opt->nr_paths == 0) {
pathlens = NULL; opt->pathlens = NULL;
return; return;
} }
pathlens = xmalloc(nr_paths * sizeof(int)); opt->pathlens = xmalloc(opt->nr_paths * sizeof(int));
for (i=0; i<nr_paths; i++) for (i=0; i < opt->nr_paths; i++)
pathlens[i] = strlen(paths[i]); opt->pathlens[i] = strlen(p[i]);
} }
} }