Fixed an off-by-one error in the prefix-length checking in
[rsync/rsync.git] / rsync.yo
index f54fd52..8aacc1e 100644 (file)
--- a/rsync.yo
+++ b/rsync.yo
@@ -785,9 +785,22 @@ files listed in the CVSIGNORE environment variable (all cvsignore names
 are delimited by whitespace).
 
 Finally, any file is ignored if it is in the same directory as a
-.cvsignore file and matches one of the patterns listed therein.
+.cvsignore file and matches one of the patterns listed therein.  Unlike
+rsync's filter/exclude files, these patterns are split on whitespace.
 See the bf(cvs(1)) manual for more information.
 
+If you're combining bf(-C) with your own bf(--filter) rules, you should
+note that these CVS excludes are appended at the end of your own rules,
+regardless of where the -C was placed on the command-line.  This makes them
+a lower priority than any rules you specified explicitly.  If you want to
+control where these CVS excludes get inserted into your filter rules, you
+should omit the bf(-C) as a command-line option and use a combination of
+bf(--filter=:C) and bf(--filter=-C) (either on your command-line or by
+putting the ":C" and "-C" rules into a filter file with your other rules).
+The first option turns on the per-directory scanning for the .cvsignore
+file.  The second option does a one-time import of the CVS excludes
+mentioned above.
+
 dit(bf(-f, --filter=RULE)) This option allows you to add rules to selectively
 exclude certain files from the list of files to be transferred. This is
 most useful in combination with a recursive transfer.
@@ -1215,12 +1228,12 @@ Rsync builds an ordered list of filter rules as specified on the
 command-line.  Filter rules have the following syntax:
 
 quote(
-tt(x [RULE])nl()
-tt(xMODIFIERS [RULE])nl()
+tt(x [PATTERN_OR_FILE])nl()
+tt(xMODIFIERS [PATTERN_OR_FILE])nl()
 )
 
 The 'x' is a single-letter that specifies the kind of rule to create.  It
-can have trailing modifiers, and is separated from the RULE by either a
+can have trailing modifiers, and is separated from its arg by either a
 single space or an underscore (_).  Here are the available rule prefixes:
 
 quote(
@@ -1228,7 +1241,7 @@ bf(-) specifies an exclude pattern. nl()
 bf(+) specifies an include pattern. nl()
 bf(.) specifies a merge-file to read for more rules. nl()
 bf(:) specifies a per-directory merge-file. nl()
-bf(!) clears the current include/exclude list (takes no RULE) nl()
+bf(!) clears the current include/exclude list (takes no arg) nl()
 )
 
 Note that the bf(--include)/bf(--exclude) command-line options do not allow the
@@ -1368,32 +1381,38 @@ tt(:n- .non-inherited-per-dir-excludes)nl()
 The following modifiers are accepted after a "." or ":":
 
 itemize(
-  it() A "-" specifies that the file should consist of only exclude
+  it() A bf(-) specifies that the file should consist of only exclude
   patterns, with no other rule-parsing except for the list-clearing
   token ("!").
-  it() A "+" specifies that the file should consist of only include
+  it() A bf(+) specifies that the file should consist of only include
   patterns, with no other rule-parsing except for the list-clearing
   token ("!").
-  it() A "C" is a shorthand for the modifiers "sn-", which makes the
+  it() A bf(C) is a shorthand for the modifiers bf(nw-), which makes the
   parsing compatible with the way CVS parses their exclude files.  If no
   filename is specified, ".cvsignore" is assumed.
-  it() A "e" will exclude the merge-file from the transfer; e.g.
+  it() A bf(e) will exclude the merge-file from the transfer; e.g.
   ":e_.rules" is like ":_.rules" and "-_.rules".
-  it() An "n" specifies that the rules are not inherited by subdirectories.
-  it() An "s" specifies that the rules are split on all whitespace instead
+  it() An bf(n) specifies that the rules are not inherited by subdirectories.
+  it() A bf(w) specifies that the rules are word-split on whitespace instead
   of the normal line-splitting.  This also turns off comments.  Note: the
   space that separates the prefix from the rule is treated specially, so
-  "- foo + bar" is parsed as two rules (assuming that "-" or "+" was not
+  "- foo + bar" is parsed as two rules (assuming that bf(-) or bf(+) was not
   specified to turn off the parsing of prefixes).
 )
 
-The following modifier is accepted after a "+" or "-":
+The following modifiers are accepted after a "+" or "-":
 
 itemize(
   it() A "/" specifies that the include/exclude should be treated as an
   absolute path, relative to the root of the filesystem.  For example,
   "-/_/etc/passwd" would exclude the passwd file any time the transfer
   was sending files from the "/etc" directory.
+  it() A "!" specifies that the include/exclude should take effect if
+  the pattern fails to match.  For instance, "-! */" would exclude all
+  non-directories.
+  it() A bf(C) is used to indicate that all the global CVS-exclude rules
+  should be inserted as excludes in place of the "-C".  No arg should
+  follow.
 )
 
 Per-directory rules are inherited in all subdirectories of the directory
@@ -1457,7 +1476,7 @@ a part of the transfer.
 
 If you want to include the contents of a ".cvsignore" in your patterns,
 you should use the rule ":C" -- this is a short-hand for the rule
-":sn-_.cvsignore", and ensures that the .cvsignore file's contents are
+":nw-_.cvsignore", and ensures that the .cvsignore file's contents are
 interpreted according to the same parsing rules that CVS uses.  You can
 use this to affect where the bf(--cvs-exclude) (bf(-C)) option's inclusion of the
 per-directory .cvsignore file gets placed into your rules by putting a
@@ -1478,10 +1497,11 @@ tt(rsync -avC --include=foo.o -f :C --exclude='*.old' a/ b)nl()
 Both of the above rsync commands are identical.  Each one will merge all
 the per-directory .cvsignore rules in the middle of the list rather than
 at the end.  This allows their dir-specific rules to supersede the rules
-that follow the :C instead of being subservient to all your rules.  (The
-global rules taken from the $HOME/.cvsignore file and from $CVSIGNORE are
-not repositioned from their spot at the end of your rules, however -- feel
-free to manually include $HOME/.cvsignore elsewhere in your rules.)
+that follow the :C instead of being subservient to all your rules.  To
+affect the other CVS exclude rules (i.e. the default list of exclusions,
+the contents of $HOME/.cvsignore, and the value of $CVSIGNORE) you should
+omit the bf(-C) command-line option and instead insert a "-C" rule into
+your filter rules; e.g. "--filter=-C".
 
 manpagesection(LIST-CLEARING FILTER RULE)