Skip to content

Commit 82dacae

Browse files
authored
Merge pull request #1933 from dscho/update-create-empty-bundle
Update `create-empty-bundle`
2 parents 8d08b44 + 3f0700f commit 82dacae

File tree

2 files changed

+25
-27
lines changed

2 files changed

+25
-27
lines changed

bundle.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
243243
}
244244

245245

246-
/* Write the pack data to bundle_fd, then close it if it is > 1. */
246+
/* Write the pack data to bundle_fd */
247247
static int write_pack_data(int bundle_fd, struct rev_info *revs)
248248
{
249249
struct child_process pack_objects = CHILD_PROCESS_INIT;
@@ -256,6 +256,20 @@ static int write_pack_data(int bundle_fd, struct rev_info *revs)
256256
pack_objects.in = -1;
257257
pack_objects.out = bundle_fd;
258258
pack_objects.git_cmd = 1;
259+
260+
/*
261+
* start_command() will close our descriptor if it's >1. Duplicate it
262+
* to avoid surprising the caller.
263+
*/
264+
if (pack_objects.out > 1) {
265+
pack_objects.out = dup(pack_objects.out);
266+
if (pack_objects.out < 0) {
267+
error_errno(_("unable to dup bundle descriptor"));
268+
child_process_clear(&pack_objects);
269+
return -1;
270+
}
271+
}
272+
259273
if (start_command(&pack_objects))
260274
return error(_("Could not spawn pack-objects"));
261275

@@ -421,21 +435,10 @@ int create_bundle(struct bundle_header *header, const char *path,
421435
bundle_to_stdout = !strcmp(path, "-");
422436
if (bundle_to_stdout)
423437
bundle_fd = 1;
424-
else {
438+
else
425439
bundle_fd = hold_lock_file_for_update(&lock, path,
426440
LOCK_DIE_ON_ERROR);
427441

428-
/*
429-
* write_pack_data() will close the fd passed to it,
430-
* but commit_lock_file() will also try to close the
431-
* lockfile's fd. So make a copy of the file
432-
* descriptor to avoid trying to close it twice.
433-
*/
434-
bundle_fd = dup(bundle_fd);
435-
if (bundle_fd < 0)
436-
die_errno("unable to dup file descriptor");
437-
}
438-
439442
/* write signature */
440443
write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
441444

@@ -457,29 +460,22 @@ int create_bundle(struct bundle_header *header, const char *path,
457460
object_array_remove_duplicates(&revs.pending);
458461

459462
ref_count = write_bundle_refs(bundle_fd, &revs);
460-
if (ref_count <= 0) {
461-
if (!ref_count)
462-
error(_("Refusing to create empty bundle."));
463+
if (!ref_count)
464+
die(_("Refusing to create empty bundle."));
465+
else if (ref_count < 0)
463466
goto err;
464-
}
465467

466468
/* write pack */
467-
if (write_pack_data(bundle_fd, &revs)) {
468-
bundle_fd = -1; /* already closed by the above call */
469+
if (write_pack_data(bundle_fd, &revs))
469470
goto err;
470-
}
471471

472472
if (!bundle_to_stdout) {
473473
if (commit_lock_file(&lock))
474474
die_errno(_("cannot create '%s'"), path);
475475
}
476476
return 0;
477477
err:
478-
if (!bundle_to_stdout) {
479-
if (0 <= bundle_fd)
480-
close(bundle_fd);
481-
rollback_lock_file(&lock);
482-
}
478+
rollback_lock_file(&lock);
483479
return -1;
484480
}
485481

t/t5607-clone-bundle.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ test_expect_success 'prerequisites with an empty commit message' '
7171
git bundle verify bundle
7272
'
7373

74-
test_expect_success 'try to create a bundle with empty ref count' '
75-
test_expect_code 1 git bundle create foobar.bundle master..master
74+
test_expect_success 'failed bundle creation does not leave cruft' '
75+
# This fails because the bundle would be empty.
76+
test_must_fail git bundle create fail.bundle master..master &&
77+
test_path_is_missing fail.bundle.lock
7678
'
7779

7880
test_done

0 commit comments

Comments
 (0)