#ifndef BUNDLE_URI_H #define BUNDLE_URI_H #include "hashmap.h" #include "strbuf.h" 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; }; 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); /** * 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