From: Omar Polo Subject: gotadmin: add a flag to force the usage of ref-delta To: gameoftrees@openbsd.org Date: Fri, 17 Feb 2023 10:44:46 +0100 Diff below adds a -D flag that force gotadmin to generate a packfile using ref-delta only. It's meant only for the regress suite, since that part of the code is never triggered by the regress. I'm not sure if documenting this option makes sense. Outside of the regress suite it shouldn't be used; if only because it makes packfiles bigger. diff /home/op/w/gotd commit - cde544b29d344a5c884ca3948d1826520308a353 path + /home/op/w/gotd blob - e11b3a0b3586e7aac0c6955aac2096e7dc6d7fe6 file + gotadmin/gotadmin.1 --- gotadmin/gotadmin.1 +++ gotadmin/gotadmin.1 @@ -96,7 +96,7 @@ work tree, use the repository path associated with thi .El .It Xo .Cm pack -.Op Fl aq +.Op Fl aDq .Op Fl r Ar repository-path .Op Fl x Ar reference .Op Ar reference ... @@ -128,6 +128,9 @@ Unless this option is specified, only loose objects wi Add objects to the generated pack file even if they are already packed in a different pack file. Unless this option is specified, only loose objects will be added. +.It Fl D +Force the packfile to use the ref-delta representation for objects. +It is intended for debug only. .It Fl q Suppress progress reporting output. .It Fl r Ar repository-path blob - 158bbdc93cdc3b2264d3efa8d639edde028f21d8 file + gotadmin/gotadmin.c --- gotadmin/gotadmin.c +++ gotadmin/gotadmin.c @@ -452,7 +452,7 @@ usage_pack(void) __dead static void usage_pack(void) { - fprintf(stderr, "usage: %s pack [-aq] [-r repository-path] " + fprintf(stderr, "usage: %s pack [-aDq] [-r repository-path] " "[-x reference] [reference ...]\n", getprogname()); exit(1); } @@ -692,7 +692,7 @@ cmd_pack(int argc, char *argv[]) const struct got_error *error = NULL; char *repo_path = NULL; struct got_repository *repo = NULL; - int ch, i, loose_obj_only = 1, verbosity = 0; + int ch, i, loose_obj_only = 1, force_refdelta = 0, verbosity = 0; struct got_object_id *pack_hash = NULL; char *id_str = NULL; struct got_pack_progress_arg ppa; @@ -714,11 +714,14 @@ cmd_pack(int argc, char *argv[]) err(1, "pledge"); #endif - while ((ch = getopt(argc, argv, "aqr:x:")) != -1) { + while ((ch = getopt(argc, argv, "aDqr:x:")) != -1) { switch (ch) { case 'a': loose_obj_only = 0; break; + case 'D': + force_refdelta = 1; + break; case 'q': verbosity = -1; break; @@ -802,7 +805,7 @@ cmd_pack(int argc, char *argv[]) error = got_repo_pack_objects(&packfile, &pack_hash, &include_refs, &exclude_refs, repo, loose_obj_only, - pack_progress, &ppa, check_cancelled, NULL); + force_refdelta, pack_progress, &ppa, check_cancelled, NULL); if (error) { if (ppa.printed_something) printf("\n"); blob - 2caf2a94d4ed262a215863f07c9e967a8f052cc3 file + include/got_repository_admin.h --- include/got_repository_admin.h +++ include/got_repository_admin.h @@ -34,7 +34,7 @@ got_repo_pack_objects(FILE **packfile, struct got_obje got_repo_pack_objects(FILE **packfile, struct got_object_id **pack_hash, struct got_reflist_head *include_refs, struct got_reflist_head *exclude_refs, struct got_repository *repo, - int loose_obj_only, + int loose_obj_only, int force_refdelta, got_pack_progress_cb progress_cb, void *progress_arg, got_cancel_cb cancel_cb, void *cancel_arg); blob - 7a3c6579c0c3c5ab813f5c5cdb1093a791ac08b4 file + lib/got_lib_pack_create.h --- lib/got_lib_pack_create.h +++ lib/got_lib_pack_create.h @@ -25,7 +25,7 @@ const struct got_error *got_pack_create(uint8_t *pack_ FILE *delta_cache, struct got_object_id **theirs, int ntheirs, struct got_object_id **ours, int nours, struct got_repository *repo, int loose_obj_only, int allow_empty, - got_pack_progress_cb progress_cb, void *progress_arg, + int force_refdelta, got_pack_progress_cb progress_cb, void *progress_arg, struct got_ratelimit *, got_cancel_cb cancel_cb, void *cancel_arg); const struct got_error * blob - 0dda4f95f2b3f8b16523c768cd55fa04de120f90 file + lib/pack_create.c --- lib/pack_create.c +++ lib/pack_create.c @@ -1550,14 +1550,14 @@ deltahdr(off_t *packfile_size, SHA1_CTX *ctx, int pack } static const struct got_error * -deltahdr(off_t *packfile_size, SHA1_CTX *ctx, int packfd, +deltahdr(off_t *packfile_size, SHA1_CTX *ctx, int packfd, int force_refdelta, struct got_pack_meta *m) { const struct got_error *err; char buf[32]; int nh; - if (m->prev->off != 0) { + if (m->prev->off != 0 && !force_refdelta) { err = packhdr(&nh, buf, sizeof(buf), GOT_OBJ_TYPE_OFFSET_DELTA, m->delta_len); if (err) @@ -1590,7 +1590,7 @@ write_packed_object(off_t *packfile_size, int packfd, write_packed_object(off_t *packfile_size, int packfd, FILE *delta_cache, uint8_t *delta_cache_map, size_t delta_cache_size, struct got_pack_meta *m, int *outfd, SHA1_CTX *ctx, - struct got_repository *repo) + struct got_repository *repo, int force_refdelta) { const struct got_error *err = NULL; struct got_deflate_checksum csum; @@ -1641,7 +1641,7 @@ write_packed_object(off_t *packfile_size, int packfd, got_object_raw_close(raw); raw = NULL; } else if (m->delta_buf) { - err = deltahdr(packfile_size, ctx, packfd, m); + err = deltahdr(packfile_size, ctx, packfd, force_refdelta, m); if (err) goto done; err = hwrite(packfd, m->delta_buf, @@ -1652,7 +1652,7 @@ write_packed_object(off_t *packfile_size, int packfd, free(m->delta_buf); m->delta_buf = NULL; } else if (delta_cache_map) { - err = deltahdr(packfile_size, ctx, packfd, m); + err = deltahdr(packfile_size, ctx, packfd, force_refdelta, m); if (err) goto done; err = hcopy_mmap(delta_cache_map, delta_offset, @@ -1666,7 +1666,7 @@ write_packed_object(off_t *packfile_size, int packfd, err = got_error_from_errno("fseeko"); goto done; } - err = deltahdr(packfile_size, ctx, packfd, m); + err = deltahdr(packfile_size, ctx, packfd, force_refdelta, m); if (err) goto done; err = hcopy(delta_cache, packfd, @@ -1686,7 +1686,7 @@ genpack(uint8_t *pack_sha1, int packfd, struct got_pac FILE *delta_cache, struct got_pack_meta **deltify, int ndeltify, struct got_pack_meta **reuse, int nreuse, int ncolored, int nfound, int ntrees, int nours, - struct got_repository *repo, + struct got_repository *repo, int force_refdelta, got_pack_progress_cb progress_cb, void *progress_arg, struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg) @@ -1750,7 +1750,7 @@ genpack(uint8_t *pack_sha1, int packfd, struct got_pac m = deltify[i]; err = write_packed_object(&packfile_size, packfd, delta_cache, delta_cache_map, delta_cache_size, - m, &outfd, &ctx, repo); + m, &outfd, &ctx, repo, force_refdelta); if (err) goto done; } @@ -1779,7 +1779,7 @@ genpack(uint8_t *pack_sha1, int packfd, struct got_pac m = reuse[i]; err = write_packed_object(&packfile_size, packfd, packfile, reuse_pack->map, reuse_pack->filesize, - m, &outfd, &ctx, repo); + m, &outfd, &ctx, repo, force_refdelta); if (err) goto done; } @@ -1826,7 +1826,7 @@ got_pack_create(uint8_t *packsha1, int packfd, FILE *d struct got_object_id **theirs, int ntheirs, struct got_object_id **ours, int nours, struct got_repository *repo, int loose_obj_only, int allow_empty, - got_pack_progress_cb progress_cb, void *progress_arg, + int force_refdelta, got_pack_progress_cb progress_cb, void *progress_arg, struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg) { const struct got_error *err; @@ -1933,7 +1933,7 @@ got_pack_create(uint8_t *packsha1, int packfd, FILE *d err = genpack(packsha1, packfd, reuse_pack, delta_cache, deltify.meta, deltify.nmeta, reuse.meta, reuse.nmeta, ncolored, nfound, ntrees, - nours, repo, progress_cb, progress_arg, rl, + nours, repo, force_refdelta, progress_cb, progress_arg, rl, cancel_cb, cancel_arg); if (err) goto done; blob - 0be05225c5acde90af06fcbe60d29ec6a8044bbe file + lib/repository_admin.c --- lib/repository_admin.c +++ lib/repository_admin.c @@ -145,7 +145,7 @@ got_repo_pack_objects(FILE **packfile, struct got_obje got_repo_pack_objects(FILE **packfile, struct got_object_id **pack_hash, struct got_reflist_head *include_refs, struct got_reflist_head *exclude_refs, struct got_repository *repo, - int loose_obj_only, + int loose_obj_only, int force_refdelta, got_pack_progress_cb progress_cb, void *progress_arg, got_cancel_cb cancel_cb, void *cancel_arg) { @@ -209,8 +209,9 @@ got_repo_pack_objects(FILE **packfile, struct got_obje } err = got_pack_create((*pack_hash)->sha1, packfd, delta_cache, - theirs, ntheirs, ours, nours, repo, loose_obj_only, 0, - progress_cb, progress_arg, &rl, cancel_cb, cancel_arg); + theirs, ntheirs, ours, nours, repo, loose_obj_only, + 0, force_refdelta, progress_cb, progress_arg, &rl, + cancel_cb, cancel_arg); if (err) goto done; blob - ec59732b5d47bf06ab52a0c1cced9366c7816e51 file + lib/send.c --- lib/send.c +++ lib/send.c @@ -647,7 +647,7 @@ got_send_pack(const char *remote_name, struct got_path ppa.progress_cb = progress_cb; ppa.progress_arg = progress_arg; err = got_pack_create(packsha1, packfd, delta_cache, - their_ids, ntheirs, our_ids, nours, repo, 0, 1, + their_ids, ntheirs, our_ids, nours, repo, 0, 0, 1, pack_progress, &ppa, &rl, cancel_cb, cancel_arg); if (err) goto done;