diff options
author | Alex Riesen <raa.lkml@gmail.com> | 2008-09-27 00:56:46 +0200 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2008-09-29 08:37:07 -0700 |
commit | 4a92d1bfb784b09641180d164e7d719080165dc4 (patch) | |
tree | acefaa70210fdc745519f64de33745d3d0c742cc | |
parent | b9b378a001d35a64a30a652a45f8084ee2be6cdf (diff) | |
download | git-4a92d1bfb784b09641180d164e7d719080165dc4.tar.gz |
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 <raa.lkml@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r-- | dir.c | 20 | ||||
-rw-r--r-- | dir.h | 3 |
2 files changed, 23 insertions, 0 deletions
@@ -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; +} + @@ -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 |