index-pack --strict looks up and follows parent commits. If shallow information is not ready by the time index-pack is run, index-pack may be lead to non-existent objects. Make fetch-pack save shallow file to disk before invoking index-pack. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- fetch-pack.c | 70 ++++++++++++++++++++++++++++----------------------- t/t5500-fetch-pack.sh | 7 ++++++ 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index cef8fde..1f9c5ba 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -779,11 +779,44 @@ static int cmp_ref_by_name(const void *a_, const void *b_) return strcmp(a->name, b->name); } +static void flush_shallow_to_disk(struct stat *st) +{ + static struct lock_file lock; + struct cache_time mtime; + struct strbuf sb = STRBUF_INIT; + char *shallow = git_path("shallow"); + int fd; + + mtime.sec = st->st_mtime; + mtime.nsec = ST_MTIME_NSEC(*st); + if (stat(shallow, st)) { + if (mtime.sec) + die("shallow file was removed during fetch"); + } else if (st->st_mtime != mtime.sec +#ifdef USE_NSEC + || ST_MTIME_NSEC(*st) != mtime.nsec +#endif + ) + die("shallow file was changed during fetch"); + + fd = hold_lock_file_for_update(&lock, shallow, + LOCK_DIE_ON_ERROR); + if (!write_shallow_commits(&sb, 0) + || write_in_full(fd, sb.buf, sb.len) != sb.len) { + unlink_or_warn(shallow); + rollback_lock_file(&lock); + } else { + commit_lock_file(&lock); + } + strbuf_release(&sb); +} + static struct ref *do_fetch_pack(struct fetch_pack_args *args, int fd[2], const struct ref *orig_ref, struct ref **sought, int nr_sought, - char **pack_lockfile) + char **pack_lockfile, + struct stat *shallow_st) { struct ref *ref = copy_ref_list(orig_ref); unsigned char sha1[20]; @@ -858,6 +891,8 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, if (args->stateless_rpc) packet_flush(fd[1]); + if (args->depth > 0) + flush_shallow_to_disk(shallow_st); if (get_pack(args, fd, pack_lockfile)) die("git fetch-pack: fetch failed."); @@ -952,38 +987,9 @@ struct ref *fetch_pack(struct fetch_pack_args *args, packet_flush(fd[1]); die("no matching remote head"); } - ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, pack_lockfile); - if (args->depth > 0) { - static struct lock_file lock; - struct cache_time mtime; - struct strbuf sb = STRBUF_INIT; - char *shallow = git_path("shallow"); - int fd; - - mtime.sec = st.st_mtime; - mtime.nsec = ST_MTIME_NSEC(st); - if (stat(shallow, &st)) { - if (mtime.sec) - die("shallow file was removed during fetch"); - } else if (st.st_mtime != mtime.sec -#ifdef USE_NSEC - || ST_MTIME_NSEC(st) != mtime.nsec -#endif - ) - die("shallow file was changed during fetch"); - - fd = hold_lock_file_for_update(&lock, shallow, - LOCK_DIE_ON_ERROR); - if (!write_shallow_commits(&sb, 0) - || write_in_full(fd, sb.buf, sb.len) != sb.len) { - unlink_or_warn(shallow); - rollback_lock_file(&lock); - } else { - commit_lock_file(&lock); - } - strbuf_release(&sb); - } + ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, + pack_lockfile, &st); reprepare_packed_git(); return ref_cpy; diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index d574085..557b073 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -135,6 +135,13 @@ test_expect_success 'clone shallow depth 1' ' test "`git --git-dir=shallow0/.git rev-list --count HEAD`" = 1 ' +test_expect_success 'clone shallow depth 1 with fsck' ' + git config --global fetch.fsckobjects true && + git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0fsck && + test "`git --git-dir=shallow0fsck/.git rev-list --count HEAD`" = 1 && + git config --global --unset fetch.fsckobjects +' + test_expect_success 'clone shallow' ' git clone --no-single-branch --depth 2 "file://$(pwd)/." shallow ' -- 1.8.2.83.gc99314b -- 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