extern int am_server;
extern int am_sender;
extern int eol_nulls;
-extern int list_only;
extern int recurse;
extern int io_error;
extern int local_server;
fn_len = strlen(fn);
} else {
strlcpy(fn, merge_file, len_ptr ? *len_ptr + 1 : MAXPATHLEN);
- fn_len = clean_fname(fn, 1);
+ fn_len = clean_fname(fn, CFN_COLLAPSE_DOT_DOT_DIRS);
}
/* If the name isn't in buf yet, it's wasn't absolute. */
}
memcpy(buf, dirbuf + prefix_skip, dirbuf_len - prefix_skip);
memcpy(buf + dirbuf_len - prefix_skip, fn, fn_len + 1);
- fn_len = clean_fname(buf, 1);
+ fn_len = clean_fname(buf, CFN_COLLAPSE_DOT_DOT_DIRS);
}
if (len_ptr)
len = 0;
memcpy(dirbuf + len, dir, dirlen);
dirbuf[dirlen + len] = '\0';
- dirbuf_len = clean_fname(dirbuf, 1);
+ dirbuf_len = clean_fname(dirbuf, CFN_COLLAPSE_DOT_DOT_DIRS);
if (dirbuf_len > 1 && dirbuf[dirbuf_len-1] == '.'
&& dirbuf[dirbuf_len-2] == '/')
dirbuf_len -= 2;
else
pathjoin(buf, MAXPATHLEN, dirbuf, x);
- len = clean_fname(buf, 1);
+ len = clean_fname(buf, CFN_COLLAPSE_DOT_DOT_DIRS);
if (len != 1 && len < MAXPATHLEN-1) {
buf[len++] = '/';
buf[len] = '\0';
filt_array[cur_depth] = push_local_filters(dname, dlen);
}
-static int rule_matches(char *name, struct filter_struct *ex, int name_is_dir)
+static int rule_matches(char *fname, struct filter_struct *ex, int name_is_dir)
{
int slash_handling, str_cnt = 0, anchored_match = 0;
int ret_match = ex->match_flags & MATCHFLG_NEGATE ? 0 : 1;
char *p, *pattern = ex->pattern;
const char *strings[16]; /* more than enough */
+ char *name = fname + (*fname == '/');
- if (*name == '/')
- name++;
if (!*name)
return 0;
* just match the name portion of the path. */
if ((p = strrchr(name,'/')) != NULL)
name = p+1;
- } else if (ex->match_flags & MATCHFLG_ABS_PATH && *name != '/'
+ } else if (ex->match_flags & MATCHFLG_ABS_PATH && *fname != '/'
&& curr_dir_len > module_dirlen + 1) {
/* If we're matching against an absolute-path pattern,
* we need to prepend our full path info. */
strings[str_cnt++] = curr_dir + module_dirlen + 1;
strings[str_cnt++] = "/";
- } else if (ex->match_flags & MATCHFLG_WILD2_PREFIX && *name != '/') {
+ } else if (ex->match_flags & MATCHFLG_WILD2_PREFIX && *fname != '/') {
/* Allow "**"+"/" to match at the start of the string. */
strings[str_cnt++] = "/";
}
" *.a *.olb *.o *.obj *.so *.exe"
" *.Z *.elc *.ln core"
/* The rest we added to suit ourself. */
- " .svn/ .bzr/";
+ " .svn/ .git/ .bzr/";
static void get_cvs_excludes(uint32 mflags)
{
if (*fname != '-' || fname[1] || am_server) {
if (server_filter_list.head) {
strlcpy(line, fname, sizeof line);
- clean_fname(line, 1);
+ clean_fname(line, CFN_COLLAPSE_DOT_DOT_DIRS);
if (check_filter(&server_filter_list, line, 0) < 0)
fp = NULL;
else
parse_rule(&filter_list, "-C", 0, 0);
}
- /* This is a complete hack - blame Rusty. FIXME!
- * Remove this hack when older rsyncs (below 2.6.4) are gone. */
- if (list_only == 1 && !recurse)
- parse_rule(&filter_list, "/*/*", MATCHFLG_NO_PREFIXES, 0);
-
send_rules(f_out, &filter_list);
if (f_out >= 0)