dav/sync.c

changeset 392
4853fbad5014
parent 391
10305c5b0a16
child 394
4826f5fdd865
equal deleted inserted replaced
391:10305c5b0a16 392:4853fbad5014
254 } 254 }
255 return 1; 255 return 1;
256 } 256 }
257 257
258 SyncTagFilter* parse_tagfilter_string(const char* filterstring) { 258 SyncTagFilter* parse_tagfilter_string(const char* filterstring) {
259 SyncTagFilter* tagfilter = malloc(sizeof(SyncTagFilter));
259 if (!filterstring) { 260 if (!filterstring) {
260 return NULL; 261 memset(tagfilter, 0, sizeof(SyncTagFilter));
261 } 262 return tagfilter;
262 263 }
263 SyncTagFilter* tagfilter = malloc(sizeof(SyncTagFilter)); 264
264 tagfilter->mode = DAV_SYNC_TAGFILTER_AND; 265 tagfilter->mode = DAV_SYNC_TAGFILTER_AND;
265 tagfilter->subfilter_count = 0; 266 tagfilter->subfilter_count = 0;
266 tagfilter->tags = parse_csv_taglist(filterstring, strlen(filterstring)); 267 tagfilter->tags = parse_csv_taglist(filterstring, strlen(filterstring));
267 268
268 return tagfilter; 269 return tagfilter;
337 } 338 }
338 } 339 }
339 } 340 }
340 341
341 static int res_matches_tags(DavResource *res, SyncTagFilter *tagfilter) { 342 static int res_matches_tags(DavResource *res, SyncTagFilter *tagfilter) {
342 if(!tagfilter) { 343 if(tagfilter->mode == DAV_SYNC_TAGFILTER_OFF) {
343 return 1; 344 return 1;
344 } 345 }
345 346
346 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_NS, "tags"); 347 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_NS, "tags");
347 UcxList *res_tags = parse_dav_xml_taglist(tagsprop); 348 UcxList *res_tags = parse_dav_xml_taglist(tagsprop);
412 if(a->argc != 1) { 413 if(a->argc != 1) {
413 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); 414 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
414 return -1; 415 return -1;
415 } 416 }
416 417
418 // if there are syntax errors in the command line, fail asap.
419 SyncTagFilter* tagfilter = parse_tagfilter_string(cmd_getoption(a, "tags"));
420 if (!tagfilter) {
421 fprintf(stderr, "Malformed tag filter\n");
422 return -1;
423 }
424
417 SyncDirectory *dir = scfg_get_dir(a->argv[0]); 425 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
418 if(!dir) { 426 if(!dir) {
419 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); 427 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
420 return -1; 428 return -1;
421 } 429 }
529 while(res) { 537 while(res) {
530 if (res_matches_filter(dir, res->path)) { 538 if (res_matches_filter(dir, res->path)) {
531 res = res->next; 539 res = res->next;
532 continue; 540 continue;
533 } 541 }
534 542
535 if (!res_matches_tags(res, 543 if (!res_matches_tags(res, tagfilter)) {
536 parse_tagfilter_string(cmd_getoption(a, "tags")))) {
537 if(!cmd_getoption(a, "remove")) { 544 if(!cmd_getoption(a, "remove")) {
538 localres_keep(db, res->path); 545 localres_keep(db, res->path);
539 } 546 }
540 res = res->next; 547 res = res->next;
541 continue; 548 continue;

mercurial