diff options
author | Junio C Hamano <junkio@cox.net> | 2005-05-07 21:55:21 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-05-07 21:55:21 -0700 |
commit | 192268c197c0f143989662f648b1d900014e7d89 (patch) | |
tree | 54db11a2f64efe7aba6cdedba4398f7228f6c646 /update-cache.c | |
parent | 0f1e4f04013fec0ba8a51a93fc5d3ec6df706168 (diff) | |
download | git-192268c197c0f143989662f648b1d900014e7d89.tar.gz git-192268c197c0f143989662f648b1d900014e7d89.tar.xz |
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>
Diffstat (limited to 'update-cache.c')
-rw-r--r-- | update-cache.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/update-cache.c b/update-cache.c index 735d19920..1e4e62cc4 100644 --- a/update-cache.c +++ b/update-cache.c @@ -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; |