t / t1400-update-ref.shon commit update-ref --no-deref -d: handle the case when the pointed ref is packed (045a476)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Shawn Pearce
   4#
   5
   6test_description='Test git update-ref and basic ref logging'
   7. ./test-lib.sh
   8
   9Z=0000000000000000000000000000000000000000
  10
  11test_expect_success setup '
  12
  13        for name in A B C D E F
  14        do
  15                test_tick &&
  16                T=$(git write-tree) &&
  17                sha1=$(echo $name | git commit-tree $T) &&
  18                eval $name=$sha1
  19        done
  20
  21'
  22
  23m=refs/heads/master
  24n_dir=refs/heads/gu
  25n=$n_dir/fixes
  26
  27test_expect_success \
  28        "create $m" \
  29        "git update-ref $m $A &&
  30         test $A"' = $(cat .git/'"$m"')'
  31test_expect_success \
  32        "create $m" \
  33        "git update-ref $m $B $A &&
  34         test $B"' = $(cat .git/'"$m"')'
  35test_expect_success "fail to delete $m with stale ref" '
  36        test_must_fail git update-ref -d $m $A &&
  37        test $B = "$(cat .git/$m)"
  38'
  39test_expect_success "delete $m" '
  40        git update-ref -d $m $B &&
  41        ! test -f .git/$m
  42'
  43rm -f .git/$m
  44
  45test_expect_success "delete $m without oldvalue verification" "
  46        git update-ref $m $A &&
  47        test $A = \$(cat .git/$m) &&
  48        git update-ref -d $m &&
  49        ! test -f .git/$m
  50"
  51rm -f .git/$m
  52
  53test_expect_success \
  54        "fail to create $n" \
  55        "touch .git/$n_dir
  56         git update-ref $n $A >out 2>err"'
  57         test $? != 0'
  58rm -f .git/$n_dir out err
  59
  60test_expect_success \
  61        "create $m (by HEAD)" \
  62        "git update-ref HEAD $A &&
  63         test $A"' = $(cat .git/'"$m"')'
  64test_expect_success \
  65        "create $m (by HEAD)" \
  66        "git update-ref HEAD $B $A &&
  67         test $B"' = $(cat .git/'"$m"')'
  68test_expect_success "fail to delete $m (by HEAD) with stale ref" '
  69        test_must_fail git update-ref -d HEAD $A &&
  70        test $B = $(cat .git/$m)
  71'
  72test_expect_success "delete $m (by HEAD)" '
  73        git update-ref -d HEAD $B &&
  74        ! test -f .git/$m
  75'
  76rm -f .git/$m
  77
  78cp -f .git/HEAD .git/HEAD.orig
  79test_expect_success "delete symref without dereference" '
  80        git update-ref --no-deref -d HEAD &&
  81        ! test -f .git/HEAD
  82'
  83cp -f .git/HEAD.orig .git/HEAD
  84
  85test_expect_success "delete symref without dereference when the referred ref is packed" '
  86        echo foo >foo.c &&
  87        git add foo.c &&
  88        git commit -m foo &&
  89        git pack-refs --all &&
  90        git update-ref --no-deref -d HEAD &&
  91        ! test -f .git/HEAD
  92'
  93cp -f .git/HEAD.orig .git/HEAD
  94git update-ref -d $m
  95
  96test_expect_success '(not) create HEAD with old sha1' "
  97        test_must_fail git update-ref HEAD $A $B
  98"
  99test_expect_success "(not) prior created .git/$m" "
 100        ! test -f .git/$m
 101"
 102rm -f .git/$m
 103
 104test_expect_success \
 105        "create HEAD" \
 106        "git update-ref HEAD $A"
 107test_expect_success '(not) change HEAD with wrong SHA1' "
 108        test_must_fail git update-ref HEAD $B $Z
 109"
 110test_expect_success "(not) changed .git/$m" "
 111        ! test $B"' = $(cat .git/'"$m"')
 112'
 113rm -f .git/$m
 114
 115: a repository with working tree always has reflog these days...
 116: >.git/logs/refs/heads/master
 117test_expect_success \
 118        "create $m (logged by touch)" \
 119        'GIT_COMMITTER_DATE="2005-05-26 23:30" \
 120         git update-ref HEAD '"$A"' -m "Initial Creation" &&
 121         test '"$A"' = $(cat .git/'"$m"')'
 122test_expect_success \
 123        "update $m (logged by touch)" \
 124        'GIT_COMMITTER_DATE="2005-05-26 23:31" \
 125         git update-ref HEAD'" $B $A "'-m "Switch" &&
 126         test '"$B"' = $(cat .git/'"$m"')'
 127test_expect_success \
 128        "set $m (logged by touch)" \
 129        'GIT_COMMITTER_DATE="2005-05-26 23:41" \
 130         git update-ref HEAD'" $A &&
 131         test $A"' = $(cat .git/'"$m"')'
 132
 133cat >expect <<EOF
 134$Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000       Initial Creation
 135$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150260 +0000       Switch
 136$B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000
 137EOF
 138test_expect_success \
 139        "verifying $m's log" \
 140        "diff expect .git/logs/$m"
 141rm -rf .git/$m .git/logs expect
 142
 143test_expect_success \
 144        'enable core.logAllRefUpdates' \
 145        'git config core.logAllRefUpdates true &&
 146         test true = $(git config --bool --get core.logAllRefUpdates)'
 147
 148test_expect_success \
 149        "create $m (logged by config)" \
 150        'GIT_COMMITTER_DATE="2005-05-26 23:32" \
 151         git update-ref HEAD'" $A "'-m "Initial Creation" &&
 152         test '"$A"' = $(cat .git/'"$m"')'
 153test_expect_success \
 154        "update $m (logged by config)" \
 155        'GIT_COMMITTER_DATE="2005-05-26 23:33" \
 156         git update-ref HEAD'" $B $A "'-m "Switch" &&
 157         test '"$B"' = $(cat .git/'"$m"')'
 158test_expect_success \
 159        "set $m (logged by config)" \
 160        'GIT_COMMITTER_DATE="2005-05-26 23:43" \
 161         git update-ref HEAD '"$A &&
 162         test $A"' = $(cat .git/'"$m"')'
 163
 164cat >expect <<EOF
 165$Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 +0000       Initial Creation
 166$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 +0000       Switch
 167$B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 +0000
 168EOF
 169test_expect_success \
 170        "verifying $m's log" \
 171        'diff expect .git/logs/$m'
 172rm -f .git/$m .git/logs/$m expect
 173
 174git update-ref $m $D
 175cat >.git/logs/$m <<EOF
 1760000000000000000000000000000000000000000 $C $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 -0500
 177$C $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150350 -0500
 178$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 -0500
 179$F $Z $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500
 180$Z $E $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 -0500
 181EOF
 182
 183ed="Thu, 26 May 2005 18:32:00 -0500"
 184gd="Thu, 26 May 2005 18:33:00 -0500"
 185ld="Thu, 26 May 2005 18:43:00 -0500"
 186test_expect_success \
 187        'Query "master@{May 25 2005}" (before history)' \
 188        'rm -f o e
 189         git rev-parse --verify "master@{May 25 2005}" >o 2>e &&
 190         test '"$C"' = $(cat o) &&
 191         test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 192test_expect_success \
 193        "Query master@{2005-05-25} (before history)" \
 194        'rm -f o e
 195         git rev-parse --verify master@{2005-05-25} >o 2>e &&
 196         test '"$C"' = $(cat o) &&
 197         echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 198test_expect_success \
 199        'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \
 200        'rm -f o e
 201         git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
 202         test '"$C"' = $(cat o) &&
 203         test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"'
 204test_expect_success \
 205        'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \
 206        'rm -f o e
 207         git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
 208         test '"$C"' = $(cat o) &&
 209         test "" = "$(cat e)"'
 210test_expect_success \
 211        'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' \
 212        'rm -f o e
 213         git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&
 214         test '"$A"' = $(cat o) &&
 215         test "" = "$(cat e)"'
 216test_expect_success \
 217        'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' \
 218        'rm -f o e
 219         git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
 220         test '"$B"' = $(cat o) &&
 221         test "warning: Log .git/logs/'"$m has gap after $gd"'." = "$(cat e)"'
 222test_expect_success \
 223        'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
 224        'rm -f o e
 225         git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
 226         test '"$Z"' = $(cat o) &&
 227         test "" = "$(cat e)"'
 228test_expect_success \
 229        'Query "master@{2005-05-26 23:43:00}" (exact end of history)' \
 230        'rm -f o e
 231         git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
 232         test '"$E"' = $(cat o) &&
 233         test "" = "$(cat e)"'
 234test_expect_success \
 235        'Query "master@{2005-05-28}" (past end of history)' \
 236        'rm -f o e
 237         git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
 238         test '"$D"' = $(cat o) &&
 239         test "warning: Log .git/logs/'"$m unexpectedly ended on $ld"'." = "$(cat e)"'
 240
 241
 242rm -f .git/$m .git/logs/$m expect
 243
 244test_expect_success \
 245    'creating initial files' \
 246    'echo TEST >F &&
 247     git add F &&
 248         GIT_AUTHOR_DATE="2005-05-26 23:30" \
 249         GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&
 250         h_TEST=$(git rev-parse --verify HEAD)
 251         echo The other day this did not work. >M &&
 252         echo And then Bob told me how to fix it. >>M &&
 253         echo OTHER >F &&
 254         GIT_AUTHOR_DATE="2005-05-26 23:41" \
 255         GIT_COMMITTER_DATE="2005-05-26 23:41" git commit -F M -a &&
 256         h_OTHER=$(git rev-parse --verify HEAD) &&
 257         GIT_AUTHOR_DATE="2005-05-26 23:44" \
 258         GIT_COMMITTER_DATE="2005-05-26 23:44" git commit --amend &&
 259         h_FIXED=$(git rev-parse --verify HEAD) &&
 260         echo Merged initial commit and a later commit. >M &&
 261         echo $h_TEST >.git/MERGE_HEAD &&
 262         GIT_AUTHOR_DATE="2005-05-26 23:45" \
 263         GIT_COMMITTER_DATE="2005-05-26 23:45" git commit -F M &&
 264         h_MERGED=$(git rev-parse --verify HEAD) &&
 265         rm -f M'
 266
 267cat >expect <<EOF
 268$Z $h_TEST $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000  commit (initial): add
 269$h_TEST $h_OTHER $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000    commit: The other day this did not work.
 270$h_OTHER $h_FIXED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151040 +0000   commit (amend): The other day this did not work.
 271$h_FIXED $h_MERGED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151100 +0000  commit (merge): Merged initial commit and a later commit.
 272EOF
 273test_expect_success \
 274        'git commit logged updates' \
 275        "diff expect .git/logs/$m"
 276unset h_TEST h_OTHER h_FIXED h_MERGED
 277
 278test_expect_success \
 279        'git cat-file blob master:F (expect OTHER)' \
 280        'test OTHER = $(git cat-file blob master:F)'
 281test_expect_success \
 282        'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' \
 283        'test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F")'
 284test_expect_success \
 285        'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' \
 286        'test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F")'
 287
 288test_done