From 5b0b57fd91ce684679fdac1c3ae3a50c6aa3943e Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 4 Sep 2016 22:18:32 +0200 Subject: [PATCH] apply: learn to use a different index file Sometimes we want to apply in a different index file. Before the apply functionality was libified it was possible to use the GIT_INDEX_FILE environment variable, for this purpose. But now, as the apply functionality has been libified, it should be possible to do that in a libified way. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- apply.c | 27 +++++++++++++++++++++------ apply.h | 1 + 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/apply.c b/apply.c index a9a743cf9c..289cbd0b8c 100644 --- a/apply.c +++ b/apply.c @@ -3993,12 +3993,21 @@ static int check_patch_list(struct apply_state *state, struct patch *patch) return err; } +static int read_apply_cache(struct apply_state *state) +{ + if (state->index_file) + return read_cache_from(state->index_file); + else + return read_cache(); +} + /* This function tries to read the sha1 from the current index */ -static int get_current_sha1(const char *path, unsigned char *sha1) +static int get_current_sha1(struct apply_state *state, const char *path, + unsigned char *sha1) { int pos; - if (read_cache() < 0) + if (read_apply_cache(state) < 0) return -1; pos = cache_name_pos(path, strlen(path)); if (pos < 0) @@ -4071,7 +4080,7 @@ static int build_fake_ancestor(struct apply_state *state, struct patch *list) ; /* ok */ } else if (!patch->lines_added && !patch->lines_deleted) { /* mode-only change: update the current */ - if (get_current_sha1(patch->old_name, sha1)) + if (get_current_sha1(state, patch->old_name, sha1)) return error("mode change for %s, which is not " "in current HEAD", name); } else @@ -4675,10 +4684,16 @@ static int apply_patch(struct apply_state *state, state->apply = 0; state->update_index = state->check_index && state->apply; - if (state->update_index && state->newfd < 0) - state->newfd = hold_locked_index(state->lock_file, 1); + if (state->update_index && state->newfd < 0) { + if (state->index_file) + state->newfd = hold_lock_file_for_update(state->lock_file, + state->index_file, + LOCK_DIE_ON_ERROR); + else + state->newfd = hold_locked_index(state->lock_file, 1); + } - if (state->check_index && read_cache() < 0) { + if (state->check_index && read_apply_cache(state) < 0) { error(_("unable to read index file")); res = -128; goto end; diff --git a/apply.h b/apply.h index 9fec5363ab..b3d6783d55 100644 --- a/apply.h +++ b/apply.h @@ -63,6 +63,7 @@ struct apply_state { int unsafe_paths; /* Other non boolean parameters */ + const char *index_file; enum apply_verbosity apply_verbosity; const char *fake_ancestor; const char *patch_input_file;