Merge branch 'nd/split-index'
An experiment to use two files (the base file and incremental changes relative to it) to represent the index to reduce I/O cost of rewriting a large index when only small part of the working tree changes. * nd/split-index: (32 commits) t1700: new tests for split-index mode t2104: make sure split index mode is off for the version test read-cache: force split index mode with GIT_TEST_SPLIT_INDEX read-tree: note about dropping split-index mode or index version read-tree: force split-index mode off on --index-output rev-parse: add --shared-index-path to get shared index path update-index --split-index: do not split if $GIT_DIR is read only update-index: new options to enable/disable split index mode split-index: strip pathname of on-disk replaced entries split-index: do not invalidate cache-tree at read time split-index: the reading part split-index: the writing part read-cache: mark updated entries for split index read-cache: save deleted entries in split index read-cache: mark new entries for split index read-cache: split-index mode read-cache: save index SHA-1 after reading entry.c: update cache_changed if refresh_cache is set in checkout_entry() cache-tree: mark istate->cache_changed on prime_cache_tree() cache-tree: mark istate->cache_changed on cache tree update ...
This commit is contained in:
@ -13,6 +13,7 @@
|
||||
#include "parse-options.h"
|
||||
#include "pathspec.h"
|
||||
#include "dir.h"
|
||||
#include "split-index.h"
|
||||
|
||||
/*
|
||||
* Default to not allowing changes to the list of files. The
|
||||
@ -55,8 +56,9 @@ static int mark_ce_flags(const char *path, int flag, int mark)
|
||||
active_cache[pos]->ce_flags |= flag;
|
||||
else
|
||||
active_cache[pos]->ce_flags &= ~flag;
|
||||
cache_tree_invalidate_path(active_cache_tree, path);
|
||||
active_cache_changed = 1;
|
||||
active_cache[pos]->ce_flags |= CE_UPDATE_IN_BASE;
|
||||
cache_tree_invalidate_path(&the_index, path);
|
||||
active_cache_changed |= CE_ENTRY_CHANGED;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
@ -267,8 +269,9 @@ static void chmod_path(int flip, const char *path)
|
||||
default:
|
||||
goto fail;
|
||||
}
|
||||
cache_tree_invalidate_path(active_cache_tree, path);
|
||||
active_cache_changed = 1;
|
||||
cache_tree_invalidate_path(&the_index, path);
|
||||
ce->ce_flags |= CE_UPDATE_IN_BASE;
|
||||
active_cache_changed |= CE_ENTRY_CHANGED;
|
||||
report("chmod %cx '%s'", flip, path);
|
||||
return;
|
||||
fail:
|
||||
@ -743,6 +746,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
char set_executable_bit = 0;
|
||||
struct refresh_params refresh_args = {0, &has_errors};
|
||||
int lock_error = 0;
|
||||
int split_index = -1;
|
||||
struct lock_file *lock_file;
|
||||
struct parse_opt_ctx_t ctx;
|
||||
int parseopt_state = PARSE_OPT_UNKNOWN;
|
||||
@ -825,6 +829,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
resolve_undo_clear_callback},
|
||||
OPT_INTEGER(0, "index-version", &preferred_index_format,
|
||||
N_("write index in this format")),
|
||||
OPT_BOOL(0, "split-index", &split_index,
|
||||
N_("enable or disable split index")),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
@ -892,7 +898,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
INDEX_FORMAT_LB, INDEX_FORMAT_UB);
|
||||
|
||||
if (the_index.version != preferred_index_format)
|
||||
active_cache_changed = 1;
|
||||
active_cache_changed |= SOMETHING_CHANGED;
|
||||
the_index.version = preferred_index_format;
|
||||
}
|
||||
|
||||
@ -918,14 +924,27 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
strbuf_release(&buf);
|
||||
}
|
||||
|
||||
if (split_index > 0) {
|
||||
init_split_index(&the_index);
|
||||
the_index.cache_changed |= SPLIT_INDEX_ORDERED;
|
||||
} else if (!split_index && the_index.split_index) {
|
||||
/*
|
||||
* can't discard_split_index(&the_index); because that
|
||||
* will destroy split_index->base->cache[], which may
|
||||
* be shared with the_index.cache[]. So yeah we're
|
||||
* leaking a bit here.
|
||||
*/
|
||||
the_index.split_index = NULL;
|
||||
the_index.cache_changed |= SOMETHING_CHANGED;
|
||||
}
|
||||
|
||||
if (active_cache_changed) {
|
||||
if (newfd < 0) {
|
||||
if (refresh_args.flags & REFRESH_QUIET)
|
||||
exit(128);
|
||||
unable_to_lock_index_die(get_index_file(), lock_error);
|
||||
}
|
||||
if (write_cache(newfd, active_cache, active_nr) ||
|
||||
commit_locked_index(lock_file))
|
||||
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
|
||||
die("Unable to write new index file");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user