2014-11-13 16:46:17 (UTC-02:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Add delete support.
diff --git a/config.h b/config.h index b32bf65..b035754 100644 --- a/config.h +++ b/config.h @@ -19,6 +19,7 @@ #define RVK_TG_MARK "m" #define RVK_INVMARK "M" #define RVK_MARKALL "a" +#define RVK_DELETE "X" /* Colors available: DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, MAGENTA, WHITE. */ #define RVC_CWD GREEN diff --git a/rover.c b/rover.c index ab6b85f..4cf7b7f 100644 --- a/rover.c +++ b/rover.c @@ -415,6 +415,48 @@ cd(int reset) update(); } +static void +delete_dir(const char *path) +{ + DIR *dp; + struct dirent *ep; + struct stat statbuf; + char subpath[FILENAME_MAX]; + + if((dp = opendir(path)) == NULL) + return; + while ((ep = readdir(dp))) { + if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..")) + continue; + sprintf(subpath, "%s%s", path, ep->d_name); + stat(subpath, &statbuf); + if (S_ISDIR(statbuf.st_mode)) { + strcat(subpath, "/"); + delete_dir(subpath); + } + else + unlink(subpath); + } + closedir(dp); + rmdir(path); +} + +static void +delete_marked() +{ + int i; + char path[FILENAME_MAX]; + + for (i = 0; i < rover.marks.bulk; i++) + if (rover.marks.entries[i]) { + sprintf(path, "%s%s", rover.marks.dirpath, rover.marks.entries[i]); + if (strchr(rover.marks.entries[i], '/')) + delete_dir(path); + else + unlink(path); + } +} + /* Do a fork-exec to external program (e.g. $EDITOR). */ static void spawn() @@ -711,6 +753,10 @@ main(int argc, char *argv[]) } update(); } + else if (!strcmp(key, RVK_DELETE)) { + delete_marked(); + cd(1); + } } if (rover.nfiles) free_rows(&rover.rows, rover.nfiles);