Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Stolee <derrickstolee@github.com>2022-10-12 15:52:33 +0300
committerJunio C Hamano <gitster@pobox.com>2022-10-12 19:13:24 +0300
commit738e5245fa423fc43495e2e17e053365dc6b2fc0 (patch)
treebf89e0f0b38a201e8b814b2881583817a36158f0 /t/helper/test-bundle-uri.c
parentd796cedbe8ca77310a7dabcafe60b040aa0e2b67 (diff)
bundle-uri: parse bundle list in config format
When a bundle provider wants to operate independently from a Git remote, they want to provide a single, consistent URI that users can use in their 'git clone --bundle-uri' commands. At this point, the Git client expects that URI to be a single bundle that can be unbundled and used to bootstrap the rest of the clone from the Git server. This single bundle cannot be re-used to assist with future incremental fetches. To allow for the incremental fetch case, teach Git to understand a bundle list that could be advertised at an independent bundle URI. Such a bundle list is likely to be inspected by human readers, even if only by the bundle provider creating the list. For this reason, we can take our expected "key=value" pairs and instead format them using Git config format. Create bundle_uri_parse_config_format() to parse a file in config format and convert that into a 'struct bundle_list' filled with its understanding of the contents. Be careful to use error_action CONFIG_ERROR_ERROR when calling git_config_from_file_with_options() because the default action for git_config_from_file() is to die() on a parsing error. The current warning isn't particularly helpful if it arises to a user, but it will be made more verbose at a higher layer later. Update 'test-tool bundle-uri' to take this config file format as input. It uses a filename instead of stdin because there is no existing way to parse a FILE pointer in the config machinery. Using git_config_from_mem() is overly complicated and more likely to introduce bugs than this simpler version. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/helper/test-bundle-uri.c')
-rw-r--r--t/helper/test-bundle-uri.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/t/helper/test-bundle-uri.c b/t/helper/test-bundle-uri.c
index 0329c56544..25afd39342 100644
--- a/t/helper/test-bundle-uri.c
+++ b/t/helper/test-bundle-uri.c
@@ -4,12 +4,21 @@
#include "strbuf.h"
#include "string-list.h"
-static int cmd__bundle_uri_parse(int argc, const char **argv)
+enum input_mode {
+ KEY_VALUE_PAIRS,
+ CONFIG_FILE,
+};
+
+static int cmd__bundle_uri_parse(int argc, const char **argv, enum input_mode mode)
{
const char *key_value_usage[] = {
"test-tool bundle-uri parse-key-values <input>",
NULL
};
+ const char *config_usage[] = {
+ "test-tool bundle-uri parse-config <input>",
+ NULL
+ };
const char **usage = key_value_usage;
struct option options[] = {
OPT_END(),
@@ -19,21 +28,35 @@ static int cmd__bundle_uri_parse(int argc, const char **argv)
int err = 0;
FILE *fp;
- argc = parse_options(argc, argv, NULL, options, usage, 0);
- if (argc != 1)
- goto usage;
+ if (mode == CONFIG_FILE)
+ usage = config_usage;
+
+ argc = parse_options(argc, argv, NULL, options, usage,
+ PARSE_OPT_STOP_AT_NON_OPTION);
init_bundle_list(&list);
- fp = fopen(argv[0], "r");
- if (!fp)
- die("failed to open '%s'", argv[0]);
- while (strbuf_getline(&sb, fp) != EOF) {
- if (bundle_uri_parse_line(&list, sb.buf))
- err = error("bad line: '%s'", sb.buf);
+ switch (mode) {
+ case KEY_VALUE_PAIRS:
+ if (argc != 1)
+ goto usage;
+ fp = fopen(argv[0], "r");
+ if (!fp)
+ die("failed to open '%s'", argv[0]);
+ while (strbuf_getline(&sb, fp) != EOF) {
+ if (bundle_uri_parse_line(&list, sb.buf))
+ err = error("bad line: '%s'", sb.buf);
+ }
+ fclose(fp);
+ break;
+
+ case CONFIG_FILE:
+ if (argc != 1)
+ goto usage;
+ err = bundle_uri_parse_config_format("<uri>", argv[0], &list);
+ break;
}
strbuf_release(&sb);
- fclose(fp);
print_bundle_list(stdout, &list);
@@ -62,7 +85,9 @@ int cmd__bundle_uri(int argc, const char **argv)
goto usage;
if (!strcmp(argv[1], "parse-key-values"))
- return cmd__bundle_uri_parse(argc - 1, argv + 1);
+ return cmd__bundle_uri_parse(argc - 1, argv + 1, KEY_VALUE_PAIRS);
+ if (!strcmp(argv[1], "parse-config"))
+ return cmd__bundle_uri_parse(argc - 1, argv + 1, CONFIG_FILE);
error("there is no test-tool bundle-uri tool '%s'", argv[1]);
usage: