blame and friends: adjust to multiple pathspec change.

This makes things that include revision.h build again.

Blame is also built, but I am not sure how well it works (or how
well it worked to begin with) -- it was relying on tree-diff to
be using whatever pathspec was used the last time, which smells
a bit suspicious.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 2006-04-10 18:14:54 -07:00
parent 477f2b4131
commit c4e05b1a22
6 changed files with 34 additions and 23 deletions

20
blame.c
View File

@ -508,25 +508,33 @@ static void process_commits(struct rev_info *rev, const char *path,
static int compare_tree_path(struct rev_info* revs, static int compare_tree_path(struct rev_info* revs,
struct commit* c1, struct commit* c2) struct commit* c1, struct commit* c2)
{ {
int ret;
const char* paths[2]; const char* paths[2];
struct util_info* util = c2->object.util; struct util_info* util = c2->object.util;
paths[0] = util->pathname; paths[0] = util->pathname;
paths[1] = NULL; paths[1] = NULL;


diff_tree_setup_paths(get_pathspec(revs->prefix, paths)); diff_tree_setup_paths(get_pathspec(revs->prefix, paths),
return rev_compare_tree(c1->tree, c2->tree); &revs->diffopt);
ret = rev_compare_tree(revs, c1->tree, c2->tree);
diff_tree_release_paths(&revs->diffopt);
return ret;
} }




static int same_tree_as_empty_path(struct rev_info *revs, struct tree* t1, static int same_tree_as_empty_path(struct rev_info *revs, struct tree* t1,
const char* path) const char* path)
{ {
int ret;
const char* paths[2]; const char* paths[2];
paths[0] = path; paths[0] = path;
paths[1] = NULL; paths[1] = NULL;


diff_tree_setup_paths(get_pathspec(revs->prefix, paths)); diff_tree_setup_paths(get_pathspec(revs->prefix, paths),
return rev_same_tree_as_empty(t1); &revs->diffopt);
ret = rev_same_tree_as_empty(revs, t1);
diff_tree_release_paths(&revs->diffopt);
return ret;
} }


static const char* find_rename(struct commit* commit, struct commit* parent) static const char* find_rename(struct commit* commit, struct commit* parent)
@ -546,7 +554,7 @@ static const char* find_rename(struct commit* commit, struct commit* parent)
diff_opts.recursive = 1; diff_opts.recursive = 1;
diff_opts.detect_rename = DIFF_DETECT_RENAME; diff_opts.detect_rename = DIFF_DETECT_RENAME;
paths[0] = NULL; paths[0] = NULL;
diff_tree_setup_paths(paths); diff_tree_setup_paths(paths, &diff_opts);
if (diff_setup_done(&diff_opts) < 0) if (diff_setup_done(&diff_opts) < 0)
die("diff_setup_done failed"); die("diff_setup_done failed");


@ -826,7 +834,7 @@ int main(int argc, const char **argv)


args[0] = filename; args[0] = filename;
args[1] = NULL; args[1] = NULL;
diff_tree_setup_paths(args); diff_tree_setup_paths(args, &rev.diffopt);
prepare_revision_walk(&rev); prepare_revision_walk(&rev);
process_commits(&rev, filename, &initial); process_commits(&rev, filename, &initial);



2
git.c
View File

@ -15,8 +15,8 @@


#include "cache.h" #include "cache.h"
#include "commit.h" #include "commit.h"
#include "revision.h"
#include "diff.h" #include "diff.h"
#include "revision.h"
#include "log-tree.h" #include "log-tree.h"


#ifndef PATH_MAX #ifndef PATH_MAX

View File

@ -6,6 +6,7 @@
#include "blob.h" #include "blob.h"
#include "http.h" #include "http.h"
#include "refs.h" #include "refs.h"
#include "diff.h"
#include "revision.h" #include "revision.h"
#include "exec_cmd.h" #include "exec_cmd.h"



View File

@ -5,6 +5,7 @@
#include "tree.h" #include "tree.h"
#include "blob.h" #include "blob.h"
#include "tree-walk.h" #include "tree-walk.h"
#include "diff.h"
#include "revision.h" #include "revision.h"


/* bits #0-6 in revision.h */ /* bits #0-6 in revision.h */

View File

@ -233,25 +233,20 @@ static void file_change(struct diff_options *options,
tree_difference = REV_TREE_DIFFERENT; tree_difference = REV_TREE_DIFFERENT;
} }


