Make sure that --delete-excluded does not elide a per-dir merge
[rsync/rsync.git] / exclude.c
index 0da15b2..dc1a475 100644 (file)
--- a/exclude.c
+++ b/exclude.c
@@ -500,6 +500,8 @@ static int rule_matches(char *name, struct filter_struct *ex, int name_is_dir)
        char *p, *pattern = ex->pattern;
        const char *strings[16]; /* more than enough */
 
+       if (*name == '/')
+               name++;
        if (!*name)
                return 0;
 
@@ -531,8 +533,6 @@ static int rule_matches(char *name, struct filter_struct *ex, int name_is_dir)
        if (*pattern == '/') {
                anchored_match = 1;
                pattern++;
-               if (strings[0][0] == '/')
-                       strings[0]++;
        }
 
        if (!anchored_match && ex->u.slash_cnt
@@ -861,7 +861,7 @@ static char default_cvsignore[] =
        " *.a *.olb *.o *.obj *.so *.exe"
        " *.Z *.elc *.ln core"
        /* The rest we added to suit ourself. */
-       " .svn/";
+       " .svn/ .bzr/";
 
 static void get_cvs_excludes(uint32 mflags)
 {
@@ -1102,7 +1102,8 @@ static void send_rules(int f_out, struct filter_list_struct *flp)
                        elide = am_sender ? 1 : -1;
                if (ent->match_flags & MATCHFLG_RECEIVER_SIDE)
                        elide = elide ? 0 : am_sender ? -1 : 1;
-               else if (delete_excluded && !elide)
+               else if (delete_excluded && !elide
+                && (!(ent->match_flags & MATCHFLG_PERDIR_MERGE) || ent->match_flags & MATCHFLG_CVS_IGNORE))
                        elide = am_sender ? 1 : -1;
                if (elide < 0) {
                        if (prev)