Add git-update-cache --replace option.
When "path" exists as a file or a symlink in the index, an attempt to add "path/file" is refused because it results in file vs directory conflict. Similarly when "path/file1", "path/file2", etc. exist, an attempt to add "path" as a file or a symlink is refused. With git-update-cache --replace, these existing entries that conflict with the entry being added are automatically removed from the cache, with warning messages. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
@ -13,7 +13,7 @@
|
||||
* like "update-cache *" and suddenly having all the object
|
||||
* files be revision controlled.
|
||||
*/
|
||||
static int allow_add = 0, allow_remove = 0, not_new = 0;
|
||||
static int allow_add = 0, allow_remove = 0, allow_replace = 0, not_new = 0;
|
||||
|
||||
/* Three functions to allow overloaded pointer return; see linux/err.h */
|
||||
static inline void *ERR_PTR(long error)
|
||||
@ -53,7 +53,7 @@ static void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
|
||||
|
||||
static int add_file_to_cache(char *path)
|
||||
{
|
||||
int size, namelen;
|
||||
int size, namelen, option;
|
||||
struct cache_entry *ce;
|
||||
struct stat st;
|
||||
int fd;
|
||||
@ -95,7 +95,9 @@ static int add_file_to_cache(char *path)
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return add_cache_entry(ce, allow_add);
|
||||
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
|
||||
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
|
||||
return add_cache_entry(ce, option);
|
||||
}
|
||||
|
||||
static int match_data(int fd, void *buffer, unsigned long size)
|
||||
@ -273,7 +275,7 @@ inside:
|
||||
|
||||
static int add_cacheinfo(char *arg1, char *arg2, char *arg3)
|
||||
{
|
||||
int size, len;
|
||||
int size, len, option;
|
||||
unsigned int mode;
|
||||
unsigned char sha1[20];
|
||||
struct cache_entry *ce;
|
||||
@ -294,7 +296,9 @@ static int add_cacheinfo(char *arg1, char *arg2, char *arg3)
|
||||
memcpy(ce->name, arg3, len);
|
||||
ce->ce_flags = htons(len);
|
||||
ce->ce_mode = create_ce_mode(mode);
|
||||
return add_cache_entry(ce, allow_add);
|
||||
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
|
||||
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
|
||||
return add_cache_entry(ce, option);
|
||||
}
|
||||
|
||||
static const char *lockfile_name = NULL;
|
||||
@ -343,6 +347,10 @@ int main(int argc, char **argv)
|
||||
allow_add = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(path, "--replace")) {
|
||||
allow_replace = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(path, "--remove")) {
|
||||
allow_remove = 1;
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user