From 8fbd8b35eaff25df3b6ed794b5486d38ca55e359 Mon Sep 17 00:00:00 2001 From: Andrea Mazzoleni Date: Wed, 2 Mar 2016 12:05:38 +0100 Subject: [PATCH] Add support for escaping in Windows with the '^' char --- HISTORY | 7 +++++++ cmdline/support.c | 21 +++++++++++++++++---- snapraid.1 | 8 +++++++- snapraid.d | 8 +++++++- snapraid.txt | 8 +++++++- 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/HISTORY b/HISTORY index 343c88ba..63975ff6 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,13 @@ SnapRAID HISTORY ================ +10.1 2016/03 +============ + * In the Windows version allow to use the escape char '^' to handle + file patterns containing real characters matching the globbing '*?[]' + ones. In Unix it was already possible to do the same escaping with + '\'. + 10.0 2016/02 ============ * Boosts the speed of the 'sync' and 'scrub' commands with a new diff --git a/cmdline/support.c b/cmdline/support.c index d1558387..431c0b3f 100644 --- a/cmdline/support.c +++ b/cmdline/support.c @@ -638,10 +638,17 @@ void pathimport(char* dst, size_t size, const char* src) pathcpy(dst, size, src); #ifdef _WIN32 - /* convert all Windows '\' to C '/' */ + /* convert the Windows dir separator '\' to C '/', */ + /* and the Windows escaping char '^' to the fnmatch '\' */ while (*dst) { - if (*dst == '\\') + switch (*dst) { + case '\\' : *dst = '/'; + break; + case '^' : + *dst = '\\'; + break; + } ++dst; } #endif @@ -652,10 +659,16 @@ void pathexport(char* dst, size_t size, const char* src) pathcpy(dst, size, src); #ifdef _WIN32 - /* convert all C '/' to Windows '\' */ + /* invert the import */ while (*dst) { - if (*dst == '/') + switch (*dst) { + case '/' : *dst = '\\'; + break; + case '\\' : + *dst = '^'; + break; + } ++dst; } #endif diff --git a/snapraid.1 b/snapraid.1 index 315bdb34..6ccc31e7 100644 --- a/snapraid.1 +++ b/snapraid.1 @@ -1550,7 +1550,7 @@ There are four different types of patterns: .TP .B FILE Selects any file named as FILE. You can use any globbing -character like * and ?. +character like * and ?, and char classes like [a\-z]. This pattern is applied only to files and not to directories. .TP .B DIR/ @@ -1578,6 +1578,12 @@ Note that Windows system directories, junctions, mount points, and any other Windows special directory are treated just as files, meaning that to exclude them you must use a file rule, and not a directory one. .PP +If the file name you want to use really contains a \'*\', \'?\', \'[\', +or \']\' char, you have to escape it to avoid to have interpreted as a +globbing character. In Unix the escape char is \'\\\' in Windows it\'s \'^\'. +Note that when the pattern is on the command line, you have to double the +escape character to avoid to have it interpreted by the command shell. +.PP In the configuration file, you can use different strategies to filter the files to process. The simplest one is to use only \[dq]exclude\[dq] rules to remove all the diff --git a/snapraid.d b/snapraid.d index d333445a..24db64a3 100644 --- a/snapraid.d +++ b/snapraid.d @@ -1165,7 +1165,7 @@ Pattern =FILE Selects any file named as FILE. You can use any globbing - character like * and ?. + character like * and ?, and char classes like [a-z]. This pattern is applied only to files and not to directories. =DIR/ @@ -1193,6 +1193,12 @@ Pattern other Windows special directory are treated just as files, meaning that to exclude them you must use a file rule, and not a directory one. + If the file name you want to use really contains a '*', '?', '[', + or ']' char, you have to escape it to avoid to have interpreted as a + globbing character. In Unix the escape char is '\' in Windows it's '^'. + Note that when the pattern is on the command line, you have to double the + escape character to avoid to have it interpreted by the command shell. + In the configuration file, you can use different strategies to filter the files to process. The simplest one is to use only "exclude" rules to remove all the diff --git a/snapraid.txt b/snapraid.txt index 34e3c54d..d0ffc4ff 100644 --- a/snapraid.txt +++ b/snapraid.txt @@ -1258,7 +1258,7 @@ There are four different types of patterns: FILE Selects any file named as FILE. You can use any globbing - character like * and ?. + character like * and ?, and char classes like [a-z]. This pattern is applied only to files and not to directories. DIR/ @@ -1286,6 +1286,12 @@ Note that Windows system directories, junctions, mount points, and any other Windows special directory are treated just as files, meaning that to exclude them you must use a file rule, and not a directory one. +If the file name you want to use really contains a '*', '?', '[', +or ']' char, you have to escape it to avoid to have interpreted as a +globbing character. In Unix the escape char is '\' in Windows it's '^'. +Note that when the pattern is on the command line, you have to double the +escape character to avoid to have it interpreted by the command shell. + In the configuration file, you can use different strategies to filter the files to process. The simplest one is to use only "exclude" rules to remove all the