summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorAlex Riesen <raa.lkml@gmail.com>2008-09-26 22:56:46 (GMT)
committerShawn O. Pearce <spearce@spearce.org>2008-09-29 15:37:07 (GMT)
commit4a92d1bfb784b09641180d164e7d719080165dc4 (patch)
treeacefaa70210fdc745519f64de33745d3d0c742cc /dir.c
parentb9b378a001d35a64a30a652a45f8084ee2be6cdf (diff)
downloadgit-4a92d1bfb784b09641180d164e7d719080165dc4.zip
git-4a92d1bfb784b09641180d164e7d719080165dc4.tar.gz
git-4a92d1bfb784b09641180d164e7d719080165dc4.tar.bz2
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>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/dir.c b/dir.c
index 109e05b..cfaa28f 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;
+}
+