partial-clone: define partial clone settings in config
Create get and set routines for "partial clone" config settings. These will be used in a future commit by clone and fetch to remember the promisor remote and the default filter-spec. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									acb0c57260
								
							
						
					
					
						commit
						1e1e39b308
					
				
							
								
								
									
										1
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										1
									
								
								cache.h
								
								
								
								
							|  | @ -861,6 +861,7 @@ extern int grafts_replace_parents; | |||
| #define GIT_REPO_VERSION_READ 1 | ||||
| extern int repository_format_precious_objects; | ||||
| extern char *repository_format_partial_clone; | ||||
| extern const char *core_partial_clone_filter_default; | ||||
|  | ||||
| struct repository_format { | ||||
| 	int version; | ||||
|  |  | |||
							
								
								
									
										5
									
								
								config.c
								
								
								
								
							
							
						
						
									
										5
									
								
								config.c
								
								
								
								
							|  | @ -1241,6 +1241,11 @@ static int git_default_core_config(const char *var, const char *value) | |||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (!strcmp(var, "core.partialclonefilter")) { | ||||
| 		return git_config_string(&core_partial_clone_filter_default, | ||||
| 					 var, value); | ||||
| 	} | ||||
|  | ||||
| 	/* Add other config variables here and to Documentation/config.txt. */ | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -28,6 +28,7 @@ int warn_on_object_refname_ambiguity = 1; | |||
| int ref_paranoia = -1; | ||||
| int repository_format_precious_objects; | ||||
| char *repository_format_partial_clone; | ||||
| const char *core_partial_clone_filter_default; | ||||
| const char *git_commit_encoding; | ||||
| const char *git_log_output_encoding; | ||||
| const char *apply_default_whitespace; | ||||
|  |  | |||
|  | @ -21,29 +21,36 @@ | |||
|  * subordinate commands when necessary.  We also "intern" the arg for | ||||
|  * the convenience of the current command. | ||||
|  */ | ||||
| int parse_list_objects_filter(struct list_objects_filter_options *filter_options, | ||||
| 			      const char *arg) | ||||
| static int gently_parse_list_objects_filter( | ||||
| 	struct list_objects_filter_options *filter_options, | ||||
| 	const char *arg, | ||||
| 	struct strbuf *errbuf) | ||||
| { | ||||
| 	const char *v0; | ||||
|  | ||||
| 	if (filter_options->choice) | ||||
| 		die(_("multiple object filter types cannot be combined")); | ||||
| 	if (filter_options->choice) { | ||||
| 		if (errbuf) { | ||||
| 			strbuf_init(errbuf, 0); | ||||
| 			strbuf_addstr( | ||||
| 				errbuf, | ||||
| 				_("multiple filter-specs cannot be combined")); | ||||
| 		} | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	filter_options->filter_spec = strdup(arg); | ||||
|  | ||||
| 	if (!strcmp(arg, "blob:none")) { | ||||
| 		filter_options->choice = LOFC_BLOB_NONE; | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (skip_prefix(arg, "blob:limit=", &v0)) { | ||||
| 		if (!git_parse_ulong(v0, &filter_options->blob_limit_value)) | ||||
| 			die(_("invalid filter-spec expression '%s'"), arg); | ||||
| 		filter_options->choice = LOFC_BLOB_LIMIT; | ||||
| 		return 0; | ||||
| 	} | ||||
| 	} else if (skip_prefix(arg, "blob:limit=", &v0)) { | ||||
| 		if (git_parse_ulong(v0, &filter_options->blob_limit_value)) { | ||||
| 			filter_options->choice = LOFC_BLOB_LIMIT; | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 	if (skip_prefix(arg, "sparse:oid=", &v0)) { | ||||
| 	} else if (skip_prefix(arg, "sparse:oid=", &v0)) { | ||||
| 		struct object_context oc; | ||||
| 		struct object_id sparse_oid; | ||||
|  | ||||
|  | @ -57,15 +64,27 @@ int parse_list_objects_filter(struct list_objects_filter_options *filter_options | |||
| 			filter_options->sparse_oid_value = oiddup(&sparse_oid); | ||||
| 		filter_options->choice = LOFC_SPARSE_OID; | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (skip_prefix(arg, "sparse:path=", &v0)) { | ||||
| 	} else if (skip_prefix(arg, "sparse:path=", &v0)) { | ||||
| 		filter_options->choice = LOFC_SPARSE_PATH; | ||||
| 		filter_options->sparse_path_value = strdup(v0); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	die(_("invalid filter-spec expression '%s'"), arg); | ||||
| 	if (errbuf) { | ||||
| 		strbuf_init(errbuf, 0); | ||||
| 		strbuf_addf(errbuf, "invalid filter-spec '%s'", arg); | ||||
| 	} | ||||
| 	memset(filter_options, 0, sizeof(*filter_options)); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int parse_list_objects_filter(struct list_objects_filter_options *filter_options, | ||||
| 			      const char *arg) | ||||
| { | ||||
| 	struct strbuf buf = STRBUF_INIT; | ||||
| 	if (gently_parse_list_objects_filter(filter_options, arg, &buf)) | ||||
| 		die("%s", buf.buf); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | @ -90,3 +109,44 @@ void list_objects_filter_release( | |||
| 	free(filter_options->sparse_path_value); | ||||
| 	memset(filter_options, 0, sizeof(*filter_options)); | ||||
| } | ||||
|  | ||||
| void partial_clone_register( | ||||
| 	const char *remote, | ||||
| 	const struct list_objects_filter_options *filter_options) | ||||
| { | ||||
| 	/* | ||||
| 	 * Record the name of the partial clone remote in the | ||||
| 	 * config and in the global variable -- the latter is | ||||
| 	 * used throughout to indicate that partial clone is | ||||
| 	 * enabled and to expect missing objects. | ||||
| 	 */ | ||||
| 	if (repository_format_partial_clone && | ||||
| 	    *repository_format_partial_clone && | ||||
| 	    strcmp(remote, repository_format_partial_clone)) | ||||
| 		die(_("cannot change partial clone promisor remote")); | ||||
|  | ||||
| 	git_config_set("core.repositoryformatversion", "1"); | ||||
| 	git_config_set("extensions.partialclone", remote); | ||||
|  | ||||
| 	repository_format_partial_clone = xstrdup(remote); | ||||
|  | ||||
| 	/* | ||||
| 	 * Record the initial filter-spec in the config as | ||||
| 	 * the default for subsequent fetches from this remote. | ||||
| 	 */ | ||||
| 	core_partial_clone_filter_default = | ||||
| 		xstrdup(filter_options->filter_spec); | ||||
| 	git_config_set("core.partialclonefilter", | ||||
| 		       core_partial_clone_filter_default); | ||||
| } | ||||
|  | ||||
| void partial_clone_get_default_filter_spec( | ||||
| 	struct list_objects_filter_options *filter_options) | ||||
| { | ||||
| 	/* | ||||
| 	 * Parse default value, but silently ignore it if it is invalid. | ||||
| 	 */ | ||||
| 	gently_parse_list_objects_filter(filter_options, | ||||
| 					 core_partial_clone_filter_default, | ||||
| 					 NULL); | ||||
| } | ||||
|  |  | |||
|  | @ -58,4 +58,10 @@ int opt_parse_list_objects_filter(const struct option *opt, | |||
| void list_objects_filter_release( | ||||
| 	struct list_objects_filter_options *filter_options); | ||||
|  | ||||
| void partial_clone_register( | ||||
| 	const char *remote, | ||||
| 	const struct list_objects_filter_options *filter_options); | ||||
| void partial_clone_get_default_filter_spec( | ||||
| 	struct list_objects_filter_options *filter_options); | ||||
|  | ||||
| #endif /* LIST_OBJECTS_FILTER_OPTIONS_H */ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Jeff Hostetler
						Jeff Hostetler