249 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); |
249 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); |
250 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); |
250 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); |
251 } |
251 } |
252 |
252 |
253 // lock repository |
253 // lock repository |
|
254 char *locktokenfile = NULL; |
254 DavBool locked = FALSE; |
255 DavBool locked = FALSE; |
255 DavResource *root = dav_resource_new(sn, "/"); |
256 DavResource *root = dav_resource_new(sn, "/"); |
256 root->iscollection = TRUE; |
257 root->iscollection = TRUE; |
257 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) { |
258 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) { |
258 if(dav_lock(root)) { |
259 if(dav_lock(root)) { |
264 DavLock *lock = dav_get_lock(sn, "/"); |
265 DavLock *lock = dav_get_lock(sn, "/"); |
265 if(lock) { |
266 if(lock) { |
266 printf("Lock-Token: %s\n", lock->token); |
267 printf("Lock-Token: %s\n", lock->token); |
267 } |
268 } |
268 locked = TRUE; |
269 locked = TRUE; |
|
270 locktokenfile = create_locktoken_file(dir->name, lock->token); |
269 } |
271 } |
270 |
272 |
271 int ret = 0; |
273 int ret = 0; |
272 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); |
274 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); |
273 if(!ls) { |
275 if(!ls) { |
274 print_resource_error(sn, "/"); |
276 print_resource_error(sn, "/"); |
275 if(locked) { |
277 if(locked) { |
276 if(dav_unlock(root)) { |
278 if(dav_unlock(root)) { |
277 print_resource_error(sn, "/"); |
279 print_resource_error(sn, "/"); |
|
280 } else { |
|
281 locked = FALSE; |
278 } |
282 } |
279 } |
283 } |
280 |
284 |
281 fprintf(stderr, "Abort\n"); |
285 fprintf(stderr, "Abort\n"); |
282 |
286 |
287 if(!ls->iscollection) { |
291 if(!ls->iscollection) { |
288 fprintf(stderr, "%s is not a collection.\nAbort.\n", ls->path); |
292 fprintf(stderr, "%s is not a collection.\nAbort.\n", ls->path); |
289 if(locked) { |
293 if(locked) { |
290 if(dav_unlock(root)) { |
294 if(dav_unlock(root)) { |
291 print_resource_error(sn, "/"); |
295 print_resource_error(sn, "/"); |
|
296 } else { |
|
297 locked = FALSE; |
292 } |
298 } |
293 } |
299 } |
294 // TODO: free |
300 // TODO: free |
295 dav_session_destroy(sn); |
301 dav_session_destroy(sn); |
|
302 |
|
303 if(!locked && locktokenfile) { |
|
304 remove(locktokenfile); |
|
305 } |
|
306 |
296 return -1; |
307 return -1; |
297 } |
308 } |
298 |
309 |
299 int sync_success = 0; |
310 int sync_success = 0; |
300 int sync_delete = 0; |
311 int sync_delete = 0; |
770 |
787 |
771 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection |
788 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection |
772 |
789 |
773 // lock repository |
790 // lock repository |
774 DavBool locked = FALSE; |
791 DavBool locked = FALSE; |
|
792 char *locktokenfile = NULL; |
775 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) { |
793 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) { |
776 if(dav_lock(root)) { |
794 if(dav_lock(root)) { |
777 print_resource_error(sn, "/"); |
795 print_resource_error(sn, "/"); |
778 dav_session_destroy(sn); |
796 dav_session_destroy(sn); |
779 fprintf(stderr, "Abort\n"); |
797 fprintf(stderr, "Abort\n"); |
782 DavLock *lock = dav_get_lock(sn, "/"); |
800 DavLock *lock = dav_get_lock(sn, "/"); |
783 if(lock) { |
801 if(lock) { |
784 printf("Lock-Token: %s\n", lock->token); |
802 printf("Lock-Token: %s\n", lock->token); |
785 } |
803 } |
786 locked = TRUE; |
804 locked = TRUE; |
|
805 locktokenfile = create_locktoken_file(dir->name, lock->token); |
787 } |
806 } |
788 |
807 |
789 int sync_success = 0; |
808 int sync_success = 0; |
790 int sync_delete = 0; |
809 int sync_delete = 0; |
791 int sync_skipped = 0; |
810 int sync_skipped = 0; |
882 // unlock repository |
901 // unlock repository |
883 if(locked) { |
902 if(locked) { |
884 if(dav_unlock(root)) { |
903 if(dav_unlock(root)) { |
885 print_resource_error(sn, "/"); |
904 print_resource_error(sn, "/"); |
886 ret = -1; |
905 ret = -1; |
|
906 } else { |
|
907 locked = FALSE; |
887 } |
908 } |
888 } |
909 } |
889 |
910 |
890 // store db |
911 // store db |
891 if(store_db(db, dir->database)) { |
912 if(store_db(db, dir->database)) { |
892 fprintf(stderr, "Cannot store sync db\n"); |
913 fprintf(stderr, "Cannot store sync db\n"); |
893 ret = -2; |
914 ret = -2; |
894 } |
915 } |
895 |
916 |
896 // cleanup |
917 // cleanup |
|
918 if(!locked && locktokenfile) { |
|
919 remove(locktokenfile); |
|
920 } |
|
921 |
897 dav_session_destroy(sn); |
922 dav_session_destroy(sn); |
898 while(resources) { |
923 while(resources) { |
899 UcxList *next = resources->next; |
924 UcxList *next = resources->next; |
900 if(resources->data) { |
925 if(resources->data) { |
901 local_resource_free(resources->data); |
926 local_resource_free(resources->data); |
1736 |
1761 |
1737 ucx_list_free(reponames); |
1762 ucx_list_free(reponames); |
1738 |
1763 |
1739 return ret; |
1764 return ret; |
1740 } |
1765 } |
|
1766 |
|
1767 char* create_locktoken_file(const char *syncdirname, const char *locktoken) { |
|
1768 sstr_t fname = ucx_sprintf("locktoken-%s.txt", syncdirname); |
|
1769 char *path = config_file_path(fname.ptr); |
|
1770 free(fname.ptr); |
|
1771 |
|
1772 FILE *file = fopen(path, "w"); |
|
1773 if(!file) { |
|
1774 perror("Cannot create locktoken file"); |
|
1775 free(path); |
|
1776 } |
|
1777 |
|
1778 fprintf(file, "%s\n", locktoken); |
|
1779 fclose(file); |
|
1780 return path; |
|
1781 } |
|
1782 |