feature: remove/rename sidecar when removing/renaming files.
authorFelipe Barriga Richards <spam@felipebarriga.cl>
Thu, 16 Feb 2017 20:43:26 +0000 (17:43 -0300)
committerFelipe Barriga Richards <spam@felipebarriga.cl>
Thu, 16 Feb 2017 21:06:55 +0000 (18:06 -0300)
ChangeLog
fuse_xattrs.c
passthrough.c
utils.c
utils.h

index da024b17610afaa54e74c9e9a7528a6e713d02c1..167ac054aaee31b3e34f4ae1e4beb239d72bc9d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@ Release 0.2 (2017-02-16)
 * Hide sidecar files by default
 * Added man page
 * Fix crash
+* Remove sidecar when removing a file (same for renaming)
 * Optimization: don't open/close files for every operation
 
 Release 0.1 (2016-10-23)
index b0461a0b399e191bf43631f1311e0c55dca131d2..276d57a09e9f7a18d47738791fef6c31f15cde79 100644 (file)
@@ -167,22 +167,6 @@ static struct fuse_operations xmp_oper = {
         .removexattr = xmp_removexattr,
 };
 
-
-int is_directory(const char *path) {
-    struct stat statbuf;
-    if (stat(path, &statbuf) != 0) {
-        fprintf(stderr, "cannot get source directory status: %s\n", path);
-        return -1;
-    }
-
-    if (!S_ISDIR(statbuf.st_mode)) {
-        fprintf(stderr, "source directory must be a directory: %s\n", path);
-        return -1;
-    }
-
-    return 1;
-}
-
 /**
  * Check if the path is valid. If it's a relative path,
  * prepend the working path.
index b3827ccd91e51d99a09c3c2220157a5b5f87662b..cacc6b49e93f8730c5846dfdf6950bb06ecee45d 100644 (file)
@@ -161,14 +161,25 @@ int xmp_unlink(const char *path) {
 
     char *_path = prepend_source_directory(path);
     res = unlink(_path);
-    free(_path);
 
-    if (res == -1)
+    if (res == -1) {
+        free(_path);
         return -errno;
+    }
+
+    char *sidecar_path = get_sidecar_path(_path);
+    if (is_regular_file(sidecar_path)) {
+        if (unlink(sidecar_path) == -1) {
+            error_print("Error removing sidecar file: %s\n", sidecar_path);
+        }
+    }
+    free(sidecar_path);
+    free(_path);
 
     return 0;
 }
 
+// FIXME: remove sidecar
 int xmp_rmdir(const char *path) {
     int res;
     if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
@@ -214,15 +225,32 @@ int xmp_rename(const char *from, const char *to) {
     char *_from = prepend_source_directory(from);
     char *_to = prepend_source_directory(to);
     res = rename(_from, _to);
-    free(_from);
-    free(_to);
 
-    if (res == -1)
+    if (res == -1) {
+        free(_from);
+        free(_to);
         return -errno;
+    }
+
+    char *from_sidecar_path = get_sidecar_path(_from);
+    char *to_sidecar_path = get_sidecar_path(_to);
+
+    // FIXME: Remove to_sidecar_path if it exists ?
+    if (is_regular_file(from_sidecar_path)) {
+        if (rename(from_sidecar_path, to_sidecar_path) == -1) {
+            error_print("Error renaming sidecar. from: %s to: %s\n", from_sidecar_path, to_sidecar_path);
+        }
+    }
+    free(from_sidecar_path);
+    free(to_sidecar_path);
+
+    free(_from);
+    free(_to);
 
     return 0;
 }
 
+// TODO: handle sidecar file ?
 int xmp_link(const char *from, const char *to) {
     int res;
     if (xattrs_config.show_sidecar == 0) {
diff --git a/utils.c b/utils.c
index 71fe009076b16390cbef5af1030603b734f25196..2f935ab83c02b4b326dcdcf491bdc47eeb570ece 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include "utils.h"
 #include "fuse_xattrs_config.h"
@@ -28,6 +29,34 @@ char *prepend_source_directory(const char *b) {
     return dst;
 }
 
+int is_directory(const char *path) {
+    struct stat statbuf;
+    if (stat(path, &statbuf) != 0) {
+        fprintf(stderr, "cannot get source directory status: %s\n", path);
+        return -1;
+    }
+
+    if (!S_ISDIR(statbuf.st_mode)) {
+        fprintf(stderr, "source directory must be a directory: %s\n", path);
+        return -1;
+    }
+
+    return 1;
+}
+
+int is_regular_file(const char *path) {
+    struct stat statbuf;
+    if (stat(path, &statbuf) != 0) {
+        return -1;
+    }
+
+    if (!S_ISREG(statbuf.st_mode)) {
+        return -1;
+    }
+
+    return 1;
+}
+
 char *get_sidecar_path(const char *path)
 {
     const size_t path_len = strlen(path);
diff --git a/utils.h b/utils.h
index 1c208266cccc4d4e0ed8b71ab4bda51cbe35efd6..3159eaaff9c09165da66c2ef24b89797811569e5 100644 (file)
--- a/utils.h
+++ b/utils.h
@@ -43,4 +43,7 @@ char *prepend_source_directory(const char *b);
 const size_t BINARY_SIDECAR_EXT_SIZE;
 const int filename_is_sidecar(const char *string);
 
+int is_directory(const char *path);
+int is_regular_file(const char *path);
+
 #endif //FUSE_XATTRS_UTILS_H