* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "rsync.h"
strlcpy(to, merge_file, *len_ptr + 1);
merge_file = to;
}
- if (!sanitize_path(fn, merge_file, r, dirbuf_depth)) {
+ if (!sanitize_path(fn, merge_file, r, dirbuf_depth, NULL)) {
rprintf(FERROR, "merge-file name overflows: %s\n",
merge_file);
return NULL;
char *p, *pattern = ex->pattern;
const char *strings[16]; /* more than enough */
+ if (*name == '/')
+ name++;
if (!*name)
return 0;
if (*pattern == '/') {
anchored_match = 1;
pattern++;
- if (strings[0][0] == '/')
- strings[0]++;
}
if (!anchored_match && ex->u.slash_cnt
if (litmatch_array(pattern, strings, slash_handling))
return ret_match;
} else if (anchored_match) {
- if (strcmp(strings[0], pattern) == 0)
+ if (strcmp(name, pattern) == 0)
return ret_match;
} else {
int l1 = strlen(name);
exit_cleanup(RERR_SYNTAX);
}
+ /* --delete-excluded turns an un-modified include/exclude into a
+ * sender-side rule. We also affect per-dir merge files that take
+ * no prefixes as a simple optimization. */
+ if (delete_excluded
+ && !(new_mflags & (MATCHFLG_RECEIVER_SIDE|MATCHFLG_SENDER_SIDE))
+ && (!(new_mflags & MATCHFLG_PERDIR_MERGE)
+ || new_mflags & MATCHFLG_NO_PREFIXES))
+ new_mflags |= MATCHFLG_SENDER_SIDE;
+
*len_ptr = len;
*mflags_ptr = new_mflags;
return (const char *)s;
" *.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)
{
int elide = 0;
char *p;
+ /* Note we need to check delete_excluded here in addition to
+ * the code in parse_rule_tok() because some rules may have
+ * been added before we found the --delete-excluded option.
+ * We must also elide any CVS merge-file rules to avoid a
+ * backward compatibility problem, and we elide any no-prefix
+ * merge files as an optimization (since they can only have
+ * include/exclude rules). */
if (ent->match_flags & MATCHFLG_SENDER_SIDE)
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_NO_PREFIXES))
elide = am_sender ? 1 : -1;
if (elide < 0) {
if (prev)