summaryrefslogtreecommitdiff
path: root/apply.c
diff options
context:
space:
mode:
Diffstat (limited to 'apply.c')
-rw-r--r--apply.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/apply.c b/apply.c
index 8bff604dbe..76dba93c97 100644
--- a/apply.c
+++ b/apply.c
@@ -30,8 +30,8 @@ struct gitdiff_data {
static void git_apply_config(void)
{
- git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
- git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
+ git_config_get_string("apply.whitespace", &apply_default_whitespace);
+ git_config_get_string("apply.ignorewhitespace", &apply_default_ignorewhitespace);
git_config(git_xmerge_config, NULL);
}
@@ -3178,7 +3178,7 @@ static int apply_binary(struct apply_state *state,
return 0; /* deletion patch */
}
- if (has_object_file(&oid)) {
+ if (has_object(the_repository, &oid, 0)) {
/* We already have the postimage */
enum object_type type;
unsigned long size;
@@ -3740,6 +3740,7 @@ static int check_preimage(struct apply_state *state,
#define EXISTS_IN_INDEX 1
#define EXISTS_IN_WORKTREE 2
+#define EXISTS_IN_INDEX_AS_ITA 3
static int check_to_create(struct apply_state *state,
const char *new_name,
@@ -3747,10 +3748,23 @@ static int check_to_create(struct apply_state *state,
{
struct stat nst;
- if (state->check_index &&
- index_name_pos(state->repo->index, new_name, strlen(new_name)) >= 0 &&
- !ok_if_exists)
- return EXISTS_IN_INDEX;
+ if (state->check_index && (!ok_if_exists || !state->cached)) {
+ int pos;
+
+ pos = index_name_pos(state->repo->index, new_name, strlen(new_name));
+ if (pos >= 0) {
+ struct cache_entry *ce = state->repo->index->cache[pos];
+
+ /* allow ITA, as they do not yet exist in the index */
+ if (!ok_if_exists && !(ce->ce_flags & CE_INTENT_TO_ADD))
+ return EXISTS_IN_INDEX;
+
+ /* ITA entries can never match working tree files */
+ if (!state->cached && (ce->ce_flags & CE_INTENT_TO_ADD))
+ return EXISTS_IN_INDEX_AS_ITA;
+ }
+ }
+
if (state->cached)
return 0;
@@ -3935,6 +3949,9 @@ static int check_patch(struct apply_state *state, struct patch *patch)
case EXISTS_IN_INDEX:
return error(_("%s: already exists in index"), new_name);
break;
+ case EXISTS_IN_INDEX_AS_ITA:
+ return error(_("%s: does not match index"), new_name);
+ break;
case EXISTS_IN_WORKTREE:
return error(_("%s: already exists in working directory"),
new_name);