strbuf_init(&buf, 0);
- if ((tpatch = in_fn_table(patch->old_name)) != NULL) {
+ if (!(patch->is_copy || patch->is_rename) &&
+ ((tpatch = in_fn_table(patch->old_name)) != NULL)) {
if (tpatch == (struct patch *) -1) {
return error("patch %s has been renamed/deleted",
patch->old_name);
static int check_preimage(struct patch *patch, struct cache_entry **ce, struct stat *st)
{
const char *old_name = patch->old_name;
- struct patch *tpatch;
+ struct patch *tpatch = NULL;
int stat_ret = 0;
unsigned st_mode = 0;
return 0;
assert(patch->is_new <= 0);
- if ((tpatch = in_fn_table(old_name)) != NULL) {
+
+ if (!(patch->is_copy || patch->is_rename) &&
+ (tpatch = in_fn_table(old_name)) != NULL) {
if (tpatch == (struct patch *) -1) {
return error("%s: has been deleted/renamed", old_name);
}
if (stat_ret && errno != ENOENT)
return error("%s: %s", old_name, strerror(errno));
}
+
if (check_index && !tpatch) {
int pos = cache_name_pos(old_name, strlen(old_name));
if (pos < 0) {