ref-filter: make remote_ref_atom_parser() use refname_atom_parser_internal()
[gitweb.git] / t / t6010-merge-base.sh
index 62197a3d35f257dee6545d0f7768f21242e696ca..31db7b5f9125ed346450d7bfe29d8bb5fac0460a 100755 (executable)
@@ -8,38 +8,38 @@ test_description='Merge base and parent list computation.
 
 . ./test-lib.sh
 
-test_expect_success 'setup' '
-       T=$(git write-tree) &&
+M=1130000000
+Z=+0000
 
-       M=1130000000 &&
-       Z=+0000 &&
+GIT_COMMITTER_EMAIL=git@comm.iter.xz
+GIT_COMMITTER_NAME='C O Mmiter'
+GIT_AUTHOR_NAME='A U Thor'
+GIT_AUTHOR_EMAIL=git@au.thor.xz
+export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
 
-       GIT_COMMITTER_EMAIL=git@comm.iter.xz &&
-       GIT_COMMITTER_NAME="C O Mmiter" &&
-       GIT_AUTHOR_NAME="A U Thor" &&
-       GIT_AUTHOR_EMAIL=git@au.thor.xz &&
-       export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
+doit () {
+       OFFSET=$1 &&
+       NAME=$2 &&
+       shift 2 &&
 
-       doit() {
-               OFFSET=$1 &&
-               NAME=$2 &&
-               shift 2 &&
+       PARENTS= &&
+       for P
+       do
+               PARENTS="${PARENTS}-p $P "
+       done &&
 
-               PARENTS= &&
-               for P
-               do
-                       PARENTS="${PARENTS}-p $P "
-               done &&
+       GIT_COMMITTER_DATE="$(($M + $OFFSET)) $Z" &&
+       GIT_AUTHOR_DATE=$GIT_COMMITTER_DATE &&
+       export GIT_COMMITTER_DATE GIT_AUTHOR_DATE &&
 
-               GIT_COMMITTER_DATE="$(($M + $OFFSET)) $Z" &&
-               GIT_AUTHOR_DATE=$GIT_COMMITTER_DATE &&
-               export GIT_COMMITTER_DATE GIT_AUTHOR_DATE &&
+       commit=$(echo $NAME | git commit-tree $T $PARENTS) &&
 
-               commit=$(echo $NAME | git commit-tree $T $PARENTS) &&
+       echo $commit >.git/refs/tags/$NAME &&
+       echo $commit
+}
 
-               echo $commit >.git/refs/tags/$NAME &&
-               echo $commit
-       }
+test_expect_success 'setup' '
+       T=$(git mktree </dev/null)
 '
 
 test_expect_success 'set up G and H' '
@@ -131,7 +131,7 @@ test_expect_success 'unsynchronized clocks' '
        R2=$(doit  3 R2 $R1) &&
 
        PL=$(doit  4 PL $L2 $C2) &&
-       PR=$(doit  4 PR $C2 $R2)
+       PR=$(doit  4 PR $C2 $R2) &&
 
        git name-rev $C2 >expected &&
 
@@ -215,11 +215,13 @@ test_expect_success 'criss-cross merge-base for octopus-step' '
        git reset --hard E &&
        test_commit CC2 &&
        test_tick &&
-       git merge -s ours CC1 &&
+       # E is a root commit unrelated to MMR root on which CC1 is based
+       git merge -s ours --allow-unrelated-histories CC1 &&
        test_commit CC-o &&
        test_commit CCB &&
        git reset --hard CC1 &&
-       git merge -s ours CC2 &&
+       # E is a root commit unrelated to MMR root on which CC1 is based
+       git merge -s ours --allow-unrelated-histories CC2 &&
        test_commit CCA &&
 
        git rev-parse CC1 CC2 >expected &&
@@ -230,4 +232,77 @@ test_expect_success 'criss-cross merge-base for octopus-step' '
        test_cmp expected.sorted actual.sorted
 '
 
+test_expect_success 'using reflog to find the fork point' '
+       git reset --hard &&
+       git checkout -b base $E &&
+
+       (
+               for count in 1 2 3
+               do
+                       git commit --allow-empty -m "Base commit #$count" &&
+                       git rev-parse HEAD >expect$count &&
+                       git checkout -B derived &&
+                       git commit --allow-empty -m "Derived #$count" &&
+                       git rev-parse HEAD >derived$count &&
+                       git checkout -B base $E || exit 1
+               done
+
+               for count in 1 2 3
+               do
+                       git merge-base --fork-point base $(cat derived$count) >actual &&
+                       test_cmp expect$count actual || exit 1
+               done
+
+       ) &&
+       # check that we correctly default to HEAD
+       git checkout derived &&
+       git merge-base --fork-point base >actual &&
+       test_cmp expect3 actual
+'
+
+test_expect_success '--fork-point works with empty reflog' '
+       git -c core.logallrefupdates=false branch no-reflog base &&
+       git merge-base --fork-point no-reflog derived &&
+       test_cmp expect3 actual
+'
+
+test_expect_success 'merge-base --octopus --all for complex tree' '
+       # Best common ancestor for JE, JAA and JDD is JC
+       #             JE
+       #            / |
+       #           /  |
+       #          /   |
+       #  JAA    /    |
+       #   |\   /     |
+       #   | \  | JDD |
+       #   |  \ |/ |  |
+       #   |   JC JD  |
+       #   |    | /|  |
+       #   |    |/ |  |
+       #  JA    |  |  |
+       #   |\  /|  |  |
+       #   X JB |  X  X
+       #   \  \ | /   /
+       #    \__\|/___/
+       #        J
+       test_commit J &&
+       test_commit JB &&
+       git reset --hard J &&
+       test_commit JC &&
+       git reset --hard J &&
+       test_commit JTEMP1 &&
+       test_merge JA JB &&
+       test_merge JAA JC &&
+       git reset --hard J &&
+       test_commit JTEMP2 &&
+       test_merge JD JB &&
+       test_merge JDD JC &&
+       git reset --hard J &&
+       test_commit JTEMP3 &&
+       test_merge JE JC &&
+       git rev-parse JC >expected &&
+       git merge-base --all --octopus JAA JDD JE >actual &&
+       test_cmp expected actual
+'
+
 test_done