Bug#314473: rsync still fails badly with an "!" in .cvsignore

Paul Slootman paul at debian.org
Fri Sep 16 13:27:22 GMT 2005


Here a bug report about "!" not working properly in 2.6.4 and above,
paraphrased...

>     Ok, see attachment.  I've tested it right now between two hosts
> running rsync 2.6.3-2 and 2.6.6-1.  It works in the forward direction,
> backwards it gives
> 
>     '!' rule has trailing characters: !
>     rsync error: syntax or usage error (code 1) at exclude.c(833)

> ---------------------------------------------------------------------------
> #! /bin/bash -ex
> 
> echo '!'   > ~/.cvsignore
> echo '*~' >> ~/.cvsignore
> rm -rf /tmp/tester
> mkdir /tmp/tester
> cp /etc/passwd /tmp/tester
> cp /tmp/tester/passwd{,~}
> rsync -avbu --cvs-exclude --delete /tmp/tester remotehost:/tmp/

I've found that when "!" was scanned, the pointer was not advanced,
hence there appeared to be trailing chars... The following patch seems
to fix it.

Paul Slootman

--- rsync-2.6.6.orig/exclude.c
+++ rsync-2.6.6/exclude.c
@@ -665,8 +665,10 @@
 	 * for old include/exclude patterns where just "+ " and "- " are
 	 * allowed as optional prefixes.  */
 	if (mflags & MATCHFLG_NO_PREFIXES) {
-		if (*s == '!' && mflags & MATCHFLG_CVS_IGNORE)
+		if (*s == '!' && mflags & MATCHFLG_CVS_IGNORE) {
 			new_mflags |= MATCHFLG_CLEAR_LIST; /* Tentative! */
+                        s++;
+                }
 	} else if (xflags & XFLG_OLD_PREFIXES) {
 		if (*s == '-' && s[1] == ' ') {
 			new_mflags &= ~MATCHFLG_INCLUDE;
@@ -674,8 +676,10 @@
 		} else if (*s == '+' && s[1] == ' ') {
 			new_mflags |= MATCHFLG_INCLUDE;
 			s += 2;
-		} else if (*s == '!')
+		} else if (*s == '!') {
 			new_mflags |= MATCHFLG_CLEAR_LIST; /* Tentative! */
+                        s++;
+                }
 	} else {
 		char ch = 0, *mods = "";
 		switch (*s) {


More information about the rsync mailing list