t / t1507-rev-parse-upstream.shon commit built-in rebase --autostash: leave the current branch alone if possible (176f5d9)
   1#!/bin/sh
   2
   3test_description='test <branch>@{upstream} syntax'
   4
   5. ./test-lib.sh
   6
   7
   8test_expect_success 'setup' '
   9
  10        test_commit 1 &&
  11        git checkout -b side &&
  12        test_commit 2 &&
  13        git checkout master &&
  14        git clone . clone &&
  15        test_commit 3 &&
  16        (cd clone &&
  17         test_commit 4 &&
  18         git branch --track my-side origin/side &&
  19         git branch --track local-master master &&
  20         git branch --track fun@ny origin/side &&
  21         git branch --track @funny origin/side &&
  22         git branch --track funny@ origin/side &&
  23         git remote add -t master master-only .. &&
  24         git fetch master-only &&
  25         git branch bad-upstream &&
  26         git config branch.bad-upstream.remote master-only &&
  27         git config branch.bad-upstream.merge refs/heads/side
  28        )
  29'
  30
  31sq="'"
  32
  33full_name () {
  34        (cd clone &&
  35         git rev-parse --symbolic-full-name "$@")
  36}
  37
  38commit_subject () {
  39        (cd clone &&
  40         git show -s --pretty=format:%s "$@")
  41}
  42
  43error_message () {
  44        (cd clone &&
  45         test_must_fail git rev-parse --verify "$@" 2>../error)
  46}
  47
  48test_expect_success '@{upstream} resolves to correct full name' '
  49        test refs/remotes/origin/master = "$(full_name @{upstream})" &&
  50        test refs/remotes/origin/master = "$(full_name @{UPSTREAM})" &&
  51        test refs/remotes/origin/master = "$(full_name @{UpSTReam})"
  52'
  53
  54test_expect_success '@{u} resolves to correct full name' '
  55        test refs/remotes/origin/master = "$(full_name @{u})" &&
  56        test refs/remotes/origin/master = "$(full_name @{U})"
  57'
  58
  59test_expect_success 'my-side@{upstream} resolves to correct full name' '
  60        test refs/remotes/origin/side = "$(full_name my-side@{u})"
  61'
  62
  63test_expect_success 'upstream of branch with @ in middle' '
  64        full_name fun@ny@{u} >actual &&
  65        echo refs/remotes/origin/side >expect &&
  66        test_cmp expect actual &&
  67        full_name fun@ny@{U} >actual &&
  68        test_cmp expect actual
  69'
  70
  71test_expect_success 'upstream of branch with @ at start' '
  72        full_name @funny@{u} >actual &&
  73        echo refs/remotes/origin/side >expect &&
  74        test_cmp expect actual
  75'
  76
  77test_expect_success 'upstream of branch with @ at end' '
  78        full_name funny@@{u} >actual &&
  79        echo refs/remotes/origin/side >expect &&
  80        test_cmp expect actual
  81'
  82
  83test_expect_success 'refs/heads/my-side@{upstream} does not resolve to my-side{upstream}' '
  84        test_must_fail full_name refs/heads/my-side@{upstream}
  85'
  86
  87test_expect_success 'my-side@{u} resolves to correct commit' '
  88        git checkout side &&
  89        test_commit 5 &&
  90        (cd clone && git fetch) &&
  91        test 2 = "$(commit_subject my-side)" &&
  92        test 5 = "$(commit_subject my-side@{u})"
  93'
  94
  95test_expect_success 'not-tracking@{u} fails' '
  96        test_must_fail full_name non-tracking@{u} &&
  97        (cd clone && git checkout --no-track -b non-tracking) &&
  98        test_must_fail full_name non-tracking@{u}
  99'
 100
 101test_expect_success '<branch>@{u}@{1} resolves correctly' '
 102        test_commit 6 &&
 103        (cd clone && git fetch) &&
 104        test 5 = $(commit_subject my-side@{u}@{1}) &&
 105        test 5 = $(commit_subject my-side@{U}@{1})
 106'
 107
 108test_expect_success '@{u} without specifying branch fails on a detached HEAD' '
 109        git checkout HEAD^0 &&
 110        test_must_fail git rev-parse @{u} &&
 111        test_must_fail git rev-parse @{U}
 112'
 113
 114test_expect_success 'checkout -b new my-side@{u} forks from the same' '
 115(
 116        cd clone &&
 117        git checkout -b new my-side@{u} &&
 118        git rev-parse --symbolic-full-name my-side@{u} >expect &&
 119        git rev-parse --symbolic-full-name new@{u} >actual &&
 120        test_cmp expect actual
 121)
 122'
 123
 124test_expect_success 'merge my-side@{u} records the correct name' '
 125(
 126        cd clone &&
 127        git checkout master &&
 128        test_might_fail git branch -D new &&
 129        git branch -t new my-side@{u} &&
 130        git merge -s ours new@{u} &&
 131        git show -s --pretty=tformat:%s >actual &&
 132        echo "Merge remote-tracking branch ${sq}origin/side${sq}" >expect &&
 133        test_cmp expect actual
 134)
 135'
 136
 137test_expect_success 'branch -d other@{u}' '
 138        git checkout -t -b other master &&
 139        git branch -d @{u} &&
 140        git for-each-ref refs/heads/master >actual &&
 141        >expect &&
 142        test_cmp expect actual
 143'
 144
 145test_expect_success 'checkout other@{u}' '
 146        git branch -f master HEAD &&
 147        git checkout -t -b another master &&
 148        git checkout @{u} &&
 149        git symbolic-ref HEAD >actual &&
 150        echo refs/heads/master >expect &&
 151        test_cmp expect actual
 152'
 153
 154test_expect_success 'branch@{u} works when tracking a local branch' '
 155        test refs/heads/master = "$(full_name local-master@{u})"
 156'
 157
 158test_expect_success 'branch@{u} error message when no upstream' '
 159        cat >expect <<-EOF &&
 160        fatal: no upstream configured for branch ${sq}non-tracking${sq}
 161        EOF
 162        error_message non-tracking@{u} &&
 163        test_i18ncmp expect error
 164'
 165
 166test_expect_success '@{u} error message when no upstream' '
 167        cat >expect <<-EOF &&
 168        fatal: no upstream configured for branch ${sq}master${sq}
 169        EOF
 170        test_must_fail git rev-parse --verify @{u} 2>actual &&
 171        test_i18ncmp expect actual
 172'
 173
 174test_expect_success 'branch@{u} error message with misspelt branch' '
 175        cat >expect <<-EOF &&
 176        fatal: no such branch: ${sq}no-such-branch${sq}
 177        EOF
 178        error_message no-such-branch@{u} &&
 179        test_i18ncmp expect error
 180'
 181
 182test_expect_success '@{u} error message when not on a branch' '
 183        cat >expect <<-EOF &&
 184        fatal: HEAD does not point to a branch
 185        EOF
 186        git checkout HEAD^0 &&
 187        test_must_fail git rev-parse --verify @{u} 2>actual &&
 188        test_i18ncmp expect actual
 189'
 190
 191test_expect_success 'branch@{u} error message if upstream branch not fetched' '
 192        cat >expect <<-EOF &&
 193        fatal: upstream branch ${sq}refs/heads/side${sq} not stored as a remote-tracking branch
 194        EOF
 195        error_message bad-upstream@{u} &&
 196        test_i18ncmp expect error
 197'
 198
 199test_expect_success 'pull works when tracking a local branch' '
 200(
 201        cd clone &&
 202        git checkout local-master &&
 203        git pull
 204)
 205'
 206
 207# makes sense if the previous one succeeded
 208test_expect_success '@{u} works when tracking a local branch' '
 209        test refs/heads/master = "$(full_name @{u})"
 210'
 211
 212commit=$(git rev-parse HEAD)
 213cat >expect <<EOF
 214commit $commit
 215Reflog: master@{0} (C O Mitter <committer@example.com>)
 216Reflog message: branch: Created from HEAD
 217Author: A U Thor <author@example.com>
 218Date:   Thu Apr 7 15:15:13 2005 -0700
 219
 220    3
 221EOF
 222test_expect_success 'log -g other@{u}' '
 223        git log -1 -g other@{u} >actual &&
 224        test_cmp expect actual
 225'
 226
 227cat >expect <<EOF
 228commit $commit
 229Reflog: master@{Thu Apr 7 15:17:13 2005 -0700} (C O Mitter <committer@example.com>)
 230Reflog message: branch: Created from HEAD
 231Author: A U Thor <author@example.com>
 232Date:   Thu Apr 7 15:15:13 2005 -0700
 233
 234    3
 235EOF
 236
 237test_expect_success 'log -g other@{u}@{now}' '
 238        git log -1 -g other@{u}@{now} >actual &&
 239        test_cmp expect actual
 240'
 241
 242test_expect_success '@{reflog}-parsing does not look beyond colon' '
 243        echo content >@{yesterday} &&
 244        git add @{yesterday} &&
 245        git commit -m "funny reflog file" &&
 246        git hash-object @{yesterday} >expect &&
 247        git rev-parse HEAD:@{yesterday} >actual
 248'
 249
 250test_expect_success '@{upstream}-parsing does not look beyond colon' '
 251        echo content >@{upstream} &&
 252        git add @{upstream} &&
 253        git commit -m "funny upstream file" &&
 254        git hash-object @{upstream} >expect &&
 255        git rev-parse HEAD:@{upstream} >actual
 256'
 257
 258test_done