OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 03-Jan-2005 15:56:29
Branch: HEAD Handle: 2005010314562800
Added files:
openpkg-src/rsync rsync.patch.lastmatch
Modified files:
openpkg-src/rsync rsync.spec
Log:
apply my patch for adding a --last-match option which makes rsync's
include/exclude facility really usable the first time IMHO
Summary:
Revision Changes Path
1.1 +150 -0 openpkg-src/rsync/rsync.patch.lastmatch
1.72 +7 -2 openpkg-src/rsync/rsync.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/rsync/rsync.patch.lastmatch
============================================================================
$ cvs diff -u -r0 -r1.1 rsync.patch.lastmatch
--- /dev/null 2005-01-03 15:56:29 +0100
+++ rsync.patch.lastmatch 2005-01-03 15:56:29 +0100
@@ -0,0 +1,150 @@
+This patch adds a --last-match command line option to RSYNC 2.6.3 which
+switches the include/exclude pattern processing from "first-match" (the
+default) to "last-match" semantics plus the possibility to specify
+short-circuit patterns (which stop processing immediately if matching)
+with the operators "-!" and "+!" in addition to the regular operators
+"-" and "+". The "last-match" is a super-set of the "first-match"
+semantics, providing more flexible include/exclude specifications by
+allowing arbitrary nesting of matches.
+
+ Ralf S. Engelschall
+ [EMAIL PROTECTED]
+ 03-Jan-2005
+
+Index: options.c
+--- options.c.orig 2004-09-23 19:39:05 +0200
++++ options.c 2005-01-02 18:57:15 +0100
+@@ -96,6 +96,7 @@
+ int checksum_seed = 0;
+ int inplace = 0;
+ unsigned int block_size = 0;
++int last_match = 0;
+
+
+ /** Network address family. **/
+@@ -286,6 +287,7 @@
+ rprintf(F," --exclude-from=FILE exclude patterns listed in
FILE\n");
+ rprintf(F," --include=PATTERN don't exclude files matching
PATTERN\n");
+ rprintf(F," --include-from=FILE don't exclude patterns listed in
FILE\n");
++ rprintf(F," --last-match perform a last-match
include/exclude checking\n");
+ rprintf(F," --files-from=FILE read FILE for list of source-file
names\n");
+ rprintf(F," -0, --from0 all *-from file lists are
delimited by nulls\n");
+ rprintf(F," --version print version number\n");
+@@ -316,7 +318,7 @@
+ rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and
answers\n");
+ }
+
+-enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
++enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_LAST_MATCH,
+ OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST,
+ OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
+ OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT,
+@@ -343,6 +345,7 @@
+ {"include", 0, POPT_ARG_STRING, 0, OPT_INCLUDE, 0,
0 },
+ {"exclude-from", 0, POPT_ARG_STRING, 0,
OPT_EXCLUDE_FROM, 0, 0 },
+ {"include-from", 0, POPT_ARG_STRING, 0,
OPT_INCLUDE_FROM, 0, 0 },
++ {"last-match", 0, POPT_ARG_NONE, 0, OPT_LAST_MATCH,
0, 0 },
+ {"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
+ {"help", 'h', POPT_ARG_NONE, 0, 'h', 0, 0 },
+ {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 },
+@@ -564,6 +567,10 @@
+ ? XFLG_DEF_INCLUDE : 0));
+ break;
+
++ case OPT_LAST_MATCH:
++ last_match = 1;
++ break;
++
+ case 'h':
+ usage(FINFO);
+ exit_cleanup(0);
+Index: rsync.h
+--- rsync.h.orig 2004-09-22 06:10:10 +0200
++++ rsync.h 2005-01-02 19:00:57 +0100
+@@ -500,6 +500,7 @@
+ #define MATCHFLG_INCLUDE (1<<4) /* this is an include, not an exclude */
+ #define MATCHFLG_DIRECTORY (1<<5) /* this matches only directories */
+ #define MATCHFLG_CLEAR_LIST (1<<6) /* this item is the "!" token */
++#define MATCHFLG_SHORT_CIRCUIT (1<<7) /* this item stops processing */
+ struct exclude_struct {
+ struct exclude_struct *next;
+ char *pattern;
+Index: exclude.c
+--- exclude.c.orig 2004-09-22 06:11:15 +0200
++++ exclude.c 2005-01-03 15:47:03 +0100
+@@ -30,6 +30,7 @@
+ extern int eol_nulls;
+ extern int list_only;
+ extern int recurse;
++extern int last_match;
+
+ extern char curr_dir[];
+
+@@ -219,14 +220,23 @@
+ int check_exclude(struct exclude_list_struct *listp, char *name, int
name_is_dir)
+ {
+ struct exclude_struct *ent;
++ struct exclude_struct *ent_last = NULL;
+
+ for (ent = listp->head; ent; ent = ent->next) {
+ if (check_one_exclude(name, ent, name_is_dir)) {
+- report_exclude_result(name, ent, name_is_dir,
+- listp->debug_type);
+- return ent->match_flags & MATCHFLG_INCLUDE ? 1 : -1;
++ if (last_match && !(ent->match_flags &
MATCHFLG_SHORT_CIRCUIT)) {
++ ent_last = ent;
++ }
++ else {
++ report_exclude_result(name, ent, name_is_dir,
listp->debug_type);
++ return ent->match_flags & MATCHFLG_INCLUDE ? 1
: -1;
++ }
+ }
+ }
++ if (ent_last != NULL) {
++ report_exclude_result(name, ent_last, name_is_dir,
listp->debug_type);
++ return ent_last->match_flags & MATCHFLG_INCLUDE ? 1 : -1;
++ }
+
+ return 0;
+ }
+@@ -259,6 +269,12 @@
+ if (*s == '+')
+ mflags |= MATCHFLG_INCLUDE;
+ s += 2;
++ } else if (!(xflags & XFLG_WORDS_ONLY)
++ && last_match && strlen(s) >= 3 && (s[0] == '-' || s[0] == '+') &&
s[1] == '!' && s[2] == ' ') {
++ mflags |= MATCHFLG_SHORT_CIRCUIT;
++ if (*s == '+')
++ mflags |= MATCHFLG_INCLUDE;
++ s += 3;
+ } else if (xflags & XFLG_DEF_INCLUDE)
+ mflags |= MATCHFLG_INCLUDE;
+ if (xflags & XFLG_DIRECTORY)
+@@ -323,7 +339,7 @@
+ int xflags)
+ {
+ FILE *fp;
+- char line[MAXPATHLEN+3]; /* Room for "x " prefix and trailing slash. */
++ char line[MAXPATHLEN+4]; /* Room for "x " prefix and trailing slash. */
+ char *eob = line + sizeof line - 1;
+ int word_split = xflags & XFLG_WORD_SPLIT;
+
+@@ -403,10 +419,16 @@
+
+ if (ent->match_flags & MATCHFLG_INCLUDE) {
+ write_int(f, l + 2);
+- write_buf(f, "+ ", 2);
++ if (ent->match_flags & MATCHFLG_SHORT_CIRCUIT)
++ write_buf(f, "+! ", 3);
++ else
++ write_buf(f, "+ ", 2);
+ } else if ((*p == '-' || *p == '+') && p[1] == ' ') {
+ write_int(f, l + 2);
+- write_buf(f, "- ", 2);
++ if (ent->match_flags & MATCHFLG_SHORT_CIRCUIT)
++ write_buf(f, "-! ", 3);
++ else
++ write_buf(f, "- ", 2);
+ } else
+ write_int(f, l);
+ write_buf(f, p, l);
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/rsync/rsync.spec
============================================================================
$ cvs diff -u -r1.71 -r1.72 rsync.spec
--- openpkg-src/rsync/rsync.spec 2 Jan 2005 12:19:27 -0000 1.71
+++ openpkg-src/rsync/rsync.spec 3 Jan 2005 14:56:28 -0000 1.72
@@ -34,9 +34,10 @@
Group: Filesystem
License: GPL
Version: 2.6.3
-Release: 20050102
+Release: 20050103
# package options
+%option with_lastmatch yes
%option with_timelimit no
%option with_writeonly no
%option with_chmod no
@@ -46,6 +47,7 @@
Source1: rsync.conf
Source2: rc.rsync
Patch0: rsync.patch
+Patch1: rsync.patch.lastmatch
# build information
Prefix: %{l_prefix}
@@ -75,7 +77,10 @@
%prep
# unpack vendor sources
%setup -q
- %patch -p0
+ %patch -p0 -P 0
+%if "%{with_lastmatch}" == "yes"
+ %patch -p0 -P 1
+%endif
%if "%{with_timelimit}" == "yes"
%{l_patch} -p0 <patches/time-limit.diff
%endif
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [email protected]