Commit 42b3a460 by schu

fileops: add git_futils_rmdir_recurs()

git_futils_rmdir_recurs() shall remove the given directory and all
subdirectories. This happens only if the directories are empty.

Signed-off-by: schu <schu-github@schulog.org>
parent e190da78
...@@ -301,6 +301,31 @@ int git_futils_mkdir_r(const char *path, int mode) ...@@ -301,6 +301,31 @@ int git_futils_mkdir_r(const char *path, int mode)
return GIT_SUCCESS; return GIT_SUCCESS;
} }
static int _rmdir_recurs_cb(void *GIT_UNUSED(nil), char *path)
{
int error = GIT_SUCCESS;
error = git_futils_isdir(path);
if (error == GIT_SUCCESS) {
size_t root_size = strlen(path);
if ((error = git_futils_direach(path, GIT_PATH_MAX, _rmdir_recurs_cb, NULL)) < GIT_SUCCESS)
return git__rethrow(error, "Failed to remove directory `%s`", path);
path[root_size] = '\0';
return p_rmdir(path);
}
return git__rethrow(error, "Failed to remove directory. `%s` is not a directory", path);
}
int git_futils_rmdir_recurs(const char *path)
{
char p[GIT_PATH_MAX];
strncpy(p, path, GIT_PATH_MAX);
return _rmdir_recurs_cb(NULL, p);
}
int git_futils_cmp_path(const char *name1, int len1, int isdir1, int git_futils_cmp_path(const char *name1, int len1, int isdir1,
const char *name2, int len2, int isdir2) const char *name2, int len2, int isdir2)
{ {
......
...@@ -102,6 +102,9 @@ extern int git_futils_mv_withpath(const char *from, const char *to); ...@@ -102,6 +102,9 @@ extern int git_futils_mv_withpath(const char *from, const char *to);
*/ */
extern git_off_t git_futils_filesize(git_file fd); extern git_off_t git_futils_filesize(git_file fd);
/* Recursively remove an empty directory structure */
extern int git_futils_rmdir_recurs(const char *path);
/* Taken from git.git */ /* Taken from git.git */
static inline int is_dot_or_dotdot(const char *name) static inline int is_dot_or_dotdot(const char *name)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment