From e6d184aa029ebb6bd3de64e74b19b5ae1ff2b229 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 27 Feb 2005 07:40:09 +0000 Subject: [PATCH] A simple patch for adding last-match filter-rule files. --- last-match.diff | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 last-match.diff diff --git a/last-match.diff b/last-match.diff new file mode 100644 index 0000000..0421349 --- /dev/null +++ b/last-match.diff @@ -0,0 +1,61 @@ +This adds the ability to put rules into a filter/include/exclude file +in last-match-wins order. All you need to do is to start the file with +this line: + +[last-match] + +--- orig/exclude.c 2005-02-26 03:22:59 ++++ exclude.c 2005-02-26 03:22:20 +@@ -73,6 +73,7 @@ static BOOL parent_dirscan = False; + static struct filter_struct **mergelist_parents; + static int mergelist_cnt = 0; + static int mergelist_size = 0; ++static int reversing_rules = 0; + + /* Each filter_list_struct describes a singly-linked list by keeping track + * of both the head and tail pointers. The list is slightly unusual in that +@@ -231,6 +232,9 @@ static void add_rule(struct filter_list_ + if (!listp->tail) { + ret->next = listp->head; + listp->head = listp->tail = ret; ++ } else if (reversing_rules) { ++ ret->next = listp->head; ++ listp->head = ret; + } else { + ret->next = listp->tail->next; + listp->tail->next = ret; +@@ -959,6 +963,7 @@ void parse_filter_file(struct filter_lis + char line[MAXPATHLEN+MAX_RULE_PREFIX+1]; /* +1 for trailing slash. */ + char *eob = line + sizeof line - 1; + int word_split = mflags & MATCHFLG_WORD_SPLIT; ++ int save_reversing_rules = reversing_rules; + + if (!fname || !*fname) + return; +@@ -994,6 +999,7 @@ void parse_filter_file(struct filter_lis + } + dirbuf[dirbuf_len] = '\0'; + ++ reversing_rules = 0; + while (1) { + char *s = line; + int ch, overflow = 0; +@@ -1017,6 +1023,10 @@ void parse_filter_file(struct filter_lis + s = line; + } + *s = '\0'; ++ if (*line == '[' && strcmp(line+1, "last-match]") == 0) { ++ reversing_rules = 1; ++ continue; ++ } + /* Skip an empty token and (when line parsing) comments. */ + if (*line && (word_split || (*line != ';' && *line != '#'))) + parse_rule(listp, line, mflags, xflags); +@@ -1024,6 +1034,7 @@ void parse_filter_file(struct filter_lis + break; + } + fclose(fp); ++ reversing_rules = save_reversing_rules; + } + + /* If the "for_xfer" flag is set, the prefix is made compatible with the -- 2.34.1