dav/sync.c

changeset 563
3dffe58a573f
parent 561
5e6df4f502d3
child 564
fb482734e429
--- a/dav/sync.c	Wed Apr 10 13:48:44 2019 +0200
+++ b/dav/sync.c	Wed Apr 10 13:50:24 2019 +0200
@@ -163,6 +163,8 @@
             tid = start_sighandler(&mutex);
             ret = cmd_restore(args);
             stop_sighandler(&mutex, tid);
+        } else if(!strcmp(cmd, "list-conflicts")) {
+            ret = cmd_list_conflicts(args);
         } else if(!strcmp(cmd, "resolve-conflicts")) {
             ret = cmd_resolve_conflicts(args);
         } else if(!strcmp(cmd, "delete-conflicts")) {
@@ -217,6 +219,7 @@
     fprintf(stderr, "        archive [-cldSRM] [-t <tags>] <directory>\n");
     fprintf(stderr,
         "        restore [-ldRM] [-V <version>] [-s <directory>] [file...]\n");
+    fprintf(stderr, "        list-conflicts <directory>\n");
     fprintf(stderr, "        resolve-conflicts <directory>\n");
     fprintf(stderr, "        delete-conflicts <directory>\n");
     fprintf(stderr, "        trash-info <directory>\n");
@@ -3841,6 +3844,62 @@
     return ret;
 }
 
+int cmd_list_conflicts(CmdArgs *a) {
+    if(a->argc != 1) {
+        fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
+        return -1;
+    }
+    
+    SyncDirectory *dir = scfg_get_dir(a->argv[0]);
+    if(!dir) {
+        fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
+        return -1;
+    }
+    if(scfg_check_dir(dir)) {
+        return -1;
+    }
+    
+    SyncDatabase *db = load_db(dir->database);
+    if(!db) {
+        fprintf(stderr, "Cannot load database file: %s\n", dir->database);
+        return -1;
+    }
+    
+    remove_deleted_conflicts(dir, db);
+    
+    // get all conflict sources
+    UcxMapIterator i = ucx_map_iterator(db->conflict);
+    LocalResource *res;
+    UcxList* conflict_sources = NULL;
+    UCX_MAP_FOREACH(key, res, i) {
+        conflict_sources = ucx_list_append(conflict_sources, res->conflict_source);
+    }
+    
+    // print unique conflict sources
+    conflict_sources = ucx_list_sort(conflict_sources, ucx_cmp_str, NULL);
+    UCX_FOREACH(elem, conflict_sources) {
+        char* path = elem->data;
+        if(cmd_getoption(a, "verbose")) {
+            int confl_count = 1;
+            while(elem->next && !strcmp(elem->next->data, path)) {
+                elem = elem->next;
+                ++confl_count;
+            }
+            printf("%s (%d)\n", path, confl_count);
+        } else {
+            printf("%s\n", path);
+            while(elem->next && !strcmp(elem->next->data, path)) {
+                elem = elem->next;
+            }
+        }
+    }
+    
+    // cleanup
+    destroy_db(db);    
+    
+    return 0;
+}
+
 
 // TODO: remove code dup (main.c ls_size_str)
 static char* size_str(uint64_t size) {

mercurial