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>
This commit is contained in:
parent
b9b378a001
commit
4a92d1bfb7
20
dir.c
20
dir.c
@ -837,3 +837,23 @@ void setup_standard_excludes(struct dir_struct *dir)
|
|||||||
if (excludes_file && !access(excludes_file, R_OK))
|
if (excludes_file && !access(excludes_file, R_OK))
|
||||||
add_excludes_from_file(dir, excludes_file);
|
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
3
dir.h
@ -81,4 +81,7 @@ extern int is_inside_dir(const char *dir);
|
|||||||
extern void setup_standard_excludes(struct dir_struct *dir);
|
extern void setup_standard_excludes(struct dir_struct *dir);
|
||||||
extern int remove_dir_recursively(struct strbuf *path, int only_empty);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user