summaryrefslogtreecommitdiffstats
path: root/t/t5612-clone-refspec.sh
diff options
context:
space:
mode:
Diffstat (limited to 't/t5612-clone-refspec.sh')
-rwxr-xr-xt/t5612-clone-refspec.sh238
1 files changed, 238 insertions, 0 deletions
diff --git a/t/t5612-clone-refspec.sh b/t/t5612-clone-refspec.sh
new file mode 100755
index 0000000..3126cfd
--- /dev/null
+++ b/t/t5612-clone-refspec.sh
@@ -0,0 +1,238 @@
+#!/bin/sh
+
+test_description='test refspec written by clone-command'
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
+export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ # Make two branches, "main" and "side"
+ echo one >file &&
+ git add file &&
+ git commit -m one &&
+ echo two >file &&
+ git commit -a -m two &&
+ git tag two &&
+ echo three >file &&
+ git commit -a -m three &&
+ git checkout -b side &&
+ echo four >file &&
+ git commit -a -m four &&
+ git checkout main &&
+ git tag five &&
+
+ # default clone
+ git clone . dir_all &&
+
+ # default clone --no-tags
+ git clone --no-tags . dir_all_no_tags &&
+
+ # default --single that follows HEAD=main
+ git clone --single-branch . dir_main &&
+
+ # default --single that follows HEAD=main with no tags
+ git clone --single-branch --no-tags . dir_main_no_tags &&
+
+ # default --single that follows HEAD=side
+ git checkout side &&
+ git clone --single-branch . dir_side &&
+
+ # explicit --single that follows side
+ git checkout main &&
+ git clone --single-branch --branch side . dir_side2 &&
+
+ # default --single with --mirror
+ git clone --single-branch --mirror . dir_mirror &&
+
+ # default --single with --branch and --mirror
+ git clone --single-branch --mirror --branch side . dir_mirror_side &&
+
+ # --single that does not know what branch to follow
+ git checkout two^ &&
+ git clone --single-branch . dir_detached &&
+
+ # explicit --single with tag
+ git clone --single-branch --branch two . dir_tag &&
+
+ # explicit --single with tag and --no-tags
+ git clone --single-branch --no-tags --branch two . dir_tag_no_tags &&
+
+ # advance both "main" and "side" branches
+ git checkout side &&
+ echo five >file &&
+ git commit -a -m five &&
+ git checkout main &&
+ echo six >file &&
+ git commit -a -m six &&
+
+ # update tag
+ git tag -d two && git tag two
+'
+
+test_expect_success 'by default all branches will be kept updated' '
+ (
+ cd dir_all &&
+ git fetch &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # follow both main and side
+ git for-each-ref refs/heads >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'by default no tags will be kept updated' '
+ (
+ cd dir_all &&
+ git fetch &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ git for-each-ref refs/tags >expect &&
+ ! test_cmp expect actual &&
+ test_line_count = 2 actual
+'
+
+test_expect_success 'clone with --no-tags' '
+ (
+ cd dir_all_no_tags &&
+ grep tagOpt .git/config &&
+ git fetch &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ test_must_be_empty actual
+'
+
+test_expect_success '--single-branch while HEAD pointing at main' '
+ (
+ cd dir_main &&
+ git fetch --force &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # only follow main
+ git for-each-ref refs/heads/main >expect &&
+ # get & check latest tags
+ test_cmp expect actual &&
+ (
+ cd dir_main &&
+ git fetch --tags --force &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ git for-each-ref refs/tags >expect &&
+ test_cmp expect actual &&
+ test_line_count = 2 actual
+'
+
+test_expect_success '--single-branch while HEAD pointing at main and --no-tags' '
+ (
+ cd dir_main_no_tags &&
+ git fetch &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # only follow main
+ git for-each-ref refs/heads/main >expect &&
+ test_cmp expect actual &&
+ # get tags (noop)
+ (
+ cd dir_main_no_tags &&
+ git fetch &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ test_must_be_empty actual &&
+ test_line_count = 0 actual &&
+ # get tags with --tags overrides tagOpt
+ (
+ cd dir_main_no_tags &&
+ git fetch --tags &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ git for-each-ref refs/tags >expect &&
+ test_cmp expect actual &&
+ test_line_count = 2 actual
+'
+
+test_expect_success '--single-branch while HEAD pointing at side' '
+ (
+ cd dir_side &&
+ git fetch &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # only follow side
+ git for-each-ref refs/heads/side >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch side' '
+ (
+ cd dir_side2 &&
+ git fetch &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # only follow side
+ git for-each-ref refs/heads/side >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
+ (
+ cd dir_tag &&
+ git fetch &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ git for-each-ref refs/tags >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch with tag fetches updated tag despite --no-tags' '
+ (
+ cd dir_tag_no_tags &&
+ git fetch &&
+ git for-each-ref refs/tags >../actual
+ ) &&
+ git for-each-ref refs/tags/two >expect &&
+ test_cmp expect actual &&
+ test_line_count = 1 actual
+'
+
+test_expect_success '--single-branch with --mirror' '
+ (
+ cd dir_mirror &&
+ git fetch &&
+ git for-each-ref refs > ../actual
+ ) &&
+ git for-each-ref refs >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch and --mirror' '
+ (
+ cd dir_mirror_side &&
+ git fetch &&
+ git for-each-ref refs > ../actual
+ ) &&
+ git for-each-ref refs >expect &&
+ test_cmp expect actual
+'
+
+test_expect_success '--single-branch with detached' '
+ (
+ cd dir_detached &&
+ git fetch &&
+ git for-each-ref refs/remotes/origin >refs &&
+ sed -e "/HEAD$/d" \
+ -e "s|/remotes/origin/|/heads/|" refs >../actual
+ ) &&
+ # nothing
+ test_must_be_empty actual
+'
+
+test_done