Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 444 lines (394 sloc) 11.338 kb
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
1 #include "cache.h"
2 #include "bundle.h"
3 #include "object.h"
4 #include "commit.h"
5 #include "diff.h"
6 #include "revision.h"
7 #include "list-objects.h"
8 #include "run-command.h"
fa30383 Junio C Hamano Merge branch 'maint'
authored
9 #include "refs.h"
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
10
11 static const char bundle_signature[] = "# v2 git bundle\n";
12
13 static void add_to_ref_list(const unsigned char *sha1, const char *name,
14 struct ref_list *list)
15 {
16 if (list->nr + 1 >= list->alloc) {
17 list->alloc = alloc_nr(list->nr + 1);
18 list->list = xrealloc(list->list,
19 list->alloc * sizeof(list->list[0]));
20 }
21 memcpy(list->list[list->nr].sha1, sha1, 20);
22 list->list[list->nr].name = xstrdup(name);
23 list->nr++;
24 }
25
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
26 static int parse_bundle_header(int fd, struct bundle_header *header,
27 const char *report_path)
f3fa183 Junio C Hamano Style: place opening brace of a function definition at column 1
authored
28 {
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
29 struct strbuf buf = STRBUF_INIT;
30 int status = 0;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
31
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
32 /* The bundle header begins with the signature */
5e8617f trast bundle: put strbuf_readline_fd in strbuf.c with adjustments
trast authored
33 if (strbuf_getwholeline_fd(&buf, fd, '\n') ||
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
34 strcmp(buf.buf, bundle_signature)) {
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
35 if (report_path)
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
36 error(_("'%s' does not look like a v2 bundle file"),
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
37 report_path);
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
38 status = -1;
39 goto abort;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
40 }
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
41
42 /* The bundle header ends with an empty line */
5e8617f trast bundle: put strbuf_readline_fd in strbuf.c with adjustments
trast authored
43 while (!strbuf_getwholeline_fd(&buf, fd, '\n') &&
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
44 buf.len && buf.buf[0] != '\n') {
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
45 unsigned char sha1[20];
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
46 int is_prereq = 0;
47
48 if (*buf.buf == '-') {
49 is_prereq = 1;
50 strbuf_remove(&buf, 0, 1);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
51 }
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
52 strbuf_rtrim(&buf);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
53
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
54 /*
55 * Tip lines have object name, SP, and refname.
56 * Prerequisites have object name that is optionally
57 * followed by SP and subject line.
58 */
59 if (get_sha1_hex(buf.buf, sha1) ||
60 (40 <= buf.len && !isspace(buf.buf[40])) ||
61 (!is_prereq && buf.len <= 40)) {
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
62 if (report_path)
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
63 error(_("unrecognized header: %s%s (%d)"),
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
64 (is_prereq ? "-" : ""), buf.buf, (int)buf.len);
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
65 status = -1;
66 break;
67 } else {
68 if (is_prereq)
69 add_to_ref_list(sha1, "", &header->prerequisites);
70 else
71 add_to_ref_list(sha1, buf.buf + 41, &header->references);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
72 }
73 }
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
74
75 abort:
76 if (status) {
77 close(fd);
78 fd = -1;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
79 }
e9ee84c Junio C Hamano bundle: allowing to read from an unseekable fd
authored
80 strbuf_release(&buf);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
81 return fd;
82 }
83
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
84 int read_bundle_header(const char *path, struct bundle_header *header)
85 {
86 int fd = open(path, O_RDONLY);
87
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
88 if (fd < 0)
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
89 return error(_("could not open '%s'"), path);
2727b71 Junio C Hamano bundle: add parse_bundle_header() helper function
authored
90 return parse_bundle_header(fd, header, path);
91 }
92
93 int is_bundle(const char *path, int quiet)
94 {
95 struct bundle_header header;
96 int fd = open(path, O_RDONLY);
97
98 if (fd < 0)
99 return 0;
100 memset(&header, 0, sizeof(header));
101 fd = parse_bundle_header(fd, &header, quiet ? NULL : path);
102 if (fd >= 0)
103 close(fd);
104 return (fd >= 0);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
105 }
106
107 static int list_refs(struct ref_list *r, int argc, const char **argv)
108 {
109 int i;
110
111 for (i = 0; i < r->nr; i++) {
112 if (argc > 1) {
113 int j;
114 for (j = 1; j < argc; j++)
115 if (!strcmp(r->list[i].name, argv[j]))
116 break;
117 if (j == argc)
118 continue;
119 }
120 printf("%s %s\n", sha1_to_hex(r->list[i].sha1),
121 r->list[i].name);
122 }
123 return 0;
124 }
125
126 #define PREREQ_MARK (1u<<16)
127
128 int verify_bundle(struct bundle_header *header, int verbose)
129 {
130 /*
131 * Do fast check, then if any prereqs are missing then go line by line
132 * to be verbose about the errors
133 */
134 struct ref_list *p = &header->prerequisites;
135 struct rev_info revs;
a80aad7 Nguyễn Thái Ngọc Duy Terminate argv with NULL before calling setup_revisions()
pclouds authored
136 const char *argv[] = {NULL, "--all", NULL};
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
137 struct object_array refs;
138 struct commit *commit;
139 int i, ret = 0, req_nr;
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
140 const char *message = _("Repository lacks these prerequisite commits:");
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
141
142 init_revisions(&revs, NULL);
143 for (i = 0; i < p->nr; i++) {
144 struct ref_list_entry *e = p->list + i;
145 struct object *o = parse_object(e->sha1);
146 if (o) {
147 o->flags |= PREREQ_MARK;
148 add_pending_object(&revs, o, e->name);
149 continue;
150 }
151 if (++ret == 1)
9db56f7 Daniel Lowe Fix non-literal format in printf-style calls
dlowe-net authored
152 error("%s", message);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
153 error("%s %s", sha1_to_hex(e->sha1), e->name);
154 }
155 if (revs.pending.nr != p->nr)
156 return ret;
157 req_nr = revs.pending.nr;
158 setup_revisions(2, argv, &revs, NULL);
159
5be7859 bundle: use leak_pending flag
René Scharfe authored
160 refs = revs.pending;
161 revs.leak_pending = 1;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
162
3d51e1b check return code of prepare_revision_walk
Martin Koegler authored
163 if (prepare_revision_walk(&revs))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
164 die(_("revision walk setup failed"));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
165
166 i = req_nr;
167 while (i && (commit = get_revision(&revs)))
168 if (commit->object.flags & PREREQ_MARK)
169 i--;
170
171 for (i = 0; i < req_nr; i++)
172 if (!(refs.objects[i].item->flags & SHOWN)) {
173 if (++ret == 1)
9db56f7 Daniel Lowe Fix non-literal format in printf-style calls
dlowe-net authored
174 error("%s", message);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
175 error("%s %s", sha1_to_hex(refs.objects[i].item->sha1),
176 refs.objects[i].name);
177 }
178
86a0a40 commit: factor out clear_commit_marks_for_object_array
René Scharfe authored
179 clear_commit_marks_for_object_array(&refs, ALL_REV_FLAGS);
5be7859 bundle: use leak_pending flag
René Scharfe authored
180 free(refs.objects);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
181
182 if (verbose) {
183 struct ref_list *r;
184
185 r = &header->references;
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
186 printf_ln(Q_("The bundle contains %d ref",
187 "The bundle contains %d refs",
188 r->nr),
189 r->nr);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
190 list_refs(r, 0, NULL);
8c3710f Junio C Hamano tweak "bundle verify" of a complete history
authored
191 if (!r->nr) {
192 printf_ln(_("The bundle records a complete history."));
193 } else {
194 r = &header->prerequisites;
195 printf_ln(Q_("The bundle requires this ref",
196 "The bundle requires these %d refs",
197 r->nr),
198 r->nr);
199 list_refs(r, 0, NULL);
200 }
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
201 }
202 return ret;
203 }
204
205 int list_bundle_refs(struct bundle_header *header, int argc, const char **argv)
206 {
207 return list_refs(&header->references, argc, argv);
208 }
209
c9a42c4 dscho bundle: allow rev-list options to exclude annotated tags
dscho authored
210 static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
211 {
212 unsigned long size;
213 enum object_type type;
214 char *buf, *line, *lineend;
215 unsigned long date;
216
217 if (revs->max_age == -1 && revs->min_age == -1)
218 return 1;
219
220 buf = read_sha1_file(tag->sha1, &type, &size);
221 if (!buf)
222 return 1;
223 line = memmem(buf, size, "\ntagger ", 8);
224 if (!line++)
225 return 1;
226 lineend = memchr(line, buf + size - line, '\n');
227 line = memchr(line, lineend ? lineend - line : buf + size - line, '>');
228 if (!line++)
229 return 1;
230 date = strtoul(line, NULL, 10);
231 free(buf);
232 return (revs->max_age == -1 || revs->max_age < date) &&
233 (revs->min_age == -1 || revs->min_age > date);
234 }
235
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
236 int create_bundle(struct bundle_header *header, const char *path,
237 int argc, const char **argv)
238 {
239 static struct lock_file lock;
240 int bundle_fd = -1;
241 int bundle_to_stdout;
242 const char **argv_boundary = xmalloc((argc + 4) * sizeof(const char *));
787d2a7 Shawn O. Pearce bundle: Use OFS_DELTA in bundle files
spearce authored
243 const char **argv_pack = xmalloc(6 * sizeof(const char *));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
244 int i, ref_count = 0;
bc2fed4 trast bundle: use a strbuf to scan the log for boundary commits
trast authored
245 struct strbuf buf = STRBUF_INIT;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
246 struct rev_info revs;
247 struct child_process rls;
248 FILE *rls_fout;
249
250 bundle_to_stdout = !strcmp(path, "-");
251 if (bundle_to_stdout)
252 bundle_fd = 1;
253 else
acd3b9e Junio C Hamano Enhance hold_lock_file_for_{update,append}() API
authored
254 bundle_fd = hold_lock_file_for_update(&lock, path,
255 LOCK_DIE_ON_ERROR);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
256
257 /* write signature */
258 write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
259
260 /* init revs to list objects for pack-objects later */
261 save_commit_buffer = 0;
262 init_revisions(&revs, NULL);
263
264 /* write prerequisites */
265 memcpy(argv_boundary + 3, argv + 1, argc * sizeof(const char *));
266 argv_boundary[0] = "rev-list";
267 argv_boundary[1] = "--boundary";
268 argv_boundary[2] = "--pretty=oneline";
269 argv_boundary[argc + 2] = NULL;
270 memset(&rls, 0, sizeof(rls));
271 rls.argv = argv_boundary;
272 rls.out = -1;
273 rls.git_cmd = 1;
274 if (start_command(&rls))
275 return -1;
4169837 don't dereference NULL upon fdopen failure
Jim Meyering authored
276 rls_fout = xfdopen(rls.out, "r");
bc2fed4 trast bundle: use a strbuf to scan the log for boundary commits
trast authored
277 while (strbuf_getwholeline(&buf, rls_fout, '\n') != EOF) {
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
278 unsigned char sha1[20];
bc2fed4 trast bundle: use a strbuf to scan the log for boundary commits
trast authored
279 if (buf.len > 0 && buf.buf[0] == '-') {
280 write_or_die(bundle_fd, buf.buf, buf.len);
281 if (!get_sha1_hex(buf.buf + 1, sha1)) {
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
282 struct object *object = parse_object(sha1);
283 object->flags |= UNINTERESTING;
efe4be1 trast bundle: keep around names passed to add_pending_object()
trast authored
284 add_pending_object(&revs, object, xstrdup(buf.buf));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
285 }
bc2fed4 trast bundle: use a strbuf to scan the log for boundary commits
trast authored
286 } else if (!get_sha1_hex(buf.buf, sha1)) {
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
287 struct object *object = parse_object(sha1);
288 object->flags |= SHOWN;
289 }
290 }
bc2fed4 trast bundle: use a strbuf to scan the log for boundary commits
trast authored
291 strbuf_release(&buf);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
292 fclose(rls_fout);
293 if (finish_command(&rls))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
294 return error(_("rev-list died"));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
295
296 /* write references */
297 argc = setup_revisions(argc, argv, &revs, NULL);
22568f0 adambrewster Teach git-bundle to read revision arguments from stdin like git-rev-list...
adambrewster authored
298
8b3dce5 Junio C Hamano Teach --stdin option to "log" family
authored
299 if (argc > 1)
1be65ed Junio C Hamano Merge branch 'nd/i18n'
authored
300 return error(_("unrecognized argument: %s"), argv[1]);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
301
b2a6d1c Junio C Hamano bundle: allow the same ref to be given more than once
authored
302 object_array_remove_duplicates(&revs.pending);
303
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
304 for (i = 0; i < revs.pending.nr; i++) {
305 struct object_array_entry *e = revs.pending.objects + i;
306 unsigned char sha1[20];
307 char *ref;
fa30383 Junio C Hamano Merge branch 'maint'
authored
308 const char *display_ref;
309 int flag;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
310
311 if (e->item->flags & UNINTERESTING)
312 continue;
313 if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
314 continue;
c689332 Nguyễn Thái Ngọc Duy Convert many resolve_ref() calls to read_ref*() and ref_exists()
pclouds authored
315 if (read_ref_full(e->name, sha1, 1, &flag))
fa30383 Junio C Hamano Merge branch 'maint'
authored
316 flag = 0;
317 display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
318
c9a42c4 dscho bundle: allow rev-list options to exclude annotated tags
dscho authored
319 if (e->item->type == OBJ_TAG &&
320 !is_tag_in_date_range(e->item, &revs)) {
321 e->item->flags |= UNINTERESTING;
322 continue;
323 }
324
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
325 /*
326 * Make sure the refs we wrote out is correct; --max-count and
327 * other limiting options could have prevented all the tips
328 * from getting output.
329 *
330 * Non commit objects such as tags and blobs do not have
331 * this issue as they are not affected by those extra
332 * constraints.
333 */
334 if (!(e->item->flags & SHOWN) && e->item->type == OBJ_COMMIT) {
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
335 warning(_("ref '%s' is excluded by the rev-list options"),
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
336 e->name);
337 free(ref);
338 continue;
339 }
340 /*
341 * If you run "git bundle create bndl v1.0..v2.0", the
342 * name of the positive ref is "v2.0" but that is the
343 * commit that is referenced by the tag, and not the tag
344 * itself.
345 */
346 if (hashcmp(sha1, e->item->sha1)) {
347 /*
348 * Is this the positive end of a range expressed
349 * in terms of a tag (e.g. v2.0 from the range
350 * "v1.0..v2.0")?
351 */
352 struct commit *one = lookup_commit_reference(sha1);
353 struct object *obj;
354
355 if (e->item == &(one->object)) {
356 /*
357 * Need to include e->name as an
358 * independent ref to the pack-objects
359 * input, so that the tag is included
360 * in the output; otherwise we would
361 * end up triggering "empty bundle"
362 * error.
363 */
364 obj = parse_object(sha1);
365 obj->flags |= SHOWN;
366 add_pending_object(&revs, obj, e->name);
367 }
368 free(ref);
369 continue;
370 }
371
372 ref_count++;
373 write_or_die(bundle_fd, sha1_to_hex(e->item->sha1), 40);
374 write_or_die(bundle_fd, " ", 1);
fa30383 Junio C Hamano Merge branch 'maint'
authored
375 write_or_die(bundle_fd, display_ref, strlen(display_ref));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
376 write_or_die(bundle_fd, "\n", 1);
377 free(ref);
378 }
379 if (!ref_count)
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
380 die(_("Refusing to create empty bundle."));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
381
382 /* end header */
383 write_or_die(bundle_fd, "\n", 1);
384
385 /* write pack */
386 argv_pack[0] = "pack-objects";
4f36627 npitre pack-objects: split implications of --all-progress from progress activat...
npitre authored
387 argv_pack[1] = "--all-progress-implied";
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
388 argv_pack[2] = "--stdout";
389 argv_pack[3] = "--thin";
787d2a7 Shawn O. Pearce bundle: Use OFS_DELTA in bundle files
spearce authored
390 argv_pack[4] = "--delta-base-offset";
391 argv_pack[5] = NULL;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
392 memset(&rls, 0, sizeof(rls));
393 rls.argv = argv_pack;
394 rls.in = -1;
395 rls.out = bundle_fd;
396 rls.git_cmd = 1;
397 if (start_command(&rls))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
398 return error(_("Could not spawn pack-objects"));
4ed7cd3 Improve use of lockfile API
Brandon Casey authored
399
400 /*
401 * start_command closed bundle_fd if it was > 1
402 * so set the lock fd to -1 so commit_lock_file()
403 * won't fail trying to close it.
404 */
405 lock.fd = -1;
406
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
407 for (i = 0; i < revs.pending.nr; i++) {
408 struct object *object = revs.pending.objects[i].item;
409 if (object->flags & UNINTERESTING)
95693d4 meyering bundle, fast-import: detect write failure
meyering authored
410 write_or_die(rls.in, "^", 1);
411 write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
412 write_or_die(rls.in, "\n", 1);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
413 }
e72ae28 start_command(), .in/.out/.err = -1: Callers must close the file descrip...
Johannes Sixt authored
414 close(rls.in);
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
415 if (finish_command(&rls))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
416 return error(_("pack-objects died"));
0f5cdf6 Csaba Henk bundle: detect if bundle file cannot be created
csabahenk authored
417 if (!bundle_to_stdout) {
418 if (commit_lock_file(&lock))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
419 die_errno(_("cannot create '%s'"), path);
0f5cdf6 Csaba Henk bundle: detect if bundle file cannot be created
csabahenk authored
420 }
c20181e start_command(), if .in/.out > 0, closes file descriptors, not the calle...
Johannes Sixt authored
421 return 0;
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
422 }
423
be042af Junio C Hamano Teach progress eye-candy to fetch_refs_from_bundle()
authored
424 int unbundle(struct bundle_header *header, int bundle_fd, int flags)
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
425 {
426 const char *argv_index_pack[] = {"index-pack",
be042af Junio C Hamano Teach progress eye-candy to fetch_refs_from_bundle()
authored
427 "--fix-thin", "--stdin", NULL, NULL};
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
428 struct child_process ip;
429
be042af Junio C Hamano Teach progress eye-candy to fetch_refs_from_bundle()
authored
430 if (flags & BUNDLE_VERBOSE)
431 argv_index_pack[3] = "-v";
432
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
433 if (verify_bundle(header, 0))
434 return -1;
435 memset(&ip, 0, sizeof(ip));
436 ip.argv = argv_index_pack;
437 ip.in = bundle_fd;
438 ip.no_stdout = 1;
439 ip.git_cmd = 1;
440 if (run_command(&ip))
8a1e7ea Nguyễn Thái Ngọc Duy i18n: bundle: mark strings for translation
pclouds authored
441 return error(_("index-pack died"));
30415d5 dscho Move bundle specific stuff into bundle.[ch]
dscho authored
442 return 0;
443 }
Something went wrong with that request. Please try again.