169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
| #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
 |