diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-06-30 15:33:45 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-07-29 12:22:30 -0700 |
commit | a0f4afbe87ddda7902e36350d163dea146166550 (patch) | |
tree | 9c90142f461b86ef045d672793b95f135be1970f /dir.c | |
parent | 0a53e9ddeaddad63ad106860237bbf53411d11a7 (diff) | |
download | git-a0f4afbe87ddda7902e36350d163dea146166550.tar.gz git-a0f4afbe87ddda7902e36350d163dea146166550.tar.xz |
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.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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] != '/') |