From f891cd928e6af5984a2df9a29f88b3706f2312fe Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Fri, 8 Apr 2005 06:20:10 +0000 Subject: [PATCH] A potential patch to improve --cvs-exclude. --- cvs-entries.diff | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 cvs-entries.diff diff --git a/cvs-entries.diff b/cvs-entries.diff new file mode 100644 index 0000000..a279991 --- /dev/null +++ b/cvs-entries.diff @@ -0,0 +1,77 @@ +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. + +--- exclude.c 7 Apr 2005 18:06:06 -0000 1.115 ++++ exclude.c 7 Apr 2005 18:06:34 -0000 +@@ -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, +@@ -958,6 +966,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; +@@ -1002,6 +1011,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')) +@@ -1011,6 +1043,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; +--- rsync.h 28 Mar 2005 17:08:47 -0000 1.261 ++++ rsync.h 7 Apr 2005 18:06:34 -0000 +@@ -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) -- 2.34.1