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