Merge branch 'tb/pack-finalize-ordering'
The order in which various files that make up a single (conceptual) packfile has been reevaluated and straightened up. This matters in correctness, as an incomplete set of files must not be shown to a running Git. * tb/pack-finalize-ordering: pack-objects: rename .idx files into place after .bitmap files pack-write: split up finish_tmp_packfile() function builtin/index-pack.c: move `.idx` files into place last index-pack: refactor renaming in final() builtin/repack.c: move `.idx` files into place last pack-write.c: rename `.idx` files after `*.rev` pack-write: refactor renaming in finish_tmp_packfile() bulk-checkin.c: store checksum directly pack.h: line-wrap the definition of finish_tmp_packfile()
This commit is contained in:
@ -1477,6 +1477,22 @@ static void write_special_file(const char *suffix, const char *msg,
|
||||
strbuf_release(&name_buf);
|
||||
}
|
||||
|
||||
static void rename_tmp_packfile(const char **final_name,
|
||||
const char *curr_name,
|
||||
struct strbuf *name, unsigned char *hash,
|
||||
const char *ext, int make_read_only_if_same)
|
||||
{
|
||||
if (*final_name != curr_name) {
|
||||
if (!*final_name)
|
||||
*final_name = odb_pack_name(name, hash, ext);
|
||||
if (finalize_object_file(curr_name, *final_name))
|
||||
die(_("unable to rename temporary '*.%s' file to '%s"),
|
||||
ext, *final_name);
|
||||
} else if (make_read_only_if_same) {
|
||||
chmod(*final_name, 0444);
|
||||
}
|
||||
}
|
||||
|
||||
static void final(const char *final_pack_name, const char *curr_pack_name,
|
||||
const char *final_index_name, const char *curr_index_name,
|
||||
const char *final_rev_index_name, const char *curr_rev_index_name,
|
||||
@ -1505,31 +1521,13 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
|
||||
write_special_file("promisor", promisor_msg, final_pack_name,
|
||||
hash, NULL);
|
||||
|
||||
if (final_pack_name != curr_pack_name) {
|
||||
if (!final_pack_name)
|
||||
final_pack_name = odb_pack_name(&pack_name, hash, "pack");
|
||||
if (finalize_object_file(curr_pack_name, final_pack_name))
|
||||
die(_("cannot store pack file"));
|
||||
} else if (from_stdin)
|
||||
chmod(final_pack_name, 0444);
|
||||
|
||||
if (final_index_name != curr_index_name) {
|
||||
if (!final_index_name)
|
||||
final_index_name = odb_pack_name(&index_name, hash, "idx");
|
||||
if (finalize_object_file(curr_index_name, final_index_name))
|
||||
die(_("cannot store index file"));
|
||||
} else
|
||||
chmod(final_index_name, 0444);
|
||||
|
||||
if (curr_rev_index_name) {
|
||||
if (final_rev_index_name != curr_rev_index_name) {
|
||||
if (!final_rev_index_name)
|
||||
final_rev_index_name = odb_pack_name(&rev_index_name, hash, "rev");
|
||||
if (finalize_object_file(curr_rev_index_name, final_rev_index_name))
|
||||
die(_("cannot store reverse index file"));
|
||||
} else
|
||||
chmod(final_rev_index_name, 0444);
|
||||
}
|
||||
rename_tmp_packfile(&final_pack_name, curr_pack_name, &pack_name,
|
||||
hash, "pack", from_stdin);
|
||||
if (curr_rev_index_name)
|
||||
rename_tmp_packfile(&final_rev_index_name, curr_rev_index_name,
|
||||
&rev_index_name, hash, "rev", 1);
|
||||
rename_tmp_packfile(&final_index_name, curr_index_name, &index_name,
|
||||
hash, "idx", 1);
|
||||
|
||||
if (do_fsck_object) {
|
||||
struct packed_git *p;
|
||||
|
||||
Reference in New Issue
Block a user