|  | #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; | 
|  |  | 
|  | /** | 
|  | * If the bundle is part of a list with the creationToken | 
|  | * heuristic, then we use this member for sorting the bundles. | 
|  | */ | 
|  | uint64_t creationToken; | 
|  | }; | 
|  |  | 
|  | #define REMOTE_BUNDLE_INFO_INIT { 0 } | 
|  |  | 
|  | enum bundle_list_mode { | 
|  | BUNDLE_MODE_NONE = 0, | 
|  | BUNDLE_MODE_ALL, | 
|  | BUNDLE_MODE_ANY | 
|  | }; | 
|  |  | 
|  | enum bundle_list_heuristic { | 
|  | BUNDLE_HEURISTIC_NONE = 0, | 
|  | BUNDLE_HEURISTIC_CREATIONTOKEN, | 
|  |  | 
|  | /* Must be last. */ | 
|  | BUNDLE_HEURISTIC__COUNT | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * 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; | 
|  |  | 
|  | /** | 
|  | * A list can have a heuristic, which helps reduce the number of | 
|  | * downloaded bundles. | 
|  | */ | 
|  | enum bundle_list_heuristic heuristic; | 
|  | }; | 
|  |  | 
|  | 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'. | 
|  | * | 
|  | * If the pointer 'has_heuristic' is non-NULL, then the value it points to | 
|  | * will be set to be non-zero if and only if the fetched list has a | 
|  | * heuristic value. Such a value indicates that the list was designed for | 
|  | * incremental fetches. | 
|  | */ | 
|  | int fetch_bundle_uri(struct repository *r, const char *uri, | 
|  | int *has_heuristic); | 
|  |  | 
|  | /** | 
|  | * 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 |