dav/sync.c

changeset 221
e22c29b7ee2f
parent 220
f1b3873a6525
child 222
7b73058d782e
equal deleted inserted replaced
220:f1b3873a6525 221:e22c29b7ee2f
119 119
120 void print_usage(char *cmd) { 120 void print_usage(char *cmd) {
121 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd); 121 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd);
122 122
123 fprintf(stderr, "Commands:\n"); 123 fprintf(stderr, "Commands:\n");
124 fprintf(stderr, " pull [-c] <directory>\n"); 124 fprintf(stderr, " pull [-cld] <directory>\n");
125 fprintf(stderr, " push [-c] <directory>\n"); 125 fprintf(stderr, " push [-cld] <directory>\n");
126 fprintf(stderr, " resolve-conflicts <directory>\n"); 126 fprintf(stderr, " resolve-conflicts <directory>\n");
127 fprintf(stderr, " delete-conflicts <directory>\n"); 127 fprintf(stderr, " delete-conflicts <directory>\n");
128 fprintf(stderr, " trash-info <directory>\n"); 128 fprintf(stderr, " trash-info <directory>\n");
129 fprintf(stderr, " empty-trash <directory>\n\n"); 129 fprintf(stderr, " empty-trash <directory>\n\n");
130 130
131 fprintf(stderr, "Options:\n"); 131 fprintf(stderr, "Options:\n");
132 fprintf(stderr, " -c Disable conflict detection\n"); 132 fprintf(stderr, " -c Disable conflict detection\n");
133 fprintf(stderr, " -l Lock the repository before access\n");
134 fprintf(stderr, " -d Don't lock the repository\n");
133 //fprintf(stderr, " -r Read changes from stdin\n\n"); 135 //fprintf(stderr, " -r Read changes from stdin\n\n");
134 fprintf(stderr, " -v verbose output (all commands)\n\n"); 136 fprintf(stderr, " -v verbose output (all commands)\n\n");
135 137
136 fprintf(stderr, "Config commands:\n"); 138 fprintf(stderr, "Config commands:\n");
137 fprintf(stderr, " add-directory\n"); 139 fprintf(stderr, " add-directory\n");
221 if (cmd_getoption(a, "verbose")) { 223 if (cmd_getoption(a, "verbose")) {
222 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); 224 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
223 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); 225 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
224 } 226 }
225 227
228 // lock repository
229 DavBool locked = FALSE;
230 DavResource *root = dav_resource_new(sn, "/");
231 root->iscollection = TRUE;
232 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
233 if(dav_lock(root)) {
234 print_resource_error(sn, "/");
235 dav_session_destroy(sn);
236 fprintf(stderr, "Abort\n");
237 return -1;
238 }
239 locked = TRUE;
240 }
241
242 int ret = 0;
226 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); 243 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity");
227 if(!ls) { 244 if(!ls) {
228 print_resource_error(sn, "/"); 245 print_resource_error(sn, "/");
246 if(locked) {
247 if(dav_unlock(root)) {
248 print_resource_error(sn, "/");
249 }
250 }
251
229 fprintf(stderr, "Abort\n"); 252 fprintf(stderr, "Abort\n");
230 253
231 dav_session_destroy(sn); 254 dav_session_destroy(sn);
232 // TODO: free 255 // TODO: free
233 return -1; 256 return -1;
238 int sync_error = 0; 261 int sync_error = 0;
239 262
240 if(!ls->children) { 263 if(!ls->children) {
241 // TODO: free 264 // TODO: free
242 fprintf(stderr, "Repository is empty\n"); 265 fprintf(stderr, "Repository is empty\n");
266 if(locked) {
267 if(dav_unlock(root)) {
268 print_resource_error(sn, "/");
269 }
270 }
243 return 0; // empty repository 271 return 0; // empty repository
244 } 272 }
245 273
246 UcxMap *svrres = ucx_map_new(db->resources->count); 274 UcxMap *svrres = ucx_map_new(db->resources->count);
247 275
303 sync_remove_local_directory(dir, local_dir); 331 sync_remove_local_directory(dir, local_dir);
304 } 332 }
305 ucx_map_free(db->resources); 333 ucx_map_free(db->resources);
306 db->resources = svrres; 334 db->resources = svrres;
307 335
336 // unlock repository
337 if(locked) {
338 if(dav_unlock(root)) {
339 print_resource_error(sn, "/");
340 ret = -1;
341 }
342 }
343
308 // store db 344 // store db
309 if(store_db(db, dir->database)) { 345 if(store_db(db, dir->database)) {
310 fprintf(stderr, "Cannot store sync db\n"); 346 fprintf(stderr, "Cannot store sync db\n");
311 fprintf(stderr, "Abort\n"); 347 ret = -1;
312 return -1; // TODO: don't return here
313 } 348 }
314 349
315 // TODO: cleanup - BUT DONT CLEANUP SYNC CONFIG (do this in main!) 350 // TODO: cleanup - BUT DONT CLEANUP SYNC CONFIG (do this in main!)
316 dav_session_destroy(sn); 351 dav_session_destroy(sn);
317 352
318 // Report 353 // Report
319 char *str_success = sync_success == 1 ? "file" : "files"; 354 if(ret == 0) {
320 char *str_delete = sync_delete == 1 ? "file" : "files"; 355 char *str_success = sync_success == 1 ? "file" : "files";
321 char *str_error = sync_error == 1 ? "error" : "errors"; 356 char *str_delete = sync_delete == 1 ? "file" : "files";
322 printf("Result: %d %s pulled, %d %s deleted, %d %s\n", 357 char *str_error = sync_error == 1 ? "error" : "errors";
323 sync_success, str_success, 358 printf("Result: %d %s pulled, %d %s deleted, %d %s\n",
324 sync_delete,str_delete, 359 sync_success, str_success,
325 sync_error, str_error); 360 sync_delete,str_delete,
326 361 sync_error, str_error);
327 return 0; 362 }
363
364 return ret;
328 } 365 }
329 366
330 int sync_get_resource( 367 int sync_get_resource(
331 CmdArgs *a, 368 CmdArgs *a,
332 SyncDirectory *dir, 369 SyncDirectory *dir,
664 if (cmd_getoption(a, "verbose")) { 701 if (cmd_getoption(a, "verbose")) {
665 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); 702 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
666 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); 703 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
667 } 704 }
668 705
669 DavResource *testsvr = dav_query(sn, "select - from / with depth = 0"); 706 DavResource *root = dav_query(sn, "select - from / with depth = 0");
670 if(!testsvr) { 707 if(!root) {
671 print_resource_error(sn, "/"); 708 print_resource_error(sn, "/");
672 dav_session_destroy(sn); 709 dav_session_destroy(sn);
673 fprintf(stderr, "Abort\n"); 710 fprintf(stderr, "Abort\n");
674 return -1; 711 return -1;
675 } 712 }
676 713
677 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection 714 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection
715
716 // lock repository
717 DavBool locked = FALSE;
718 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
719 if(dav_lock(root)) {
720 print_resource_error(sn, "/");
721 dav_session_destroy(sn);
722 fprintf(stderr, "Abort\n");
723 return -1;
724 }
725 locked = TRUE;
726 }
678 727
679 int sync_success = 0; 728 int sync_success = 0;
680 int sync_delete = 0; 729 int sync_delete = 0;
681 int sync_skipped = 0; 730 int sync_skipped = 0;
682 int sync_error = 0; 731 int sync_error = 0;
757 } 806 }
758 } 807 }
759 ucx_map_free(db->resources); 808 ucx_map_free(db->resources);
760 db->resources = lclres; 809 db->resources = lclres;
761 810
811 // unlock repository
812 if(locked) {
813 if(dav_unlock(root)) {
814 print_resource_error(sn, "/");
815 ret = -1;
816 }
817 }
818
762 // store db 819 // store db
763 if(store_db(db, dir->database)) { 820 if(store_db(db, dir->database)) {
764 fprintf(stderr, "Cannot store sync db\n"); 821 fprintf(stderr, "Cannot store sync db\n");
765 return -1; 822 ret = -1;
766 } 823 }
767 824
768 // TODO: free res 825 // cleanup
826 dav_session_destroy(sn);
769 827
770 // Report 828 // Report
771 char *str_success = sync_success == 1 ? "file" : "files"; 829 if(ret == 0) {
772 char *str_delete = sync_delete == 1 ? "file" : "files"; 830 char *str_success = sync_success == 1 ? "file" : "files";
773 char *str_skipped = sync_delete == 1 ? "file" : "files"; 831 char *str_delete = sync_delete == 1 ? "file" : "files";
774 char *str_error = sync_error == 1 ? "error" : "errors"; 832 char *str_skipped = sync_delete == 1 ? "file" : "files";
775 printf("Result: %d %s pushed, %d %s deleted, %d %s skipped, %d %s\n", 833 char *str_error = sync_error == 1 ? "error" : "errors";
776 sync_success, str_success, 834 printf("Result: %d %s pushed, %d %s deleted, %d %s skipped, %d %s\n",
777 sync_delete,str_delete, 835 sync_success, str_success,
778 sync_skipped,str_skipped, 836 sync_delete,str_delete,
779 sync_error, str_error); 837 sync_skipped,str_skipped,
780 838 sync_error, str_error);
781 return 0; 839 }
840
841 return ret;
782 } 842 }
783 843
784 UcxList* local_scan(SyncDirectory *dir, SyncDatabase *db) { 844 UcxList* local_scan(SyncDirectory *dir, SyncDatabase *db) {
785 UcxList *resources = NULL; 845 UcxList *resources = NULL;
786 846
903 res->path = util_concat_path(path, "/"); 963 res->path = util_concat_path(path, "/");
904 res->last_modified = s.st_mtime; 964 res->last_modified = s.st_mtime;
905 res->isdirectory = 1; 965 res->isdirectory = 1;
906 return res; 966 return res;
907 } 967 }
908 return NULL;
909 } 968 }
910 969
911 int local_resource_is_changed(SyncDirectory *dir, SyncDatabase *db, LocalResource *res) { 970 int local_resource_is_changed(SyncDirectory *dir, SyncDatabase *db, LocalResource *res) {
912 LocalResource *db_res = ucx_map_cstr_get(db->resources, res->path); 971 LocalResource *db_res = ucx_map_cstr_get(db->resources, res->path);
913 if(db_res) { 972 if(db_res) {

mercurial