Move "get_ack()" back to fetch-pack
[git/jrn.git] / builtin-fetch-pack.c
blob7c09d466c85b645ef17b8456cd007011d50b3a5c
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 static int get_ack(int fd, unsigned char *result_sha1)
162 static char line[1000];
163 int len = packet_read_line(fd, line, sizeof(line));
165 if (!len)
166 die("git fetch-pack: expected ACK/NAK, got EOF");
167 if (line[len-1] == '\n')
168 line[--len] = 0;
169 if (!strcmp(line, "NAK"))
170 return 0;
171 if (!prefixcmp(line, "ACK ")) {
172 if (!get_sha1_hex(line+4, result_sha1)) {
173 if (strstr(line+45, "continue"))
174 return 2;
175 return 1;
178 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
181 static int find_common(int fd[2], unsigned char *result_sha1,
182 struct ref *refs)
184 int fetching;
185 int count = 0, flushes = 0, retval;
186 const unsigned char *sha1;
187 unsigned in_vain = 0;
188 int got_continue = 0;
189 struct strbuf req_buf = STRBUF_INIT;
191 if (marked)
192 for_each_ref(clear_marks, NULL);
193 marked = 1;
195 for_each_ref(rev_list_insert_ref, NULL);
197 fetching = 0;
198 for ( ; refs ; refs = refs->next) {
199 unsigned char *remote = refs->old_sha1;
200 const char *remote_hex;
201 struct object *o;
204 * If that object is complete (i.e. it is an ancestor of a
205 * local ref), we tell them we have it but do not have to
206 * tell them about its ancestors, which they already know
207 * about.
209 * We use lookup_object here because we are only
210 * interested in the case we *know* the object is
211 * reachable and we have already scanned it.
213 if (((o = lookup_object(remote)) != NULL) &&
214 (o->flags & COMPLETE)) {
215 continue;
218 remote_hex = sha1_to_hex(remote);
219 if (!fetching) {
220 struct strbuf c = STRBUF_INIT;
221 if (multi_ack) strbuf_addstr(&c, " multi_ack");
222 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
223 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
224 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
225 if (args.no_progress) strbuf_addstr(&c, " no-progress");
226 if (args.include_tag) strbuf_addstr(&c, " include-tag");
227 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
228 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
229 strbuf_release(&c);
230 } else
231 packet_buf_write(&req_buf, "want %s\n", remote_hex);
232 fetching++;
235 if (!fetching) {
236 strbuf_release(&req_buf);
237 packet_flush(fd[1]);
238 return 1;
241 if (is_repository_shallow())
242 write_shallow_commits(&req_buf, 1);
243 if (args.depth > 0)
244 packet_buf_write(&req_buf, "deepen %d", args.depth);
245 packet_buf_flush(&req_buf);
247 safe_write(fd[1], req_buf.buf, req_buf.len);
249 if (args.depth > 0) {
250 char line[1024];
251 unsigned char sha1[20];
253 while (packet_read_line(fd[0], line, sizeof(line))) {
254 if (!prefixcmp(line, "shallow ")) {
255 if (get_sha1_hex(line + 8, sha1))
256 die("invalid shallow line: %s", line);
257 register_shallow(sha1);
258 continue;
260 if (!prefixcmp(line, "unshallow ")) {
261 if (get_sha1_hex(line + 10, sha1))
262 die("invalid unshallow line: %s", line);
263 if (!lookup_object(sha1))
264 die("object not found: %s", line);
265 /* make sure that it is parsed as shallow */
266 if (!parse_object(sha1))
267 die("error in object: %s", line);
268 if (unregister_shallow(sha1))
269 die("no shallow found: %s", line);
270 continue;
272 die("expected shallow/unshallow, got %s", line);
276 flushes = 0;
277 retval = -1;
278 while ((sha1 = get_rev())) {
279 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
280 if (args.verbose)
281 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
282 in_vain++;
283 if (!(31 & ++count)) {
284 int ack;
286 packet_flush(fd[1]);
287 flushes++;
290 * We keep one window "ahead" of the other side, and
291 * will wait for an ACK only on the next one
293 if (count == 32)
294 continue;
296 do {
297 ack = get_ack(fd[0], result_sha1);
298 if (args.verbose && ack)
299 fprintf(stderr, "got ack %d %s\n", ack,
300 sha1_to_hex(result_sha1));
301 if (ack == 1) {
302 flushes = 0;
303 multi_ack = 0;
304 retval = 0;
305 goto done;
306 } else if (ack == 2) {
307 struct commit *commit =
308 lookup_commit(result_sha1);
309 mark_common(commit, 0, 1);
310 retval = 0;
311 in_vain = 0;
312 got_continue = 1;
314 } while (ack);
315 flushes--;
316 if (got_continue && MAX_IN_VAIN < in_vain) {
317 if (args.verbose)
318 fprintf(stderr, "giving up\n");
319 break; /* give up */
323 done:
324 packet_write(fd[1], "done\n");
325 if (args.verbose)
326 fprintf(stderr, "done\n");
327 if (retval != 0) {
328 multi_ack = 0;
329 flushes++;
331 strbuf_release(&req_buf);
333 while (flushes || multi_ack) {
334 int ack = get_ack(fd[0], result_sha1);
335 if (ack) {
336 if (args.verbose)
337 fprintf(stderr, "got ack (%d) %s\n", ack,
338 sha1_to_hex(result_sha1));
339 if (ack == 1)
340 return 0;
341 multi_ack = 1;
342 continue;
344 flushes--;
346 /* it is no error to fetch into a completely empty repo */
347 return count ? retval : 0;
350 static struct commit_list *complete;
352 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
354 struct object *o = parse_object(sha1);
356 while (o && o->type == OBJ_TAG) {
357 struct tag *t = (struct tag *) o;
358 if (!t->tagged)
359 break; /* broken repository */
360 o->flags |= COMPLETE;
361 o = parse_object(t->tagged->sha1);
363 if (o && o->type == OBJ_COMMIT) {
364 struct commit *commit = (struct commit *)o;
365 commit->object.flags |= COMPLETE;
366 insert_by_date(commit, &complete);
368 return 0;
371 static void mark_recent_complete_commits(unsigned long cutoff)
373 while (complete && cutoff <= complete->item->date) {
374 if (args.verbose)
375 fprintf(stderr, "Marking %s as complete\n",
376 sha1_to_hex(complete->item->object.sha1));
377 pop_most_recent_commit(&complete, COMPLETE);
381 static void filter_refs(struct ref **refs, int nr_match, char **match)
383 struct ref **return_refs;
384 struct ref *newlist = NULL;
385 struct ref **newtail = &newlist;
386 struct ref *ref, *next;
387 struct ref *fastarray[32];
389 if (nr_match && !args.fetch_all) {
390 if (ARRAY_SIZE(fastarray) < nr_match)
391 return_refs = xcalloc(nr_match, sizeof(struct ref *));
392 else {
393 return_refs = fastarray;
394 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
397 else
398 return_refs = NULL;
400 for (ref = *refs; ref; ref = next) {
401 next = ref->next;
402 if (!memcmp(ref->name, "refs/", 5) &&
403 check_ref_format(ref->name + 5))
404 ; /* trash */
405 else if (args.fetch_all &&
406 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
407 *newtail = ref;
408 ref->next = NULL;
409 newtail = &ref->next;
410 continue;
412 else {
413 int order = path_match(ref->name, nr_match, match);
414 if (order) {
415 return_refs[order-1] = ref;
416 continue; /* we will link it later */
419 free(ref);
422 if (!args.fetch_all) {
423 int i;
424 for (i = 0; i < nr_match; i++) {
425 ref = return_refs[i];
426 if (ref) {
427 *newtail = ref;
428 ref->next = NULL;
429 newtail = &ref->next;
432 if (return_refs != fastarray)
433 free(return_refs);
435 *refs = newlist;
438 static int everything_local(struct ref **refs, int nr_match, char **match)
440 struct ref *ref;
441 int retval;
442 unsigned long cutoff = 0;
444 save_commit_buffer = 0;
446 for (ref = *refs; ref; ref = ref->next) {
447 struct object *o;
449 o = parse_object(ref->old_sha1);
450 if (!o)
451 continue;
453 /* We already have it -- which may mean that we were
454 * in sync with the other side at some time after
455 * that (it is OK if we guess wrong here).
457 if (o->type == OBJ_COMMIT) {
458 struct commit *commit = (struct commit *)o;
459 if (!cutoff || cutoff < commit->date)
460 cutoff = commit->date;
464 if (!args.depth) {
465 for_each_ref(mark_complete, NULL);
466 if (cutoff)
467 mark_recent_complete_commits(cutoff);
471 * Mark all complete remote refs as common refs.
472 * Don't mark them common yet; the server has to be told so first.
474 for (ref = *refs; ref; ref = ref->next) {
475 struct object *o = deref_tag(lookup_object(ref->old_sha1),
476 NULL, 0);
478 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
479 continue;
481 if (!(o->flags & SEEN)) {
482 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
484 mark_common((struct commit *)o, 1, 1);
488 filter_refs(refs, nr_match, match);
490 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
491 const unsigned char *remote = ref->old_sha1;
492 unsigned char local[20];
493 struct object *o;
495 o = lookup_object(remote);
496 if (!o || !(o->flags & COMPLETE)) {
497 retval = 0;
498 if (!args.verbose)
499 continue;
500 fprintf(stderr,
501 "want %s (%s)\n", sha1_to_hex(remote),
502 ref->name);
503 continue;
506 hashcpy(ref->new_sha1, local);
507 if (!args.verbose)
508 continue;
509 fprintf(stderr,
510 "already have %s (%s)\n", sha1_to_hex(remote),
511 ref->name);
513 return retval;
516 static int sideband_demux(int fd, void *data)
518 int *xd = data;
520 int ret = recv_sideband("fetch-pack", xd[0], fd);
521 close(fd);
522 return ret;
525 static int get_pack(int xd[2], char **pack_lockfile)
527 struct async demux;
528 const char *argv[20];
529 char keep_arg[256];
530 char hdr_arg[256];
531 const char **av;
532 int do_keep = args.keep_pack;
533 struct child_process cmd;
535 memset(&demux, 0, sizeof(demux));
536 if (use_sideband) {
537 /* xd[] is talking with upload-pack; subprocess reads from
538 * xd[0], spits out band#2 to stderr, and feeds us band#1
539 * through demux->out.
541 demux.proc = sideband_demux;
542 demux.data = xd;
543 if (start_async(&demux))
544 die("fetch-pack: unable to fork off sideband"
545 " demultiplexer");
547 else
548 demux.out = xd[0];
550 memset(&cmd, 0, sizeof(cmd));
551 cmd.argv = argv;
552 av = argv;
553 *hdr_arg = 0;
554 if (!args.keep_pack && unpack_limit) {
555 struct pack_header header;
557 if (read_pack_header(demux.out, &header))
558 die("protocol error: bad pack header");
559 snprintf(hdr_arg, sizeof(hdr_arg),
560 "--pack_header=%"PRIu32",%"PRIu32,
561 ntohl(header.hdr_version), ntohl(header.hdr_entries));
562 if (ntohl(header.hdr_entries) < unpack_limit)
563 do_keep = 0;
564 else
565 do_keep = 1;
568 if (do_keep) {
569 if (pack_lockfile)
570 cmd.out = -1;
571 *av++ = "index-pack";
572 *av++ = "--stdin";
573 if (!args.quiet && !args.no_progress)
574 *av++ = "-v";
575 if (args.use_thin_pack)
576 *av++ = "--fix-thin";
577 if (args.lock_pack || unpack_limit) {
578 int s = sprintf(keep_arg,
579 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
580 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
581 strcpy(keep_arg + s, "localhost");
582 *av++ = keep_arg;
585 else {
586 *av++ = "unpack-objects";
587 if (args.quiet)
588 *av++ = "-q";
590 if (*hdr_arg)
591 *av++ = hdr_arg;
592 *av++ = NULL;
594 cmd.in = demux.out;
595 cmd.git_cmd = 1;
596 if (start_command(&cmd))
597 die("fetch-pack: unable to fork off %s", argv[0]);
598 if (do_keep && pack_lockfile) {
599 *pack_lockfile = index_pack_lockfile(cmd.out);
600 close(cmd.out);
603 if (finish_command(&cmd))
604 die("%s failed", argv[0]);
605 if (use_sideband && finish_async(&demux))
606 die("error in sideband demultiplexer");
607 return 0;
610 static struct ref *do_fetch_pack(int fd[2],
611 const struct ref *orig_ref,
612 int nr_match,
613 char **match,
614 char **pack_lockfile)
616 struct ref *ref = copy_ref_list(orig_ref);
617 unsigned char sha1[20];
619 if (is_repository_shallow() && !server_supports("shallow"))
620 die("Server does not support shallow clients");
621 if (server_supports("multi_ack")) {
622 if (args.verbose)
623 fprintf(stderr, "Server supports multi_ack\n");
624 multi_ack = 1;
626 if (server_supports("side-band-64k")) {
627 if (args.verbose)
628 fprintf(stderr, "Server supports side-band-64k\n");
629 use_sideband = 2;
631 else if (server_supports("side-band")) {
632 if (args.verbose)
633 fprintf(stderr, "Server supports side-band\n");
634 use_sideband = 1;
636 if (server_supports("ofs-delta")) {
637 if (args.verbose)
638 fprintf(stderr, "Server supports ofs-delta\n");
639 } else
640 prefer_ofs_delta = 0;
641 if (everything_local(&ref, nr_match, match)) {
642 packet_flush(fd[1]);
643 goto all_done;
645 if (find_common(fd, sha1, ref) < 0)
646 if (!args.keep_pack)
647 /* When cloning, it is not unusual to have
648 * no common commit.
650 warning("no common commits");
652 if (get_pack(fd, pack_lockfile))
653 die("git fetch-pack: fetch failed.");
655 all_done:
656 return ref;
659 static int remove_duplicates(int nr_heads, char **heads)
661 int src, dst;
663 for (src = dst = 0; src < nr_heads; src++) {
664 /* If heads[src] is different from any of
665 * heads[0..dst], push it in.
667 int i;
668 for (i = 0; i < dst; i++) {
669 if (!strcmp(heads[i], heads[src]))
670 break;
672 if (i < dst)
673 continue;
674 if (src != dst)
675 heads[dst] = heads[src];
676 dst++;
678 return dst;
681 static int fetch_pack_config(const char *var, const char *value, void *cb)
683 if (strcmp(var, "fetch.unpacklimit") == 0) {
684 fetch_unpack_limit = git_config_int(var, value);
685 return 0;
688 if (strcmp(var, "transfer.unpacklimit") == 0) {
689 transfer_unpack_limit = git_config_int(var, value);
690 return 0;
693 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
694 prefer_ofs_delta = git_config_bool(var, value);
695 return 0;
698 return git_default_config(var, value, cb);
701 static struct lock_file lock;
703 static void fetch_pack_setup(void)
705 static int did_setup;
706 if (did_setup)
707 return;
708 git_config(fetch_pack_config, NULL);
709 if (0 <= transfer_unpack_limit)
710 unpack_limit = transfer_unpack_limit;
711 else if (0 <= fetch_unpack_limit)
712 unpack_limit = fetch_unpack_limit;
713 did_setup = 1;
716 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
718 int i, ret, nr_heads;
719 struct ref *ref = NULL;
720 char *dest = NULL, **heads;
721 int fd[2];
722 struct child_process *conn;
724 nr_heads = 0;
725 heads = NULL;
726 for (i = 1; i < argc; i++) {
727 const char *arg = argv[i];
729 if (*arg == '-') {
730 if (!prefixcmp(arg, "--upload-pack=")) {
731 args.uploadpack = arg + 14;
732 continue;
734 if (!prefixcmp(arg, "--exec=")) {
735 args.uploadpack = arg + 7;
736 continue;
738 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
739 args.quiet = 1;
740 continue;
742 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
743 args.lock_pack = args.keep_pack;
744 args.keep_pack = 1;
745 continue;
747 if (!strcmp("--thin", arg)) {
748 args.use_thin_pack = 1;
749 continue;
751 if (!strcmp("--include-tag", arg)) {
752 args.include_tag = 1;
753 continue;
755 if (!strcmp("--all", arg)) {
756 args.fetch_all = 1;
757 continue;
759 if (!strcmp("-v", arg)) {
760 args.verbose = 1;
761 continue;
763 if (!prefixcmp(arg, "--depth=")) {
764 args.depth = strtol(arg + 8, NULL, 0);
765 continue;
767 if (!strcmp("--no-progress", arg)) {
768 args.no_progress = 1;
769 continue;
771 usage(fetch_pack_usage);
773 dest = (char *)arg;
774 heads = (char **)(argv + i + 1);
775 nr_heads = argc - i - 1;
776 break;
778 if (!dest)
779 usage(fetch_pack_usage);
781 conn = git_connect(fd, (char *)dest, args.uploadpack,
782 args.verbose ? CONNECT_VERBOSE : 0);
783 if (conn) {
784 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
786 ref = fetch_pack(&args, fd, conn, ref, dest, nr_heads, heads, NULL);
787 close(fd[0]);
788 close(fd[1]);
789 if (finish_connect(conn))
790 ref = NULL;
791 } else {
792 ref = NULL;
794 ret = !ref;
796 if (!ret && nr_heads) {
797 /* If the heads to pull were given, we should have
798 * consumed all of them by matching the remote.
799 * Otherwise, 'git fetch remote no-such-ref' would
800 * silently succeed without issuing an error.
802 for (i = 0; i < nr_heads; i++)
803 if (heads[i] && heads[i][0]) {
804 error("no such remote ref %s", heads[i]);
805 ret = 1;
808 while (ref) {
809 printf("%s %s\n",
810 sha1_to_hex(ref->old_sha1), ref->name);
811 ref = ref->next;
814 return ret;
817 struct ref *fetch_pack(struct fetch_pack_args *my_args,
818 int fd[], struct child_process *conn,
819 const struct ref *ref,
820 const char *dest,
821 int nr_heads,
822 char **heads,
823 char **pack_lockfile)
825 struct stat st;
826 struct ref *ref_cpy;
828 fetch_pack_setup();
829 if (&args != my_args)
830 memcpy(&args, my_args, sizeof(args));
831 if (args.depth > 0) {
832 if (stat(git_path("shallow"), &st))
833 st.st_mtime = 0;
836 if (heads && nr_heads)
837 nr_heads = remove_duplicates(nr_heads, heads);
838 if (!ref) {
839 packet_flush(fd[1]);
840 die("no matching remote head");
842 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
844 if (args.depth > 0) {
845 struct cache_time mtime;
846 struct strbuf sb = STRBUF_INIT;
847 char *shallow = git_path("shallow");
848 int fd;
850 mtime.sec = st.st_mtime;
851 mtime.nsec = ST_MTIME_NSEC(st);
852 if (stat(shallow, &st)) {
853 if (mtime.sec)
854 die("shallow file was removed during fetch");
855 } else if (st.st_mtime != mtime.sec
856 #ifdef USE_NSEC
857 || ST_MTIME_NSEC(st) != mtime.nsec
858 #endif
860 die("shallow file was changed during fetch");
862 fd = hold_lock_file_for_update(&lock, shallow,
863 LOCK_DIE_ON_ERROR);
864 if (!write_shallow_commits(&sb, 0)
865 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
866 unlink_or_warn(shallow);
867 rollback_lock_file(&lock);
868 } else {
869 commit_lock_file(&lock);
871 strbuf_release(&sb);
874 reprepare_packed_git();
875 return ref_cpy;