Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Prevent the -g option from preserving groups that a non-root receiver
[rsync/rsync.git]
/
exclude.c
diff --git
a/exclude.c
b/exclude.c
index
9c18365
..
66aeb67
100644
(file)
--- a/
exclude.c
+++ b/
exclude.c
@@
-60,7
+60,10
@@
int send_included_file_names(int f,struct file_list *flist)
/* skip the allowed beginning slashes */
p++;
}
/* skip the allowed beginning slashes */
p++;
}
- send_file_name(f,flist,p,0,0);
+ /* silently skip files that don't exist to
+ be more like non-optimized case */
+ if (access(p,0) == 0)
+ send_file_name(f,flist,p,0,0);
}
exclude_list = ex_list;
}
exclude_list = ex_list;
@@
-77,8
+80,6
@@
static struct exclude_struct *make_exclude(char *pattern, int include)
memset(ret, 0, sizeof(*ret));
memset(ret, 0, sizeof(*ret));
- ret->orig = strdup(pattern);
-
if (strncmp(pattern,"- ",2) == 0) {
pattern += 2;
} else if (strncmp(pattern,"+ ",2) == 0) {
if (strncmp(pattern,"- ",2) == 0) {
pattern += 2;
} else if (strncmp(pattern,"+ ",2) == 0) {
@@
-90,7
+91,7
@@
static struct exclude_struct *make_exclude(char *pattern, int include)
ret->pattern = strdup(pattern);
ret->pattern = strdup(pattern);
- if (!ret->
orig || !ret->
pattern) out_of_memory("make_exclude");
+ if (!ret->pattern) out_of_memory("make_exclude");
if (strpbrk(pattern, "*[?")) {
if (!ret->include && (*pattern == '*') && (*(pattern+1) == '\0')) {
if (strpbrk(pattern, "*[?")) {
if (!ret->include && (*pattern == '*') && (*(pattern+1) == '\0')) {
@@
-99,6
+100,7
@@
static struct exclude_struct *make_exclude(char *pattern, int include)
only_included_files = 0;
}
ret->regular_exp = 1;
only_included_files = 0;
}
ret->regular_exp = 1;
+ ret->fnmatch_flags = strstr(pattern, "**") ? 0 : FNM_PATHNAME;
} else if (!ret->include) {
only_included_files = 0;
}
} else if (!ret->include) {
only_included_files = 0;
}
@@
-117,7
+119,6
@@
static struct exclude_struct *make_exclude(char *pattern, int include)
static void free_exclude(struct exclude_struct *ex)
{
static void free_exclude(struct exclude_struct *ex)
{
- free(ex->orig);
free(ex->pattern);
memset(ex,0,sizeof(*ex));
free(ex);
free(ex->pattern);
memset(ex,0,sizeof(*ex));
free(ex);
@@
-143,7
+144,7
@@
static int check_one_exclude(char *name,struct exclude_struct *ex,
}
if (ex->regular_exp) {
}
if (ex->regular_exp) {
- if (fnmatch(pattern, name,
0
) == 0)
+ if (fnmatch(pattern, name,
ex->fnmatch_flags
) == 0)
return 1;
} else {
int l1 = strlen(name);
return 1;
} else {
int l1 = strlen(name);
@@
-163,6
+164,10
@@
int check_exclude(char *name,struct exclude_struct **local_exclude_list,
{
int n;
{
int n;
+ if (name && (name[0] == '.') && !name[1])
+ /* never exclude '.', even if somebody does --exclude '*' */
+ return 0;
+
if (exclude_list) {
for (n=0; exclude_list[n]; n++)
if (check_one_exclude(name,exclude_list[n],st))
if (exclude_list) {
for (n=0; exclude_list[n]; n++)
if (check_one_exclude(name,exclude_list[n],st))
@@
-224,7
+229,7
@@
struct exclude_struct **make_exclude_list(char *fname,
if (!f) {
if (fatal) {
rprintf(FERROR,"%s : %s\n",fname,strerror(errno));
if (!f) {
if (fatal) {
rprintf(FERROR,"%s : %s\n",fname,strerror(errno));
- exit_cleanup(
1
);
+ exit_cleanup(
RERR_FILEIO
);
}
return list;
}
}
return list;
}
@@
-233,7
+238,12
@@
struct exclude_struct **make_exclude_list(char *fname,
int l = strlen(line);
if (l && line[l-1] == '\n') l--;
line[l] = 0;
int l = strlen(line);
if (l && line[l-1] == '\n') l--;
line[l] = 0;
- if (line[0]) add_exclude_list(line,&list,include);
+ if (line[0] && (line[0] != ';') && (line[0] != '#')) {
+ /* Skip lines starting with semicolon or pound.
+ It probably wouldn't cause any harm to not skip
+ them but there's no need to save them. */
+ add_exclude_list(line,&list,include);
+ }
}
fclose(f);
return list;
}
fclose(f);
return list;
@@
-259,23
+269,21
@@
void send_exclude_list(int f)
}
for (i=0;exclude_list[i];i++) {
}
for (i=0;exclude_list[i];i++) {
- char *pattern = exclude_list[i]->
orig
;
+ char *pattern = exclude_list[i]->
pattern
;
int l;
int l;
- if (remote_version < 19) {
- if (strncmp(pattern,"+ ", 2)==0) {
+ l = strlen(pattern);
+ if (l == 0) continue;
+ if (exclude_list[i]->include) {
+ if (remote_version < 19) {
rprintf(FERROR,"remote rsync does not support include syntax - aborting\n");
rprintf(FERROR,"remote rsync does not support include syntax - aborting\n");
- exit_cleanup(1);
- }
-
- if (strncmp(pattern,"- ", 2) == 0) {
- pattern += 2;
+ exit_cleanup(RERR_UNSUPPORTED);
}
}
+ write_int(f,l+2);
+ write_buf(f,"+ ",2);
+ } else {
+ write_int(f,l);
}
}
-
- l = strlen(pattern);
- if (l == 0) continue;
- write_int(f,l);
write_buf(f,pattern,l);
}
write_buf(f,pattern,l);
}
@@
-306,6
+314,17
@@
void add_exclude_line(char *p)
free(p);
}
free(p);
}
+void add_include_line(char *p)
+{
+ char *tok;
+ if (!p || !*p) return;
+ p = strdup(p);
+ if (!p) out_of_memory("add_include_line");
+ for (tok=strtok(p," "); tok; tok=strtok(NULL," "))
+ add_exclude(tok, 1);
+ free(p);
+}
+
static char *cvs_ignore_list[] = {
"RCS","SCCS","CVS","CVS.adm","RCSLOG","cvslog.*",
static char *cvs_ignore_list[] = {
"RCS","SCCS","CVS","CVS.adm","RCSLOG","cvslog.*",
@@
-326,7
+345,7
@@
void add_cvs_excludes(void)
add_exclude(cvs_ignore_list[i], 0);
if ((p=getenv("HOME")) && strlen(p) < (MAXPATHLEN-12)) {
add_exclude(cvs_ignore_list[i], 0);
if ((p=getenv("HOME")) && strlen(p) < (MAXPATHLEN-12)) {
- slprintf(fname,sizeof(fname)
-1
, "%s/.cvsignore",p);
+ slprintf(fname,sizeof(fname), "%s/.cvsignore",p);
add_exclude_file(fname,0,0);
}
add_exclude_file(fname,0,0);
}