зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
acb0c57260
Коммит
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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче