Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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