This is the first of series towards building the bundle URI feature as discussed in previous RFCs, specifically pulled directly out of [5]: [1] https://lore.kernel.org/git/RFC-cover-00.13-0000000000-20210805T150534Z-avarab@xxxxxxxxx/ [2] https://lore.kernel.org/git/cover-0.3-00000000000-20211025T211159Z-avarab@xxxxxxxxx/ [3] https://lore.kernel.org/git/pull.1160.git.1645641063.gitgitgadget@xxxxxxxxx [4] https://lore.kernel.org/git/RFC-cover-v2-00.36-00000000000-20220418T165545Z-avarab@xxxxxxxxx/ [5] https://lore.kernel.org/git/pull.1234.git.1653072042.gitgitgadget@xxxxxxxxx The first patch details the long-term design and goals of the bundle URI feature, including complicated features such as the bundle-uri protocol v2 verb and bundle lists with heuristics. However, then intention is to start small with the simplest features that allow user benefit as soon as possible. In that direction, the rest of this series creates the ability to run 'git fetch --bundle-uri=' to skip fetching from any remote and instead download the file at the given . Currently, that data is expected to be a bundle, which Git will then unbundle and modify the refs to be in the 'refs/bundle/' namespace. Currently, the can be a literal filename, a file:// URI, or an http[s]:// URI. Tests are added for both of these cases. As outlined in [5], the next steps after this are: 1. Add 'git clone --bundle-uri=' to run this 'git fetch --bundle-uri=' step before doing a fetch negotiation with the origin remote. 2. Allow parsing a bundle list as a config file at the given URI. The key-value format is unified with the protocol v2 verb (coming in (3)). 3. Implement the protocol v2 verb, re-using the bundle list logic from (2). Use this to auto-discover bundle URIs during 'git clone' (behind a config option). 4. Implement the 'timestamp' heuristic, allowing incremental 'git fetch' commands to download a bundle list from a configured URI, and only download bundles that are new based on the timestamp values. As mentioned in the design document, this is not all that is possible. For instance, Ævar's suggestion to download only the bundle headers can be used as a second heuristic (and as an augmentation of the timestamp heuristic). Thanks, -Stolee Derrick Stolee (6): docs: document bundle URI standard remote-curl: add 'get' capability bundle-uri: create basic file-copy logic fetch: add --bundle-uri option bundle-uri: add support for http(s):// and file:// fetch: add 'refs/bundle/' to log.excludeDecoration Documentation/fetch-options.txt | 6 + Documentation/git-fetch.txt | 1 + Documentation/gitremote-helpers.txt | 9 + Documentation/technical/bundle-uri.txt | 475 +++++++++++++++++++++++++ Makefile | 1 + builtin/fetch.c | 10 + bundle-uri.c | 166 +++++++++ bundle-uri.h | 14 + remote-curl.c | 33 ++ t/t5557-http-get.sh | 37 ++ t/t5558-fetch-bundle-uri.sh | 77 ++++ transport-helper.c | 5 +- 12 files changed, 833 insertions(+), 1 deletion(-) create mode 100644 Documentation/technical/bundle-uri.txt create mode 100644 bundle-uri.c create mode 100644 bundle-uri.h create mode 100755 t/t5557-http-get.sh create mode 100755 t/t5558-fetch-bundle-uri.sh base-commit: 89c6e450fe4a919ecb6fa698005a935531c732cf Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1248%2Fderrickstolee%2Fbundle-redo%2Ffetch-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1248/derrickstolee/bundle-redo/fetch-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/1248 -- gitgitgadget