Skip to content

Commit 204ce97

Browse files
dschotorvalds
authored andcommitted
Also use unpack_trees() in do_diff_cache()
As in run_diff_index(), we call unpack_trees() with the oneway_diff() function in do_diff_cache() now. This makes the function diff_cache() obsolete. Signed-off-by: Johannes Schindelin <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent d1f2d7e commit 204ce97

File tree

1 file changed

+13
-79
lines changed

1 file changed

+13
-79
lines changed

diff-lib.c

Lines changed: 13 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -577,81 +577,6 @@ static int show_modified(struct rev_info *revs,
577577
return 0;
578578
}
579579

580-
static int diff_cache(struct rev_info *revs,
581-
struct cache_entry **ac, int entries,
582-
const char **pathspec,
583-
int cached, int match_missing)
584-
{
585-
while (entries) {
586-
struct cache_entry *ce = *ac;
587-
int same = (entries > 1) && ce_same_name(ce, ac[1]);
588-
589-
if (DIFF_OPT_TST(&revs->diffopt, QUIET) &&
590-
DIFF_OPT_TST(&revs->diffopt, HAS_CHANGES))
591-
break;
592-
593-
if (!ce_path_match(ce, pathspec))
594-
goto skip_entry;
595-
596-
switch (ce_stage(ce)) {
597-
case 0:
598-
/* No stage 1 entry? That means it's a new file */
599-
if (!same) {
600-
show_new_file(revs, ce, cached, match_missing);
601-
break;
602-
}
603-
/* Show difference between old and new */
604-
show_modified(revs, ac[1], ce, 1,
605-
cached, match_missing);
606-
break;
607-
case 1:
608-
/* No stage 3 (merge) entry?
609-
* That means it's been deleted.
610-
*/
611-
if (!same) {
612-
diff_index_show_file(revs, "-", ce,
613-
ce->sha1, ce->ce_mode);
614-
break;
615-
}
616-
/* We come here with ce pointing at stage 1
617-
* (original tree) and ac[1] pointing at stage
618-
* 3 (unmerged). show-modified with
619-
* report-missing set to false does not say the
620-
* file is deleted but reports true if work
621-
* tree does not have it, in which case we
622-
* fall through to report the unmerged state.
623-
* Otherwise, we show the differences between
624-
* the original tree and the work tree.
625-
*/
626-
if (!cached &&
627-
!show_modified(revs, ce, ac[1], 0,
628-
cached, match_missing))
629-
break;
630-
diff_unmerge(&revs->diffopt, ce->name,
631-
ce->ce_mode, ce->sha1);
632-
break;
633-
case 3:
634-
diff_unmerge(&revs->diffopt, ce->name,
635-
0, null_sha1);
636-
break;
637-
638-
default:
639-
die("impossible cache entry stage");
640-
}
641-
642-
skip_entry:
643-
/*
644-
* Ignore all the different stages for this file,
645-
* we've handled the relevant cases now.
646-
*/
647-
do {
648-
ac++;
649-
entries--;
650-
} while (entries && ce_same_name(ce, ac[0]));
651-
}
652-
return 0;
653-
}
654-
655580
/*
656581
* This turns all merge entries into "stage 3". That guarantees that
657582
* when we read in the new tree (into "stage 1"), we won't lose sight
@@ -826,6 +751,8 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
826751
int i;
827752
struct cache_entry **dst;
828753
struct cache_entry *last = NULL;
754+
struct unpack_trees_options opts;
755+
struct tree_desc t;
829756

830757
/*
831758
* This is used by git-blame to run diff-cache internally;
@@ -853,8 +780,15 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
853780
tree = parse_tree_indirect(tree_sha1);
854781
if (!tree)
855782
die("bad tree object %s", sha1_to_hex(tree_sha1));
856-
if (read_tree(tree, 1, opt->paths))
857-
return error("unable to read tree %s", sha1_to_hex(tree_sha1));
858-
return diff_cache(&revs, active_cache, active_nr, revs.prune_data,
859-
1, 0);
783+
784+
memset(&opts, 0, sizeof(opts));
785+
opts.head_idx = 1;
786+
opts.index_only = 1;
787+
opts.merge = 1;
788+
opts.fn = oneway_diff;
789+
opts.unpack_data = &revs;
790+
791+
init_tree_desc(&t, tree->buffer, tree->size);
792+
unpack_trees(1, &t, &opts);
793+
return 0;
860794
}

0 commit comments

Comments
 (0)