Merge branch 'ds/fetch-bundle-uri-with-all'

"git fetch --all" does not have to download and handle the same
bundleURI over and over, which has been corrected.

* ds/fetch-bundle-uri-with-all:
  fetch: download bundles once, even with --all
This commit is contained in:
Junio C Hamano 2023-04-06 13:38:32 -07:00
commit 89833fc249
3 changed files with 49 additions and 1 deletions

View File

@ -1967,7 +1967,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);

View File

@ -794,6 +794,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;

View File

@ -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.