90 } else { |
90 } else { |
91 return ucx_list_append(list, regex); |
91 return ucx_list_append(list, regex); |
92 } |
92 } |
93 } |
93 } |
94 |
94 |
95 static int scfg_load_filter(xmlNode *node, |
95 static int scfg_load_filter( |
96 UcxList **include, UcxList **exclude) { |
96 xmlNode *node, |
|
97 UcxList **include, |
|
98 UcxList **exclude, |
|
99 SyncTagFilter **tagfilter) |
|
100 { |
97 node = node->children; |
101 node = node->children; |
98 |
102 |
99 while(node) { |
103 while(node) { |
100 if(node->type == XML_ELEMENT_NODE) { |
104 if(node->type == XML_ELEMENT_NODE) { |
101 char *value = util_xml_get_text(node); |
105 char *value = util_xml_get_text(node); |
104 *include = add_regex_pattern(*include, value, node->line); |
108 *include = add_regex_pattern(*include, value, node->line); |
105 } |
109 } |
106 } else if(xstreq(node->name, "exclude")) { |
110 } else if(xstreq(node->name, "exclude")) { |
107 if(value) { |
111 if(value) { |
108 *exclude = add_regex_pattern(*exclude, value, node->line); |
112 *exclude = add_regex_pattern(*exclude, value, node->line); |
|
113 } |
|
114 } else if(xstreq(node->name, "tags")) { |
|
115 if(value) { |
|
116 *tagfilter = parse_tagfilter_string(value); |
|
117 if(!*tagfilter) { |
|
118 print_error( |
|
119 node->line, |
|
120 "malformed tag filter: %s\n", |
|
121 value); |
|
122 return 1; |
|
123 } |
109 } |
124 } |
110 } else { |
125 } else { |
111 print_error(node->line, |
126 print_error(node->line, |
112 "unknown filter config element: %s\n", node->name); |
127 "unknown filter config element: %s\n", node->name); |
113 return 1; |
128 return 1; |
240 char *repository = NULL; |
255 char *repository = NULL; |
241 char *database = NULL; |
256 char *database = NULL; |
242 TagConfig *tagconfig = NULL; |
257 TagConfig *tagconfig = NULL; |
243 UcxList *include = NULL; |
258 UcxList *include = NULL; |
244 UcxList *exclude = NULL; |
259 UcxList *exclude = NULL; |
|
260 SyncTagFilter *tagfilter = NULL; |
245 int max_retry = 0; |
261 int max_retry = 0; |
246 int allow_cmd = SYNC_CMD_PULL | SYNC_CMD_PUSH | SYNC_CMD_ARCHIVE; |
262 int allow_cmd = SYNC_CMD_PULL | SYNC_CMD_PUSH | SYNC_CMD_ARCHIVE; |
247 bool backuppull = false; |
263 bool backuppull = false; |
248 bool lockpull = false; |
264 bool lockpull = false; |
249 bool lockpush = false; |
265 bool lockpush = false; |
273 } else if(xstreq(node->name, "collection")) { |
289 } else if(xstreq(node->name, "collection")) { |
274 collection = value; |
290 collection = value; |
275 } else if(xstreq(node->name, "repository")) { |
291 } else if(xstreq(node->name, "repository")) { |
276 repository = value; |
292 repository = value; |
277 } else if(xstreq(node->name, "filter")) { |
293 } else if(xstreq(node->name, "filter")) { |
278 if(scfg_load_filter(node, &include, &exclude)) { |
294 if(scfg_load_filter(node, &include, &exclude, &tagfilter)) { |
279 return 1; |
295 return 1; |
280 } |
296 } |
281 } else if(xstreq(node->name, "database")) { |
297 } else if(xstreq(node->name, "database")) { |
282 database = value; |
298 database = value; |
283 } else if(xstreq(node->name, "tags")) { |
299 } else if(xstreq(node->name, "tags")) { |