summaryrefslogtreecommitdiff
path: root/combine-diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-02-02 01:28:08 -0800
committerJunio C Hamano <junkio@cox.net>2006-02-02 02:02:20 -0800
commitfd4b1d2193640009c9303daa784691fc5e102018 (patch)
treea238aa3d7f3be2b922de350b46667a9bfd6dae5d /combine-diff.c
parentbf1c32bdec8223785c779779d0a660a099f69a63 (diff)
downloadgit-fd4b1d2193640009c9303daa784691fc5e102018.tar.gz
combine-diff: add safety check to --cc.
The earlier change implemented "only two version" check but without checking if the change rewrites from all the parents. This implements a check to make sure that a change introduced by the merge from all the parents is caught to be interesting. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'combine-diff.c')
-rw-r--r--combine-diff.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/combine-diff.c b/combine-diff.c
index 44931b2a89..8f295c89d0 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -397,7 +397,23 @@ static int make_hunks(struct sline *sline, unsigned long cnt,
hunk_end = j;
/* [i..hunk_end) are interesting. Now is it really
- * interesting?
+ * interesting? We check if there are only two versions
+ * and the result matches one of them. That is, we look
+ * at:
+ * (+) line, which records lines added to which parents;
+ * this line appears in the result.
+ * (-) line, which records from what parents the line
+ * was removed; this line does not appear in the result.
+ * then check the set of parents the result has difference
+ * from, from all lines. If there are lines that has
+ * different set of parents that the result has differences
+ * from, that means we have more than two versions.
+ *
+ * Even when we have only two versions, if the result does
+ * not match any of the parents, the it should be considered
+ * interesting. In such a case, we would have all '+' line.
+ * After passing the above "two versions" test, that would
+ * appear as "the same set of parents" to be "all parents".
*/
same_diff = 0;
has_interesting = 0;
@@ -429,7 +445,7 @@ static int make_hunks(struct sline *sline, unsigned long cnt,
}
}
- if (!has_interesting) {
+ if (!has_interesting && same_diff != all_mask) {
/* This hunk is not that interesting after all */
for (j = hunk_begin; j < hunk_end; j++)
sline[j].flag &= ~mark;