]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bundle-uri: quiet failed unbundlings
authorDerrick Stolee <derrickstolee@github.com>
Wed, 12 Oct 2022 12:52:38 +0000 (12:52 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 Oct 2022 16:13:25 +0000 (09:13 -0700)
When downloading a list of bundles in "all" mode, Git has no
understanding of the dependencies between the bundles. Git attempts to
unbundle the bundles in some order, but some may not pass the
verify_bundle() step because of missing prerequisites. This is passed as
error messages to the user, even when they eventually succeed in later
attempts after their dependent bundles are unbundled.

Add a new VERIFY_BUNDLE_QUIET flag to verify_bundle() that avoids the
error messages from the missing prerequisite commits. The method still
returns the number of missing prerequisit commits, allowing callers to
unbundle() to notice that the bundle failed to apply.

Use this flag in bundle-uri.c and test that the messages go away for
'git clone --bundle-uri' commands.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/bundle.c
bundle-uri.c
bundle.c
bundle.h
t/t5558-clone-bundle-uri.sh

index 7d983a238f0bad6c5a336be7fca4c4166023cadf..fd4586b09e0f8327eedb93f0b10dc3380e66bd53 100644 (file)
@@ -120,7 +120,7 @@ static int cmd_bundle_verify(int argc, const char **argv, const char *prefix) {
        }
        close(bundle_fd);
        if (verify_bundle(the_repository, &header,
-                         quiet ? 0 : VERIFY_BUNDLE_VERBOSE)) {
+                         quiet ? VERIFY_BUNDLE_QUIET : VERIFY_BUNDLE_VERBOSE)) {
                ret = 1;
                goto cleanup;
        }
index d9060be707e3a1e279d27d3c108d72dd5b938ba1..d872acf5ab054eeee835e0b455c0c21f1b6c351c 100644 (file)
@@ -308,7 +308,8 @@ 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.
         */
-       if ((result = unbundle(r, &header, bundle_fd, NULL, 0)))
+       if ((result = unbundle(r, &header, bundle_fd, NULL,
+                              VERIFY_BUNDLE_QUIET)))
                return 1;
 
        /*
index 1f6a7f782e163d9cc79ad90e1583e11bf87c47a0..4ef7256aa11e8b43691f238970da6c6bf21cd4ee 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -216,7 +216,10 @@ int verify_bundle(struct repository *r,
                        add_pending_object(&revs, o, name);
                        continue;
                }
-               if (++ret == 1)
+               ret++;
+               if (flags & VERIFY_BUNDLE_QUIET)
+                       continue;
+               if (ret == 1)
                        error("%s", message);
                error("%s %s", oid_to_hex(oid), name);
        }
@@ -243,7 +246,10 @@ int verify_bundle(struct repository *r,
                assert(o); /* otherwise we'd have returned early */
                if (o->flags & SHOWN)
                        continue;
-               if (++ret == 1)
+               ret++;
+               if (flags & VERIFY_BUNDLE_QUIET)
+                       continue;
+               if (ret == 1)
                        error("%s", message);
                error("%s %s", oid_to_hex(oid), name);
        }
index 6652e81998162bbe50e0282fbf8a05f06cd5ff84..575c34245d1ed448ac9dd5f20e4cf13cbd7f8a97 100644 (file)
--- a/bundle.h
+++ b/bundle.h
@@ -32,6 +32,7 @@ int create_bundle(struct repository *r, const char *path,
 
 enum verify_bundle_flags {
        VERIFY_BUNDLE_VERBOSE = (1 << 0),
+       VERIFY_BUNDLE_QUIET = (1 << 1),
 };
 
 int verify_bundle(struct repository *r, struct bundle_header *header,
index a86dc04f5285f57544a4daad9160059007ea9cf3..9b1590783866ab8493909d1daaa9837e912ddd02 100755 (executable)
@@ -99,7 +99,10 @@ test_expect_success 'clone bundle list (file, no heuristic)' '
                uri = file://$(pwd)/clone-from/bundle-4.bundle
        EOF
 
-       git clone --bundle-uri="file://$(pwd)/bundle-list" clone-from clone-list-file &&
+       git clone --bundle-uri="file://$(pwd)/bundle-list" \
+               clone-from clone-list-file 2>err &&
+       ! grep "Repository lacks these prerequisite commits" err &&
+
        git -C clone-from for-each-ref --format="%(objectname)" >oids &&
        git -C clone-list-file cat-file --batch-check <oids &&
 
@@ -141,7 +144,10 @@ test_expect_success 'clone bundle list (file, all mode, some failures)' '
        EOF
 
        GIT_TRACE2_PERF=1 \
-       git clone --bundle-uri="file://$(pwd)/bundle-list" clone-from clone-all-some &&
+       git clone --bundle-uri="file://$(pwd)/bundle-list" \
+               clone-from clone-all-some 2>err &&
+       ! grep "Repository lacks these prerequisite commits" err &&
+
        git -C clone-from for-each-ref --format="%(objectname)" >oids &&
        git -C clone-all-some cat-file --batch-check <oids &&
 
@@ -169,7 +175,10 @@ test_expect_success 'clone bundle list (file, all mode, all failures)' '
                uri = file://$(pwd)/clone-from/bundle-5.bundle
        EOF
 
-       git clone --bundle-uri="file://$(pwd)/bundle-list" clone-from clone-all-fail &&
+       git clone --bundle-uri="file://$(pwd)/bundle-list" \
+               clone-from clone-all-fail 2>err &&
+       ! grep "Repository lacks these prerequisite commits" err &&
+
        git -C clone-from for-each-ref --format="%(objectname)" >oids &&
        git -C clone-all-fail cat-file --batch-check <oids &&
 
@@ -195,7 +204,10 @@ test_expect_success 'clone bundle list (file, any mode)' '
                uri = file://$(pwd)/clone-from/bundle-5.bundle
        EOF
 
-       git clone --bundle-uri="file://$(pwd)/bundle-list" clone-from clone-any-file &&
+       git clone --bundle-uri="file://$(pwd)/bundle-list" \
+               clone-from clone-any-file 2>err &&
+       ! grep "Repository lacks these prerequisite commits" err &&
+
        git -C clone-from for-each-ref --format="%(objectname)" >oids &&
        git -C clone-any-file cat-file --batch-check <oids &&
 
@@ -284,7 +296,10 @@ test_expect_success 'clone bundle list (HTTP, no heuristic)' '
                uri = $HTTPD_URL/bundle-4.bundle
        EOF
 
-       git clone --bundle-uri="$HTTPD_URL/bundle-list" clone-from clone-list-http &&
+       git clone --bundle-uri="$HTTPD_URL/bundle-list" \
+               clone-from clone-list-http  2>err &&
+       ! grep "Repository lacks these prerequisite commits" err &&
+
        git -C clone-from for-each-ref --format="%(objectname)" >oids &&
        git -C clone-list-http cat-file --batch-check <oids
 '