Fossil SCM

All ui pages (and their JSON equivalent) should handle filenames case-sensitive because they don't access the file system

jan.nijtmans 2013-04-28 20:19 trunk merge
Commit 4c5c96c9e01f4864e5eec55cdffa6d0ddb1cd0de
+2 -3
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402402
#endif
403403
caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404404
}
405405
if( !caseSensitive && g.localOpen ){
406406
db_multi_exec(
407
- "CREATE INDEX IF NOT EXISTS %s.vfile_nocase "
408
- " ON vfile(pathname COLLATE nocase)",
409
- db_name("localdb")
407
+ "CREATE INDEX IF NOT EXISTS vfile_nocase"
408
+ " ON vfile(pathname COLLATE nocase)"
410409
);
411410
}
412411
}
413412
return caseSensitive;
414413
}
415414
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402 #endif
403 caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404 }
405 if( !caseSensitive && g.localOpen ){
406 db_multi_exec(
407 "CREATE INDEX IF NOT EXISTS %s.vfile_nocase "
408 " ON vfile(pathname COLLATE nocase)",
409 db_name("localdb")
410 );
411 }
412 }
413 return caseSensitive;
414 }
415
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402 #endif
403 caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404 }
405 if( !caseSensitive && g.localOpen ){
406 db_multi_exec(
407 "CREATE INDEX IF NOT EXISTS vfile_nocase"
408 " ON vfile(pathname COLLATE nocase)"
 
409 );
410 }
411 }
412 return caseSensitive;
413 }
414
+2 -3
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402402
#endif
403403
caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404404
}
405405
if( !caseSensitive && g.localOpen ){
406406
db_multi_exec(
407
- "CREATE INDEX IF NOT EXISTS %s.vfile_nocase "
408
- " ON vfile(pathname COLLATE nocase)",
409
- db_name("localdb")
407
+ "CREATE INDEX IF NOT EXISTS vfile_nocase"
408
+ " ON vfile(pathname COLLATE nocase)"
410409
);
411410
}
412411
}
413412
return caseSensitive;
414413
}
415414
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402 #endif
403 caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404 }
405 if( !caseSensitive && g.localOpen ){
406 db_multi_exec(
407 "CREATE INDEX IF NOT EXISTS %s.vfile_nocase "
408 " ON vfile(pathname COLLATE nocase)",
409 db_name("localdb")
410 );
411 }
412 }
413 return caseSensitive;
414 }
415
--- src/add.c
+++ src/add.c
@@ -402,13 +402,12 @@
402 #endif
403 caseSensitive = db_get_boolean("case-sensitive",caseSensitive);
404 }
405 if( !caseSensitive && g.localOpen ){
406 db_multi_exec(
407 "CREATE INDEX IF NOT EXISTS vfile_nocase"
408 " ON vfile(pathname COLLATE nocase)"
 
409 );
410 }
411 }
412 return caseSensitive;
413 }
414
+18 -35
--- src/browse.c
+++ src/browse.c
@@ -80,15 +80,15 @@
8080
for(i=0; zPath[i]; i=j){
8181
for(j=i; zPath[j] && zPath[j]!='/'; j++){}
8282
if( zPath[j] && g.perm.Hyperlink ){
8383
if( zCI ){
8484
char *zLink = href("%R/dir?ci=%S&name=%#T", zCI, j, zPath);
85
- blob_appendf(pOut, "%s%z%#h</a>",
85
+ blob_appendf(pOut, "%s%z%#h</a>",
8686
zSep, zLink, j-i, &zPath[i]);
8787
}else{
8888
char *zLink = href("%R/dir?name=%#T", j, zPath);
89
- blob_appendf(pOut, "%s%z%#h</a>",
89
+ blob_appendf(pOut, "%s%z%#h</a>",
9090
zSep, zLink, j-i, &zPath[i]);
9191
}
9292
}else{
9393
blob_appendf(pOut, "%s%#h", zSep, j-i, &zPath[i]);
9494
}
@@ -146,11 +146,11 @@
146146
}else{
147147
zCI = 0;
148148
}
149149
}
150150
151
- /* Compute the title of the page */
151
+ /* Compute the title of the page */
152152
blob_zero(&dirname);
153153
if( zD ){
154154
blob_append(&dirname, "in directory ", -1);
155155
hyperlinked_path(zD, &dirname, zCI);
156156
zPrefix = mprintf("%s/", zD);
@@ -191,47 +191,39 @@
191191
@ %s(blob_str(&dirname))</h2>
192192
zSubdirLink = mprintf("%R/dir?name=%T", zPrefix);
193193
}
194194
195195
/* Compute the temporary table "localfiles" containing the names
196
- ** of all files and subdirectories in the zD[] directory.
196
+ ** of all files and subdirectories in the zD[] directory.
197197
**
198198
** Subdirectory names begin with "/". This causes them to sort
199199
** first and it also gives us an easy way to distinguish files
200200
** from directories in the loop that follows.
201201
*/
202202
db_multi_exec(
203
- "CREATE TEMP TABLE localfiles(x UNIQUE NOT NULL %s, u);",
204
- filename_collation()
203
+ "CREATE TEMP TABLE localfiles(x UNIQUE NOT NULL, u);"
205204
);
206205
if( zCI ){
207206
Stmt ins;
208207
ManifestFile *pFile;
209208
ManifestFile *pPrev = 0;
210209
int nPrev = 0;
211210
int c;
212
- int (*xCmp)(const char*,const char*,int);
213
-
214
- if( filenames_are_case_sensitive() ){
215
- xCmp = fossil_strncmp;
216
- }else{
217
- xCmp = fossil_strnicmp;
218
- }
219211
220212
db_prepare(&ins,
221213
"INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)"
222214
);
223215
manifest_file_rewind(pM);
224216
while( (pFile = manifest_file_next(pM,0))!=0 ){
225
- if( nD>0
226
- && (xCmp(pFile->zName, zD, nD-1)!=0
217
+ if( nD>0
218
+ && (fossil_strncmp(pFile->zName, zD, nD-1)!=0
227219
|| pFile->zName[nD-1]!='/')
228220
){
229221
continue;
230222
}
231223
if( pPrev
232
- && xCmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0
224
+ && fossil_strncmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0
233225
&& (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/')
234226
){
235227
continue;
236228
}
237229
db_bind_text(&ins, ":x", &pFile->zName[nD]);
@@ -242,25 +234,16 @@
242234
for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
243235
if( c=='/' ) nPrev++;
244236
}
245237
db_finalize(&ins);
246238
}else if( zD ){
247
- if( filenames_are_case_sensitive() ){
248
- db_multi_exec(
249
- "INSERT OR IGNORE INTO localfiles"
250
- " SELECT pathelement(name,%d), NULL FROM filename"
251
- " WHERE name GLOB '%q/*'",
252
- nD, zD
253
- );
254
- }else{
255
- db_multi_exec(
256
- "INSERT OR IGNORE INTO localfiles"
257
- " SELECT pathelement(name,%d), NULL FROM filename"
258
- " WHERE name LIKE '%q/%%'",
259
- nD, zD
260
- );
261
- }
239
+ db_multi_exec(
240
+ "INSERT OR IGNORE INTO localfiles"
241
+ " SELECT pathelement(name,%d), NULL FROM filename"
242
+ " WHERE name GLOB '%q/*'",
243
+ nD, zD
244
+ );
262245
}else{
263246
db_multi_exec(
264247
"INSERT OR IGNORE INTO localfiles"
265248
" SELECT pathelement(name,0), NULL FROM filename"
266249
);
@@ -351,11 +334,11 @@
351334
"CREATE INDEX fileage_fid ON fileage(fid);"
352335
);
353336
pManifest = manifest_get(vid, CFTYPE_MANIFEST);
354337
if( pManifest==0 ) return 1;
355338
manifest_file_rewind(pManifest);
356
- db_prepare(&ins,
339
+ db_prepare(&ins,
357340
"INSERT INTO temp.fileage(fid, pathname)"
358341
" SELECT rid, :path FROM blob WHERE uuid=:uuid"
359342
);
360343
while( (pFile = manifest_file_next(pManifest, 0))!=0 ){
361344
db_bind_text(&ins, ":uuid", pFile->zUuid);
@@ -428,13 +411,13 @@
428411
baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
429412
zBaseTime = db_text("","SELECT datetime(%.20g,'localtime')", baseTime);
430413
@ <h2>File Ages For Check-in
431414
@ %z(href("%R/info?name=%T",zName))%h(zName)</a></h2>
432415
@
433
- @ <p>The times given are relative
416
+ @ <p>The times given are relative
434417
@ %z(href("%R/timeline?c=%T",zBaseTime))%s(zBaseTime)</a>, which is the
435
- @ check-in time for
418
+ @ check-in time for
436419
@ %z(href("%R/info?name=%T",zName))%h(zName)</a></p>
437420
@
438421
@ <table border=0 cellspacing=0 cellpadding=0>
439422
db_prepare(&q,
440423
"SELECT mtime, (SELECT uuid FROM blob WHERE rid=fid), mid, pathname"
@@ -471,7 +454,7 @@
471454
@
472455
}
473456
@ <tr><td colspan=3><hr></tr>
474457
@ </table>
475458
db_finalize(&q);
476
- style_footer();
459
+ style_footer();
477460
}
478461
--- src/browse.c
+++ src/browse.c
@@ -80,15 +80,15 @@
80 for(i=0; zPath[i]; i=j){
81 for(j=i; zPath[j] && zPath[j]!='/'; j++){}
82 if( zPath[j] && g.perm.Hyperlink ){
83 if( zCI ){
84 char *zLink = href("%R/dir?ci=%S&name=%#T", zCI, j, zPath);
85 blob_appendf(pOut, "%s%z%#h</a>",
86 zSep, zLink, j-i, &zPath[i]);
87 }else{
88 char *zLink = href("%R/dir?name=%#T", j, zPath);
89 blob_appendf(pOut, "%s%z%#h</a>",
90 zSep, zLink, j-i, &zPath[i]);
91 }
92 }else{
93 blob_appendf(pOut, "%s%#h", zSep, j-i, &zPath[i]);
94 }
@@ -146,11 +146,11 @@
146 }else{
147 zCI = 0;
148 }
149 }
150
151 /* Compute the title of the page */
152 blob_zero(&dirname);
153 if( zD ){
154 blob_append(&dirname, "in directory ", -1);
155 hyperlinked_path(zD, &dirname, zCI);
156 zPrefix = mprintf("%s/", zD);
@@ -191,47 +191,39 @@
191 @ %s(blob_str(&dirname))</h2>
192 zSubdirLink = mprintf("%R/dir?name=%T", zPrefix);
193 }
194
195 /* Compute the temporary table "localfiles" containing the names
196 ** of all files and subdirectories in the zD[] directory.
197 **
198 ** Subdirectory names begin with "/". This causes them to sort
199 ** first and it also gives us an easy way to distinguish files
200 ** from directories in the loop that follows.
201 */
202 db_multi_exec(
203 "CREATE TEMP TABLE localfiles(x UNIQUE NOT NULL %s, u);",
204 filename_collation()
205 );
206 if( zCI ){
207 Stmt ins;
208 ManifestFile *pFile;
209 ManifestFile *pPrev = 0;
210 int nPrev = 0;
211 int c;
212 int (*xCmp)(const char*,const char*,int);
213
214 if( filenames_are_case_sensitive() ){
215 xCmp = fossil_strncmp;
216 }else{
217 xCmp = fossil_strnicmp;
218 }
219
220 db_prepare(&ins,
221 "INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)"
222 );
223 manifest_file_rewind(pM);
224 while( (pFile = manifest_file_next(pM,0))!=0 ){
225 if( nD>0
226 && (xCmp(pFile->zName, zD, nD-1)!=0
227 || pFile->zName[nD-1]!='/')
228 ){
229 continue;
230 }
231 if( pPrev
232 && xCmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0
233 && (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/')
234 ){
235 continue;
236 }
237 db_bind_text(&ins, ":x", &pFile->zName[nD]);
@@ -242,25 +234,16 @@
242 for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
243 if( c=='/' ) nPrev++;
244 }
245 db_finalize(&ins);
246 }else if( zD ){
247 if( filenames_are_case_sensitive() ){
248 db_multi_exec(
249 "INSERT OR IGNORE INTO localfiles"
250 " SELECT pathelement(name,%d), NULL FROM filename"
251 " WHERE name GLOB '%q/*'",
252 nD, zD
253 );
254 }else{
255 db_multi_exec(
256 "INSERT OR IGNORE INTO localfiles"
257 " SELECT pathelement(name,%d), NULL FROM filename"
258 " WHERE name LIKE '%q/%%'",
259 nD, zD
260 );
261 }
262 }else{
263 db_multi_exec(
264 "INSERT OR IGNORE INTO localfiles"
265 " SELECT pathelement(name,0), NULL FROM filename"
266 );
@@ -351,11 +334,11 @@
351 "CREATE INDEX fileage_fid ON fileage(fid);"
352 );
353 pManifest = manifest_get(vid, CFTYPE_MANIFEST);
354 if( pManifest==0 ) return 1;
355 manifest_file_rewind(pManifest);
356 db_prepare(&ins,
357 "INSERT INTO temp.fileage(fid, pathname)"
358 " SELECT rid, :path FROM blob WHERE uuid=:uuid"
359 );
360 while( (pFile = manifest_file_next(pManifest, 0))!=0 ){
361 db_bind_text(&ins, ":uuid", pFile->zUuid);
@@ -428,13 +411,13 @@
428 baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
429 zBaseTime = db_text("","SELECT datetime(%.20g,'localtime')", baseTime);
430 @ <h2>File Ages For Check-in
431 @ %z(href("%R/info?name=%T",zName))%h(zName)</a></h2>
432 @
433 @ <p>The times given are relative
434 @ %z(href("%R/timeline?c=%T",zBaseTime))%s(zBaseTime)</a>, which is the
435 @ check-in time for
436 @ %z(href("%R/info?name=%T",zName))%h(zName)</a></p>
437 @
438 @ <table border=0 cellspacing=0 cellpadding=0>
439 db_prepare(&q,
440 "SELECT mtime, (SELECT uuid FROM blob WHERE rid=fid), mid, pathname"
@@ -471,7 +454,7 @@
471 @
472 }
473 @ <tr><td colspan=3><hr></tr>
474 @ </table>
475 db_finalize(&q);
476 style_footer();
477 }
478
--- src/browse.c
+++ src/browse.c
@@ -80,15 +80,15 @@
80 for(i=0; zPath[i]; i=j){
81 for(j=i; zPath[j] && zPath[j]!='/'; j++){}
82 if( zPath[j] && g.perm.Hyperlink ){
83 if( zCI ){
84 char *zLink = href("%R/dir?ci=%S&name=%#T", zCI, j, zPath);
85 blob_appendf(pOut, "%s%z%#h</a>",
86 zSep, zLink, j-i, &zPath[i]);
87 }else{
88 char *zLink = href("%R/dir?name=%#T", j, zPath);
89 blob_appendf(pOut, "%s%z%#h</a>",
90 zSep, zLink, j-i, &zPath[i]);
91 }
92 }else{
93 blob_appendf(pOut, "%s%#h", zSep, j-i, &zPath[i]);
94 }
@@ -146,11 +146,11 @@
146 }else{
147 zCI = 0;
148 }
149 }
150
151 /* Compute the title of the page */
152 blob_zero(&dirname);
153 if( zD ){
154 blob_append(&dirname, "in directory ", -1);
155 hyperlinked_path(zD, &dirname, zCI);
156 zPrefix = mprintf("%s/", zD);
@@ -191,47 +191,39 @@
191 @ %s(blob_str(&dirname))</h2>
192 zSubdirLink = mprintf("%R/dir?name=%T", zPrefix);
193 }
194
195 /* Compute the temporary table "localfiles" containing the names
196 ** of all files and subdirectories in the zD[] directory.
197 **
198 ** Subdirectory names begin with "/". This causes them to sort
199 ** first and it also gives us an easy way to distinguish files
200 ** from directories in the loop that follows.
201 */
202 db_multi_exec(
203 "CREATE TEMP TABLE localfiles(x UNIQUE NOT NULL, u);"
 
204 );
205 if( zCI ){
206 Stmt ins;
207 ManifestFile *pFile;
208 ManifestFile *pPrev = 0;
209 int nPrev = 0;
210 int c;
 
 
 
 
 
 
 
211
212 db_prepare(&ins,
213 "INSERT OR IGNORE INTO localfiles VALUES(pathelement(:x,0), :u)"
214 );
215 manifest_file_rewind(pM);
216 while( (pFile = manifest_file_next(pM,0))!=0 ){
217 if( nD>0
218 && (fossil_strncmp(pFile->zName, zD, nD-1)!=0
219 || pFile->zName[nD-1]!='/')
220 ){
221 continue;
222 }
223 if( pPrev
224 && fossil_strncmp(&pFile->zName[nD],&pPrev->zName[nD],nPrev)==0
225 && (pFile->zName[nD+nPrev]==0 || pFile->zName[nD+nPrev]=='/')
226 ){
227 continue;
228 }
229 db_bind_text(&ins, ":x", &pFile->zName[nD]);
@@ -242,25 +234,16 @@
234 for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
235 if( c=='/' ) nPrev++;
236 }
237 db_finalize(&ins);
238 }else if( zD ){
239 db_multi_exec(
240 "INSERT OR IGNORE INTO localfiles"
241 " SELECT pathelement(name,%d), NULL FROM filename"
242 " WHERE name GLOB '%q/*'",
243 nD, zD
244 );
 
 
 
 
 
 
 
 
 
245 }else{
246 db_multi_exec(
247 "INSERT OR IGNORE INTO localfiles"
248 " SELECT pathelement(name,0), NULL FROM filename"
249 );
@@ -351,11 +334,11 @@
334 "CREATE INDEX fileage_fid ON fileage(fid);"
335 );
336 pManifest = manifest_get(vid, CFTYPE_MANIFEST);
337 if( pManifest==0 ) return 1;
338 manifest_file_rewind(pManifest);
339 db_prepare(&ins,
340 "INSERT INTO temp.fileage(fid, pathname)"
341 " SELECT rid, :path FROM blob WHERE uuid=:uuid"
342 );
343 while( (pFile = manifest_file_next(pManifest, 0))!=0 ){
344 db_bind_text(&ins, ":uuid", pFile->zUuid);
@@ -428,13 +411,13 @@
411 baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
412 zBaseTime = db_text("","SELECT datetime(%.20g,'localtime')", baseTime);
413 @ <h2>File Ages For Check-in
414 @ %z(href("%R/info?name=%T",zName))%h(zName)</a></h2>
415 @
416 @ <p>The times given are relative
417 @ %z(href("%R/timeline?c=%T",zBaseTime))%s(zBaseTime)</a>, which is the
418 @ check-in time for
419 @ %z(href("%R/info?name=%T",zName))%h(zName)</a></p>
420 @
421 @ <table border=0 cellspacing=0 cellpadding=0>
422 db_prepare(&q,
423 "SELECT mtime, (SELECT uuid FROM blob WHERE rid=fid), mid, pathname"
@@ -471,7 +454,7 @@
454 @
455 }
456 @ <tr><td colspan=3><hr></tr>
457 @ </table>
458 db_finalize(&q);
459 style_footer();
460 }
461
+4 -4
--- src/finfo.c
+++ src/finfo.c
@@ -310,13 +310,13 @@
310310
if( firstChngOnly ){
311311
blob_appendf(&sql, ", min(event.mtime)");
312312
}
313313
blob_appendf(&sql,
314314
" FROM mlink, event"
315
- " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q %s)"
315
+ " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q)"
316316
" AND event.objid=mlink.mid",
317
- zFilename, filename_collation()
317
+ zFilename
318318
);
319319
if( (zA = P("a"))!=0 ){
320320
blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA);
321321
url_add_parameter(&url, "a", zA);
322322
}
@@ -407,12 +407,12 @@
407407
char *zNewName;
408408
zNewName = db_text(0,
409409
"SELECT name FROM filename WHERE fnid = "
410410
" (SELECT fnid FROM mlink"
411411
" WHERE mid=%d"
412
- " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q %s))",
413
- fmid, zFilename, filename_collation());
412
+ " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))",
413
+ fmid, zFilename);
414414
if( zNewName ){
415415
@ <b>Renamed</b> to
416416
@ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a> by check-in
417417
fossil_free(zNewName);
418418
}else{
419419
--- src/finfo.c
+++ src/finfo.c
@@ -310,13 +310,13 @@
310 if( firstChngOnly ){
311 blob_appendf(&sql, ", min(event.mtime)");
312 }
313 blob_appendf(&sql,
314 " FROM mlink, event"
315 " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q %s)"
316 " AND event.objid=mlink.mid",
317 zFilename, filename_collation()
318 );
319 if( (zA = P("a"))!=0 ){
320 blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA);
321 url_add_parameter(&url, "a", zA);
322 }
@@ -407,12 +407,12 @@
407 char *zNewName;
408 zNewName = db_text(0,
409 "SELECT name FROM filename WHERE fnid = "
410 " (SELECT fnid FROM mlink"
411 " WHERE mid=%d"
412 " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q %s))",
413 fmid, zFilename, filename_collation());
414 if( zNewName ){
415 @ <b>Renamed</b> to
416 @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a> by check-in
417 fossil_free(zNewName);
418 }else{
419
--- src/finfo.c
+++ src/finfo.c
@@ -310,13 +310,13 @@
310 if( firstChngOnly ){
311 blob_appendf(&sql, ", min(event.mtime)");
312 }
313 blob_appendf(&sql,
314 " FROM mlink, event"
315 " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q)"
316 " AND event.objid=mlink.mid",
317 zFilename
318 );
319 if( (zA = P("a"))!=0 ){
320 blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA);
321 url_add_parameter(&url, "a", zA);
322 }
@@ -407,12 +407,12 @@
407 char *zNewName;
408 zNewName = db_text(0,
409 "SELECT name FROM filename WHERE fnid = "
410 " (SELECT fnid FROM mlink"
411 " WHERE mid=%d"
412 " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))",
413 fmid, zFilename);
414 if( zNewName ){
415 @ <b>Renamed</b> to
416 @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a> by check-in
417 fossil_free(zNewName);
418 }else{
419
+17 -31
--- src/json_dir.c
+++ src/json_dir.c
@@ -104,11 +104,11 @@
104104
105105
sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0,
106106
pathelementFunc, 0, 0);
107107
108108
/* Compute the temporary table "localfiles" containing the names
109
- ** of all files and subdirectories in the zD[] directory.
109
+ ** of all files and subdirectories in the zD[] directory.
110110
**
111111
** Subdirectory names begin with "/". This causes them to sort
112112
** first and it also gives us an easy way to distinguish files
113113
** from directories in the loop that follows.
114114
*/
@@ -120,19 +120,18 @@
120120
int nPrev = 0;
121121
int c;
122122
123123
db_multi_exec(
124124
"CREATE TEMP TABLE json_dir_files("
125
- " n UNIQUE NOT NULL %s," /* file name */
126
- " fn UNIQUE NOT NULL %s," /* full file name */
125
+ " n UNIQUE NOT NULL," /* file name */
126
+ " fn UNIQUE NOT NULL," /* full file name */
127127
" u DEFAULT NULL," /* file uuid */
128128
" sz DEFAULT -1," /* file size */
129129
" mtime DEFAULT NULL" /* file mtime in unix epoch format */
130
- ");",
131
- filename_collation(), filename_collation()
130
+ ");"
132131
);
133
-
132
+
134133
db_prepare(&ins,
135134
"INSERT OR IGNORE INTO json_dir_files (n,fn,u,sz,mtime) "
136135
"SELECT"
137136
" pathelement(:path,0),"
138137
" CASE WHEN %Q IS NULL THEN '' ELSE %Q||'/' END ||:abspath,"
@@ -151,11 +150,11 @@
151150
" AND a.uuid=:uuid",
152151
zD, zD
153152
);
154153
manifest_file_rewind(pM);
155154
while( (pFile = manifest_file_next(pM,0))!=0 ){
156
- if( nD>0
155
+ if( nD>0
157156
&& ((pFile->zName[nD-1]!='/') || (0!=memcmp(pFile->zName, zD, nD-1)))
158157
){
159158
continue;
160159
}
161160
/*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/
@@ -174,33 +173,20 @@
174173
for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
175174
if( c=='/' ) nPrev++;
176175
}
177176
db_finalize(&ins);
178177
}else if( zD && *zD ){
179
- if( filenames_are_case_sensitive() ){
180
- db_multi_exec(
181
- "CREATE TEMP VIEW json_dir_files AS"
182
- " SELECT DISTINCT(pathelement(name,%d)) AS n,"
183
- " %Q||'/'||name AS fn,"
184
- " NULL AS u, NULL AS sz, NULL AS mtime"
185
- " FROM filename"
186
- " WHERE name GLOB '%q/*'"
187
- " GROUP BY n",
188
- nD, zD, zD
189
- );
190
- }else{
191
- db_multi_exec(
192
- "CREATE TEMP VIEW json_dir_files AS"
193
- " SELECT DISTINCT(pathelement(name,%d)) AS n, "
194
- " %Q||'/'||name AS fn,"
195
- " NULL AS u, NULL AS sz, NULL AS mtime"
196
- " FROM filename"
197
- " WHERE name LIKE '%q/%%'"
198
- " GROUP BY n",
199
- nD, zD, zD
200
- );
201
- }
178
+ db_multi_exec(
179
+ "CREATE TEMP VIEW json_dir_files AS"
180
+ " SELECT DISTINCT(pathelement(name,%d)) AS n,"
181
+ " %Q||'/'||name AS fn,"
182
+ " NULL AS u, NULL AS sz, NULL AS mtime"
183
+ " FROM filename"
184
+ " WHERE name GLOB '%q/*'"
185
+ " GROUP BY n",
186
+ nD, zD, zD
187
+ );
202188
}else{
203189
db_multi_exec(
204190
"CREATE TEMP VIEW json_dir_files"
205191
" AS SELECT DISTINCT(pathelement(name,0)) AS n, NULL AS fn"
206192
" FROM filename"
@@ -283,11 +269,11 @@
283269
db_finalize(&q);
284270
if(pM){
285271
manifest_destroy(pM);
286272
}
287273
cson_free_array( keyStore );
288
-
274
+
289275
free( zUuid );
290276
free( zD );
291277
return cson_object_value(zPayload);
292278
}
293279
294280
--- src/json_dir.c
+++ src/json_dir.c
@@ -104,11 +104,11 @@
104
105 sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0,
106 pathelementFunc, 0, 0);
107
108 /* Compute the temporary table "localfiles" containing the names
109 ** of all files and subdirectories in the zD[] directory.
110 **
111 ** Subdirectory names begin with "/". This causes them to sort
112 ** first and it also gives us an easy way to distinguish files
113 ** from directories in the loop that follows.
114 */
@@ -120,19 +120,18 @@
120 int nPrev = 0;
121 int c;
122
123 db_multi_exec(
124 "CREATE TEMP TABLE json_dir_files("
125 " n UNIQUE NOT NULL %s," /* file name */
126 " fn UNIQUE NOT NULL %s," /* full file name */
127 " u DEFAULT NULL," /* file uuid */
128 " sz DEFAULT -1," /* file size */
129 " mtime DEFAULT NULL" /* file mtime in unix epoch format */
130 ");",
131 filename_collation(), filename_collation()
132 );
133
134 db_prepare(&ins,
135 "INSERT OR IGNORE INTO json_dir_files (n,fn,u,sz,mtime) "
136 "SELECT"
137 " pathelement(:path,0),"
138 " CASE WHEN %Q IS NULL THEN '' ELSE %Q||'/' END ||:abspath,"
@@ -151,11 +150,11 @@
151 " AND a.uuid=:uuid",
152 zD, zD
153 );
154 manifest_file_rewind(pM);
155 while( (pFile = manifest_file_next(pM,0))!=0 ){
156 if( nD>0
157 && ((pFile->zName[nD-1]!='/') || (0!=memcmp(pFile->zName, zD, nD-1)))
158 ){
159 continue;
160 }
161 /*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/
@@ -174,33 +173,20 @@
174 for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
175 if( c=='/' ) nPrev++;
176 }
177 db_finalize(&ins);
178 }else if( zD && *zD ){
179 if( filenames_are_case_sensitive() ){
180 db_multi_exec(
181 "CREATE TEMP VIEW json_dir_files AS"
182 " SELECT DISTINCT(pathelement(name,%d)) AS n,"
183 " %Q||'/'||name AS fn,"
184 " NULL AS u, NULL AS sz, NULL AS mtime"
185 " FROM filename"
186 " WHERE name GLOB '%q/*'"
187 " GROUP BY n",
188 nD, zD, zD
189 );
190 }else{
191 db_multi_exec(
192 "CREATE TEMP VIEW json_dir_files AS"
193 " SELECT DISTINCT(pathelement(name,%d)) AS n, "
194 " %Q||'/'||name AS fn,"
195 " NULL AS u, NULL AS sz, NULL AS mtime"
196 " FROM filename"
197 " WHERE name LIKE '%q/%%'"
198 " GROUP BY n",
199 nD, zD, zD
200 );
201 }
202 }else{
203 db_multi_exec(
204 "CREATE TEMP VIEW json_dir_files"
205 " AS SELECT DISTINCT(pathelement(name,0)) AS n, NULL AS fn"
206 " FROM filename"
@@ -283,11 +269,11 @@
283 db_finalize(&q);
284 if(pM){
285 manifest_destroy(pM);
286 }
287 cson_free_array( keyStore );
288
289 free( zUuid );
290 free( zD );
291 return cson_object_value(zPayload);
292 }
293
294
--- src/json_dir.c
+++ src/json_dir.c
@@ -104,11 +104,11 @@
104
105 sqlite3_create_function(g.db, "pathelement", 2, SQLITE_UTF8, 0,
106 pathelementFunc, 0, 0);
107
108 /* Compute the temporary table "localfiles" containing the names
109 ** of all files and subdirectories in the zD[] directory.
110 **
111 ** Subdirectory names begin with "/". This causes them to sort
112 ** first and it also gives us an easy way to distinguish files
113 ** from directories in the loop that follows.
114 */
@@ -120,19 +120,18 @@
120 int nPrev = 0;
121 int c;
122
123 db_multi_exec(
124 "CREATE TEMP TABLE json_dir_files("
125 " n UNIQUE NOT NULL," /* file name */
126 " fn UNIQUE NOT NULL," /* full file name */
127 " u DEFAULT NULL," /* file uuid */
128 " sz DEFAULT -1," /* file size */
129 " mtime DEFAULT NULL" /* file mtime in unix epoch format */
130 ");"
 
131 );
132
133 db_prepare(&ins,
134 "INSERT OR IGNORE INTO json_dir_files (n,fn,u,sz,mtime) "
135 "SELECT"
136 " pathelement(:path,0),"
137 " CASE WHEN %Q IS NULL THEN '' ELSE %Q||'/' END ||:abspath,"
@@ -151,11 +150,11 @@
150 " AND a.uuid=:uuid",
151 zD, zD
152 );
153 manifest_file_rewind(pM);
154 while( (pFile = manifest_file_next(pM,0))!=0 ){
155 if( nD>0
156 && ((pFile->zName[nD-1]!='/') || (0!=memcmp(pFile->zName, zD, nD-1)))
157 ){
158 continue;
159 }
160 /*printf("zD=%s, nD=%d, pFile->zName=%s\n", zD, nD, pFile->zName);*/
@@ -174,33 +173,20 @@
173 for(nPrev=0; (c=pPrev->zName[nD+nPrev]) && c!='/'; nPrev++){}
174 if( c=='/' ) nPrev++;
175 }
176 db_finalize(&ins);
177 }else if( zD && *zD ){
178 db_multi_exec(
179 "CREATE TEMP VIEW json_dir_files AS"
180 " SELECT DISTINCT(pathelement(name,%d)) AS n,"
181 " %Q||'/'||name AS fn,"
182 " NULL AS u, NULL AS sz, NULL AS mtime"
183 " FROM filename"
184 " WHERE name GLOB '%q/*'"
185 " GROUP BY n",
186 nD, zD, zD
187 );
 
 
 
 
 
 
 
 
 
 
 
 
 
188 }else{
189 db_multi_exec(
190 "CREATE TEMP VIEW json_dir_files"
191 " AS SELECT DISTINCT(pathelement(name,0)) AS n, NULL AS fn"
192 " FROM filename"
@@ -283,11 +269,11 @@
269 db_finalize(&q);
270 if(pM){
271 manifest_destroy(pM);
272 }
273 cson_free_array( keyStore );
274
275 free( zUuid );
276 free( zD );
277 return cson_object_value(zPayload);
278 }
279
280
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -75,16 +75,16 @@
7575
/*7*/ " event.bgcolor,"
7676
/*8*/ " b.size,"
7777
/*9*/ " (mlink.pid==0) AS isNew,"
7878
/*10*/ " (mlink.fid==0) AS isDel"
7979
" FROM mlink, blob b, event, blob ci, filename"
80
- " WHERE filename.name=%Q %s"
80
+ " WHERE filename.name=%Q"
8181
" AND mlink.fnid=filename.fnid"
8282
" AND b.rid=mlink.fid"
8383
" AND event.objid=mlink.mid"
8484
" AND event.objid=ci.rid",
85
- zFilename, filename_collation()
85
+ zFilename
8686
);
8787
8888
if( zCheckin && *zCheckin ){
8989
char * zU = NULL;
9090
int rc = name_to_uuid2( zCheckin, "ci", &zU );
9191
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -75,16 +75,16 @@
75 /*7*/ " event.bgcolor,"
76 /*8*/ " b.size,"
77 /*9*/ " (mlink.pid==0) AS isNew,"
78 /*10*/ " (mlink.fid==0) AS isDel"
79 " FROM mlink, blob b, event, blob ci, filename"
80 " WHERE filename.name=%Q %s"
81 " AND mlink.fnid=filename.fnid"
82 " AND b.rid=mlink.fid"
83 " AND event.objid=mlink.mid"
84 " AND event.objid=ci.rid",
85 zFilename, filename_collation()
86 );
87
88 if( zCheckin && *zCheckin ){
89 char * zU = NULL;
90 int rc = name_to_uuid2( zCheckin, "ci", &zU );
91
--- src/json_finfo.c
+++ src/json_finfo.c
@@ -75,16 +75,16 @@
75 /*7*/ " event.bgcolor,"
76 /*8*/ " b.size,"
77 /*9*/ " (mlink.pid==0) AS isNew,"
78 /*10*/ " (mlink.fid==0) AS isDel"
79 " FROM mlink, blob b, event, blob ci, filename"
80 " WHERE filename.name=%Q"
81 " AND mlink.fnid=filename.fnid"
82 " AND b.rid=mlink.fid"
83 " AND event.objid=mlink.mid"
84 " AND event.objid=ci.rid",
85 zFilename
86 );
87
88 if( zCheckin && *zCheckin ){
89 char * zU = NULL;
90 int rc = name_to_uuid2( zCheckin, "ci", &zU );
91

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button