Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > This should allow the user to say "create a shallow clone containing the > work from last year" (once the client side is fixed up, of course). > > In theory deepen-since and deepen (aka --depth) can be used together to > draw the shallow boundary (whether it's intersection or union is up to > discussion, but if rev-list is used, it's likely intersection). However, > because deepen goes with a custom commit walker, we can't mix the two > yet. > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- Looks quite straight-forward. Thanks. > Documentation/technical/pack-protocol.txt | 3 +- > Documentation/technical/protocol-capabilities.txt | 9 +++++ > upload-pack.c | 45 ++++++++++++++++++++++- > 3 files changed, 54 insertions(+), 3 deletions(-) > > diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt > index c6977bb..9251df1 100644 > --- a/Documentation/technical/pack-protocol.txt > +++ b/Documentation/technical/pack-protocol.txt > @@ -219,7 +219,8 @@ out of what the server said it could do with the first 'want' line. > > shallow-line = PKT-LINE("shallow" SP obj-id) > > - depth-request = PKT-LINE("deepen" SP depth) > + depth-request = PKT-LINE("deepen" SP depth) / > + PKT-LINE("deepen-since" SP timestamp) > > first-want = PKT-LINE("want" SP obj-id SP capability-list) > additional-want = PKT-LINE("want" SP obj-id) > diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt > index eaab6b4..f08cc4e 100644 > --- a/Documentation/technical/protocol-capabilities.txt > +++ b/Documentation/technical/protocol-capabilities.txt > @@ -179,6 +179,15 @@ This capability adds "deepen", "shallow" and "unshallow" commands to > the fetch-pack/upload-pack protocol so clients can request shallow > clones. > > +deepen-since > +------------ > + > +This capability adds "deepen-since" command to fetch-pack/upload-pack > +protocol so the client can request shallow clones that are cut at a > +specific time, instead of depth. Internally it's equivalent of doing > +"rev-list --max-age=<timestamp>" on the server side. "deepen-since" > +cannot be used with "deepen". > + > no-progress > ----------- > > diff --git a/upload-pack.c b/upload-pack.c > index c8dafe8..794736c 100644 > --- a/upload-pack.c > +++ b/upload-pack.c > @@ -14,6 +14,7 @@ > #include "sigchain.h" > #include "version.h" > #include "string-list.h" > +#include "argv-array.h" > > static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>"; > > @@ -612,11 +613,25 @@ static void deepen(int depth, const struct object_array *shallows) > packet_flush(1); > } > > +static void deepen_by_rev_list(int ac, const char **av, > + struct object_array *shallows) > +{ > + struct commit_list *result; > + > + result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW); > + send_shallow(result); > + free_commit_list(result); > + send_unshallow(shallows); > + packet_flush(1); > +} > + > static void receive_needs(void) > { > struct object_array shallows = OBJECT_ARRAY_INIT; > int depth = 0; > int has_non_tip = 0; > + unsigned long deepen_since = 0; > + int deepen_rev_list = 0; > > shallow_nr = 0; > for (;;) { > @@ -653,6 +668,16 @@ static void receive_needs(void) > die("Invalid deepen: %s", line); > continue; > } > + if (skip_prefix(line, "deepen-since ", &arg)) { > + char *end = NULL; > + deepen_since = strtoul(arg, &end, 0); > + if (!end || *end || !deepen_since || > + /* revisions.c's max_age -1 is special */ > + deepen_since == -1) > + die("Invalid deepen-since: %s", line); > + deepen_rev_list = 1; > + continue; > + } > if (!skip_prefix(line, "want ", &arg) || > get_sha1_hex(arg, sha1_buf)) > die("git upload-pack: protocol error, " > @@ -704,10 +729,26 @@ static void receive_needs(void) > if (!use_sideband && daemon_mode) > no_progress = 1; > > - if (depth == 0 && shallows.nr == 0) > + if (depth == 0 && !deepen_rev_list && shallows.nr == 0) > return; > + if (depth > 0 && deepen_rev_list) > + die("--depth and --shallow-since cannot be used together"); > if (depth > 0) > deepen(depth, &shallows); > + else if (deepen_rev_list) { > + struct argv_array av = ARGV_ARRAY_INIT; > + int i; > + > + argv_array_push(&av, "rev-list"); > + if (deepen_since) > + argv_array_pushf(&av, "--max-age=%lu", deepen_since); > + for (i = 0; i < want_obj.nr; i++) { > + struct object *o = want_obj.objects[i].item; > + argv_array_push(&av, oid_to_hex(&o->oid)); > + } > + deepen_by_rev_list(av.argc, av.argv, &shallows); > + argv_array_clear(&av); > + } > else > if (shallows.nr > 0) { > int i; > @@ -756,7 +797,7 @@ static int send_ref(const char *refname, const struct object_id *oid, > int flag, void *cb_data) > { > static const char *capabilities = "multi_ack thin-pack side-band" > - " side-band-64k ofs-delta shallow no-progress" > + " side-band-64k ofs-delta shallow deepen-since no-progress" > " include-tag multi_ack_detailed"; > const char *refname_nons = strip_namespace(refname); > struct object_id peeled; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html