From: Wayne Davison Date: Thu, 4 Oct 2007 01:09:34 +0000 (+0000) Subject: Added a manpage entry and made a few more tweaks. X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/commitdiff_plain/5befb07913169aa9449c29914401fccaa544677a Added a manpage entry and made a few more tweaks. --- diff --git a/ignore-case.diff b/ignore-case.diff index 7754f98..3703637 100644 --- a/ignore-case.diff +++ b/ignore-case.diff @@ -14,21 +14,12 @@ TODO: --- old/exclude.c +++ new/exclude.c -@@ -32,6 +32,7 @@ extern int io_error; - extern int local_server; - extern int prune_empty_dirs; - extern int ignore_perishable; -+extern int ignore_case; - extern int delete_mode; - extern int delete_excluded; - extern int cvs_exclude; -@@ -583,16 +584,17 @@ static int rule_matches(char *name, stru +@@ -583,16 +583,15 @@ static int rule_matches(char *name, stru if (litmatch_array(pattern, strings, slash_handling)) return ret_match; } else if (anchored_match) { - if (strcmp(name, pattern) == 0) -+ if ((ignore_case ? strcasecmp(name, pattern) -+ : strcmp(name, pattern)) == 0) ++ if (ic_strEQ(name, pattern)) return ret_match; } else { int l1 = strlen(name); @@ -37,8 +28,7 @@ TODO: - strcmp(name+(l1-l2),pattern) == 0 && - (l1==l2 || name[l1-(l2+1)] == '/')) { + if (l2 <= l1 -+ && (ignore_case ? strcasecmp(name + (l1-l2), pattern) -+ : strcmp(name + (l1-l2), pattern)) == 0 ++ && ic_strEQ(name + (l1-l2), pattern) + && (l1 == l2 || name[l1 - (l2+1)] == '/')) return ret_match; - } @@ -55,7 +45,7 @@ TODO: extern int ignore_errors; extern int numeric_ids; extern int recurse; -@@ -2494,6 +2495,7 @@ int f_name_cmp(const struct file_struct +@@ -2570,6 +2571,7 @@ int f_name_cmp(const struct file_struct { int dif; const uchar *c1, *c2; @@ -63,23 +53,64 @@ TODO: enum fnc_state state1, state2; enum fnc_type type1, type2; enum fnc_type t_path = protocol_version >= 29 ? t_PATH : t_ITEM; -@@ -2604,7 +2606,15 @@ int f_name_cmp(const struct file_struct +@@ -2680,7 +2682,15 @@ int f_name_cmp(const struct file_struct if (type1 != type2) return type1 == t_PATH ? 1 : -1; } - } while ((dif = (int)*c1++ - (int)*c2++) == 0); -+ ch1 = CVAL(c1++, 0); -+ ch2 = CVAL(c2++, 0); ++ ch1 = *c1++; ++ ch2 = *c2++; + if (ignore_case) { -+ if (islower(ch1)) -+ ch1 = toupper(ch1); -+ if (islower(ch2)) -+ ch2 = toupper(ch2); ++ if (isupper(ch1)) ++ ch1 = tolower(ch1); ++ if (isupper(ch2)) ++ ch2 = tolower(ch2); + } -+ } while ((dif = ch1 - ch2) == 0); ++ } while ((dif = (int)ch1 - (int)ch2) == 0); return dif; } +--- old/ifuncs.h ++++ new/ifuncs.h +@@ -98,3 +98,38 @@ toUpper(const char *ptr) + { + return toupper(*(unsigned char *)ptr); + } ++ ++static inline int ++strEQ(const char *s1, const char *s2) ++{ ++ return strcmp(s1, s2) == 0; ++} ++ ++static inline int ++strnEQ(const char *s1, const char *s2, size_t n) ++{ ++ return strncmp(s1, s2, n) == 0; ++} ++ ++static inline int ++ic_strEQ(const char *s1, const char *s2) ++{ ++ extern int ignore_case; ++ if (ignore_case) ++ return strcasecmp(s1, s2) == 0; ++ return strcmp(s1, s2) == 0; ++} ++ ++static inline int ++ic_strnEQ(const char *s1, const char *s2, size_t n) ++{ ++ extern int ignore_case; ++ if (ignore_case) ++ return strcasecmp(s1, s2, n) == 0; ++ return strcmp(s1, s2, n) == 0; ++} ++ ++#define strNE(s1,s2) (!strEQ(s1,s2)) ++#define strnNE(s1,s2,n) (!strnEQ(s1,s2,n)) ++#define ic_strNE(s1,s2) (!ic_strEQ(s1,s2)) ++#define ic_strnNE(s1,s2) (!ic_strnEQ(s1,s2,n)) --- old/lib/wildmatch.c +++ new/lib/wildmatch.c @@ -53,6 +53,8 @@ @@ -167,7 +198,7 @@ TODO: --- old/options.c +++ new/options.c -@@ -114,6 +114,7 @@ OFF_T max_size = 0; +@@ -115,6 +115,7 @@ OFF_T max_size = 0; OFF_T min_size = 0; int ignore_errors = 0; int modify_window = 0; @@ -175,14 +206,14 @@ TODO: int blocking_io = -1; int checksum_seed = 0; int inplace = 0; -@@ -396,6 +397,7 @@ void usage(enum logcode F) - rprintf(F," --exclude-from=FILE read exclude patterns from FILE\n"); - rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n"); - rprintf(F," --include-from=FILE read include patterns from FILE\n"); -+ rprintf(F," --ignore-case ignore case when comparing filenames\n"); +@@ -400,6 +401,7 @@ void usage(enum logcode F) rprintf(F," --files-from=FILE read list of source-file names from FILE\n"); rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n"); rprintf(F," -s, --protect-args no space-splitting; only wildcard special-chars\n"); ++ rprintf(F," --ignore-case ignore case when comparing filenames\n"); + rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n"); + rprintf(F," --port=PORT specify double-colon alternate port number\n"); + rprintf(F," --sockopts=OPTIONS specify custom TCP options\n"); @@ -593,6 +595,8 @@ static struct poptOption long_options[] {"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 }, {"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 }, @@ -192,7 +223,7 @@ TODO: {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 }, {"from0", '0', POPT_ARG_VAL, &eol_nulls, 1, 0, 0}, {"no-from0", 0, POPT_ARG_VAL, &eol_nulls, 0, 0, 0}, -@@ -1907,6 +1911,9 @@ void server_options(char **args, int *ar +@@ -1909,6 +1913,9 @@ void server_options(char **args, int *ar args[ac++] = arg; } @@ -202,6 +233,27 @@ TODO: if (partial_dir && am_sender) { if (partial_dir != tmp_partialdir) { args[ac++] = "--partial-dir"; +--- old/rsync.yo ++++ new/rsync.yo +@@ -402,6 +402,7 @@ to the detailed description below for a + --files-from=FILE read list of source-file names from FILE + -0, --from0 all *from/filter files are delimited by 0s + -s, --protect-args no space-splitting; wildcard chars only ++ --ignore-case ignore case when comparing filenames + --address=ADDRESS bind address for outgoing socket to daemon + --port=PORT specify double-colon alternate port number + --sockopts=OPTIONS specify custom TCP options +@@ -1383,6 +1384,10 @@ If you use this option with bf(--iconv), + from the local to the remote character set. The translation happens before + wild-cards are expanded. See also the bf(--files-from) option. + ++dit(bf(--ignore-case)) This option tells rsync to ignore upper-/lower-case ++differences when comparing filenames. This can avoid problems when sending ++files to a filesystem that ignores these differences. ++ + dit(bf(-T, --temp-dir=DIR)) This option instructs rsync to use DIR as a + scratch directory when creating temporary copies of the files transferred + on the receiving side. The default behavior is to create each temporary --- old/wildtest.c +++ new/wildtest.c @@ -31,6 +31,7 @@ int fnmatch_errors = 0;