summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-06-30 22:33:45 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-07-29 19:22:30 (GMT)
commita0f4afbe87ddda7902e36350d163dea146166550 (patch)
tree9c90142f461b86ef045d672793b95f135be1970f /dir.c
parent0a53e9ddeaddad63ad106860237bbf53411d11a7 (diff)
downloadgit-a0f4afbe87ddda7902e36350d163dea146166550.zip
git-a0f4afbe87ddda7902e36350d163dea146166550.tar.gz
git-a0f4afbe87ddda7902e36350d163dea146166550.tar.bz2
clean: require double -f options to nuke nested git repository and work tree
When you have an embedded git work tree in your work tree (be it an orphaned submodule, or an independent checkout of an unrelated project), "git clean -d -f" blindly descended into it and removed everything. This is rarely what the user wants. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/dir.c b/dir.c
index e05b850..d0999ba 100644
--- a/dir.c
+++ b/dir.c
@@ -861,12 +861,20 @@ int is_empty_dir(const char *path)
return ret;
}
-int remove_dir_recursively(struct strbuf *path, int only_empty)
+int remove_dir_recursively(struct strbuf *path, int flag)
{
- DIR *dir = opendir(path->buf);
+ DIR *dir;
struct dirent *e;
int ret = 0, original_len = path->len, len;
+ int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);
+ unsigned char submodule_head[20];
+ if ((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&
+ !resolve_gitlink_ref(path->buf, "HEAD", submodule_head))
+ /* Do not descend and nuke a nested git work tree. */
+ return 0;
+
+ dir = opendir(path->buf);
if (!dir)
return -1;
if (path->buf[original_len - 1] != '/')