Jonathan Tan wrote:
> Introduce the new files fetch-negotiator.{h,c}, which contains an API
> behind which the details of negotiation are abstracted. Currently, only
> one algorithm is available: the existing one.
>
> This patch is written to be more easily reviewed: static functions are
> moved verbatim from fetch-pack.c to negotiator/default.c, and it can be
> seen that the lines replaced by negotiator->X() calls are present in the
> X() functions respectively.
nit: s/more//
> Signed-off-by: Jonathan Tan
> ---
> Makefile | 2 +
> fetch-negotiator.c | 7 ++
> fetch-negotiator.h | 45 ++
> fetch-pack.c | 207 ++-
> negotiator/default.c | 173
> negotiator/default.h | 8 ++
> object.h | 3 +-
> 7 files changed, 282 insertions(+), 163 deletions(-)
> create mode 100644 fetch-negotiator.c
> create mode 100644 fetch-negotiator.h
> create mode 100644 negotiator/default.c
> create mode 100644 negotiator/default.h
Looks like a job for --color-moved. :)
[...]
> --- /dev/null
> +++ b/fetch-negotiator.c
> @@ -0,0 +1,7 @@
> +#include "fetch-negotiator.h"
To avoid various standards weirdness, the first #include in all files
should be git-compat-util.h, cache.h, or builtin.h. I tend to just
use git-compat-util.h.
[...]
> +++ b/fetch-negotiator.h
> @@ -0,0 +1,45 @@
> +#ifndef FETCH_NEGOTIATOR
> +#define FETCH_NEGOTIATOR
> +
> +#include "cache.h"
What does this need from cache.h?
> +#include "commit.h"
optional: could use a forward-declaration "struct commit;" since we
only use pointers instead of the complete type. Do we document when
to prefer forward-declaration and when to #include complete type
definitions somewhere?
[...]
> +struct fetch_negotiator {
Neat. Can this file include an overview of the calling sequence / how
I use this API? E.g.
/*
* Standard calling sequence:
* 1. Obtain a struct fetch_negotiator * using [...]
* 2. For each [etc]
* 3. Free resources associated with the negotiator by calling
*release(this). This frees the pointer; it cannot be
*reused.
*/
That would be a good complement to the reference documentation in the
struct definition.
[...]
> +++ b/object.h
> @@ -28,7 +28,8 @@ struct object_array {
> /*
> * object flag allocation:
> * revision.h: 0-1026
> - * fetch-pack.c: 05
> + * fetch-pack.c: 01
> + * negotiator/default.c: 2--5
> * walker.c: 0-2
Nice!
[...]
> +++ b/fetch-pack.c
[...]
> @@ -462,7 +348,7 @@ static int find_common(struct data *data, struct
> fetch_pack_args *args,
> retval = -1;
> if (args->no_dependents)
> goto done;
> - while ((oid = get_rev(data))) {
> + while ((oid = negotiator->next(negotiator))) {
[etc]
I like it. :)
[...]
> @@ -988,7 +870,8 @@ static struct ref *do_fetch_pack(struct fetch_pack_args
> *args,
> struct object_id oid;
> const char *agent_feature;
> int agent_len;
> - struct data data = { { compare_commits_by_commit_date } };
> + struct fetch_negotiator negotiator;
> + fetch_negotiator_init();
Sane.
[...]
> @@ -1061,19 +944,17 @@ static struct ref *do_fetch_pack(struct
> fetch_pack_args *args,
> if (!server_supports("deepen-relative") && args->deepen_relative)
> die(_("Server does not support --deepen"));
>
> - if (marked)
> - for_each_ref(clear_marks, NULL);
> - marked = 1;
> - if (everything_local(, args, , sought, nr_sought)) {
> + if (everything_local(, args, , sought, nr_sought)) {
> packet_flush(fd[1]);
> goto all_done;
> }
> - if (find_common(, args, fd, , ref) < 0)
> + if (find_common(, args, fd, , ref) < 0)
> if (!args->keep_pack)
> /* When cloning, it is not unusual to have
>* no common commit.
>*/
> warning(_("no common commits"));
> + negotiator.release();
Should this go after the all_done so that it doesn't get bypassed in
the everything_local case?
[...]
> @@ -1434,6 +1316,7 @@ static struct ref *do_fetch_pack_v2(struct
> fetch_pack_args *args,
> continue;
> }
> }
> + negotiator.release();
>
> oidset_clear();
nit: could put the negotiator.release() after the blank
line, in the same paragraph as the other free calls like
oidset_clear().
[...]
> +++ b/negotiator/default.c
> @@ -0,0 +1,173 @@
> +#include "default.h"
First #include should be "git-compat-util.h".
[...]
> +/*
> + This function marks a rev and its ancestors as common.
> + In some cases, it is desirable to mark only the ancestors (for example
> + when only the server does not yet know that they are common).
> +*/