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
|
||||
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
|
||||
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
|
||||
of its descendants). If `feature.experimental` is enabled, then this
|
||||
setting defaults to "skipping".
|
||||
|
1
Makefile
1
Makefile
@ -916,6 +916,7 @@ LIB_OBJS += mergesort.o
|
||||
LIB_OBJS += midx.o
|
||||
LIB_OBJS += name-hash.o
|
||||
LIB_OBJS += negotiator/default.o
|
||||
LIB_OBJS += negotiator/noop.o
|
||||
LIB_OBJS += negotiator/skipping.o
|
||||
LIB_OBJS += notes-cache.o
|
||||
LIB_OBJS += notes-merge.o
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "fetch-negotiator.h"
|
||||
#include "negotiator/default.h"
|
||||
#include "negotiator/skipping.h"
|
||||
#include "negotiator/noop.h"
|
||||
#include "repository.h"
|
||||
|
||||
void fetch_negotiator_init(struct repository *r,
|
||||
@ -13,6 +14,10 @@ void fetch_negotiator_init(struct repository *r,
|
||||
skipping_negotiator_init(negotiator);
|
||||
return;
|
||||
|
||||
case FETCH_NEGOTIATION_NOOP:
|
||||
noop_negotiator_init(negotiator);
|
||||
return;
|
||||
|
||||
case FETCH_NEGOTIATION_DEFAULT:
|
||||
default:
|
||||
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 (!strcasecmp(strval, "skipping"))
|
||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
|
||||
else if (!strcasecmp(strval, "noop"))
|
||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_NOOP;
|
||||
else
|
||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_DEFAULT;
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ enum fetch_negotiation_setting {
|
||||
FETCH_NEGOTIATION_NONE = 0,
|
||||
FETCH_NEGOTIATION_DEFAULT = 1,
|
||||
FETCH_NEGOTIATION_SKIPPING = 2,
|
||||
FETCH_NEGOTIATION_NOOP = 3,
|
||||
};
|
||||
|
||||
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