Changed exclude/include matching so that normally wildcards will stop at
[rsync/rsync.git] / exclude.c
index 15dc310..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++;
                }
-               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;
        
@@ -97,6 +100,7 @@ static struct exclude_struct *make_exclude(char *pattern, int include)
                    only_included_files = 0;
            }
            ret->regular_exp = 1;
+           ret->fnmatch_flags = strstr(pattern, "**") ? 0 : FNM_PATHNAME;
        } else if (!ret->include) {
                only_included_files = 0;
        }
@@ -140,7 +144,7 @@ static int check_one_exclude(char *name,struct exclude_struct *ex,
        }
 
        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);