blob: 629735f54723a3bc3b24f8c91e9a6226ae28d742 [file] [log] [blame]
Linus Torvaldsdef88e92005-07-04 13:26:53 -07001#include "cache.h"
Linus Torvaldsfb9040c2005-07-04 15:29:17 -07002#include "refs.h"
Linus Torvaldsdef88e92005-07-04 13:26:53 -07003#include "pkt-line.h"
Junio C Hamano49bb8052005-10-19 14:27:02 -07004#include "commit.h"
5#include "tag.h"
Nicolas Pitreda093d32006-11-01 17:06:23 -05006#include "exec_cmd.h"
Junio C Hamano9e10fd12007-01-22 22:37:33 -08007#include "pack.h"
Nicolas Pitreda093d32006-11-01 17:06:23 -05008#include "sideband.h"
Daniel Barkalow2d4177c2007-09-10 23:03:00 -04009#include "fetch-pack.h"
Daniel Barkalowba227852008-02-04 13:26:23 -050010#include "remote.h"
Johannes Sixt477822c2007-10-19 21:47:57 +020011#include "run-command.h"
Linus Torvaldsdef88e92005-07-04 13:26:53 -070012
Junio C Hamanoe28714c2007-01-24 17:02:15 -080013static int transfer_unpack_limit = -1;
14static int fetch_unpack_limit = -1;
Junio C Hamanoaf7cf262007-01-24 16:47:24 -080015static int unpack_limit = 100;
Nicolas Pitref04833e2009-05-01 20:18:02 -040016static int prefer_ofs_delta = 1;
Daniel Barkalow09149c72007-10-29 22:35:08 -040017static struct fetch_pack_args args = {
18 /* .uploadpack = */ "git-upload-pack",
19};
Shawn O. Pearcefa740522007-09-19 00:49:35 -040020
Junio C Hamano33b83032005-08-12 02:08:29 -070021static const char fetch_pack_usage[] =
Stephan Beyer1b1dd232008-07-13 15:36:15 +020022"git fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
Linus Torvaldsdef88e92005-07-04 13:26:53 -070023
Johannes Schindelin0a8944d2005-10-19 16:14:34 -070024#define COMPLETE (1U << 0)
Johannes Schindelin23d61f82005-10-28 04:46:27 +020025#define COMMON (1U << 1)
26#define COMMON_REF (1U << 2)
27#define SEEN (1U << 3)
28#define POPPED (1U << 4)
29
Daniel Barkalow420e9af2008-03-17 22:15:02 -040030static int marked;
31
Junio C Hamanof061e5f2006-05-24 21:48:34 -070032/*
33 * After sending this many "have"s if we do not get any new ACK , we
34 * give up traversing our history.
35 */
36#define MAX_IN_VAIN 256
37
David Rientjes96f1e582006-08-15 10:23:48 -070038static struct commit_list *rev_list;
Nicolas Pitre3891f392007-11-07 17:20:22 -050039static int non_common_revs, multi_ack, use_sideband;
Johannes Schindelin23d61f82005-10-28 04:46:27 +020040
41static void rev_list_push(struct commit *commit, int mark)
42{
43 if (!(commit->object.flags & mark)) {
44 commit->object.flags |= mark;
45
46 if (!(commit->object.parsed))
Martin Koeglerf3ec5492008-03-03 07:31:23 +010047 if (parse_commit(commit))
48 return;
Johannes Schindelin23d61f82005-10-28 04:46:27 +020049
50 insert_by_date(commit, &rev_list);
51
52 if (!(commit->object.flags & COMMON))
53 non_common_revs++;
54 }
55}
56
Junio C Hamano8da19772006-09-20 22:02:01 -070057static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
Johannes Schindelin23d61f82005-10-28 04:46:27 +020058{
Junio C Hamano9534f402005-11-02 15:19:13 -080059 struct object *o = deref_tag(parse_object(sha1), path, 0);
Johannes Schindelin23d61f82005-10-28 04:46:27 +020060
Linus Torvalds19746322006-07-11 20:45:31 -070061 if (o && o->type == OBJ_COMMIT)
Johannes Schindelin23d61f82005-10-28 04:46:27 +020062 rev_list_push((struct commit *)o, SEEN);
63
64 return 0;
65}
66
Daniel Barkalow420e9af2008-03-17 22:15:02 -040067static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
68{
69 struct object *o = deref_tag(parse_object(sha1), path, 0);
70
71 if (o && o->type == OBJ_COMMIT)
72 clear_commit_marks((struct commit *)o,
73 COMMON | COMMON_REF | SEEN | POPPED);
74 return 0;
75}
76
Johannes Schindelin23d61f82005-10-28 04:46:27 +020077/*
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).
81*/
82
83static void mark_common(struct commit *commit,
84 int ancestors_only, int dont_parse)
85{
86 if (commit != NULL && !(commit->object.flags & COMMON)) {
87 struct object *o = (struct object *)commit;
88
89 if (!ancestors_only)
90 o->flags |= COMMON;
91
92 if (!(o->flags & SEEN))
93 rev_list_push(commit, SEEN);
94 else {
95 struct commit_list *parents;
96
97 if (!ancestors_only && !(o->flags & POPPED))
98 non_common_revs--;
99 if (!o->parsed && !dont_parse)
Martin Koeglerf3ec5492008-03-03 07:31:23 +0100100 if (parse_commit(commit))
101 return;
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200102
103 for (parents = commit->parents;
104 parents;
105 parents = parents->next)
106 mark_common(parents->item, 0, dont_parse);
107 }
108 }
109}
110
111/*
112 Get the next rev to send, ignoring the common.
113*/
114
Felipe Contreras4b25d092009-05-01 12:06:36 +0300115static const unsigned char *get_rev(void)
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200116{
117 struct commit *commit = NULL;
118
119 while (commit == NULL) {
120 unsigned int mark;
Linus Torvalds72269ad2008-04-28 16:27:49 -0700121 struct commit_list *parents;
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200122
123 if (rev_list == NULL || non_common_revs == 0)
124 return NULL;
125
126 commit = rev_list->item;
Junio C Hamano2d8bed92008-04-30 11:42:05 -0700127 if (!commit->object.parsed)
Linus Torvalds72269ad2008-04-28 16:27:49 -0700128 parse_commit(commit);
129 parents = commit->parents;
Martin Koeglerf3ec5492008-03-03 07:31:23 +0100130
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200131 commit->object.flags |= POPPED;
132 if (!(commit->object.flags & COMMON))
133 non_common_revs--;
Junio C Hamanoa6080a02007-06-07 00:04:01 -0700134
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200135 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;
145
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;
152 }
153
154 rev_list = rev_list->next;
155 }
156
157 return commit->object.sha1;
158}
Johannes Schindelin0a8944d2005-10-19 16:14:34 -0700159
Junio C Hamano33b83032005-08-12 02:08:29 -0700160static int find_common(int fd[2], unsigned char *result_sha1,
161 struct ref *refs)
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700162{
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700163 int fetching;
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200164 int count = 0, flushes = 0, retval;
165 const unsigned char *sha1;
Junio C Hamanof061e5f2006-05-24 21:48:34 -0700166 unsigned in_vain = 0;
167 int got_continue = 0;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700168
Daniel Barkalow420e9af2008-03-17 22:15:02 -0400169 if (marked)
170 for_each_ref(clear_marks, NULL);
171 marked = 1;
172
Junio C Hamanocb5d7092006-09-20 21:47:42 -0700173 for_each_ref(rev_list_insert_ref, NULL);
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200174
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700175 fetching = 0;
176 for ( ; refs ; refs = refs->next) {
Junio C Hamano33b83032005-08-12 02:08:29 -0700177 unsigned char *remote = refs->old_sha1;
Junio C Hamano4dab94d2005-10-19 18:28:17 -0700178 struct object *o;
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700179
Johannes Schindelin0a8944d2005-10-19 16:14:34 -0700180 /*
Junio C Hamano4dab94d2005-10-19 18:28:17 -0700181 * If that object is complete (i.e. it is an ancestor of a
182 * local ref), we tell them we have it but do not have to
183 * tell them about its ancestors, which they already know
184 * about.
Junio C Hamanof1f0a2b2005-10-19 21:55:49 -0700185 *
186 * We use lookup_object here because we are only
187 * interested in the case we *know* the object is
188 * reachable and we have already scanned it.
Junio C Hamano4dab94d2005-10-19 18:28:17 -0700189 */
Junio C Hamanof1f0a2b2005-10-19 21:55:49 -0700190 if (((o = lookup_object(remote)) != NULL) &&
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200191 (o->flags & COMPLETE)) {
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700192 continue;
Johannes Schindelin0a8944d2005-10-19 16:14:34 -0700193 }
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200194
Junio C Hamano583b7ea2006-06-21 00:30:21 -0700195 if (!fetching)
Shawn O. Pearce348e3902008-03-03 22:27:33 -0500196 packet_write(fd[1], "want %s%s%s%s%s%s%s%s\n",
Junio C Hamano583b7ea2006-06-21 00:30:21 -0700197 sha1_to_hex(remote),
198 (multi_ack ? " multi_ack" : ""),
Junio C Hamanod47f3db2006-09-10 16:27:08 -0700199 (use_sideband == 2 ? " side-band-64k" : ""),
200 (use_sideband == 1 ? " side-band" : ""),
Nicolas Pitre3891f392007-11-07 17:20:22 -0500201 (args.use_thin_pack ? " thin-pack" : ""),
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400202 (args.no_progress ? " no-progress" : ""),
Shawn O. Pearce348e3902008-03-03 22:27:33 -0500203 (args.include_tag ? " include-tag" : ""),
Nicolas Pitref04833e2009-05-01 20:18:02 -0400204 (prefer_ofs_delta ? " ofs-delta" : ""));
Junio C Hamano583b7ea2006-06-21 00:30:21 -0700205 else
206 packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700207 fetching++;
Junio C Hamano33b83032005-08-12 02:08:29 -0700208 }
Johannes Schindelined09aef2006-10-30 20:09:06 +0100209 if (is_repository_shallow())
210 write_shallow_commits(fd[1], 1);
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400211 if (args.depth > 0)
212 packet_write(fd[1], "deepen %d", args.depth);
Linus Torvaldsfb9040c2005-07-04 15:29:17 -0700213 packet_flush(fd[1]);
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700214 if (!fetching)
215 return 1;
Johannes Schindelin0a8944d2005-10-19 16:14:34 -0700216
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400217 if (args.depth > 0) {
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100218 char line[1024];
219 unsigned char sha1[20];
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100220
Benjamin Kramereb3a9dd2009-03-07 21:02:10 +0100221 while (packet_read_line(fd[0], line, sizeof(line))) {
Junio C Hamano599065a2007-02-20 01:54:00 -0800222 if (!prefixcmp(line, "shallow ")) {
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100223 if (get_sha1_hex(line + 8, sha1))
224 die("invalid shallow line: %s", line);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100225 register_shallow(sha1);
Junio C Hamanocf01bd52006-11-13 22:04:56 -0800226 continue;
227 }
Junio C Hamano599065a2007-02-20 01:54:00 -0800228 if (!prefixcmp(line, "unshallow ")) {
Johannes Schindelinf53514b2006-10-30 20:09:53 +0100229 if (get_sha1_hex(line + 10, sha1))
230 die("invalid unshallow line: %s", line);
231 if (!lookup_object(sha1))
232 die("object not found: %s", line);
233 /* make sure that it is parsed as shallow */
Martin Koeglerf3ec5492008-03-03 07:31:23 +0100234 if (!parse_object(sha1))
235 die("error in object: %s", line);
Johannes Schindelinf53514b2006-10-30 20:09:53 +0100236 if (unregister_shallow(sha1))
237 die("no shallow found: %s", line);
Junio C Hamanocf01bd52006-11-13 22:04:56 -0800238 continue;
239 }
240 die("expected shallow/unshallow, got %s", line);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100241 }
242 }
243
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200244 flushes = 0;
Linus Torvalds75bfc6c2005-07-04 16:35:13 -0700245 retval = -1;
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200246 while ((sha1 = get_rev())) {
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700247 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400248 if (args.verbose)
Junio C Hamano33b83032005-08-12 02:08:29 -0700249 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
Junio C Hamanof061e5f2006-05-24 21:48:34 -0700250 in_vain++;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700251 if (!(31 & ++count)) {
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200252 int ack;
253
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700254 packet_flush(fd[1]);
255 flushes++;
256
257 /*
258 * We keep one window "ahead" of the other side, and
259 * will wait for an ACK only on the next one
260 */
261 if (count == 32)
262 continue;
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200263
264 do {
265 ack = get_ack(fd[0], result_sha1);
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400266 if (args.verbose && ack)
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200267 fprintf(stderr, "got ack %d %s\n", ack,
268 sha1_to_hex(result_sha1));
269 if (ack == 1) {
270 flushes = 0;
271 multi_ack = 0;
272 retval = 0;
273 goto done;
274 } else if (ack == 2) {
275 struct commit *commit =
276 lookup_commit(result_sha1);
277 mark_common(commit, 0, 1);
278 retval = 0;
Junio C Hamanof061e5f2006-05-24 21:48:34 -0700279 in_vain = 0;
280 got_continue = 1;
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200281 }
282 } while (ack);
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700283 flushes--;
Junio C Hamanof061e5f2006-05-24 21:48:34 -0700284 if (got_continue && MAX_IN_VAIN < in_vain) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400285 if (args.verbose)
Junio C Hamanof061e5f2006-05-24 21:48:34 -0700286 fprintf(stderr, "giving up\n");
287 break; /* give up */
288 }
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700289 }
290 }
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200291done:
Linus Torvalds75bfc6c2005-07-04 16:35:13 -0700292 packet_write(fd[1], "done\n");
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400293 if (args.verbose)
Junio C Hamano33b83032005-08-12 02:08:29 -0700294 fprintf(stderr, "done\n");
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200295 if (retval != 0) {
296 multi_ack = 0;
Johannes Schindelin23d61f82005-10-28 04:46:27 +0200297 flushes++;
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200298 }
299 while (flushes || multi_ack) {
300 int ack = get_ack(fd[0], result_sha1);
301 if (ack) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400302 if (args.verbose)
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200303 fprintf(stderr, "got ack (%d) %s\n", ack,
304 sha1_to_hex(result_sha1));
305 if (ack == 1)
306 return 0;
307 multi_ack = 1;
308 continue;
Junio C Hamano33b83032005-08-12 02:08:29 -0700309 }
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200310 flushes--;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700311 }
Johannes Schindelin8cb560f2008-07-02 18:06:56 +0100312 /* it is no error to fetch into a completely empty repo */
313 return count ? retval : 0;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700314}
315
David Rientjes96f1e582006-08-15 10:23:48 -0700316static struct commit_list *complete;
Junio C Hamano49bb8052005-10-19 14:27:02 -0700317
Junio C Hamano8da19772006-09-20 22:02:01 -0700318static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
Junio C Hamano49bb8052005-10-19 14:27:02 -0700319{
320 struct object *o = parse_object(sha1);
321
Linus Torvalds19746322006-07-11 20:45:31 -0700322 while (o && o->type == OBJ_TAG) {
Junio C Hamanof1f0a2b2005-10-19 21:55:49 -0700323 struct tag *t = (struct tag *) o;
324 if (!t->tagged)
325 break; /* broken repository */
Junio C Hamano49bb8052005-10-19 14:27:02 -0700326 o->flags |= COMPLETE;
Junio C Hamanof1f0a2b2005-10-19 21:55:49 -0700327 o = parse_object(t->tagged->sha1);
Junio C Hamano49bb8052005-10-19 14:27:02 -0700328 }
Linus Torvalds19746322006-07-11 20:45:31 -0700329 if (o && o->type == OBJ_COMMIT) {
Junio C Hamano49bb8052005-10-19 14:27:02 -0700330 struct commit *commit = (struct commit *)o;
331 commit->object.flags |= COMPLETE;
332 insert_by_date(commit, &complete);
333 }
334 return 0;
335}
336
337static void mark_recent_complete_commits(unsigned long cutoff)
338{
339 while (complete && cutoff <= complete->item->date) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400340 if (args.verbose)
Junio C Hamano49bb8052005-10-19 14:27:02 -0700341 fprintf(stderr, "Marking %s as complete\n",
342 sha1_to_hex(complete->item->object.sha1));
343 pop_most_recent_commit(&complete, COMPLETE);
344 }
345}
346
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200347static void filter_refs(struct ref **refs, int nr_match, char **match)
348{
Junio C Hamano95460102006-05-11 15:28:44 -0700349 struct ref **return_refs;
350 struct ref *newlist = NULL;
351 struct ref **newtail = &newlist;
352 struct ref *ref, *next;
353 struct ref *fastarray[32];
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200354
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400355 if (nr_match && !args.fetch_all) {
Junio C Hamano95460102006-05-11 15:28:44 -0700356 if (ARRAY_SIZE(fastarray) < nr_match)
357 return_refs = xcalloc(nr_match, sizeof(struct ref *));
358 else {
359 return_refs = fastarray;
360 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
361 }
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200362 }
Junio C Hamano95460102006-05-11 15:28:44 -0700363 else
364 return_refs = NULL;
365
366 for (ref = *refs; ref; ref = next) {
367 next = ref->next;
368 if (!memcmp(ref->name, "refs/", 5) &&
369 check_ref_format(ref->name + 5))
370 ; /* trash */
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400371 else if (args.fetch_all &&
372 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
Junio C Hamano95460102006-05-11 15:28:44 -0700373 *newtail = ref;
374 ref->next = NULL;
375 newtail = &ref->next;
376 continue;
377 }
378 else {
379 int order = path_match(ref->name, nr_match, match);
380 if (order) {
381 return_refs[order-1] = ref;
382 continue; /* we will link it later */
383 }
384 }
385 free(ref);
386 }
387
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400388 if (!args.fetch_all) {
Junio C Hamano95460102006-05-11 15:28:44 -0700389 int i;
390 for (i = 0; i < nr_match; i++) {
391 ref = return_refs[i];
392 if (ref) {
393 *newtail = ref;
394 ref->next = NULL;
395 newtail = &ref->next;
396 }
397 }
398 if (return_refs != fastarray)
399 free(return_refs);
400 }
401 *refs = newlist;
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200402}
403
404static int everything_local(struct ref **refs, int nr_match, char **match)
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700405{
Junio C Hamano49bb8052005-10-19 14:27:02 -0700406 struct ref *ref;
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700407 int retval;
Junio C Hamano49bb8052005-10-19 14:27:02 -0700408 unsigned long cutoff = 0;
409
Junio C Hamano49bb8052005-10-19 14:27:02 -0700410 save_commit_buffer = 0;
411
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200412 for (ref = *refs; ref; ref = ref->next) {
Junio C Hamano49bb8052005-10-19 14:27:02 -0700413 struct object *o;
414
415 o = parse_object(ref->old_sha1);
416 if (!o)
417 continue;
418
419 /* We already have it -- which may mean that we were
420 * in sync with the other side at some time after
421 * that (it is OK if we guess wrong here).
422 */
Linus Torvalds19746322006-07-11 20:45:31 -0700423 if (o->type == OBJ_COMMIT) {
Junio C Hamano49bb8052005-10-19 14:27:02 -0700424 struct commit *commit = (struct commit *)o;
425 if (!cutoff || cutoff < commit->date)
426 cutoff = commit->date;
427 }
428 }
429
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400430 if (!args.depth) {
Johannes Schindelinf53514b2006-10-30 20:09:53 +0100431 for_each_ref(mark_complete, NULL);
432 if (cutoff)
433 mark_recent_complete_commits(cutoff);
434 }
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700435
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200436 /*
437 * Mark all complete remote refs as common refs.
438 * Don't mark them common yet; the server has to be told so first.
439 */
440 for (ref = *refs; ref; ref = ref->next) {
Junio C Hamano9534f402005-11-02 15:19:13 -0800441 struct object *o = deref_tag(lookup_object(ref->old_sha1),
442 NULL, 0);
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200443
Linus Torvalds19746322006-07-11 20:45:31 -0700444 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200445 continue;
446
447 if (!(o->flags & SEEN)) {
448 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
449
450 mark_common((struct commit *)o, 1, 1);
451 }
452 }
453
454 filter_refs(refs, nr_match, match);
455
456 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
457 const unsigned char *remote = ref->old_sha1;
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700458 unsigned char local[20];
Junio C Hamano49bb8052005-10-19 14:27:02 -0700459 struct object *o;
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700460
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200461 o = lookup_object(remote);
Junio C Hamano49bb8052005-10-19 14:27:02 -0700462 if (!o || !(o->flags & COMPLETE)) {
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700463 retval = 0;
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400464 if (!args.verbose)
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700465 continue;
466 fprintf(stderr,
467 "want %s (%s)\n", sha1_to_hex(remote),
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200468 ref->name);
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700469 continue;
470 }
471
Shawn Pearcee7024962006-08-23 02:49:00 -0400472 hashcpy(ref->new_sha1, local);
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400473 if (!args.verbose)
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700474 continue;
475 fprintf(stderr,
476 "already have %s (%s)\n", sha1_to_hex(remote),
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200477 ref->name);
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700478 }
479 return retval;
480}
481
Johannes Sixt088fab52007-10-19 21:48:01 +0200482static int sideband_demux(int fd, void *data)
Nicolas Pitreda093d32006-11-01 17:06:23 -0500483{
Johannes Sixt088fab52007-10-19 21:48:01 +0200484 int *xd = data;
Nicolas Pitreda093d32006-11-01 17:06:23 -0500485
Johannes Sixt3ef67cf2009-06-08 10:51:22 +0200486 int ret = recv_sideband("fetch-pack", xd[0], fd);
487 close(fd);
488 return ret;
Johannes Sixt088fab52007-10-19 21:48:01 +0200489}
490
Shawn O. Pearce1788c392007-09-14 03:31:23 -0400491static int get_pack(int xd[2], char **pack_lockfile)
Nicolas Pitreda093d32006-11-01 17:06:23 -0500492{
Johannes Sixt088fab52007-10-19 21:48:01 +0200493 struct async demux;
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800494 const char *argv[20];
495 char keep_arg[256];
496 char hdr_arg[256];
497 const char **av;
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400498 int do_keep = args.keep_pack;
Johannes Sixt477822c2007-10-19 21:47:57 +0200499 struct child_process cmd;
Nicolas Pitreda093d32006-11-01 17:06:23 -0500500
Johannes Sixt1f759ee2007-11-17 23:09:28 +0100501 memset(&demux, 0, sizeof(demux));
502 if (use_sideband) {
503 /* xd[] is talking with upload-pack; subprocess reads from
504 * xd[0], spits out band#2 to stderr, and feeds us band#1
505 * through demux->out.
506 */
507 demux.proc = sideband_demux;
508 demux.data = xd;
509 if (start_async(&demux))
510 die("fetch-pack: unable to fork off sideband"
511 " demultiplexer");
512 }
513 else
514 demux.out = xd[0];
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800515
Johannes Sixt477822c2007-10-19 21:47:57 +0200516 memset(&cmd, 0, sizeof(cmd));
517 cmd.argv = argv;
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800518 av = argv;
519 *hdr_arg = 0;
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400520 if (!args.keep_pack && unpack_limit) {
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800521 struct pack_header header;
522
Johannes Sixt1f759ee2007-11-17 23:09:28 +0100523 if (read_pack_header(demux.out, &header))
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800524 die("protocol error: bad pack header");
Ramsay Jones6e1c2342008-07-03 16:52:09 +0100525 snprintf(hdr_arg, sizeof(hdr_arg),
526 "--pack_header=%"PRIu32",%"PRIu32,
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800527 ntohl(header.hdr_version), ntohl(header.hdr_entries));
Junio C Hamanoaf7cf262007-01-24 16:47:24 -0800528 if (ntohl(header.hdr_entries) < unpack_limit)
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800529 do_keep = 0;
530 else
531 do_keep = 1;
532 }
533
534 if (do_keep) {
Johannes Sixt477822c2007-10-19 21:47:57 +0200535 if (pack_lockfile)
536 cmd.out = -1;
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800537 *av++ = "index-pack";
538 *av++ = "--stdin";
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400539 if (!args.quiet && !args.no_progress)
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800540 *av++ = "-v";
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400541 if (args.use_thin_pack)
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800542 *av++ = "--fix-thin";
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400543 if (args.lock_pack || unpack_limit) {
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800544 int s = sprintf(keep_arg,
David Soria Parra85e72832008-08-31 14:09:39 +0200545 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800546 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
547 strcpy(keep_arg + s, "localhost");
548 *av++ = keep_arg;
549 }
550 }
551 else {
552 *av++ = "unpack-objects";
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400553 if (args.quiet)
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800554 *av++ = "-q";
555 }
556 if (*hdr_arg)
557 *av++ = hdr_arg;
558 *av++ = NULL;
559
Johannes Sixt1f759ee2007-11-17 23:09:28 +0100560 cmd.in = demux.out;
Johannes Sixt477822c2007-10-19 21:47:57 +0200561 cmd.git_cmd = 1;
562 if (start_command(&cmd))
Nicolas Pitreda093d32006-11-01 17:06:23 -0500563 die("fetch-pack: unable to fork off %s", argv[0]);
Johannes Sixte72ae282008-02-16 18:36:38 +0100564 if (do_keep && pack_lockfile) {
Johannes Sixt477822c2007-10-19 21:47:57 +0200565 *pack_lockfile = index_pack_lockfile(cmd.out);
Johannes Sixte72ae282008-02-16 18:36:38 +0100566 close(cmd.out);
567 }
Johannes Sixt477822c2007-10-19 21:47:57 +0200568
569 if (finish_command(&cmd))
570 die("%s failed", argv[0]);
Johannes Sixt088fab52007-10-19 21:48:01 +0200571 if (use_sideband && finish_async(&demux))
572 die("error in sideband demultiplexer");
Johannes Sixt477822c2007-10-19 21:47:57 +0200573 return 0;
Nicolas Pitreda093d32006-11-01 17:06:23 -0500574}
575
Shawn O. Pearce1788c392007-09-14 03:31:23 -0400576static struct ref *do_fetch_pack(int fd[2],
Daniel Barkalowba227852008-02-04 13:26:23 -0500577 const struct ref *orig_ref,
Shawn O. Pearce1788c392007-09-14 03:31:23 -0400578 int nr_match,
579 char **match,
580 char **pack_lockfile)
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700581{
Daniel Barkalowba227852008-02-04 13:26:23 -0500582 struct ref *ref = copy_ref_list(orig_ref);
Linus Torvaldsd1c133f2005-07-16 13:55:50 -0700583 unsigned char sha1[20];
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700584
Johannes Schindelined09aef2006-10-30 20:09:06 +0100585 if (is_repository_shallow() && !server_supports("shallow"))
586 die("Server does not support shallow clients");
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200587 if (server_supports("multi_ack")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400588 if (args.verbose)
Johannes Schindelinc4c86f02005-10-28 04:50:26 +0200589 fprintf(stderr, "Server supports multi_ack\n");
590 multi_ack = 1;
591 }
Junio C Hamanod47f3db2006-09-10 16:27:08 -0700592 if (server_supports("side-band-64k")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400593 if (args.verbose)
Junio C Hamanod47f3db2006-09-10 16:27:08 -0700594 fprintf(stderr, "Server supports side-band-64k\n");
595 use_sideband = 2;
596 }
597 else if (server_supports("side-band")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400598 if (args.verbose)
Junio C Hamano583b7ea2006-06-21 00:30:21 -0700599 fprintf(stderr, "Server supports side-band\n");
600 use_sideband = 1;
601 }
Nicolas Pitref04833e2009-05-01 20:18:02 -0400602 if (server_supports("ofs-delta")) {
603 if (args.verbose)
604 fprintf(stderr, "Server supports ofs-delta\n");
605 } else
606 prefer_ofs_delta = 0;
Johannes Schindelin1baaae52005-10-28 04:47:07 +0200607 if (everything_local(&ref, nr_match, match)) {
Linus Torvalds2759cbc2005-10-18 11:35:17 -0700608 packet_flush(fd[1]);
609 goto all_done;
610 }
Junio C Hamano33b83032005-08-12 02:08:29 -0700611 if (find_common(fd, sha1, ref) < 0)
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400612 if (!args.keep_pack)
Junio C Hamanodfeff662006-03-20 00:21:10 -0800613 /* When cloning, it is not unusual to have
614 * no common commit.
615 */
Miklos Vajna78509d22009-03-24 02:09:12 +0100616 warning("no common commits");
Junio C Hamanoad897212005-12-14 22:17:38 -0800617
Shawn O. Pearce1788c392007-09-14 03:31:23 -0400618 if (get_pack(fd, pack_lockfile))
Junio C Hamano7e44c932008-08-31 09:39:19 -0700619 die("git fetch-pack: fetch failed.");
Junio C Hamanoad897212005-12-14 22:17:38 -0800620
621 all_done:
Daniel Barkalow2d4177c2007-09-10 23:03:00 -0400622 return ref;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700623}
624
Junio C Hamano310b86d2006-11-25 01:33:06 -0800625static int remove_duplicates(int nr_heads, char **heads)
626{
627 int src, dst;
628
629 for (src = dst = 0; src < nr_heads; src++) {
630 /* If heads[src] is different from any of
631 * heads[0..dst], push it in.
632 */
633 int i;
634 for (i = 0; i < dst; i++) {
635 if (!strcmp(heads[i], heads[src]))
636 break;
637 }
638 if (i < dst)
639 continue;
640 if (src != dst)
641 heads[dst] = heads[src];
642 dst++;
643 }
Junio C Hamano310b86d2006-11-25 01:33:06 -0800644 return dst;
645}
646
Johannes Schindelinef90d6d2008-05-14 18:46:53 +0100647static int fetch_pack_config(const char *var, const char *value, void *cb)
Junio C Hamanoaf7cf262007-01-24 16:47:24 -0800648{
649 if (strcmp(var, "fetch.unpacklimit") == 0) {
Junio C Hamanoe28714c2007-01-24 17:02:15 -0800650 fetch_unpack_limit = git_config_int(var, value);
651 return 0;
652 }
653
654 if (strcmp(var, "transfer.unpacklimit") == 0) {
655 transfer_unpack_limit = git_config_int(var, value);
Junio C Hamanoaf7cf262007-01-24 16:47:24 -0800656 return 0;
657 }
658
Nicolas Pitref04833e2009-05-01 20:18:02 -0400659 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
660 prefer_ofs_delta = git_config_bool(var, value);
661 return 0;
662 }
663
Johannes Schindelinef90d6d2008-05-14 18:46:53 +0100664 return git_default_config(var, value, cb);
Junio C Hamanoaf7cf262007-01-24 16:47:24 -0800665}
666
Junio C Hamano54b9e022007-01-02 11:22:08 -0800667static struct lock_file lock;
668
Shawn O. Pearce50ab5fd2007-09-19 00:49:39 -0400669static void fetch_pack_setup(void)
670{
671 static int did_setup;
672 if (did_setup)
673 return;
Johannes Schindelinef90d6d2008-05-14 18:46:53 +0100674 git_config(fetch_pack_config, NULL);
Shawn O. Pearce50ab5fd2007-09-19 00:49:39 -0400675 if (0 <= transfer_unpack_limit)
676 unpack_limit = transfer_unpack_limit;
677 else if (0 <= fetch_unpack_limit)
678 unpack_limit = fetch_unpack_limit;
679 did_setup = 1;
680}
681
Daniel Barkalow2d4177c2007-09-10 23:03:00 -0400682int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700683{
684 int i, ret, nr_heads;
Daniel Barkalowba227852008-02-04 13:26:23 -0500685 struct ref *ref = NULL;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700686 char *dest = NULL, **heads;
Daniel Barkalowba227852008-02-04 13:26:23 -0500687 int fd[2];
688 struct child_process *conn;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700689
690 nr_heads = 0;
691 heads = NULL;
692 for (i = 1; i < argc; i++) {
Daniel Barkalow2d4177c2007-09-10 23:03:00 -0400693 const char *arg = argv[i];
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700694
695 if (*arg == '-') {
Junio C Hamano599065a2007-02-20 01:54:00 -0800696 if (!prefixcmp(arg, "--upload-pack=")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400697 args.uploadpack = arg + 14;
Uwe Kleine-König27dca072007-01-23 09:20:17 +0100698 continue;
699 }
Junio C Hamano599065a2007-02-20 01:54:00 -0800700 if (!prefixcmp(arg, "--exec=")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400701 args.uploadpack = arg + 7;
Junio C Hamano8b3d9dc2005-07-14 00:08:37 -0700702 continue;
703 }
Junio C Hamano2247efb2005-12-18 01:55:29 -0800704 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400705 args.quiet = 1;
Junio C Hamano33b83032005-08-12 02:08:29 -0700706 continue;
707 }
Junio C Hamano2247efb2005-12-18 01:55:29 -0800708 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400709 args.lock_pack = args.keep_pack;
710 args.keep_pack = 1;
Junio C Hamano9e10fd12007-01-22 22:37:33 -0800711 continue;
712 }
Junio C Hamanob19696c2006-02-20 00:38:39 -0800713 if (!strcmp("--thin", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400714 args.use_thin_pack = 1;
Junio C Hamanob19696c2006-02-20 00:38:39 -0800715 continue;
716 }
Shawn O. Pearce348e3902008-03-03 22:27:33 -0500717 if (!strcmp("--include-tag", arg)) {
718 args.include_tag = 1;
719 continue;
720 }
Junio C Hamanodfeff662006-03-20 00:21:10 -0800721 if (!strcmp("--all", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400722 args.fetch_all = 1;
Junio C Hamanodfeff662006-03-20 00:21:10 -0800723 continue;
724 }
Junio C Hamano33b83032005-08-12 02:08:29 -0700725 if (!strcmp("-v", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400726 args.verbose = 1;
Junio C Hamano33b83032005-08-12 02:08:29 -0700727 continue;
728 }
Junio C Hamano599065a2007-02-20 01:54:00 -0800729 if (!prefixcmp(arg, "--depth=")) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400730 args.depth = strtol(arg + 8, NULL, 0);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100731 continue;
732 }
Johannes Schindelin83a5ad62007-02-20 03:01:44 +0100733 if (!strcmp("--no-progress", arg)) {
Shawn O. Pearcefa740522007-09-19 00:49:35 -0400734 args.no_progress = 1;
Johannes Schindelin83a5ad62007-02-20 03:01:44 +0100735 continue;
736 }
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700737 usage(fetch_pack_usage);
738 }
Daniel Barkalow2d4177c2007-09-10 23:03:00 -0400739 dest = (char *)arg;
740 heads = (char **)(argv + i + 1);
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700741 nr_heads = argc - i - 1;
742 break;
743 }
744 if (!dest)
745 usage(fetch_pack_usage);
Daniel Barkalow2d4177c2007-09-10 23:03:00 -0400746
Junio C Hamano4340a812007-11-01 13:47:47 -0700747 conn = git_connect(fd, (char *)dest, args.uploadpack,
Daniel Barkalowba227852008-02-04 13:26:23 -0500748 args.verbose ? CONNECT_VERBOSE : 0);
749 if (conn) {
Junio C Hamano40c155f2008-09-09 01:27:09 -0700750 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
Daniel Barkalowba227852008-02-04 13:26:23 -0500751
752 ref = fetch_pack(&args, fd, conn, ref, dest, nr_heads, heads, NULL);
753 close(fd[0]);
754 close(fd[1]);
755 if (finish_connect(conn))
756 ref = NULL;
757 } else {
758 ref = NULL;
759 }
760 ret = !ref;
Junio C Hamano9e5d2b42005-11-06 00:09:59 -0800761
762 if (!ret && nr_heads) {
763 /* If the heads to pull were given, we should have
764 * consumed all of them by matching the remote.
Heikki Orsila05207a22008-09-09 13:28:30 +0300765 * Otherwise, 'git fetch remote no-such-ref' would
Junio C Hamano9e5d2b42005-11-06 00:09:59 -0800766 * silently succeed without issuing an error.
767 */
768 for (i = 0; i < nr_heads; i++)
769 if (heads[i] && heads[i][0]) {
770 error("no such remote ref %s", heads[i]);
771 ret = 1;
772 }
773 }
Daniel Barkalowba227852008-02-04 13:26:23 -0500774 while (ref) {
775 printf("%s %s\n",
776 sha1_to_hex(ref->old_sha1), ref->name);
777 ref = ref->next;
778 }
Junio C Hamano9e5d2b42005-11-06 00:09:59 -0800779
Daniel Barkalowba227852008-02-04 13:26:23 -0500780 return ret;
781}
782
783struct ref *fetch_pack(struct fetch_pack_args *my_args,
784 int fd[], struct child_process *conn,
785 const struct ref *ref,
786 const char *dest,
787 int nr_heads,
788 char **heads,
789 char **pack_lockfile)
790{
791 struct stat st;
792 struct ref *ref_cpy;
793
794 fetch_pack_setup();
Thomas Rastd551bba2008-12-06 21:50:09 +0100795 if (&args != my_args)
796 memcpy(&args, my_args, sizeof(args));
Daniel Barkalowba227852008-02-04 13:26:23 -0500797 if (args.depth > 0) {
798 if (stat(git_path("shallow"), &st))
799 st.st_mtime = 0;
800 }
801
802 if (heads && nr_heads)
803 nr_heads = remove_duplicates(nr_heads, heads);
804 if (!ref) {
805 packet_flush(fd[1]);
806 die("no matching remote head");
807 }
808 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
809
810 if (args.depth > 0) {
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100811 struct cache_time mtime;
812 char *shallow = git_path("shallow");
813 int fd;
814
815 mtime.sec = st.st_mtime;
Kjetil Barvikc06ff492009-03-04 18:47:40 +0100816 mtime.nsec = ST_MTIME_NSEC(st);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100817 if (stat(shallow, &st)) {
818 if (mtime.sec)
819 die("shallow file was removed during fetch");
820 } else if (st.st_mtime != mtime.sec
821#ifdef USE_NSEC
Kjetil Barvik5bcf1092009-03-15 12:38:55 +0100822 || ST_MTIME_NSEC(st) != mtime.nsec
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100823#endif
824 )
825 die("shallow file was changed during fetch");
826
Junio C Hamanoacd3b9e2008-10-17 15:44:39 -0700827 fd = hold_lock_file_for_update(&lock, shallow,
828 LOCK_DIE_ON_ERROR);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100829 if (!write_shallow_commits(fd, 0)) {
Alex Riesen691f1a22009-04-29 23:22:56 +0200830 unlink_or_warn(shallow);
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100831 rollback_lock_file(&lock);
832 } else {
Johannes Schindelin016e6cc2006-10-30 20:09:29 +0100833 commit_lock_file(&lock);
834 }
835 }
836
Johan Herland48ec3e52008-06-15 16:04:20 +0200837 reprepare_packed_git();
Daniel Barkalowba227852008-02-04 13:26:23 -0500838 return ref_cpy;
Linus Torvaldsdef88e92005-07-04 13:26:53 -0700839}