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, 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\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
)) {
177 * We keep one window "ahead" of the other side, and
178 * will wait for an ACK only on the next one
182 if (get_ack(fd
[0], result_sha1
)) {
186 fprintf(stderr
, "got ack\n");
192 packet_write(fd
[1], "done\n");
194 fprintf(stderr
, "done\n");
197 if (get_ack(fd
[0], result_sha1
)) {
199 fprintf(stderr
, "got ack\n");
206 static struct commit_list
*complete
= NULL
;
208 static int mark_complete(const char *path
, const unsigned char *sha1
)
210 struct object
*o
= parse_object(sha1
);
212 while (o
&& o
->type
== tag_type
) {
213 struct tag
*t
= (struct tag
*) o
;
215 break; /* broken repository */
216 o
->flags
|= COMPLETE
;
217 o
= parse_object(t
->tagged
->sha1
);
219 if (o
&& o
->type
== commit_type
) {
220 struct commit
*commit
= (struct commit
*)o
;
221 commit
->object
.flags
|= COMPLETE
;
222 insert_by_date(commit
, &complete
);
227 static void mark_recent_complete_commits(unsigned long cutoff
)
229 while (complete
&& cutoff
<= complete
->item
->date
) {
231 fprintf(stderr
, "Marking %s as complete\n",
232 sha1_to_hex(complete
->item
->object
.sha1
));
233 pop_most_recent_commit(&complete
, COMPLETE
);
237 static int everything_local(struct ref
*refs
)
241 unsigned long cutoff
= 0;
243 track_object_refs
= 0;
244 save_commit_buffer
= 0;
246 for (ref
= refs
; ref
; ref
= ref
->next
) {
249 o
= parse_object(ref
->old_sha1
);
253 /* We already have it -- which may mean that we were
254 * in sync with the other side at some time after
255 * that (it is OK if we guess wrong here).
257 if (o
->type
== commit_type
) {
258 struct commit
*commit
= (struct commit
*)o
;
259 if (!cutoff
|| cutoff
< commit
->date
)
260 cutoff
= commit
->date
;
264 for_each_ref(mark_complete
);
266 mark_recent_complete_commits(cutoff
);
268 for (retval
= 1; refs
; refs
= refs
->next
) {
269 const unsigned char *remote
= refs
->old_sha1
;
270 unsigned char local
[20];
273 o
= parse_object(remote
);
274 if (!o
|| !(o
->flags
& COMPLETE
)) {
279 "want %s (%s)\n", sha1_to_hex(remote
),
284 memcpy(refs
->new_sha1
, local
, 20);
288 "already have %s (%s)\n", sha1_to_hex(remote
),
294 static int fetch_pack(int fd
[2], int nr_match
, char **match
)
297 unsigned char sha1
[20];
301 get_remote_heads(fd
[0], &ref
, nr_match
, match
, 1);
304 die("no matching remote head");
306 if (everything_local(ref
)) {
310 if (find_common(fd
, sha1
, ref
) < 0)
311 fprintf(stderr
, "warning: no common commits\n");
314 die("git-fetch-pack: unable to fork off git-unpack-objects");
319 execlp("git-unpack-objects", "git-unpack-objects",
320 quiet
? "-q" : NULL
, NULL
);
321 die("git-unpack-objects exec failed");
325 while (waitpid(pid
, &status
, 0) < 0) {
327 die("waiting for git-unpack-objects: %s", strerror(errno
));
329 if (WIFEXITED(status
)) {
330 int code
= WEXITSTATUS(status
);
332 die("git-unpack-objects died with error code %d", code
);
336 sha1_to_hex(ref
->old_sha1
), ref
->name
);
341 if (WIFSIGNALED(status
)) {
342 int sig
= WTERMSIG(status
);
343 die("git-unpack-objects died of signal %d", sig
);
345 die("Sherlock Holmes! git-unpack-objects died of unnatural causes %d!", status
);
348 int main(int argc
, char **argv
)
350 int i
, ret
, nr_heads
;
351 char *dest
= NULL
, **heads
;
357 for (i
= 1; i
< argc
; i
++) {
361 if (!strncmp("--exec=", arg
, 7)) {
365 if (!strcmp("-q", arg
)) {
369 if (!strcmp("-v", arg
)) {
373 usage(fetch_pack_usage
);
376 heads
= argv
+ i
+ 1;
377 nr_heads
= argc
- i
- 1;
381 usage(fetch_pack_usage
);
382 pid
= git_connect(fd
, dest
, exec
);
385 ret
= fetch_pack(fd
, nr_heads
, heads
);