Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- bulk-checkin.c | 12 +++++++++++- t/t1050-large.sh | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/bulk-checkin.c b/bulk-checkin.c index 82166ba..60178ef 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c @@ -29,7 +29,11 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state) if (!state->f) return; - if (state->nr_written == 1) { + if (state->nr_written == 0) { + close(state->f->fd); + unlink(state->pack_tmp_name); + goto clear_exit; + } else if (state->nr_written == 1) { sha1close(state->f, sha1, CSUM_FSYNC); } else { int fd = sha1close(state->f, sha1, 0); @@ -45,6 +49,8 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state) &state->pack_idx_opts, sha1); for (i = 0; i < state->nr_written; i++) free(state->written[i]); + +clear_exit: free(state->written); memset(state, 0, sizeof(*state)); @@ -56,6 +62,10 @@ static int already_written(struct bulk_checkin_state *state, unsigned char sha1[ { int i; + /* The object may already exist in the repository */ + if (has_sha1_file(sha1)) + return 1; + /* Might want to keep the list sorted */ for (i = 0; i < state->nr_written; i++) if (!hashcmp(state->written[i]->sha1, sha1)) diff --git a/t/t1050-large.sh b/t/t1050-large.sh index fbd5ced..0726472 100755 --- a/t/t1050-large.sh +++ b/t/t1050-large.sh @@ -9,6 +9,7 @@ test_expect_success setup ' git config core.bigfilethreshold 200k && echo X | dd of=large1 bs=1k seek=2000 && echo X | dd of=large2 bs=1k seek=2000 && + echo X | dd of=large3 bs=1k seek=2000 && echo Y | dd of=huge bs=1k seek=2500 ' @@ -34,7 +35,22 @@ test_expect_success 'add a large file or two' ' test -f "$l" || continue bad=t done && - test -z "$bad" + test -z "$bad" && + + # attempt to add another copy of the same + git add large3 && + bad= count=0 && + for p in .git/objects/pack/pack-*.pack + do + count=$(( $count + 1 )) + if test -f "$p" && idx=${p%.pack}.idx && test -f "$idx" + then + continue + fi + bad=t + done && + test -z "$bad" && + test $count = 1 ' test_expect_success 'checkout a large file' ' -- 1.7.8.rc3.111.g7d421 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html