t / t6040-tracking-info.shon commit t4000: make hash size independent (8cc5ff8)
   1#!/bin/sh
   2
   3test_description='remote tracking stats'
   4
   5. ./test-lib.sh
   6
   7advance () {
   8        echo "$1" >"$1" &&
   9        git add "$1" &&
  10        test_tick &&
  11        git commit -m "$1"
  12}
  13
  14test_expect_success setup '
  15        advance a &&
  16        advance b &&
  17        advance c &&
  18        git clone . test &&
  19        (
  20                cd test &&
  21                git checkout -b b1 origin &&
  22                git reset --hard HEAD^ &&
  23                advance d &&
  24                git checkout -b b2 origin &&
  25                git reset --hard b1 &&
  26                git checkout -b b3 origin &&
  27                git reset --hard HEAD^ &&
  28                git checkout -b b4 origin &&
  29                advance e &&
  30                advance f &&
  31                git checkout -b brokenbase origin &&
  32                git checkout -b b5 --track brokenbase &&
  33                advance g &&
  34                git branch -d brokenbase &&
  35                git checkout -b b6 origin
  36        ) &&
  37        git checkout -b follower --track master &&
  38        advance h
  39'
  40
  41t6040_script='s/^..\(b.\) *[0-9a-f]* \(.*\)$/\1 \2/p'
  42cat >expect <<\EOF
  43b1 [ahead 1, behind 1] d
  44b2 [ahead 1, behind 1] d
  45b3 [behind 1] b
  46b4 [ahead 2] f
  47b5 [gone] g
  48b6 c
  49EOF
  50
  51test_expect_success 'branch -v' '
  52        (
  53                cd test &&
  54                git branch -v
  55        ) |
  56        sed -n -e "$t6040_script" >actual &&
  57        test_i18ncmp expect actual
  58'
  59
  60cat >expect <<\EOF
  61b1 [origin/master: ahead 1, behind 1] d
  62b2 [origin/master: ahead 1, behind 1] d
  63b3 [origin/master: behind 1] b
  64b4 [origin/master: ahead 2] f
  65b5 [brokenbase: gone] g
  66b6 [origin/master] c
  67EOF
  68
  69test_expect_success 'branch -vv' '
  70        (
  71                cd test &&
  72                git branch -vv
  73        ) |
  74        sed -n -e "$t6040_script" >actual &&
  75        test_i18ncmp expect actual
  76'
  77
  78test_expect_success 'checkout (diverged from upstream)' '
  79        (
  80                cd test && git checkout b1
  81        ) >actual &&
  82        test_i18ngrep "have 1 and 1 different" actual
  83'
  84
  85test_expect_success 'checkout with local tracked branch' '
  86        git checkout master &&
  87        git checkout follower >actual &&
  88        test_i18ngrep "is ahead of" actual
  89'
  90
  91test_expect_success 'checkout (upstream is gone)' '
  92        (
  93                cd test &&
  94                git checkout b5
  95        ) >actual &&
  96        test_i18ngrep "is based on .*, but the upstream is gone." actual
  97'
  98
  99test_expect_success 'checkout (up-to-date with upstream)' '
 100        (
 101                cd test && git checkout b6
 102        ) >actual &&
 103        test_i18ngrep "Your branch is up to date with .origin/master" actual
 104'
 105
 106test_expect_success 'status (diverged from upstream)' '
 107        (
 108                cd test &&
 109                git checkout b1 >/dev/null &&
 110                # reports nothing to commit
 111                test_must_fail git commit --dry-run
 112        ) >actual &&
 113        test_i18ngrep "have 1 and 1 different" actual
 114'
 115
 116test_expect_success 'status (upstream is gone)' '
 117        (
 118                cd test &&
 119                git checkout b5 >/dev/null &&
 120                # reports nothing to commit
 121                test_must_fail git commit --dry-run
 122        ) >actual &&
 123        test_i18ngrep "is based on .*, but the upstream is gone." actual
 124'
 125
 126test_expect_success 'status (up-to-date with upstream)' '
 127        (
 128                cd test &&
 129                git checkout b6 >/dev/null &&
 130                # reports nothing to commit
 131                test_must_fail git commit --dry-run
 132        ) >actual &&
 133        test_i18ngrep "Your branch is up to date with .origin/master" actual
 134'
 135
 136cat >expect <<\EOF
 137## b1...origin/master [ahead 1, behind 1]
 138EOF
 139
 140test_expect_success 'status -s -b (diverged from upstream)' '
 141        (
 142                cd test &&
 143                git checkout b1 >/dev/null &&
 144                git status -s -b | head -1
 145        ) >actual &&
 146        test_i18ncmp expect actual
 147'
 148
 149cat >expect <<\EOF
 150## b1...origin/master [different]
 151EOF
 152
 153test_expect_success 'status -s -b --no-ahead-behind (diverged from upstream)' '
 154        (
 155                cd test &&
 156                git checkout b1 >/dev/null &&
 157                git status -s -b --no-ahead-behind | head -1
 158        ) >actual &&
 159        test_i18ncmp expect actual
 160'
 161
 162cat >expect <<\EOF
 163## b1...origin/master [different]
 164EOF
 165
 166test_expect_success 'status.aheadbehind=false status -s -b (diverged from upstream)' '
 167        (
 168                cd test &&
 169                git checkout b1 >/dev/null &&
 170                git -c status.aheadbehind=false status -s -b | head -1
 171        ) >actual &&
 172        test_i18ncmp expect actual
 173'
 174
 175cat >expect <<\EOF
 176On branch b1
 177Your branch and 'origin/master' have diverged,
 178and have 1 and 1 different commits each, respectively.
 179EOF
 180
 181test_expect_success 'status --long --branch' '
 182        (
 183                cd test &&
 184                git checkout b1 >/dev/null &&
 185                git status --long -b | head -3
 186        ) >actual &&
 187        test_i18ncmp expect actual
 188'
 189
 190test_expect_success 'status --long --branch' '
 191        (
 192                cd test &&
 193                git checkout b1 >/dev/null &&
 194                git -c status.aheadbehind=true status --long -b | head -3
 195        ) >actual &&
 196        test_i18ncmp expect actual
 197'
 198
 199cat >expect <<\EOF
 200On branch b1
 201Your branch and 'origin/master' refer to different commits.
 202EOF
 203
 204test_expect_success 'status --long --branch --no-ahead-behind' '
 205        (
 206                cd test &&
 207                git checkout b1 >/dev/null &&
 208                git status --long -b --no-ahead-behind | head -2
 209        ) >actual &&
 210        test_i18ncmp expect actual
 211'
 212
 213test_expect_success 'status.aheadbehind=false status --long --branch' '
 214        (
 215                cd test &&
 216                git checkout b1 >/dev/null &&
 217                git -c status.aheadbehind=false status --long -b | head -2
 218        ) >actual &&
 219        test_i18ncmp expect actual
 220'
 221
 222cat >expect <<\EOF
 223## b5...brokenbase [gone]
 224EOF
 225
 226test_expect_success 'status -s -b (upstream is gone)' '
 227        (
 228                cd test &&
 229                git checkout b5 >/dev/null &&
 230                git status -s -b | head -1
 231        ) >actual &&
 232        test_i18ncmp expect actual
 233'
 234
 235cat >expect <<\EOF
 236## b6...origin/master
 237EOF
 238
 239test_expect_success 'status -s -b (up-to-date with upstream)' '
 240        (
 241                cd test &&
 242                git checkout b6 >/dev/null &&
 243                git status -s -b | head -1
 244        ) >actual &&
 245        test_i18ncmp expect actual
 246'
 247
 248test_expect_success 'fail to track lightweight tags' '
 249        git checkout master &&
 250        git tag light &&
 251        test_must_fail git branch --track lighttrack light >actual &&
 252        test_i18ngrep ! "set up to track" actual &&
 253        test_must_fail git checkout lighttrack
 254'
 255
 256test_expect_success 'fail to track annotated tags' '
 257        git checkout master &&
 258        git tag -m heavy heavy &&
 259        test_must_fail git branch --track heavytrack heavy >actual &&
 260        test_i18ngrep ! "set up to track" actual &&
 261        test_must_fail git checkout heavytrack
 262'
 263
 264test_expect_success '--set-upstream-to does not change branch' '
 265        git branch from-master master &&
 266        git branch --set-upstream-to master from-master &&
 267        git branch from-master2 master &&
 268        test_must_fail git config branch.from-master2.merge > actual &&
 269        git rev-list from-master2 &&
 270        git update-ref refs/heads/from-master2 from-master2^ &&
 271        git rev-parse from-master2 >expect2 &&
 272        git branch --set-upstream-to master from-master2 &&
 273        git config branch.from-master.merge > actual &&
 274        git rev-parse from-master2 >actual2 &&
 275        grep -q "^refs/heads/master$" actual &&
 276        cmp expect2 actual2
 277'
 278
 279test_expect_success '--set-upstream-to @{-1}' '
 280        git checkout follower &&
 281        git checkout from-master2 &&
 282        git config branch.from-master2.merge > expect2 &&
 283        git branch --set-upstream-to @{-1} from-master &&
 284        git config branch.from-master.merge > actual &&
 285        git config branch.from-master2.merge > actual2 &&
 286        git branch --set-upstream-to follower from-master &&
 287        git config branch.from-master.merge > expect &&
 288        test_cmp expect2 actual2 &&
 289        test_cmp expect actual
 290'
 291
 292test_done