negotiator/noop: add noop fetch negotiator
Add a noop fetch negotiator. This is introduced to allow partial clones to skip the unneeded negotiation step when fetching missing objects using a "git fetch" subprocess. (The implementation of spawning a "git fetch" subprocess will be done in a subsequent patch.) But this can also be useful for end users, e.g. as a blunt fix for object corruption. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
887952b8c6
commit
cbe566a071
@ -60,7 +60,10 @@ fetch.negotiationAlgorithm::
|
|||||||
sent when negotiating the contents of the packfile to be sent by the
|
sent when negotiating the contents of the packfile to be sent by the
|
||||||
server. Set to "skipping" to use an algorithm that skips commits in an
|
server. Set to "skipping" to use an algorithm that skips commits in an
|
||||||
effort to converge faster, but may result in a larger-than-necessary
|
effort to converge faster, but may result in a larger-than-necessary
|
||||||
packfile; The default is "default" which instructs Git to use the default algorithm
|
packfile; or set to "noop" to not send any information at all, which
|
||||||
|
will almost certainly result in a larger-than-necessary packfile, but
|
||||||
|
will skip the negotiation step.
|
||||||
|
The default is "default" which instructs Git to use the default algorithm
|
||||||
that never skips commits (unless the server has acknowledged it or one
|
that never skips commits (unless the server has acknowledged it or one
|
||||||
of its descendants). If `feature.experimental` is enabled, then this
|
of its descendants). If `feature.experimental` is enabled, then this
|
||||||
setting defaults to "skipping".
|
setting defaults to "skipping".
|
||||||
|
1
Makefile
1
Makefile
@ -916,6 +916,7 @@ LIB_OBJS += mergesort.o
|
|||||||
LIB_OBJS += midx.o
|
LIB_OBJS += midx.o
|
||||||
LIB_OBJS += name-hash.o
|
LIB_OBJS += name-hash.o
|
||||||
LIB_OBJS += negotiator/default.o
|
LIB_OBJS += negotiator/default.o
|
||||||
|
LIB_OBJS += negotiator/noop.o
|
||||||
LIB_OBJS += negotiator/skipping.o
|
LIB_OBJS += negotiator/skipping.o
|
||||||
LIB_OBJS += notes-cache.o
|
LIB_OBJS += notes-cache.o
|
||||||
LIB_OBJS += notes-merge.o
|
LIB_OBJS += notes-merge.o
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "fetch-negotiator.h"
|
#include "fetch-negotiator.h"
|
||||||
#include "negotiator/default.h"
|
#include "negotiator/default.h"
|
||||||
#include "negotiator/skipping.h"
|
#include "negotiator/skipping.h"
|
||||||
|
#include "negotiator/noop.h"
|
||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
|
|
||||||
void fetch_negotiator_init(struct repository *r,
|
void fetch_negotiator_init(struct repository *r,
|
||||||
@ -13,6 +14,10 @@ void fetch_negotiator_init(struct repository *r,
|
|||||||
skipping_negotiator_init(negotiator);
|
skipping_negotiator_init(negotiator);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case FETCH_NEGOTIATION_NOOP:
|
||||||
|
noop_negotiator_init(negotiator);
|
||||||
|
return;
|
||||||
|
|
||||||
case FETCH_NEGOTIATION_DEFAULT:
|
case FETCH_NEGOTIATION_DEFAULT:
|
||||||
default:
|
default:
|
||||||
default_negotiator_init(negotiator);
|
default_negotiator_init(negotiator);
|
||||||
|
44
negotiator/noop.c
Normal file
44
negotiator/noop.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include "cache.h"
|
||||||
|
#include "noop.h"
|
||||||
|
#include "../commit.h"
|
||||||
|
#include "../fetch-negotiator.h"
|
||||||
|
|
||||||
|
static void known_common(struct fetch_negotiator *n, struct commit *c)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_tip(struct fetch_negotiator *n, struct commit *c)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct object_id *next(struct fetch_negotiator *n)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ack(struct fetch_negotiator *n, struct commit *c)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* This negotiator does not emit any commits, so there is no commit to
|
||||||
|
* be acknowledged. If there is any ack, there is a bug.
|
||||||
|
*/
|
||||||
|
BUG("ack with noop negotiator, which does not emit any commits");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void release(struct fetch_negotiator *n)
|
||||||
|
{
|
||||||
|
/* nothing to release */
|
||||||
|
}
|
||||||
|
|
||||||
|
void noop_negotiator_init(struct fetch_negotiator *negotiator)
|
||||||
|
{
|
||||||
|
negotiator->known_common = known_common;
|
||||||
|
negotiator->add_tip = add_tip;
|
||||||
|
negotiator->next = next;
|
||||||
|
negotiator->ack = ack;
|
||||||
|
negotiator->release = release;
|
||||||
|
negotiator->data = NULL;
|
||||||
|
}
|
8
negotiator/noop.h
Normal file
8
negotiator/noop.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef NEGOTIATOR_NOOP_H
|
||||||
|
#define NEGOTIATOR_NOOP_H
|
||||||
|
|
||||||
|
struct fetch_negotiator;
|
||||||
|
|
||||||
|
void noop_negotiator_init(struct fetch_negotiator *negotiator);
|
||||||
|
|
||||||
|
#endif
|
@ -39,6 +39,8 @@ void prepare_repo_settings(struct repository *r)
|
|||||||
if (!repo_config_get_string(r, "fetch.negotiationalgorithm", &strval)) {
|
if (!repo_config_get_string(r, "fetch.negotiationalgorithm", &strval)) {
|
||||||
if (!strcasecmp(strval, "skipping"))
|
if (!strcasecmp(strval, "skipping"))
|
||||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
|
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
|
||||||
|
else if (!strcasecmp(strval, "noop"))
|
||||||
|
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_NOOP;
|
||||||
else
|
else
|
||||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_DEFAULT;
|
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_DEFAULT;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ enum fetch_negotiation_setting {
|
|||||||
FETCH_NEGOTIATION_NONE = 0,
|
FETCH_NEGOTIATION_NONE = 0,
|
||||||
FETCH_NEGOTIATION_DEFAULT = 1,
|
FETCH_NEGOTIATION_DEFAULT = 1,
|
||||||
FETCH_NEGOTIATION_SKIPPING = 2,
|
FETCH_NEGOTIATION_SKIPPING = 2,
|
||||||
|
FETCH_NEGOTIATION_NOOP = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct repo_settings {
|
struct repo_settings {
|
||||||
|
22
t/t5554-noop-fetch-negotiator.sh
Executable file
22
t/t5554-noop-fetch-negotiator.sh
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='test noop fetch negotiator'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success 'noop negotiator does not emit any "have"' '
|
||||||
|
rm -f trace &&
|
||||||
|
|
||||||
|
test_create_repo server &&
|
||||||
|
test_commit -C server to_fetch &&
|
||||||
|
|
||||||
|
test_create_repo client &&
|
||||||
|
test_commit -C client we_have &&
|
||||||
|
|
||||||
|
test_config -C client fetch.negotiationalgorithm noop &&
|
||||||
|
GIT_TRACE_PACKET="$(pwd)/trace" git -C client fetch "$(pwd)/server" &&
|
||||||
|
|
||||||
|
! grep "fetch> have" trace &&
|
||||||
|
grep "fetch> done" trace
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in New Issue
Block a user