blob: afb8b05024823981be9bedfaa70f7301c6f7076c [file] [log] [blame]
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001#include "cache.h"
Michael Haggerty697cc8e2014-10-01 12:28:42 +02002#include "lockfile.h"
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07003#include "refs.h"
4#include "pkt-line.h"
5#include "commit.h"
6#include "tag.h"
7#include "exec_cmd.h"
8#include "pack.h"
9#include "sideband.h"
10#include "fetch-pack.h"
11#include "remote.h"
12#include "run-command.h"
Junio C Hamano47a59182013-07-08 13:56:53 -070013#include "connect.h"
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070014#include "transport.h"
15#include "version.h"
Jeff King099327b2013-07-02 02:24:21 -040016#include "prio-queue.h"
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +070017#include "sha1-array.h"
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070018
19static int transfer_unpack_limit = -1;
20static int fetch_unpack_limit = -1;
21static int unpack_limit = 100;
22static int prefer_ofs_delta = 1;
23static int no_done;
Nguyễn Thái Ngọc Duy508ea882016-06-12 17:53:59 +070024static int deepen_since_ok;
Nguyễn Thái Ngọc Duya45a2602016-06-12 17:54:04 +070025static int deepen_not_ok;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070026static int fetch_fsck_objects = -1;
27static int transfer_fsck_objects = -1;
28static int agent_supported;
Nguyễn Thái Ngọc Duy6035d6a2013-05-26 08:16:15 +070029static struct lock_file shallow_lock;
30static const char *alternate_shallow_file;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070031
Nguyễn Thái Ngọc Duy208acbf2014-03-25 20:23:26 +070032/* Remember to update object flag allocation in object.h */
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070033#define COMPLETE (1U << 0)
34#define COMMON (1U << 1)
35#define COMMON_REF (1U << 2)
36#define SEEN (1U << 3)
37#define POPPED (1U << 4)
Jeff King41a078c2017-02-08 15:53:03 -050038#define ALTERNATE (1U << 5)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070039
40static int marked;
41
42/*
43 * After sending this many "have"s if we do not get any new ACK , we
44 * give up traversing our history.
45 */
46#define MAX_IN_VAIN 256
47
Jeff King099327b2013-07-02 02:24:21 -040048static struct prio_queue rev_list = { compare_commits_by_commit_date };
Fredrik Medley7199c092015-05-21 22:23:38 +020049static int non_common_revs, multi_ack, use_sideband;
50/* Allow specifying sha1 if it is a ref tip. */
51#define ALLOW_TIP_SHA1 01
Fredrik Medley68ee6282015-05-21 22:23:39 +020052/* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */
53#define ALLOW_REACHABLE_SHA1 02
Fredrik Medley7199c092015-05-21 22:23:38 +020054static unsigned int allow_unadvertised_object_request;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +070055
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +070056__attribute__((format (printf, 2, 3)))
57static inline void print_verbose(const struct fetch_pack_args *args,
58 const char *fmt, ...)
59{
60 va_list params;
61
62 if (!args->verbose)
63 return;
64
65 va_start(params, fmt);
66 vfprintf(stderr, fmt, params);
67 va_end(params);
68 fputc('\n', stderr);
69}
70
Jeff King41a078c2017-02-08 15:53:03 -050071struct alternate_object_cache {
72 struct object **items;
73 size_t nr, alloc;
74};
75
76static void cache_one_alternate(const char *refname,
77 const struct object_id *oid,
78 void *vcache)
79{
80 struct alternate_object_cache *cache = vcache;
81 struct object *obj = parse_object(oid->hash);
82
83 if (!obj || (obj->flags & ALTERNATE))
84 return;
85
86 obj->flags |= ALTERNATE;
87 ALLOC_GROW(cache->items, cache->nr + 1, cache->alloc);
88 cache->items[cache->nr++] = obj;
89}
90
91static void for_each_cached_alternate(void (*cb)(struct object *))
92{
93 static int initialized;
94 static struct alternate_object_cache cache;
95 size_t i;
96
97 if (!initialized) {
98 for_each_alternate_ref(cache_one_alternate, &cache);
99 initialized = 1;
100 }
101
102 for (i = 0; i < cache.nr; i++)
103 cb(cache.items[i]);
104}
105
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700106static void rev_list_push(struct commit *commit, int mark)
107{
108 if (!(commit->object.flags & mark)) {
109 commit->object.flags |= mark;
110
Jeff King00640532013-10-24 04:53:01 -0400111 if (parse_commit(commit))
112 return;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700113
Jeff King099327b2013-07-02 02:24:21 -0400114 prio_queue_put(&rev_list, commit);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700115
116 if (!(commit->object.flags & COMMON))
117 non_common_revs++;
118 }
119}
120
Michael Haggertyc38cd1c2015-05-25 18:39:19 +0000121static int rev_list_insert_ref(const char *refname, const unsigned char *sha1)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700122{
123 struct object *o = deref_tag(parse_object(sha1), refname, 0);
124
125 if (o && o->type == OBJ_COMMIT)
126 rev_list_push((struct commit *)o, SEEN);
127
128 return 0;
129}
130
Michael Haggertyb1b49c62015-05-25 18:39:18 +0000131static int rev_list_insert_ref_oid(const char *refname, const struct object_id *oid,
132 int flag, void *cb_data)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700133{
Michael Haggertyc38cd1c2015-05-25 18:39:19 +0000134 return rev_list_insert_ref(refname, oid->hash);
Michael Haggertyb1b49c62015-05-25 18:39:18 +0000135}
136
Michael Haggertyc50fb6c2015-05-25 18:39:15 +0000137static int clear_marks(const char *refname, const struct object_id *oid,
138 int flag, void *cb_data)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700139{
Michael Haggertyc50fb6c2015-05-25 18:39:15 +0000140 struct object *o = deref_tag(parse_object(oid->hash), refname, 0);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700141
142 if (o && o->type == OBJ_COMMIT)
143 clear_commit_marks((struct commit *)o,
144 COMMON | COMMON_REF | SEEN | POPPED);
145 return 0;
146}
147
148/*
149 This function marks a rev and its ancestors as common.
150 In some cases, it is desirable to mark only the ancestors (for example
151 when only the server does not yet know that they are common).
152*/
153
154static void mark_common(struct commit *commit,
155 int ancestors_only, int dont_parse)
156{
157 if (commit != NULL && !(commit->object.flags & COMMON)) {
158 struct object *o = (struct object *)commit;
159
160 if (!ancestors_only)
161 o->flags |= COMMON;
162
163 if (!(o->flags & SEEN))
164 rev_list_push(commit, SEEN);
165 else {
166 struct commit_list *parents;
167
168 if (!ancestors_only && !(o->flags & POPPED))
169 non_common_revs--;
170 if (!o->parsed && !dont_parse)
171 if (parse_commit(commit))
172 return;
173
174 for (parents = commit->parents;
175 parents;
176 parents = parents->next)
177 mark_common(parents->item, 0, dont_parse);
178 }
179 }
180}
181
182/*
183 Get the next rev to send, ignoring the common.
184*/
185
186static const unsigned char *get_rev(void)
187{
188 struct commit *commit = NULL;
189
190 while (commit == NULL) {
191 unsigned int mark;
192 struct commit_list *parents;
193
Jeff King099327b2013-07-02 02:24:21 -0400194 if (rev_list.nr == 0 || non_common_revs == 0)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700195 return NULL;
196
Jeff King099327b2013-07-02 02:24:21 -0400197 commit = prio_queue_get(&rev_list);
Jeff King00640532013-10-24 04:53:01 -0400198 parse_commit(commit);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700199 parents = commit->parents;
200
201 commit->object.flags |= POPPED;
202 if (!(commit->object.flags & COMMON))
203 non_common_revs--;
204
205 if (commit->object.flags & COMMON) {
206 /* do not send "have", and ignore ancestors */
207 commit = NULL;
208 mark = COMMON | SEEN;
209 } else if (commit->object.flags & COMMON_REF)
210 /* send "have", and ignore ancestors */
211 mark = COMMON | SEEN;
212 else
213 /* send "have", also for its ancestors */
214 mark = SEEN;
215
216 while (parents) {
217 if (!(parents->item->object.flags & SEEN))
218 rev_list_push(parents->item, mark);
219 if (mark & COMMON)
220 mark_common(parents->item, 1, 0);
221 parents = parents->next;
222 }
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700223 }
224
brian m. carlsoned1c9972015-11-10 02:22:29 +0000225 return commit->object.oid.hash;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700226}
227
228enum ack_type {
229 NAK = 0,
230 ACK,
231 ACK_continue,
232 ACK_common,
233 ACK_ready
234};
235
236static void consume_shallow_list(struct fetch_pack_args *args, int fd)
237{
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700238 if (args->stateless_rpc && args->deepen) {
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700239 /* If we sent a depth we will get back "duplicate"
240 * shallow and unshallow commands every time there
241 * is a block of have lines exchanged.
242 */
Jeff King74543a02013-02-20 15:02:57 -0500243 char *line;
244 while ((line = packet_read_line(fd, NULL))) {
Christian Couder59556542013-11-30 21:55:40 +0100245 if (starts_with(line, "shallow "))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700246 continue;
Christian Couder59556542013-11-30 21:55:40 +0100247 if (starts_with(line, "unshallow "))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700248 continue;
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700249 die(_("git fetch-pack: expected shallow list"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700250 }
251 }
252}
253
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700254static enum ack_type get_ack(int fd, unsigned char *result_sha1)
255{
Jeff King74543a02013-02-20 15:02:57 -0500256 int len;
257 char *line = packet_read_line(fd, &len);
Jeff King82e56762014-06-18 15:56:03 -0400258 const char *arg;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700259
260 if (!len)
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700261 die(_("git fetch-pack: expected ACK/NAK, got EOF"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700262 if (!strcmp(line, "NAK"))
263 return NAK;
Jeff King82e56762014-06-18 15:56:03 -0400264 if (skip_prefix(line, "ACK ", &arg)) {
265 if (!get_sha1_hex(arg, result_sha1)) {
266 arg += 40;
267 len -= arg - line;
268 if (len < 1)
Jeff King030e9dd2013-02-20 15:00:28 -0500269 return ACK;
Jeff King82e56762014-06-18 15:56:03 -0400270 if (strstr(arg, "continue"))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700271 return ACK_continue;
Jeff King82e56762014-06-18 15:56:03 -0400272 if (strstr(arg, "common"))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700273 return ACK_common;
Jeff King82e56762014-06-18 15:56:03 -0400274 if (strstr(arg, "ready"))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700275 return ACK_ready;
276 return ACK;
277 }
278 }
Jonathan Tan8e2c7be2017-04-12 11:06:02 -0700279 if (skip_prefix(line, "ERR ", &arg))
280 die(_("remote error: %s"), arg);
Ralf Thielowdfbfb9f2016-11-11 18:21:00 +0100281 die(_("git fetch-pack: expected ACK/NAK, got '%s'"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700282}
283
284static void send_request(struct fetch_pack_args *args,
285 int fd, struct strbuf *buf)
286{
287 if (args->stateless_rpc) {
288 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
289 packet_flush(fd);
290 } else
Jeff Kingcdf4fb82013-02-20 15:01:56 -0500291 write_or_die(fd, buf->buf, buf->len);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700292}
293
Jeff King41a078c2017-02-08 15:53:03 -0500294static void insert_one_alternate_object(struct object *obj)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700295{
Jeff King41a078c2017-02-08 15:53:03 -0500296 rev_list_insert_ref(NULL, obj->oid.hash);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700297}
298
299#define INITIAL_FLUSH 16
300#define PIPESAFE_FLUSH 32
Jonathan Tanda470982016-07-18 15:21:38 -0700301#define LARGE_FLUSH 16384
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700302
303static int next_flush(struct fetch_pack_args *args, int count)
304{
Jonathan Tanda470982016-07-18 15:21:38 -0700305 if (args->stateless_rpc) {
306 if (count < LARGE_FLUSH)
307 count <<= 1;
308 else
309 count = count * 11 / 10;
310 } else {
311 if (count < PIPESAFE_FLUSH)
312 count <<= 1;
313 else
314 count += PIPESAFE_FLUSH;
315 }
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700316 return count;
317}
318
319static int find_common(struct fetch_pack_args *args,
320 int fd[2], unsigned char *result_sha1,
321 struct ref *refs)
322{
323 int fetching;
324 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
325 const unsigned char *sha1;
326 unsigned in_vain = 0;
327 int got_continue = 0;
328 int got_ready = 0;
329 struct strbuf req_buf = STRBUF_INIT;
330 size_t state_len = 0;
331
332 if (args->stateless_rpc && multi_ack == 1)
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700333 die(_("--stateless-rpc requires multi_ack_detailed"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700334 if (marked)
335 for_each_ref(clear_marks, NULL);
336 marked = 1;
337
Michael Haggertyb1b49c62015-05-25 18:39:18 +0000338 for_each_ref(rev_list_insert_ref_oid, NULL);
Jeff King41a078c2017-02-08 15:53:03 -0500339 for_each_cached_alternate(insert_one_alternate_object);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700340
341 fetching = 0;
342 for ( ; refs ; refs = refs->next) {
brian m. carlsonf4e54d02015-11-10 02:22:20 +0000343 unsigned char *remote = refs->old_oid.hash;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700344 const char *remote_hex;
345 struct object *o;
346
347 /*
348 * If that object is complete (i.e. it is an ancestor of a
349 * local ref), we tell them we have it but do not have to
350 * tell them about its ancestors, which they already know
351 * about.
352 *
353 * We use lookup_object here because we are only
354 * interested in the case we *know* the object is
355 * reachable and we have already scanned it.
356 */
357 if (((o = lookup_object(remote)) != NULL) &&
358 (o->flags & COMPLETE)) {
359 continue;
360 }
361
362 remote_hex = sha1_to_hex(remote);
363 if (!fetching) {
364 struct strbuf c = STRBUF_INIT;
365 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
366 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
367 if (no_done) strbuf_addstr(&c, " no-done");
368 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
369 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
Nguyễn Thái Ngọc Duycccf74e2016-06-12 17:54:09 +0700370 if (args->deepen_relative) strbuf_addstr(&c, " deepen-relative");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700371 if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack");
372 if (args->no_progress) strbuf_addstr(&c, " no-progress");
373 if (args->include_tag) strbuf_addstr(&c, " include-tag");
374 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
Nguyễn Thái Ngọc Duy508ea882016-06-12 17:53:59 +0700375 if (deepen_since_ok) strbuf_addstr(&c, " deepen-since");
Nguyễn Thái Ngọc Duya45a2602016-06-12 17:54:04 +0700376 if (deepen_not_ok) strbuf_addstr(&c, " deepen-not");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700377 if (agent_supported) strbuf_addf(&c, " agent=%s",
378 git_user_agent_sanitized());
379 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
380 strbuf_release(&c);
381 } else
382 packet_buf_write(&req_buf, "want %s\n", remote_hex);
383 fetching++;
384 }
385
386 if (!fetching) {
387 strbuf_release(&req_buf);
388 packet_flush(fd[1]);
389 return 1;
390 }
391
392 if (is_repository_shallow())
Nguyễn Thái Ngọc Duy1a30f5a2013-12-05 20:02:34 +0700393 write_shallow_commits(&req_buf, 1, NULL);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700394 if (args->depth > 0)
395 packet_buf_write(&req_buf, "deepen %d", args->depth);
Nguyễn Thái Ngọc Duy508ea882016-06-12 17:53:59 +0700396 if (args->deepen_since) {
397 unsigned long max_age = approxidate(args->deepen_since);
398 packet_buf_write(&req_buf, "deepen-since %lu", max_age);
399 }
Nguyễn Thái Ngọc Duya45a2602016-06-12 17:54:04 +0700400 if (args->deepen_not) {
401 int i;
402 for (i = 0; i < args->deepen_not->nr; i++) {
403 struct string_list_item *s = args->deepen_not->items + i;
404 packet_buf_write(&req_buf, "deepen-not %s", s->string);
405 }
406 }
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700407 packet_buf_flush(&req_buf);
408 state_len = req_buf.len;
409
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700410 if (args->deepen) {
Jeff King74543a02013-02-20 15:02:57 -0500411 char *line;
Jeff Kingae021d82014-06-18 15:47:50 -0400412 const char *arg;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700413 unsigned char sha1[20];
414
415 send_request(args, fd[1], &req_buf);
Jeff King74543a02013-02-20 15:02:57 -0500416 while ((line = packet_read_line(fd[0], NULL))) {
Jeff Kingae021d82014-06-18 15:47:50 -0400417 if (skip_prefix(line, "shallow ", &arg)) {
418 if (get_sha1_hex(arg, sha1))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700419 die(_("invalid shallow line: %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700420 register_shallow(sha1);
421 continue;
422 }
Jeff Kingae021d82014-06-18 15:47:50 -0400423 if (skip_prefix(line, "unshallow ", &arg)) {
424 if (get_sha1_hex(arg, sha1))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700425 die(_("invalid unshallow line: %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700426 if (!lookup_object(sha1))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700427 die(_("object not found: %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700428 /* make sure that it is parsed as shallow */
429 if (!parse_object(sha1))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700430 die(_("error in object: %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700431 if (unregister_shallow(sha1))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700432 die(_("no shallow found: %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700433 continue;
434 }
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700435 die(_("expected shallow/unshallow, got %s"), line);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700436 }
437 } else if (!args->stateless_rpc)
438 send_request(args, fd[1], &req_buf);
439
440 if (!args->stateless_rpc) {
441 /* If we aren't using the stateless-rpc interface
442 * we don't need to retain the headers.
443 */
444 strbuf_setlen(&req_buf, 0);
445 state_len = 0;
446 }
447
448 flushes = 0;
449 retval = -1;
450 while ((sha1 = get_rev())) {
451 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700452 print_verbose(args, "have %s", sha1_to_hex(sha1));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700453 in_vain++;
454 if (flush_at <= ++count) {
455 int ack;
456
457 packet_buf_flush(&req_buf);
458 send_request(args, fd[1], &req_buf);
459 strbuf_setlen(&req_buf, state_len);
460 flushes++;
461 flush_at = next_flush(args, count);
462
463 /*
464 * We keep one window "ahead" of the other side, and
465 * will wait for an ACK only on the next one
466 */
467 if (!args->stateless_rpc && count == INITIAL_FLUSH)
468 continue;
469
470 consume_shallow_list(args, fd[0]);
471 do {
472 ack = get_ack(fd[0], result_sha1);
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700473 if (ack)
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700474 print_verbose(args, _("got %s %d %s"), "ack",
475 ack, sha1_to_hex(result_sha1));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700476 switch (ack) {
477 case ACK:
478 flushes = 0;
479 multi_ack = 0;
480 retval = 0;
481 goto done;
482 case ACK_common:
483 case ACK_ready:
484 case ACK_continue: {
485 struct commit *commit =
486 lookup_commit(result_sha1);
487 if (!commit)
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700488 die(_("invalid commit %s"), sha1_to_hex(result_sha1));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700489 if (args->stateless_rpc
490 && ack == ACK_common
491 && !(commit->object.flags & COMMON)) {
492 /* We need to replay the have for this object
493 * on the next RPC request so the peer knows
494 * it is in common with us.
495 */
496 const char *hex = sha1_to_hex(result_sha1);
497 packet_buf_write(&req_buf, "have %s\n", hex);
498 state_len = req_buf.len;
Jonathan Tan06b3d382016-09-23 10:41:35 -0700499 /*
500 * Reset in_vain because an ack
501 * for this commit has not been
502 * seen.
503 */
504 in_vain = 0;
505 } else if (!args->stateless_rpc
506 || ack != ACK_common)
507 in_vain = 0;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700508 mark_common(commit, 0, 1);
509 retval = 0;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700510 got_continue = 1;
511 if (ack == ACK_ready) {
Jeff King099327b2013-07-02 02:24:21 -0400512 clear_prio_queue(&rev_list);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700513 got_ready = 1;
514 }
515 break;
516 }
517 }
518 } while (ack);
519 flushes--;
520 if (got_continue && MAX_IN_VAIN < in_vain) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700521 print_verbose(args, _("giving up"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700522 break; /* give up */
523 }
524 }
525 }
526done:
527 if (!got_ready || !no_done) {
528 packet_buf_write(&req_buf, "done\n");
529 send_request(args, fd[1], &req_buf);
530 }
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700531 print_verbose(args, _("done"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700532 if (retval != 0) {
533 multi_ack = 0;
534 flushes++;
535 }
536 strbuf_release(&req_buf);
537
Nguyễn Thái Ngọc Duyff62eca2014-02-06 22:10:39 +0700538 if (!got_ready || !no_done)
539 consume_shallow_list(args, fd[0]);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700540 while (flushes || multi_ack) {
541 int ack = get_ack(fd[0], result_sha1);
542 if (ack) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700543 print_verbose(args, _("got %s (%d) %s"), "ack",
544 ack, sha1_to_hex(result_sha1));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700545 if (ack == ACK)
546 return 0;
547 multi_ack = 1;
548 continue;
549 }
550 flushes--;
551 }
552 /* it is no error to fetch into a completely empty repo */
553 return count ? retval : 0;
554}
555
556static struct commit_list *complete;
557
Michael Haggerty6e20a512015-05-25 18:39:17 +0000558static int mark_complete(const unsigned char *sha1)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700559{
560 struct object *o = parse_object(sha1);
561
562 while (o && o->type == OBJ_TAG) {
563 struct tag *t = (struct tag *) o;
564 if (!t->tagged)
565 break; /* broken repository */
566 o->flags |= COMPLETE;
brian m. carlsoned1c9972015-11-10 02:22:29 +0000567 o = parse_object(t->tagged->oid.hash);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700568 }
569 if (o && o->type == OBJ_COMMIT) {
570 struct commit *commit = (struct commit *)o;
571 if (!(commit->object.flags & COMPLETE)) {
572 commit->object.flags |= COMPLETE;
Jeff King16445242013-07-02 02:16:23 -0400573 commit_list_insert(commit, &complete);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700574 }
575 }
576 return 0;
577}
578
Michael Haggertyf8ee4d82015-05-25 18:39:16 +0000579static int mark_complete_oid(const char *refname, const struct object_id *oid,
580 int flag, void *cb_data)
581{
Michael Haggerty6e20a512015-05-25 18:39:17 +0000582 return mark_complete(oid->hash);
Michael Haggertyf8ee4d82015-05-25 18:39:16 +0000583}
584
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700585static void mark_recent_complete_commits(struct fetch_pack_args *args,
586 unsigned long cutoff)
587{
588 while (complete && cutoff <= complete->item->date) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700589 print_verbose(args, _("Marking %s as complete"),
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700590 oid_to_hex(&complete->item->object.oid));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700591 pop_most_recent_commit(&complete, COMPLETE);
592 }
593}
594
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700595static void filter_refs(struct fetch_pack_args *args,
Junio C Hamanof2db8542013-01-29 14:02:15 -0800596 struct ref **refs,
597 struct ref **sought, int nr_sought)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700598{
599 struct ref *newlist = NULL;
600 struct ref **newtail = &newlist;
601 struct ref *ref, *next;
Junio C Hamanof2db8542013-01-29 14:02:15 -0800602 int i;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700603
Junio C Hamanof2db8542013-01-29 14:02:15 -0800604 i = 0;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700605 for (ref = *refs; ref; ref = next) {
606 int keep = 0;
607 next = ref->next;
Junio C Hamanof2db8542013-01-29 14:02:15 -0800608
René Scharfe50e19a82014-06-06 19:24:48 +0200609 if (starts_with(ref->name, "refs/") &&
Jeff King4c224082014-01-15 05:46:13 -0500610 check_refname_format(ref->name, 0))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700611 ; /* trash */
612 else {
Junio C Hamanof2db8542013-01-29 14:02:15 -0800613 while (i < nr_sought) {
614 int cmp = strcmp(ref->name, sought[i]->name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700615 if (cmp < 0)
616 break; /* definitely do not have it */
617 else if (cmp == 0) {
618 keep = 1; /* definitely have it */
Matt McCutchend56583d2017-02-22 11:05:57 -0500619 sought[i]->match_status = REF_MATCHED;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700620 }
Junio C Hamanof2db8542013-01-29 14:02:15 -0800621 i++;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700622 }
623 }
624
Junio C Hamanof2db8542013-01-29 14:02:15 -0800625 if (!keep && args->fetch_all &&
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700626 (!args->deepen || !starts_with(ref->name, "refs/tags/")))
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700627 keep = 1;
628
629 if (keep) {
630 *newtail = ref;
631 ref->next = NULL;
632 newtail = &ref->next;
633 } else {
634 free(ref);
635 }
636 }
637
Junio C Hamano6e7b66e2013-01-29 14:02:15 -0800638 /* Append unmatched requests to the list */
Matt McCutchend56583d2017-02-22 11:05:57 -0500639 for (i = 0; i < nr_sought; i++) {
640 unsigned char sha1[20];
Jeff Kingb7916422015-03-19 16:34:51 -0400641
Matt McCutchend56583d2017-02-22 11:05:57 -0500642 ref = sought[i];
643 if (ref->match_status != REF_NOT_MATCHED)
644 continue;
645 if (get_sha1_hex(ref->name, sha1) ||
646 ref->name[40] != '\0' ||
647 hashcmp(sha1, ref->old_oid.hash))
648 continue;
Junio C Hamano6e7b66e2013-01-29 14:02:15 -0800649
Matt McCutchend56583d2017-02-22 11:05:57 -0500650 if ((allow_unadvertised_object_request &
651 (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) {
652 ref->match_status = REF_MATCHED;
Jeff Kingc3c17bf2015-03-19 16:37:09 -0400653 *newtail = copy_ref(ref);
654 newtail = &(*newtail)->next;
Matt McCutchend56583d2017-02-22 11:05:57 -0500655 } else {
656 ref->match_status = REF_UNADVERTISED_NOT_ALLOWED;
Junio C Hamano6e7b66e2013-01-29 14:02:15 -0800657 }
658 }
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700659 *refs = newlist;
660}
661
Jeff King41a078c2017-02-08 15:53:03 -0500662static void mark_alternate_complete(struct object *obj)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700663{
Jeff King41a078c2017-02-08 15:53:03 -0500664 mark_complete(obj->oid.hash);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700665}
666
667static int everything_local(struct fetch_pack_args *args,
Junio C Hamanof2db8542013-01-29 14:02:15 -0800668 struct ref **refs,
669 struct ref **sought, int nr_sought)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700670{
671 struct ref *ref;
672 int retval;
673 unsigned long cutoff = 0;
674
675 save_commit_buffer = 0;
676
677 for (ref = *refs; ref; ref = ref->next) {
678 struct object *o;
679
brian m. carlsonf4e54d02015-11-10 02:22:20 +0000680 if (!has_object_file(&ref->old_oid))
Junio C Hamano012a1bb2013-01-26 19:42:09 -0800681 continue;
682
brian m. carlsonf4e54d02015-11-10 02:22:20 +0000683 o = parse_object(ref->old_oid.hash);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700684 if (!o)
685 continue;
686
687 /* We already have it -- which may mean that we were
688 * in sync with the other side at some time after
689 * that (it is OK if we guess wrong here).
690 */
691 if (o->type == OBJ_COMMIT) {
692 struct commit *commit = (struct commit *)o;
693 if (!cutoff || cutoff < commit->date)
694 cutoff = commit->date;
695 }
696 }
697
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700698 if (!args->deepen) {
Michael Haggertyf8ee4d82015-05-25 18:39:16 +0000699 for_each_ref(mark_complete_oid, NULL);
Jeff King41a078c2017-02-08 15:53:03 -0500700 for_each_cached_alternate(mark_alternate_complete);
Jeff King16445242013-07-02 02:16:23 -0400701 commit_list_sort_by_date(&complete);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700702 if (cutoff)
703 mark_recent_complete_commits(args, cutoff);
704 }
705
706 /*
707 * Mark all complete remote refs as common refs.
708 * Don't mark them common yet; the server has to be told so first.
709 */
710 for (ref = *refs; ref; ref = ref->next) {
brian m. carlsonf4e54d02015-11-10 02:22:20 +0000711 struct object *o = deref_tag(lookup_object(ref->old_oid.hash),
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700712 NULL, 0);
713
714 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
715 continue;
716
717 if (!(o->flags & SEEN)) {
718 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
719
720 mark_common((struct commit *)o, 1, 1);
721 }
722 }
723
Junio C Hamanof2db8542013-01-29 14:02:15 -0800724 filter_refs(args, refs, sought, nr_sought);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700725
726 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
brian m. carlsonf4e54d02015-11-10 02:22:20 +0000727 const unsigned char *remote = ref->old_oid.hash;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700728 struct object *o;
729
730 o = lookup_object(remote);
731 if (!o || !(o->flags & COMPLETE)) {
732 retval = 0;
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700733 print_verbose(args, "want %s (%s)", sha1_to_hex(remote),
734 ref->name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700735 continue;
736 }
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700737 print_verbose(args, _("already have %s (%s)"), sha1_to_hex(remote),
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700738 ref->name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700739 }
740 return retval;
741}
742
743static int sideband_demux(int in, int out, void *data)
744{
745 int *xd = data;
Jeff King9ff18fa2016-02-24 02:44:58 -0500746 int ret;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700747
Jeff King9ff18fa2016-02-24 02:44:58 -0500748 ret = recv_sideband("fetch-pack", xd[0], out);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700749 close(out);
750 return ret;
751}
752
753static int get_pack(struct fetch_pack_args *args,
754 int xd[2], char **pack_lockfile)
755{
756 struct async demux;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700757 int do_keep = args->keep_pack;
Jeff King984a43b2015-09-24 17:07:54 -0400758 const char *cmd_name;
759 struct pack_header header;
760 int pass_header = 0;
René Scharfed3180272014-08-19 21:09:35 +0200761 struct child_process cmd = CHILD_PROCESS_INIT;
Nguyễn Thái Ngọc Duyc6807a42013-05-26 08:16:17 +0700762 int ret;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700763
764 memset(&demux, 0, sizeof(demux));
765 if (use_sideband) {
766 /* xd[] is talking with upload-pack; subprocess reads from
767 * xd[0], spits out band#2 to stderr, and feeds us band#1
768 * through demux->out.
769 */
770 demux.proc = sideband_demux;
771 demux.data = xd;
772 demux.out = -1;
Jeff Kingdf857572016-04-19 18:50:29 -0400773 demux.isolate_sigpipe = 1;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700774 if (start_async(&demux))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700775 die(_("fetch-pack: unable to fork off sideband demultiplexer"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700776 }
777 else
778 demux.out = xd[0];
779
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700780 if (!args->keep_pack && unpack_limit) {
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700781
782 if (read_pack_header(demux.out, &header))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700783 die(_("protocol error: bad pack header"));
Jeff King984a43b2015-09-24 17:07:54 -0400784 pass_header = 1;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700785 if (ntohl(header.hdr_entries) < unpack_limit)
786 do_keep = 0;
787 else
788 do_keep = 1;
789 }
790
Nguyễn Thái Ngọc Duy6035d6a2013-05-26 08:16:15 +0700791 if (alternate_shallow_file) {
Jeff King984a43b2015-09-24 17:07:54 -0400792 argv_array_push(&cmd.args, "--shallow-file");
793 argv_array_push(&cmd.args, alternate_shallow_file);
Nguyễn Thái Ngọc Duy6035d6a2013-05-26 08:16:15 +0700794 }
795
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700796 if (do_keep) {
797 if (pack_lockfile)
798 cmd.out = -1;
Jeff King984a43b2015-09-24 17:07:54 -0400799 cmd_name = "index-pack";
800 argv_array_push(&cmd.args, cmd_name);
801 argv_array_push(&cmd.args, "--stdin");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700802 if (!args->quiet && !args->no_progress)
Jeff King984a43b2015-09-24 17:07:54 -0400803 argv_array_push(&cmd.args, "-v");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700804 if (args->use_thin_pack)
Jeff King984a43b2015-09-24 17:07:54 -0400805 argv_array_push(&cmd.args, "--fix-thin");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700806 if (args->lock_pack || unpack_limit) {
René Scharfeda25bdb2017-04-18 17:57:42 -0400807 char hostname[HOST_NAME_MAX + 1];
David Turner5781a9a2017-04-18 17:57:43 -0400808 if (xgethostname(hostname, sizeof(hostname)))
Jeff King984a43b2015-09-24 17:07:54 -0400809 xsnprintf(hostname, sizeof(hostname), "localhost");
810 argv_array_pushf(&cmd.args,
811 "--keep=fetch-pack %"PRIuMAX " on %s",
812 (uintmax_t)getpid(), hostname);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700813 }
Nguyễn Thái Ngọc Duyc6807a42013-05-26 08:16:17 +0700814 if (args->check_self_contained_and_connected)
Jeff King984a43b2015-09-24 17:07:54 -0400815 argv_array_push(&cmd.args, "--check-self-contained-and-connected");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700816 }
817 else {
Jeff King984a43b2015-09-24 17:07:54 -0400818 cmd_name = "unpack-objects";
819 argv_array_push(&cmd.args, cmd_name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700820 if (args->quiet || args->no_progress)
Jeff King984a43b2015-09-24 17:07:54 -0400821 argv_array_push(&cmd.args, "-q");
Nguyễn Thái Ngọc Duyc6807a42013-05-26 08:16:17 +0700822 args->check_self_contained_and_connected = 0;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700823 }
Jeff King984a43b2015-09-24 17:07:54 -0400824
825 if (pass_header)
826 argv_array_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
827 ntohl(header.hdr_version),
828 ntohl(header.hdr_entries));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700829 if (fetch_fsck_objects >= 0
830 ? fetch_fsck_objects
831 : transfer_fsck_objects >= 0
832 ? transfer_fsck_objects
833 : 0)
Jeff King984a43b2015-09-24 17:07:54 -0400834 argv_array_push(&cmd.args, "--strict");
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700835
836 cmd.in = demux.out;
837 cmd.git_cmd = 1;
838 if (start_command(&cmd))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700839 die(_("fetch-pack: unable to fork off %s"), cmd_name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700840 if (do_keep && pack_lockfile) {
841 *pack_lockfile = index_pack_lockfile(cmd.out);
842 close(cmd.out);
843 }
844
Jens Lindstrom37cb1dd2013-10-22 15:36:02 +0200845 if (!use_sideband)
846 /* Closed by start_command() */
847 xd[0] = -1;
848
Nguyễn Thái Ngọc Duyc6807a42013-05-26 08:16:17 +0700849 ret = finish_command(&cmd);
850 if (!ret || (args->check_self_contained_and_connected && ret == 1))
851 args->self_contained_and_connected =
852 args->check_self_contained_and_connected &&
853 ret == 0;
854 else
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700855 die(_("%s failed"), cmd_name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700856 if (use_sideband && finish_async(&demux))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700857 die(_("error in sideband demultiplexer"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700858 return 0;
859}
860
Junio C Hamanof2db8542013-01-29 14:02:15 -0800861static int cmp_ref_by_name(const void *a_, const void *b_)
862{
863 const struct ref *a = *((const struct ref **)a_);
864 const struct ref *b = *((const struct ref **)b_);
865 return strcmp(a->name, b->name);
866}
867
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700868static struct ref *do_fetch_pack(struct fetch_pack_args *args,
869 int fd[2],
870 const struct ref *orig_ref,
Junio C Hamanof2db8542013-01-29 14:02:15 -0800871 struct ref **sought, int nr_sought,
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +0700872 struct shallow_info *si,
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700873 char **pack_lockfile)
874{
875 struct ref *ref = copy_ref_list(orig_ref);
876 unsigned char sha1[20];
877 const char *agent_feature;
878 int agent_len;
879
880 sort_ref_list(&ref, ref_compare_name);
René Scharfe9ed0d8d2016-09-29 17:27:31 +0200881 QSORT(sought, nr_sought, cmp_ref_by_name);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700882
Mike Edgareb86a502015-06-17 07:48:14 -0400883 if ((args->depth > 0 || is_repository_shallow()) && !server_supports("shallow"))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700884 die(_("Server does not support shallow clients"));
Nguyễn Thái Ngọc Duya45a2602016-06-12 17:54:04 +0700885 if (args->depth > 0 || args->deepen_since || args->deepen_not)
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700886 args->deepen = 1;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700887 if (server_supports("multi_ack_detailed")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700888 print_verbose(args, _("Server supports multi_ack_detailed"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700889 multi_ack = 2;
890 if (server_supports("no-done")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700891 print_verbose(args, _("Server supports no-done"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700892 if (args->stateless_rpc)
893 no_done = 1;
894 }
895 }
896 else if (server_supports("multi_ack")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700897 print_verbose(args, _("Server supports multi_ack"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700898 multi_ack = 1;
899 }
900 if (server_supports("side-band-64k")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700901 print_verbose(args, _("Server supports side-band-64k"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700902 use_sideband = 2;
903 }
904 else if (server_supports("side-band")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700905 print_verbose(args, _("Server supports side-band"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700906 use_sideband = 1;
907 }
Junio C Hamano6e7b66e2013-01-29 14:02:15 -0800908 if (server_supports("allow-tip-sha1-in-want")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700909 print_verbose(args, _("Server supports allow-tip-sha1-in-want"));
Fredrik Medley7199c092015-05-21 22:23:38 +0200910 allow_unadvertised_object_request |= ALLOW_TIP_SHA1;
Junio C Hamano6e7b66e2013-01-29 14:02:15 -0800911 }
Fredrik Medley68ee6282015-05-21 22:23:39 +0200912 if (server_supports("allow-reachable-sha1-in-want")) {
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700913 print_verbose(args, _("Server supports allow-reachable-sha1-in-want"));
Fredrik Medley68ee6282015-05-21 22:23:39 +0200914 allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1;
915 }
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700916 if (!server_supports("thin-pack"))
917 args->use_thin_pack = 0;
918 if (!server_supports("no-progress"))
919 args->no_progress = 0;
920 if (!server_supports("include-tag"))
921 args->include_tag = 0;
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700922 if (server_supports("ofs-delta"))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700923 print_verbose(args, _("Server supports ofs-delta"));
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700924 else
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700925 prefer_ofs_delta = 0;
926
927 if ((agent_feature = server_feature_value("agent", &agent_len))) {
928 agent_supported = 1;
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700929 if (agent_len)
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700930 print_verbose(args, _("Server version is %.*s"),
Nguyễn Thái Ngọc Duy0d789a52016-06-12 17:53:54 +0700931 agent_len, agent_feature);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700932 }
Nguyễn Thái Ngọc Duy508ea882016-06-12 17:53:59 +0700933 if (server_supports("deepen-since"))
934 deepen_since_ok = 1;
935 else if (args->deepen_since)
936 die(_("Server does not support --shallow-since"));
Nguyễn Thái Ngọc Duya45a2602016-06-12 17:54:04 +0700937 if (server_supports("deepen-not"))
938 deepen_not_ok = 1;
939 else if (args->deepen_not)
940 die(_("Server does not support --shallow-exclude"));
Nguyễn Thái Ngọc Duycccf74e2016-06-12 17:54:09 +0700941 if (!server_supports("deepen-relative") && args->deepen_relative)
942 die(_("Server does not support --deepen"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700943
Junio C Hamanof2db8542013-01-29 14:02:15 -0800944 if (everything_local(args, &ref, sought, nr_sought)) {
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700945 packet_flush(fd[1]);
946 goto all_done;
947 }
948 if (find_common(args, fd, sha1, ref) < 0)
949 if (!args->keep_pack)
950 /* When cloning, it is not unusual to have
951 * no common commit.
952 */
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700953 warning(_("no common commits"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700954
955 if (args->stateless_rpc)
956 packet_flush(fd[1]);
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +0700957 if (args->deepen)
Nguyễn Thái Ngọc Duy1a30f5a2013-12-05 20:02:34 +0700958 setup_alternate_shallow(&shallow_lock, &alternate_shallow_file,
959 NULL);
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +0700960 else if (si->nr_ours || si->nr_theirs)
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +0700961 alternate_shallow_file = setup_temporary_shallow(si->shallow);
Nguyễn Thái Ngọc Duy6da8bdc2013-08-26 09:17:26 +0700962 else
963 alternate_shallow_file = NULL;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700964 if (get_pack(args, fd, pack_lockfile))
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +0700965 die(_("git fetch-pack: fetch failed."));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700966
967 all_done:
968 return ref;
969}
970
Tanay Abhraf44af512014-08-07 09:21:20 -0700971static void fetch_pack_config(void)
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700972{
Tanay Abhraf44af512014-08-07 09:21:20 -0700973 git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit);
974 git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit);
975 git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
976 git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
977 git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700978
Tanay Abhraf44af512014-08-07 09:21:20 -0700979 git_config(git_default_config, NULL);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700980}
981
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700982static void fetch_pack_setup(void)
983{
984 static int did_setup;
985 if (did_setup)
986 return;
Tanay Abhraf44af512014-08-07 09:21:20 -0700987 fetch_pack_config();
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +0700988 if (0 <= transfer_unpack_limit)
989 unpack_limit = transfer_unpack_limit;
990 else if (0 <= fetch_unpack_limit)
991 unpack_limit = fetch_unpack_limit;
992 did_setup = 1;
993}
994
Junio C Hamanof2db8542013-01-29 14:02:15 -0800995static int remove_duplicates_in_refs(struct ref **ref, int nr)
996{
997 struct string_list names = STRING_LIST_INIT_NODUP;
998 int src, dst;
999
1000 for (src = dst = 0; src < nr; src++) {
1001 struct string_list_item *item;
1002 item = string_list_insert(&names, ref[src]->name);
1003 if (item->util)
1004 continue; /* already have it */
1005 item->util = ref[src];
1006 if (src != dst)
1007 ref[dst] = ref[src];
1008 dst++;
1009 }
1010 for (src = dst; src < nr; src++)
1011 ref[src] = NULL;
1012 string_list_clear(&names, 0);
1013 return dst;
1014}
1015
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001016static void update_shallow(struct fetch_pack_args *args,
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001017 struct ref **sought, int nr_sought,
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001018 struct shallow_info *si)
Nguyễn Thái Ngọc Duya796cce2013-12-05 20:02:37 +07001019{
brian m. carlson910650d2017-03-31 01:40:00 +00001020 struct oid_array ref = OID_ARRAY_INIT;
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001021 int *status;
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001022 int i;
1023
Nguyễn Thái Ngọc Duy79891cb2016-06-12 17:53:56 +07001024 if (args->deepen && alternate_shallow_file) {
Nguyễn Thái Ngọc Duya796cce2013-12-05 20:02:37 +07001025 if (*alternate_shallow_file == '\0') { /* --unshallow */
Jeff Kingf9327292015-08-10 05:38:57 -04001026 unlink_or_warn(git_path_shallow());
Nguyễn Thái Ngọc Duya796cce2013-12-05 20:02:37 +07001027 rollback_lock_file(&shallow_lock);
1028 } else
1029 commit_lock_file(&shallow_lock);
1030 return;
1031 }
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001032
1033 if (!si->shallow || !si->shallow->nr)
1034 return;
1035
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001036 if (args->cloning) {
1037 /*
1038 * remote is shallow, but this is a clone, there are
1039 * no objects in repo to worry about. Accept any
1040 * shallow points that exist in the pack (iow in repo
1041 * after get_pack() and reprepare_packed_git())
1042 */
brian m. carlson910650d2017-03-31 01:40:00 +00001043 struct oid_array extra = OID_ARRAY_INIT;
brian m. carlsonee3051b2017-03-26 16:01:37 +00001044 struct object_id *oid = si->shallow->oid;
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001045 for (i = 0; i < si->shallow->nr; i++)
brian m. carlsonee3051b2017-03-26 16:01:37 +00001046 if (has_object_file(&oid[i]))
brian m. carlson910650d2017-03-31 01:40:00 +00001047 oid_array_append(&extra, &oid[i]);
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001048 if (extra.nr) {
1049 setup_alternate_shallow(&shallow_lock,
1050 &alternate_shallow_file,
1051 &extra);
1052 commit_lock_file(&shallow_lock);
1053 }
brian m. carlson910650d2017-03-31 01:40:00 +00001054 oid_array_clear(&extra);
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001055 return;
1056 }
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001057
1058 if (!si->nr_ours && !si->nr_theirs)
1059 return;
1060
1061 remove_nonexistent_theirs_shallow(si);
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001062 if (!si->nr_ours && !si->nr_theirs)
1063 return;
1064 for (i = 0; i < nr_sought; i++)
brian m. carlson910650d2017-03-31 01:40:00 +00001065 oid_array_append(&ref, &sought[i]->old_oid);
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001066 si->ref = &ref;
1067
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001068 if (args->update_shallow) {
1069 /*
1070 * remote is also shallow, .git/shallow may be updated
1071 * so all refs can be accepted. Make sure we only add
1072 * shallow roots that are actually reachable from new
1073 * refs.
1074 */
brian m. carlson910650d2017-03-31 01:40:00 +00001075 struct oid_array extra = OID_ARRAY_INIT;
brian m. carlsonee3051b2017-03-26 16:01:37 +00001076 struct object_id *oid = si->shallow->oid;
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001077 assign_shallow_commits_to_refs(si, NULL, NULL);
1078 if (!si->nr_ours && !si->nr_theirs) {
brian m. carlson910650d2017-03-31 01:40:00 +00001079 oid_array_clear(&ref);
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001080 return;
1081 }
1082 for (i = 0; i < si->nr_ours; i++)
brian m. carlson910650d2017-03-31 01:40:00 +00001083 oid_array_append(&extra, &oid[si->ours[i]]);
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001084 for (i = 0; i < si->nr_theirs; i++)
brian m. carlson910650d2017-03-31 01:40:00 +00001085 oid_array_append(&extra, &oid[si->theirs[i]]);
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001086 setup_alternate_shallow(&shallow_lock,
1087 &alternate_shallow_file,
1088 &extra);
1089 commit_lock_file(&shallow_lock);
brian m. carlson910650d2017-03-31 01:40:00 +00001090 oid_array_clear(&extra);
1091 oid_array_clear(&ref);
Nguyễn Thái Ngọc Duy48d25ca2013-12-05 20:02:42 +07001092 return;
1093 }
1094
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001095 /*
1096 * remote is also shallow, check what ref is safe to update
1097 * without updating .git/shallow
1098 */
1099 status = xcalloc(nr_sought, sizeof(*status));
1100 assign_shallow_commits_to_refs(si, NULL, status);
1101 if (si->nr_ours || si->nr_theirs) {
1102 for (i = 0; i < nr_sought; i++)
1103 if (status[i])
1104 sought[i]->status = REF_STATUS_REJECT_SHALLOW;
1105 }
1106 free(status);
brian m. carlson910650d2017-03-31 01:40:00 +00001107 oid_array_clear(&ref);
Nguyễn Thái Ngọc Duya796cce2013-12-05 20:02:37 +07001108}
1109
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001110struct ref *fetch_pack(struct fetch_pack_args *args,
1111 int fd[], struct child_process *conn,
1112 const struct ref *ref,
1113 const char *dest,
Junio C Hamanof2db8542013-01-29 14:02:15 -08001114 struct ref **sought, int nr_sought,
brian m. carlson910650d2017-03-31 01:40:00 +00001115 struct oid_array *shallow,
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001116 char **pack_lockfile)
1117{
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001118 struct ref *ref_cpy;
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001119 struct shallow_info si;
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001120
1121 fetch_pack_setup();
Junio C Hamanof2db8542013-01-29 14:02:15 -08001122 if (nr_sought)
1123 nr_sought = remove_duplicates_in_refs(sought, nr_sought);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001124
1125 if (!ref) {
1126 packet_flush(fd[1]);
Nguyễn Thái Ngọc Duy1dd73e22016-06-12 17:53:55 +07001127 die(_("no matching remote head"));
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001128 }
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001129 prepare_shallow_info(&si, shallow);
1130 ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought,
1131 &si, pack_lockfile);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001132 reprepare_packed_git();
Nguyễn Thái Ngọc Duy4820a332013-12-05 20:02:40 +07001133 update_shallow(args, sought, nr_sought, &si);
Nguyễn Thái Ngọc Duybeea4152013-12-05 20:02:39 +07001134 clear_shallow_info(&si);
Nguyễn Thái Ngọc Duy745f7a82012-10-26 22:53:55 +07001135 return ref_cpy;
1136}
Matt McCutchene860d962017-02-22 11:01:22 -05001137
1138int report_unmatched_refs(struct ref **sought, int nr_sought)
1139{
1140 int i, ret = 0;
1141
1142 for (i = 0; i < nr_sought; i++) {
Matt McCutchend56583d2017-02-22 11:05:57 -05001143 if (!sought[i])
Matt McCutchene860d962017-02-22 11:01:22 -05001144 continue;
Matt McCutchend56583d2017-02-22 11:05:57 -05001145 switch (sought[i]->match_status) {
1146 case REF_MATCHED:
1147 continue;
1148 case REF_NOT_MATCHED:
1149 error(_("no such remote ref %s"), sought[i]->name);
1150 break;
1151 case REF_UNADVERTISED_NOT_ALLOWED:
1152 error(_("Server does not allow request for unadvertised object %s"),
1153 sought[i]->name);
1154 break;
1155 }
Matt McCutchene860d962017-02-22 11:01:22 -05001156 ret = 1;
1157 }
1158 return ret;
1159}