Browse Source

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>
maint
Alex Riesen 16 years ago committed by Shawn O. Pearce
parent
commit
4a92d1bfb7
  1. 20
      dir.c
  2. 3
      dir.h

20
dir.c

@ -837,3 +837,23 @@ void setup_standard_excludes(struct dir_struct *dir) @@ -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;
}


3
dir.h

@ -81,4 +81,7 @@ extern int is_inside_dir(const char *dir); @@ -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

Loading…
Cancel
Save