From: Jeff Hostetler <g...@jeffhostetler.com>

Teach clone to accept --partial-by-size=n and --partial-special
arguments to request that the server omit certain blobs from
the generated packfile.

Signed-off-by: Jeff Hostetler <jeffh...@microsoft.com>
---
 builtin/clone.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/builtin/clone.c b/builtin/clone.c
index 3f63edb..e5a5904 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -56,6 +56,8 @@ static struct string_list option_required_reference = 
STRING_LIST_INIT_NODUP;
 static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP;
 static int option_dissociate;
 static int max_jobs = -1;
+static const char *partial_by_size;
+static int partial_special;
 
 static struct option builtin_clone_options[] = {
        OPT__VERBOSITY(&option_verbosity),
@@ -112,6 +114,11 @@ static struct option builtin_clone_options[] = {
                        TRANSPORT_FAMILY_IPV4),
        OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
                        TRANSPORT_FAMILY_IPV6),
+       OPT_STRING(0, "partial-by-size", &partial_by_size,
+                          N_("size"),
+                          N_("only include blobs smaller than this")),
+       OPT_BOOL(0, "partial-special", &partial_special,
+                        N_("only include blobs for git special files")),
        OPT_END()
 };
 
@@ -625,6 +632,9 @@ static void update_remote_refs(const struct ref *refs,
        if (check_connectivity) {
                struct check_connected_options opt = CHECK_CONNECTED_INIT;
 
+               if (partial_by_size || partial_special)
+                       opt.allow_partial = 1;
+
                opt.transport = transport;
                opt.progress = transport->progress;
 
@@ -1021,6 +1031,10 @@ int cmd_clone(int argc, const char **argv, const char 
*prefix)
                        warning(_("--shallow-since is ignored in local clones; 
use file:// instead."));
                if (option_not.nr)
                        warning(_("--shallow-exclude is ignored in local 
clones; use file:// instead."));
+               if (partial_by_size)
+                       warning(_("--partial-by-size is ignored in local 
clones; use file:// instead."));
+               if (partial_special)
+                       warning(_("--partial-special is ignored in local 
clones; use file:// instead."));
                if (!access(mkpath("%s/shallow", path), F_OK)) {
                        if (option_local > 0)
                                warning(_("source repository is shallow, 
ignoring --local"));
@@ -1052,6 +1066,18 @@ int cmd_clone(int argc, const char **argv, const char 
*prefix)
                transport_set_option(transport, TRANS_OPT_UPLOADPACK,
                                     option_upload_pack);
 
+       if (partial_by_size) {
+               transport_set_option(transport, TRANS_OPT_PARTIAL_BY_SIZE,
+                                    partial_by_size);
+               if (transport->smart_options)
+                       transport->smart_options->partial_by_size = 
partial_by_size;
+       }
+       if (partial_special) {
+               transport_set_option(transport, TRANS_OPT_PARTIAL_SPECIAL, 
"yes");
+               if (transport->smart_options)
+                       transport->smart_options->partial_special = 1;
+       }
+
        if (transport->smart_options && !deepen)
                transport->smart_options->check_self_contained_and_connected = 
1;
 
-- 
2.7.4

Reply via email to