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>
This commit is contained in:

committed by
Junio C Hamano

parent
d796cedbe8
commit
738e5245fa
27
bundle-uri.c
27
bundle-uri.c
@ -173,6 +173,33 @@ static int bundle_list_update(const char *key, const char *value,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int config_to_bundle_list(const char *key, const char *value, void *data)
|
||||
{
|
||||
struct bundle_list *list = data;
|
||||
return bundle_list_update(key, value, list);
|
||||
}
|
||||
|
||||
int bundle_uri_parse_config_format(const char *uri,
|
||||
const char *filename,
|
||||
struct bundle_list *list)
|
||||
{
|
||||
int result;
|
||||
struct config_options opts = {
|
||||
.error_action = CONFIG_ERROR_ERROR,
|
||||
};
|
||||
|
||||
result = git_config_from_file_with_options(config_to_bundle_list,
|
||||
filename, list,
|
||||
&opts);
|
||||
|
||||
if (!result && list->mode == BUNDLE_MODE_NONE) {
|
||||
warning(_("bundle list at '%s' has no mode"), uri);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static char *find_temp_filename(void)
|
||||
{
|
||||
int fd;
|
||||
|
Reference in New Issue
Block a user