From: Alex Riesen Date: Fri, 26 Sep 2008 22:56:46 +0000 (+0200) Subject: Add remove_path: a function to remove as much as possible of a path X-Git-Tag: v1.6.0.3~57 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4a92d1bfb784b09641180d164e7d719080165dc4;p=git-core%2Fgit.git Add remove_path: a function to remove as much as possible of a path The function has two potential users which both managed to get wrong their implementations (the one in builtin-rm.c one has a memleak, and builtin-merge-recursive.c scribles over its const argument). Signed-off-by: Alex Riesen Signed-off-by: Shawn O. Pearce --- diff --git a/dir.c b/dir.c index 109e05b01..cfaa28ff2 100644 --- a/dir.c +++ b/dir.c @@ -837,3 +837,23 @@ void setup_standard_excludes(struct dir_struct *dir) if (excludes_file && !access(excludes_file, R_OK)) add_excludes_from_file(dir, excludes_file); } + +int remove_path(const char *name) +{ + char *slash; + + if (unlink(name) && errno != ENOENT) + return -1; + + slash = strrchr(name, '/'); + if (slash) { + char *dirs = xstrdup(name); + slash = dirs + (slash - name); + do { + *slash = '\0'; + } while (rmdir(dirs) && (slash = strrchr(dirs, '/'))); + free(dirs); + } + return 0; +} + diff --git a/dir.h b/dir.h index 2df15defb..278ee4229 100644 --- a/dir.h +++ b/dir.h @@ -81,4 +81,7 @@ extern int is_inside_dir(const char *dir); extern void setup_standard_excludes(struct dir_struct *dir); extern int remove_dir_recursively(struct strbuf *path, int only_empty); +/* tries to remove the path with empty directories along it, ignores ENOENT */ +extern int remove_path(const char *path); + #endif