t / t5612-clone-refspec.shon commit fsck: avoid looking at NULL blob->object (47cc913)
   1#!/bin/sh
   2
   3test_description='test refspec written by clone-command'
   4. ./test-lib.sh
   5
   6test_expect_success 'setup' '
   7        # Make two branches, "master" and "side"
   8        echo one >file &&
   9        git add file &&
  10        git commit -m one &&
  11        echo two >file &&
  12        git commit -a -m two &&
  13        git tag two &&
  14        echo three >file &&
  15        git commit -a -m three &&
  16        git checkout -b side &&
  17        echo four >file &&
  18        git commit -a -m four &&
  19        git checkout master &&
  20        git tag five &&
  21
  22        # default clone
  23        git clone . dir_all &&
  24
  25        # default clone --no-tags
  26        git clone --no-tags . dir_all_no_tags &&
  27
  28        # default --single that follows HEAD=master
  29        git clone --single-branch . dir_master &&
  30
  31        # default --single that follows HEAD=master with no tags
  32        git clone --single-branch --no-tags . dir_master_no_tags &&
  33
  34        # default --single that follows HEAD=side
  35        git checkout side &&
  36        git clone --single-branch . dir_side &&
  37
  38        # explicit --single that follows side
  39        git checkout master &&
  40        git clone --single-branch --branch side . dir_side2 &&
  41
  42        # default --single with --mirror
  43        git clone --single-branch --mirror . dir_mirror &&
  44
  45        # default --single with --branch and --mirror
  46        git clone --single-branch --mirror --branch side . dir_mirror_side &&
  47
  48        # --single that does not know what branch to follow
  49        git checkout two^ &&
  50        git clone --single-branch . dir_detached &&
  51
  52        # explicit --single with tag
  53        git clone --single-branch --branch two . dir_tag &&
  54
  55        # explicit --single with tag and --no-tags
  56        git clone --single-branch --no-tags --branch two . dir_tag_no_tags &&
  57
  58        # advance both "master" and "side" branches
  59        git checkout side &&
  60        echo five >file &&
  61        git commit -a -m five &&
  62        git checkout master &&
  63        echo six >file &&
  64        git commit -a -m six &&
  65
  66        # update tag
  67        git tag -d two && git tag two
  68'
  69
  70test_expect_success 'by default all branches will be kept updated' '
  71        (
  72                cd dir_all &&
  73                git fetch &&
  74                git for-each-ref refs/remotes/origin |
  75                sed -e "/HEAD$/d" \
  76                    -e "s|/remotes/origin/|/heads/|" >../actual
  77        ) &&
  78        # follow both master and side
  79        git for-each-ref refs/heads >expect &&
  80        test_cmp expect actual
  81'
  82
  83test_expect_success 'by default no tags will be kept updated' '
  84        (
  85                cd dir_all &&
  86                git fetch &&
  87                git for-each-ref refs/tags >../actual
  88        ) &&
  89        git for-each-ref refs/tags >expect &&
  90        test_must_fail test_cmp expect actual &&
  91        test_line_count = 2 actual
  92'
  93
  94test_expect_success 'clone with --no-tags' '
  95        (
  96                cd dir_all_no_tags &&
  97                git fetch &&
  98                git for-each-ref refs/tags >../actual
  99        ) &&
 100        >expect &&
 101        test_cmp expect actual
 102'
 103
 104test_expect_success '--single-branch while HEAD pointing at master' '
 105        (
 106                cd dir_master &&
 107                git fetch &&
 108                git for-each-ref refs/remotes/origin |
 109                sed -e "/HEAD$/d" \
 110                    -e "s|/remotes/origin/|/heads/|" >../actual
 111        ) &&
 112        # only follow master
 113        git for-each-ref refs/heads/master >expect &&
 114        # get & check latest tags
 115        test_cmp expect actual &&
 116        (
 117                cd dir_master &&
 118                git fetch --tags &&
 119                git for-each-ref refs/tags >../actual
 120        ) &&
 121        git for-each-ref refs/tags >expect &&
 122        test_cmp expect actual &&
 123        test_line_count = 2 actual
 124'
 125
 126test_expect_success '--single-branch while HEAD pointing at master and --no-tags' '
 127        (
 128                cd dir_master_no_tags &&
 129                git fetch &&
 130                git for-each-ref refs/remotes/origin |
 131                sed -e "/HEAD$/d" \
 132                    -e "s|/remotes/origin/|/heads/|" >../actual
 133        ) &&
 134        # only follow master
 135        git for-each-ref refs/heads/master >expect &&
 136        test_cmp expect actual &&
 137        # get tags (noop)
 138        (
 139                cd dir_master_no_tags &&
 140                git fetch &&
 141                git for-each-ref refs/tags >../actual
 142        ) &&
 143        >expect &&
 144        test_cmp expect actual &&
 145        test_line_count = 0 actual &&
 146        # get tags with --tags overrides tagOpt
 147        (
 148                cd dir_master_no_tags &&
 149                git fetch --tags &&
 150                git for-each-ref refs/tags >../actual
 151        ) &&
 152        git for-each-ref refs/tags >expect &&
 153        test_cmp expect actual &&
 154        test_line_count = 2 actual
 155'
 156
 157test_expect_success '--single-branch while HEAD pointing at side' '
 158        (
 159                cd dir_side &&
 160                git fetch &&
 161                git for-each-ref refs/remotes/origin |
 162                sed -e "/HEAD$/d" \
 163                    -e "s|/remotes/origin/|/heads/|" >../actual
 164        ) &&
 165        # only follow side
 166        git for-each-ref refs/heads/side >expect &&
 167        test_cmp expect actual
 168'
 169
 170test_expect_success '--single-branch with explicit --branch side' '
 171        (
 172                cd dir_side2 &&
 173                git fetch &&
 174                git for-each-ref refs/remotes/origin |
 175                sed -e "/HEAD$/d" \
 176                    -e "s|/remotes/origin/|/heads/|" >../actual
 177        ) &&
 178        # only follow side
 179        git for-each-ref refs/heads/side >expect &&
 180        test_cmp expect actual
 181'
 182
 183test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
 184        (
 185                cd dir_tag &&
 186                git fetch &&
 187                git for-each-ref refs/tags >../actual
 188        ) &&
 189        git for-each-ref refs/tags >expect &&
 190        test_cmp expect actual
 191'
 192
 193test_expect_success '--single-branch with explicit --branch with tag fetches updated tag despite --no-tags' '
 194        (
 195                cd dir_tag_no_tags &&
 196                git fetch &&
 197                git for-each-ref refs/tags >../actual
 198        ) &&
 199        git for-each-ref refs/tags/two >expect &&
 200        test_cmp expect actual &&
 201        test_line_count = 1 actual
 202'
 203
 204test_expect_success '--single-branch with --mirror' '
 205        (
 206                cd dir_mirror &&
 207                git fetch &&
 208                git for-each-ref refs > ../actual
 209        ) &&
 210        git for-each-ref refs >expect &&
 211        test_cmp expect actual
 212'
 213
 214test_expect_success '--single-branch with explicit --branch and --mirror' '
 215        (
 216                cd dir_mirror_side &&
 217                git fetch &&
 218                git for-each-ref refs > ../actual
 219        ) &&
 220        git for-each-ref refs >expect &&
 221        test_cmp expect actual
 222'
 223
 224test_expect_success '--single-branch with detached' '
 225        (
 226                cd dir_detached &&
 227                git fetch &&
 228                git for-each-ref refs/remotes/origin |
 229                sed -e "/HEAD$/d" \
 230                    -e "s|/remotes/origin/|/heads/|" >../actual
 231        ) &&
 232        # nothing
 233        >expect &&
 234        test_cmp expect actual
 235'
 236
 237test_done