static struct diff_options diff_opt = { int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
.recursive = 1,
.add_remove = file_add_remove,
.change = file_change,
};

int rev_compare_tree(struct tree *t1, struct tree *t2)
{ {
if (!t1) if (!t1)
return REV_TREE_NEW; return REV_TREE_NEW;
if (!t2) if (!t2)
return REV_TREE_DIFFERENT; return REV_TREE_DIFFERENT;
tree_difference = REV_TREE_SAME; tree_difference = REV_TREE_SAME;
if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "", &diff_opt) < 0) if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "",
&revs->diffopt) < 0)
return REV_TREE_DIFFERENT; return REV_TREE_DIFFERENT;
return tree_difference; return tree_difference;
} }


int rev_same_tree_as_empty(struct tree *t1) int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1)
{ {
int retval; int retval;
void *tree; void *tree;
@ -269,7 +264,7 @@ int rev_same_tree_as_empty(struct tree *t1)
empty.size = 0; empty.size = 0;


tree_difference = 0; tree_difference = 0;
retval = diff_tree(&empty, &real, "", &diff_opt); retval = diff_tree(&empty, &real, "", &revs->diffopt);
free(tree); free(tree);


return retval >= 0 && !tree_difference; return retval >= 0 && !tree_difference;
@ -284,7 +279,7 @@ static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
return; return;


if (!commit->parents) { if (!commit->parents) {
if (!rev_same_tree_as_empty(commit->tree)) if (!rev_same_tree_as_empty(revs, commit->tree))
commit->object.flags |= TREECHANGE; commit->object.flags |= TREECHANGE;
return; return;
} }
@ -294,7 +289,7 @@ static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
struct commit *p = parent->item; struct commit *p = parent->item;


parse_commit(p); parse_commit(p);
switch (rev_compare_tree(p->tree, commit->tree)) { switch (rev_compare_tree(revs, p->tree, commit->tree)) {
case REV_TREE_SAME: case REV_TREE_SAME:
if (p->object.flags & UNINTERESTING) { if (p->object.flags & UNINTERESTING) {
/* Even if a merge with an uninteresting /* Even if a merge with an uninteresting
@ -312,7 +307,7 @@ static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)


case REV_TREE_NEW: case REV_TREE_NEW:
if (revs->remove_empty_trees && if (revs->remove_empty_trees &&
rev_same_tree_as_empty(p->tree)) { rev_same_tree_as_empty(revs, p->tree)) {
/* We are adding all the specified /* We are adding all the specified
* paths from this parent, so the * paths from this parent, so the
* history beyond this parent is not * history beyond this parent is not
@ -484,6 +479,9 @@ static void handle_all(struct rev_info *revs, unsigned flags)
void init_revisions(struct rev_info *revs) void init_revisions(struct rev_info *revs)
{ {
memset(revs, 0, sizeof(*revs)); memset(revs, 0, sizeof(*revs));
revs->diffopt.recursive = 1;
revs->diffopt.add_remove = file_add_remove;
revs->diffopt.change = file_change;
revs->lifo = 1; revs->lifo = 1;
revs->dense = 1; revs->dense = 1;
revs->prefix = setup_git_directory(); revs->prefix = setup_git_directory();
@ -707,7 +705,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_opt); diff_tree_setup_paths(revs->prune_data, &revs->diffopt);
revs->prune_fn = try_to_simplify_commit; revs->prune_fn = try_to_simplify_commit;
} }



View File

@ -43,6 +43,9 @@ struct rev_info {
unsigned long max_age; unsigned long max_age;
unsigned long min_age; unsigned long min_age;


/* paths limiting */
struct diff_options diffopt;

topo_sort_set_fn_t topo_setter; topo_sort_set_fn_t topo_setter;
topo_sort_get_fn_t topo_getter; topo_sort_get_fn_t topo_getter;
}; };
@ -52,8 +55,8 @@ struct rev_info {
#define REV_TREE_DIFFERENT 2 #define REV_TREE_DIFFERENT 2


/* revision.c */ /* revision.c */
extern int rev_same_tree_as_empty(struct tree *t1); extern int rev_same_tree_as_empty(struct rev_info *, struct tree *t1);
extern int rev_compare_tree(struct tree *t1, struct tree *t2); extern int rev_compare_tree(struct rev_info *, struct tree *t1, struct tree *t2);


extern void init_revisions(struct rev_info *revs); extern void init_revisions(struct rev_info *revs);
extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def); extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def);