summaryrefslogtreecommitdiffstats
path: root/t/t5521-pull-options.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xt/t5521-pull-options.sh256
1 files changed, 256 insertions, 0 deletions
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
new file mode 100755
index 0000000..db00c43
--- /dev/null
+++ b/t/t5521-pull-options.sh
@@ -0,0 +1,256 @@
+#!/bin/sh
+
+test_description='pull options'
+
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+TEST_PASSES_SANITIZE_LEAK=true
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ mkdir parent &&
+ (cd parent && git init &&
+ echo one >file && git add file &&
+ git commit -m one)
+'
+
+test_expect_success 'git pull -q --no-rebase' '
+ mkdir clonedq &&
+ (cd clonedq && git init &&
+ git pull -q --no-rebase "../parent" >out 2>err &&
+ test_must_be_empty err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull -q --rebase' '
+ mkdir clonedqrb &&
+ (cd clonedqrb && git init &&
+ git pull -q --rebase "../parent" >out 2>err &&
+ test_must_be_empty err &&
+ test_must_be_empty out &&
+ git pull -q --rebase "../parent" >out 2>err &&
+ test_must_be_empty err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull --no-rebase' '
+ mkdir cloned &&
+ (cd cloned && git init &&
+ git pull --no-rebase "../parent" >out 2>err &&
+ test -s err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull --rebase' '
+ mkdir clonedrb &&
+ (cd clonedrb && git init &&
+ git pull --rebase "../parent" >out 2>err &&
+ test -s err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull -v --no-rebase' '
+ mkdir clonedv &&
+ (cd clonedv && git init &&
+ git pull -v --no-rebase "../parent" >out 2>err &&
+ test -s err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull -v --rebase' '
+ mkdir clonedvrb &&
+ (cd clonedvrb && git init &&
+ git pull -v --rebase "../parent" >out 2>err &&
+ test -s err &&
+ test_must_be_empty out)
+'
+
+test_expect_success 'git pull -v -q --no-rebase' '
+ mkdir clonedvq &&
+ (cd clonedvq && git init &&
+ git pull -v -q --no-rebase "../parent" >out 2>err &&
+ test_must_be_empty out &&
+ test_must_be_empty err)
+'
+
+test_expect_success 'git pull -q -v --no-rebase' '
+ mkdir clonedqv &&
+ (cd clonedqv && git init &&
+ git pull -q -v --no-rebase "../parent" >out 2>err &&
+ test_must_be_empty out &&
+ test -s err)
+'
+test_expect_success 'git pull --cleanup errors early on invalid argument' '
+ mkdir clonedcleanup &&
+ (cd clonedcleanup && git init &&
+ test_must_fail git pull --no-rebase --cleanup invalid "../parent" >out 2>err &&
+ test_must_be_empty out &&
+ test -s err)
+'
+
+test_expect_success 'git pull --no-write-fetch-head fails' '
+ mkdir clonedwfh &&
+ (cd clonedwfh && git init &&
+ test_expect_code 129 git pull --no-write-fetch-head "../parent" >out 2>err &&
+ test_must_be_empty out &&
+ test_grep "no-write-fetch-head" err)
+'
+
+test_expect_success 'git pull --force' '
+ mkdir clonedoldstyle &&
+ (cd clonedoldstyle && git init &&
+ cat >>.git/config <<-\EOF &&
+ [remote "one"]
+ url = ../parent
+ fetch = refs/heads/main:refs/heads/mirror
+ [remote "two"]
+ url = ../parent
+ fetch = refs/heads/main:refs/heads/origin
+ [branch "main"]
+ remote = two
+ merge = refs/heads/main
+ EOF
+ git pull two &&
+ test_commit A &&
+ git branch -f origin &&
+ git pull --no-rebase --all --force
+ )
+'
+
+test_expect_success 'git pull --all' '
+ mkdir clonedmulti &&
+ (cd clonedmulti && git init &&
+ cat >>.git/config <<-\EOF &&
+ [remote "one"]
+ url = ../parent
+ fetch = refs/heads/*:refs/remotes/one/*
+ [remote "two"]
+ url = ../parent
+ fetch = refs/heads/*:refs/remotes/two/*
+ [branch "main"]
+ remote = one
+ merge = refs/heads/main
+ EOF
+ git pull --all
+ )
+'
+
+test_expect_success 'git pull --dry-run' '
+ test_when_finished "rm -rf clonedry" &&
+ git init clonedry &&
+ (
+ cd clonedry &&
+ git pull --dry-run ../parent &&
+ test_path_is_missing .git/FETCH_HEAD &&
+ test_ref_missing refs/heads/main &&
+ test_path_is_missing .git/index &&
+ test_path_is_missing file
+ )
+'
+
+test_expect_success 'git pull --all --dry-run' '
+ test_when_finished "rm -rf cloneddry" &&
+ git init clonedry &&
+ (
+ cd clonedry &&
+ git remote add origin ../parent &&
+ git pull --all --dry-run &&
+ test_path_is_missing .git/FETCH_HEAD &&
+ test_ref_missing refs/remotes/origin/main &&
+ test_path_is_missing .git/index &&
+ test_path_is_missing file
+ )
+'
+
+test_expect_success 'git pull --allow-unrelated-histories' '
+ test_when_finished "rm -fr src dst" &&
+ git init src &&
+ (
+ cd src &&
+ test_commit one &&
+ test_commit two
+ ) &&
+ git clone src dst &&
+ (
+ cd src &&
+ git checkout --orphan side HEAD^ &&
+ test_commit three
+ ) &&
+ (
+ cd dst &&
+ test_must_fail git pull ../src side &&
+ git pull --no-rebase --allow-unrelated-histories ../src side
+ )
+'
+
+test_expect_success 'git pull does not add a sign-off line' '
+ test_when_finished "rm -fr src dst actual" &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_commit -C src two &&
+ git -C dst pull --no-ff &&
+ git -C dst show -s --pretty="format:%(trailers)" HEAD >actual &&
+ test_must_be_empty actual
+'
+
+test_expect_success 'git pull --no-signoff does not add sign-off line' '
+ test_when_finished "rm -fr src dst actual" &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_commit -C src two &&
+ git -C dst pull --no-signoff --no-ff &&
+ git -C dst show -s --pretty="format:%(trailers)" HEAD >actual &&
+ test_must_be_empty actual
+'
+
+test_expect_success 'git pull --signoff add a sign-off line' '
+ test_when_finished "rm -fr src dst expected actual" &&
+ echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_commit -C src two &&
+ git -C dst pull --signoff --no-ff &&
+ git -C dst show -s --pretty="format:%(trailers)" HEAD >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'git pull --no-signoff flag cancels --signoff flag' '
+ test_when_finished "rm -fr src dst actual" &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_commit -C src two &&
+ git -C dst pull --signoff --no-signoff --no-ff &&
+ git -C dst show -s --pretty="format:%(trailers)" HEAD >actual &&
+ test_must_be_empty actual
+'
+
+test_expect_success 'git pull --no-verify flag passed to merge' '
+ test_when_finished "rm -fr src dst actual" &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_hook -C dst commit-msg <<-\EOF &&
+ false
+ EOF
+ test_commit -C src two &&
+ git -C dst pull --no-ff --no-verify
+'
+
+test_expect_success 'git pull --no-verify --verify passed to merge' '
+ test_when_finished "rm -fr src dst actual" &&
+ git init src &&
+ test_commit -C src one &&
+ git clone src dst &&
+ test_hook -C dst commit-msg <<-\EOF &&
+ false
+ EOF
+ test_commit -C src two &&
+ test_must_fail git -C dst pull --no-ff --no-verify --verify
+'
+
+test_done