diff -r 78a25071ed88 -r 3dffe58a573f dav/sync.c --- 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 ] \n"); fprintf(stderr, " restore [-ldRM] [-V ] [-s ] [file...]\n"); + fprintf(stderr, " list-conflicts \n"); fprintf(stderr, " resolve-conflicts \n"); fprintf(stderr, " delete-conflicts \n"); fprintf(stderr, " trash-info \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) {