|
| 1 | +#!/bin/sh |
| 2 | +# |
| 3 | +# Copyright (c) 2023 Eric Biederman |
| 4 | +# |
| 5 | + |
| 6 | +test_description='Test how well compatObjectFormat works' |
| 7 | + |
| 8 | +TEST_PASSES_SANITIZE_LEAK=true |
| 9 | +. ./test-lib.sh |
| 10 | +. "$TEST_DIRECTORY"/lib-gpg.sh |
| 11 | + |
| 12 | +# All of the follow variables must be defined in the environment: |
| 13 | +# GIT_AUTHOR_NAME |
| 14 | +# GIT_AUTHOR_EMAIL |
| 15 | +# GIT_AUTHOR_DATE |
| 16 | +# GIT_COMMITTER_NAME |
| 17 | +# GIT_COMMITTER_EMAIL |
| 18 | +# GIT_COMMITTER_DATE |
| 19 | +# |
| 20 | +# The test relies on these variables being set so that the two |
| 21 | +# different commits in two different repositories encoded with two |
| 22 | +# different hash functions result in the same content in the commits. |
| 23 | +# This means that when the commit is translated between hash functions |
| 24 | +# the commit is identical to the commit in the other repository. |
| 25 | + |
| 26 | +compat_hash () { |
| 27 | + case "$1" in |
| 28 | + "sha1") |
| 29 | + echo "sha256" |
| 30 | + ;; |
| 31 | + "sha256") |
| 32 | + echo "sha1" |
| 33 | + ;; |
| 34 | + esac |
| 35 | +} |
| 36 | + |
| 37 | +hello_oid () { |
| 38 | + case "$1" in |
| 39 | + "sha1") |
| 40 | + echo "$hello_sha1_oid" |
| 41 | + ;; |
| 42 | + "sha256") |
| 43 | + echo "$hello_sha256_oid" |
| 44 | + ;; |
| 45 | + esac |
| 46 | +} |
| 47 | + |
| 48 | +tree_oid () { |
| 49 | + case "$1" in |
| 50 | + "sha1") |
| 51 | + echo "$tree_sha1_oid" |
| 52 | + ;; |
| 53 | + "sha256") |
| 54 | + echo "$tree_sha256_oid" |
| 55 | + ;; |
| 56 | + esac |
| 57 | +} |
| 58 | + |
| 59 | +commit_oid () { |
| 60 | + case "$1" in |
| 61 | + "sha1") |
| 62 | + echo "$commit_sha1_oid" |
| 63 | + ;; |
| 64 | + "sha256") |
| 65 | + echo "$commit_sha256_oid" |
| 66 | + ;; |
| 67 | + esac |
| 68 | +} |
| 69 | + |
| 70 | +commit2_oid () { |
| 71 | + case "$1" in |
| 72 | + "sha1") |
| 73 | + echo "$commit2_sha1_oid" |
| 74 | + ;; |
| 75 | + "sha256") |
| 76 | + echo "$commit2_sha256_oid" |
| 77 | + ;; |
| 78 | + esac |
| 79 | +} |
| 80 | + |
| 81 | +del_sigcommit () { |
| 82 | + local delete=$1 |
| 83 | + |
| 84 | + if test "$delete" = "sha256" ; then |
| 85 | + local pattern="gpgsig-sha256" |
| 86 | + else |
| 87 | + local pattern="gpgsig" |
| 88 | + fi |
| 89 | + test-tool delete-gpgsig "$pattern" |
| 90 | +} |
| 91 | + |
| 92 | + |
| 93 | +del_sigtag () { |
| 94 | + local storage=$1 |
| 95 | + local delete=$2 |
| 96 | + |
| 97 | + if test "$storage" = "$delete" ; then |
| 98 | + local pattern="trailer" |
| 99 | + elif test "$storage" = "sha256" ; then |
| 100 | + local pattern="gpgsig" |
| 101 | + else |
| 102 | + local pattern="gpgsig-sha256" |
| 103 | + fi |
| 104 | + test-tool delete-gpgsig "$pattern" |
| 105 | +} |
| 106 | + |
| 107 | +base=$(pwd) |
| 108 | +for hash in sha1 sha256 |
| 109 | +do |
| 110 | + cd "$base" |
| 111 | + mkdir -p repo-$hash |
| 112 | + cd repo-$hash |
| 113 | + |
| 114 | + test_expect_success "setup $hash repository" ' |
| 115 | + git init --object-format=$hash && |
| 116 | + git config core.repositoryformatversion 1 && |
| 117 | + git config extensions.objectformat $hash && |
| 118 | + git config extensions.compatobjectformat $(compat_hash $hash) && |
| 119 | + git config gpg.program $TEST_DIRECTORY/t1016/gpg && |
| 120 | + echo "Hellow World!" > hello && |
| 121 | + eval hello_${hash}_oid=$(git hash-object hello) && |
| 122 | + git update-index --add hello && |
| 123 | + git commit -m "Initial commit" && |
| 124 | + eval commit_${hash}_oid=$(git rev-parse HEAD) && |
| 125 | + eval tree_${hash}_oid=$(git rev-parse HEAD^{tree}) |
| 126 | + ' |
| 127 | + test_expect_success "create a $hash tagged blob" ' |
| 128 | + git tag --no-sign -m "This is a tag" hellotag $(hello_oid $hash) && |
| 129 | + eval hellotag_${hash}_oid=$(git rev-parse hellotag) |
| 130 | + ' |
| 131 | + test_expect_success "create a $hash tagged tree" ' |
| 132 | + git tag --no-sign -m "This is a tag" treetag $(tree_oid $hash) && |
| 133 | + eval treetag_${hash}_oid=$(git rev-parse treetag) |
| 134 | + ' |
| 135 | + test_expect_success "create a $hash tagged commit" ' |
| 136 | + git tag --no-sign -m "This is a tag" committag $(commit_oid $hash) && |
| 137 | + eval committag_${hash}_oid=$(git rev-parse committag) |
| 138 | + ' |
| 139 | + test_expect_success GPG2 "create a $hash signed commit" ' |
| 140 | + git commit --gpg-sign --allow-empty -m "This is a signed commit" && |
| 141 | + eval signedcommit_${hash}_oid=$(git rev-parse HEAD) |
| 142 | + ' |
| 143 | + test_expect_success GPG2 "create a $hash signed tag" ' |
| 144 | + git tag -s -m "This is a signed tag" signedtag HEAD && |
| 145 | + eval signedtag_${hash}_oid=$(git rev-parse signedtag) |
| 146 | + ' |
| 147 | + test_expect_success "create a $hash branch" ' |
| 148 | + git checkout -b branch $(commit_oid $hash) && |
| 149 | + echo "More more more give me more!" > more && |
| 150 | + eval more_${hash}_oid=$(git hash-object more) && |
| 151 | + echo "Another and another and another" > another && |
| 152 | + eval another_${hash}_oid=$(git hash-object another) && |
| 153 | + git update-index --add more another && |
| 154 | + git commit -m "Add more files!" && |
| 155 | + eval commit2_${hash}_oid=$(git rev-parse HEAD) && |
| 156 | + eval tree2_${hash}_oid=$(git rev-parse HEAD^{tree}) |
| 157 | + ' |
| 158 | + test_expect_success GPG2 "create another $hash signed tag" ' |
| 159 | + git tag -s -m "This is another signed tag" signedtag2 $(commit2_oid $hash) && |
| 160 | + eval signedtag2_${hash}_oid=$(git rev-parse signedtag2) |
| 161 | + ' |
| 162 | + test_expect_success GPG2 "merge the $hash branches together" ' |
| 163 | + git merge -S -m "merge some signed tags together" signedtag signedtag2 && |
| 164 | + eval signedcommit2_${hash}_oid=$(git rev-parse HEAD) |
| 165 | + ' |
| 166 | + test_expect_success GPG2 "create additional $hash signed commits" ' |
| 167 | + git commit --gpg-sign --allow-empty -m "This is an additional signed commit" && |
| 168 | + git cat-file commit HEAD | del_sigcommit sha256 > "../${hash}_signedcommit3" && |
| 169 | + git cat-file commit HEAD | del_sigcommit sha1 > "../${hash}_signedcommit4" && |
| 170 | + eval signedcommit3_${hash}_oid=$(git hash-object -t commit -w ../${hash}_signedcommit3) && |
| 171 | + eval signedcommit4_${hash}_oid=$(git hash-object -t commit -w ../${hash}_signedcommit4) |
| 172 | + ' |
| 173 | + test_expect_success GPG2 "create additional $hash signed tags" ' |
| 174 | + git tag -s -m "This is an additional signed tag" signedtag34 HEAD && |
| 175 | + git cat-file tag signedtag34 | del_sigtag "${hash}" sha256 > ../${hash}_signedtag3 && |
| 176 | + git cat-file tag signedtag34 | del_sigtag "${hash}" sha1 > ../${hash}_signedtag4 && |
| 177 | + eval signedtag3_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag3) && |
| 178 | + eval signedtag4_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag4) |
| 179 | + ' |
| 180 | +done |
| 181 | +cd "$base" |
| 182 | + |
| 183 | +compare_oids () { |
| 184 | + test "$#" = 5 && { local PREREQ=$1; shift; } || PREREQ= |
| 185 | + local type="$1" |
| 186 | + local name="$2" |
| 187 | + local sha1_oid="$3" |
| 188 | + local sha256_oid="$4" |
| 189 | + |
| 190 | + echo ${sha1_oid} > ${name}_sha1_expected |
| 191 | + echo ${sha256_oid} > ${name}_sha256_expected |
| 192 | + echo ${type} > ${name}_type_expected |
| 193 | + |
| 194 | + git --git-dir=repo-sha1/.git rev-parse --output-object-format=sha256 ${sha1_oid} > ${name}_sha1_sha256_found |
| 195 | + git --git-dir=repo-sha256/.git rev-parse --output-object-format=sha1 ${sha256_oid} > ${name}_sha256_sha1_found |
| 196 | + local sha1_sha256_oid=$(cat ${name}_sha1_sha256_found) |
| 197 | + local sha256_sha1_oid=$(cat ${name}_sha256_sha1_found) |
| 198 | + |
| 199 | + test_expect_success $PREREQ "Verify ${type} ${name}'s sha1 oid" ' |
| 200 | + git --git-dir=repo-sha256/.git rev-parse --output-object-format=sha1 ${sha256_oid} > ${name}_sha1 && |
| 201 | + test_cmp ${name}_sha1 ${name}_sha1_expected |
| 202 | +' |
| 203 | + |
| 204 | + test_expect_success $PREREQ "Verify ${type} ${name}'s sha256 oid" ' |
| 205 | + git --git-dir=repo-sha1/.git rev-parse --output-object-format=sha256 ${sha1_oid} > ${name}_sha256 && |
| 206 | + test_cmp ${name}_sha256 ${name}_sha256_expected |
| 207 | +' |
| 208 | + |
| 209 | + test_expect_success $PREREQ "Verify ${name}'s sha1 type" ' |
| 210 | + git --git-dir=repo-sha1/.git cat-file -t ${sha1_oid} > ${name}_type1 && |
| 211 | + git --git-dir=repo-sha256/.git cat-file -t ${sha256_sha1_oid} > ${name}_type2 && |
| 212 | + test_cmp ${name}_type1 ${name}_type2 && |
| 213 | + test_cmp ${name}_type1 ${name}_type_expected |
| 214 | +' |
| 215 | + |
| 216 | + test_expect_success $PREREQ "Verify ${name}'s sha256 type" ' |
| 217 | + git --git-dir=repo-sha256/.git cat-file -t ${sha256_oid} > ${name}_type3 && |
| 218 | + git --git-dir=repo-sha1/.git cat-file -t ${sha1_sha256_oid} > ${name}_type4 && |
| 219 | + test_cmp ${name}_type3 ${name}_type4 && |
| 220 | + test_cmp ${name}_type3 ${name}_type_expected |
| 221 | +' |
| 222 | + |
| 223 | + test_expect_success $PREREQ "Verify ${name}'s sha1 size" ' |
| 224 | + git --git-dir=repo-sha1/.git cat-file -s ${sha1_oid} > ${name}_size1 && |
| 225 | + git --git-dir=repo-sha256/.git cat-file -s ${sha256_sha1_oid} > ${name}_size2 && |
| 226 | + test_cmp ${name}_size1 ${name}_size2 |
| 227 | +' |
| 228 | + |
| 229 | + test_expect_success $PREREQ "Verify ${name}'s sha256 size" ' |
| 230 | + git --git-dir=repo-sha256/.git cat-file -s ${sha256_oid} > ${name}_size3 && |
| 231 | + git --git-dir=repo-sha1/.git cat-file -s ${sha1_sha256_oid} > ${name}_size4 && |
| 232 | + test_cmp ${name}_size3 ${name}_size4 |
| 233 | +' |
| 234 | + |
| 235 | + test_expect_success $PREREQ "Verify ${name}'s sha1 pretty content" ' |
| 236 | + git --git-dir=repo-sha1/.git cat-file -p ${sha1_oid} > ${name}_content1 && |
| 237 | + git --git-dir=repo-sha256/.git cat-file -p ${sha256_sha1_oid} > ${name}_content2 && |
| 238 | + test_cmp ${name}_content1 ${name}_content2 |
| 239 | +' |
| 240 | + |
| 241 | + test_expect_success $PREREQ "Verify ${name}'s sha256 pretty content" ' |
| 242 | + git --git-dir=repo-sha256/.git cat-file -p ${sha256_oid} > ${name}_content3 && |
| 243 | + git --git-dir=repo-sha1/.git cat-file -p ${sha1_sha256_oid} > ${name}_content4 && |
| 244 | + test_cmp ${name}_content3 ${name}_content4 |
| 245 | +' |
| 246 | + |
| 247 | + test_expect_success $PREREQ "Verify ${name}'s sha1 content" ' |
| 248 | + git --git-dir=repo-sha1/.git cat-file ${type} ${sha1_oid} > ${name}_content5 && |
| 249 | + git --git-dir=repo-sha256/.git cat-file ${type} ${sha256_sha1_oid} > ${name}_content6 && |
| 250 | + test_cmp ${name}_content5 ${name}_content6 |
| 251 | +' |
| 252 | + |
| 253 | + test_expect_success $PREREQ "Verify ${name}'s sha256 content" ' |
| 254 | + git --git-dir=repo-sha256/.git cat-file ${type} ${sha256_oid} > ${name}_content7 && |
| 255 | + git --git-dir=repo-sha1/.git cat-file ${type} ${sha1_sha256_oid} > ${name}_content8 && |
| 256 | + test_cmp ${name}_content7 ${name}_content8 |
| 257 | +' |
| 258 | + |
| 259 | +} |
| 260 | + |
| 261 | +compare_oids 'blob' hello "$hello_sha1_oid" "$hello_sha256_oid" |
| 262 | +compare_oids 'tree' tree "$tree_sha1_oid" "$tree_sha256_oid" |
| 263 | +compare_oids 'commit' commit "$commit_sha1_oid" "$commit_sha256_oid" |
| 264 | +compare_oids GPG2 'commit' signedcommit "$signedcommit_sha1_oid" "$signedcommit_sha256_oid" |
| 265 | +compare_oids 'tag' hellotag "$hellotag_sha1_oid" "$hellotag_sha256_oid" |
| 266 | +compare_oids 'tag' treetag "$treetag_sha1_oid" "$treetag_sha256_oid" |
| 267 | +compare_oids 'tag' committag "$committag_sha1_oid" "$committag_sha256_oid" |
| 268 | +compare_oids GPG2 'tag' signedtag "$signedtag_sha1_oid" "$signedtag_sha256_oid" |
| 269 | + |
| 270 | +compare_oids 'blob' more "$more_sha1_oid" "$more_sha256_oid" |
| 271 | +compare_oids 'blob' another "$another_sha1_oid" "$another_sha256_oid" |
| 272 | +compare_oids 'tree' tree2 "$tree2_sha1_oid" "$tree2_sha256_oid" |
| 273 | +compare_oids 'commit' commit2 "$commit2_sha1_oid" "$commit2_sha256_oid" |
| 274 | +compare_oids GPG2 'tag' signedtag2 "$signedtag2_sha1_oid" "$signedtag2_sha256_oid" |
| 275 | +compare_oids GPG2 'commit' signedcommit2 "$signedcommit2_sha1_oid" "$signedcommit2_sha256_oid" |
| 276 | +compare_oids GPG2 'commit' signedcommit3 "$signedcommit3_sha1_oid" "$signedcommit3_sha256_oid" |
| 277 | +compare_oids GPG2 'commit' signedcommit4 "$signedcommit4_sha1_oid" "$signedcommit4_sha256_oid" |
| 278 | +compare_oids GPG2 'tag' signedtag3 "$signedtag3_sha1_oid" "$signedtag3_sha256_oid" |
| 279 | +compare_oids GPG2 'tag' signedtag4 "$signedtag4_sha1_oid" "$signedtag4_sha256_oid" |
| 280 | + |
| 281 | +test_done |
0 commit comments