You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.2 KiB
168 lines
4.2 KiB
#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
|
|
|