12b0a14b9e
The logic in fetch_bundle_uri() is useful for the --bundle-uri option of 'git clone', but is not helpful when the clone operation discovers a list of URIs from the bundle-uri protocol v2 command. To actually download and unbundle the advertised bundles, we need a different mechanism. Create the new fetch_bundle_list() method which is very similar to fetch_bundle_uri() except that it relies on download_bundle_list() instead of fetch_bundle_uri_internal(). The download_bundle_list() method will recursively call fetch_bundle_uri_internal() if any of the advertised URIs serve a bundle list instead of a bundle. This will also follow the bundle.list.mode setting from the input list: "any" will download only one such URI while "all" will download data from all of the URIs. In an identical way to fetch_bundle_uri(), the bundles are unbundled after all of the bundle lists have been expanded and all necessary URIs. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
143 lines
3.5 KiB
C
143 lines
3.5 KiB
C
#ifndef BUNDLE_URI_H
|
|
#define BUNDLE_URI_H
|
|
|
|
#include "hashmap.h"
|
|
#include "strbuf.h"
|
|
|
|
struct packet_reader;
|
|
struct repository;
|
|
struct string_list;
|
|
|
|
/**
|
|
* The remote_bundle_info struct contains information for a single bundle
|
|
* URI. This may be initialized simply by a given URI or might have
|
|
* additional metadata associated with it if the bundle was advertised by
|
|
* a bundle list.
|
|
*/
|
|
struct remote_bundle_info {
|
|
struct hashmap_entry ent;
|
|
|
|
/**
|
|
* The 'id' is a name given to the bundle for reference
|
|
* by other bundle infos.
|
|
*/
|
|
char *id;
|
|
|
|
/**
|
|
* The 'uri' is the location of the remote bundle so
|
|
* it can be downloaded on-demand. This will be NULL
|
|
* if there was no table of contents.
|
|
*/
|
|
char *uri;
|
|
|
|
/**
|
|
* If the bundle has been downloaded, then 'file' is a
|
|
* filename storing its contents. Otherwise, 'file' is
|
|
* NULL.
|
|
*/
|
|
char *file;
|
|
|
|
/**
|
|
* If the bundle has been unbundled successfully, then
|
|
* this boolean is true.
|
|
*/
|
|
unsigned unbundled:1;
|
|
};
|
|
|
|
#define REMOTE_BUNDLE_INFO_INIT { 0 }
|
|
|
|
enum bundle_list_mode {
|
|
BUNDLE_MODE_NONE = 0,
|
|
BUNDLE_MODE_ALL,
|
|
BUNDLE_MODE_ANY
|
|
};
|
|
|
|
/**
|
|
* A bundle_list contains an unordered set of remote_bundle_info structs,
|
|
* as well as information about the bundle listing, such as version and
|
|
* mode.
|
|
*/
|
|
struct bundle_list {
|
|
int version;
|
|
enum bundle_list_mode mode;
|
|
struct hashmap bundles;
|
|
|
|
/**
|
|
* The baseURI of a bundle_list is the URI that provided the list.
|
|
*
|
|
* In the case of the 'bundle-uri' protocol v2 command, the base
|
|
* URI is the URI of the Git remote.
|
|
*
|
|
* Otherwise, the bundle list was downloaded over HTTP from some
|
|
* known URI. 'baseURI' is set to that value.
|
|
*
|
|
* The baseURI is used as the base for any relative URIs
|
|
* advertised by the bundle list at that location.
|
|
*/
|
|
char *baseURI;
|
|
};
|
|
|
|
void init_bundle_list(struct bundle_list *list);
|
|
void clear_bundle_list(struct bundle_list *list);
|
|
|
|
typedef int (*bundle_iterator)(struct remote_bundle_info *bundle,
|
|
void *data);
|
|
|
|
int for_all_bundles_in_list(struct bundle_list *list,
|
|
bundle_iterator iter,
|
|
void *data);
|
|
|
|
struct FILE;
|
|
void print_bundle_list(FILE *fp, struct bundle_list *list);
|
|
|
|
/**
|
|
* A bundle URI may point to a bundle list where the key=value
|
|
* pairs are provided in config file format. This method is
|
|
* exposed publicly for testing purposes.
|
|
*/
|
|
int bundle_uri_parse_config_format(const char *uri,
|
|
const char *filename,
|
|
struct bundle_list *list);
|
|
|
|
/**
|
|
* Fetch data from the given 'uri' and unbundle the bundle data found
|
|
* based on that information.
|
|
*
|
|
* Returns non-zero if no bundle information is found at the given 'uri'.
|
|
*/
|
|
int fetch_bundle_uri(struct repository *r, const char *uri);
|
|
|
|
/**
|
|
* Given a bundle list that was already advertised (likely by the
|
|
* bundle-uri protocol v2 verb) at the given uri, fetch and unbundle the
|
|
* bundles according to the bundle strategy of that list.
|
|
*
|
|
* It is expected that the given 'list' is initialized, including its
|
|
* 'baseURI' value.
|
|
*
|
|
* Returns non-zero if there was an error trying to download the list
|
|
* or any of its advertised bundles.
|
|
*/
|
|
int fetch_bundle_list(struct repository *r,
|
|
struct bundle_list *list);
|
|
|
|
/**
|
|
* API for serve.c.
|
|
*/
|
|
int bundle_uri_advertise(struct repository *r, struct strbuf *value);
|
|
int bundle_uri_command(struct repository *r, struct packet_reader *request);
|
|
|
|
/**
|
|
* General API for {transport,connect}.c etc.
|
|
*/
|
|
|
|
/**
|
|
* Parse a "key=value" packet line from the bundle-uri verb.
|
|
*
|
|
* Returns 0 on success and non-zero on error.
|
|
*/
|
|
int bundle_uri_parse_line(struct bundle_list *list,
|
|
const char *line);
|
|
|
|
#endif
|