git/t/t5521-pull-options.sh
Paul Tan eb2a8d9ed3 pull: handle git-fetch's options as well
While parsing the command-line arguments, git-pull stops parsing at the
first unrecognized option, assuming that any subsequent options are for
git-fetch, and can thus be kept in the shell's positional parameters
list, so that it can be passed to git-fetch via the expansion of "$@".

However, certain functions in git-pull assume that the positional
parameters do not contain any options:

* error_on_no_merge_candidates() uses the number of positional
  parameters to determine which error message to print out, and will
  thus print the wrong message if git-fetch's options are passed in as
  well.

* the call to get_remote_merge_branch() assumes that the positional
  parameters only contains the optional repo and refspecs, and will
  thus silently fail if git-fetch's options are passed in as well.

* --dry-run is a valid git-fetch option, but if provided after any
  git-fetch options, it is not recognized by git-pull and thus git-pull
  will continue to run the merge or rebase.

Fix these bugs by teaching git-pull to parse git-fetch's options as
well. Add tests to prevent regressions.

This removes the limitation where git-fetch's options have to come after
git-merge's and git-rebase's options on the command line. Update the
documentation to reflect this.

Signed-off-by: Paul Tan <pyokagan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-06-02 13:36:22 -07:00

148 lines
3.2 KiB
Bash
Executable file

#!/bin/sh
test_description='pull options'
. ./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' '
mkdir clonedq &&
(cd clonedq && git init &&
git pull -q "../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' '
mkdir cloned &&
(cd cloned && git init &&
git pull "../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' '
mkdir clonedv &&
(cd clonedv && git init &&
git pull -v "../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' '
mkdir clonedvq &&
(cd clonedvq && git init &&
git pull -v -q "../parent" >out 2>err &&
test_must_be_empty out &&
test_must_be_empty err)
'
test_expect_success 'git pull -q -v' '
mkdir clonedqv &&
(cd clonedqv && git init &&
git pull -q -v "../parent" >out 2>err &&
test_must_be_empty out &&
test -s err)
'
test_expect_success 'git pull --force' '
mkdir clonedoldstyle &&
(cd clonedoldstyle && git init &&
cat >>.git/config <<-\EOF &&
[remote "one"]
url = ../parent
fetch = refs/heads/master:refs/heads/mirror
[remote "two"]
url = ../parent
fetch = refs/heads/master:refs/heads/origin
[branch "master"]
remote = two
merge = refs/heads/master
EOF
git pull two &&
test_commit A &&
git branch -f origin &&
git pull --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 "master"]
remote = one
merge = refs/heads/master
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_path_is_missing .git/refs/heads/master &&
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_path_is_missing .git/refs/remotes/origin/master &&
test_path_is_missing .git/index &&
test_path_is_missing file
)
'
test_done