dav/sync.c

changeset 217
12bad63cf5a8
parent 216
16d6b97fbf33
child 218
5f1f7602cf77
equal deleted inserted replaced
216:16d6b97fbf33 217:12bad63cf5a8
68 CmdArgs *args = cmd_parse_args(argc - 2, argv + 2); 68 CmdArgs *args = cmd_parse_args(argc - 2, argv + 2);
69 if(!args) { 69 if(!args) {
70 print_usage(argv[0]); 70 print_usage(argv[0]);
71 return -1; 71 return -1;
72 } 72 }
73
74 xmlGenericErrorFunc fnc = xmlerrorfnc;
75 initGenericErrorDefaultFunc(&fnc);
76 ctx = dav_context_new();
77 ctx->key_input = util_key_input;
78 load_config(ctx);
79
80 // copy proxy config
81 memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy));
82 memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy));
83
84 if(load_sync_config()) {
85 return EXIT_FAILURE;
86 }
87
88 int ret = EXIT_FAILURE; 73 int ret = EXIT_FAILURE;
74
75 int loadcfg = 1;
76 if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) {
77 fprintf(stderr, "dav-sync %s\n", DAV_VERSION);
78 loadcfg = 0;
79 }
80
81 if(loadcfg) {
82 xmlGenericErrorFunc fnc = xmlerrorfnc;
83 initGenericErrorDefaultFunc(&fnc);
84 ctx = dav_context_new();
85 ctx->key_input = util_key_input;
86 load_config(ctx);
87
88 // copy proxy config
89 memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy));
90 memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy));
91
92 if(load_sync_config()) {
93 return EXIT_FAILURE;
94 }
95 }
96
89 if(!strcmp(cmd, "pull")) { 97 if(!strcmp(cmd, "pull")) {
90 ret = cmd_pull(args); 98 ret = cmd_pull(args);
91 } else if(!strcmp(cmd, "push")) { 99 } else if(!strcmp(cmd, "push")) {
92 ret = cmd_push(args); 100 ret = cmd_push(args);
101 } else if(!strcmp(cmd, "resolve-conflicts")) {
102 ret = cmd_resolve_conflicts(args);
103 } else if(!strcmp(cmd, "delete-conflicts")) {
104 ret = cmd_delete_conflicts(args);
93 } else if(!strcmp(cmd, "trash-info")) { 105 } else if(!strcmp(cmd, "trash-info")) {
94 ret = cmd_trash_info(args); 106 ret = cmd_trash_info(args);
95 } else if(!strcmp(cmd, "empty-trash")) { 107 } else if(!strcmp(cmd, "empty-trash")) {
96 ret = cmd_empty_trash(args); 108 ret = cmd_empty_trash(args);
97 } else if(!strcmp(cmd, "add-directory")) { 109 } else if(!strcmp(cmd, "add-directory")) {
98 ret = cmd_add_directory(args); 110 ret = cmd_add_directory(args);
99 } else if(!strcmp(cmd, "list-directories")) { 111 } else if(!strcmp(cmd, "list-directories")) {
100 ret = list_syncdirs(); 112 ret = list_syncdirs();
101 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) {
102 fprintf(stderr, "dav-sync %s\n", DAV_VERSION);
103 } 113 }
104 114
105 // TODO: cleanup sync config (don't forget to call regfree for regex) 115 // TODO: cleanup sync config (don't forget to call regfree for regex)
106 116
107 return ret; 117 return ret;
1062 dav_resource_free(res); 1072 dav_resource_free(res);
1063 1073
1064 return ret; 1074 return ret;
1065 } 1075 }
1066 1076
1077
1078 int cmd_resolve_conflicts(CmdArgs *a) {
1079 if(a->argc != 1) {
1080 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
1081 return -1;
1082 }
1083
1084 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
1085 if(!dir) {
1086 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
1087 return -1;
1088 }
1089
1090 SyncDatabase *db = load_db(dir->database);
1091 if(!db) {
1092 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
1093 return -1;
1094 }
1095
1096 // remove conflicts
1097 int num_conflict = db->conflict->count;
1098 //TODO: ucx_map_free_content(db->conflict, destr);
1099 ucx_map_clear(db->conflict);
1100
1101 // store db
1102 if(store_db(db, dir->database)) {
1103 fprintf(stderr, "Cannot store sync db\n");
1104 fprintf(stderr, "Abort\n");
1105 return -1; // TODO: don't return here
1106 }
1107
1108 // Report
1109 char *str_conflict = num_conflict == 1 ? "conflict" : "conflicts";
1110 printf("Result: %d %s resolved\n", num_conflict, str_conflict);
1111
1112 return 0;
1113 }
1114
1115 int cmd_delete_conflicts(CmdArgs *a) {
1116 if(a->argc != 1) {
1117 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
1118 return -1;
1119 }
1120
1121 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
1122 if(!dir) {
1123 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
1124 return -1;
1125 }
1126
1127 SyncDatabase *db = load_db(dir->database);
1128 if(!db) {
1129 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
1130 return -1;
1131 }
1132
1133 int num_del = 0;
1134 int num_err = 0;
1135
1136 // delete all conflict files
1137 UcxMapIterator i = ucx_map_iterator(db->conflict);
1138 LocalResource *res;
1139 UCX_MAP_FOREACH(key, res, i) {
1140 printf("delete: %s\n", res->path);
1141 char *path = util_concat_path(dir->path, res->path);
1142 if(unlink(path)) {
1143 if(errno != ENOENT) {
1144 perror("unlink");
1145 num_err++;
1146 }
1147 } else {
1148 num_del++;
1149 }
1150 free(path);
1151 }
1152 //TODO: ucx_map_free_content(db->conflict, destr);
1153 ucx_map_clear(db->conflict);
1154
1155 // store db
1156 if(store_db(db, dir->database)) {
1157 fprintf(stderr, "Cannot store sync db\n");
1158 fprintf(stderr, "Abort\n");
1159 return -1; // TODO: don't return here
1160 }
1161
1162 // Report
1163 char *str_delete = num_del == 1 ? "file" : "files";
1164 char *str_error = num_err == 1 ? "error" : "errors";
1165 printf("Result: %d conflict %s deleted, %d %s\n",
1166 num_del, str_delete,
1167 num_err, str_error);
1168
1169 return 0;
1170 }
1171
1172
1067 // TODO: remove code dup (main.c ls_size_str) 1173 // TODO: remove code dup (main.c ls_size_str)
1068 static char* size_str(uint64_t size) { 1174 static char* size_str(uint64_t size) {
1069 char *str = malloc(16); 1175 char *str = malloc(16);
1070 1176
1071 if(size < 0x400) { 1177 if(size < 0x400) {

mercurial