Re: [PATCH 02/14] clone, fetch-pack, index-pack, transport: partial clone
On 11/8/2017 1:01 PM, Adam Dinwoodie wrote: On Friday 03 November 2017 at 01:32 pm -0700, Jonathan Tan wrote: On Thu, 2 Nov 2017 20:31:17 + Jeff Hostetlerwrote: diff --git a/builtin/index-pack.c b/builtin/index-pack.c index a0a35e6..31cd5ba 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -222,6 +222,16 @@ static unsigned check_object(struct object *obj) if (!(obj->flags & FLAG_CHECKED)) { unsigned long size; int type = sha1_object_info(obj->oid.hash, ); + + if (type <= 0) { + /* +* TODO Use the promisor code to conditionally +* try to fetch this object -or- assume it is ok. +*/ + obj->flags |= FLAG_CHECKED; + return 0; + } + if (type <= 0) die(_("did not receive expected object %s"), oid_to_hex(>oid)); This causes some repo corruption tests to fail. Confirmed: I see this patch, or at least f7e0dbc38 ("clone, fetch-pack, index-pack, transport: partial clone", 2017-11-02), causing t5300.26 to fail on 64-bit Cygwin. For the sake of anyone trying to reproduce this, I needed to cherry pick 66d4c7a58 ("fixup! upload-pack: add object filtering for partial clone", 2017-11-08) onto that commit before I was able to get it to compile. Adam Thanks. I've removed this from my next version. I think it was left over from a pre-promisor version. Jeff
Re: [PATCH 02/14] clone, fetch-pack, index-pack, transport: partial clone
On Friday 03 November 2017 at 01:32 pm -0700, Jonathan Tan wrote: > On Thu, 2 Nov 2017 20:31:17 + > Jeff Hostetlerwrote: > > diff --git a/builtin/index-pack.c b/builtin/index-pack.c > > index a0a35e6..31cd5ba 100644 > > --- a/builtin/index-pack.c > > +++ b/builtin/index-pack.c > > @@ -222,6 +222,16 @@ static unsigned check_object(struct object *obj) > > if (!(obj->flags & FLAG_CHECKED)) { > > unsigned long size; > > int type = sha1_object_info(obj->oid.hash, ); > > + > > + if (type <= 0) { > > + /* > > +* TODO Use the promisor code to conditionally > > +* try to fetch this object -or- assume it is ok. > > +*/ > > + obj->flags |= FLAG_CHECKED; > > + return 0; > > + } > > + > > if (type <= 0) > > die(_("did not receive expected object %s"), > > oid_to_hex(>oid)); > > This causes some repo corruption tests to fail. Confirmed: I see this patch, or at least f7e0dbc38 ("clone, fetch-pack, index-pack, transport: partial clone", 2017-11-02), causing t5300.26 to fail on 64-bit Cygwin. For the sake of anyone trying to reproduce this, I needed to cherry pick 66d4c7a58 ("fixup! upload-pack: add object filtering for partial clone", 2017-11-08) onto that commit before I was able to get it to compile. Adam
Re: [PATCH 02/14] clone, fetch-pack, index-pack, transport: partial clone
On Thu, 2 Nov 2017 20:31:17 + Jeff Hostetlerwrote: > From: Jeff Hostetler > > Signed-off-by: Jeff Hostetler > --- > builtin/clone.c | 9 + > builtin/fetch-pack.c | 4 > builtin/index-pack.c | 10 ++ > fetch-pack.c | 13 + > fetch-pack.h | 2 ++ > transport-helper.c | 5 + > transport.c | 4 > transport.h | 5 + > 8 files changed, 52 insertions(+) I managed to take a look at some of these patches. Firstly, consider separating out the clone part, since it will not be tested until a few patches later. > diff --git a/builtin/index-pack.c b/builtin/index-pack.c > index a0a35e6..31cd5ba 100644 > --- a/builtin/index-pack.c > +++ b/builtin/index-pack.c > @@ -222,6 +222,16 @@ static unsigned check_object(struct object *obj) > if (!(obj->flags & FLAG_CHECKED)) { > unsigned long size; > int type = sha1_object_info(obj->oid.hash, ); > + > + if (type <= 0) { > + /* > + * TODO Use the promisor code to conditionally > + * try to fetch this object -or- assume it is ok. > + */ > + obj->flags |= FLAG_CHECKED; > + return 0; > + } > + > if (type <= 0) > die(_("did not receive expected object %s"), > oid_to_hex(>oid)); This causes some repo corruption tests to fail. If I remove this and rebase the fetch-pack tests on top [1], the tests pass, so this might not be necessary (for now, at least). [1] https://github.com/jonathantanmy/git/commits/pc20171103
[PATCH 02/14] clone, fetch-pack, index-pack, transport: partial clone
From: Jeff HostetlerSigned-off-by: Jeff Hostetler --- builtin/clone.c | 9 + builtin/fetch-pack.c | 4 builtin/index-pack.c | 10 ++ fetch-pack.c | 13 + fetch-pack.h | 2 ++ transport-helper.c | 5 + transport.c | 4 transport.h | 5 + 8 files changed, 52 insertions(+) diff --git a/builtin/clone.c b/builtin/clone.c index dbddd98..fceb9e7 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -26,6 +26,7 @@ #include "run-command.h" #include "connected.h" #include "packfile.h" +#include "list-objects-filter-options.h" /* * Overall FIXMEs: @@ -60,6 +61,7 @@ static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP; static int option_dissociate; static int max_jobs = -1; static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP; +static struct list_objects_filter_options filter_options; static int recurse_submodules_cb(const struct option *opt, const char *arg, int unset) @@ -135,6 +137,7 @@ static struct option builtin_clone_options[] = { TRANSPORT_FAMILY_IPV4), OPT_SET_INT('6', "ipv6", , N_("use IPv6 addresses only"), TRANSPORT_FAMILY_IPV6), + OPT_PARSE_LIST_OBJECTS_FILTER(_options), OPT_END() }; @@ -1073,6 +1076,8 @@ 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 (filter_options.choice) + warning(_("--filter 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")); @@ -1104,6 +1109,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) transport_set_option(transport, TRANS_OPT_UPLOADPACK, option_upload_pack); + if (filter_options.choice) + transport_set_option(transport, TRANS_OPT_LIST_OBJECTS_FILTER, +filter_options.raw_value); + if (transport->smart_options && !deepen) transport->smart_options->check_self_contained_and_connected = 1; diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index 9a7ebf6..d0fdaa8 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -153,6 +153,10 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) args.no_haves = 1; continue; } + if (skip_prefix(arg, ("--" CL_ARG__FILTER "="), )) { + parse_list_objects_filter(_options, arg); + continue; + } usage(fetch_pack_usage); } if (deepen_not.nr) diff --git a/builtin/index-pack.c b/builtin/index-pack.c index a0a35e6..31cd5ba 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -222,6 +222,16 @@ static unsigned check_object(struct object *obj) if (!(obj->flags & FLAG_CHECKED)) { unsigned long size; int type = sha1_object_info(obj->oid.hash, ); + + if (type <= 0) { + /* +* TODO Use the promisor code to conditionally +* try to fetch this object -or- assume it is ok. +*/ + obj->flags |= FLAG_CHECKED; + return 0; + } + if (type <= 0) die(_("did not receive expected object %s"), oid_to_hex(>oid)); diff --git a/fetch-pack.c b/fetch-pack.c index 4640b4e..895e8f9 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -29,6 +29,7 @@ static int deepen_not_ok; static int fetch_fsck_objects = -1; static int transfer_fsck_objects = -1; static int agent_supported; +static int server_supports_filtering; static struct lock_file shallow_lock; static const char *alternate_shallow_file; @@ -379,6 +380,8 @@ static int find_common(struct fetch_pack_args *args, if (deepen_not_ok) strbuf_addstr(, " deepen-not"); if (agent_supported)strbuf_addf(, " agent=%s", git_user_agent_sanitized()); + if (args->filter_options.choice) + strbuf_addstr(, " filter"); packet_buf_write(_buf, "want %s%s\n", remote_hex, c.buf);