Skip to content

Commit

Permalink
Clean up and simplify rev_compare_tree()
Browse files Browse the repository at this point in the history
This simplifies the logic of rev_compare_tree() by removing a special
case.

It does so by turning the special case of finding a diff to be "all new
files" into a more generic case of "all new" vs "all removed" vs "mixed
changes", so now the code is actually more powerful and more generic, and
the added symmetry actually makes it simpler too.

This makes no changes to any existing behavior, but apart from the
simplification it does make it possible to some day care about whether all
changes were just deletions if we want to. Which we may well want to for
merge handling.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
torvalds authored and gitster committed Jun 3, 2009
1 parent 433e972 commit ceff8e7
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 23 deletions.
33 changes: 12 additions & 21 deletions revision.c
Expand Up @@ -256,10 +256,12 @@ static int everybody_uninteresting(struct commit_list *orig)

/*
* The goal is to get REV_TREE_NEW as the result only if the
* diff consists of all '+' (and no other changes), and
* REV_TREE_DIFFERENT otherwise (of course if the trees are
* the same we want REV_TREE_SAME). That means that once we
* get to REV_TREE_DIFFERENT, we do not have to look any further.
* diff consists of all '+' (and no other changes), REV_TREE_OLD
* if the whole diff is removal of old data, and otherwise
* REV_TREE_DIFFERENT (of course if the trees are the same we
* want REV_TREE_SAME).
* That means that once we get to REV_TREE_DIFFERENT, we do not
* have to look any further.
*/
static int tree_difference = REV_TREE_SAME;

Expand All @@ -268,22 +270,9 @@ static void file_add_remove(struct diff_options *options,
const unsigned char *sha1,
const char *fullpath)
{
int diff = REV_TREE_DIFFERENT;
int diff = addremove == '+' ? REV_TREE_NEW : REV_TREE_OLD;

/*
* Is it an add of a new file? It means that the old tree
* didn't have it at all, so we will turn "REV_TREE_SAME" ->
* "REV_TREE_NEW", but leave any "REV_TREE_DIFFERENT" alone
* (and if it already was "REV_TREE_NEW", we'll keep it
* "REV_TREE_NEW" of course).
*/
if (addremove == '+') {
diff = tree_difference;
if (diff != REV_TREE_SAME)
return;
diff = REV_TREE_NEW;
}
tree_difference = diff;
tree_difference |= diff;
if (tree_difference == REV_TREE_DIFFERENT)
DIFF_OPT_SET(options, HAS_CHANGES);
}
Expand All @@ -305,6 +294,8 @@ static int rev_compare_tree(struct rev_info *revs, struct commit *parent, struct

if (!t1)
return REV_TREE_NEW;
if (!t2)
return REV_TREE_OLD;

if (revs->simplify_by_decoration) {
/*
Expand All @@ -323,8 +314,7 @@ static int rev_compare_tree(struct rev_info *revs, struct commit *parent, struct
if (!revs->prune_data)
return REV_TREE_SAME;
}
if (!t2)
return REV_TREE_DIFFERENT;

tree_difference = REV_TREE_SAME;
DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "",
Expand Down Expand Up @@ -429,6 +419,7 @@ static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit)
p->parents = NULL;
}
/* fallthrough */
case REV_TREE_OLD:
case REV_TREE_DIFFERENT:
tree_changed = 1;
pp = &parent->next;
Expand Down
5 changes: 3 additions & 2 deletions revision.h
Expand Up @@ -118,8 +118,9 @@ struct rev_info {
};

#define REV_TREE_SAME 0
#define REV_TREE_NEW 1
#define REV_TREE_DIFFERENT 2
#define REV_TREE_NEW 1 /* Only new files */
#define REV_TREE_OLD 2 /* Only files removed */
#define REV_TREE_DIFFERENT 3 /* Mixed changes */

/* revision.c */
void read_revisions_from_stdin(struct rev_info *revs);
Expand Down

0 comments on commit ceff8e7

Please sign in to comment.