From rsync-admin@lists.samba.org Thu Apr 18 20:05:33 2002 Return-Path: Delivered-To: mbp@samba.org Received: from va.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 8AD0349D4; Thu, 18 Apr 2002 20:05:32 -0700 (PDT) Delivered-To: rsync@lists.samba.org Received: from ctmsg01.corp.fitlinxx.com (mail.fitlinxx.com [208.247.212.10]) by lists.samba.org (Postfix) with ESMTP id 12ED449C6 for ; Thu, 18 Apr 2002 20:05:00 -0700 (PDT) Received: by ctmsg01.corp.fitlinxx.com with Internet Mail Service (5.5.2653.19) id ; Thu, 18 Apr 2002 23:04:07 -0400 Message-ID: <926F937512224245A616323693D3F16B1C0022@ctmsg01.corp.fitlinxx.com> From: David Bolen To: 'Peter Tattam' Cc: rsync@lists.samba.org Subject: RE: mixed case file systems. MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) Content-Type: text/plain; charset="iso-8859-1" Sender: rsync-admin@lists.samba.org Errors-To: rsync-admin@lists.samba.org X-BeenThere: rsync@lists.samba.org X-Mailman-Version: 2.0.8 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: rsync user list List-Unsubscribe: , List-Archive: X-Original-Date: Thu, 18 Apr 2002 23:04:06 -0400 Date: Thu, 18 Apr 2002 23:04:06 -0400 Status: RO X-Status: A Content-Length: 6452 Lines: 205 Peter Tattam [peter@jazz-1.trumpet.com.au] writes: > I believe a suitable workaround would be to ignore case for file names > when the rsync process is undertaken. Is this facility available or > planned in the near future? I've attached a context diff for some changes I made to our local copy a while back to add an "--ignore-case" option just for this purpose. In our case it came up in the context of disting between NTFS and FAT remote systems. I think we ended up not needing it, but it does make rsync match filenames in a case insensitive manner, so it might at least be worth trying to see if it resolves your issue. A few caveats - both ends have to support the option - I couldn't make it backwards compatible because both ends exchange information about a sorted file list that has to sort the same way on either side (which very subtly bit me when I first did this). I also didn't bump the protocol in this patch (wasn't quite sure it was appropriate just for an incompatible command line option) since since it was for local use. The patch is based on a 2.4.x series rsync, but if it doesn't apply cleanly to 2.5.x, it's should be simple enough to just apply manually. -- David /-----------------------------------------------------------------------\ \ David Bolen \ E-mail: db3l@fitlinxx.com / | FitLinxx, Inc. \ Phone: (203) 708-5192 | / 860 Canal Street, Stamford, CT 06902 \ Fax: (203) 316-5150 \ \-----------------------------------------------------------------------/ - - - - - - - - - - - - - - - - - - - - - - - - - Index: options.c =================================================================== RCS file: e:/binaries/cvs/ni/bin/rsync/options.c,v retrieving revision 1.5 retrieving revision 1.7 diff -c -r1.5 -r1.7 *** options.c 2000/12/28 00:30:18 1.5 --- options.c 2001/06/20 19:25:24 1.7 *************** *** 72,77 **** --- 72,78 ---- #else int modify_window=0; #endif /* _WIN32 */ + int ignore_case=0; int modify_window_set=0; int delete_sent=0; *************** *** 162,167 **** --- 164,170 ---- rprintf(F," --exclude-from=FILE exclude patterns listed in FILE\n"); rprintf(F," --include=PATTERN don't exclude files matching PATTERN\n"); rprintf(F," --include-from=FILE don't exclude patterns listed in FILE\n"); + rprintf(F," --ignore-case ignore case when comparing filenames\n"); rprintf(F," --version print version number\n"); rprintf(F," --daemon run as a rsync daemon\n"); rprintf(F," --address bind to the specified address\n"); *************** *** 186,194 **** OPT_PROGRESS, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, ! OPT_IGNORE_ERRORS, OPT_MODIFY_WINDOW, OPT_DELETE_SENT}; ! static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; static struct option long_options[] = { {"version", 0, 0, OPT_VERSION}, --- 189,198 ---- OPT_PROGRESS, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST, OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS, OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, ! OPT_IGNORE_ERRORS, OPT_MODIFY_WINDOW, OPT_DELETE_SENT, ! OPT_IGNORE_CASE}; ! static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP"; static struct option long_options[] = { {"version", 0, 0, OPT_VERSION}, *************** *** 204,209 **** --- 208,214 ---- {"exclude-from",1, 0, OPT_EXCLUDE_FROM}, {"include", 1, 0, OPT_INCLUDE}, {"include-from",1, 0, OPT_INCLUDE_FROM}, + {"ignore-case", 0, 0, OPT_IGNORE_CASE}, {"rsync-path", 1, 0, OPT_RSYNC_PATH}, {"password-file", 1, 0, OPT_PASSWORD_FILE}, {"one-file-system",0, 0, 'x'}, *************** *** 401,406 **** --- 406,415 ---- add_exclude_file(optarg,1, 1); break; + case OPT_IGNORE_CASE: + ignore_case=1; + break; + case OPT_COPY_UNSAFE_LINKS: copy_unsafe_links=1; break; *************** *** 712,717 **** --- 727,736 ---- slprintf(mwindow,sizeof(mwindow),"--modify-window=%d", modify_window); args[ac++] = mwindow; + } + + if (ignore_case) { + args[ac++] = "--ignore-case"; } if (keep_partial) Index: exclude.c =================================================================== RCS file: e:/binaries/cvs/ni/bin/rsync/exclude.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -c -r1.1.1.1 -r1.2 *** exclude.c 2000/05/30 18:08:19 1.1.1.1 --- exclude.c 2001/06/14 04:30:17 1.2 *************** *** 31,36 **** --- 31,37 ---- static struct exclude_struct *make_exclude(char *pattern, int include) { struct exclude_struct *ret; + extern int ignore_case; ret = (struct exclude_struct *)malloc(sizeof(*ret)); if (!ret) out_of_memory("make_exclude"); *************** *** 72,77 **** --- 73,82 ---- if (!strchr(ret->pattern,'/')) { ret->local = 1; + } + + if (ignore_case) { + ret->fnmatch_flags |= FNM_CASEFOLD; } return ret; Index: util.c =================================================================== RCS file: e:/binaries/cvs/ni/bin/rsync/util.c,v retrieving revision 1.2 retrieving revision 1.3 diff -c -r1.2 -r1.3 *** util.c 2000/07/07 03:23:40 1.2 --- util.c 2001/06/14 04:30:17 1.3 *************** *** 838,849 **** { const uchar *s1 = (const uchar *)cs1; const uchar *s2 = (const uchar *)cs2; ! while (*s1 && *s2 && (*s1 == *s2)) { ! s1++; s2++; } - - return (int)*s1 - (int)*s2; } static OFF_T last_ofs; --- 836,856 ---- { const uchar *s1 = (const uchar *)cs1; const uchar *s2 = (const uchar *)cs2; + extern int ignore_case; + + if (ignore_case) { + while (*s1 && *s2 && (toupper(*s1) == toupper(*s2))) { + s1++; s2++; + } + + return (int)toupper(*s1) - (int)toupper(*s2); + } else { + while (*s1 && *s2 && (*s1 == *s2)) { + s1++; s2++; + } ! return (int)*s1 - (int)*s2; } } static OFF_T last_ofs; -- To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html