Merge branch 'js/empty-index-fixes' into next
A few places failed to differenciate the case where the index is truly empty (nothing added) and we haven't yet read from the on-disk index file, which have been corrected. * js/empty-index-fixes: commit -a -m: allow the top-level tree to become empty again split-index: accept that a base index can be empty do_read_index(): always mark index as initialized unless erroring out
This commit is contained in:
@ -1002,11 +1002,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
|
|||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
const char *parent = "HEAD";
|
const char *parent = "HEAD";
|
||||||
|
|
||||||
if (!the_index.cache_nr) {
|
if (!the_index.initialized && repo_read_index(the_repository) < 0)
|
||||||
discard_index(&the_index);
|
|
||||||
if (repo_read_index(the_repository) < 0)
|
|
||||||
die(_("Cannot read index"));
|
die(_("Cannot read index"));
|
||||||
}
|
|
||||||
|
|
||||||
if (amend)
|
if (amend)
|
||||||
parent = "HEAD^1";
|
parent = "HEAD^1";
|
||||||
|
@ -2236,6 +2236,7 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
|
|||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
if (!must_exist && errno == ENOENT) {
|
if (!must_exist && errno == ENOENT) {
|
||||||
set_new_index_sparsity(istate);
|
set_new_index_sparsity(istate);
|
||||||
|
istate->initialized = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
die_errno(_("%s: index file open failed"), path);
|
die_errno(_("%s: index file open failed"), path);
|
||||||
@ -2405,12 +2406,14 @@ int read_index_from(struct index_state *istate, const char *path,
|
|||||||
|
|
||||||
base_oid_hex = oid_to_hex(&split_index->base_oid);
|
base_oid_hex = oid_to_hex(&split_index->base_oid);
|
||||||
base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_oid_hex);
|
base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_oid_hex);
|
||||||
|
if (file_exists(base_path)) {
|
||||||
trace2_region_enter_printf("index", "shared/do_read_index",
|
trace2_region_enter_printf("index", "shared/do_read_index",
|
||||||
the_repository, "%s", base_path);
|
the_repository, "%s", base_path);
|
||||||
|
|
||||||
ret = do_read_index(split_index->base, base_path, 0);
|
ret = do_read_index(split_index->base, base_path, 0);
|
||||||
trace2_region_leave_printf("index", "shared/do_read_index",
|
trace2_region_leave_printf("index", "shared/do_read_index",
|
||||||
the_repository, "%s", base_path);
|
the_repository, "%s", base_path);
|
||||||
if (!ret) {
|
} else {
|
||||||
char *path_copy = xstrdup(path);
|
char *path_copy = xstrdup(path);
|
||||||
char *base_path2 = xstrfmt("%s/sharedindex.%s",
|
char *base_path2 = xstrfmt("%s/sharedindex.%s",
|
||||||
dirname(path_copy), base_oid_hex);
|
dirname(path_copy), base_oid_hex);
|
||||||
|
@ -197,4 +197,15 @@ test_expect_success '"add -u non-existent" should fail' '
|
|||||||
! grep "non-existent" actual
|
! grep "non-existent" actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '"commit -a" implies "add -u" if index becomes empty' '
|
||||||
|
git rm -rf \* &&
|
||||||
|
git commit -m clean-slate &&
|
||||||
|
test_commit file1 &&
|
||||||
|
rm file1.t &&
|
||||||
|
test_tick &&
|
||||||
|
git commit -a -m remove &&
|
||||||
|
git ls-tree HEAD: >out &&
|
||||||
|
test_must_be_empty out
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user