A potential patch to improve --cvs-exclude.
authorWayne Davison <wayned@samba.org>
Fri, 8 Apr 2005 06:20:10 +0000 (06:20 +0000)
committerWayne Davison <wayned@samba.org>
Fri, 8 Apr 2005 06:20:10 +0000 (06:20 +0000)
cvs-entries.diff [new file with mode: 0644]

diff --git a/cvs-entries.diff b/cvs-entries.diff
new file mode 100644 (file)
index 0000000..a279991
--- /dev/null
@@ -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)