Dongcan Jiang <dongcan.ji...@gmail.com> writes:

> This patch is just for discusstion. An option --deepen is added to
> 'git fetch'. When it comes to '--deepen', git should fetch N more
> commits ahead the local shallow commit, where N is indicated by
> '--depth=N'. [1]
>
> e.g.
>
>>  (upstream)
>>   ---o---o---o---A---B
>>
>>  (you)
>>                  A---B
>
> After excuting "git fetch --depth=1 --deepen", (you) get one more
> tip and it becomes
>
>>  (you)
>>              o---A---B
>
> '--deepen' is designed to be a boolean option in this patch, which
> is a little different from [1]. It's designed in this way, because
> it can reuse '--depth' in the program, and just costs one more bit
> in some data structure, such as fetch_pack_args,
> git_transport_options.
>
> Of course, as a patch for discussion, it remains a long way to go
> before being complete.
>
>       1) Documents should be completed.
>       2) More test cases, expecially corner cases, should be added.
>       3) No need to get remote refs when it comes to '--deepen' option.
>       4) Validity on options combination should be checked.
>       5) smart-http protocol remains to be supported. [2]
>
> Besides, I still have one question:
> What does (you) exactly mean in [1]? The local branch or the local
> remote ref?

As this operation is not about moving _any_ refs, whether local
branches or remote-tracking branches, any ref that used to point at
commit B before you executed "fetch --deepen" would point at the
same commit after the command finishes.

The "you" does not explicitly depict any ref, because the picture is
meant to illustrate _everything_ the repository at the receiving end
of "fetch" has.  It used to have two commits, A and B (and the tree
and blob objects necessary to complete these two commits).  After
deepening the history by one commit, it then will have commit A^ and
its trees and blobs.

> diff --git a/upload-pack.c b/upload-pack.c
> index b531a32..8004f2f 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -31,6 +31,7 @@ static const char upload_pack_usage[] = "git upload-pack 
> [--strict] [--timeout=<
>
>  static unsigned long oldest_have;
>
> +static int depth_deepen;
>  static int multi_ack;
>  static int no_done;
>  static int use_thin_pack, use_ofs_delta, use_include_tag;
> @@ -563,11 +564,11 @@ static void receive_needs(void)
>                       }
>                       continue;
>               }
> -             if (starts_with(line, "deepen ")) {
> +             if (starts_with(line, "depth ")) {
>                       char *end;
> -                     depth = strtol(line + 7, &end, 0);
> -                     if (end == line + 7 || depth <= 0)
> -                             die("Invalid deepen: %s", line);
> +                     depth = strtol(line + 6, &end, 0);
> +                     if (end == line + 6 || depth <= 0)
> +                             die("Invalid depth: %s", line);
>                       continue;
>               }
>               if (!starts_with(line, "want ") ||

I do not quite understand this hunk.  What happens when this program
is talking to an existing fetch-pack that requested "deepen"?

> @@ -577,6 +578,8 @@ static void receive_needs(void)
>
>               features = line + 45;
>
> +             if (parse_feature_request(features, "depth_deepen"))
> +                     depth_deepen = 1;
>               if (parse_feature_request(features, "multi_ack_detailed"))
>                       multi_ack = 2;
>               else if (parse_feature_request(features, "multi_ack"))
> @@ -631,6 +634,10 @@ static void receive_needs(void)
>                               struct object *object = 
> shallows.objects[i].item;
>                               object->flags |= NOT_SHALLOW;
>                       }
> +             else if (depth_deepen)
> +                     backup = result =
> +                             get_shallow_commits(&shallows, depth + 1,
> +                                                 SHALLOW, NOT_SHALLOW);
>               else
>                       backup = result =
>                               get_shallow_commits(&want_obj, depth,
> --
> 2.3.1.253.gb3fd89e
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to