Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 844 lines (760 sloc) 20.407 kb
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
1 #include "cache.h"
2 #include "refs.h"
3 #include "pkt-line.h"
958c24b Move sideband server side support into reusable form.
Junio C Hamano authored
4 #include "sideband.h"
f6b42a8 Show peeled onion from upload-pack and server-info.
Junio C Hamano authored
5 #include "tag.h"
6 #include "object.h"
f0243f2 @dscho git-upload-pack: More efficient usage of the has_sha1 array
dscho authored
7 #include "commit.h"
77cb17e Exec git programs without using PATH.
Michal Ostrowski authored
8 #include "exec_cmd.h"
9b8dc26 @dscho upload-pack: no longer call rev-list
dscho authored
9 #include "diff.h"
10 #include "revision.h"
11 #include "list-objects.h"
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
12 #include "run-command.h"
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
13 #include "sigchain.h"
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
14
62b4698 Use angles for placeholders consistently
Štěpán Němec authored
15 static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
16
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
17 /* bits #0..7 in revision.h, #8..10 in commit.c */
18 #define THEY_HAVE (1u << 11)
19 #define OUR_REF (1u << 12)
20 #define WANTED (1u << 13)
21 #define COMMON_KNOWN (1u << 14)
22 #define REACHABLE (1u << 15)
23
f53514b @dscho allow deepening of a shallow repository
dscho authored
24 #define SHALLOW (1u << 16)
25 #define NOT_SHALLOW (1u << 17)
26 #define CLIENT_SHALLOW (1u << 18)
27
3fbe2d5 Merge branch 'jc/upload-pack'
Junio C Hamano authored
28 static unsigned long oldest_have;
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
29
96f1e58 remove unnecessary initializations
David Rientjes authored
30 static int multi_ack, nr_our_refs;
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
31 static int no_done;
348e390 @spearce Teach fetch-pack/upload-pack about --include-tag
spearce authored
32 static int use_thin_pack, use_ofs_delta, use_include_tag;
9462e3f upload-pack: squelch progress indicator if client cannot see it
Johannes Sixt authored
33 static int no_progress, daemon_mode;
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
34 static int shallow_nr;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
35 static struct object_array have_obj;
36 static struct object_array want_obj;
6523078 make shallow repository deepening more network efficient
Nicolas Pitre authored
37 static struct object_array extra_edge_obj;
96f1e58 remove unnecessary initializations
David Rientjes authored
38 static unsigned int timeout;
d47f3db Prepare larger packet buffer for upload-pack protocol.
Junio C Hamano authored
39 /* 0 for no sideband,
40 * otherwise maximum packet size (up to 65520 bytes).
41 */
96f1e58 remove unnecessary initializations
David Rientjes authored
42 static int use_sideband;
49aaddd @spearce Teach upload-pack to log the received need lines to an fd
spearce authored
43 static int debug_fd;
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
44 static int advertise_refs;
45 static int stateless_rpc;
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
46
47 static void reset_timeout(void)
48 {
49 alarm(timeout);
50 }
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
51
75bfc6c Make git-fetch-pack actually do all the unpacking etc.
Linus Torvalds authored
52 static int strip(char *line, int len)
53 {
54 if (len && line[len-1] == '\n')
55 line[--len] = 0;
56 return len;
57 }
58
583b7ea upload-pack/fetch-pack: support side-band communication
Junio C Hamano authored
59 static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
60 {
958c24b Move sideband server side support into reusable form.
Junio C Hamano authored
61 if (use_sideband)
d47f3db Prepare larger packet buffer for upload-pack protocol.
Junio C Hamano authored
62 return send_sideband(1, fd, data, sz, use_sideband);
958c24b Move sideband server side support into reusable form.
Junio C Hamano authored
63 if (fd == 3)
64 /* emergency quit */
65 fd = 2;
66 if (fd == 2) {
93822c2 @awhitcroft short i/o: fix calls to write to use xwrite or write_in_full
awhitcroft authored
67 /* XXX: are we happy to lose stuff here? */
958c24b Move sideband server side support into reusable form.
Junio C Hamano authored
68 xwrite(fd, data, sz);
69 return sz;
583b7ea upload-pack/fetch-pack: support side-band communication
Junio C Hamano authored
70 }
958c24b Move sideband server side support into reusable form.
Junio C Hamano authored
71 return safe_write(fd, data, sz);
583b7ea upload-pack/fetch-pack: support side-band communication
Junio C Hamano authored
72 }
73
16befb8 @gitster Even more missing static
gitster authored
74 static FILE *pack_pipe = NULL;
11c211f @chriscool list-objects: add "void *data" parameter to show functions
chriscool authored
75 static void show_commit(struct commit *commit, void *data)
9b8dc26 @dscho upload-pack: no longer call rev-list
dscho authored
76 {
77 if (commit->object.flags & BOUNDARY)
78 fputc('-', pack_pipe);
79 if (fputs(sha1_to_hex(commit->object.sha1), pack_pipe) < 0)
80 die("broken output pipe");
81 fputc('\n', pack_pipe);
82 fflush(pack_pipe);
83 free(commit->buffer);
84 commit->buffer = NULL;
85 }
86
4947367 @gitster list-objects: pass callback data to show_objects()
gitster authored
87 static void show_object(struct object *obj,
88 const struct name_path *path, const char *component,
89 void *cb_data)
9b8dc26 @dscho upload-pack: no longer call rev-list
dscho authored
90 {
91f1751 @gitster revision.c: add show_object_with_name() helper function
gitster authored
91 show_object_with_name(pack_pipe, obj, path, component);
9b8dc26 @dscho upload-pack: no longer call rev-list
dscho authored
92 }
93
94 static void show_edge(struct commit *commit)
95 {
96 fprintf(pack_pipe, "-%s\n", sha1_to_hex(commit->object.sha1));
97 }
98
1e39d7d @pclouds upload-pack: remove unused "create_full_pack" code in do_rev_list
pclouds authored
99 static int do_rev_list(int in, int out, void *user_data)
80ccaa7 upload-pack: Move the revision walker into a separate function.
Johannes Sixt authored
100 {
101 int i;
102 struct rev_info revs;
103
ae6a560 @kusma run-command: support custom fd-set in async
kusma authored
104 pack_pipe = xfdopen(out, "w");
80ccaa7 upload-pack: Move the revision walker into a separate function.
Johannes Sixt authored
105 init_revisions(&revs, NULL);
106 revs.tag_objects = 1;
107 revs.tree_objects = 1;
108 revs.blob_objects = 1;
109 if (use_thin_pack)
110 revs.edge_hint = 1;
111
1e39d7d @pclouds upload-pack: remove unused "create_full_pack" code in do_rev_list
pclouds authored
112 for (i = 0; i < want_obj.nr; i++) {
113 struct object *o = want_obj.objects[i].item;
114 /* why??? */
115 o->flags &= ~UNINTERESTING;
116 add_pending_object(&revs, o, NULL);
80ccaa7 upload-pack: Move the revision walker into a separate function.
Johannes Sixt authored
117 }
1e39d7d @pclouds upload-pack: remove unused "create_full_pack" code in do_rev_list
pclouds authored
118 for (i = 0; i < have_obj.nr; i++) {
119 struct object *o = have_obj.objects[i].item;
120 o->flags |= UNINTERESTING;
121 add_pending_object(&revs, o, NULL);
122 }
123 setup_revisions(0, NULL, &revs, NULL);
3d51e1b check return code of prepare_revision_walk
Martin Koegler authored
124 if (prepare_revision_walk(&revs))
125 die("revision walk setup failed");
80ccaa7 upload-pack: Move the revision walker into a separate function.
Johannes Sixt authored
126 mark_edges_uninteresting(revs.commits, &revs, show_edge);
6523078 make shallow repository deepening more network efficient
Nicolas Pitre authored
127 if (use_thin_pack)
128 for (i = 0; i < extra_edge_obj.nr; i++)
129 fprintf(pack_pipe, "-%s\n", sha1_to_hex(
130 extra_edge_obj.objects[i].item->sha1));
11c211f @chriscool list-objects: add "void *data" parameter to show functions
chriscool authored
131 traverse_commit_list(&revs, show_commit, show_object, NULL);
618ebe9 Windows: Implement asynchronous functions as threads.
Johannes Sixt authored
132 fflush(pack_pipe);
133 fclose(pack_pipe);
21edd3f upload-pack: Run rev-list in an asynchronous function.
Johannes Sixt authored
134 return 0;
80ccaa7 upload-pack: Move the revision walker into a separate function.
Johannes Sixt authored
135 }
136
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
137 static void create_pack_file(void)
138 {
21edd3f upload-pack: Run rev-list in an asynchronous function.
Johannes Sixt authored
139 struct async rev_list;
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
140 struct child_process pack_objects;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
141 int create_full_pack = (nr_our_refs == want_obj.nr && !have_obj.nr);
363b781 upload-pack: prepare for sideband message support.
Junio C Hamano authored
142 char data[8193], progress[128];
583b7ea upload-pack/fetch-pack: support side-band communication
Junio C Hamano authored
143 char abort_msg[] = "aborting due to possible repository "
144 "corruption on the remote side.";
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
145 int buffered = -1;
1456b04 @gitster Remove post-upload-hook
gitster authored
146 ssize_t sz;
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
147 const char *argv[10];
148 int arg = 0;
75bfc6c Make git-fetch-pack actually do all the unpacking etc.
Linus Torvalds authored
149
b961219 @peff upload-pack: start pack-objects before async rev-list
peff authored
150 argv[arg++] = "pack-objects";
151 if (!shallow_nr) {
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
152 argv[arg++] = "--revs";
153 if (create_full_pack)
154 argv[arg++] = "--all";
155 else if (use_thin_pack)
156 argv[arg++] = "--thin";
157 }
75bfc6c Make git-fetch-pack actually do all the unpacking etc.
Linus Torvalds authored
158
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
159 argv[arg++] = "--stdout";
160 if (!no_progress)
161 argv[arg++] = "--progress";
162 if (use_ofs_delta)
163 argv[arg++] = "--delta-base-offset";
348e390 @spearce Teach fetch-pack/upload-pack about --include-tag
spearce authored
164 if (use_include_tag)
165 argv[arg++] = "--include-tag";
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
166 argv[arg++] = NULL;
167
168 memset(&pack_objects, 0, sizeof(pack_objects));
b961219 @peff upload-pack: start pack-objects before async rev-list
peff authored
169 pack_objects.in = -1;
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
170 pack_objects.out = -1;
171 pack_objects.err = -1;
172 pack_objects.git_cmd = 1;
173 pack_objects.argv = argv;
21edd3f upload-pack: Run rev-list in an asynchronous function.
Johannes Sixt authored
174
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
175 if (start_command(&pack_objects))
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
176 die("git upload-pack: unable to fork git-pack-objects");
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
177
b961219 @peff upload-pack: start pack-objects before async rev-list
peff authored
178 if (shallow_nr) {
179 memset(&rev_list, 0, sizeof(rev_list));
180 rev_list.proc = do_rev_list;
181 rev_list.out = pack_objects.in;
182 if (start_async(&rev_list))
183 die("git upload-pack: unable to fork git-rev-list");
184 }
185 else {
4169837 don't dereference NULL upon fdopen failure
Jim Meyering authored
186 FILE *pipe_fd = xfdopen(pack_objects.in, "w");
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
187 if (!create_full_pack) {
188 int i;
189 for (i = 0; i < want_obj.nr; i++)
190 fprintf(pipe_fd, "%s\n", sha1_to_hex(want_obj.objects[i].item->sha1));
191 fprintf(pipe_fd, "--not\n");
192 for (i = 0; i < have_obj.nr; i++)
193 fprintf(pipe_fd, "%s\n", sha1_to_hex(have_obj.objects[i].item->sha1));
194 }
195
196 fprintf(pipe_fd, "\n");
197 fflush(pipe_fd);
198 fclose(pipe_fd);
199 }
200
201
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
202 /* We read from pack_objects.err to capture stderr output for
203 * progress bar, and pack_objects.out to capture the pack data.
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
204 */
205
206 while (1) {
207 struct pollfd pfd[2];
363b781 upload-pack: prepare for sideband message support.
Junio C Hamano authored
208 int pe, pu, pollsize;
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
209
0d516ad @matled upload-pack: fix timeout in create_pack_file
matled authored
210 reset_timeout();
211
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
212 pollsize = 0;
363b781 upload-pack: prepare for sideband message support.
Junio C Hamano authored
213 pe = pu = -1;
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
214
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
215 if (0 <= pack_objects.out) {
216 pfd[pollsize].fd = pack_objects.out;
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
217 pfd[pollsize].events = POLLIN;
218 pu = pollsize;
219 pollsize++;
220 }
cc41fa8 upload-pack: Use start_command() to run pack-objects in create_pack_f…
Johannes Sixt authored
221 if (0 <= pack_objects.err) {
222 pfd[pollsize].fd = pack_objects.err;
363b781 upload-pack: prepare for sideband message support.
Junio C Hamano authored
223 pfd[pollsize].events = POLLIN;
224 pe = pollsize;
225 pollsize++;
226 }
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
227
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
228 if (!pollsize)
229 break;
230
231 if (poll(pfd, pollsize, -1) < 0) {
232 if (errno != EINTR) {
233 error("poll failed, resuming: %s",
234 strerror(errno));
235 sleep(1);
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
236 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
237 continue;
238 }
6b59f51 @npitre give priority to progress messages
npitre authored
239 if (0 <= pe && (pfd[pe].revents & (POLLIN|POLLHUP))) {
240 /* Status ready; we ship that in the side-band
241 * or dump to the standard error.
242 */
243 sz = xread(pack_objects.err, progress,
244 sizeof(progress));
245 if (0 < sz)
246 send_client_data(2, progress, sz);
247 else if (sz == 0) {
248 close(pack_objects.err);
249 pack_objects.err = -1;
250 }
251 else
252 goto fail;
253 /* give priority to status messages */
254 continue;
255 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
256 if (0 <= pu && (pfd[pu].revents & (POLLIN|POLLHUP))) {
257 /* Data ready; we keep the last byte to ourselves
258 * in case we detect broken rev-list, so that we
259 * can leave the stream corrupted. This is
260 * unfortunate -- unpack-objects would happily
261 * accept a valid packdata with trailing garbage,
262 * so appending garbage after we pass all the
263 * pack data is not good enough to signal
264 * breakage to downstream.
265 */
266 char *cp = data;
267 ssize_t outsz = 0;
268 if (0 <= buffered) {
269 *cp++ = buffered;
270 outsz++;
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
271 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
272 sz = xread(pack_objects.out, cp,
273 sizeof(data) - outsz);
274 if (0 < sz)
1456b04 @gitster Remove post-upload-hook
gitster authored
275 ;
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
276 else if (sz == 0) {
277 close(pack_objects.out);
278 pack_objects.out = -1;
363b781 upload-pack: prepare for sideband message support.
Junio C Hamano authored
279 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
280 else
281 goto fail;
282 sz += outsz;
283 if (1 < sz) {
284 buffered = data[sz-1] & 0xFF;
285 sz--;
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
286 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
287 else
288 buffered = -1;
289 sz = send_client_data(1, data, sz);
290 if (sz < 0)
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
291 goto fail;
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
292 }
293 }
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
294
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
295 if (finish_command(&pack_objects)) {
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
296 error("git upload-pack: git-pack-objects died with error.");
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
297 goto fail;
298 }
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
299 if (shallow_nr && finish_async(&rev_list))
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
300 goto fail; /* error was already reported */
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
301
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
302 /* flush the data */
303 if (0 <= buffered) {
304 data[0] = buffered;
305 sz = send_client_data(1, data, 1);
306 if (sz < 0)
307 goto fail;
308 fprintf(stderr, "flushed.\n");
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
309 }
4c324c0 upload-pack: Use finish_{command,async}() instead of waitpid().
Johannes Sixt authored
310 if (use_sideband)
311 packet_flush(1);
312 return;
313
b1c71b7 upload-pack: avoid sending an incomplete pack upon failure
Junio C Hamano authored
314 fail:
583b7ea upload-pack/fetch-pack: support side-band communication
Junio C Hamano authored
315 send_client_data(3, abort_msg, sizeof(abort_msg));
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
316 die("git upload-pack: %s", abort_msg);
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
317 }
318
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
319 static int got_sha1(char *hex, unsigned char *sha1)
320 {
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
321 struct object *o;
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
322 int we_knew_they_have = 0;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
323
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
324 if (get_sha1_hex(hex, sha1))
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
325 die("git upload-pack: expected SHA1 object, got '%s'", hex);
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
326 if (!has_sha1_file(sha1))
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
327 return -1;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
328
329 o = lookup_object(sha1);
330 if (!(o && o->parsed))
331 o = parse_object(sha1);
332 if (!o)
333 die("oops (%s)", sha1_to_hex(sha1));
182a8da Merge branch 'jc/upload-pack'
Junio C Hamano authored
334 if (o->type == OBJ_COMMIT) {
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
335 struct commit_list *parents;
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
336 struct commit *commit = (struct commit *)o;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
337 if (o->flags & THEY_HAVE)
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
338 we_knew_they_have = 1;
339 else
340 o->flags |= THEY_HAVE;
341 if (!oldest_have || (commit->date < oldest_have))
342 oldest_have = commit->date;
343 for (parents = commit->parents;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
344 parents;
345 parents = parents->next)
346 parents->item->object.flags |= THEY_HAVE;
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
347 }
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
348 if (!we_knew_they_have) {
349 add_object_array(o, NULL, &have_obj);
350 return 1;
351 }
352 return 0;
353 }
354
355 static int reachable(struct commit *want)
356 {
357 struct commit_list *work = NULL;
358
47e44ed commit: Add commit_list prefix in two function names.
Thiago Farina authored
359 commit_list_insert_by_date(want, &work);
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
360 while (work) {
361 struct commit_list *list = work->next;
362 struct commit *commit = work->item;
363 free(work);
364 work = list;
365
366 if (commit->object.flags & THEY_HAVE) {
367 want->object.flags |= COMMON_KNOWN;
368 break;
369 }
370 if (!commit->object.parsed)
371 parse_object(commit->object.sha1);
372 if (commit->object.flags & REACHABLE)
373 continue;
374 commit->object.flags |= REACHABLE;
375 if (commit->date < oldest_have)
376 continue;
377 for (list = commit->parents; list; list = list->next) {
378 struct commit *parent = list->item;
379 if (!(parent->object.flags & REACHABLE))
47e44ed commit: Add commit_list prefix in two function names.
Thiago Farina authored
380 commit_list_insert_by_date(parent, &work);
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
381 }
382 }
383 want->object.flags |= REACHABLE;
384 clear_commit_marks(want, REACHABLE);
385 free_commit_list(work);
386 return (want->object.flags & COMMON_KNOWN);
387 }
388
389 static int ok_to_give_up(void)
390 {
391 int i;
392
393 if (!have_obj.nr)
394 return 0;
395
396 for (i = 0; i < want_obj.nr; i++) {
397 struct object *want = want_obj.objects[i].item;
398
399 if (want->flags & COMMON_KNOWN)
400 continue;
401 want = deref_tag(want, "a want line", 0);
402 if (!want || want->type != OBJ_COMMIT) {
403 /* no way to tell if this is reachable by
404 * looking at the ancestry chain alone, so
405 * leave a note to ourselves not to worry about
406 * this object anymore.
407 */
408 want_obj.objects[i].item->flags |= COMMON_KNOWN;
409 continue;
410 }
411 if (!reachable((struct commit *)want))
412 return 0;
413 }
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
414 return 1;
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
415 }
416
417 static int get_common_commits(void)
418 {
419 static char line[1000];
c04c4e5 upload-pack: minor clean-up in multi-ack logic
Junio C Hamano authored
420 unsigned char sha1[20];
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
421 char last_hex[41];
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
422 int got_common = 0;
423 int got_other = 0;
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
424 int sent_ready = 0;
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
425
f0243f2 @dscho git-upload-pack: More efficient usage of the has_sha1 array
dscho authored
426 save_commit_buffer = 0;
427
eeefa7c @bgianfo Style fixes, add a space after if/for/while.
bgianfo authored
428 for (;;) {
fd13b21 @d0k Move local variables to narrower scopes
d0k authored
429 int len = packet_read_line(0, line, sizeof(line));
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
430 reset_timeout();
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
431
432 if (!len) {
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
433 if (multi_ack == 2 && got_common
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
434 && !got_other && ok_to_give_up()) {
435 sent_ready = 1;
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
436 packet_write(1, "ACK %s ready\n", last_hex);
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
437 }
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
438 if (have_obj.nr == 0 || multi_ack)
1bd8c8f @dscho git-upload-pack: Support the multi_ack protocol
dscho authored
439 packet_write(1, "NAK\n");
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
440
441 if (no_done && sent_ready) {
442 packet_write(1, "ACK %s\n", last_hex);
443 return 0;
444 }
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
445 if (stateless_rpc)
446 exit(0);
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
447 got_common = 0;
448 got_other = 0;
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
449 continue;
450 }
fd13b21 @d0k Move local variables to narrower scopes
d0k authored
451 strip(line, len);
cc44c76 Mechanical conversion to use prefixcmp()
Junio C Hamano authored
452 if (!prefixcmp(line, "have ")) {
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
453 switch (got_sha1(line+5, sha1)) {
454 case -1: /* they have what we do not */
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
455 got_other = 1;
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
456 if (multi_ack && ok_to_give_up()) {
457 const char *hex = sha1_to_hex(sha1);
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
458 if (multi_ack == 2) {
459 sent_ready = 1;
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
460 packet_write(1, "ACK %s ready\n", hex);
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
461 } else
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
462 packet_write(1, "ACK %s continue\n", hex);
463 }
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
464 break;
465 default:
49bee71 @spearce upload-pack: More aggressively send 'ACK %s ready'
spearce authored
466 got_common = 1;
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
467 memcpy(last_hex, sha1_to_hex(sha1), 41);
468 if (multi_ack == 2)
469 packet_write(1, "ACK %s common\n", last_hex);
470 else if (multi_ack)
471 packet_write(1, "ACK %s continue\n", last_hex);
c04c4e5 upload-pack: minor clean-up in multi-ack logic
Junio C Hamano authored
472 else if (have_obj.nr == 1)
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
473 packet_write(1, "ACK %s\n", last_hex);
937a515 upload-pack: stop the other side when they have more roots than we do.
Junio C Hamano authored
474 break;
af2d3aa Revert recent fetch-pack/upload-pack updates.
Junio C Hamano authored
475 }
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
476 continue;
477 }
478 if (!strcmp(line, "done")) {
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
479 if (have_obj.nr > 0) {
1bd8c8f @dscho git-upload-pack: Support the multi_ack protocol
dscho authored
480 if (multi_ack)
c04c4e5 upload-pack: minor clean-up in multi-ack logic
Junio C Hamano authored
481 packet_write(1, "ACK %s\n", last_hex);
1bd8c8f @dscho git-upload-pack: Support the multi_ack protocol
dscho authored
482 return 0;
483 }
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
484 packet_write(1, "NAK\n");
485 return -1;
486 }
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
487 die("git upload-pack: expected SHA1 list, got '%s'", line);
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
488 }
489 }
490
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
491 static void check_non_tip(void)
492 {
493 static const char *argv[] = {
494 "rev-list", "--stdin", NULL,
495 };
496 static struct child_process cmd;
497 struct object *o;
498 char namebuf[42]; /* ^ + SHA-1 + LF */
499 int i;
500
501 /* In the normal in-process case non-tip request can never happen */
502 if (!stateless_rpc)
503 goto error;
504
505 cmd.argv = argv;
506 cmd.git_cmd = 1;
507 cmd.no_stderr = 1;
508 cmd.in = -1;
509 cmd.out = -1;
510
511 if (start_command(&cmd))
512 goto error;
513
514 /*
515 * If rev-list --stdin encounters an unknown commit, it
516 * terminates, which will cause SIGPIPE in the write loop
517 * below.
518 */
519 sigchain_push(SIGPIPE, SIG_IGN);
520
521 namebuf[0] = '^';
522 namebuf[41] = '\n';
523 for (i = get_max_object_index(); 0 < i; ) {
524 o = get_indexed_object(--i);
2a74532 @ferringb get_indexed_object can return NULL if nothing is in that slot; check …
ferringb authored
525 if (!o)
526 continue;
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
527 if (!(o->flags & OUR_REF))
528 continue;
529 memcpy(namebuf + 1, sha1_to_hex(o->sha1), 40);
530 if (write_in_full(cmd.in, namebuf, 42) < 0)
531 goto error;
532 }
533 namebuf[40] = '\n';
534 for (i = 0; i < want_obj.nr; i++) {
535 o = want_obj.objects[i].item;
536 if (o->flags & OUR_REF)
537 continue;
538 memcpy(namebuf, sha1_to_hex(o->sha1), 40);
539 if (write_in_full(cmd.in, namebuf, 41) < 0)
540 goto error;
541 }
542 close(cmd.in);
543
544 sigchain_pop(SIGPIPE);
545
546 /*
547 * The commits out of the rev-list are not ancestors of
548 * our ref.
549 */
550 i = read_in_full(cmd.out, namebuf, 1);
551 if (i)
552 goto error;
553 close(cmd.out);
554
555 /*
556 * rev-list may have died by encountering a bad commit
557 * in the history, in which case we do want to bail out
558 * even when it showed no commit.
559 */
560 if (finish_command(&cmd))
561 goto error;
562
563 /* All the non-tip ones are ancestors of what we advertised */
564 return;
565
566 error:
567 /* Pick one of them (we know there at least is one) */
568 for (i = 0; i < want_obj.nr; i++) {
569 o = want_obj.objects[i].item;
570 if (!(o->flags & OUR_REF))
571 die("git upload-pack: not our ref %s",
572 sha1_to_hex(o->sha1));
573 }
574 }
575
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
576 static void receive_needs(void)
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
577 {
3cd4745 object.h: Add OBJECT_ARRAY_INIT macro and make use of it.
Thiago Farina authored
578 struct object_array shallows = OBJECT_ARRAY_INIT;
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
579 static char line[1000];
016e6cc @dscho allow cloning a repository "shallowly"
dscho authored
580 int len, depth = 0;
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
581 int has_non_tip = 0;
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
582
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
583 shallow_nr = 0;
49aaddd @spearce Teach upload-pack to log the received need lines to an fd
spearce authored
584 if (debug_fd)
2b7ca83 @meyering use write_str_in_full helper to avoid literal string lengths
meyering authored
585 write_str_in_full(debug_fd, "#S\n");
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
586 for (;;) {
565ebbf upload-pack: tighten request validation.
Junio C Hamano authored
587 struct object *o;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
588 const char *features;
6ece0d3 upload-pack: use object pointer not copy of sha1 to keep track of has…
Junio C Hamano authored
589 unsigned char sha1_buf[20];
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
590 len = packet_read_line(0, line, sizeof(line));
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
591 reset_timeout();
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
592 if (!len)
ed09aef @dscho support fetching into a shallow repository
dscho authored
593 break;
49aaddd @spearce Teach upload-pack to log the received need lines to an fd
spearce authored
594 if (debug_fd)
595 write_in_full(debug_fd, line, len);
e091eb9 upload-pack: Do not choke on too many heads request.
Junio C Hamano authored
596
599065a prefixcmp(): fix-up mechanical conversion.
Junio C Hamano authored
597 if (!prefixcmp(line, "shallow ")) {
ed09aef @dscho support fetching into a shallow repository
dscho authored
598 unsigned char sha1[20];
599 struct object *object;
600 if (get_sha1(line + 8, sha1))
601 die("invalid shallow line: %s", line);
602 object = parse_object(sha1);
603 if (!object)
604 die("did not find object for %s", line);
f53514b @dscho allow deepening of a shallow repository
dscho authored
605 object->flags |= CLIENT_SHALLOW;
ed09aef @dscho support fetching into a shallow repository
dscho authored
606 add_object_array(object, NULL, &shallows);
607 continue;
608 }
599065a prefixcmp(): fix-up mechanical conversion.
Junio C Hamano authored
609 if (!prefixcmp(line, "deepen ")) {
016e6cc @dscho allow cloning a repository "shallowly"
dscho authored
610 char *end;
611 depth = strtol(line + 7, &end, 0);
612 if (end == line + 7 || depth <= 0)
613 die("Invalid deepen: %s", line);
614 continue;
615 }
599065a prefixcmp(): fix-up mechanical conversion.
Junio C Hamano authored
616 if (prefixcmp(line, "want ") ||
6ece0d3 upload-pack: use object pointer not copy of sha1 to keep track of has…
Junio C Hamano authored
617 get_sha1_hex(line+5, sha1_buf))
7e44c93 @gitster 'git foo' program identifies itself without dash in die() messages
gitster authored
618 die("git upload-pack: protocol error, "
e091eb9 upload-pack: Do not choke on too many heads request.
Junio C Hamano authored
619 "expected to get sha, not '%s'", line);
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
620
621 features = line + 45;
622
623 if (parse_feature_request(features, "multi_ack_detailed"))
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
624 multi_ack = 2;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
625 else if (parse_feature_request(features, "multi_ack"))
1bd8c8f @dscho git-upload-pack: Support the multi_ack protocol
dscho authored
626 multi_ack = 1;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
627 if (parse_feature_request(features, "no-done"))
4e10cf9 @gitster Revert two "no-done" reverts
gitster authored
628 no_done = 1;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
629 if (parse_feature_request(features, "thin-pack"))
b19696c Use thin pack transfer in "git fetch".
Junio C Hamano authored
630 use_thin_pack = 1;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
631 if (parse_feature_request(features, "ofs-delta"))
e4fe4b8 let the GIT native protocol use offsets to delta base when possible
Nicolas Pitre authored
632 use_ofs_delta = 1;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
633 if (parse_feature_request(features, "side-band-64k"))
d47f3db Prepare larger packet buffer for upload-pack protocol.
Junio C Hamano authored
634 use_sideband = LARGE_PACKET_MAX;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
635 else if (parse_feature_request(features, "side-band"))
d47f3db Prepare larger packet buffer for upload-pack protocol.
Junio C Hamano authored
636 use_sideband = DEFAULT_PACKET_MAX;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
637 if (parse_feature_request(features, "no-progress"))
b0e9089 @dscho Fixup no-progress for fetch & clone
dscho authored
638 no_progress = 1;
f47182c @gitster server_supports(): parse feature list more carefully
gitster authored
639 if (parse_feature_request(features, "include-tag"))
348e390 @spearce Teach fetch-pack/upload-pack about --include-tag
spearce authored
640 use_include_tag = 1;
565ebbf upload-pack: tighten request validation.
Junio C Hamano authored
641
642 o = lookup_object(sha1_buf);
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
643 if (!o)
9f9aa76 @newren upload-pack: Improve error message when bad ref requested
newren authored
644 die("git upload-pack: not our ref %s",
645 sha1_to_hex(sha1_buf));
565ebbf upload-pack: tighten request validation.
Junio C Hamano authored
646 if (!(o->flags & WANTED)) {
647 o->flags |= WANTED;
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
648 if (!(o->flags & OUR_REF))
649 has_non_tip = 1;
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
650 add_object_array(o, NULL, &want_obj);
565ebbf upload-pack: tighten request validation.
Junio C Hamano authored
651 }
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
652 }
49aaddd @spearce Teach upload-pack to log the received need lines to an fd
spearce authored
653 if (debug_fd)
2b7ca83 @meyering use write_str_in_full helper to avoid literal string lengths
meyering authored
654 write_str_in_full(debug_fd, "#E\n");
9462e3f upload-pack: squelch progress indicator if client cannot see it
Johannes Sixt authored
655
051e400 @gitster helping smart-http/stateless-rpc fetch race
gitster authored
656 /*
657 * We have sent all our refs already, and the other end
658 * should have chosen out of them. When we are operating
659 * in the stateless RPC mode, however, their choice may
660 * have been based on the set of older refs advertised
661 * by another process that handled the initial request.
662 */
663 if (has_non_tip)
664 check_non_tip();
665
9462e3f upload-pack: squelch progress indicator if client cannot see it
Johannes Sixt authored
666 if (!use_sideband && daemon_mode)
667 no_progress = 1;
668
f53514b @dscho allow deepening of a shallow repository
dscho authored
669 if (depth == 0 && shallows.nr == 0)
670 return;
016e6cc @dscho allow cloning a repository "shallowly"
dscho authored
671 if (depth > 0) {
672 struct commit_list *result, *backup;
f53514b @dscho allow deepening of a shallow repository
dscho authored
673 int i;
674 backup = result = get_shallow_commits(&want_obj, depth,
675 SHALLOW, NOT_SHALLOW);
016e6cc @dscho allow cloning a repository "shallowly"
dscho authored
676 while (result) {
f53514b @dscho allow deepening of a shallow repository
dscho authored
677 struct object *object = &result->item->object;
1f2de76 @julliard upload-pack: Check for NOT_SHALLOW flag before sending a shallow to t…
julliard authored
678 if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
f53514b @dscho allow deepening of a shallow repository
dscho authored
679 packet_write(1, "shallow %s",
680 sha1_to_hex(object->sha1));
681 register_shallow(object->sha1);
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
682 shallow_nr++;
f53514b @dscho allow deepening of a shallow repository
dscho authored
683 }
016e6cc @dscho allow cloning a repository "shallowly"
dscho authored
684 result = result->next;
685 }
686 free_commit_list(backup);
f53514b @dscho allow deepening of a shallow repository
dscho authored
687 for (i = 0; i < shallows.nr; i++) {
688 struct object *object = shallows.objects[i].item;
689 if (object->flags & NOT_SHALLOW) {
690 struct commit_list *parents;
691 packet_write(1, "unshallow %s",
692 sha1_to_hex(object->sha1));
693 object->flags &= ~CLIENT_SHALLOW;
694 /* make sure the real parents are parsed */
695 unregister_shallow(object->sha1);
176d45c shallow clone: unparse and reparse an unshallowed commit
Junio C Hamano authored
696 object->parsed = 0;
dec38c8 check return value from parse_commit() in various functions
Martin Koegler authored
697 if (parse_commit((struct commit *)object))
698 die("invalid commit");
f53514b @dscho allow deepening of a shallow repository
dscho authored
699 parents = ((struct commit *)object)->parents;
700 while (parents) {
701 add_object_array(&parents->item->object,
702 NULL, &want_obj);
703 parents = parents->next;
704 }
6523078 make shallow repository deepening more network efficient
Nicolas Pitre authored
705 add_object_array(object, NULL, &extra_edge_obj);
f53514b @dscho allow deepening of a shallow repository
dscho authored
706 }
707 /* make sure commit traversal conforms to client */
708 register_shallow(object->sha1);
709 }
710 packet_flush(1);
711 } else
712 if (shallows.nr > 0) {
713 int i;
714 for (i = 0; i < shallows.nr; i++)
715 register_shallow(shallows.objects[i].item->sha1);
716 }
f0cea83 @sirnot Shift object enumeration out of upload-pack
sirnot authored
717
718 shallow_nr += shallows.nr;
f53514b @dscho allow deepening of a shallow repository
dscho authored
719 free(shallows.objects);
fb9040c Make git-fetch-pack and git-upload-pack negotiate needs/haves fully
Linus Torvalds authored
720 }
721
8da1977 Tell between packed, unpacked and symbolic refs.
Junio C Hamano authored
722 static int send_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
723 {
ed09aef @dscho support fetching into a shallow repository
dscho authored
724 static const char *capabilities = "multi_ack thin-pack side-band"
348e390 @spearce Teach fetch-pack/upload-pack about --include-tag
spearce authored
725 " side-band-64k ofs-delta shallow no-progress"
78affc4 @spearce Add multi_ack_detailed capability to fetch-pack/upload-pack
spearce authored
726 " include-tag multi_ack_detailed";
926f1dd @peff upload-pack: avoid parsing objects during ref advertisement
peff authored
727 struct object *o = lookup_unknown_object(sha1);
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
728 const char *refname_nons = strip_namespace(refname);
f6b42a8 Show peeled onion from upload-pack and server-info.
Junio C Hamano authored
729
926f1dd @peff upload-pack: avoid parsing objects during ref advertisement
peff authored
730 if (o->type == OBJ_NONE) {
731 o->type = sha1_object_info(sha1, NULL);
732 if (o->type < 0)
733 die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
734 }
b5b1699 @cworth-gh Prevent git-upload-pack segfault if object cannot be found
cworth-gh authored
735
1f5881b @dscho fix multi_ack.
dscho authored
736 if (capabilities)
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
737 packet_write(1, "%s %s%c%s%s\n", sha1_to_hex(sha1), refname_nons,
cf2ad8e @gitster enable "no-done" extension only when serving over smart-http
gitster authored
738 0, capabilities,
739 stateless_rpc ? " no-done" : "");
1f5881b @dscho fix multi_ack.
dscho authored
740 else
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
741 packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname_nons);
1f5881b @dscho fix multi_ack.
dscho authored
742 capabilities = NULL;
565ebbf upload-pack: tighten request validation.
Junio C Hamano authored
743 if (!(o->flags & OUR_REF)) {
744 o->flags |= OUR_REF;
745 nr_our_refs++;
746 }
1974632 Remove TYPE_* constant macros and use object_type enums consistently.
Linus Torvalds authored
747 if (o->type == OBJ_TAG) {
90108a2 @peff upload-pack: avoid parsing tag destinations
peff authored
748 o = deref_tag_noverify(o);
affeef1 deref_tag: handle return value NULL
Martin Koegler authored
749 if (o)
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
750 packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname_nons);
f6b42a8 Show peeled onion from upload-pack and server-info.
Junio C Hamano authored
751 }
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
752 return 0;
753 }
754
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
755 static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
756 {
757 struct object *o = parse_object(sha1);
758 if (!o)
759 die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
760 if (!(o->flags & OUR_REF)) {
761 o->flags |= OUR_REF;
762 nr_our_refs++;
763 }
764 return 0;
765 }
766
59076eb Make upload_pack void and remove conditional return.
David Rientjes authored
767 static void upload_pack(void)
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
768 {
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
769 if (advertise_refs || !stateless_rpc) {
770 reset_timeout();
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
771 head_ref_namespaced(send_ref, NULL);
772 for_each_namespaced_ref(send_ref, NULL);
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
773 packet_flush(1);
774 } else {
6b01ecf @joshtriplett ref namespaces: Support remote repositories via upload-pack and recei…
joshtriplett authored
775 head_ref_namespaced(mark_our_ref, NULL);
776 for_each_namespaced_ref(mark_our_ref, NULL);
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
777 }
778 if (advertise_refs)
779 return;
780
b1e9fff upload-pack: lift MAX_NEEDS and MAX_HAS limitation
Junio C Hamano authored
781 receive_needs();
59076eb Make upload_pack void and remove conditional return.
David Rientjes authored
782 if (want_obj.nr) {
783 get_common_commits();
784 create_pack_file();
785 }
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
786 }
787
788 int main(int argc, char **argv)
789 {
8d63013 Server-side support for user-relative paths.
Andreas Ericsson authored
790 char *dir;
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
791 int i;
792 int strict = 0;
793
5e9637c @avar i18n: add infrastructure for translating Git with gettext
avar authored
794 git_setup_gettext();
795
bbc30f9 @peff add packet tracing debug code
peff authored
796 packet_trace_identity("upload-pack");
2fb3f6d @sprohaska Add calls to git_extract_argv0_path() in programs that call git_config_*
sprohaska authored
797 git_extract_argv0_path(argv[0]);
dae556b @chriscool environment: add global variable to disable replacement
chriscool authored
798 read_replace_refs = 0;
2fb3f6d @sprohaska Add calls to git_extract_argv0_path() in programs that call git_config_*
sprohaska authored
799
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
800 for (i = 1; i < argc; i++) {
801 char *arg = argv[i];
802
803 if (arg[0] != '-')
804 break;
42526b4 @spearce Add stateless RPC options to upload-pack, receive-pack
spearce authored
805 if (!strcmp(arg, "--advertise-refs")) {
806 advertise_refs = 1;
807 continue;
808 }
809 if (!strcmp(arg, "--stateless-rpc")) {
810 stateless_rpc = 1;
811 continue;
812 }
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
813 if (!strcmp(arg, "--strict")) {
814 strict = 1;
815 continue;
816 }
cc44c76 Mechanical conversion to use prefixcmp()
Junio C Hamano authored
817 if (!prefixcmp(arg, "--timeout=")) {
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
818 timeout = atoi(arg+10);
9462e3f upload-pack: squelch progress indicator if client cannot see it
Johannes Sixt authored
819 daemon_mode = 1;
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
820 continue;
821 }
822 if (!strcmp(arg, "--")) {
823 i++;
824 break;
825 }
826 }
a6080a0 @gitster War on whitespace
gitster authored
827
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
828 if (i != argc-1)
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
829 usage(upload_pack_usage);
04b3305 upload-pack: Initialize the exec-path.
Johannes Sixt authored
830
e1464ca Record the command invocation path early
Johannes Sixt authored
831 setup_path();
04b3305 upload-pack: Initialize the exec-path.
Johannes Sixt authored
832
960decc git-daemon: timeout, eliminate double DWIM
H. Peter Anvin authored
833 dir = argv[i];
113b947 Make "upload-pack" match git-fetch-pack usage
Linus Torvalds authored
834
8d63013 Server-side support for user-relative paths.
Andreas Ericsson authored
835 if (!enter_repo(dir, strict))
05ac6b3 @peff improve missing repository error message
peff authored
836 die("'%s' does not appear to be a git repository", dir);
a0022ee shallow repository: disable unsupported operations for now.
Junio C Hamano authored
837 if (is_repository_shallow())
838 die("attempt to fetch/clone from a shallow repository");
49aaddd @spearce Teach upload-pack to log the received need lines to an fd
spearce authored
839 if (getenv("GIT_DEBUG_SEND_PACK"))
840 debug_fd = atoi(getenv("GIT_DEBUG_SEND_PACK"));
def88e9 Commit first cut at "git-fetch-pack"
Linus Torvalds authored
841 upload_pack();
842 return 0;
843 }
Something went wrong with that request. Please try again.