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)
18 #define SEEN (1U << 3)
19 #define POPPED (1U << 4)
21 static struct commit_list
*rev_list
= NULL
;
22 static int non_common_revs
= 0;
24 static void rev_list_push(struct commit
*commit
, int mark
)
26 if (!(commit
->object
.flags
& mark
)) {
27 commit
->object
.flags
|= mark
;
29 if (!(commit
->object
.parsed
))
32 insert_by_date(commit
, &rev_list
);
34 if (!(commit
->object
.flags
& COMMON
))
39 static int rev_list_insert_ref(const char *path
, const unsigned char *sha1
)
41 struct object
*o
= deref_tag(parse_object(sha1
));
43 if (o
->type
== commit_type
)
44 rev_list_push((struct commit
*)o
, SEEN
);
50 This function marks a rev and its ancestors as common.
51 In some cases, it is desirable to mark only the ancestors (for example
52 when only the server does not yet know that they are common).
55 static void mark_common(struct commit
*commit
,
56 int ancestors_only
, int dont_parse
)
58 if (commit
!= NULL
&& !(commit
->object
.flags
& COMMON
)) {
59 struct object
*o
= (struct object
*)commit
;
64 if (!(o
->flags
& SEEN
))
65 rev_list_push(commit
, SEEN
);
67 struct commit_list
*parents
;
69 if (!ancestors_only
&& !(o
->flags
& POPPED
))
71 if (!o
->parsed
&& !dont_parse
)
74 for (parents
= commit
->parents
;
76 parents
= parents
->next
)
77 mark_common(parents
->item
, 0, dont_parse
);
83 Get the next rev to send, ignoring the common.
86 static const unsigned char* get_rev()
88 struct commit
*commit
= NULL
;
90 while (commit
== NULL
) {
92 struct commit_list
* parents
;
94 if (rev_list
== NULL
|| non_common_revs
== 0)
97 commit
= rev_list
->item
;
98 if (!(commit
->object
.parsed
))
100 commit
->object
.flags
|= POPPED
;
101 if (!(commit
->object
.flags
& COMMON
))
104 parents
= commit
->parents
;
106 if (commit
->object
.flags
& COMMON
) {
107 /* do not send "have", and ignore ancestors */
109 mark
= COMMON
| SEEN
;
110 } else if (commit
->object
.flags
& COMMON_REF
)
111 /* send "have", and ignore ancestors */
112 mark
= COMMON
| SEEN
;
114 /* send "have", also for its ancestors */
118 if (!(parents
->item
->object
.flags
& SEEN
))
119 rev_list_push(parents
->item
, mark
);
121 mark_common(parents
->item
, 1, 0);
122 parents
= parents
->next
;
125 rev_list
= rev_list
->next
;
128 return commit
->object
.sha1
;
131 static int find_common(int fd
[2], unsigned char *result_sha1
,
135 int count
= 0, flushes
= 0, retval
;
136 const unsigned char *sha1
;
138 for_each_ref(rev_list_insert_ref
);
141 for ( ; refs
; refs
= refs
->next
) {
142 unsigned char *remote
= refs
->old_sha1
;
146 * If that object is complete (i.e. it is an ancestor of a
147 * local ref), we tell them we have it but do not have to
148 * tell them about its ancestors, which they already know
151 * We use lookup_object here because we are only
152 * interested in the case we *know* the object is
153 * reachable and we have already scanned it.
155 if (((o
= lookup_object(remote
)) != NULL
) &&
156 (o
->flags
& COMPLETE
)) {
159 if (o
->type
== commit_type
) {
160 struct commit
*commit
= (struct commit
*)o
;
162 rev_list_push(commit
, COMMON_REF
| SEEN
);
164 mark_common(commit
, 1, 1);
169 packet_write(fd
[1], "want %s\n", sha1_to_hex(remote
));
178 while ((sha1
= get_rev())) {
179 packet_write(fd
[1], "have %s\n", sha1_to_hex(sha1
));
181 fprintf(stderr
, "have %s\n", sha1_to_hex(sha1
));
182 if (!(31 & ++count
)) {
187 * We keep one window "ahead" of the other side, and
188 * will wait for an ACK only on the next one
192 if (get_ack(fd
[0], result_sha1
)) {
196 fprintf(stderr
, "got ack\n");
203 packet_write(fd
[1], "done\n");
205 fprintf(stderr
, "done\n");
210 if (get_ack(fd
[0], result_sha1
)) {
212 fprintf(stderr
, "got ack\n");
219 static struct commit_list
*complete
= NULL
;
221 static int mark_complete(const char *path
, const unsigned char *sha1
)
223 struct object
*o
= parse_object(sha1
);
225 while (o
&& o
->type
== tag_type
) {
226 struct tag
*t
= (struct tag
*) o
;
228 break; /* broken repository */
229 o
->flags
|= COMPLETE
;
230 o
= parse_object(t
->tagged
->sha1
);
232 if (o
&& o
->type
== commit_type
) {
233 struct commit
*commit
= (struct commit
*)o
;
234 commit
->object
.flags
|= COMPLETE
;
235 insert_by_date(commit
, &complete
);
240 static void mark_recent_complete_commits(unsigned long cutoff
)
242 while (complete
&& cutoff
<= complete
->item
->date
) {
244 fprintf(stderr
, "Marking %s as complete\n",
245 sha1_to_hex(complete
->item
->object
.sha1
));
246 pop_most_recent_commit(&complete
, COMPLETE
);
250 static int everything_local(struct ref
*refs
)
254 unsigned long cutoff
= 0;
256 track_object_refs
= 0;
257 save_commit_buffer
= 0;
259 for (ref
= refs
; ref
; ref
= ref
->next
) {
262 o
= parse_object(ref
->old_sha1
);
266 /* We already have it -- which may mean that we were
267 * in sync with the other side at some time after
268 * that (it is OK if we guess wrong here).
270 if (o
->type
== commit_type
) {
271 struct commit
*commit
= (struct commit
*)o
;
272 if (!cutoff
|| cutoff
< commit
->date
)
273 cutoff
= commit
->date
;
277 for_each_ref(mark_complete
);
279 mark_recent_complete_commits(cutoff
);
281 for (retval
= 1; refs
; refs
= refs
->next
) {
282 const unsigned char *remote
= refs
->old_sha1
;
283 unsigned char local
[20];
286 o
= parse_object(remote
);
287 if (!o
|| !(o
->flags
& COMPLETE
)) {
292 "want %s (%s)\n", sha1_to_hex(remote
),
297 memcpy(refs
->new_sha1
, local
, 20);
301 "already have %s (%s)\n", sha1_to_hex(remote
),
307 static int fetch_pack(int fd
[2], int nr_match
, char **match
)
310 unsigned char sha1
[20];
314 get_remote_heads(fd
[0], &ref
, nr_match
, match
, 1);
317 die("no matching remote head");
319 if (everything_local(ref
)) {
323 if (find_common(fd
, sha1
, ref
) < 0)
324 fprintf(stderr
, "warning: no common commits\n");
327 die("git-fetch-pack: unable to fork off git-unpack-objects");
332 execlp("git-unpack-objects", "git-unpack-objects",
333 quiet
? "-q" : NULL
, NULL
);
334 die("git-unpack-objects exec failed");
338 while (waitpid(pid
, &status
, 0) < 0) {
340 die("waiting for git-unpack-objects: %s", strerror(errno
));
342 if (WIFEXITED(status
)) {
343 int code
= WEXITSTATUS(status
);
345 die("git-unpack-objects died with error code %d", code
);
349 sha1_to_hex(ref
->old_sha1
), ref
->name
);
354 if (WIFSIGNALED(status
)) {
355 int sig
= WTERMSIG(status
);
356 die("git-unpack-objects died of signal %d", sig
);
358 die("Sherlock Holmes! git-unpack-objects died of unnatural causes %d!", status
);
361 int main(int argc
, char **argv
)
363 int i
, ret
, nr_heads
;
364 char *dest
= NULL
, **heads
;
370 for (i
= 1; i
< argc
; i
++) {
374 if (!strncmp("--exec=", arg
, 7)) {
378 if (!strcmp("-q", arg
)) {
382 if (!strcmp("-v", arg
)) {
386 usage(fetch_pack_usage
);
389 heads
= argv
+ i
+ 1;
390 nr_heads
= argc
- i
- 1;
394 usage(fetch_pack_usage
);
395 pid
= git_connect(fd
, dest
, exec
);
398 ret
= fetch_pack(fd
, nr_heads
, heads
);