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