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:
Alex Riesen 2008-09-27 00:56:46 +02:00 коммит произвёл Shawn O. Pearce
Родитель b9b378a001
Коммит 4a92d1bfb7
2 изменённых файлов: 23 добавлений и 0 удалений

20
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;
}

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 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