rerere: make sorting really stable.

The earlier code does not swap hunks when the beginning of the
first side is identical to the whole of the second side.  In
such a case, the first one should sort later.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 2007-04-04 14:12:03 -07:00
parent 364b852352
commit 2b93edbf32
2 changed files with 11 additions and 7 deletions

View File

@ -117,10 +117,13 @@ static int handle_file(const char *path,
else if (!prefixcmp(buf, "=======")) else if (!prefixcmp(buf, "======="))
hunk = 2; hunk = 2;
else if (!prefixcmp(buf, ">>>>>>> ")) { else if (!prefixcmp(buf, ">>>>>>> ")) {
int one_is_longer = (one->nr > two->nr);
int common_len = one_is_longer ? two->nr : one->nr;
int cmp = memcmp(one->ptr, two->ptr, common_len);

hunk_no++; hunk_no++;
hunk = 0; hunk = 0;
if (memcmp(one->ptr, two->ptr, one->nr < two->nr ? if ((cmp > 0) || ((cmp == 0) && one_is_longer)) {
one->nr : two->nr) > 0) {
struct buffer *swap = one; struct buffer *swap = one;
one = two; one = two;
two = swap; two = swap;

View File

@ -35,7 +35,8 @@ git commit -q -a -m first


git checkout -b second master git checkout -b second master
git show first:a1 | git show first:a1 |
sed -e 's/To die, t/To die! T/' -e 's/life;$/life./' > a1 sed -e 's/To die, t/To die! T/' > a1
echo "* END *" >>a1
git commit -q -a -m second git commit -q -a -m second


# activate rerere # activate rerere
@ -53,7 +54,7 @@ test_expect_success 'no postimage or thisimage yet' \
test_expect_success 'preimage has right number of lines' ' test_expect_success 'preimage has right number of lines' '


cnt=$(sed -ne "/^<<<<<<</,/^>>>>>>>/p" $rr/preimage | wc -l) && cnt=$(sed -ne "/^<<<<<<</,/^>>>>>>>/p" $rr/preimage | wc -l) &&
test $cnt = 10 test $cnt = 9


' '


@ -75,10 +76,10 @@ cat > expect << EOF
For in that sleep of death what dreams may come For in that sleep of death what dreams may come
When we have shuffled off this mortal coil, When we have shuffled off this mortal coil,
Must give us pause: there's the respect Must give us pause: there's the respect
-<<<<<<<
-That makes calamity of so long life.
-=======
That makes calamity of so long life; That makes calamity of so long life;
-<<<<<<<
-=======
-* END *
->>>>>>> ->>>>>>>
EOF EOF
git rerere diff > out git rerere diff > out