commit 59b21794ec192212e590f29fd2957e73dc5dc5fe from: Stefan Sperling date: Fri Jan 07 14:33:52 2022 UTC only open raw objects if necessary while writing out pack file data significantly speeds up the "writing pack: " step of gotadmin pack commit - 0f71f6196dbf9f3afd34524586b8bfdb2d1eaccd commit + 59b21794ec192212e590f29fd2957e73dc5dc5fe blob - 2e421bd245bb3702600302716d83053e5785c51a blob + 884cbfab86cc8fe210c5fe53fddb3417cb415a7c --- lib/pack_create.c +++ lib/pack_create.c @@ -1193,10 +1193,10 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delt goto done; m = meta[i]; m->off = ftello(packfile); - err = got_object_raw_open(&raw, &outfd, repo, &m->id); - if (err) - goto done; if (m->delta_len == 0) { + err = got_object_raw_open(&raw, &outfd, repo, &m->id); + if (err) + goto done; err = packhdr(&nh, buf, sizeof(buf), m->obj_type, raw->size); if (err) @@ -1214,6 +1214,8 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delt if (err) goto done; packfile_size += outlen; + got_object_raw_close(raw); + raw = NULL; } else { off_t remain; if (delta_file == NULL) { @@ -1290,8 +1292,6 @@ genpack(uint8_t *pack_sha1, FILE *packfile, FILE *delt goto done; packfile_size += outlen; } - got_object_raw_close(raw); - raw = NULL; } SHA1Final(pack_sha1, &ctx); n = fwrite(pack_sha1, 1, SHA1_DIGEST_LENGTH, packfile);