提交 e75c8621 编写于 作者: J Junio C Hamano

Merge branch 'tg/split-index-fixes'

The split-index mode had a few corner case bugs fixed.

* tg/split-index-fixes:
  travis: run tests with GIT_TEST_SPLIT_INDEX
  split-index: don't write cache tree with null oid entries
  read-cache: fix reading the shared index for other repos
...@@ -608,7 +608,7 @@ int write_index_as_tree(unsigned char *sha1, struct index_state *index_state, co ...@@ -608,7 +608,7 @@ int write_index_as_tree(unsigned char *sha1, struct index_state *index_state, co
hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR); hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR);
entries = read_index_from(index_state, index_path); entries = read_index_from(index_state, index_path, get_git_dir());
if (entries < 0) { if (entries < 0) {
ret = WRITE_TREE_UNREADABLE_INDEX; ret = WRITE_TREE_UNREADABLE_INDEX;
goto out; goto out;
......
...@@ -345,7 +345,8 @@ struct index_state { ...@@ -345,7 +345,8 @@ struct index_state {
struct split_index *split_index; struct split_index *split_index;
struct cache_time timestamp; struct cache_time timestamp;
unsigned name_hash_initialized : 1, unsigned name_hash_initialized : 1,
initialized : 1; initialized : 1,
drop_cache_tree : 1;
struct hashmap name_hash; struct hashmap name_hash;
struct hashmap dir_hash; struct hashmap dir_hash;
unsigned char sha1[20]; unsigned char sha1[20];
...@@ -371,7 +372,7 @@ extern void free_name_hash(struct index_state *istate); ...@@ -371,7 +372,7 @@ extern void free_name_hash(struct index_state *istate);
#define active_cache_tree (the_index.cache_tree) #define active_cache_tree (the_index.cache_tree)
#define read_cache() read_index(&the_index) #define read_cache() read_index(&the_index)
#define read_cache_from(path) read_index_from(&the_index, (path)) #define read_cache_from(path) read_index_from(&the_index, (path), (get_git_dir()))
#define read_cache_preload(pathspec) read_index_preload(&the_index, (pathspec)) #define read_cache_preload(pathspec) read_index_preload(&the_index, (pathspec))
#define is_cache_unborn() is_index_unborn(&the_index) #define is_cache_unborn() is_index_unborn(&the_index)
#define read_cache_unmerged() read_index_unmerged(&the_index) #define read_cache_unmerged() read_index_unmerged(&the_index)
...@@ -616,7 +617,8 @@ extern int read_index(struct index_state *); ...@@ -616,7 +617,8 @@ extern int read_index(struct index_state *);
extern int read_index_preload(struct index_state *, const struct pathspec *pathspec); extern int read_index_preload(struct index_state *, const struct pathspec *pathspec);
extern int do_read_index(struct index_state *istate, const char *path, extern int do_read_index(struct index_state *istate, const char *path,
int must_exist); /* for testting only! */ int must_exist); /* for testting only! */
extern int read_index_from(struct index_state *, const char *path); extern int read_index_from(struct index_state *, const char *path,
const char *gitdir);
extern int is_index_unborn(struct index_state *); extern int is_index_unborn(struct index_state *);
extern int read_index_unmerged(struct index_state *); extern int read_index_unmerged(struct index_state *);
......
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
ln -s $HOME/travis-cache/.prove t/.prove ln -s $HOME/travis-cache/.prove t/.prove
make --quiet test make --quiet test
if test "$jobname" = "linux-gcc"
then
GIT_TEST_SPLIT_INDEX=YesPlease make --quiet test
fi
check_unignored_build_artifacts check_unignored_build_artifacts
......
...@@ -1603,7 +1603,7 @@ int hold_locked_index(struct lock_file *lk, int lock_flags) ...@@ -1603,7 +1603,7 @@ int hold_locked_index(struct lock_file *lk, int lock_flags)
int read_index(struct index_state *istate) int read_index(struct index_state *istate)
{ {
return read_index_from(istate, get_index_file()); return read_index_from(istate, get_index_file(), get_git_dir());
} }
static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk, static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk,
...@@ -1863,20 +1863,19 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist) ...@@ -1863,20 +1863,19 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
* This way, shared index can be removed if they have not been used * This way, shared index can be removed if they have not been used
* for some time. * for some time.
*/ */
static void freshen_shared_index(char *base_sha1_hex, int warn) static void freshen_shared_index(const char *shared_index, int warn)
{ {
char *shared_index = git_pathdup("sharedindex.%s", base_sha1_hex);
if (!check_and_freshen_file(shared_index, 1) && warn) if (!check_and_freshen_file(shared_index, 1) && warn)
warning("could not freshen shared index '%s'", shared_index); warning("could not freshen shared index '%s'", shared_index);
free(shared_index);
} }
int read_index_from(struct index_state *istate, const char *path) int read_index_from(struct index_state *istate, const char *path,
const char *gitdir)
{ {
struct split_index *split_index; struct split_index *split_index;
int ret; int ret;
char *base_sha1_hex; char *base_sha1_hex;
const char *base_path; char *base_path;
/* istate->initialized covers both .git/index and .git/sharedindex.xxx */ /* istate->initialized covers both .git/index and .git/sharedindex.xxx */
if (istate->initialized) if (istate->initialized)
...@@ -1896,16 +1895,17 @@ int read_index_from(struct index_state *istate, const char *path) ...@@ -1896,16 +1895,17 @@ int read_index_from(struct index_state *istate, const char *path)
split_index->base = xcalloc(1, sizeof(*split_index->base)); split_index->base = xcalloc(1, sizeof(*split_index->base));
base_sha1_hex = sha1_to_hex(split_index->base_sha1); base_sha1_hex = sha1_to_hex(split_index->base_sha1);
base_path = git_path("sharedindex.%s", base_sha1_hex); base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_sha1_hex);
ret = do_read_index(split_index->base, base_path, 1); ret = do_read_index(split_index->base, base_path, 1);
if (hashcmp(split_index->base_sha1, split_index->base->sha1)) if (hashcmp(split_index->base_sha1, split_index->base->sha1))
die("broken index, expect %s in %s, got %s", die("broken index, expect %s in %s, got %s",
base_sha1_hex, base_path, base_sha1_hex, base_path,
sha1_to_hex(split_index->base->sha1)); sha1_to_hex(split_index->base->sha1));
freshen_shared_index(base_sha1_hex, 0); freshen_shared_index(base_path, 0);
merge_base_index(istate); merge_base_index(istate);
post_read_index_from(istate); post_read_index_from(istate);
free(base_path);
return ret; return ret;
} }
...@@ -2243,7 +2243,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, ...@@ -2243,7 +2243,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
struct stat st; struct stat st;
struct ondisk_cache_entry_extended ondisk; struct ondisk_cache_entry_extended ondisk;
struct strbuf previous_name_buf = STRBUF_INIT, *previous_name; struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
int drop_cache_tree = 0; int drop_cache_tree = istate->drop_cache_tree;
for (i = removed = extended = 0; i < entries; i++) { for (i = removed = extended = 0; i < entries; i++) {
if (cache[i]->ce_flags & CE_REMOVE) if (cache[i]->ce_flags & CE_REMOVE)
...@@ -2573,8 +2573,11 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock, ...@@ -2573,8 +2573,11 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
ret = write_split_index(istate, lock, flags); ret = write_split_index(istate, lock, flags);
/* Freshen the shared index only if the split-index was written */ /* Freshen the shared index only if the split-index was written */
if (!ret && !new_shared_index) if (!ret && !new_shared_index) {
freshen_shared_index(sha1_to_hex(si->base_sha1), 1); const char *shared_index = git_path("sharedindex.%s",
sha1_to_hex(si->base_sha1));
freshen_shared_index(shared_index, 1);
}
out: out:
if (flags & COMMIT_LOCK) if (flags & COMMIT_LOCK)
......
...@@ -236,5 +236,5 @@ int repo_read_index(struct repository *repo) ...@@ -236,5 +236,5 @@ int repo_read_index(struct repository *repo)
if (!repo->index) if (!repo->index)
repo->index = xcalloc(1, sizeof(*repo->index)); repo->index = xcalloc(1, sizeof(*repo->index));
return read_index_from(repo->index, repo->index_file); return read_index_from(repo->index, repo->index_file, repo->gitdir);
} }
...@@ -1362,7 +1362,8 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) ...@@ -1362,7 +1362,8 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags)
continue; /* current index already taken care of */ continue; /* current index already taken care of */
if (read_index_from(&istate, if (read_index_from(&istate,
worktree_git_path(wt, "index")) > 0) worktree_git_path(wt, "index"),
get_worktree_git_dir(wt)) > 0)
do_add_index_objects_to_pending(revs, &istate); do_add_index_objects_to_pending(revs, &istate);
discard_index(&istate); discard_index(&istate);
} }
......
...@@ -238,6 +238,8 @@ void prepare_to_write_split_index(struct index_state *istate) ...@@ -238,6 +238,8 @@ void prepare_to_write_split_index(struct index_state *istate)
ALLOC_GROW(entries, nr_entries+1, nr_alloc); ALLOC_GROW(entries, nr_entries+1, nr_alloc);
entries[nr_entries++] = ce; entries[nr_entries++] = ce;
} }
if (is_null_oid(&ce->oid))
istate->drop_cache_tree = 1;
} }
} }
......
...@@ -401,4 +401,23 @@ done <<\EOF ...@@ -401,4 +401,23 @@ done <<\EOF
0642 -rw-r---w- 0642 -rw-r---w-
EOF EOF
test_expect_success 'writing split index with null sha1 does not write cache tree' '
git config core.splitIndex true &&
git config splitIndex.maxPercentChange 0 &&
git commit -m "commit" &&
{
git ls-tree HEAD &&
printf "160000 commit $_z40\\tbroken\\n"
} >broken-tree &&
echo "add broken entry" >msg &&
tree=$(git mktree <broken-tree) &&
test_tick &&
commit=$(git commit-tree $tree -p HEAD <msg) &&
git update-ref HEAD "$commit" &&
GIT_ALLOW_NULL_SHA1=1 git reset --hard &&
(test-dump-cache-tree >cache-tree.out || true) &&
test_line_count = 0 cache-tree.out
'
test_done test_done
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册