mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![Jonathan Tan](/assets/img/avatar_default.png)
Introduce a new negotiation algorithm used during fetch that skips commits in an effort to find common ancestors faster. The skips grow similarly to the Fibonacci sequence as the commit walk proceeds further away from the tips. The skips may cause unnecessary commits to be included in the packfile, but the negotiation step typically ends more quickly. Usage of this algorithm is guarded behind the configuration flag fetch.negotiationAlgorithm. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
#ifndef FETCH_NEGOTIATOR
|
|
#define FETCH_NEGOTIATOR
|
|
|
|
struct commit;
|
|
|
|
/*
|
|
* An object that supplies the information needed to negotiate the contents of
|
|
* the to-be-sent packfile during a fetch.
|
|
*
|
|
* To set up the negotiator, call fetch_negotiator_init(), then known_common()
|
|
* (0 or more times), then add_tip() (0 or more times).
|
|
*
|
|
* Then, when "have" lines are required, call next(). Call ack() to report what
|
|
* the server tells us.
|
|
*
|
|
* Once negotiation is done, call release(). The negotiator then cannot be used
|
|
* (unless reinitialized with fetch_negotiator_init()).
|
|
*/
|
|
struct fetch_negotiator {
|
|
/*
|
|
* Before negotiation starts, indicate that the server is known to have
|
|
* this commit.
|
|
*/
|
|
void (*known_common)(struct fetch_negotiator *, struct commit *);
|
|
|
|
/*
|
|
* Once this function is invoked, known_common() cannot be invoked any
|
|
* more.
|
|
*
|
|
* Indicate that this commit and all its ancestors are to be checked
|
|
* for commonality with the server.
|
|
*/
|
|
void (*add_tip)(struct fetch_negotiator *, struct commit *);
|
|
|
|
/*
|
|
* Once this function is invoked, known_common() and add_tip() cannot
|
|
* be invoked any more.
|
|
*
|
|
* Return the next commit that the client should send as a "have" line.
|
|
*/
|
|
const struct object_id *(*next)(struct fetch_negotiator *);
|
|
|
|
/*
|
|
* Inform the negotiator that the server has the given commit. This
|
|
* method must only be called on commits returned by next().
|
|
*/
|
|
int (*ack)(struct fetch_negotiator *, struct commit *);
|
|
|
|
void (*release)(struct fetch_negotiator *);
|
|
|
|
/* internal use */
|
|
void *data;
|
|
};
|
|
|
|
void fetch_negotiator_init(struct fetch_negotiator *negotiator,
|
|
const char *algorithm);
|
|
|
|
#endif
|