mirror of
https://github.com/git/git
synced 2024-10-28 19:25:47 +00:00
Allow removal of "path" when "path/file" exists.
When we used to have "path" as a file or a symlink, but now we have "path/file" (or in general, have "path" as a directory), we would want to remove "path" before adding "path/file". The logic in add_file_to_cache() only runs lstat() and does not detect this case and fails to allow removing it in this case. In the opposite case of having "path/file" in the index and having "path" on the filesystem as a file or a symlink we do allow removal of "path/file", so to be symmetric we should allow it as well, without forcing the user to say --force-remove. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
192268c197
commit
4c5abf4282
1 changed files with 12 additions and 3 deletions
|
@ -53,14 +53,23 @@ static void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
|
||||||
|
|
||||||
static int add_file_to_cache(char *path)
|
static int add_file_to_cache(char *path)
|
||||||
{
|
{
|
||||||
int size, namelen, option;
|
int size, namelen, option, status;
|
||||||
struct cache_entry *ce;
|
struct cache_entry *ce;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd;
|
int fd;
|
||||||
char *target;
|
char *target;
|
||||||
|
|
||||||
if (lstat(path, &st) < 0) {
|
status = lstat(path, &st);
|
||||||
if (errno == ENOENT || errno == ENOTDIR) {
|
if (status < 0 || S_ISDIR(st.st_mode)) {
|
||||||
|
/* When we used to have "path" and now we want to add
|
||||||
|
* "path/file", we need a way to remove "path" before
|
||||||
|
* being able to add "path/file". However,
|
||||||
|
* "git-update-cache --remove path" would not work.
|
||||||
|
* --force-remove can be used but this is more user
|
||||||
|
* friendly, especially since we can do the opposite
|
||||||
|
* case just fine without --force-remove.
|
||||||
|
*/
|
||||||
|
if (status == 0 || (errno == ENOENT || errno == ENOTDIR)) {
|
||||||
if (allow_remove)
|
if (allow_remove)
|
||||||
return remove_file_from_cache(path);
|
return remove_file_from_cache(path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue