t / t1400-update-ref.shon commit cvsserver: Make req_Root more critical of its input data (4890888)
   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
  10A=1111111111111111111111111111111111111111
  11B=2222222222222222222222222222222222222222
  12C=3333333333333333333333333333333333333333
  13D=4444444444444444444444444444444444444444
  14E=5555555555555555555555555555555555555555
  15F=6666666666666666666666666666666666666666
  16m=refs/heads/master
  17n_dir=refs/heads/gu
  18n=$n_dir/fixes
  19
  20test_expect_success \
  21        "create $m" \
  22        "git-update-ref $m $A &&
  23         test $A"' = $(cat .git/'"$m"')'
  24test_expect_success \
  25        "create $m" \
  26        "git-update-ref $m $B $A &&
  27         test $B"' = $(cat .git/'"$m"')'
  28rm -f .git/$m
  29
  30test_expect_success \
  31        "fail to create $n" \
  32        "touch .git/$n_dir
  33         git-update-ref $n $A >out 2>err"'
  34         test $? != 0'
  35rm -f .git/$n_dir out err
  36
  37test_expect_success \
  38        "create $m (by HEAD)" \
  39        "git-update-ref HEAD $A &&
  40         test $A"' = $(cat .git/'"$m"')'
  41test_expect_success \
  42        "create $m (by HEAD)" \
  43        "git-update-ref HEAD $B $A &&
  44         test $B"' = $(cat .git/'"$m"')'
  45rm -f .git/$m
  46
  47test_expect_failure \
  48        '(not) create HEAD with old sha1' \
  49        "git-update-ref HEAD $A $B"
  50test_expect_failure \
  51        "(not) prior created .git/$m" \
  52        "test -f .git/$m"
  53rm -f .git/$m
  54
  55test_expect_success \
  56        "create HEAD" \
  57        "git-update-ref HEAD $A"
  58test_expect_failure \
  59        '(not) change HEAD with wrong SHA1' \
  60        "git-update-ref HEAD $B $Z"
  61test_expect_failure \
  62        "(not) changed .git/$m" \
  63        "test $B"' = $(cat .git/'"$m"')'
  64rm -f .git/$m
  65
  66: a repository with working tree always has reflog these days...
  67: >.git/logs/refs/heads/master
  68test_expect_success \
  69        "create $m (logged by touch)" \
  70        'GIT_COMMITTER_DATE="2005-05-26 23:30" \
  71         git-update-ref HEAD '"$A"' -m "Initial Creation" &&
  72         test '"$A"' = $(cat .git/'"$m"')'
  73test_expect_success \
  74        "update $m (logged by touch)" \
  75        'GIT_COMMITTER_DATE="2005-05-26 23:31" \
  76         git-update-ref HEAD'" $B $A "'-m "Switch" &&
  77         test '"$B"' = $(cat .git/'"$m"')'
  78test_expect_success \
  79        "set $m (logged by touch)" \
  80        'GIT_COMMITTER_DATE="2005-05-26 23:41" \
  81         git-update-ref HEAD'" $A &&
  82         test $A"' = $(cat .git/'"$m"')'
  83
  84cat >expect <<EOF
  85$Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000       Initial Creation
  86$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150260 +0000       Switch
  87$B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000
  88EOF
  89test_expect_success \
  90        "verifying $m's log" \
  91        "diff expect .git/logs/$m"
  92rm -rf .git/$m .git/logs expect
  93
  94test_expect_success \
  95        'enable core.logAllRefUpdates' \
  96        'git-config core.logAllRefUpdates true &&
  97         test true = $(git-config --bool --get core.logAllRefUpdates)'
  98
  99test_expect_success \
 100        "create $m (logged by config)" \
 101        'GIT_COMMITTER_DATE="2005-05-26 23:32" \
 102         git-update-ref HEAD'" $A "'-m "Initial Creation" &&
 103         test '"$A"' = $(cat .git/'"$m"')'
 104test_expect_success \
 105        "update $m (logged by config)" \
 106        'GIT_COMMITTER_DATE="2005-05-26 23:33" \
 107         git-update-ref HEAD'" $B $A "'-m "Switch" &&
 108         test '"$B"' = $(cat .git/'"$m"')'
 109test_expect_success \
 110        "set $m (logged by config)" \
 111        'GIT_COMMITTER_DATE="2005-05-26 23:43" \
 112         git-update-ref HEAD '"$A &&
 113         test $A"' = $(cat .git/'"$m"')'
 114
 115cat >expect <<EOF
 116$Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 +0000       Initial Creation
 117$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 +0000       Switch
 118$B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 +0000
 119EOF
 120test_expect_success \
 121        "verifying $m's log" \
 122        'diff expect .git/logs/$m'
 123rm -f .git/$m .git/logs/$m expect
 124
 125git-update-ref $m $D
 126cat >.git/logs/$m <<EOF
 127$C $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 -0500
 128$A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 -0500
 129$F $Z $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500
 130$Z $E $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 -0500
 131EOF
 132
 133ed="Thu, 26 May 2005 18:32:00 -0500"
 134gd="Thu, 26 May 2005 18:33:00 -0500"
 135ld="Thu, 26 May 2005 18:43:00 -0500"
 136test_expect_success \
 137        'Query "master@{May 25 2005}" (before history)' \
 138        'rm -f o e
 139         git-rev-parse --verify "master@{May 25 2005}" >o 2>e &&
 140         test '"$C"' = $(cat o) &&
 141         test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 142test_expect_success \
 143        "Query master@{2005-05-25} (before history)" \
 144        'rm -f o e
 145         git-rev-parse --verify master@{2005-05-25} >o 2>e &&
 146         test '"$C"' = $(cat o) &&
 147         echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
 148test_expect_success \
 149        'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \
 150        'rm -f o e
 151         git-rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
 152         test '"$C"' = $(cat o) &&
 153         test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"'
 154test_expect_success \
 155        'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \
 156        'rm -f o e
 157         git-rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
 158         test '"$A"' = $(cat o) &&
 159         test "" = "$(cat e)"'
 160test_expect_success \
 161        'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' \
 162        'rm -f o e
 163         git-rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
 164         test '"$B"' = $(cat o) &&
 165         test "warning: Log .git/logs/'"$m has gap after $gd"'." = "$(cat e)"'
 166test_expect_success \
 167        'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
 168        'rm -f o e
 169         git-rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
 170         test '"$Z"' = $(cat o) &&
 171         test "" = "$(cat e)"'
 172test_expect_success \
 173        'Query "master@{2005-05-26 23:43:00}" (exact end of history)' \
 174        'rm -f o e
 175         git-rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
 176         test '"$E"' = $(cat o) &&
 177         test "" = "$(cat e)"'
 178test_expect_success \
 179        'Query "master@{2005-05-28}" (past end of history)' \
 180        'rm -f o e
 181         git-rev-parse --verify "master@{2005-05-28}" >o 2>e &&
 182         test '"$D"' = $(cat o) &&
 183         test "warning: Log .git/logs/'"$m unexpectedly ended on $ld"'." = "$(cat e)"'
 184
 185
 186rm -f .git/$m .git/logs/$m expect
 187
 188test_expect_success \
 189    'creating initial files' \
 190    'echo TEST >F &&
 191     git-add F &&
 192         GIT_AUTHOR_DATE="2005-05-26 23:30" \
 193         GIT_COMMITTER_DATE="2005-05-26 23:30" git-commit -m add -a &&
 194         h_TEST=$(git-rev-parse --verify HEAD)
 195         echo The other day this did not work. >M &&
 196         echo And then Bob told me how to fix it. >>M &&
 197         echo OTHER >F &&
 198         GIT_AUTHOR_DATE="2005-05-26 23:41" \
 199         GIT_COMMITTER_DATE="2005-05-26 23:41" git-commit -F M -a &&
 200         h_OTHER=$(git-rev-parse --verify HEAD) &&
 201         echo FIXED >F &&
 202         GIT_AUTHOR_DATE="2005-05-26 23:44" \
 203         GIT_COMMITTER_DATE="2005-05-26 23:44" git-commit --amend &&
 204         h_FIXED=$(git-rev-parse --verify HEAD) &&
 205         echo TEST+FIXED >F &&
 206         echo Merged initial commit and a later commit. >M &&
 207         echo $h_TEST >.git/MERGE_HEAD &&
 208         GIT_AUTHOR_DATE="2005-05-26 23:45" \
 209         GIT_COMMITTER_DATE="2005-05-26 23:45" git-commit -F M &&
 210         h_MERGED=$(git-rev-parse --verify HEAD)
 211         rm -f M'
 212
 213cat >expect <<EOF
 214$Z $h_TEST $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000  commit (initial): add
 215$h_TEST $h_OTHER $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000    commit: The other day this did not work.
 216$h_OTHER $h_FIXED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151040 +0000   commit (amend): The other day this did not work.
 217$h_FIXED $h_MERGED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151100 +0000  commit (merge): Merged initial commit and a later commit.
 218EOF
 219test_expect_success \
 220        'git-commit logged updates' \
 221        "diff expect .git/logs/$m"
 222unset h_TEST h_OTHER h_FIXED h_MERGED
 223
 224test_expect_success \
 225        'git-cat-file blob master:F (expect OTHER)' \
 226        'test OTHER = $(git-cat-file blob master:F)'
 227test_expect_success \
 228        'git-cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' \
 229        'test TEST = $(git-cat-file blob "master@{2005-05-26 23:30}:F")'
 230test_expect_success \
 231        'git-cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' \
 232        'test OTHER = $(git-cat-file blob "master@{2005-05-26 23:42}:F")'
 233
 234test_done