Merge branch 'ks/tree-diff-walk'
* ks/tree-diff-walk: tree-walk: finally switch over tree descriptors to contain a pre-parsed entry revision: convert to using diff_tree_sha1() line-log: convert to using diff_tree_sha1() tree-diff: convert diff_root_tree_sha1() to just call diff_tree_sha1 with old=NULL tree-diff: allow diff_tree_sha1 to accept NULL sha1
This commit is contained in:
commit
795dd116bb
26
line-log.c
26
line-log.c
@ -766,16 +766,6 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void load_tree_desc(struct tree_desc *desc, void **tree,
|
|
||||||
const unsigned char *sha1)
|
|
||||||
{
|
|
||||||
unsigned long size;
|
|
||||||
*tree = read_object_with_reference(sha1, tree_type, &size, NULL);
|
|
||||||
if (!*tree)
|
|
||||||
die("Unable to read tree (%s)", sha1_to_hex(sha1));
|
|
||||||
init_tree_desc(desc, *tree, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int count_parents(struct commit *commit)
|
static int count_parents(struct commit *commit)
|
||||||
{
|
{
|
||||||
struct commit_list *parents = commit->parents;
|
struct commit_list *parents = commit->parents;
|
||||||
@ -842,18 +832,11 @@ static void queue_diffs(struct line_log_data *range,
|
|||||||
struct diff_queue_struct *queue,
|
struct diff_queue_struct *queue,
|
||||||
struct commit *commit, struct commit *parent)
|
struct commit *commit, struct commit *parent)
|
||||||
{
|
{
|
||||||
void *tree1 = NULL, *tree2 = NULL;
|
|
||||||
struct tree_desc desc1, desc2;
|
|
||||||
|
|
||||||
assert(commit);
|
assert(commit);
|
||||||
load_tree_desc(&desc2, &tree2, commit->tree->object.sha1);
|
|
||||||
if (parent)
|
|
||||||
load_tree_desc(&desc1, &tree1, parent->tree->object.sha1);
|
|
||||||
else
|
|
||||||
init_tree_desc(&desc1, "", 0);
|
|
||||||
|
|
||||||
DIFF_QUEUE_CLEAR(&diff_queued_diff);
|
DIFF_QUEUE_CLEAR(&diff_queued_diff);
|
||||||
diff_tree(&desc1, &desc2, "", opt);
|
diff_tree_sha1(parent ? parent->tree->object.sha1 : NULL,
|
||||||
|
commit->tree->object.sha1, "", opt);
|
||||||
if (opt->detect_rename) {
|
if (opt->detect_rename) {
|
||||||
filter_diffs_for_paths(range, 1);
|
filter_diffs_for_paths(range, 1);
|
||||||
if (diff_might_be_rename())
|
if (diff_might_be_rename())
|
||||||
@ -861,11 +844,6 @@ static void queue_diffs(struct line_log_data *range,
|
|||||||
filter_diffs_for_paths(range, 0);
|
filter_diffs_for_paths(range, 0);
|
||||||
}
|
}
|
||||||
move_diff_queue(queue, &diff_queued_diff);
|
move_diff_queue(queue, &diff_queued_diff);
|
||||||
|
|
||||||
if (tree1)
|
|
||||||
free(tree1);
|
|
||||||
if (tree2)
|
|
||||||
free(tree2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_nth_line(long line, unsigned long *ends, void *data)
|
static char *get_nth_line(long line, unsigned long *ends, void *data)
|
||||||
|
12
revision.c
12
revision.c
@ -497,24 +497,14 @@ static int rev_compare_tree(struct rev_info *revs,
|
|||||||
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)
|
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
void *tree;
|
|
||||||
unsigned long size;
|
|
||||||
struct tree_desc empty, real;
|
|
||||||
struct tree *t1 = commit->tree;
|
struct tree *t1 = commit->tree;
|
||||||
|
|
||||||
if (!t1)
|
if (!t1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tree = read_object_with_reference(t1->object.sha1, tree_type, &size, NULL);
|
|
||||||
if (!tree)
|
|
||||||
return 0;
|
|
||||||
init_tree_desc(&real, tree, size);
|
|
||||||
init_tree_desc(&empty, "", 0);
|
|
||||||
|
|
||||||
tree_difference = REV_TREE_SAME;
|
tree_difference = REV_TREE_SAME;
|
||||||
DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
|
DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
|
||||||
retval = diff_tree(&empty, &real, "", &revs->pruning);
|
retval = diff_tree_sha1(NULL, t1->object.sha1, "", &revs->pruning);
|
||||||
free(tree);
|
|
||||||
|
|
||||||
return retval >= 0 && (tree_difference == REV_TREE_SAME);
|
return retval >= 0 && (tree_difference == REV_TREE_SAME);
|
||||||
}
|
}
|
||||||
|
27
tree-diff.c
27
tree-diff.c
@ -294,14 +294,10 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
|
|||||||
unsigned long size1, size2;
|
unsigned long size1, size2;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
tree1 = read_object_with_reference(old, tree_type, &size1, NULL);
|
tree1 = fill_tree_descriptor(&t1, old);
|
||||||
if (!tree1)
|
tree2 = fill_tree_descriptor(&t2, new);
|
||||||
die("unable to read source tree (%s)", sha1_to_hex(old));
|
size1 = t1.size;
|
||||||
tree2 = read_object_with_reference(new, tree_type, &size2, NULL);
|
size2 = t2.size;
|
||||||
if (!tree2)
|
|
||||||
die("unable to read destination tree (%s)", sha1_to_hex(new));
|
|
||||||
init_tree_desc(&t1, tree1, size1);
|
|
||||||
init_tree_desc(&t2, tree2, size2);
|
|
||||||
retval = diff_tree(&t1, &t2, base, opt);
|
retval = diff_tree(&t1, &t2, base, opt);
|
||||||
if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) {
|
if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) {
|
||||||
init_tree_desc(&t1, tree1, size1);
|
init_tree_desc(&t1, tree1, size1);
|
||||||
@ -315,18 +311,5 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
|
|||||||
|
|
||||||
int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt)
|
int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt)
|
||||||
{
|
{
|
||||||
int retval;
|
return diff_tree_sha1(NULL, new, base, opt);
|
||||||
void *tree;
|
|
||||||
unsigned long size;
|
|
||||||
struct tree_desc empty, real;
|
|
||||||
|
|
||||||
tree = read_object_with_reference(new, tree_type, &size, NULL);
|
|
||||||
if (!tree)
|
|
||||||
die("unable to read root tree (%s)", sha1_to_hex(new));
|
|
||||||
init_tree_desc(&real, tree, size);
|
|
||||||
|
|
||||||
init_tree_desc(&empty, "", 0);
|
|
||||||
retval = diff_tree(&empty, &real, base, opt);
|
|
||||||
free(tree);
|
|
||||||
return retval;
|
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned
|
|||||||
|
|
||||||
/* Initialize the descriptor entry */
|
/* Initialize the descriptor entry */
|
||||||
desc->entry.path = path;
|
desc->entry.path = path;
|
||||||
desc->entry.mode = mode;
|
desc->entry.mode = canon_mode(mode);
|
||||||
desc->entry.sha1 = (const unsigned char *)(path + len);
|
desc->entry.sha1 = (const unsigned char *)(path + len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ struct tree_desc {
|
|||||||
static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
|
static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
|
||||||
{
|
{
|
||||||
*pathp = desc->entry.path;
|
*pathp = desc->entry.path;
|
||||||
*modep = canon_mode(desc->entry.mode);
|
*modep = desc->entry.mode;
|
||||||
return desc->entry.sha1;
|
return desc->entry.sha1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user