Skip to content

Commit

Permalink
bundle: add bundle verification options type
Browse files Browse the repository at this point in the history
When `unbundle()` is invoked, fsck verification may be configured by
passing the `VERIFY_BUNDLE_FSCK` flag. This mechanism allows fsck checks
on the bundle to be enabled or disabled entirely. To facilitate more
fine-grained fsck configuration, additional context must be provided to
`unbundle()`.

Introduce the `unbundle_opts` type, which wraps the existing
`verify_bundle_flags`, to facilitate future extension of `unbundle()`
configuration. Also update `unbundle()` and its call sites to accept
this new options type instead of the flags directly. The end behavior is
functionally the same, but allows for the set of configurable options to
be extended. This is leveraged in a subsequent commit to enable fsck
message severity configuration.

Signed-off-by: Justin Tobler <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
jltobler authored and gitster committed Nov 28, 2024
1 parent 4083a6f commit 87c0100
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 9 deletions.
2 changes: 1 addition & 1 deletion builtin/bundle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
7 changes: 5 additions & 2 deletions bundle-uri.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ static int unbundle_from_file(struct repository *r, const char *file)
struct string_list_item *refname;
struct strbuf bundle_ref = STRBUF_INIT;
size_t bundle_prefix_len;
struct unbundle_opts opts = {
.flags = VERIFY_BUNDLE_QUIET |
(fetch_pack_fsck_objects() ? VERIFY_BUNDLE_FSCK : 0),
};

bundle_fd = read_bundle_header(file, &header);
if (bundle_fd < 0) {
Expand All @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion bundle.c
Original file line number Diff line number Diff line change
Expand Up @@ -628,9 +628,13 @@ int create_bundle(struct repository *r, const char *path,

int unbundle(struct repository *r, struct bundle_header *header,
int bundle_fd, struct strvec *extra_index_pack_args,
enum verify_bundle_flags flags)
struct unbundle_opts *opts)
{
struct child_process ip = CHILD_PROCESS_INIT;
enum verify_bundle_flags flags = 0;

if (opts)
flags = opts->flags;

if (verify_bundle(r, header, flags))
return -1;
Expand Down
10 changes: 7 additions & 3 deletions bundle.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ enum verify_bundle_flags {
int verify_bundle(struct repository *r, struct bundle_header *header,
enum verify_bundle_flags flags);

struct unbundle_opts {
enum verify_bundle_flags flags;
};

/**
* Unbundle after reading the header with read_bundle_header().
*
Expand All @@ -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);
struct unbundle_opts *opts);
int list_bundle_refs(struct bundle_header *header,
int argc, const char **argv);

Expand Down
6 changes: 4 additions & 2 deletions transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,9 @@ static int fetch_refs_from_bundle(struct transport *transport,
int nr_heads UNUSED,
struct ref **to_fetch UNUSED)
{
struct unbundle_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;
Expand All @@ -186,8 +189,7 @@ 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);
Expand Down

0 comments on commit 87c0100

Please sign in to comment.