@@ -270,6 +270,24 @@ int opt_parse_list_objects_filter(const struct option *opt,
return 0;
}
+int opt_set_blob_none_filter(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct strbuf filter_arg = STRBUF_INIT;
+ struct list_objects_filter_options *filter_options = opt->value;
+
+ if (unset || !arg || !strcmp(arg, "0")) {
+ parse_list_objects_filter(filter_options, "blob:none");
+ return 0;
+ }
+
+ strbuf_addf(&filter_arg, "blob:limit=%s", arg);
+ parse_list_objects_filter(filter_options, filter_arg.buf);
+ strbuf_release(&filter_arg);
+
+ return 0;
+}
+
const char *list_objects_filter_spec(struct list_objects_filter_options *filter)
{
if (!filter->filter_spec.nr)
@@ -62,6 +62,7 @@ struct list_objects_filter_options {
/* Normalized command line arguments */
#define CL_ARG__FILTER "filter"
+#define CL_ARG__PARTIAL "partial"
void list_objects_filter_die_if_populated(
struct list_objects_filter_options *filter_options);
@@ -80,11 +81,16 @@ void parse_list_objects_filter(
int opt_parse_list_objects_filter(const struct option *opt,
const char *arg, int unset);
+int opt_set_blob_none_filter(const struct option *opt,
+ const char *arg, int unset);
#define OPT_PARSE_LIST_OBJECTS_FILTER(fo) \
{ OPTION_CALLBACK, 0, CL_ARG__FILTER, fo, N_("args"), \
N_("object filtering"), 0, \
- opt_parse_list_objects_filter }
+ opt_parse_list_objects_filter }, \
+ { OPTION_CALLBACK, 0, CL_ARG__PARTIAL, fo, N_("size"), \
+ N_("partial clone with blob filter"), \
+ PARSE_OPT_OPTARG | PARSE_OPT_NONEG , opt_set_blob_none_filter }
/*
* Translates abbreviated numbers in the filter's filter_spec into their
@@ -33,17 +33,39 @@ test_expect_success 'setup bare clone for server' '
# confirm we are missing all of the known blobs.
# confirm partial clone was registered in the local config.
test_expect_success 'do partial clone 1' '
- git clone --no-checkout --filter=blob:none "file://$(pwd)/srv.bare" pc1 &&
-
- git -C pc1 rev-list --quiet --objects --missing=print HEAD >revs &&
- awk -f print_1.awk revs |
- sed "s/?//" |
- sort >observed.oids &&
+ for option in "--filter=blob:none" "--partial"
+ do
+ rm -rf pc1 &&
+ git clone --no-checkout "$option" "file://$(pwd)/srv.bare" pc1 &&
+
+ git -C pc1 rev-list --quiet --objects --missing=print HEAD >revs &&
+ awk -f print_1.awk revs |
+ sed "s/?//" |
+ sort >observed.oids &&
+
+ test_cmp expect_1.oids observed.oids &&
+ test "$(git -C pc1 config --local core.repositoryformatversion)" = "1" &&
+ test "$(git -C pc1 config --local remote.origin.promisor)" = "true" &&
+ test "$(git -C pc1 config --local remote.origin.partialclonefilter)" = "blob:none"
+ done
+'
- test_cmp expect_1.oids observed.oids &&
- test "$(git -C pc1 config --local core.repositoryformatversion)" = "1" &&
- test "$(git -C pc1 config --local remote.origin.promisor)" = "true" &&
- test "$(git -C pc1 config --local remote.origin.partialclonefilter)" = "blob:none"
+test_expect_success 'do partial clone with size limit' '
+ for option in "--filter=blob:limit=1" "--partial=1"
+ do
+ rm -rf pc-limit &&
+ git clone --no-checkout "$option" "file://$(pwd)/srv.bare" pc-limit &&
+
+ git -C pc-limit rev-list --quiet --objects --missing=print HEAD >revs &&
+ awk -f print_1.awk revs |
+ sed "s/?//" |
+ sort >observed.oids &&
+
+ test_cmp expect_1.oids observed.oids &&
+ test "$(git -C pc-limit config --local core.repositoryformatversion)" = "1" &&
+ test "$(git -C pc-limit config --local remote.origin.promisor)" = "true" &&
+ test "$(git -C pc-limit config --local remote.origin.partialclonefilter)" = "blob:limit=1"
+ done
'
test_expect_success 'verify that .promisor file contains refs fetched' '