Derrick Stolee via GitGitGadget wrote: > diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt > index cd65d236b43..4f796218aab 100644 > --- a/Documentation/config/fetch.txt > +++ b/Documentation/config/fetch.txt > @@ -96,3 +96,11 @@ fetch.writeCommitGraph:: > merge and the write may take longer. Having an updated commit-graph > file helps performance of many Git commands, including `git merge-base`, > `git push -f`, and `git log --graph`. Defaults to false. > + > +fetch.bundleURI:: > + This value stores a URI for fetching Git object data from a bundle URI > + before performing an incremental fetch from the origin Git server. If > + the value is `<uri>` then running `git fetch <args>` is equivalent to > + first running `git fetch --bundle-uri=<uri>` immediately before > + `git fetch <args>`. See details of the `--bundle-uri` option in > + linkgit:git-fetch[1]. Since it's not mentioned from this or any other user-facing documentation (AFAICT), could you note that this value is set automatically by 'git clone' iff '--bundle-uri' is specified *and* 'bundle.heuristic' is set for the initially downloaded bundle list? It would also be nice to make note of that behavior in the documentation of the '--bundle-uri' option in 'Documentation/git-clone.txt', since command documentation in general seems to be more popular/visible to users than config docs. > diff --git a/builtin/clone.c b/builtin/clone.c > index 5453ba5277f..5370617664d 100644 > --- a/builtin/clone.c > +++ b/builtin/clone.c > @@ -1248,12 +1248,16 @@ int cmd_clone(int argc, const char **argv, const char *prefix) > * data from the --bundle-uri option. > */ > if (bundle_uri) { > + int has_heuristic = 0; > + > /* At this point, we need the_repository to match the cloned repo. */ > if (repo_init(the_repository, git_dir, work_tree)) > warning(_("failed to initialize the repo, skipping bundle URI")); > - else if (fetch_bundle_uri(the_repository, bundle_uri)) > + else if (fetch_bundle_uri(the_repository, bundle_uri, &has_heuristic)) > warning(_("failed to fetch objects from bundle URI '%s'"), > bundle_uri); > + else if (has_heuristic) > + git_config_set_gently("fetch.bundleuri", bundle_uri); If the heuristic is anything other than "none", this config value is set in the repository-scoped config file. Makes sense! > } > > strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD"); > diff --git a/bundle-uri.c b/bundle-uri.c > index b30c85ba6f2..1dbbbb980eb 100644 > --- a/bundle-uri.c > +++ b/bundle-uri.c > @@ -594,9 +594,10 @@ static int fetch_bundle_list_in_config_format(struct repository *r, > * it advertises are expected to be bundles, not nested lists. > * We can drop 'global_list' and 'depth'. > */ > - if (list_from_bundle.heuristic == BUNDLE_HEURISTIC_CREATIONTOKEN) > + if (list_from_bundle.heuristic == BUNDLE_HEURISTIC_CREATIONTOKEN) { > result = fetch_bundles_by_token(r, &list_from_bundle); > - else if ((result = download_bundle_list(r, &list_from_bundle, > + global_list->heuristic = BUNDLE_HEURISTIC_CREATIONTOKEN; If the 'heuristic' field already existed and was being used to apply bundles, why wasn't 'global_list->heuristic' already being set? Before this patch, was the 'global_list->heuristic' field not accurately reflecting the heuristic type of a given bundle list? If so, I think it'd make sense to move this section to patch 4 [1], since that's when the heuristic is first applied to the bundle list. [1] https://lore.kernel.org/git/57c0174d3752fb61a05e0653de9d3057616ed16a.1673037405.git.gitgitgadget@xxxxxxxxx/ > diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh > index d7461ec907e..8ff560425ee 100755 > --- a/t/t5558-clone-bundle-uri.sh > +++ b/t/t5558-clone-bundle-uri.sh > @@ -435,6 +435,39 @@ test_expect_success 'clone bundle list (http, creationToken)' ' > test_bundle_downloaded bundle-2.bundle trace-clone.txt > ' > > +test_expect_success 'http clone with bundle.heuristic creates fetch.bundleURI' ' > + test_when_finished rm -rf fetch-http-4 trace*.txt && > + > + cat >"$HTTPD_DOCUMENT_ROOT_PATH/bundle-list" <<-EOF && > + [bundle] > + version = 1 > + mode = all > + heuristic = creationToken > + > + [bundle "bundle-1"] > + uri = bundle-1.bundle > + creationToken = 1 > + EOF > + > + GIT_TRACE2_EVENT="$(pwd)/trace-clone.txt" \ > + git clone --single-branch --branch=base \ > + --bundle-uri="$HTTPD_URL/bundle-list" \ > + "$HTTPD_URL/smart/fetch.git" fetch-http-4 && > + > + test_cmp_config -C fetch-http-4 "$HTTPD_URL/bundle-list" fetch.bundleuri && > + > + # The clone should copy two files: the list and bundle-1. > + test_bundle_downloaded bundle-list trace-clone.txt && > + test_bundle_downloaded bundle-1.bundle trace-clone.txt && > + > + # only received base ref from bundle-1 > + git -C fetch-http-4 for-each-ref --format="%(refname)" "refs/bundles/*" >refs && > + cat >expect <<-\EOF && > + refs/bundles/base > + EOF > + test_cmp expect refs > +' This test looks good - it verifies the config update, bundle download, and unbundle all work as intended. > + > # Do not add tests here unless they use the HTTP server, as they will > # not run unless the HTTP dependencies exist. >