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)
