Bundle verification performed as part of `unbundle()` is configurable via providing `verify_bundle_flags`. This is done by invoking `verify_bundle()` and propagating the set flags. If the `VERIFY_BUNDLE_FSCK` flag is provided, the `fsck-objects` flag is specified when invoking git-index-pack(1) to perform fsck checks on the objects in the bundle. Introduce a new type, `verify_bundle_opts`, and update `unbundle()` to accept this instead of `verify_bundle_flags` to perform the same verification configuration. In a subsequent commit, `verify_bundle_opts` will be extended to support configuration of fsck message severity. Signed-off-by: Justin Tobler <jltobler@xxxxxxxxx> --- builtin/bundle.c | 2 +- bundle-uri.c | 13 ++++++++----- bundle.c | 14 +++++++++----- bundle.h | 14 +++++++++----- transport.c | 6 ++++-- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/builtin/bundle.c b/builtin/bundle.c index 127518c2a8..15ac75ab51 100644 --- a/builtin/bundle.c +++ b/builtin/bundle.c @@ -218,7 +218,7 @@ static int cmd_bundle_unbundle(int argc, const char **argv, const char *prefix) strvec_pushl(&extra_index_pack_args, "-v", "--progress-title", _("Unbundling objects"), NULL); ret = !!unbundle(the_repository, &header, bundle_fd, - &extra_index_pack_args, 0) || + &extra_index_pack_args, NULL) || list_bundle_refs(&header, argc, argv); bundle_header_release(&header); diff --git a/bundle-uri.c b/bundle-uri.c index 0df66e2872..ed3afcaeb3 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -361,12 +361,16 @@ static int copy_uri_to_file(const char *filename, const char *uri) static int unbundle_from_file(struct repository *r, const char *file) { - int result = 0; - int bundle_fd; + struct verify_bundle_opts opts = { + .flags = VERIFY_BUNDLE_QUIET | + (fetch_pack_fsck_objects() ? VERIFY_BUNDLE_FSCK : 0) + }; struct bundle_header header = BUNDLE_HEADER_INIT; - struct string_list_item *refname; struct strbuf bundle_ref = STRBUF_INIT; + struct string_list_item *refname; size_t bundle_prefix_len; + int result = 0; + int bundle_fd; bundle_fd = read_bundle_header(file, &header); if (bundle_fd < 0) { @@ -379,8 +383,7 @@ static int unbundle_from_file(struct repository *r, const char *file) * a reachable ref pointing to the new tips, which will reach * the prerequisite commits. */ - result = unbundle(r, &header, bundle_fd, NULL, - VERIFY_BUNDLE_QUIET | (fetch_pack_fsck_objects() ? VERIFY_BUNDLE_FSCK : 0)); + result = unbundle(r, &header, bundle_fd, NULL, &opts); if (result) { result = 1; goto cleanup; diff --git a/bundle.c b/bundle.c index 4773b51eb1..db17f50ee0 100644 --- a/bundle.c +++ b/bundle.c @@ -626,13 +626,17 @@ int create_bundle(struct repository *r, const char *path, return ret; } -int unbundle(struct repository *r, struct bundle_header *header, - int bundle_fd, struct strvec *extra_index_pack_args, - enum verify_bundle_flags flags) +int unbundle(struct repository *r, struct bundle_header *header, int bundle_fd, + struct strvec *extra_index_pack_args, + struct verify_bundle_opts *_opts) { struct child_process ip = CHILD_PROCESS_INIT; + struct verify_bundle_opts opts = { 0 }; - if (verify_bundle(r, header, flags)) + if (_opts) + opts = *_opts; + + if (verify_bundle(r, header, opts.flags)) return -1; strvec_pushl(&ip.args, "index-pack", "--fix-thin", "--stdin", NULL); @@ -641,7 +645,7 @@ int unbundle(struct repository *r, struct bundle_header *header, if (header->filter.choice) strvec_push(&ip.args, "--promisor=from-bundle"); - if (flags & VERIFY_BUNDLE_FSCK) + if (opts.flags & VERIFY_BUNDLE_FSCK) strvec_push(&ip.args, "--fsck-objects"); if (extra_index_pack_args) diff --git a/bundle.h b/bundle.h index 5ccc9a061a..bddf44c267 100644 --- a/bundle.h +++ b/bundle.h @@ -39,6 +39,10 @@ enum verify_bundle_flags { int verify_bundle(struct repository *r, struct bundle_header *header, enum verify_bundle_flags flags); +struct verify_bundle_opts { + enum verify_bundle_flags flags; +}; + /** * Unbundle after reading the header with read_bundle_header(). * @@ -49,12 +53,12 @@ int verify_bundle(struct repository *r, struct bundle_header *header, * (e.g. "-v" for verbose/progress), NULL otherwise. The provided * "extra_index_pack_args" (if any) will be strvec_clear()'d for you. * - * Before unbundling, this method will call verify_bundle() with the - * given 'flags'. + * Before unbundling, this method will call verify_bundle() with 'flags' + * provided in 'opts'. */ -int unbundle(struct repository *r, struct bundle_header *header, - int bundle_fd, struct strvec *extra_index_pack_args, - enum verify_bundle_flags flags); +int unbundle(struct repository *r, struct bundle_header *header, int bundle_fd, + struct strvec *extra_index_pack_args, + struct verify_bundle_opts *opts); int list_bundle_refs(struct bundle_header *header, int argc, const char **argv); diff --git a/transport.c b/transport.c index 47fda6a773..7e0ec4adc9 100644 --- a/transport.c +++ b/transport.c @@ -176,6 +176,8 @@ static int fetch_refs_from_bundle(struct transport *transport, int nr_heads UNUSED, struct ref **to_fetch UNUSED) { + struct verify_bundle_opts opts = { .flags = fetch_pack_fsck_objects() ? + VERIFY_BUNDLE_FSCK : 0 }; struct bundle_transport_data *data = transport->data; struct strvec extra_index_pack_args = STRVEC_INIT; int ret; @@ -185,9 +187,9 @@ static int fetch_refs_from_bundle(struct transport *transport, if (!data->get_refs_from_bundle_called) get_refs_from_bundle_inner(transport); + ret = unbundle(the_repository, &data->header, data->fd, - &extra_index_pack_args, - fetch_pack_fsck_objects() ? VERIFY_BUNDLE_FSCK : 0); + &extra_index_pack_args, &opts); transport->hash_algo = data->header.hash_algo; strvec_clear(&extra_index_pack_args); -- 2.47.0