dav/sync.c

changeset 191
0e45b04236a7
parent 190
a76e43d89f55
child 192
d10194a51304
equal deleted inserted replaced
190:a76e43d89f55 191:0e45b04236a7
43 43
44 #include "config.h" 44 #include "config.h"
45 #include "scfg.h" 45 #include "scfg.h"
46 #include "sopt.h" 46 #include "sopt.h"
47 #include "db.h" 47 #include "db.h"
48 #include "error.h"
48 49
49 #include "sync.h" 50 #include "sync.h"
50 #include "ucx/properties.h" 51 #include "ucx/properties.h"
51 52
52 static DavContext *ctx; 53 static DavContext *ctx;
88 ret = cmd_pull(args); 89 ret = cmd_pull(args);
89 } else if(!strcmp(cmd, "push")) { 90 } else if(!strcmp(cmd, "push")) {
90 ret = cmd_push(args); 91 ret = cmd_push(args);
91 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { 92 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) {
92 #ifdef DEBUG 93 #ifdef DEBUG
93 fprintf(stderr, "dav-synv %s unstable\n", DAV_VERSION); 94 fprintf(stderr, "dav-sync %s unstable\n", DAV_VERSION);
94 #else 95 #else
95 fprintf(stderr, "dav-sync %s\n", DAV_VERSION); 96 fprintf(stderr, "dav-sync %s\n", DAV_VERSION);
96 #endif 97 #endif
97 } 98 }
98 99
104 void print_usage(char *cmd) { 105 void print_usage(char *cmd) {
105 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd); 106 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd);
106 107
107 fprintf(stderr, "Commands:\n"); 108 fprintf(stderr, "Commands:\n");
108 fprintf(stderr, " pull [-c] <directory>\n"); 109 fprintf(stderr, " pull [-c] <directory>\n");
109 fprintf(stderr, " push [-r] <directory>\n\n"); 110 //fprintf(stderr, " push [-r] <directory>\n\n");
111 fprintf(stderr, " push <directory>\n\n");
110 112
111 fprintf(stderr, "Options:\n"); 113 fprintf(stderr, "Options:\n");
112 fprintf(stderr, " -c Disable conflict detection\n"); 114 fprintf(stderr, " -c Disable conflict detection\n\n");
113 fprintf(stderr, " -r Read changes from stdin\n\n"); 115 //fprintf(stderr, " -r Read changes from stdin\n\n");
114 } 116 }
115 117
116 static int res_matches_filter(SyncDirectory *dir, char *res_path) { 118 static int res_matches_filter(SyncDirectory *dir, char *res_path) {
117 // trash filter 119 // trash filter
118 if (dir->trash) { 120 if (dir->trash) {
189 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); 191 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
190 } 192 }
191 193
192 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); 194 DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity");
193 if(!ls) { 195 if(!ls) {
194 fprintf(stderr, "Error\n"); 196 print_resource_error(sn, "/");
195 // TODO: free 197 // TODO: free
196 return -1; 198 return -1;
197 } 199 }
198 200
199 if(!ls->children) { 201 if(!ls->children) {
200 // TODO: free 202 // TODO: free
203 fprintf(stderr, "Repository is empty\n");
201 return 0; // empty repository 204 return 0; // empty repository
202 } 205 }
203 206
204 UcxMap *svrres = ucx_map_new(db->resources->count); 207 UcxMap *svrres = ucx_map_new(db->resources->count);
205 208
589 LocalResource *local_res = elm->data; 592 LocalResource *local_res = elm->data;
590 if (!res_matches_filter(dir, local_res->path+1)) { 593 if (!res_matches_filter(dir, local_res->path+1)) {
591 // upload every changed file 594 // upload every changed file
592 if (local_resource_is_changed(dir, db, local_res)) { 595 if (local_resource_is_changed(dir, db, local_res)) {
593 DavResource *res = dav_resource_new(sn, local_res->path); 596 DavResource *res = dav_resource_new(sn, local_res->path);
597 if(!res) {
598 print_resource_error(sn, local_res->path);
599 break;
600 }
594 601
595 if(local_res->isdirectory) { 602 if(local_res->isdirectory) {
596 printf("mkcol: %s\n", local_res->path); 603 printf("mkcol: %s\n", local_res->path);
597 if(sync_mkdir(dir, res, local_res)) { 604 if(sync_mkdir(dir, res, local_res)) {
598 // TODO: I don't know what to do now 605 print_resource_error(sn, res->path);
606 dav_resource_free(res);
607 break;
599 } 608 }
600 } else { 609 } else {
601 printf("put: %s\n", local_res->path); 610 printf("put: %s\n", local_res->path);
602 if(sync_put_resource(dir, res, local_res)) { 611 if(sync_put_resource(dir, res, local_res)) {
603 // TODO: I don't know what to do now 612 print_resource_error(sn, res->path);
613 dav_resource_free(res);
614 break;
604 } 615 }
605 } 616 }
606 dav_resource_free(res); 617 dav_resource_free(res);
607 } 618 }
608 619
619 LocalResource *local; 630 LocalResource *local;
620 UCX_MAP_FOREACH(key, local, i) { 631 UCX_MAP_FOREACH(key, local, i) {
621 if (!res_matches_filter(dir, local->path+1)) { 632 if (!res_matches_filter(dir, local->path+1)) {
622 if(sync_delete_remote_resource(sn, local)) { 633 if(sync_delete_remote_resource(sn, local)) {
623 ucx_map_cstr_put(lclres, local->path, local); 634 ucx_map_cstr_put(lclres, local->path, local);
635 if(sn->error != DAV_NOT_FOUND) {
636 print_resource_error(sn, local->path);
637 break;
638 }
624 } 639 }
625 } 640 }
626 } 641 }
627 ucx_map_free(db->resources); 642 ucx_map_free(db->resources);
628 db->resources = lclres; 643 db->resources = lclres;

mercurial