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:
parent
6d46a23bf6
commit
a8baa7b9f5
@ -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) {
|
||||
|
6
diff.h
6
diff.h
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
46
tree-diff.c
46
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]);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user