dav/sync.c

changeset 220
f1b3873a6525
parent 219
9792cfe63b80
child 221
e22c29b7ee2f
equal deleted inserted replaced
219:9792cfe63b80 220:f1b3873a6525
672 dav_session_destroy(sn); 672 dav_session_destroy(sn);
673 fprintf(stderr, "Abort\n"); 673 fprintf(stderr, "Abort\n");
674 return -1; 674 return -1;
675 } 675 }
676 676
677 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection
678
677 int sync_success = 0; 679 int sync_success = 0;
678 int sync_delete = 0; 680 int sync_delete = 0;
679 int sync_skipped = 0; 681 int sync_skipped = 0;
680 int sync_error = 0; 682 int sync_error = 0;
681 683
710 print_resource_error(sn, res->path); 712 print_resource_error(sn, res->path);
711 ret = -1; 713 ret = -1;
712 sync_error++; 714 sync_error++;
713 } 715 }
714 } else { 716 } else {
717 if(cdt && remote_resource_is_changed(sn, dir, db, local_res)) {
718 printf("conflict: %s\n", local_res->path);
719 sync_skipped++;
720 continue;
721 }
722
715 printf("put: %s\n", local_res->path); 723 printf("put: %s\n", local_res->path);
716 if(sync_put_resource(dir, res, local_res, &sync_success)) { 724 if(sync_put_resource(dir, res, local_res, &sync_success)) {
717 sync_error++; 725 sync_error++;
718 print_resource_error(sn, res->path); 726 print_resource_error(sn, res->path);
719 ret = -1; 727 ret = -1;
912 } 920 }
913 } 921 }
914 return 1; 922 return 1;
915 } 923 }
916 924
925 int remote_resource_is_changed(
926 DavSession *sn,
927 SyncDirectory *dir,
928 SyncDatabase *db,
929 LocalResource *res)
930 {
931 DavResource *remote = dav_get(sn, res->path, "D:getetag");
932 int ret = 0;
933 if(remote) {
934 char *etag = dav_get_property(remote, "D:getetag");
935 if(etag && res->etag) {
936 sstr_t e = sstr(etag);
937 if(sstrprefix(e, S("W/"))) {
938 e = sstrsubs(e, 2);
939 }
940 if(strcmp(e.ptr, res->etag)) {
941 ret = 1;
942 }
943 }
944 dav_resource_free(remote);
945 }
946 return ret;
947 }
948
917 949
918 int sync_set_status(DavResource *res, char *status) { 950 int sync_set_status(DavResource *res, char *status) {
919 DavResource *resource = dav_resource_new(res->session, res->path); 951 DavResource *resource = dav_resource_new(res->session, res->path);
920 dav_set_property(resource, "idav:status", status); 952 dav_set_property(resource, "idav:status", status);
921 int ret = dav_store(resource); 953 int ret = dav_store(resource);

mercurial