This patch causes the --cvs-exclude option to prefix the names listed in each dir's CVS/Entries file as per-dir includes before the dir's list of excludes taken from the .cvsignore file. --- orig/exclude.c 2005-04-28 15:56:50 +++ exclude.c 2005-04-07 18:06:34 @@ -442,6 +442,14 @@ void *push_local_filters(const char *dir set_filter_dir(dir, dirlen); } + if (ex->match_flags & MATCHFLG_CVS_IGNORE + && strlcpy(dirbuf + dirbuf_len, "CVS/Entries", + MAXPATHLEN - dirbuf_len) < MAXPATHLEN - dirbuf_len) { + /* Start by adding include rules for all the names in CVS/Entries. */ + parse_filter_file(lp, dirbuf, + MATCHFLG_NO_PREFIXES | MATCHFLG_INCLUDE, + XFLG_CVS_ENTRIES); + } if (strlcpy(dirbuf + dirbuf_len, ex->pattern, MAXPATHLEN - dirbuf_len) < MAXPATHLEN - dirbuf_len) { parse_filter_file(lp, dirbuf, ex->match_flags, @@ -957,6 +965,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 slash_parse = xflags & XFLG_CVS_ENTRIES ? 1 : 0; if (!fname || !*fname) return; @@ -1001,6 +1010,29 @@ void parse_filter_file(struct filter_lis continue; break; } + switch (slash_parse) { + case 1: + if (ch == '/') { + s = line; + slash_parse = 2; + continue; + } + break; + case 2: + if (ch == '/') { + slash_parse = 3; + continue; + } + break; + case 3: + if (ch == '\n' || ch == '\r') { + slash_parse = 1; + goto double_break; + } + continue; + default: + break; + } if (word_split && isspace(ch)) break; if (eol_nulls? !ch : (ch == '\n' || ch == '\r')) @@ -1010,6 +1042,7 @@ void parse_filter_file(struct filter_lis else overflow = 1; } + double_break: if (overflow) { rprintf(FERROR, "discarding over-long filter: %s...\n", line); s = line; --- orig/rsync.h 2005-05-03 17:11:01 +++ rsync.h 2005-04-07 18:06:34 @@ -115,6 +115,7 @@ #define XFLG_FATAL_ERRORS (1<<0) #define XFLG_OLD_PREFIXES (1<<1) #define XFLG_ANCHORED2ABS (1<<2) +#define XFLG_CVS_ENTRIES (1<<3) #define PERMS_REPORT (1<<0) #define PERMS_SKIP_MTIME (1<<1)