]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t3402-rebase-merge.sh
Merge branch 'jc/codingstyle-compare-with-null'
[thirdparty/git.git] / t / t3402-rebase-merge.sh
index a1ec501a872b9ae4087c93a5736fcd297bda7fc8..6e032716a687a3cd64b37683c67d3a476f06287f 100755 (executable)
@@ -162,4 +162,81 @@ test_expect_success 'rebase --skip works with two conflicts in a row' '
        git rebase --skip
 '
 
+test_expect_success '--reapply-cherry-picks' '
+       git init repo &&
+
+       # O(1-10) -- O(1-11) -- O(0-10) master
+       #        \
+       #         -- O(1-11) -- O(1-12) otherbranch
+
+       printf "Line %d\n" $(test_seq 1 10) >repo/file.txt &&
+       git -C repo add file.txt &&
+       git -C repo commit -m "base commit" &&
+
+       printf "Line %d\n" $(test_seq 1 11) >repo/file.txt &&
+       git -C repo commit -a -m "add 11" &&
+
+       printf "Line %d\n" $(test_seq 0 10) >repo/file.txt &&
+       git -C repo commit -a -m "add 0 delete 11" &&
+
+       git -C repo checkout -b otherbranch HEAD^^ &&
+       printf "Line %d\n" $(test_seq 1 11) >repo/file.txt &&
+       git -C repo commit -a -m "add 11 in another branch" &&
+
+       printf "Line %d\n" $(test_seq 1 12) >repo/file.txt &&
+       git -C repo commit -a -m "add 12 in another branch" &&
+
+       # Regular rebase fails, because the 1-11 commit is deduplicated
+       test_must_fail git -C repo rebase --merge master 2> err &&
+       test_i18ngrep "error: could not apply.*add 12 in another branch" err &&
+       git -C repo rebase --abort &&
+
+       # With --reapply-cherry-picks, it works
+       git -C repo rebase --merge --reapply-cherry-picks master
+'
+
+test_expect_success '--reapply-cherry-picks refrains from reading unneeded blobs' '
+       git init server &&
+
+       # O(1-10) -- O(1-11) -- O(1-12) master
+       #        \
+       #         -- O(0-10) otherbranch
+
+       printf "Line %d\n" $(test_seq 1 10) >server/file.txt &&
+       git -C server add file.txt &&
+       git -C server commit -m "merge base" &&
+
+       printf "Line %d\n" $(test_seq 1 11) >server/file.txt &&
+       git -C server commit -a -m "add 11" &&
+
+       printf "Line %d\n" $(test_seq 1 12) >server/file.txt &&
+       git -C server commit -a -m "add 12" &&
+
+       git -C server checkout -b otherbranch HEAD^^ &&
+       printf "Line %d\n" $(test_seq 0 10) >server/file.txt &&
+       git -C server commit -a -m "add 0" &&
+
+       test_config -C server uploadpack.allowfilter 1 &&
+       test_config -C server uploadpack.allowanysha1inwant 1 &&
+
+       git clone --filter=blob:none "file://$(pwd)/server" client &&
+       git -C client checkout origin/master &&
+       git -C client checkout origin/otherbranch &&
+
+       # Sanity check to ensure that the blobs from the merge base and "add
+       # 11" are missing
+       git -C client rev-list --objects --all --missing=print >missing_list &&
+       MERGE_BASE_BLOB=$(git -C server rev-parse master^^:file.txt) &&
+       ADD_11_BLOB=$(git -C server rev-parse master^:file.txt) &&
+       grep "[?]$MERGE_BASE_BLOB" missing_list &&
+       grep "[?]$ADD_11_BLOB" missing_list &&
+
+       git -C client rebase --merge --reapply-cherry-picks origin/master &&
+
+       # The blob from the merge base had to be fetched, but not "add 11"
+       git -C client rev-list --objects --all --missing=print >missing_list &&
+       ! grep "[?]$MERGE_BASE_BLOB" missing_list &&
+       grep "[?]$ADD_11_BLOB" missing_list
+'
+
 test_done