| #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 |