Skip to content
Newer
Older
100644 1295 lines (1108 sloc) 32.3 KB
9b28851 Push code for transport library
Daniel Barkalow authored Sep 10, 2007
1 #include "cache.h"
2 #include "transport.h"
3 #include "run-command.h"
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 10, 2007
4 #include "pkt-line.h"
5 #include "fetch-pack.h"
40cb4fa Use built-in send-pack.
Daniel Barkalow authored Oct 29, 2007
6 #include "send-pack.h"
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
7 #include "walker.h"
c7a8a16 @dscho Add bundle transport
dscho authored Sep 10, 2007
8 #include "bundle.h"
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Oct 1, 2007
9 #include "dir.h"
10 #include "refs.h"
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
11 #include "branch.h"
638794c @peff make url-related functions reusable
peff authored May 23, 2010
12 #include "url.h"
d2b17b3 @iveqy push: Don't push a repository with unpushed submodules
iveqy authored Aug 20, 2011
13 #include "submodule.h"
a762e51 Refactor submodule push check to use string list instead of integer
Heiko Voigt authored Mar 29, 2012
14 #include "string-list.h"
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
15
16 /* rsync support */
17
18 /*
19 * We copy packed-refs and refs/ into a temporary file, then read the
20 * loose refs recursively (sorting whenever possible), and then inserting
21 * those packed refs that are not yet in the list (not validating, but
22 * assuming that the file is sorted).
23 *
24 * Appears refactoring this from refs.c is too cumbersome.
25 */
26
27 static int str_cmp(const void *a, const void *b)
28 {
29 const char *s1 = a;
30 const char *s2 = b;
31
32 return strcmp(s1, s2);
33 }
34
35 /* path->buf + name_offset is expected to point to "refs/" */
36
37 static int read_loose_refs(struct strbuf *path, int name_offset,
38 struct ref **tail)
39 {
40 DIR *dir = opendir(path->buf);
41 struct dirent *de;
42 struct {
43 char **entries;
44 int nr, alloc;
45 } list;
46 int i, pathlen;
47
48 if (!dir)
49 return -1;
50
51 memset (&list, 0, sizeof(list));
52
53 while ((de = readdir(dir))) {
8ca12c0 @aspotashev add is_dot_or_dotdot inline function
aspotashev authored Jan 10, 2009
54 if (is_dot_or_dotdot(de->d_name))
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
55 continue;
56 ALLOC_GROW(list.entries, list.nr + 1, list.alloc);
57 list.entries[list.nr++] = xstrdup(de->d_name);
58 }
59 closedir(dir);
60
61 /* sort the list */
62
63 qsort(list.entries, list.nr, sizeof(char *), str_cmp);
64
65 pathlen = path->len;
66 strbuf_addch(path, '/');
67
68 for (i = 0; i < list.nr; i++, strbuf_setlen(path, pathlen + 1)) {
69 strbuf_addstr(path, list.entries[i]);
70 if (read_loose_refs(path, name_offset, tail)) {
71 int fd = open(path->buf, O_RDONLY);
72 char buffer[40];
73 struct ref *next;
74
75 if (fd < 0)
76 continue;
59c69c0 make alloc_ref_from_str() the new alloc_ref()
René Scharfe authored Oct 18, 2008
77 next = alloc_ref(path->buf + name_offset);
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
78 if (read_in_full(fd, buffer, 40) != 40 ||
79 get_sha1_hex(buffer, next->old_sha1)) {
80 close(fd);
81 free(next);
82 continue;
83 }
84 close(fd);
85 (*tail)->next = next;
86 *tail = next;
87 }
88 }
89 strbuf_setlen(path, pathlen);
90
91 for (i = 0; i < list.nr; i++)
92 free(list.entries[i]);
93 free(list.entries);
94
95 return 0;
96 }
97
98 /* insert the packed refs for which no loose refs were found */
99
100 static void insert_packed_refs(const char *packed_refs, struct ref **list)
101 {
102 FILE *f = fopen(packed_refs, "r");
103 static char buffer[PATH_MAX];
104
105 if (!f)
106 return;
107
108 for (;;) {
47ec794 @bcr transport.c: squelch a gcc 4.0.1 complaint about an uninitialized var…
bcr authored Nov 1, 2007
109 int cmp = cmp, len;
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
110
111 if (!fgets(buffer, sizeof(buffer), f)) {
112 fclose(f);
113 return;
114 }
115
116 if (hexval(buffer[0]) > 0xf)
117 continue;
118 len = strlen(buffer);
872c930 @meyering Don't access line[-1] for a zero-length "line" from fgets.
meyering authored Jan 4, 2008
119 if (len && buffer[len - 1] == '\n')
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
120 buffer[--len] = '\0';
121 if (len < 41)
122 continue;
123 while ((*list)->next &&
124 (cmp = strcmp(buffer + 41,
125 (*list)->next->name)) > 0)
126 list = &(*list)->next;
127 if (!(*list)->next || cmp < 0) {
59c69c0 make alloc_ref_from_str() the new alloc_ref()
René Scharfe authored Oct 18, 2008
128 struct ref *next = alloc_ref(buffer + 41);
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
129 buffer[40] = '\0';
130 if (get_sha1_hex(buffer, next->old_sha1)) {
131 warning ("invalid SHA-1: %s", buffer);
132 free(next);
133 continue;
134 }
135 next->next = (*list)->next;
136 (*list)->next = next;
137 list = &(*list)->next;
138 }
139 }
140 }
141
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
142 static void set_upstreams(struct transport *transport, struct ref *refs,
143 int pretend)
144 {
145 struct ref *ref;
146 for (ref = refs; ref; ref = ref->next) {
147 const char *localname;
148 const char *tmp;
149 const char *remotename;
150 unsigned char sha[20];
151 int flag = 0;
152 /*
153 * Check suitability for tracking. Must be successful /
154 * already up-to-date ref create/modify (not delete).
155 */
156 if (ref->status != REF_STATUS_OK &&
157 ref->status != REF_STATUS_UPTODATE)
158 continue;
159 if (!ref->peer_ref)
160 continue;
5dd5648 @meyering remove tests of always-false condition
meyering authored May 26, 2011
161 if (is_null_sha1(ref->new_sha1))
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
162 continue;
163
164 /* Follow symbolic refs (mainly for HEAD). */
165 localname = ref->peer_ref->name;
166 remotename = ref->name;
8cad474 @pclouds Rename resolve_ref() to resolve_ref_unsafe()
pclouds authored Dec 12, 2011
167 tmp = resolve_ref_unsafe(localname, sha, 1, &flag);
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
168 if (tmp && flag & REF_ISSYMREF &&
169 !prefixcmp(tmp, "refs/heads/"))
170 localname = tmp;
171
172 /* Both source and destination must be local branches. */
173 if (!localname || prefixcmp(localname, "refs/heads/"))
174 continue;
175 if (!remotename || prefixcmp(remotename, "refs/heads/"))
176 continue;
177
178 if (!pretend)
179 install_branch_config(BRANCH_CONFIG_VERBOSE,
180 localname + 11, transport->remote->name,
181 remotename);
182 else
183 printf("Would set upstream of '%s' to '%s' of '%s'\n",
184 localname + 11, remotename + 11,
185 transport->remote->name);
186 }
187 }
188
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
189 static const char *rsync_url(const char *url)
190 {
191 return prefixcmp(url, "rsync://") ? skip_prefix(url, "rsync:") : url;
192 }
193
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 8, 2009
194 static struct ref *get_refs_via_rsync(struct transport *transport, int for_push)
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
195 {
196 struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
c2e86ad @bebarino Fix sparse warnings
bebarino authored Mar 22, 2011
197 struct ref dummy = {NULL}, *tail = &dummy;
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
198 struct child_process rsync;
199 const char *args[5];
200 int temp_dir_len;
201
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
202 if (for_push)
203 return NULL;
204
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
205 /* copy the refs to the temporary directory */
206
207 strbuf_addstr(&temp_dir, git_path("rsync-refs-XXXXXX"));
208 if (!mkdtemp(temp_dir.buf))
0721c31 @trast Use die_errno() instead of die() when checking syscalls
trast authored Jun 27, 2009
209 die_errno ("Could not make temporary directory");
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
210 temp_dir_len = temp_dir.len;
211
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
212 strbuf_addstr(&buf, rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
213 strbuf_addstr(&buf, "/refs");
214
215 memset(&rsync, 0, sizeof(rsync));
216 rsync.argv = args;
217 rsync.stdout_to_stderr = 1;
218 args[0] = "rsync";
bd2c86e @peff make "git push -v" actually verbose
peff authored Dec 17, 2011
219 args[1] = (transport->verbose > 1) ? "-rv" : "-r";
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
220 args[2] = buf.buf;
221 args[3] = temp_dir.buf;
222 args[4] = NULL;
223
224 if (run_command(&rsync))
225 die ("Could not run rsync to get refs");
226
227 strbuf_reset(&buf);
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
228 strbuf_addstr(&buf, rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
229 strbuf_addstr(&buf, "/packed-refs");
230
231 args[2] = buf.buf;
232
233 if (run_command(&rsync))
234 die ("Could not run rsync to get refs");
235
236 /* read the copied refs */
237
238 strbuf_addstr(&temp_dir, "/refs");
239 read_loose_refs(&temp_dir, temp_dir_len + 1, &tail);
240 strbuf_setlen(&temp_dir, temp_dir_len);
241
242 tail = &dummy;
243 strbuf_addstr(&temp_dir, "/packed-refs");
244 insert_packed_refs(temp_dir.buf, &tail);
245 strbuf_setlen(&temp_dir, temp_dir_len);
246
247 if (remove_dir_recursively(&temp_dir, 0))
248 warning ("Error removing temporary directory %s.",
249 temp_dir.buf);
250
251 strbuf_release(&buf);
252 strbuf_release(&temp_dir);
253
254 return dummy.next;
255 }
256
257 static int fetch_objs_via_rsync(struct transport *transport,
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
258 int nr_objs, struct ref **to_fetch)
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
259 {
260 struct strbuf buf = STRBUF_INIT;
261 struct child_process rsync;
262 const char *args[8];
263 int result;
264
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
265 strbuf_addstr(&buf, rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
266 strbuf_addstr(&buf, "/objects/");
267
268 memset(&rsync, 0, sizeof(rsync));
269 rsync.argv = args;
270 rsync.stdout_to_stderr = 1;
271 args[0] = "rsync";
bd2c86e @peff make "git push -v" actually verbose
peff authored Dec 17, 2011
272 args[1] = (transport->verbose > 1) ? "-rv" : "-r";
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
273 args[2] = "--ignore-existing";
274 args[3] = "--exclude";
275 args[4] = "info";
276 args[5] = buf.buf;
277 args[6] = get_object_directory();
278 args[7] = NULL;
279
280 /* NEEDSWORK: handle one level of alternates */
281 result = run_command(&rsync);
282
283 strbuf_release(&buf);
284
285 return result;
286 }
287
288 static int write_one_ref(const char *name, const unsigned char *sha1,
289 int flags, void *data)
290 {
291 struct strbuf *buf = data;
292 int len = buf->len;
293 FILE *f;
294
295 /* when called via for_each_ref(), flags is non-zero */
296 if (flags && prefixcmp(name, "refs/heads/") &&
297 prefixcmp(name, "refs/tags/"))
298 return 0;
299
300 strbuf_addstr(buf, name);
301 if (safe_create_leading_directories(buf->buf) ||
302 !(f = fopen(buf->buf, "w")) ||
303 fprintf(f, "%s\n", sha1_to_hex(sha1)) < 0 ||
304 fclose(f))
305 return error("problems writing temporary file %s", buf->buf);
306 strbuf_setlen(buf, len);
307 return 0;
308 }
309
310 static int write_refs_to_temp_dir(struct strbuf *temp_dir,
311 int refspec_nr, const char **refspec)
312 {
313 int i;
314
315 for (i = 0; i < refspec_nr; i++) {
316 unsigned char sha1[20];
317 char *ref;
318
319 if (dwim_ref(refspec[i], strlen(refspec[i]), sha1, &ref) != 1)
320 return error("Could not get ref %s", refspec[i]);
321
322 if (write_one_ref(ref, sha1, 0, temp_dir)) {
323 free(ref);
324 return -1;
325 }
326 free(ref);
327 }
328 return 0;
329 }
330
331 static int rsync_transport_push(struct transport *transport,
332 int refspec_nr, const char **refspec, int flags)
333 {
334 struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
335 int result = 0, i;
336 struct child_process rsync;
ee020f3 @spearce Support 'push --dry-run' for rsync transport
spearce authored Oct 16, 2007
337 const char *args[10];
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
338
94c89ba @awhitcroft git-push: plumb in --mirror mode
awhitcroft authored Nov 9, 2007
339 if (flags & TRANSPORT_PUSH_MIRROR)
340 return error("rsync transport does not support mirror mode");
341
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
342 /* first push the objects */
343
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
344 strbuf_addstr(&buf, rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
345 strbuf_addch(&buf, '/');
346
347 memset(&rsync, 0, sizeof(rsync));
348 rsync.argv = args;
349 rsync.stdout_to_stderr = 1;
ee020f3 @spearce Support 'push --dry-run' for rsync transport
spearce authored Oct 16, 2007
350 i = 0;
351 args[i++] = "rsync";
352 args[i++] = "-a";
353 if (flags & TRANSPORT_PUSH_DRY_RUN)
354 args[i++] = "--dry-run";
bd2c86e @peff make "git push -v" actually verbose
peff authored Dec 17, 2011
355 if (transport->verbose > 1)
ee020f3 @spearce Support 'push --dry-run' for rsync transport
spearce authored Oct 16, 2007
356 args[i++] = "-v";
357 args[i++] = "--ignore-existing";
358 args[i++] = "--exclude";
359 args[i++] = "info";
360 args[i++] = get_object_directory();
361 args[i++] = buf.buf;
362 args[i++] = NULL;
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
363
364 if (run_command(&rsync))
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
365 return error("Could not push objects to %s",
366 rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
367
368 /* copy the refs to the temporary directory; they could be packed. */
369
370 strbuf_addstr(&temp_dir, git_path("rsync-refs-XXXXXX"));
371 if (!mkdtemp(temp_dir.buf))
0721c31 @trast Use die_errno() instead of die() when checking syscalls
trast authored Jun 27, 2009
372 die_errno ("Could not make temporary directory");
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
373 strbuf_addch(&temp_dir, '/');
374
375 if (flags & TRANSPORT_PUSH_ALL) {
376 if (for_each_ref(write_one_ref, &temp_dir))
377 return -1;
378 } else if (write_refs_to_temp_dir(&temp_dir, refspec_nr, refspec))
379 return -1;
380
ee020f3 @spearce Support 'push --dry-run' for rsync transport
spearce authored Oct 16, 2007
381 i = 2;
382 if (flags & TRANSPORT_PUSH_DRY_RUN)
383 args[i++] = "--dry-run";
384 if (!(flags & TRANSPORT_PUSH_FORCE))
385 args[i++] = "--ignore-existing";
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
386 args[i++] = temp_dir.buf;
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
387 args[i++] = rsync_url(transport->url);
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
388 args[i++] = NULL;
389 if (run_command(&rsync))
7efaeba @dscho rsync transport: allow local paths, and fix tests
dscho authored Mar 9, 2009
390 result = error("Could not push to %s",
391 rsync_url(transport->url));
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
392
393 if (remove_dir_recursively(&temp_dir, 0))
394 warning ("Could not remove temporary directory %s.",
395 temp_dir.buf);
396
397 strbuf_release(&buf);
398 strbuf_release(&temp_dir);
399
400 return result;
401 }
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
402
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
403 struct bundle_transport_data {
404 int fd;
405 struct bundle_header header;
406 };
407
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
408 static struct ref *get_refs_from_bundle(struct transport *transport, int for_push)
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
409 {
410 struct bundle_transport_data *data = transport->data;
411 struct ref *result = NULL;
412 int i;
413
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
414 if (for_push)
415 return NULL;
416
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
417 if (data->fd > 0)
418 close(data->fd);
419 data->fd = read_bundle_header(transport->url, &data->header);
420 if (data->fd < 0)
421 die ("Could not read bundle '%s'.", transport->url);
422 for (i = 0; i < data->header.references.nr; i++) {
423 struct ref_list_entry *e = data->header.references.list + i;
59c69c0 make alloc_ref_from_str() the new alloc_ref()
René Scharfe authored Oct 18, 2008
424 struct ref *ref = alloc_ref(e->name);
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
425 hashcpy(ref->old_sha1, e->sha1);
426 ref->next = result;
427 result = ref;
428 }
429 return result;
430 }
431
1788c39 @spearce Remove pack.keep after ref updates in git-fetch
spearce authored Sep 14, 2007
432 static int fetch_refs_from_bundle(struct transport *transport,
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
433 int nr_heads, struct ref **to_fetch)
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
434 {
435 struct bundle_transport_data *data = transport->data;
be042af @gitster Teach progress eye-candy to fetch_refs_from_bundle()
gitster authored Sep 18, 2011
436 return unbundle(&data->header, data->fd,
437 transport->progress ? BUNDLE_VERBOSE : 0);
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
438 }
439
440 static int close_bundle(struct transport *transport)
441 {
442 struct bundle_transport_data *data = transport->data;
443 if (data->fd > 0)
444 close(data->fd);
f4e9576 @spearce Fix memory leaks when disconnecting transport instances
spearce authored Sep 19, 2007
445 free(data);
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
446 return 0;
447 }
448
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
449 struct git_transport_data {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
450 struct git_transport_options options;
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
451 struct child_process *conn;
452 int fd[2];
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
453 unsigned got_remote_heads : 1;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
454 struct extra_have_objects extra_have;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
455 };
456
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
457 static int set_git_option(struct git_transport_options *opts,
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
458 const char *name, const char *value)
459 {
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
460 if (!strcmp(name, TRANS_OPT_UPLOADPACK)) {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
461 opts->uploadpack = value;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
462 return 0;
463 } else if (!strcmp(name, TRANS_OPT_RECEIVEPACK)) {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
464 opts->receivepack = value;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
465 return 0;
466 } else if (!strcmp(name, TRANS_OPT_THIN)) {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
467 opts->thin = !!value;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
468 return 0;
41fa7d2 @spearce Teach git-fetch to exploit server side automatic tag following
spearce authored Mar 3, 2008
469 } else if (!strcmp(name, TRANS_OPT_FOLLOWTAGS)) {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
470 opts->followtags = !!value;
41fa7d2 @spearce Teach git-fetch to exploit server side automatic tag following
spearce authored Mar 4, 2008
471 return 0;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
472 } else if (!strcmp(name, TRANS_OPT_KEEP)) {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
473 opts->keep = !!value;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
474 return 0;
475 } else if (!strcmp(name, TRANS_OPT_DEPTH)) {
476 if (!value)
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
477 opts->depth = 0;
e7622ce @pclouds Catch invalid --depth option passed to clone or fetch
pclouds authored Jan 4, 2012
478 else {
479 char *end;
480 opts->depth = strtol(value, &end, 0);
481 if (*end)
482 die("transport: invalid depth option '%s'", value);
483 }
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
484 return 0;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
485 }
486 return 1;
487 }
488
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
489 static int connect_setup(struct transport *transport, int for_push, int verbose)
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
490 {
491 struct git_transport_data *data = transport->data;
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
492
493 if (data->conn)
494 return 0;
495
5a277f3 @gitster Revert "Merge branch 'cb/maint-quiet-push' into maint"
gitster authored Sep 6, 2011
496 data->conn = git_connect(data->fd, transport->url,
497 for_push ? data->options.receivepack :
498 data->options.uploadpack,
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
499 verbose ? CONNECT_VERBOSE : 0);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
500
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
501 return 0;
502 }
503
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
504 static struct ref *get_refs_via_connect(struct transport *transport, int for_push)
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
505 {
506 struct git_transport_data *data = transport->data;
507 struct ref *refs;
508
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
509 connect_setup(transport, for_push, 0);
afe7c5f @peff drop "match" parameter from get_remote_heads
peff authored Dec 12, 2011
510 get_remote_heads(data->fd[0], &refs,
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
511 for_push ? REF_NORMAL : 0, &data->extra_have);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
512 data->got_remote_heads = 1;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
513
514 return refs;
515 }
516
1788c39 @spearce Remove pack.keep after ref updates in git-fetch
spearce authored Sep 14, 2007
517 static int fetch_refs_via_pack(struct transport *transport,
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
518 int nr_heads, struct ref **to_fetch)
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
519 {
520 struct git_transport_data *data = transport->data;
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
521 char **heads = xmalloc(nr_heads * sizeof(*heads));
e4cd6c7 @spearce Backup the array passed to fetch_pack so we can free items
spearce authored Sep 14, 2007
522 char **origh = xmalloc(nr_heads * sizeof(*origh));
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
523 const struct ref *refs;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
524 char *dest = xstrdup(transport->url);
525 struct fetch_pack_args args;
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
526 int i;
00183cb Always use the current connection's remote ref list in git protocol
Daniel Barkalow authored Feb 28, 2008
527 struct ref *refs_tmp = NULL;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
528
fa74052 @spearce Always obtain fetch-pack arguments from struct fetch_pack_args
spearce authored Sep 19, 2007
529 memset(&args, 0, sizeof(args));
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
530 args.uploadpack = data->options.uploadpack;
531 args.keep_pack = data->options.keep;
fa74052 @spearce Always obtain fetch-pack arguments from struct fetch_pack_args
spearce authored Sep 19, 2007
532 args.lock_pack = 1;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
533 args.use_thin_pack = data->options.thin;
534 args.include_tag = data->options.followtags;
bd2c86e @peff make "git push -v" actually verbose
peff authored Dec 17, 2011
535 args.verbose = (transport->verbose > 1);
fe8aa14 @tuncer Fix fetch/clone --quiet when stdout is connected
tuncer authored Oct 5, 2008
536 args.quiet = (transport->verbose < 0);
d01b3c0 @rctay transport->progress: use flag authoritatively
rctay authored Feb 24, 2010
537 args.no_progress = !transport->progress;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
538 args.depth = data->options.depth;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
539
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
540 for (i = 0; i < nr_heads; i++)
e4cd6c7 @spearce Backup the array passed to fetch_pack so we can free items
spearce authored Sep 14, 2007
541 origh[i] = heads[i] = xstrdup(to_fetch[i]->name);
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
542
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
543 if (!data->got_remote_heads) {
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
544 connect_setup(transport, 0, 0);
afe7c5f @peff drop "match" parameter from get_remote_heads
peff authored Dec 13, 2011
545 get_remote_heads(data->fd[0], &refs_tmp, 0, NULL);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
546 data->got_remote_heads = 1;
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
547 }
548
00183cb Always use the current connection's remote ref list in git protocol
Daniel Barkalow authored Feb 28, 2008
549 refs = fetch_pack(&args, data->fd, data->conn,
550 refs_tmp ? refs_tmp : transport->remote_refs,
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
551 dest, nr_heads, heads, &transport->pack_lockfile);
552 close(data->fd[0]);
553 close(data->fd[1]);
554 if (finish_connect(data->conn))
555 refs = NULL;
556 data->conn = NULL;
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
557 data->got_remote_heads = 0;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
558
00183cb Always use the current connection's remote ref list in git protocol
Daniel Barkalow authored Feb 28, 2008
559 free_refs(refs_tmp);
560
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
561 for (i = 0; i < nr_heads; i++)
e4cd6c7 @spearce Backup the array passed to fetch_pack so we can free items
spearce authored Sep 14, 2007
562 free(origh[i]);
563 free(origh);
564 free(heads);
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
565 free(dest);
c6bc400 @gitster do not discard status in fetch_refs_via_pack()
gitster authored Dec 4, 2007
566 return (refs ? 0 : -1);
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
567 }
568
481c7a6 @peff transport: don't show push status if --quiet is given
peff authored Aug 5, 2009
569 static int push_had_errors(struct ref *ref)
570 {
571 for (; ref; ref = ref->next) {
572 switch (ref->status) {
573 case REF_STATUS_NONE:
574 case REF_STATUS_UPTODATE:
575 case REF_STATUS_OK:
576 break;
577 default:
578 return 1;
579 }
580 }
581 return 0;
582 }
583
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
584 int transport_refs_pushed(struct ref *ref)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
585 {
586 for (; ref; ref = ref->next) {
587 switch(ref->status) {
588 case REF_STATUS_NONE:
589 case REF_STATUS_UPTODATE:
590 break;
591 default:
592 return 1;
593 }
594 }
595 return 0;
596 }
597
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
598 void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int verbose)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
599 {
600 struct refspec rs;
601
602 if (ref->status != REF_STATUS_OK && ref->status != REF_STATUS_UPTODATE)
603 return;
604
605 rs.src = ref->name;
606 rs.dst = NULL;
607
608 if (!remote_find_tracking(remote, &rs)) {
609 if (verbose)
610 fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
611 if (ref->deletion) {
612 delete_ref(rs.dst, NULL, 0);
613 } else
614 update_ref("update by push", rs.dst,
615 ref->new_sha1, NULL, 0, 0);
616 free(rs.dst);
617 }
618 }
619
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 22, 2009
620 static void print_ref_status(char flag, const char *summary, struct ref *to, struct ref *from, const char *msg, int porcelain)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
621 {
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
622 if (porcelain) {
623 if (from)
624 fprintf(stdout, "%c\t%s:%s\t", flag, from->name, to->name);
625 else
626 fprintf(stdout, "%c\t:%s\t", flag, to->name);
627 if (msg)
628 fprintf(stdout, "%s (%s)\n", summary, msg);
629 else
630 fprintf(stdout, "%s\n", summary);
631 } else {
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
632 fprintf(stderr, " %c %-*s ", flag, TRANSPORT_SUMMARY_WIDTH, summary);
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
633 if (from)
634 fprintf(stderr, "%s -> %s", prettify_refname(from->name), prettify_refname(to->name));
635 else
636 fputs(prettify_refname(to->name), stderr);
637 if (msg) {
638 fputs(" (", stderr);
639 fputs(msg, stderr);
640 fputc(')', stderr);
641 }
642 fputc('\n', stderr);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
643 }
644 }
645
646 static const char *status_abbrev(unsigned char sha1[20])
647 {
648 return find_unique_abbrev(sha1, DEFAULT_ABBREV);
649 }
650
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
651 static void print_ok_ref_status(struct ref *ref, int porcelain)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
652 {
653 if (ref->deletion)
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
654 print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
655 else if (is_null_sha1(ref->old_sha1))
656 print_ref_status('*',
657 (!prefixcmp(ref->name, "refs/tags/") ? "[new tag]" :
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
658 "[new branch]"),
659 ref, ref->peer_ref, NULL, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
660 else {
661 char quickref[84];
662 char type;
663 const char *msg;
664
665 strcpy(quickref, status_abbrev(ref->old_sha1));
666 if (ref->nonfastforward) {
667 strcat(quickref, "...");
668 type = '+';
669 msg = "forced update";
670 } else {
671 strcat(quickref, "..");
672 type = ' ';
673 msg = NULL;
674 }
675 strcat(quickref, status_abbrev(ref->new_sha1));
676
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
677 print_ref_status(type, quickref, ref, ref->peer_ref, msg, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
678 }
679 }
680
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
681 static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
682 {
683 if (!count)
60cfeb8 @smoofra git-push: send "To <remoteurl>" messages to the standard output in --…
smoofra authored Feb 26, 2010
684 fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
685
686 switch(ref->status) {
687 case REF_STATUS_NONE:
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
688 print_ref_status('X', "[no match]", ref, NULL, NULL, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
689 break;
690 case REF_STATUS_REJECT_NODELETE:
691 print_ref_status('!', "[rejected]", ref, NULL,
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
692 "remote does not support deleting refs", porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
693 break;
694 case REF_STATUS_UPTODATE:
695 print_ref_status('=', "[up to date]", ref,
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
696 ref->peer_ref, NULL, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
697 break;
698 case REF_STATUS_REJECT_NONFASTFORWARD:
699 print_ref_status('!', "[rejected]", ref, ref->peer_ref,
a75d7b5 @felipec Use 'fast-forward' all over the place
felipec authored Oct 24, 2009
700 "non-fast-forward", porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
701 break;
702 case REF_STATUS_REMOTE_REJECT:
703 print_ref_status('!', "[remote rejected]", ref,
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
704 ref->deletion ? NULL : ref->peer_ref,
705 ref->remote_status, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
706 break;
707 case REF_STATUS_EXPECTING_REPORT:
708 print_ref_status('!', "[remote failure]", ref,
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
709 ref->deletion ? NULL : ref->peer_ref,
710 "remote failed to report status", porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
711 break;
712 case REF_STATUS_OK:
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
713 print_ok_ref_status(ref, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
714 break;
715 }
716
717 return 1;
718 }
719
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
720 void transport_print_push_status(const char *dest, struct ref *refs,
721 int verbose, int porcelain, int *nonfastforward)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
722 {
723 struct ref *ref;
724 int n = 0;
f25950f @ctiwald push: Provide situational hints for non-fast-forward errors
ctiwald authored Mar 20, 2012
725 unsigned char head_sha1[20];
726 char *head;
727
728 head = resolve_refdup("HEAD", head_sha1, 1, NULL);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
729
730 if (verbose) {
731 for (ref = refs; ref; ref = ref->next)
732 if (ref->status == REF_STATUS_UPTODATE)
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
733 n += print_one_push_status(ref, dest, n, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
734 }
735
736 for (ref = refs; ref; ref = ref->next)
737 if (ref->status == REF_STATUS_OK)
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
738 n += print_one_push_status(ref, dest, n, porcelain);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
739
07436e4 @moy push: point to 'git pull' and 'git push --force' in case of non-fast …
moy authored Aug 8, 2009
740 *nonfastforward = 0;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
741 for (ref = refs; ref; ref = ref->next) {
742 if (ref->status != REF_STATUS_NONE &&
743 ref->status != REF_STATUS_UPTODATE &&
744 ref->status != REF_STATUS_OK)
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
745 n += print_one_push_status(ref, dest, n, porcelain);
f25950f @ctiwald push: Provide situational hints for non-fast-forward errors
ctiwald authored Mar 20, 2012
746 if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD &&
747 *nonfastforward != NON_FF_HEAD) {
748 if (!strcmp(head, ref->name))
749 *nonfastforward = NON_FF_HEAD;
750 else
751 *nonfastforward = NON_FF_OTHER;
752 }
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
753 }
754 }
755
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
756 void transport_verify_remote_names(int nr_heads, const char **heads)
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
757 {
758 int i;
759
760 for (i = 0; i < nr_heads; i++) {
761 const char *local = heads[i];
762 const char *remote = strrchr(heads[i], ':');
763
764 if (*local == '+')
765 local++;
766
767 /* A matching refspec is okay. */
768 if (remote == local && remote[1] == '\0')
769 continue;
770
771 remote = remote ? (remote + 1) : local;
8d9c501 @mhagger Change check_ref_format() to take a flags argument
mhagger authored Sep 15, 2011
772 if (check_refname_format(remote,
773 REFNAME_ALLOW_ONELEVEL|REFNAME_REFSPEC_PATTERN))
774 die("remote part of refspec is not a valid name in %s",
775 heads[i]);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
776 }
777 }
778
779 static int git_transport_push(struct transport *transport, struct ref *remote_refs, int flags)
f3fa183 @gitster Style: place opening brace of a function definition at column 1
gitster authored Nov 8, 2007
780 {
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
781 struct git_transport_data *data = transport->data;
40cb4fa Use built-in send-pack.
Daniel Barkalow authored Oct 30, 2007
782 struct send_pack_args args;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
783 int ret;
784
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
785 if (!data->got_remote_heads) {
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
786 struct ref *tmp_refs;
787 connect_setup(transport, 1, 0);
788
afe7c5f @peff drop "match" parameter from get_remote_heads
peff authored Dec 13, 2011
789 get_remote_heads(data->fd[0], &tmp_refs, REF_NORMAL, NULL);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
790 data->got_remote_heads = 1;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
791 }
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
792
de1a2fd @spearce Smart push over HTTP: client side
spearce authored Oct 30, 2009
793 memset(&args, 0, sizeof(args));
94c89ba @awhitcroft git-push: plumb in --mirror mode
awhitcroft authored Nov 9, 2007
794 args.send_mirror = !!(flags & TRANSPORT_PUSH_MIRROR);
40cb4fa Use built-in send-pack.
Daniel Barkalow authored Oct 30, 2007
795 args.force_update = !!(flags & TRANSPORT_PUSH_FORCE);
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
796 args.use_thin_pack = data->options.thin;
8afd8dc @rctay push: support multiple levels of verbosity
rctay authored Feb 24, 2010
797 args.verbose = (transport->verbose > 0);
798 args.quiet = (transport->verbose < 0);
d7c411b @peff push: pass --progress down to git-pack-objects
peff authored Oct 17, 2010
799 args.progress = transport->progress;
40cb4fa Use built-in send-pack.
Daniel Barkalow authored Oct 30, 2007
800 args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 26, 2010
801 args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
40cb4fa Use built-in send-pack.
Daniel Barkalow authored Oct 30, 2007
802
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
803 ret = send_pack(&args, data->fd, data->conn, remote_refs,
804 &data->extra_have);
805
806 close(data->fd[1]);
807 close(data->fd[0]);
808 ret |= finish_connect(data->conn);
809 data->conn = NULL;
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
810 data->got_remote_heads = 0;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
811
812 return ret;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
813 }
814
b236752 Support remote archive from all smart transports
Ilari Liusvaara authored Dec 9, 2009
815 static int connect_git(struct transport *transport, const char *name,
816 const char *executable, int fd[2])
817 {
818 struct git_transport_data *data = transport->data;
819 data->conn = git_connect(data->fd, transport->url,
820 executable, 0);
821 fd[0] = data->fd[0];
822 fd[1] = data->fd[1];
823 return 0;
824 }
825
f4e9576 @spearce Fix memory leaks when disconnecting transport instances
spearce authored Sep 19, 2007
826 static int disconnect_git(struct transport *transport)
827 {
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
828 struct git_transport_data *data = transport->data;
829 if (data->conn) {
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
830 if (data->got_remote_heads)
831 packet_flush(data->fd[1]);
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
832 close(data->fd[0]);
833 close(data->fd[1]);
834 finish_connect(data->conn);
835 }
836
837 free(data);
f4e9576 @spearce Fix memory leaks when disconnecting transport instances
spearce authored Sep 19, 2007
838 return 0;
839 }
840
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
841 void transport_take_over(struct transport *transport,
842 struct child_process *child)
843 {
844 struct git_transport_data *data;
845
846 if (!transport->smart_options)
847 die("Bug detected: Taking over transport requires non-NULL "
848 "smart_options field.");
849
850 data = xcalloc(1, sizeof(*data));
851 data->options = *transport->smart_options;
852 data->conn = child;
853 data->fd[0] = data->conn->out;
854 data->fd[1] = data->conn->in;
855 data->got_remote_heads = 0;
856 transport->data = data;
857
858 transport->set_option = NULL;
859 transport->get_refs_list = get_refs_via_connect;
860 transport->fetch = fetch_refs_via_pack;
861 transport->push = NULL;
862 transport->push_refs = git_transport_push;
863 transport->disconnect = disconnect_git;
864 transport->smart_options = &(data->options);
865 }
866
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
867 static int is_local(const char *url)
868 {
869 const char *colon = strchr(url, ':');
870 const char *slash = strchr(url, '/');
be50181 Windows: Disambiguate DOS style paths from SSH URLs.
Johannes Sixt authored Nov 30, 2007
871 return !colon || (slash && slash < colon) ||
872 has_dos_drive_prefix(url);
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
873 }
874
875 static int is_file(const char *url)
876 {
877 struct stat buf;
878 if (stat(url, &buf))
879 return 0;
880 return S_ISREG(buf.st_mode);
881 }
882
25d5cc4 Pass unknown protocols to external protocol handlers
Ilari Liusvaara authored Dec 9, 2009
883 static int external_specification_len(const char *url)
884 {
885 return strchr(url, ':') - url;
886 }
887
e5f4e21 @spearce Remove unnecessary 'fetch' argument from transport_get API
spearce authored Sep 15, 2007
888 struct transport *transport_get(struct remote *remote, const char *url)
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
889 {
4da5046 Fix remote.<remote>.vcs
Ilari Liusvaara authored Jan 27, 2010
890 const char *helper;
8eb554a @spearce Cleanup duplicate initialization code in transport_get
spearce authored Sep 15, 2007
891 struct transport *ret = xcalloc(1, sizeof(*ret));
892
d01b3c0 @rctay transport->progress: use flag authoritatively
rctay authored Feb 24, 2010
893 ret->progress = isatty(2);
894
c1d45cf Require a struct remote in transport_get()
Daniel Barkalow authored Nov 3, 2009
895 if (!remote)
896 die("No remote provided to transport_get()");
897
b0d66e1 @rctay transport: add got_remote_refs flag
rctay authored Feb 16, 2010
898 ret->got_remote_refs = 0;
8eb554a @spearce Cleanup duplicate initialization code in transport_get
spearce authored Sep 15, 2007
899 ret->remote = remote;
4da5046 Fix remote.<remote>.vcs
Ilari Liusvaara authored Jan 27, 2010
900 helper = remote->foreign_vcs;
fb0cc87 Allow programs to not depend on remotes having urls
Daniel Barkalow authored Nov 18, 2009
901
cb21d8f @gitster transport_get(): drop unnecessary check for !remote
gitster authored Jan 27, 2010
902 if (!url && remote->url)
fb0cc87 Allow programs to not depend on remotes having urls
Daniel Barkalow authored Nov 18, 2009
903 url = remote->url[0];
8eb554a @spearce Cleanup duplicate initialization code in transport_get
spearce authored Sep 15, 2007
904 ret->url = url;
905
8742243 @dscho Allow specifying the remote helper in the url
dscho authored Nov 18, 2009
906 /* maybe it is a foreign URL? */
907 if (url) {
908 const char *p = url;
909
638794c @peff make url-related functions reusable
peff authored May 23, 2010
910 while (is_urlschemechar(p == url, *p))
8742243 @dscho Allow specifying the remote helper in the url
dscho authored Nov 18, 2009
911 p++;
912 if (!prefixcmp(p, "::"))
4da5046 Fix remote.<remote>.vcs
Ilari Liusvaara authored Jan 27, 2010
913 helper = xstrndup(url, p - url);
8742243 @dscho Allow specifying the remote helper in the url
dscho authored Nov 18, 2009
914 }
915
4da5046 Fix remote.<remote>.vcs
Ilari Liusvaara authored Jan 27, 2010
916 if (helper) {
917 transport_helper_init(ret, helper);
25d5cc4 Pass unknown protocols to external protocol handlers
Ilari Liusvaara authored Dec 9, 2009
918 } else if (!prefixcmp(url, "rsync:")) {
cd547b4 @dscho fetch/push: readd rsync support
dscho authored Sep 30, 2007
919 ret->get_refs_list = get_refs_via_rsync;
920 ret->fetch = fetch_objs_via_rsync;
921 ret->push = rsync_transport_push;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
922 ret->smart_options = NULL;
2727b71 @gitster bundle: add parse_bundle_header() helper function
gitster authored Oct 13, 2011
923 } else if (is_local(url) && is_file(url) && is_bundle(url, 1)) {
c7a8a16 @dscho Add bundle transport
dscho authored Sep 11, 2007
924 struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
925 ret->data = data;
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
926 ret->get_refs_list = get_refs_from_bundle;
927 ret->fetch = fetch_refs_from_bundle;
928 ret->disconnect = close_bundle;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
929 ret->smart_options = NULL;
25d5cc4 Pass unknown protocols to external protocol handlers
Ilari Liusvaara authored Dec 9, 2009
930 } else if (!is_url(url)
931 || !prefixcmp(url, "file://")
932 || !prefixcmp(url, "git://")
933 || !prefixcmp(url, "ssh://")
934 || !prefixcmp(url, "git+ssh://")
935 || !prefixcmp(url, "ssh+git://")) {
936 /* These are builtin smart transports. */
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
937 struct git_transport_data *data = xcalloc(1, sizeof(*data));
938 ret->data = data;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
939 ret->set_option = NULL;
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
940 ret->get_refs_list = get_refs_via_connect;
941 ret->fetch = fetch_refs_via_pack;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
942 ret->push_refs = git_transport_push;
b236752 Support remote archive from all smart transports
Ilari Liusvaara authored Dec 9, 2009
943 ret->connect = connect_git;
f4e9576 @spearce Fix memory leaks when disconnecting transport instances
spearce authored Sep 19, 2007
944 ret->disconnect = disconnect_git;
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
945 ret->smart_options = &(data->options);
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
946
ba22785 Reduce the number of connects when fetching
Daniel Barkalow authored Feb 4, 2008
947 data->conn = NULL;
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
948 data->got_remote_heads = 0;
25d5cc4 Pass unknown protocols to external protocol handlers
Ilari Liusvaara authored Dec 9, 2009
949 } else {
950 /* Unknown protocol in URL. Pass to external handler. */
951 int len = external_specification_len(url);
952 char *handler = xmalloc(len + 1);
953 handler[len] = 0;
954 strncpy(handler, url, len);
955 transport_helper_init(ret, handler);
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
956 }
8eb554a @spearce Cleanup duplicate initialization code in transport_get
spearce authored Sep 15, 2007
957
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
958 if (ret->smart_options) {
959 ret->smart_options->thin = 1;
960 ret->smart_options->uploadpack = "git-upload-pack";
961 if (remote->uploadpack)
962 ret->smart_options->uploadpack = remote->uploadpack;
963 ret->smart_options->receivepack = "git-receive-pack";
964 if (remote->receivepack)
965 ret->smart_options->receivepack = remote->receivepack;
966 }
967
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
968 return ret;
969 }
970
971 int transport_set_option(struct transport *transport,
972 const char *name, const char *value)
973 {
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
974 int git_reports = 1, protocol_reports = 1;
975
976 if (transport->smart_options)
977 git_reports = set_git_option(transport->smart_options,
978 name, value);
979
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
980 if (transport->set_option)
aa5af97 Refactor git transport options parsing
Ilari Liusvaara authored Dec 9, 2009
981 protocol_reports = transport->set_option(transport, name,
982 value);
983
984 /* If either report is 0, report 0 (success). */
985 if (!git_reports || !protocol_reports)
986 return 0;
987 /* If either reports -1 (invalid value), report -1. */
988 if ((git_reports == -1) || (protocol_reports == -1))
989 return -1;
990 /* Otherwise if both report unknown, report unknown. */
ab865e6 @spearce Avoid printing unnecessary warnings during fetch and push
spearce authored Sep 18, 2007
991 return 1;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
992 }
993
d01b3c0 @rctay transport->progress: use flag authoritatively
rctay authored Feb 24, 2010
994 void transport_set_verbosity(struct transport *transport, int verbosity,
995 int force_progress)
bde873c @rctay fetch: refactor verbosity option handling into transport.[ch]
rctay authored Feb 24, 2010
996 {
bd2c86e @peff make "git push -v" actually verbose
peff authored Dec 17, 2011
997 if (verbosity >= 1)
bde873c @rctay fetch: refactor verbosity option handling into transport.[ch]
rctay authored Feb 24, 2010
998 transport->verbose = verbosity <= 3 ? verbosity : 3;
999 if (verbosity < 0)
1000 transport->verbose = -1;
d01b3c0 @rctay transport->progress: use flag authoritatively
rctay authored Feb 24, 2010
1001
1002 /**
1003 * Rules used to determine whether to report progress (processing aborts
1004 * when a rule is satisfied):
1005 *
01fdc21 @drizzd push/fetch/clone --no-progress suppresses progress output
drizzd authored Feb 13, 2012
1006 * . Report progress, if force_progress is 1 (ie. --progress).
1007 * . Don't report progress, if force_progress is 0 (ie. --no-progress).
1008 * . Don't report progress, if verbosity < 0 (ie. -q/--quiet ).
1009 * . Report progress if isatty(2) is 1.
d01b3c0 @rctay transport->progress: use flag authoritatively
rctay authored Feb 24, 2010
1010 **/
01fdc21 @drizzd push/fetch/clone --no-progress suppresses progress output
drizzd authored Feb 13, 2012
1011 if (force_progress >= 0)
1012 transport->progress = !!force_progress;
1013 else
1014 transport->progress = verbosity >= 0 && isatty(2);
bde873c @rctay fetch: refactor verbosity option handling into transport.[ch]
rctay authored Feb 24, 2010
1015 }
1016
a762e51 Refactor submodule push check to use string list instead of integer
Heiko Voigt authored Mar 29, 2012
1017 static void die_with_unpushed_submodules(struct string_list *needs_pushing)
1018 {
1019 int i;
1020
1021 fprintf(stderr, "The following submodule paths contain changes that can\n"
1022 "not be found on any remote:\n");
1023 for (i = 0; i < needs_pushing->nr; i++)
1024 printf(" %s\n", needs_pushing->items[i].string);
eb21c73 push: teach --recurse-submodules the on-demand option
Heiko Voigt authored Mar 29, 2012
1025 fprintf(stderr, "\nPlease try\n\n"
1026 " git push --recurse-submodules=on-demand\n\n"
1027 "or cd to the path and use\n\n"
1028 " git push\n\n"
1029 "to push them to a remote.\n\n");
a762e51 Refactor submodule push check to use string list instead of integer
Heiko Voigt authored Mar 29, 2012
1030
1031 string_list_clear(needs_pushing, 0);
1032
1033 die("Aborting.");
1034 }
1035
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
1036 int transport_push(struct transport *transport,
07436e4 @moy push: point to 'git pull' and 'git push --force' in case of non-fast …
moy authored Aug 8, 2009
1037 int refspec_nr, const char **refspec, int flags,
bb8cccd @moy push: Correctly initialize nonfastforward in transport_push.
moy authored Sep 20, 2009
1038 int *nonfastforward)
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
1039 {
bb8cccd @moy push: Correctly initialize nonfastforward in transport_push.
moy authored Sep 20, 2009
1040 *nonfastforward = 0;
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
1041 transport_verify_remote_names(refspec_nr, refspec);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1042
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
1043 if (transport->push) {
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
1044 /* Maybe FIXME. But no important transport uses this case. */
1045 if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
1046 die("This transport does not support using --set-upstream");
1047
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1048 return transport->push(transport, refspec_nr, refspec, flags);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
1049 } else if (transport->push_refs) {
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1050 struct ref *remote_refs =
1051 transport->get_refs_list(transport, 1);
1052 struct ref *local_refs = get_local_heads();
1053 int match_flags = MATCH_REFS_NONE;
8afd8dc @rctay push: support multiple levels of verbosity
rctay authored Feb 24, 2010
1054 int verbose = (transport->verbose > 0);
1055 int quiet = (transport->verbose < 0);
1965ff7 @smoofra add --porcelain option to git-push
smoofra authored Jun 23, 2009
1056 int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
1057 int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 27, 2010
1058 int push_ret, ret, err;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1059
1060 if (flags & TRANSPORT_PUSH_ALL)
1061 match_flags |= MATCH_REFS_ALL;
1062 if (flags & TRANSPORT_PUSH_MIRROR)
1063 match_flags |= MATCH_REFS_MIRROR;
6ddba5e @felipec push: add '--prune' option
felipec authored Feb 23, 2012
1064 if (flags & TRANSPORT_PUSH_PRUNE)
1065 match_flags |= MATCH_REFS_PRUNE;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1066
29753cd @gitster rename "match_refs()" to "match_push_refs()"
gitster authored Sep 9, 2011
1067 if (match_push_refs(local_refs, &remote_refs,
1068 refspec_nr, refspec, match_flags)) {
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1069 return -1;
1070 }
1071
20e8b46 @rctay refactor ref status logic for pushing
rctay authored Jan 8, 2010
1072 set_ref_status_for_push(remote_refs,
1073 flags & TRANSPORT_PUSH_MIRROR,
1074 flags & TRANSPORT_PUSH_FORCE);
1075
eb21c73 push: teach --recurse-submodules the on-demand option
Heiko Voigt authored Mar 29, 2012
1076 if ((flags & TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND) && !is_bare_repository()) {
d2b17b3 @iveqy push: Don't push a repository with unpushed submodules
iveqy authored Aug 19, 2011
1077 struct ref *ref = remote_refs;
1078 for (; ref; ref = ref->next)
1079 if (!is_null_sha1(ref->new_sha1) &&
eb21c73 push: teach --recurse-submodules the on-demand option
Heiko Voigt authored Mar 29, 2012
1080 !push_unpushed_submodules(ref->new_sha1,
1081 transport->remote->name))
1082 die ("Failed to push all needed submodules!");
1083 }
1084
1085 if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
1086 TRANSPORT_RECURSE_SUBMODULES_CHECK)) && !is_bare_repository()) {
d2b17b3 @iveqy push: Don't push a repository with unpushed submodules
iveqy authored Aug 19, 2011
1087 struct ref *ref = remote_refs;
a762e51 Refactor submodule push check to use string list instead of integer
Heiko Voigt authored Mar 29, 2012
1088 struct string_list needs_pushing;
1089
1090 memset(&needs_pushing, 0, sizeof(struct string_list));
1091 needs_pushing.strdup_strings = 1;
d2b17b3 @iveqy push: Don't push a repository with unpushed submodules
iveqy authored Aug 19, 2011
1092 for (; ref; ref = ref->next)
1093 if (!is_null_sha1(ref->new_sha1) &&
a762e51 Refactor submodule push check to use string list instead of integer
Heiko Voigt authored Mar 29, 2012
1094 find_unpushed_submodules(ref->new_sha1,
1095 transport->remote->name, &needs_pushing))
1096 die_with_unpushed_submodules(&needs_pushing);
d2b17b3 @iveqy push: Don't push a repository with unpushed submodules
iveqy authored Aug 19, 2011
1097 }
1098
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 27, 2010
1099 push_ret = transport->push_refs(transport, remote_refs, flags);
4232826 @rctay transport.c::transport_push(): make ref status affect return value
rctay authored Jan 8, 2010
1100 err = push_had_errors(remote_refs);
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 27, 2010
1101 ret = push_ret | err;
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1102
4232826 @rctay transport.c::transport_push(): make ref status affect return value
rctay authored Jan 8, 2010
1103 if (!quiet || err)
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
1104 transport_print_push_status(transport->url, remote_refs,
6ffd781 @gitster Merge branch 'maint'
gitster authored Aug 12, 2009
1105 verbose | porcelain, porcelain,
1106 nonfastforward);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1107
e9fcd1e Add push --set-upstream
Ilari Liusvaara authored Jan 16, 2010
1108 if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
1109 set_upstreams(transport, remote_refs, pretend);
1110
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1111 if (!(flags & TRANSPORT_PUSH_DRY_RUN)) {
1112 struct ref *ref;
1113 for (ref = remote_refs; ref; ref = ref->next)
f1863d0 @michaellukashov refactor duplicated code in builtin-send-pack.c and transport.c
michaellukashov authored Feb 16, 2010
1114 transport_update_tracking_ref(transport->remote, ref, verbose);
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1115 }
1116
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 27, 2010
1117 if (porcelain && !push_ret)
1118 puts("Done");
66bce02 @gitster Merge branch 'ld/push-porcelain'
gitster authored Mar 15, 2010
1119 else if (!quiet && !ret && !transport_refs_pushed(remote_refs))
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1120 fprintf(stderr, "Everything up-to-date\n");
7755585 @smoofra git-push: make git push --porcelain print "Done"
smoofra authored Feb 27, 2010
1121
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1122 return ret;
1123 }
1124 return 1;
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
1125 }
1126
4577370 Miscellaneous const changes and utilities
Daniel Barkalow authored Oct 29, 2007
1127 const struct ref *transport_get_remote_refs(struct transport *transport)
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1128 {
b0d66e1 @rctay transport: add got_remote_refs flag
rctay authored Feb 16, 2010
1129 if (!transport->got_remote_refs) {
64fcef2 Move push matching and reporting logic into transport.c
Daniel Barkalow authored Mar 9, 2009
1130 transport->remote_refs = transport->get_refs_list(transport, 0);
b0d66e1 @rctay transport: add got_remote_refs flag
rctay authored Feb 16, 2010
1131 transport->got_remote_refs = 1;
1132 }
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
1133
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1134 return transport->remote_refs;
1135 }
1136
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
1137 int transport_fetch_refs(struct transport *transport, struct ref *refs)
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1138 {
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
1139 int rc;
8638682 fix simple deepening of a repo
Nicolas Pitre authored Aug 24, 2009
1140 int nr_heads = 0, nr_alloc = 0, nr_refs = 0;
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
1141 struct ref **heads = NULL;
1142 struct ref *rm;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1143
1144 for (rm = refs; rm; rm = rm->next) {
8638682 fix simple deepening of a repo
Nicolas Pitre authored Aug 24, 2009
1145 nr_refs++;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1146 if (rm->peer_ref &&
3714831 Allow fetch to modify refs
Daniel Barkalow authored Nov 18, 2009
1147 !is_null_sha1(rm->old_sha1) &&
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1148 !hashcmp(rm->peer_ref->old_sha1, rm->old_sha1))
1149 continue;
7a2bff4 @spearce Replace custom memory growth allocator with ALLOC_GROW
spearce authored Sep 14, 2007
1150 ALLOC_GROW(heads, nr_heads + 1, nr_alloc);
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
1151 heads[nr_heads++] = rm;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1152 }
1153
8638682 fix simple deepening of a repo
Nicolas Pitre authored Aug 24, 2009
1154 if (!nr_heads) {
1155 /*
1156 * When deepening of a shallow repository is requested,
1157 * then local and remote refs are likely to still be equal.
1158 * Just feed them all to the fetch method in that case.
1159 * This condition shouldn't be met in a non-deepening fetch
1160 * (see builtin-fetch.c:quickfetch()).
1161 */
1162 heads = xmalloc(nr_refs * sizeof(*heads));
1163 for (rm = refs; rm; rm = rm->next)
1164 heads[nr_heads++] = rm;
1165 }
1166
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
1167 rc = transport->fetch(transport, nr_heads, heads);
61b075b Support taking over transports
Ilari Liusvaara authored Dec 9, 2009
1168
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1169 free(heads);
425b139 @spearce Simplify fetch transport API to just one function
spearce authored Sep 14, 2007
1170 return rc;
c29727d Add fetch methods to transport library.
Daniel Barkalow authored Sep 11, 2007
1171 }
1172
1788c39 @spearce Remove pack.keep after ref updates in git-fetch
spearce authored Sep 14, 2007
1173 void transport_unlock_pack(struct transport *transport)
1174 {
1175 if (transport->pack_lockfile) {
691f1a2 @raalkml replace direct calls to unlink(2) with unlink_or_warn
raalkml authored Apr 29, 2009
1176 unlink_or_warn(transport->pack_lockfile);
1788c39 @spearce Remove pack.keep after ref updates in git-fetch
spearce authored Sep 14, 2007
1177 free(transport->pack_lockfile);
1178 transport->pack_lockfile = NULL;
1179 }
1180 }
1181
b236752 Support remote archive from all smart transports
Ilari Liusvaara authored Dec 9, 2009
1182 int transport_connect(struct transport *transport, const char *name,
1183 const char *exec, int fd[2])
1184 {
1185 if (transport->connect)
1186 return transport->connect(transport, name, exec, fd);
1187 else
1188 die("Operation not supported by protocol");
1189 }
1190
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
1191 int transport_disconnect(struct transport *transport)
1192 {
1193 int ret = 0;
824d577 @spearce Refactor struct transport_ops inlined into struct transport
spearce authored Sep 19, 2007
1194 if (transport->disconnect)
1195 ret = transport->disconnect(transport);
9b28851 Push code for transport library
Daniel Barkalow authored Sep 11, 2007
1196 free(transport);
1197 return ret;
1198 }
47abd85 @ageric fetch: Strip usernames from url's before storing them
ageric authored Apr 17, 2009
1199
1200 /*
a7793a7 @meyering correct spelling: an URL -> a URL
meyering authored Mar 28, 2012
1201 * Strip username (and password) from a URL and return
47abd85 @ageric fetch: Strip usernames from url's before storing them
ageric authored Apr 17, 2009
1202 * it in a newly allocated string.
1203 */
1204 char *transport_anonymize_url(const char *url)
1205 {
1206 char *anon_url, *scheme_prefix, *anon_part;
1207 size_t anon_len, prefix_len = 0;
1208
1209 anon_part = strchr(url, '@');
1210 if (is_local(url) || !anon_part)
1211 goto literal_copy;
1212
1213 anon_len = strlen(++anon_part);
1214 scheme_prefix = strstr(url, "://");
1215 if (!scheme_prefix) {
1216 if (!strchr(anon_part, ':'))
1217 /* cannot be "me@there:/path/name" */
1218 goto literal_copy;
1219 } else {
1220 const char *cp;
1221 /* make sure scheme is reasonable */
1222 for (cp = url; cp < scheme_prefix; cp++) {
1223 switch (*cp) {
1224 /* RFC 1738 2.1 */
1225 case '+': case '.': case '-':
1226 break; /* ok */
1227 default:
1228 if (isalnum(*cp))
1229 break;
1230 /* it isn't */
1231 goto literal_copy;
1232 }
1233 }
1234 /* @ past the first slash does not count */
1235 cp = strchr(scheme_prefix + 3, '/');
1236 if (cp && cp < anon_part)
1237 goto literal_copy;
1238 prefix_len = scheme_prefix - url + 3;
1239 }
1240 anon_url = xcalloc(1, 1 + prefix_len + anon_len);
1241 memcpy(anon_url, url, prefix_len);
1242 memcpy(anon_url + prefix_len, anon_part, anon_len);
1243 return anon_url;
1244 literal_copy:
1245 return xstrdup(url);
1246 }
36cfda1 @gitster refs_from_alternate: helper to use refs from alternates
gitster authored Mar 11, 2011
1247
114a6a8 @peff refactor refs_from_alternate_cb to allow passing extra data
peff authored May 19, 2011
1248 struct alternate_refs_data {
1249 alternate_ref_fn *fn;
1250 void *data;
1251 };
1252
1253 static int refs_from_alternate_cb(struct alternate_object_database *e,
1254 void *data)
36cfda1 @gitster refs_from_alternate: helper to use refs from alternates
gitster authored Mar 11, 2011
1255 {
1256 char *other;
1257 size_t len;
1258 struct remote *remote;
1259 struct transport *transport;
1260 const struct ref *extra;
114a6a8 @peff refactor refs_from_alternate_cb to allow passing extra data
peff authored May 19, 2011
1261 struct alternate_refs_data *cb = data;
36cfda1 @gitster refs_from_alternate: helper to use refs from alternates
gitster authored Mar 11, 2011
1262
1263 e->name[-1] = '\0';
91b3c7c @gitster Merge branch 'jc/maint-fetch-alt'
gitster authored Mar 22, 2011
1264 other = xstrdup(real_path(e->base));
36cfda1 @gitster refs_from_alternate: helper to use refs from alternates
gitster authored Mar 11, 2011
1265 e->name[-1] = '/';
1266 len = strlen(other);
1267
1268 while (other[len-1] == '/')
1269 other[--len] = '\0';
1270 if (len < 8 || memcmp(other + len - 8, "/objects", 8))
1271 return 0;
1272 /* Is this a git repository with refs? */
1273 memcpy(other + len - 8, "/refs", 6);
1274 if (!is_directory(other))
1275 return 0;
1276 other[len - 8] = '\0';
1277 remote = remote_get(other);
1278 transport = transport_get(remote, other);
1279 for (extra = transport_get_remote_refs(transport);
1280 extra;
1281 extra = extra->next)
114a6a8 @peff refactor refs_from_alternate_cb to allow passing extra data
peff authored May 19, 2011
1282 cb->fn(extra, cb->data);
36cfda1 @gitster refs_from_alternate: helper to use refs from alternates
gitster authored Mar 11, 2011
1283 transport_disconnect(transport);
1284 free(other);
1285 return 0;
1286 }
114a6a8 @peff refactor refs_from_alternate_cb to allow passing extra data
peff authored May 19, 2011
1287
1288 void for_each_alternate_ref(alternate_ref_fn fn, void *data)
1289 {
1290 struct alternate_refs_data cb;
1291 cb.fn = fn;
1292 cb.data = data;
1293 foreach_alt_odb(refs_from_alternate_cb, &cb);
1294 }
Something went wrong with that request. Please try again.