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; |
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) { |