зеркало из https://github.com/microsoft/git.git
hold_locked_index(): align error handling with hold_lockfile_for_update()
Callers of the hold_locked_index() function pass 0 when they want to prepare to write a new version of the index file without wishing to die or emit an error message when the request fails (e.g. somebody else already held the lock), and pass 1 when they want the call to die upon failure. This option is called LOCK_DIE_ON_ERROR by the underlying lockfile API, and the hold_locked_index() function translates the paramter to LOCK_DIE_ON_ERROR when calling the hold_lock_file_for_update(). Replace these hardcoded '1' with LOCK_DIE_ON_ERROR and stop translating. Callers other than the ones that are replaced with this change pass '0' to the function; no behaviour change is intended with this patch. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- Among the callers of hold_locked_index() that passes 0: - diff.c::refresh_index_quietly() at the end of "git diff" is an opportunistic update; it leaks the lockfile structure but it is just before the program exits and nobody should care. - builtin/describe.c::cmd_describe(), builtin/commit.c::cmd_status(), sequencer.c::read_and_refresh_cache() are all opportunistic updates and they are OK. - builtin/update-index.c::cmd_update_index() takes a lock upfront but we may end up not needing to update the index (i.e. the entries may be fully up-to-date), in which case we do not need to issue an error upon failure to acquire the lock. We do diagnose and die if we indeed need to update, so it is OK. - wt-status.c::require_clean_work_tree() IS BUGGY. It asks silence, does not check the returned value. Compare with callsites like cmd_describe() and cmd_status() to notice that it is wrong to call update_index_if_able() unconditionally.
This commit is contained in:
Родитель
89d38fb266
Коммит
b3e83cc752
2
apply.c
2
apply.c
|
@ -4688,7 +4688,7 @@ static int apply_patch(struct apply_state *state,
|
|||
state->index_file,
|
||||
LOCK_DIE_ON_ERROR);
|
||||
else
|
||||
state->newfd = hold_locked_index(state->lock_file, 1);
|
||||
state->newfd = hold_locked_index(state->lock_file, LOCK_DIE_ON_ERROR);
|
||||
}
|
||||
|
||||
if (state->check_index && read_apply_cache(state) < 0) {
|
||||
|
|
|
@ -361,7 +361,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|||
add_new_files = !take_worktree_changes && !refresh_only;
|
||||
require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
|
||||
|
||||
hold_locked_index(&lock_file, 1);
|
||||
hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
|
||||
(show_only ? ADD_CACHE_PRETEND : 0) |
|
||||
|
|
|
@ -1119,7 +1119,7 @@ static void refresh_and_write_cache(void)
|
|||
{
|
||||
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
if (write_locked_index(&the_index, lock_file, COMMIT_LOCK))
|
||||
die(_("unable to write index file"));
|
||||
|
@ -1976,7 +1976,7 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
|
|||
return -1;
|
||||
|
||||
lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
|
||||
|
@ -2016,7 +2016,7 @@ static int merge_tree(struct tree *tree)
|
|||
return -1;
|
||||
|
||||
lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
memset(&opts, 0, sizeof(opts));
|
||||
opts.head_idx = 1;
|
||||
|
|
|
@ -205,7 +205,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
|||
if (index_opt && !state.base_dir_len && !to_tempfile) {
|
||||
state.refresh_cache = 1;
|
||||
state.istate = &the_index;
|
||||
newfd = hold_locked_index(&lock_file, 1);
|
||||
newfd = hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
}
|
||||
|
||||
/* Check out named files first */
|
||||
|
|
|
@ -274,7 +274,7 @@ static int checkout_paths(const struct checkout_opts *opts,
|
|||
|
||||
lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
if (read_cache_preload(&opts->pathspec) < 0)
|
||||
return error(_("index file corrupt"));
|
||||
|
||||
|
@ -467,7 +467,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
|
|||
int ret;
|
||||
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
if (read_cache_preload(NULL) < 0)
|
||||
return error(_("index file corrupt"));
|
||||
|
||||
|
|
|
@ -711,7 +711,7 @@ static int checkout(int submodule_progress)
|
|||
setup_work_tree();
|
||||
|
||||
lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
hold_locked_index(lock_file, 1);
|
||||
hold_locked_index(lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
memset(&opts, 0, sizeof opts);
|
||||
opts.update = 1;
|
||||
|
|
|
@ -351,7 +351,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
|
|||
|
||||
if (interactive) {
|
||||
char *old_index_env = NULL;
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
|
||||
refresh_cache_or_die(refresh_flags);
|
||||
|
||||
|
@ -396,7 +396,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
|
|||
* (B) on failure, rollback the real index.
|
||||
*/
|
||||
if (all || (also && pathspec.nr)) {
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
add_files_to_cache(also ? prefix : NULL, &pathspec, 0);
|
||||
refresh_cache_or_die(refresh_flags);
|
||||
update_main_cache_tree(WRITE_TREE_SILENT);
|
||||
|
@ -416,7 +416,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
|
|||
* We still need to refresh the index here.
|
||||
*/
|
||||
if (!only && !pathspec.nr) {
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
refresh_cache_or_die(refresh_flags);
|
||||
if (active_cache_changed
|
||||
|| !cache_tree_fully_valid(active_cache_tree))
|
||||
|
@ -468,7 +468,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
|
|||
if (read_cache() < 0)
|
||||
die(_("cannot read the index"));
|
||||
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
add_remove_files(&partial);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
update_main_cache_tree(WRITE_TREE_SILENT);
|
||||
|
|
|
@ -634,7 +634,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
|
|||
{
|
||||
static struct lock_file lock;
|
||||
|
||||
hold_locked_index(&lock, 1);
|
||||
hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
if (active_cache_changed &&
|
||||
write_locked_index(&the_index, &lock, COMMIT_LOCK))
|
||||
|
@ -671,7 +671,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
|
|||
for (j = common; j; j = j->next)
|
||||
commit_list_insert(j->item, &reversed);
|
||||
|
||||
hold_locked_index(&lock, 1);
|
||||
hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
|
||||
clean = merge_recursive(&o, head,
|
||||
remoteheads->item, reversed, &result);
|
||||
if (clean < 0)
|
||||
|
@ -781,7 +781,7 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
|
|||
struct commit_list *parents, **pptr = &parents;
|
||||
static struct lock_file lock;
|
||||
|
||||
hold_locked_index(&lock, 1);
|
||||
hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
if (active_cache_changed &&
|
||||
write_locked_index(&the_index, &lock, COMMIT_LOCK))
|
||||
|
|
|
@ -126,7 +126,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
|||
if (--argc < 1)
|
||||
usage_with_options(builtin_mv_usage, builtin_mv_options);
|
||||
|
||||
hold_locked_index(&lock_file, 1);
|
||||
hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
if (read_cache() < 0)
|
||||
die(_("index file corrupt"));
|
||||
|
||||
|
|
|
@ -150,7 +150,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
|
|||
argc = parse_options(argc, argv, unused_prefix, read_tree_options,
|
||||
read_tree_usage, 0);
|
||||
|
||||
hold_locked_index(&lock_file, 1);
|
||||
hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
prefix_set = opts.prefix ? 1 : 0;
|
||||
if (1 < opts.merge + opts.reset + prefix_set)
|
||||
|
|
|
@ -354,7 +354,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
|
|||
|
||||
if (reset_type != SOFT) {
|
||||
struct lock_file *lock = xcalloc(1, sizeof(*lock));
|
||||
hold_locked_index(lock, 1);
|
||||
hold_locked_index(lock, LOCK_DIE_ON_ERROR);
|
||||
if (reset_type == MIXED) {
|
||||
int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
|
||||
if (read_from_tree(&pathspec, &oid, intent_to_add))
|
||||
|
|
|
@ -292,7 +292,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
|
|||
if (!index_only)
|
||||
setup_work_tree();
|
||||
|
||||
hold_locked_index(&lock_file, 1);
|
||||
hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
|
||||
|
||||
if (read_cache() < 0)
|
||||
die(_("index file corrupt"));
|
||||
|
|
|
@ -1012,6 +1012,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
|||
/* We can't free this memory, it becomes part of a linked list parsed atexit() */
|
||||
lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
/* we will diagnose later if it turns out that we need to update it */
|
||||
newfd = hold_locked_index(lock_file, 0);
|
||||
if (newfd < 0)
|
||||
lock_error = errno;
|
||||
|
|
|
@ -2124,7 +2124,7 @@ int merge_recursive_generic(struct merge_options *o,
|
|||
}
|
||||
}
|
||||
|
||||
hold_locked_index(lock, 1);
|
||||
hold_locked_index(lock, LOCK_DIE_ON_ERROR);
|
||||
clean = merge_recursive(o, head_commit, next_commit, ca,
|
||||
result);
|
||||
if (clean < 0)
|
||||
|
|
|
@ -1425,12 +1425,9 @@ static int read_index_extension(struct index_state *istate,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int hold_locked_index(struct lock_file *lk, int die_on_error)
|
||||
int hold_locked_index(struct lock_file *lk, int lock_flags)
|
||||
{
|
||||
return hold_lock_file_for_update(lk, get_index_file(),
|
||||
die_on_error
|
||||
? LOCK_DIE_ON_ERROR
|
||||
: 0);
|
||||
return hold_lock_file_for_update(lk, get_index_file(), lock_flags);
|
||||
}
|
||||
|
||||
int read_index(struct index_state *istate)
|
||||
|
|
2
rerere.c
2
rerere.c
|
@ -708,7 +708,7 @@ static void update_paths(struct string_list *update)
|
|||
{
|
||||
int i;
|
||||
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
|
||||
for (i = 0; i < update->nr; i++) {
|
||||
struct string_list_item *item = &update->items[i];
|
||||
|
|
|
@ -370,7 +370,7 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
|
|||
char **xopt;
|
||||
static struct lock_file index_lock;
|
||||
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
|
||||
read_cache();
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ static struct lock_file index_lock;
|
|||
int cmd_main(int ac, const char **av)
|
||||
{
|
||||
setup_git_directory();
|
||||
hold_locked_index(&index_lock, 1);
|
||||
hold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);
|
||||
if (read_cache() < 0)
|
||||
die("unable to read index file");
|
||||
active_cache_tree = NULL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче