summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSZEDER Gábor <szeder@ira.uka.de>2016-02-25 23:50:35 +0100
committerJunio C Hamano <gitster@pobox.com>2016-02-28 16:37:15 -0800
commit70f17430721f587b9fcd1b6b3f26a859a30b4680 (patch)
treea83909c51d6865a24ab124bf89e28f29a88ce72c
parentd177357d0f9657cb513b097040b0d2a1f2694048 (diff)
downloadgit-70f17430721f587b9fcd1b6b3f26a859a30b4680.tar.gz
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e. - short and full refs, - from a local or from a remote repository, - remote specified via path, name or URL, - with or without a repository specified on the command line, - non-existing remote, - unique remote branches for 'git checkout's tracking DWIMery, - not in a git repository, and - interesting combinations of the above. Seven of these tests expect failure, mostly demonstrating bugs related to listing refs from a remote repository: - ignoring the repository specified on the command line (2 tests), - listing refs from the wrong place when the name of a configured remote happens to match a directory, - listing only 'HEAD' but no short refs from a remote given as URL, - listing 'HEAD' even from non-existing remotes (2 tests), and - listing 'HEAD' when not in a repository. Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xt/t9902-completion.sh266
1 files changed, 257 insertions, 9 deletions
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 1e8794747e..7ab3985685 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -370,6 +370,263 @@ test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from
test_cmp expect actual
'
+test_expect_success 'setup for ref completion' '
+ echo content >file1 &&
+ echo more >file2 &&
+ git add file1 file2 &&
+ git commit -m one &&
+ git branch mybranch &&
+ git tag mytag &&
+ (
+ cd otherrepo &&
+ >file &&
+ git add file &&
+ git commit -m initial &&
+ git branch branch
+ ) &&
+ git remote add remote "$ROOT/otherrepo/.git" &&
+ git update-ref refs/remotes/remote/branch master &&
+ git update-ref refs/remotes/remote/master master &&
+ git init thirdrepo
+'
+
+test_expect_success '__git_refs - simple' '
+ cat >expected <<-EOF &&
+ HEAD
+ master
+ mybranch
+ remote/branch
+ remote/master
+ mytag
+ EOF
+ (
+ cur= &&
+ __git_refs >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - full refs' '
+ cat >expected <<-EOF &&
+ refs/heads/master
+ refs/heads/mybranch
+ EOF
+ (
+ cur=refs/heads/ &&
+ __git_refs >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - repo given on the command line' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ (
+ __git_dir="$ROOT/otherrepo/.git" &&
+ cur= &&
+ __git_refs >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - remote on local file system' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ (
+ cur= &&
+ __git_refs otherrepo >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - remote on local file system - full refs' '
+ cat >expected <<-EOF &&
+ refs/heads/branch
+ refs/heads/master
+ EOF
+ (
+ cur=refs/heads/ &&
+ __git_refs otherrepo >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ (
+ cur= &&
+ __git_refs remote >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - configured remote - full refs' '
+ cat >expected <<-EOF &&
+ refs/heads/branch
+ refs/heads/master
+ EOF
+ (
+ cur=refs/heads/ &&
+ __git_refs remote >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - configured remote - repo given on the command line' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ (
+ cd thirdrepo &&
+ __git_dir="$ROOT/.git" &&
+ cur= &&
+ __git_refs remote >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - configured remote - full refs - repo given on the command line' '
+ cat >expected <<-EOF &&
+ refs/heads/branch
+ refs/heads/master
+ EOF
+ (
+ cd thirdrepo &&
+ __git_dir="$ROOT/.git" &&
+ cur=refs/heads/ &&
+ __git_refs remote >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - configured remote - remote name matches a directory' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ mkdir remote &&
+ test_when_finished "rm -rf remote" &&
+ (
+ cur= &&
+ __git_refs remote >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - URL remote' '
+ cat >expected <<-EOF &&
+ HEAD
+ branch
+ master
+ EOF
+ (
+ cur= &&
+ __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_success '__git_refs - URL remote - full refs' '
+ cat >expected <<-EOF &&
+ refs/heads/branch
+ refs/heads/master
+ EOF
+ (
+ cur=refs/heads/ &&
+ __git_refs "file://$ROOT/otherrepo/.git" >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - non-existing remote' '
+ (
+ cur= &&
+ __git_refs non-existing >"$actual"
+ ) &&
+ test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - non-existing remote - full refs' '
+ (
+ cur=refs/heads/ &&
+ __git_refs non-existing >"$actual"
+ ) &&
+ test_must_be_empty "$actual"
+'
+
+test_expect_failure '__git_refs - non-existing URL remote' '
+ (
+ cur= &&
+ __git_refs "file://$ROOT/non-existing" >"$actual"
+ ) &&
+ test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - non-existing URL remote - full refs' '
+ (
+ cur=refs/heads/ &&
+ __git_refs "file://$ROOT/non-existing" >"$actual"
+ ) &&
+ test_must_be_empty "$actual"
+'
+
+test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' '
+ cat >expected <<-EOF &&
+ HEAD
+ master
+ mybranch
+ otherremote/ambiguous
+ otherremote/otherbranch
+ remote/ambiguous
+ remote/branch
+ remote/master
+ mytag
+ branch
+ master
+ otherbranch
+ EOF
+ for remote_ref in refs/remotes/remote/ambiguous \
+ refs/remotes/otherremote/ambiguous \
+ refs/remotes/otherremote/otherbranch
+ do
+ git update-ref $remote_ref master &&
+ test_when_finished "git update-ref -d $remote_ref"
+ done &&
+ (
+ cur= &&
+ __git_refs "" 1 >"$actual"
+ ) &&
+ test_cmp expected "$actual"
+'
+
+test_expect_failure '__git_refs - not in a git repository' '
+ (
+ GIT_CEILING_DIRECTORIES="$ROOT" &&
+ export GIT_CEILING_DIRECTORIES &&
+ cd subdir &&
+ cur= &&
+ __git_refs >"$actual"
+ ) &&
+ test_must_be_empty "$actual"
+'
+
+test_expect_success 'remove configured remote used for refs completion' '
+ git remote remove remote
+'
+
test_expect_success '__git_get_config_variables' '
cat >expect <<-EOF &&
name-1
@@ -488,15 +745,6 @@ test_expect_success 'git --help completion' '
test_completion "git --help core" "core-tutorial "
'
-test_expect_success 'setup for ref completion' '
- echo content >file1 &&
- echo more >file2 &&
- git add file1 file2 &&
- git commit -m one &&
- git branch mybranch &&
- git tag mytag
-'
-
test_expect_success 'checkout completes ref names' '
test_completion "git checkout m" <<-\EOF
master Z