Message ID | 3cc7f7b1f67fe823834c36f3be20be8ee56e16a4.1727199118.git.me@ttaylorr.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | hash.h: support choosing a separate SHA-1 for non-cryptographic uses | expand |
Taylor Blau <me@ttaylorr.com> writes: > This has some test and real-world fallout, as seen in the adjustment to > t5303 below. That test script assumes that we can "fix" corruption by > repacking into a good state, including when the pack generated by that > repack operation collides with a (corrupted) pack with the same hash. > This violates our assumption from the previous adjustments to > finalize_object_file() that if we're moving a new file over an existing > one, that since their checksums match, so too must their contents. > > This makes "fixing" corruption like this a more explicit operation, > since the test (and users, who may fix real-life corruption using a > similar technique) must first move the broken contents out of the way. Nicely described. > @@ -528,9 +529,9 @@ static void rename_tmp_packfile(struct strbuf *name_prefix, const char *source, > size_t name_prefix_len = name_prefix->len; > > strbuf_addstr(name_prefix, ext); > - if (rename(source, name_prefix->buf)) > - die_errno("unable to rename temporary file to '%s'", > - name_prefix->buf); > + if (finalize_object_file(source, name_prefix->buf)) > + die("unable to rename temporary file to '%s'", > + name_prefix->buf); > strbuf_setlen(name_prefix, name_prefix_len); > } Looking good. Thanks.
diff --git a/pack-write.c b/pack-write.c index 27965672f17..f415604c159 100644 --- a/pack-write.c +++ b/pack-write.c @@ -8,6 +8,7 @@ #include "csum-file.h" #include "remote.h" #include "chunk-format.h" +#include "object-file.h" #include "pack-mtimes.h" #include "pack-objects.h" #include "pack-revindex.h" @@ -528,9 +529,9 @@ static void rename_tmp_packfile(struct strbuf *name_prefix, const char *source, size_t name_prefix_len = name_prefix->len; strbuf_addstr(name_prefix, ext); - if (rename(source, name_prefix->buf)) - die_errno("unable to rename temporary file to '%s'", - name_prefix->buf); + if (finalize_object_file(source, name_prefix->buf)) + die("unable to rename temporary file to '%s'", + name_prefix->buf); strbuf_setlen(name_prefix, name_prefix_len); } diff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh index 61469ef4a68..e6a43ec9ae3 100755 --- a/t/t5303-pack-corruption-resilience.sh +++ b/t/t5303-pack-corruption-resilience.sh @@ -44,9 +44,14 @@ create_new_pack() { } do_repack() { + for f in $pack.* + do + mv $f "$(echo $f | sed -e 's/pack-/pack-corrupt-/')" || return 1 + done && pack=$(printf "$blob_1\n$blob_2\n$blob_3\n" | git pack-objects $@ .git/objects/pack/pack) && - pack=".git/objects/pack/pack-${pack}" + pack=".git/objects/pack/pack-${pack}" && + rm -f .git/objects/pack/pack-corrupt-* } do_corrupt_object() {