fetch-pack: use new fsck API to printing dangling submodules
Refactor the check added in 5476e1efde
(fetch-pack: print and use
dangling .gitmodules, 2021-02-22) to make use of us now passing the
"msg_id" to the user defined "error_func". We can now compare against
the FSCK_MSG_GITMODULES_MISSING instead of parsing the generated
message.
Let's also replace register_found_gitmodules() with directly
manipulating the "gitmodules_found" member. A recent commit moved it
into "fsck_options" so we could do this here.
I'm sticking this callback in fsck.c. Perhaps in the future we'd like
to accumulate such callbacks into another file (maybe fsck-cb.c,
similar to parse-options-cb.c?), but while we've got just the one
let's just put it into fsck.c.
A better alternative in this case would be some library some more
obvious library shared by fetch-pack.c ad builtin/index-pack.c, but
there isn't such a thing.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c96e184cae
commit
3745e2693d
@ -120,7 +120,7 @@ static int nr_threads;
|
|||||||
static int from_stdin;
|
static int from_stdin;
|
||||||
static int strict;
|
static int strict;
|
||||||
static int do_fsck_object;
|
static int do_fsck_object;
|
||||||
static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
|
static struct fsck_options fsck_options = FSCK_OPTIONS_MISSING_GITMODULES;
|
||||||
static int verbose;
|
static int verbose;
|
||||||
static int show_resolving_progress;
|
static int show_resolving_progress;
|
||||||
static int show_stat;
|
static int show_stat;
|
||||||
@ -1713,24 +1713,6 @@ static void show_pack_info(int stat_only)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_dangling_gitmodules(struct fsck_options *o,
|
|
||||||
const struct object_id *oid,
|
|
||||||
enum object_type object_type,
|
|
||||||
enum fsck_msg_type msg_type,
|
|
||||||
enum fsck_msg_id msg_id,
|
|
||||||
const char *message)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* NEEDSWORK: Plumb the MSG_ID (from fsck.c) here and use it
|
|
||||||
* instead of relying on this string check.
|
|
||||||
*/
|
|
||||||
if (starts_with(message, "gitmodulesMissing")) {
|
|
||||||
printf("%s\n", oid_to_hex(oid));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return fsck_error_function(o, oid, object_type, msg_type, msg_id, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cmd_index_pack(int argc, const char **argv, const char *prefix)
|
int cmd_index_pack(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i, fix_thin_pack = 0, verify = 0, stat_only = 0, rev_index;
|
int i, fix_thin_pack = 0, verify = 0, stat_only = 0, rev_index;
|
||||||
@ -1761,7 +1743,6 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
read_replace_refs = 0;
|
read_replace_refs = 0;
|
||||||
fsck_options.walk = mark_link;
|
fsck_options.walk = mark_link;
|
||||||
fsck_options.error_func = print_dangling_gitmodules;
|
|
||||||
|
|
||||||
reset_pack_idx_option(&opts);
|
reset_pack_idx_option(&opts);
|
||||||
git_config(git_index_pack_config, &opts);
|
git_config(git_index_pack_config, &opts);
|
||||||
|
31
fetch-pack.c
31
fetch-pack.c
@ -38,7 +38,7 @@ static int server_supports_filtering;
|
|||||||
static int advertise_sid;
|
static int advertise_sid;
|
||||||
static struct shallow_lock shallow_lock;
|
static struct shallow_lock shallow_lock;
|
||||||
static const char *alternate_shallow_file;
|
static const char *alternate_shallow_file;
|
||||||
static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
|
static struct fsck_options fsck_options = FSCK_OPTIONS_MISSING_GITMODULES;
|
||||||
static struct strbuf fsck_msg_types = STRBUF_INIT;
|
static struct strbuf fsck_msg_types = STRBUF_INIT;
|
||||||
static struct string_list uri_protocols = STRING_LIST_INIT_DUP;
|
static struct string_list uri_protocols = STRING_LIST_INIT_DUP;
|
||||||
|
|
||||||
@ -988,21 +988,6 @@ static int cmp_ref_by_name(const void *a_, const void *b_)
|
|||||||
return strcmp(a->name, b->name);
|
return strcmp(a->name, b->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fsck_gitmodules_oids(struct oidset *gitmodules_oids)
|
|
||||||
{
|
|
||||||
struct oidset_iter iter;
|
|
||||||
const struct object_id *oid;
|
|
||||||
|
|
||||||
if (!oidset_size(gitmodules_oids))
|
|
||||||
return;
|
|
||||||
|
|
||||||
oidset_iter_init(gitmodules_oids, &iter);
|
|
||||||
while ((oid = oidset_iter_next(&iter)))
|
|
||||||
register_found_gitmodules(&fsck_options, oid);
|
|
||||||
if (fsck_finish(&fsck_options))
|
|
||||||
die("fsck failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct ref *do_fetch_pack(struct fetch_pack_args *args,
|
static struct ref *do_fetch_pack(struct fetch_pack_args *args,
|
||||||
int fd[2],
|
int fd[2],
|
||||||
const struct ref *orig_ref,
|
const struct ref *orig_ref,
|
||||||
@ -1017,7 +1002,6 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
|
|||||||
int agent_len;
|
int agent_len;
|
||||||
struct fetch_negotiator negotiator_alloc;
|
struct fetch_negotiator negotiator_alloc;
|
||||||
struct fetch_negotiator *negotiator;
|
struct fetch_negotiator *negotiator;
|
||||||
struct oidset gitmodules_oids = OIDSET_INIT;
|
|
||||||
|
|
||||||
negotiator = &negotiator_alloc;
|
negotiator = &negotiator_alloc;
|
||||||
fetch_negotiator_init(r, negotiator);
|
fetch_negotiator_init(r, negotiator);
|
||||||
@ -1134,9 +1118,10 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
|
|||||||
else
|
else
|
||||||
alternate_shallow_file = NULL;
|
alternate_shallow_file = NULL;
|
||||||
if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
|
if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
|
||||||
&gitmodules_oids))
|
&fsck_options.gitmodules_found))
|
||||||
die(_("git fetch-pack: fetch failed."));
|
die(_("git fetch-pack: fetch failed."));
|
||||||
fsck_gitmodules_oids(&gitmodules_oids);
|
if (fsck_finish(&fsck_options))
|
||||||
|
die("fsck failed");
|
||||||
|
|
||||||
all_done:
|
all_done:
|
||||||
if (negotiator)
|
if (negotiator)
|
||||||
@ -1587,7 +1572,6 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
|||||||
struct string_list packfile_uris = STRING_LIST_INIT_DUP;
|
struct string_list packfile_uris = STRING_LIST_INIT_DUP;
|
||||||
int i;
|
int i;
|
||||||
struct strvec index_pack_args = STRVEC_INIT;
|
struct strvec index_pack_args = STRVEC_INIT;
|
||||||
struct oidset gitmodules_oids = OIDSET_INIT;
|
|
||||||
|
|
||||||
negotiator = &negotiator_alloc;
|
negotiator = &negotiator_alloc;
|
||||||
fetch_negotiator_init(r, negotiator);
|
fetch_negotiator_init(r, negotiator);
|
||||||
@ -1678,7 +1662,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
|||||||
process_section_header(&reader, "packfile", 0);
|
process_section_header(&reader, "packfile", 0);
|
||||||
if (get_pack(args, fd, pack_lockfiles,
|
if (get_pack(args, fd, pack_lockfiles,
|
||||||
packfile_uris.nr ? &index_pack_args : NULL,
|
packfile_uris.nr ? &index_pack_args : NULL,
|
||||||
sought, nr_sought, &gitmodules_oids))
|
sought, nr_sought, &fsck_options.gitmodules_found))
|
||||||
die(_("git fetch-pack: fetch failed."));
|
die(_("git fetch-pack: fetch failed."));
|
||||||
do_check_stateless_delimiter(args, &reader);
|
do_check_stateless_delimiter(args, &reader);
|
||||||
|
|
||||||
@ -1721,7 +1705,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
|||||||
|
|
||||||
packname[the_hash_algo->hexsz] = '\0';
|
packname[the_hash_algo->hexsz] = '\0';
|
||||||
|
|
||||||
parse_gitmodules_oids(cmd.out, &gitmodules_oids);
|
parse_gitmodules_oids(cmd.out, &fsck_options.gitmodules_found);
|
||||||
|
|
||||||
close(cmd.out);
|
close(cmd.out);
|
||||||
|
|
||||||
@ -1742,7 +1726,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
|||||||
string_list_clear(&packfile_uris, 0);
|
string_list_clear(&packfile_uris, 0);
|
||||||
strvec_clear(&index_pack_args);
|
strvec_clear(&index_pack_args);
|
||||||
|
|
||||||
fsck_gitmodules_oids(&gitmodules_oids);
|
if (fsck_finish(&fsck_options))
|
||||||
|
die("fsck failed");
|
||||||
|
|
||||||
if (negotiator)
|
if (negotiator)
|
||||||
negotiator->release(negotiator);
|
negotiator->release(negotiator);
|
||||||
|
23
fsck.c
23
fsck.c
@ -1196,11 +1196,6 @@ int fsck_error_function(struct fsck_options *o,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_found_gitmodules(struct fsck_options *options, const struct object_id *oid)
|
|
||||||
{
|
|
||||||
oidset_insert(&options->gitmodules_found, oid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int fsck_finish(struct fsck_options *options)
|
int fsck_finish(struct fsck_options *options)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -1266,3 +1261,21 @@ int git_fsck_config(const char *var, const char *value, void *cb)
|
|||||||
|
|
||||||
return git_default_config(var, value, cb);
|
return git_default_config(var, value, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Custom error callbacks that are used in more than one place.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int fsck_error_cb_print_missing_gitmodules(struct fsck_options *o,
|
||||||
|
const struct object_id *oid,
|
||||||
|
enum object_type object_type,
|
||||||
|
enum fsck_msg_type msg_type,
|
||||||
|
enum fsck_msg_id msg_id,
|
||||||
|
const char *message)
|
||||||
|
{
|
||||||
|
if (msg_id == FSCK_MSG_GITMODULES_MISSING) {
|
||||||
|
puts(oid_to_hex(oid));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return fsck_error_function(o, oid, object_type, msg_type, msg_id, message);
|
||||||
|
}
|
||||||
|
15
fsck.h
15
fsck.h
@ -111,6 +111,12 @@ int fsck_error_function(struct fsck_options *o,
|
|||||||
const struct object_id *oid, enum object_type object_type,
|
const struct object_id *oid, enum object_type object_type,
|
||||||
enum fsck_msg_type msg_type, enum fsck_msg_id msg_id,
|
enum fsck_msg_type msg_type, enum fsck_msg_id msg_id,
|
||||||
const char *message);
|
const char *message);
|
||||||
|
int fsck_error_cb_print_missing_gitmodules(struct fsck_options *o,
|
||||||
|
const struct object_id *oid,
|
||||||
|
enum object_type object_type,
|
||||||
|
enum fsck_msg_type msg_type,
|
||||||
|
enum fsck_msg_id msg_id,
|
||||||
|
const char *message);
|
||||||
|
|
||||||
struct fsck_options {
|
struct fsck_options {
|
||||||
fsck_walk_func walk;
|
fsck_walk_func walk;
|
||||||
@ -135,6 +141,12 @@ struct fsck_options {
|
|||||||
.gitmodules_done = OIDSET_INIT, \
|
.gitmodules_done = OIDSET_INIT, \
|
||||||
.error_func = fsck_error_function, \
|
.error_func = fsck_error_function, \
|
||||||
}
|
}
|
||||||
|
#define FSCK_OPTIONS_MISSING_GITMODULES { \
|
||||||
|
.strict = 1, \
|
||||||
|
.gitmodules_found = OIDSET_INIT, \
|
||||||
|
.gitmodules_done = OIDSET_INIT, \
|
||||||
|
.error_func = fsck_error_cb_print_missing_gitmodules, \
|
||||||
|
}
|
||||||
|
|
||||||
/* descend in all linked child objects
|
/* descend in all linked child objects
|
||||||
* the return value is:
|
* the return value is:
|
||||||
@ -152,9 +164,6 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options);
|
|||||||
int fsck_object(struct object *obj, void *data, unsigned long size,
|
int fsck_object(struct object *obj, void *data, unsigned long size,
|
||||||
struct fsck_options *options);
|
struct fsck_options *options);
|
||||||
|
|
||||||
void register_found_gitmodules(struct fsck_options *options,
|
|
||||||
const struct object_id *oid);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fsck a tag, and pass info about it back to the caller. This is
|
* fsck a tag, and pass info about it back to the caller. This is
|
||||||
* exposed fsck_object() internals for git-mktag(1).
|
* exposed fsck_object() internals for git-mktag(1).
|
||||||
|
Loading…
Reference in New Issue
Block a user