dav/sync.c

changeset 296
bb49953b1cf8
parent 294
dd5c0ebdf54f
child 299
c517502d3e38
equal deleted inserted replaced
295:8ac7b8d56115 296:bb49953b1cf8
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;
385 // unlock repository 396 // unlock repository
386 if(locked) { 397 if(locked) {
387 if(dav_unlock(root)) { 398 if(dav_unlock(root)) {
388 print_resource_error(sn, "/"); 399 print_resource_error(sn, "/");
389 ret = -1; 400 ret = -1;
401 } else {
402 locked = FALSE;
390 } 403 }
391 } 404 }
392 405
393 // store db 406 // store db
394 if(store_db(db, dir->database)) { 407 if(store_db(db, dir->database)) {
396 ret = -2; 409 ret = -2;
397 } 410 }
398 411
399 // cleanup 412 // cleanup
400 dav_session_destroy(sn); 413 dav_session_destroy(sn);
414
415 if(!locked && locktokenfile) {
416 remove(locktokenfile);
417 }
401 418
402 // Report 419 // Report
403 if(ret != -2) { 420 if(ret != -2) {
404 char *str_success = sync_success == 1 ? "file" : "files"; 421 char *str_success = sync_success == 1 ? "file" : "files";
405 char *str_delete = sync_delete == 1 ? "file" : "files"; 422 char *str_delete = sync_delete == 1 ? "file" : "files";
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

mercurial