Skip to content

Commit 795dd11

Browse files
committed
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
2 parents 8a34205 + 7146e66 commit 795dd11

File tree

5 files changed

+10
-59
lines changed

5 files changed

+10
-59
lines changed

line-log.c

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -766,16 +766,6 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list
766766
}
767767
}
768768

769-
static void load_tree_desc(struct tree_desc *desc, void **tree,
770-
const unsigned char *sha1)
771-
{
772-
unsigned long size;
773-
*tree = read_object_with_reference(sha1, tree_type, &size, NULL);
774-
if (!*tree)
775-
die("Unable to read tree (%s)", sha1_to_hex(sha1));
776-
init_tree_desc(desc, *tree, size);
777-
}
778-
779769
static int count_parents(struct commit *commit)
780770
{
781771
struct commit_list *parents = commit->parents;
@@ -842,30 +832,18 @@ static void queue_diffs(struct line_log_data *range,
842832
struct diff_queue_struct *queue,
843833
struct commit *commit, struct commit *parent)
844834
{
845-
void *tree1 = NULL, *tree2 = NULL;
846-
struct tree_desc desc1, desc2;
847-
848835
assert(commit);
849-
load_tree_desc(&desc2, &tree2, commit->tree->object.sha1);
850-
if (parent)
851-
load_tree_desc(&desc1, &tree1, parent->tree->object.sha1);
852-
else
853-
init_tree_desc(&desc1, "", 0);
854836

855837
DIFF_QUEUE_CLEAR(&diff_queued_diff);
856-
diff_tree(&desc1, &desc2, "", opt);
838+
diff_tree_sha1(parent ? parent->tree->object.sha1 : NULL,
839+
commit->tree->object.sha1, "", opt);
857840
if (opt->detect_rename) {
858841
filter_diffs_for_paths(range, 1);
859842
if (diff_might_be_rename())
860843
diffcore_std(opt);
861844
filter_diffs_for_paths(range, 0);
862845
}
863846
move_diff_queue(queue, &diff_queued_diff);
864-
865-
if (tree1)
866-
free(tree1);
867-
if (tree2)
868-
free(tree2);
869847
}
870848

871849
static char *get_nth_line(long line, unsigned long *ends, void *data)

revision.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -497,24 +497,14 @@ static int rev_compare_tree(struct rev_info *revs,
497497
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)
498498
{
499499
int retval;
500-
void *tree;
501-
unsigned long size;
502-
struct tree_desc empty, real;
503500
struct tree *t1 = commit->tree;
504501

505502
if (!t1)
506503
return 0;
507504

508-
tree = read_object_with_reference(t1->object.sha1, tree_type, &size, NULL);
509-
if (!tree)
510-
return 0;
511-
init_tree_desc(&real, tree, size);
512-
init_tree_desc(&empty, "", 0);
513-
514505
tree_difference = REV_TREE_SAME;
515506
DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
516-
retval = diff_tree(&empty, &real, "", &revs->pruning);
517-
free(tree);
507+
retval = diff_tree_sha1(NULL, t1->object.sha1, "", &revs->pruning);
518508

519509
return retval >= 0 && (tree_difference == REV_TREE_SAME);
520510
}

tree-diff.c

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -294,14 +294,10 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
294294
unsigned long size1, size2;
295295
int retval;
296296

297-
tree1 = read_object_with_reference(old, tree_type, &size1, NULL);
298-
if (!tree1)
299-
die("unable to read source tree (%s)", sha1_to_hex(old));
300-
tree2 = read_object_with_reference(new, tree_type, &size2, NULL);
301-
if (!tree2)
302-
die("unable to read destination tree (%s)", sha1_to_hex(new));
303-
init_tree_desc(&t1, tree1, size1);
304-
init_tree_desc(&t2, tree2, size2);
297+
tree1 = fill_tree_descriptor(&t1, old);
298+
tree2 = fill_tree_descriptor(&t2, new);
299+
size1 = t1.size;
300+
size2 = t2.size;
305301
retval = diff_tree(&t1, &t2, base, opt);
306302
if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) {
307303
init_tree_desc(&t1, tree1, size1);
@@ -315,18 +311,5 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
315311

316312
int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt)
317313
{
318-
int retval;
319-
void *tree;
320-
unsigned long size;
321-
struct tree_desc empty, real;
322-
323-
tree = read_object_with_reference(new, tree_type, &size, NULL);
324-
if (!tree)
325-
die("unable to read root tree (%s)", sha1_to_hex(new));
326-
init_tree_desc(&real, tree, size);
327-
328-
init_tree_desc(&empty, "", 0);
329-
retval = diff_tree(&empty, &real, base, opt);
330-
free(tree);
331-
return retval;
314+
return diff_tree_sha1(NULL, new, base, opt);
332315
}

tree-walk.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned
3737

3838
/* Initialize the descriptor entry */
3939
desc->entry.path = path;
40-
desc->entry.mode = mode;
40+
desc->entry.mode = canon_mode(mode);
4141
desc->entry.sha1 = (const unsigned char *)(path + len);
4242
}
4343

tree-walk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct tree_desc {
1616
static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
1717
{
1818
*pathp = desc->entry.path;
19-
*modep = canon_mode(desc->entry.mode);
19+
*modep = desc->entry.mode;
2020
return desc->entry.sha1;
2121
}
2222

0 commit comments

Comments
 (0)