]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: download bundles once, even with --all
authorDerrick Stolee <derrickstolee@github.com>
Fri, 31 Mar 2023 15:59:04 +0000 (15:59 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 31 Mar 2023 17:07:33 +0000 (10:07 -0700)
When fetch.bundleURI is set, 'git fetch' downloads bundles from the
given bundle URI before fetching from the specified remote. However,
when using non-file remotes, 'git fetch --all' will launch 'git fetch'
subprocesses which then read fetch.bundleURI and fetch the bundle list
again. We do not expect the bundle list to have new information during
these multiple runs, so avoid these extra calls by un-setting
fetch.bundleURI in the subprocess arguments.

Be careful to skip fetching bundles for the empty bundle string.
Fetching bundles from the empty list presents some interesting test
failures.

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

index 7221e57f3529f22104b55a7200d5df04c2c4e63d..8d8b2e0c26fdc7883c9b34354c2283adef81d7e9 100644 (file)
@@ -1955,7 +1955,12 @@ static int fetch_multiple(struct string_list *list, int max_children)
                        return errcode;
        }
 
-       strvec_pushl(&argv, "fetch", "--append", "--no-auto-gc",
+       /*
+        * Cancel out the fetch.bundleURI config when running subprocesses,
+        * to avoid fetching from the same bundle list multiple times.
+        */
+       strvec_pushl(&argv, "-c", "fetch.bundleURI=",
+                    "fetch", "--append", "--no-auto-gc",
                     "--no-write-commit-graph", NULL);
        add_options_to_argv(&argv);
 
index 177c18104022ac23a87bdc21e51f3c5073ebb855..56390651b920533bac5eb90e9eb6c0f05992f71a 100644 (file)
@@ -792,6 +792,15 @@ int fetch_bundle_uri(struct repository *r, const char *uri,
 
        init_bundle_list(&list);
 
+       /*
+        * Do not fetch a NULL or empty bundle URI. An empty bundle URI
+        * could signal that a configured bundle URI has been disabled.
+        */
+       if (!uri || !*uri) {
+               result = 0;
+               goto cleanup;
+       }
+
        /* If a bundle is added to this global list, then it is required. */
        list.mode = BUNDLE_MODE_ALL;
 
index afd56926c5371b90eaf42d5823541f6f93788ba1..996a08e90c9c2c5b2c37405b1b3082e82d29a7e8 100755 (executable)
@@ -1018,6 +1018,40 @@ test_expect_success 'creationToken heuristic with failed downloads (fetch)' '
        test_cmp expect refs
 '
 
+test_expect_success 'bundles are downloaded once during fetch --all' '
+       test_when_finished rm -rf download-* trace*.txt fetch-mult &&
+
+       cat >"$HTTPD_DOCUMENT_ROOT_PATH/bundle-list" <<-EOF &&
+       [bundle]
+               version = 1
+               mode = all
+               heuristic = creationToken
+
+       [bundle "bundle-1"]
+               uri = bundle-1.bundle
+               creationToken = 1
+
+       [bundle "bundle-2"]
+               uri = bundle-2.bundle
+               creationToken = 2
+
+       [bundle "bundle-3"]
+               uri = bundle-3.bundle
+               creationToken = 3
+       EOF
+
+       git clone --single-branch --branch=left \
+               --bundle-uri="$HTTPD_URL/bundle-list" \
+               "$HTTPD_URL/smart/fetch.git" fetch-mult &&
+       git -C fetch-mult remote add dup1 "$HTTPD_URL/smart/fetch.git" &&
+       git -C fetch-mult remote add dup2 "$HTTPD_URL/smart/fetch.git" &&
+
+       GIT_TRACE2_EVENT="$(pwd)/trace-mult.txt" \
+               git -C fetch-mult fetch --all &&
+       grep "\"child_start\".*\"git-remote-https\",\"$HTTPD_URL/bundle-list\"" \
+               trace-mult.txt >bundle-fetches &&
+       test_line_count = 1 bundle-fetches
+'
 # Do not add tests here unless they use the HTTP server, as they will
 # not run unless the HTTP dependencies exist.