From 42b3a460976757dbe7c4755fd60c3f542a9fb1e2 Mon Sep 17 00:00:00 2001 From: schu Date: Thu, 9 Jun 2011 19:51:33 +0200 Subject: [PATCH] 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 --- src/fileops.c | 25 +++++++++++++++++++++++++ src/fileops.h | 3 +++ 2 files changed, 28 insertions(+) diff --git a/src/fileops.c b/src/fileops.c index edde3aa46..afca0329f 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -301,6 +301,31 @@ int git_futils_mkdir_r(const char *path, int mode) 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, const char *name2, int len2, int isdir2) { diff --git a/src/fileops.h b/src/fileops.h index cc88682ac..a2f66a5da 100644 --- a/src/fileops.h +++ b/src/fileops.h @@ -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); +/* Recursively remove an empty directory structure */ +extern int git_futils_rmdir_recurs(const char *path); + /* Taken from git.git */ static inline int is_dot_or_dotdot(const char *name) { -- 2.39.5