11 static const char fetch_pack_usage[] =
12 "git-fetch-pack [-q] [-v] [--exec=upload-pack] [host:]directory <refs>...";
13 static const char *exec = "git-upload-pack";
15 #define COMPLETE (1U << 0)
16 #define COMMON (1U << 1)
17 #define COMMON_REF (1U << 2 | COMMON)
18 #define SEEN (1U << 3)
19 #define POPPED (1U << 4)
21 static struct commit_list *rev_list = NULL;
22 static struct commit_list *rev_list_end = NULL;
23 static unsigned long non_common_revs = 0;
25 static void rev_list_append(struct commit *commit, int mark)
27 if (!(commit->object.flags & mark)) {
28 commit->object.flags |= mark;
30 if (rev_list == NULL) {
31 commit_list_insert(commit, &rev_list);
32 rev_list_end = rev_list;
34 commit_list_insert(commit, &(rev_list_end->next));
35 rev_list_end = rev_list_end->next;
38 if (!(commit->object.flags & COMMON))
43 static int rev_list_append_sha1(const char *path, const unsigned char *sha1)
45 struct object *o = deref_tag(parse_object(sha1));
47 if (o->type == commit_type)
48 rev_list_append((struct commit *)o, SEEN);
53 static void mark_common(struct commit *commit)
55 if (commit != NULL && !(commit->object.flags & COMMON)) {
56 struct object *o = (struct object *)commit;
58 if (!(o->flags & SEEN))
59 rev_list_append(commit, SEEN);
61 struct commit_list *parents;
63 if (!(o->flags & POPPED))
67 for (parents = commit->parents;
69 parents = parents->next)
70 mark_common(parents->item);
76 Get the next rev to send, ignoring the common.
79 static const unsigned char* get_rev()
81 struct commit *commit = NULL;
83 while (commit == NULL) {
85 struct commit_list* parents;
87 if (rev_list == NULL || non_common_revs == 0)
90 commit = rev_list->item;
91 if (!(commit->object.parsed))
93 commit->object.flags |= POPPED;
94 if (!(commit->object.flags & COMMON))
97 parents = commit->parents;
99 if (commit->object.flags & COMMON) {
100 /* do not send "have", and ignore ancestors */
102 mark = COMMON | SEEN;
103 } else if (commit->object.flags & COMMON_REF)
104 /* send "have", and ignore ancestors */
105 mark = COMMON | SEEN;
107 /* send "have", also for its ancestors */
112 mark_common(parents->item);
114 rev_list_append(parents->item, mark);
115 parents = parents->next;
118 rev_list = rev_list->next;
121 return commit->object.sha1;
124 static int find_common(int fd[2], unsigned char *result_sha1,
128 int count = 0, flushes = 0, multi_ack = 0, retval;
129 const unsigned char *sha1;
131 for_each_ref(rev_list_append_sha1);
134 for ( ; refs ; refs = refs->next) {
135 unsigned char *remote = refs->old_sha1;
139 * If that object is complete (i.e. it is an ancestor of a
140 * local ref), we tell them we have it but do not have to
141 * tell them about its ancestors, which they already know
144 * We use lookup_object here because we are only
145 * interested in the case we *know* the object is
146 * reachable and we have already scanned it.
148 if (((o = lookup_object(remote)) != NULL) &&
149 (o->flags & COMPLETE)) {
152 if (o->type == commit_type)
153 rev_list_append((struct commit *)o,
159 packet_write(fd[1], "want %s multi_ack\n", sha1_to_hex(remote));
168 while ((sha1 = get_rev())) {
169 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
171 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
172 if (!(31 & ++count)) {
179 * We keep one window "ahead" of the other side, and
180 * will wait for an ACK only on the next one
186 ack = get_ack(fd[0], result_sha1);
188 fprintf(stderr, "got ack %d %s\n", ack,
189 sha1_to_hex(result_sha1));
195 } else if (ack == 2) {
197 mark_common((struct commit *)
198 lookup_object(result_sha1));
210 packet_write(fd[1], "done\n");
212 fprintf(stderr, "done\n");
216 if (get_ack(fd[0], result_sha1)) {
218 fprintf(stderr, "got ack %s\n",
219 sha1_to_hex(result_sha1));
230 static struct commit_list *complete = NULL;
232 static int mark_complete(const char *path, const unsigned char *sha1)
234 struct object *o = parse_object(sha1);
236 while (o && o->type == tag_type) {
237 struct tag *t = (struct tag *) o;
239 break; /* broken repository */
240 o->flags |= COMPLETE;
241 o = parse_object(t->tagged->sha1);
243 if (o && o->type == commit_type) {
244 struct commit *commit = (struct commit *)o;
245 commit->object.flags |= COMPLETE;
246 insert_by_date(commit, &complete);
251 static void mark_recent_complete_commits(unsigned long cutoff)
253 while (complete && cutoff <= complete->item->date) {
255 fprintf(stderr, "Marking %s as complete\n",
256 sha1_to_hex(complete->item->object.sha1));
257 pop_most_recent_commit(&complete, COMPLETE);
261 static int everything_local(struct ref *refs)
265 unsigned long cutoff = 0;
267 track_object_refs = 0;
268 save_commit_buffer = 0;
270 for (ref = refs; ref; ref = ref->next) {
273 o = parse_object(ref->old_sha1);
277 /* We already have it -- which may mean that we were
278 * in sync with the other side at some time after
279 * that (it is OK if we guess wrong here).
281 if (o->type == commit_type) {
282 struct commit *commit = (struct commit *)o;
283 if (!cutoff || cutoff < commit->date)
284 cutoff = commit->date;
288 for_each_ref(mark_complete);
290 mark_recent_complete_commits(cutoff);
292 for (retval = 1; refs ; refs = refs->next) {
293 const unsigned char *remote = refs->old_sha1;
294 unsigned char local[20];
297 o = parse_object(remote);
298 if (!o || !(o->flags & COMPLETE)) {
303 "want %s (%s)\n", sha1_to_hex(remote),
308 memcpy(refs->new_sha1, local, 20);
312 "already have %s (%s)\n", sha1_to_hex(remote),
318 static int fetch_pack(int fd[2], int nr_match, char **match)
321 unsigned char sha1[20];
325 get_remote_heads(fd[0], &ref, nr_match, match, 1);
328 die("no matching remote head");
330 if (everything_local(ref)) {
334 if (find_common(fd, sha1, ref) < 0)
335 fprintf(stderr, "warning: no common commits\n");
338 die("git-fetch-pack: unable to fork off git-unpack-objects");
343 execlp("git-unpack-objects", "git-unpack-objects",
344 quiet ? "-q" : NULL, NULL);
345 die("git-unpack-objects exec failed");
349 while (waitpid(pid, &status, 0) < 0) {
351 die("waiting for git-unpack-objects: %s", strerror(errno));
353 if (WIFEXITED(status)) {
354 int code = WEXITSTATUS(status);
356 die("git-unpack-objects died with error code %d", code);
360 sha1_to_hex(ref->old_sha1), ref->name);
365 if (WIFSIGNALED(status)) {
366 int sig = WTERMSIG(status);
367 die("git-unpack-objects died of signal %d", sig);
369 die("Sherlock Holmes! git-unpack-objects died of unnatural causes %d!", status);
372 int main(int argc, char **argv)
374 int i, ret, nr_heads;
375 char *dest = NULL, **heads;
381 for (i = 1; i < argc; i++) {
385 if (!strncmp("--exec=", arg, 7)) {
389 if (!strcmp("-q", arg)) {
393 if (!strcmp("-v", arg)) {
397 usage(fetch_pack_usage);
400 heads = argv + i + 1;
401 nr_heads = argc - i - 1;
405 usage(fetch_pack_usage);
406 pid = git_connect(fd, dest, exec);
409 ret = fetch_pack(fd, nr_heads, heads);