]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch-pack: use new fsck API to printing dangling submodules
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Sun, 28 Mar 2021 13:15:51 +0000 (15:15 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Mar 2021 02:03:10 +0000 (19:03 -0700)
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>
builtin/index-pack.c
fetch-pack.c
fsck.c
fsck.h

index 5ad80b85b473c1f785bc7b409d99c556f64a6757..11f0fafd33beb2fd86548c51944b8578128269c5 100644 (file)
@@ -120,7 +120,7 @@ static int nr_threads;
 static int from_stdin;
 static int strict;
 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 show_resolving_progress;
 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 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;
        fsck_options.walk = mark_link;
-       fsck_options.error_func = print_dangling_gitmodules;
 
        reset_pack_idx_option(&opts);
        git_config(git_index_pack_config, &opts);
index 229fd8e2c20ba4714c5119ea06b30c89206a8dbb..0392d36c0aa683c88c70eb8c55cadaaa07dd2e81 100644 (file)
@@ -38,7 +38,7 @@ static int server_supports_filtering;
 static int advertise_sid;
 static struct shallow_lock shallow_lock;
 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 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);
 }
 
-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,
                                 int fd[2],
                                 const struct ref *orig_ref,
@@ -1017,7 +1002,6 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        int agent_len;
        struct fetch_negotiator negotiator_alloc;
        struct fetch_negotiator *negotiator;
-       struct oidset gitmodules_oids = OIDSET_INIT;
 
        negotiator = &negotiator_alloc;
        fetch_negotiator_init(r, negotiator);
@@ -1134,9 +1118,10 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        else
                alternate_shallow_file = NULL;
        if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
-                    &gitmodules_oids))
+                    &fsck_options.gitmodules_found))
                die(_("git fetch-pack: fetch failed."));
-       fsck_gitmodules_oids(&gitmodules_oids);
+       if (fsck_finish(&fsck_options))
+               die("fsck failed");
 
  all_done:
        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;
        int i;
        struct strvec index_pack_args = STRVEC_INIT;
-       struct oidset gitmodules_oids = OIDSET_INIT;
 
        negotiator = &negotiator_alloc;
        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);
                        if (get_pack(args, fd, pack_lockfiles,
                                     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."));
                        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';
 
-               parse_gitmodules_oids(cmd.out, &gitmodules_oids);
+               parse_gitmodules_oids(cmd.out, &fsck_options.gitmodules_found);
 
                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);
        strvec_clear(&index_pack_args);
 
-       fsck_gitmodules_oids(&gitmodules_oids);
+       if (fsck_finish(&fsck_options))
+               die("fsck failed");
 
        if (negotiator)
                negotiator->release(negotiator);
diff --git a/fsck.c b/fsck.c
index 642bd2ef9dadff088299e58c78932312913a5c39..f5ed6a263583f094f973be5f7db40b2457cccf17 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -1196,11 +1196,6 @@ int fsck_error_function(struct fsck_options *o,
        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 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);
 }
+
+/*
+ * 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);
+}
diff --git a/fsck.h b/fsck.h
index e20f9bcb3940ae101c15f7d0762a334ab5a9b281..7202c3c87e8b94d3ba7811a21dca5cdbb46f81e5 100644 (file)
--- a/fsck.h
+++ b/fsck.h
@@ -111,6 +111,12 @@ int fsck_error_function(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);
+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 {
        fsck_walk_func walk;
@@ -135,6 +141,12 @@ struct fsck_options {
        .gitmodules_done = OIDSET_INIT, \
        .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
  * 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,
        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
  * exposed fsck_object() internals for git-mktag(1).