apply: move "already exists" logic to check_to_create()

The check_to_create_blob() function used to check only the case
where we are applying to the working tree.  Rename the function to
check_to_create() and make it also responsible for checking the case
where we apply to the index.  Also make its caller responsible for
issuing an error message.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 2012-06-07 14:10:19 -07:00
parent 813ebf8221
commit ec15be0267
1 changed files with 29 additions and 11 deletions

View File

@ -3249,9 +3249,21 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
return 0; return 0;
} }


static int check_to_create_blob(const char *new_name, int ok_if_exists)
#define EXISTS_IN_INDEX 1
#define EXISTS_IN_WORKTREE 2

static int check_to_create(const char *new_name, int ok_if_exists)
{ {
struct stat nst; struct stat nst;

if (check_index &&
cache_name_pos(new_name, strlen(new_name)) >= 0 &&
!ok_if_exists)
return EXISTS_IN_INDEX;
if (cached)
return 0;

if (!lstat(new_name, &nst)) { if (!lstat(new_name, &nst)) {
if (S_ISDIR(nst.st_mode) || ok_if_exists) if (S_ISDIR(nst.st_mode) || ok_if_exists)
return 0; return 0;
@ -3265,10 +3277,10 @@ static int check_to_create_blob(const char *new_name, int ok_if_exists)
if (has_symlink_leading_path(new_name, strlen(new_name))) if (has_symlink_leading_path(new_name, strlen(new_name)))
return 0; return 0;


return error(_("%s: already exists in working directory"), new_name); return EXISTS_IN_WORKTREE;
} } else if ((errno != ENOENT) && (errno != ENOTDIR)) {
else if ((errno != ENOENT) && (errno != ENOTDIR))
return error("%s: %s", new_name, strerror(errno)); return error("%s: %s", new_name, strerror(errno));
}
return 0; return 0;
} }


@ -3316,15 +3328,21 @@ static int check_patch(struct patch *patch)


if (new_name && if (new_name &&
((0 < patch->is_new) | (0 < patch->is_rename) | patch->is_copy)) { ((0 < patch->is_new) | (0 < patch->is_rename) | patch->is_copy)) {
if (check_index && int err = check_to_create(new_name, ok_if_exists);
cache_name_pos(new_name, strlen(new_name)) >= 0 &&
!ok_if_exists) switch (err) {
case 0:
break; /* happy */
case EXISTS_IN_INDEX:
return error(_("%s: already exists in index"), new_name); return error(_("%s: already exists in index"), new_name);
if (!cached) { break;
int err = check_to_create_blob(new_name, ok_if_exists); case EXISTS_IN_WORKTREE:
if (err) return error(_("%s: already exists in working directory"),
return err; new_name);
default:
return err;
} }

if (!patch->new_mode) { if (!patch->new_mode) {
if (0 < patch->is_new) if (0 < patch->is_new)
patch->new_mode = S_IFREG | 0644; patch->new_mode = S_IFREG | 0644;