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