1172
return ret;
1173
}
1174
1175
-int remove_dir_recursively(struct strbuf *path, int flag)
1175
+static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
1176
{
1177
DIR *dir;
1178
struct dirent *e;
1179
- int ret = 0, original_len = path->len, len;
1179
+ int ret = 0, original_len = path->len, len, kept_down = 0;
1180
int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);
1181
int keep_toplevel = (flag & REMOVE_DIR_KEEP_TOPLEVEL);
1182
unsigned char submodule_head[20];
1183
1184
if ((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&
1185
- !resolve_gitlink_ref(path->buf, "HEAD", submodule_head))
1185
+ !resolve_gitlink_ref(path->buf, "HEAD", submodule_head)) {
1186
/* Do not descend and nuke a nested git work tree. */
1187
+ if (kept_up)
1188
+ *kept_up = 1;
1189
return 0;
1190
+ }
1191
1189
- flag &= ~(REMOVE_DIR_KEEP_TOPLEVEL|REMOVE_DIR_KEEP_NESTED_GIT);
1192
+ flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;
1193
dir = opendir(path->buf);
1194
if (!dir) {
1195
+ /* an empty dir could be removed even if it is unreadble */
1196
if (!keep_toplevel)
1197
return rmdir(path->buf);
1198
else
1212
if (lstat(path->buf, &st))
1213
; /* fall thru */
1214
else if (S_ISDIR(st.st_mode)) {
1211
- if (!remove_dir_recursively(path, flag))
1215
+ if (!remove_dir_recurse(path, flag, &kept_down))
1216
continue; /* happy */
1217
} else if (!only_empty && !unlink(path->buf))
1218
continue; /* happy, too */
1224
closedir(dir);
1225
1226
strbuf_setlen(path, original_len);
1223
- if (!ret && !keep_toplevel)
1227
+ if (!ret && !keep_toplevel && !kept_down)
1228
ret = rmdir(path->buf);
1229
+ else if (kept_up)
1230
+ /*
1231
+ * report the uplevel that it is not an error that we
1232
+ * did not rmdir() our directory.
1233
+ */
1234
+ *kept_up = !ret;
1235
return ret;
1236
}
1237
1238
+int remove_dir_recursively(struct strbuf *path, int flag)
1239
+{
1240
+ return remove_dir_recurse(path, flag, NULL);
1241
+}
1242
+
1243
void setup_standard_excludes(struct dir_struct *dir)
1244
{
1245
const char *path;