#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