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