From c8bae7493d2f2910b57f13ded012e86bdcfb0532 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 16:47:53 +0200 Subject: Adding upstream version 1:2.39.2. Signed-off-by: Daniel Baumann --- t/t6007-rev-list-cherry-pick-file.sh | 284 +++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100755 t/t6007-rev-list-cherry-pick-file.sh (limited to 't/t6007-rev-list-cherry-pick-file.sh') diff --git a/t/t6007-rev-list-cherry-pick-file.sh b/t/t6007-rev-list-cherry-pick-file.sh new file mode 100755 index 0000000..6f3e543 --- /dev/null +++ b/t/t6007-rev-list-cherry-pick-file.sh @@ -0,0 +1,284 @@ +#!/bin/sh + +test_description='test git rev-list --cherry-pick -- file' + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh + +# A---B---D---F +# \ +# \ +# C---E +# +# B changes a file foo.c, adding a line of text. C changes foo.c as +# well as bar.c, but the change in foo.c was identical to change B. +# D and C change bar in the same way, E and F differently. + +test_expect_success setup ' + echo Hallo > foo && + git add foo && + test_tick && + git commit -m "A" && + git tag A && + git checkout -b branch && + echo Bello > foo && + echo Cello > bar && + git add foo bar && + test_tick && + git commit -m "C" && + git tag C && + echo Dello > bar && + git add bar && + test_tick && + git commit -m "E" && + git tag E && + git checkout main && + git checkout branch foo && + test_tick && + git commit -m "B" && + git tag B && + echo Cello > bar && + git add bar && + test_tick && + git commit -m "D" && + git tag D && + echo Nello > bar && + git add bar && + test_tick && + git commit -m "F" && + git tag F +' + +cat >expect <tags/C +EOF + +test_expect_success '--left-right' ' + git rev-list --left-right B...C > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +test_expect_success '--count' ' + git rev-list --count B...C > actual && + test "$(cat actual)" = 2 +' + +test_expect_success '--cherry-pick foo comes up empty' ' + test -z "$(git rev-list --left-right --cherry-pick B...C -- foo)" +' + +cat >expect <tags/C +EOF + +test_expect_success '--cherry-pick bar does not come up empty' ' + git rev-list --left-right --cherry-pick B...C -- bar > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +test_expect_success 'bar does not come up empty' ' + git rev-list --left-right B...C -- bar > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +cat >expect <tags/E +EOF + +test_expect_success '--cherry-pick bar does not come up empty (II)' ' + git rev-list --left-right --cherry-pick F...E -- bar > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +test_expect_success 'name-rev multiple --refs combine inclusive' ' + git rev-list --left-right --cherry-pick F...E -- bar >actual && + git name-rev --annotate-stdin --name-only --refs="*tags/F" --refs="*tags/E" \ + actual.named && + test_cmp expect actual.named +' + +cat >expect <>expect && + git rev-list --left-right --cherry-pick F...E -- bar >actual && + git name-rev --annotate-stdin --name-only --refs="*tags/F" \ + actual.named && + test_cmp expect actual.named +' + +cat >expect <>expect && + git rev-list --left-right --cherry-pick F...E -- bar >actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" --exclude="*E" \ + actual.named && + test_cmp expect actual.named +' + +test_expect_success 'name-rev --no-refs clears the refs list' ' + git rev-list --left-right --cherry-pick F...E -- bar >expect && + git name-rev --annotate-stdin --name-only --refs="*tags/F" --refs="*tags/E" --no-refs --refs="*tags/G" \ + actual && + test_cmp expect actual +' + +cat >expect < actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +cat >expect <tags/E +=tags/C +EOF + +test_expect_success '--cherry-mark --left-right' ' + git rev-list --cherry-mark --left-right F...E -- bar > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +cat >expect < actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +test_expect_success '--cherry-pick --left-only' ' + git rev-list --cherry-pick --left-only E...F -- bar > actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +cat >expect < actual && + git name-rev --annotate-stdin --name-only --refs="*tags/*" \ + < actual > actual.named && + test_cmp expect actual.named +' + +cat >expect < actual && + test_cmp expect actual +' + +cat >expect < actual && + test_cmp expect actual +' + +cat >expect < actual && + test_cmp expect actual +' + +test_expect_success '--cherry-pick with independent, but identical branches' ' + git symbolic-ref HEAD refs/heads/independent && + rm .git/index && + echo Hallo > foo && + git add foo && + test_tick && + git commit -m "independent" && + echo Bello > foo && + test_tick && + git commit -m "independent, too" foo && + test -z "$(git rev-list --left-right --cherry-pick \ + HEAD...main -- foo)" +' + +cat >expect < actual && + test_cmp expect actual +' + +test_expect_success '--cherry-pick with duplicates on each side' ' + git checkout -b dup-orig && + test_commit dup-base && + git revert dup-base && + git cherry-pick dup-base && + git checkout -b dup-side HEAD~3 && + test_tick && + git cherry-pick -3 dup-orig && + git rev-list --cherry-pick dup-orig...dup-side >actual && + test_must_be_empty actual +' + +# Corrupt the object store deliberately to make sure +# the object is not even checked for its existence. +remove_loose_object () { + sha1="$(git rev-parse "$1")" && + remainder=${sha1#??} && + firsttwo=${sha1%$remainder} && + rm .git/objects/$firsttwo/$remainder +} + +test_expect_success '--cherry-pick avoids looking at full diffs' ' + git checkout -b shy-diff && + test_commit dont-look-at-me && + echo Hello >dont-look-at-me.t && + test_tick && + git commit -m tip dont-look-at-me.t && + git checkout -b mainline HEAD^ && + test_commit to-cherry-pick && + remove_loose_object shy-diff^:dont-look-at-me.t && + git rev-list --cherry-pick ...shy-diff +' + +test_done -- cgit v1.2.3