1#ifndef FETCH_NEGOTIATOR_H 2#define FETCH_NEGOTIATOR_H 3 4struct commit; 5 6/* 7 * An object that supplies the information needed to negotiate the contents of 8 * the to-be-sent packfile during a fetch. 9 * 10 * To set up the negotiator, call fetch_negotiator_init(), then known_common() 11 * (0 or more times), then add_tip() (0 or more times). 12 * 13 * Then, when "have" lines are required, call next(). Call ack() to report what 14 * the server tells us. 15 * 16 * Once negotiation is done, call release(). The negotiator then cannot be used 17 * (unless reinitialized with fetch_negotiator_init()). 18 */ 19struct fetch_negotiator { 20/* 21 * Before negotiation starts, indicate that the server is known to have 22 * this commit. 23 */ 24void(*known_common)(struct fetch_negotiator *,struct commit *); 25 26/* 27 * Once this function is invoked, known_common() cannot be invoked any 28 * more. 29 * 30 * Indicate that this commit and all its ancestors are to be checked 31 * for commonality with the server. 32 */ 33void(*add_tip)(struct fetch_negotiator *,struct commit *); 34 35/* 36 * Once this function is invoked, known_common() and add_tip() cannot 37 * be invoked any more. 38 * 39 * Return the next commit that the client should send as a "have" line. 40 */ 41const struct object_id *(*next)(struct fetch_negotiator *); 42 43/* 44 * Inform the negotiator that the server has the given commit. This 45 * method must only be called on commits returned by next(). 46 */ 47int(*ack)(struct fetch_negotiator *,struct commit *); 48 49void(*release)(struct fetch_negotiator *); 50 51/* internal use */ 52void*data; 53}; 54 55voidfetch_negotiator_init(struct fetch_negotiator *negotiator, 56const char*algorithm); 57 58#endif