X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/ffadcb36bef7c620b33232f88a77bb0de117ac60..88f7513df3fca996d2669285ddb48a362a9a9825:/ignore-case.diff diff --git a/ignore-case.diff b/ignore-case.diff index 2933b27..267ebb0 100644 --- a/ignore-case.diff +++ b/ignore-case.diff @@ -1,8 +1,34 @@ This adds the --ignore-case option, which makes rsync compare filenames in a case-insensitive manner. ---- orig/lib/wildmatch.c 2005-12-30 07:31:41 -+++ lib/wildmatch.c 2005-12-30 07:38:42 +--- old/flist.c ++++ new/flist.c +@@ -37,6 +37,7 @@ extern int am_sender; + extern int do_progress; + extern int always_checksum; + extern int module_id; ++extern int ignore_case; + extern int ignore_errors; + extern int numeric_ids; + extern int recurse; +@@ -1801,7 +1802,14 @@ int f_name_cmp(struct file_struct *f1, s + return type1 == t_PATH ? 1 : -1; + + while (1) { +- if ((dif = (int)*c1++ - (int)*c2++) != 0) ++ if (ignore_case) { ++ uchar ch1, ch2; ++ ch1 = islower(*c1) ? toupper(*c1) : *c1; ++ ch2 = islower(*c2) ? toupper(*c2) : *c2; ++ c1++, c2++; ++ if ((dif = (int)ch1 - (int)ch2) != 0) ++ break; ++ } else if ((dif = (int)*c1++ - (int)*c2++) != 0) + break; + if (!*c1) { + switch (state1) { +--- old/lib/wildmatch.c ++++ new/lib/wildmatch.c @@ -53,6 +53,8 @@ #define ISUPPER(c) (ISASCII(c) && isupper(c)) #define ISXDIGIT(c) (ISASCII(c) && isxdigit(c)) @@ -12,33 +38,34 @@ in a case-insensitive manner. #ifdef WILD_TEST_ITERATIONS int wildmatch_iteration_count; #endif -@@ -71,6 +73,8 @@ static int dowild(const uchar *p, const +@@ -72,6 +74,8 @@ static int dowild(const uchar *p, const for ( ; (p_ch = *p) != '\0'; text++, p++) { int matched, special; uchar t_ch, prev_ch; + if (ignore_case && ISUPPER(p_ch)) + p_ch = tolower(p_ch); - if ((t_ch = *text) == '\0' && p_ch != '*') - return ABORT_ALL; - if (force_lower_case && ISUPPER(t_ch)) -@@ -211,10 +215,13 @@ static int dowild(const uchar *p, const - /* Match the "pattern" against the "text" string. */ + while ((t_ch = *text) == '\0') { + if (*a == NULL) { + if (p_ch != '*') +@@ -288,10 +292,14 @@ static const uchar *trailing_N_elements( int wildmatch(const char *pattern, const char *text) { + static const uchar *nomore[1]; /* A NULL pointer. */ + int ret; #ifdef WILD_TEST_ITERATIONS wildmatch_iteration_count = 0; #endif -- return dowild((const uchar*)pattern, (const uchar*)text) == TRUE; +- return dowild((const uchar*)pattern, (const uchar*)text, nomore) == TRUE; + force_lower_case = ignore_case; -+ ret = dowild((const uchar*)pattern, (const uchar*)text) == TRUE; ++ ret = dowild((const uchar*)pattern, (const uchar*)text, nomore) == TRUE; + force_lower_case = 0; ++ return ret; } /* Match the "pattern" against the forced-to-lower-case "text" string. */ ---- orig/options.c 2005-12-24 07:49:26 -+++ options.c 2005-10-14 19:19:18 -@@ -105,6 +105,7 @@ OFF_T max_size = 0; +--- old/options.c ++++ new/options.c +@@ -111,6 +111,7 @@ OFF_T max_size = 0; OFF_T min_size = 0; int ignore_errors = 0; int modify_window = 0; @@ -46,15 +73,15 @@ in a case-insensitive manner. int blocking_io = -1; int checksum_seed = 0; int inplace = 0; -@@ -342,6 +343,7 @@ void usage(enum logcode F) +@@ -350,6 +351,7 @@ void usage(enum logcode F) rprintf(F," --include-from=FILE read include patterns from FILE\n"); 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," --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," --blocking-io use blocking I/O for the remote shell\n"); -@@ -485,6 +487,7 @@ static struct poptOption long_options[] + rprintf(F," --sockopts=OPTIONS specify custom TCP options\n"); +@@ -503,6 +505,7 @@ static struct poptOption long_options[] {"only-write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_ONLY_WRITE_BATCH, 0, 0 }, {"files-from", 0, POPT_ARG_STRING, &files_from, 0, 0, 0 }, {"from0", '0', POPT_ARG_NONE, &eol_nulls, 0, 0, 0}, @@ -62,7 +89,7 @@ in a case-insensitive manner. {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 }, {"timeout", 0, POPT_ARG_INT, &io_timeout, 0, 0, 0 }, {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 }, -@@ -1575,6 +1578,9 @@ void server_options(char **args,int *arg +@@ -1657,6 +1660,9 @@ void server_options(char **args,int *arg args[ac++] = arg; } @@ -70,56 +97,10 @@ in a case-insensitive manner. + args[ac++] = "--ignore-case"; + if (partial_dir && am_sender) { - if (partial_dir != partialdir_for_delayupdate) { + if (partial_dir != tmp_partialdir) { args[ac++] = "--partial-dir"; ---- orig/t_stub.c 2005-11-12 20:13:05 -+++ t_stub.c 2005-11-12 20:14:28 -@@ -27,6 +27,7 @@ - **/ - - int modify_window = 0; -+int ignore_case = 0; - int module_id = -1; - int relative_paths = 0; - int human_readable = 0; ---- orig/util.c 2005-11-12 20:13:05 -+++ util.c 2005-11-12 20:14:39 -@@ -30,6 +30,7 @@ - extern int verbose; - extern int dry_run; - extern int module_id; -+extern int ignore_case; - extern int modify_window; - extern int relative_paths; - extern int human_readable; -@@ -1045,11 +1046,23 @@ int u_strcmp(const char *cs1, const char - { - const uchar *s1 = (const uchar *)cs1; - const uchar *s2 = (const uchar *)cs2; -+ -+ if (ignore_case) { -+ uchar c1, c2; -+ while (1) { -+ c1 = islower(*s1) ? toupper(*s1) : *s1; -+ c2 = islower(*s2) ? toupper(*s2) : *s2; -+ if (!c1 || c1 != c2) -+ break; -+ s1++, s2++; -+ } - -- while (*s1 && *s2 && (*s1 == *s2)) { -- s1++; s2++; -+ return (int)c1 - (int)c2; - } - -+ while (*s1 && *s1 == *s2) -+ s1++, s2++; -+ - return (int)*s1 - (int)*s2; - } - ---- orig/wildtest.c 2004-02-07 18:40:52 -+++ wildtest.c 2004-08-13 17:19:34 +--- old/wildtest.c ++++ new/wildtest.c @@ -16,6 +16,7 @@ int fnmatch_errors = 0; #endif