remote-helpers: Support custom transport options
[git/jrn.git] / builtin-fetch-pack.c
blob615f54974e0b19354d88a40ecba53f586944a96b
1 #include "cache.h"
2 #include "refs.h"
3 #include "pkt-line.h"
4 #include "commit.h"
5 #include "tag.h"
6 #include "exec_cmd.h"
7 #include "pack.h"
8 #include "sideband.h"
9 #include "fetch-pack.h"
10 #include "remote.h"
11 #include "run-command.h"
13 static int transfer_unpack_limit = -1;
14 static int fetch_unpack_limit = -1;
15 static int unpack_limit = 100;
16 static int prefer_ofs_delta = 1;
17 static struct fetch_pack_args args = {
18 /* .uploadpack = */ "git-upload-pack",
21 static const char fetch_pack_usage[] =
22 "git fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
24 #define COMPLETE (1U << 0)
25 #define COMMON (1U << 1)
26 #define COMMON_REF (1U << 2)
27 #define SEEN (1U << 3)
28 #define POPPED (1U << 4)
30 static int marked;
33 * After sending this many "have"s if we do not get any new ACK , we
34 * give up traversing our history.
36 #define MAX_IN_VAIN 256
38 static struct commit_list *rev_list;
39 static int non_common_revs, multi_ack, use_sideband;
41 static void rev_list_push(struct commit *commit, int mark)
43 if (!(commit->object.flags & mark)) {
44 commit->object.flags |= mark;
46 if (!(commit->object.parsed))
47 if (parse_commit(commit))
48 return;
50 insert_by_date(commit, &rev_list);
52 if (!(commit->object.flags & COMMON))
53 non_common_revs++;
57 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
59 struct object *o = deref_tag(parse_object(sha1), path, 0);
61 if (o && o->type == OBJ_COMMIT)
62 rev_list_push((struct commit *)o, SEEN);
64 return 0;
67 static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
69 struct object *o = deref_tag(parse_object(sha1), path, 0);
71 if (o && o->type == OBJ_COMMIT)
72 clear_commit_marks((struct commit *)o,
73 COMMON | COMMON_REF | SEEN | POPPED);
74 return 0;
78 This function marks a rev and its ancestors as common.
79 In some cases, it is desirable to mark only the ancestors (for example
80 when only the server does not yet know that they are common).
83 static void mark_common(struct commit *commit,
84 int ancestors_only, int dont_parse)
86 if (commit != NULL && !(commit->object.flags & COMMON)) {
87 struct object *o = (struct object *)commit;
89 if (!ancestors_only)
90 o->flags |= COMMON;
92 if (!(o->flags & SEEN))
93 rev_list_push(commit, SEEN);
94 else {
95 struct commit_list *parents;
97 if (!ancestors_only && !(o->flags & POPPED))
98 non_common_revs--;
99 if (!o->parsed && !dont_parse)
100 if (parse_commit(commit))
101 return;
103 for (parents = commit->parents;
104 parents;
105 parents = parents->next)
106 mark_common(parents->item, 0, dont_parse);
112 Get the next rev to send, ignoring the common.
115 static const unsigned char *get_rev(void)
117 struct commit *commit = NULL;
119 while (commit == NULL) {
120 unsigned int mark;
121 struct commit_list *parents;
123 if (rev_list == NULL || non_common_revs == 0)
124 return NULL;
126 commit = rev_list->item;
127 if (!commit->object.parsed)
128 parse_commit(commit);
129 parents = commit->parents;
131 commit->object.flags |= POPPED;
132 if (!(commit->object.flags & COMMON))
133 non_common_revs--;
135 if (commit->object.flags & COMMON) {
136 /* do not send "have", and ignore ancestors */
137 commit = NULL;
138 mark = COMMON | SEEN;
139 } else if (commit->object.flags & COMMON_REF)
140 /* send "have", and ignore ancestors */
141 mark = COMMON | SEEN;
142 else
143 /* send "have", also for its ancestors */
144 mark = SEEN;
146 while (parents) {
147 if (!(parents->item->object.flags & SEEN))
148 rev_list_push(parents->item, mark);
149 if (mark & COMMON)
150 mark_common(parents->item, 1, 0);
151 parents = parents->next;
154 rev_list = rev_list->next;
157 return commit->object.sha1;
160 enum ack_type {
161 NAK = 0,
162 ACK,
163 ACK_continue,
164 ACK_common,
165 ACK_ready
168 static enum ack_type get_ack(int fd, unsigned char *result_sha1)
170 static char line[1000];
171 int len = packet_read_line(fd, line, sizeof(line));
173 if (!len)
174 die("git fetch-pack: expected ACK/NAK, got EOF");
175 if (line[len-1] == '\n')
176 line[--len] = 0;
177 if (!strcmp(line, "NAK"))
178 return NAK;
179 if (!prefixcmp(line, "ACK ")) {
180 if (!get_sha1_hex(line+4, result_sha1)) {
181 if (strstr(line+45, "continue"))
182 return ACK_continue;
183 if (strstr(line+45, "common"))
184 return ACK_common;
185 if (strstr(line+45, "ready"))
186 return ACK_ready;
187 return ACK;
190 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
193 static int find_common(int fd[2], unsigned char *result_sha1,
194 struct ref *refs)
196 int fetching;
197 int count = 0, flushes = 0, retval;
198 const unsigned char *sha1;
199 unsigned in_vain = 0;
200 int got_continue = 0;
201 struct strbuf req_buf = STRBUF_INIT;
203 if (marked)
204 for_each_ref(clear_marks, NULL);
205 marked = 1;
207 for_each_ref(rev_list_insert_ref, NULL);
209 fetching = 0;
210 for ( ; refs ; refs = refs->next) {
211 unsigned char *remote = refs->old_sha1;
212 const char *remote_hex;
213 struct object *o;
216 * If that object is complete (i.e. it is an ancestor of a
217 * local ref), we tell them we have it but do not have to
218 * tell them about its ancestors, which they already know
219 * about.
221 * We use lookup_object here because we are only
222 * interested in the case we *know* the object is
223 * reachable and we have already scanned it.
225 if (((o = lookup_object(remote)) != NULL) &&
226 (o->flags & COMPLETE)) {
227 continue;
230 remote_hex = sha1_to_hex(remote);
231 if (!fetching) {
232 struct strbuf c = STRBUF_INIT;
233 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
234 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
235 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
236 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
237 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
238 if (args.no_progress) strbuf_addstr(&c, " no-progress");
239 if (args.include_tag) strbuf_addstr(&c, " include-tag");
240 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
241 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
242 strbuf_release(&c);
243 } else
244 packet_buf_write(&req_buf, "want %s\n", remote_hex);
245 fetching++;
248 if (!fetching) {
249 strbuf_release(&req_buf);
250 packet_flush(fd[1]);
251 return 1;
254 if (is_repository_shallow())
255 write_shallow_commits(&req_buf, 1);
256 if (args.depth > 0)
257 packet_buf_write(&req_buf, "deepen %d", args.depth);
258 packet_buf_flush(&req_buf);
260 safe_write(fd[1], req_buf.buf, req_buf.len);
262 if (args.depth > 0) {
263 char line[1024];
264 unsigned char sha1[20];
266 while (packet_read_line(fd[0], line, sizeof(line))) {
267 if (!prefixcmp(line, "shallow ")) {
268 if (get_sha1_hex(line + 8, sha1))
269 die("invalid shallow line: %s", line);
270 register_shallow(sha1);
271 continue;
273 if (!prefixcmp(line, "unshallow ")) {
274 if (get_sha1_hex(line + 10, sha1))
275 die("invalid unshallow line: %s", line);
276 if (!lookup_object(sha1))
277 die("object not found: %s", line);
278 /* make sure that it is parsed as shallow */
279 if (!parse_object(sha1))
280 die("error in object: %s", line);
281 if (unregister_shallow(sha1))
282 die("no shallow found: %s", line);
283 continue;
285 die("expected shallow/unshallow, got %s", line);
289 flushes = 0;
290 retval = -1;
291 while ((sha1 = get_rev())) {
292 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
293 if (args.verbose)
294 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
295 in_vain++;
296 if (!(31 & ++count)) {
297 int ack;
299 packet_flush(fd[1]);
300 flushes++;
303 * We keep one window "ahead" of the other side, and
304 * will wait for an ACK only on the next one
306 if (count == 32)
307 continue;
309 do {
310 ack = get_ack(fd[0], result_sha1);
311 if (args.verbose && ack)
312 fprintf(stderr, "got ack %d %s\n", ack,
313 sha1_to_hex(result_sha1));
314 switch (ack) {
315 case ACK:
316 flushes = 0;
317 multi_ack = 0;
318 retval = 0;
319 goto done;
320 case ACK_common:
321 case ACK_ready:
322 case ACK_continue: {
323 struct commit *commit =
324 lookup_commit(result_sha1);
325 mark_common(commit, 0, 1);
326 retval = 0;
327 in_vain = 0;
328 got_continue = 1;
329 break;
332 } while (ack);
333 flushes--;
334 if (got_continue && MAX_IN_VAIN < in_vain) {
335 if (args.verbose)
336 fprintf(stderr, "giving up\n");
337 break; /* give up */
341 done:
342 packet_write(fd[1], "done\n");
343 if (args.verbose)
344 fprintf(stderr, "done\n");
345 if (retval != 0) {
346 multi_ack = 0;
347 flushes++;
349 strbuf_release(&req_buf);
351 while (flushes || multi_ack) {
352 int ack = get_ack(fd[0], result_sha1);
353 if (ack) {
354 if (args.verbose)
355 fprintf(stderr, "got ack (%d) %s\n", ack,
356 sha1_to_hex(result_sha1));
357 if (ack == ACK)
358 return 0;
359 multi_ack = 1;
360 continue;
362 flushes--;
364 /* it is no error to fetch into a completely empty repo */
365 return count ? retval : 0;
368 static struct commit_list *complete;
370 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
372 struct object *o = parse_object(sha1);
374 while (o && o->type == OBJ_TAG) {
375 struct tag *t = (struct tag *) o;
376 if (!t->tagged)
377 break; /* broken repository */
378 o->flags |= COMPLETE;
379 o = parse_object(t->tagged->sha1);
381 if (o && o->type == OBJ_COMMIT) {
382 struct commit *commit = (struct commit *)o;
383 commit->object.flags |= COMPLETE;
384 insert_by_date(commit, &complete);
386 return 0;
389 static void mark_recent_complete_commits(unsigned long cutoff)
391 while (complete && cutoff <= complete->item->date) {
392 if (args.verbose)
393 fprintf(stderr, "Marking %s as complete\n",
394 sha1_to_hex(complete->item->object.sha1));
395 pop_most_recent_commit(&complete, COMPLETE);
399 static void filter_refs(struct ref **refs, int nr_match, char **match)
401 struct ref **return_refs;
402 struct ref *newlist = NULL;
403 struct ref **newtail = &newlist;
404 struct ref *ref, *next;
405 struct ref *fastarray[32];
407 if (nr_match && !args.fetch_all) {
408 if (ARRAY_SIZE(fastarray) < nr_match)
409 return_refs = xcalloc(nr_match, sizeof(struct ref *));
410 else {
411 return_refs = fastarray;
412 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
415 else
416 return_refs = NULL;
418 for (ref = *refs; ref; ref = next) {
419 next = ref->next;
420 if (!memcmp(ref->name, "refs/", 5) &&
421 check_ref_format(ref->name + 5))
422 ; /* trash */
423 else if (args.fetch_all &&
424 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
425 *newtail = ref;
426 ref->next = NULL;
427 newtail = &ref->next;
428 continue;
430 else {
431 int order = path_match(ref->name, nr_match, match);
432 if (order) {
433 return_refs[order-1] = ref;
434 continue; /* we will link it later */
437 free(ref);
440 if (!args.fetch_all) {
441 int i;
442 for (i = 0; i < nr_match; i++) {
443 ref = return_refs[i];
444 if (ref) {
445 *newtail = ref;
446 ref->next = NULL;
447 newtail = &ref->next;
450 if (return_refs != fastarray)
451 free(return_refs);
453 *refs = newlist;
456 static int everything_local(struct ref **refs, int nr_match, char **match)
458 struct ref *ref;
459 int retval;
460 unsigned long cutoff = 0;
462 save_commit_buffer = 0;
464 for (ref = *refs; ref; ref = ref->next) {
465 struct object *o;
467 o = parse_object(ref->old_sha1);
468 if (!o)
469 continue;
471 /* We already have it -- which may mean that we were
472 * in sync with the other side at some time after
473 * that (it is OK if we guess wrong here).
475 if (o->type == OBJ_COMMIT) {
476 struct commit *commit = (struct commit *)o;
477 if (!cutoff || cutoff < commit->date)
478 cutoff = commit->date;
482 if (!args.depth) {
483 for_each_ref(mark_complete, NULL);
484 if (cutoff)
485 mark_recent_complete_commits(cutoff);
489 * Mark all complete remote refs as common refs.
490 * Don't mark them common yet; the server has to be told so first.
492 for (ref = *refs; ref; ref = ref->next) {
493 struct object *o = deref_tag(lookup_object(ref->old_sha1),
494 NULL, 0);
496 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
497 continue;
499 if (!(o->flags & SEEN)) {
500 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
502 mark_common((struct commit *)o, 1, 1);
506 filter_refs(refs, nr_match, match);
508 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
509 const unsigned char *remote = ref->old_sha1;
510 unsigned char local[20];
511 struct object *o;
513 o = lookup_object(remote);
514 if (!o || !(o->flags & COMPLETE)) {
515 retval = 0;
516 if (!args.verbose)
517 continue;
518 fprintf(stderr,
519 "want %s (%s)\n", sha1_to_hex(remote),
520 ref->name);
521 continue;
524 hashcpy(ref->new_sha1, local);
525 if (!args.verbose)
526 continue;
527 fprintf(stderr,
528 "already have %s (%s)\n", sha1_to_hex(remote),
529 ref->name);
531 return retval;
534 static int sideband_demux(int fd, void *data)
536 int *xd = data;
538 int ret = recv_sideband("fetch-pack", xd[0], fd);
539 close(fd);
540 return ret;
543 static int get_pack(int xd[2], char **pack_lockfile)
545 struct async demux;
546 const char *argv[20];
547 char keep_arg[256];
548 char hdr_arg[256];
549 const char **av;
550 int do_keep = args.keep_pack;
551 struct child_process cmd;
553 memset(&demux, 0, sizeof(demux));
554 if (use_sideband) {
555 /* xd[] is talking with upload-pack; subprocess reads from
556 * xd[0], spits out band#2 to stderr, and feeds us band#1
557 * through demux->out.
559 demux.proc = sideband_demux;
560 demux.data = xd;
561 if (start_async(&demux))
562 die("fetch-pack: unable to fork off sideband"
563 " demultiplexer");
565 else
566 demux.out = xd[0];
568 memset(&cmd, 0, sizeof(cmd));
569 cmd.argv = argv;
570 av = argv;
571 *hdr_arg = 0;
572 if (!args.keep_pack && unpack_limit) {
573 struct pack_header header;
575 if (read_pack_header(demux.out, &header))
576 die("protocol error: bad pack header");
577 snprintf(hdr_arg, sizeof(hdr_arg),
578 "--pack_header=%"PRIu32",%"PRIu32,
579 ntohl(header.hdr_version), ntohl(header.hdr_entries));
580 if (ntohl(header.hdr_entries) < unpack_limit)
581 do_keep = 0;
582 else
583 do_keep = 1;
586 if (do_keep) {
587 if (pack_lockfile)
588 cmd.out = -1;
589 *av++ = "index-pack";
590 *av++ = "--stdin";
591 if (!args.quiet && !args.no_progress)
592 *av++ = "-v";
593 if (args.use_thin_pack)
594 *av++ = "--fix-thin";
595 if (args.lock_pack || unpack_limit) {
596 int s = sprintf(keep_arg,
597 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
598 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
599 strcpy(keep_arg + s, "localhost");
600 *av++ = keep_arg;
603 else {
604 *av++ = "unpack-objects";
605 if (args.quiet)
606 *av++ = "-q";
608 if (*hdr_arg)
609 *av++ = hdr_arg;
610 *av++ = NULL;
612 cmd.in = demux.out;
613 cmd.git_cmd = 1;
614 if (start_command(&cmd))
615 die("fetch-pack: unable to fork off %s", argv[0]);
616 if (do_keep && pack_lockfile) {
617 *pack_lockfile = index_pack_lockfile(cmd.out);
618 close(cmd.out);
621 if (finish_command(&cmd))
622 die("%s failed", argv[0]);
623 if (use_sideband && finish_async(&demux))
624 die("error in sideband demultiplexer");
625 return 0;
628 static struct ref *do_fetch_pack(int fd[2],
629 const struct ref *orig_ref,
630 int nr_match,
631 char **match,
632 char **pack_lockfile)
634 struct ref *ref = copy_ref_list(orig_ref);
635 unsigned char sha1[20];
637 if (is_repository_shallow() && !server_supports("shallow"))
638 die("Server does not support shallow clients");
639 if (server_supports("multi_ack_detailed")) {
640 if (args.verbose)
641 fprintf(stderr, "Server supports multi_ack_detailed\n");
642 multi_ack = 2;
644 else if (server_supports("multi_ack")) {
645 if (args.verbose)
646 fprintf(stderr, "Server supports multi_ack\n");
647 multi_ack = 1;
649 if (server_supports("side-band-64k")) {
650 if (args.verbose)
651 fprintf(stderr, "Server supports side-band-64k\n");
652 use_sideband = 2;
654 else if (server_supports("side-band")) {
655 if (args.verbose)
656 fprintf(stderr, "Server supports side-band\n");
657 use_sideband = 1;
659 if (server_supports("ofs-delta")) {
660 if (args.verbose)
661 fprintf(stderr, "Server supports ofs-delta\n");
662 } else
663 prefer_ofs_delta = 0;
664 if (everything_local(&ref, nr_match, match)) {
665 packet_flush(fd[1]);
666 goto all_done;
668 if (find_common(fd, sha1, ref) < 0)
669 if (!args.keep_pack)
670 /* When cloning, it is not unusual to have
671 * no common commit.
673 warning("no common commits");
675 if (get_pack(fd, pack_lockfile))
676 die("git fetch-pack: fetch failed.");
678 all_done:
679 return ref;
682 static int remove_duplicates(int nr_heads, char **heads)
684 int src, dst;
686 for (src = dst = 0; src < nr_heads; src++) {
687 /* If heads[src] is different from any of
688 * heads[0..dst], push it in.
690 int i;
691 for (i = 0; i < dst; i++) {
692 if (!strcmp(heads[i], heads[src]))
693 break;
695 if (i < dst)
696 continue;
697 if (src != dst)
698 heads[dst] = heads[src];
699 dst++;
701 return dst;
704 static int fetch_pack_config(const char *var, const char *value, void *cb)
706 if (strcmp(var, "fetch.unpacklimit") == 0) {
707 fetch_unpack_limit = git_config_int(var, value);
708 return 0;
711 if (strcmp(var, "transfer.unpacklimit") == 0) {
712 transfer_unpack_limit = git_config_int(var, value);
713 return 0;
716 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
717 prefer_ofs_delta = git_config_bool(var, value);
718 return 0;
721 return git_default_config(var, value, cb);
724 static struct lock_file lock;
726 static void fetch_pack_setup(void)
728 static int did_setup;
729 if (did_setup)
730 return;
731 git_config(fetch_pack_config, NULL);
732 if (0 <= transfer_unpack_limit)
733 unpack_limit = transfer_unpack_limit;
734 else if (0 <= fetch_unpack_limit)
735 unpack_limit = fetch_unpack_limit;
736 did_setup = 1;
739 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
741 int i, ret, nr_heads;
742 struct ref *ref = NULL;
743 char *dest = NULL, **heads;
744 int fd[2];
745 struct child_process *conn;
747 nr_heads = 0;
748 heads = NULL;
749 for (i = 1; i < argc; i++) {
750 const char *arg = argv[i];
752 if (*arg == '-') {
753 if (!prefixcmp(arg, "--upload-pack=")) {
754 args.uploadpack = arg + 14;
755 continue;
757 if (!prefixcmp(arg, "--exec=")) {
758 args.uploadpack = arg + 7;
759 continue;
761 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
762 args.quiet = 1;
763 continue;
765 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
766 args.lock_pack = args.keep_pack;
767 args.keep_pack = 1;
768 continue;
770 if (!strcmp("--thin", arg)) {
771 args.use_thin_pack = 1;
772 continue;
774 if (!strcmp("--include-tag", arg)) {
775 args.include_tag = 1;
776 continue;
778 if (!strcmp("--all", arg)) {
779 args.fetch_all = 1;
780 continue;
782 if (!strcmp("-v", arg)) {
783 args.verbose = 1;
784 continue;
786 if (!prefixcmp(arg, "--depth=")) {
787 args.depth = strtol(arg + 8, NULL, 0);
788 continue;
790 if (!strcmp("--no-progress", arg)) {
791 args.no_progress = 1;
792 continue;
794 usage(fetch_pack_usage);
796 dest = (char *)arg;
797 heads = (char **)(argv + i + 1);
798 nr_heads = argc - i - 1;
799 break;
801 if (!dest)
802 usage(fetch_pack_usage);
804 conn = git_connect(fd, (char *)dest, args.uploadpack,
805 args.verbose ? CONNECT_VERBOSE : 0);
806 if (conn) {
807 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
809 ref = fetch_pack(&args, fd, conn, ref, dest, nr_heads, heads, NULL);
810 close(fd[0]);
811 close(fd[1]);
812 if (finish_connect(conn))
813 ref = NULL;
814 } else {
815 ref = NULL;
817 ret = !ref;
819 if (!ret && nr_heads) {
820 /* If the heads to pull were given, we should have
821 * consumed all of them by matching the remote.
822 * Otherwise, 'git fetch remote no-such-ref' would
823 * silently succeed without issuing an error.
825 for (i = 0; i < nr_heads; i++)
826 if (heads[i] && heads[i][0]) {
827 error("no such remote ref %s", heads[i]);
828 ret = 1;
831 while (ref) {
832 printf("%s %s\n",
833 sha1_to_hex(ref->old_sha1), ref->name);
834 ref = ref->next;
837 return ret;
840 struct ref *fetch_pack(struct fetch_pack_args *my_args,
841 int fd[], struct child_process *conn,
842 const struct ref *ref,
843 const char *dest,
844 int nr_heads,
845 char **heads,
846 char **pack_lockfile)
848 struct stat st;
849 struct ref *ref_cpy;
851 fetch_pack_setup();
852 if (&args != my_args)
853 memcpy(&args, my_args, sizeof(args));
854 if (args.depth > 0) {
855 if (stat(git_path("shallow"), &st))
856 st.st_mtime = 0;
859 if (heads && nr_heads)
860 nr_heads = remove_duplicates(nr_heads, heads);
861 if (!ref) {
862 packet_flush(fd[1]);
863 die("no matching remote head");
865 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
867 if (args.depth > 0) {
868 struct cache_time mtime;
869 struct strbuf sb = STRBUF_INIT;
870 char *shallow = git_path("shallow");
871 int fd;
873 mtime.sec = st.st_mtime;
874 mtime.nsec = ST_MTIME_NSEC(st);
875 if (stat(shallow, &st)) {
876 if (mtime.sec)
877 die("shallow file was removed during fetch");
878 } else if (st.st_mtime != mtime.sec
879 #ifdef USE_NSEC
880 || ST_MTIME_NSEC(st) != mtime.nsec
881 #endif
883 die("shallow file was changed during fetch");
885 fd = hold_lock_file_for_update(&lock, shallow,
886 LOCK_DIE_ON_ERROR);
887 if (!write_shallow_commits(&sb, 0)
888 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
889 unlink_or_warn(shallow);
890 rollback_lock_file(&lock);
891 } else {
892 commit_lock_file(&lock);
894 strbuf_release(&sb);
897 reprepare_packed_git();
898 return ref_cpy;