Unmerged patch from David Bolen to add --ignore-case.
[rsync/rsync-patches.git] / ignore-case.diff
1 From rsync-admin@lists.samba.org  Thu Apr 18 20:05:33 2002
2 Return-Path: <rsync-admin@lists.samba.org>
3 Delivered-To: mbp@samba.org
4 Received: from va.samba.org (localhost [127.0.0.1])
5         by lists.samba.org (Postfix) with ESMTP
6         id 8AD0349D4; Thu, 18 Apr 2002 20:05:32 -0700 (PDT)
7 Delivered-To: rsync@lists.samba.org
8 Received: from ctmsg01.corp.fitlinxx.com (mail.fitlinxx.com [208.247.212.10])
9         by lists.samba.org (Postfix) with ESMTP id 12ED449C6
10         for <rsync@lists.samba.org>; Thu, 18 Apr 2002 20:05:00 -0700 (PDT)
11 Received: by ctmsg01.corp.fitlinxx.com with Internet Mail Service (5.5.2653.19)
12         id <JCL2B4NB>; Thu, 18 Apr 2002 23:04:07 -0400
13 Message-ID: <926F937512224245A616323693D3F16B1C0022@ctmsg01.corp.fitlinxx.com>
14 From: David Bolen <db3l@fitlinxx.com>
15 To: 'Peter Tattam' <peter@jazz-1.trumpet.com.au>
16 Cc: rsync@lists.samba.org
17 Subject: RE: mixed case file systems.
18 MIME-Version: 1.0
19 X-Mailer: Internet Mail Service (5.5.2653.19)
20 Content-Type: text/plain;
21         charset="iso-8859-1"
22 Sender: rsync-admin@lists.samba.org
23 Errors-To: rsync-admin@lists.samba.org
24 X-BeenThere: rsync@lists.samba.org
25 X-Mailman-Version: 2.0.8
26 Precedence: bulk
27 List-Help: <mailto:rsync-request@lists.samba.org?subject=help>
28 List-Post: <mailto:rsync@lists.samba.org>
29 List-Subscribe: <http://lists.samba.org/mailman/listinfo/rsync>,
30         <mailto:rsync-request@lists.samba.org?subject=subscribe>
31 List-Id: rsync user list <rsync.lists.samba.org>
32 List-Unsubscribe: <http://lists.samba.org/mailman/listinfo/rsync>,
33         <mailto:rsync-request@lists.samba.org?subject=unsubscribe>
34 List-Archive: <http://lists.samba.org/pipermail/rsync/>
35 X-Original-Date: Thu, 18 Apr 2002 23:04:06 -0400
36 Date: Thu, 18 Apr 2002 23:04:06 -0400
37 Status: RO
38 X-Status: A
39 Content-Length: 6452
40 Lines: 205
41
42 Peter Tattam [peter@jazz-1.trumpet.com.au] writes:
43
44 > I believe a suitable workaround would be to ignore case for file names
45 > when the rsync process is undertaken.  Is this facility available or
46 > planned in the near future?
47
48 I've attached a context diff for some changes I made to our local copy
49 a while back to add an "--ignore-case" option just for this purpose.
50 In our case it came up in the context of disting between NTFS and FAT
51 remote systems.  I think we ended up not needing it, but it does make
52 rsync match filenames in a case insensitive manner, so it might at
53 least be worth trying to see if it resolves your issue.
54
55 A few caveats - both ends have to support the option - I couldn't make
56 it backwards compatible because both ends exchange information about a
57 sorted file list that has to sort the same way on either side (which
58 very subtly bit me when I first did this).  I also didn't bump the
59 protocol in this patch (wasn't quite sure it was appropriate just for an
60 incompatible command line option) since since it was for local use.
61
62 The patch is based on a 2.4.x series rsync, but if it doesn't apply
63 cleanly to 2.5.x, it's should be simple enough to just apply manually.
64
65 -- David
66
67 /-----------------------------------------------------------------------\
68  \               David Bolen            \   E-mail: db3l@fitlinxx.com  /
69   |             FitLinxx, Inc.            \  Phone: (203) 708-5192    |
70  /  860 Canal Street, Stamford, CT  06902   \  Fax: (203) 316-5150     \
71 \-----------------------------------------------------------------------/
72
73           - - - - - - - - - - - - - - - - - - - - - - - - -
74
75 Index: options.c
76 ===================================================================
77 RCS file: e:/binaries/cvs/ni/bin/rsync/options.c,v
78 retrieving revision 1.5
79 retrieving revision 1.7
80 diff -c -r1.5 -r1.7
81 *** options.c   2000/12/28 00:30:18     1.5
82 --- options.c   2001/06/20 19:25:24     1.7
83 ***************
84 *** 72,77 ****
85 --- 72,78 ----
86   #else
87   int modify_window=0;
88   #endif /* _WIN32 */
89 + int ignore_case=0;
90   int modify_window_set=0;
91   int delete_sent=0;
92   
93 ***************
94 *** 162,167 ****
95 --- 164,170 ----
96     rprintf(F,"     --exclude-from=FILE     exclude patterns listed in
97 FILE\n");
98     rprintf(F,"     --include=PATTERN       don't exclude files matching
99 PATTERN\n");
100     rprintf(F,"     --include-from=FILE     don't exclude patterns listed in
101 FILE\n");
102 +   rprintf(F,"     --ignore-case           ignore case when comparing
103 filenames\n");
104     rprintf(F,"     --version               print version number\n");  
105     rprintf(F,"     --daemon                run as a rsync daemon\n");  
106     rprintf(F,"     --address               bind to the specified
107 address\n");  
108 ***************
109 *** 186,194 ****
110         OPT_PROGRESS, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS,
111 OPT_COMPARE_DEST,
112         OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
113         OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, 
114 !       OPT_IGNORE_ERRORS, OPT_MODIFY_WINDOW, OPT_DELETE_SENT};
115   
116 ! static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
117   
118   static struct option long_options[] = {
119     {"version",     0,     0,    OPT_VERSION},
120 --- 189,198 ----
121         OPT_PROGRESS, OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS,
122 OPT_COMPARE_DEST,
123         OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
124         OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, 
125 !       OPT_IGNORE_ERRORS, OPT_MODIFY_WINDOW, OPT_DELETE_SENT,
126 !       OPT_IGNORE_CASE};
127   
128 ! static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
129   
130   static struct option long_options[] = {
131     {"version",     0,     0,    OPT_VERSION},
132 ***************
133 *** 204,209 ****
134 --- 208,214 ----
135     {"exclude-from",1,     0,    OPT_EXCLUDE_FROM},
136     {"include",     1,     0,    OPT_INCLUDE},
137     {"include-from",1,     0,    OPT_INCLUDE_FROM},
138 +   {"ignore-case", 0,     0,    OPT_IGNORE_CASE},
139     {"rsync-path",  1,     0,    OPT_RSYNC_PATH},
140     {"password-file", 1,        0,     OPT_PASSWORD_FILE},
141     {"one-file-system",0,  0,    'x'},
142 ***************
143 *** 401,406 ****
144 --- 406,415 ----
145                         add_exclude_file(optarg,1, 1);
146                         break;
147   
148 +               case OPT_IGNORE_CASE:
149 +                       ignore_case=1;
150 +                       break;
151 +                     
152                 case OPT_COPY_UNSAFE_LINKS:
153                         copy_unsafe_links=1;
154                         break;
155 ***************
156 *** 712,717 ****
157 --- 727,736 ----
158                 slprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
159                          modify_window);
160                 args[ac++] = mwindow;
161 +       }
162
163 +       if (ignore_case) {
164 +          args[ac++] = "--ignore-case";
165         }
166   
167         if (keep_partial)
168 Index: exclude.c
169 ===================================================================
170 RCS file: e:/binaries/cvs/ni/bin/rsync/exclude.c,v
171 retrieving revision 1.1.1.1
172 retrieving revision 1.2
173 diff -c -r1.1.1.1 -r1.2
174 *** exclude.c   2000/05/30 18:08:19     1.1.1.1
175 --- exclude.c   2001/06/14 04:30:17     1.2
176 ***************
177 *** 31,36 ****
178 --- 31,37 ----
179   static struct exclude_struct *make_exclude(char *pattern, int include)
180   {
181         struct exclude_struct *ret;
182 +       extern int ignore_case;
183   
184         ret = (struct exclude_struct *)malloc(sizeof(*ret));
185         if (!ret) out_of_memory("make_exclude");
186 ***************
187 *** 72,77 ****
188 --- 73,82 ----
189   
190         if (!strchr(ret->pattern,'/')) {
191                 ret->local = 1;
192 +       }
193
194 +       if (ignore_case) {
195 +          ret->fnmatch_flags |= FNM_CASEFOLD;
196         }
197   
198         return ret;
199 Index: util.c
200 ===================================================================
201 RCS file: e:/binaries/cvs/ni/bin/rsync/util.c,v
202 retrieving revision 1.2
203 retrieving revision 1.3
204 diff -c -r1.2 -r1.3
205 *** util.c      2000/07/07 03:23:40     1.2
206 --- util.c      2001/06/14 04:30:17     1.3
207 ***************
208 *** 838,849 ****
209   {
210         const uchar *s1 = (const uchar *)cs1;
211         const uchar *s2 = (const uchar *)cs2;
212   
213 !       while (*s1 && *s2 && (*s1 == *s2)) {
214 !               s1++; s2++;
215         }
216 -       
217 -       return (int)*s1 - (int)*s2;
218   }
219   
220   static OFF_T last_ofs;
221 --- 836,856 ----
222   {
223         const uchar *s1 = (const uchar *)cs1;
224         const uchar *s2 = (const uchar *)cs2;
225 +       extern int ignore_case;
226 +       
227 +       if (ignore_case) {
228 +               while (*s1 && *s2 && (toupper(*s1) == toupper(*s2))) {
229 +                       s1++; s2++;
230 +               }
231
232 +               return (int)toupper(*s1) - (int)toupper(*s2);
233 +       } else {
234 +               while (*s1 && *s2 && (*s1 == *s2)) {
235 +                       s1++; s2++;
236 +               }
237   
238 !               return (int)*s1 - (int)*s2;
239         }
240   }
241   
242   static OFF_T last_ofs;
243
244 -- 
245 To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync
246 Before posting, read: http://www.tuxedo.org/~esr/faqs/smart-questions.html
247