login

<     >

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