Fossil SCM

Fix problems with update and merge when case-sensitive is off and two different checkouts each add files that differ only in case.

drh 2013-05-23 22:36 trunk
Commit a5a8d0477ad69aaebf14e8c2f6bb8e04bdf774b7
2 files changed +14 -14 +10 -9
+14 -14
--- src/merge.c
+++ src/merge.c
@@ -278,25 +278,25 @@
278278
** in the current checkout, the pivot, and the version being merged.
279279
*/
280280
db_multi_exec(
281281
"DROP TABLE IF EXISTS fv;"
282282
"CREATE TEMP TABLE fv("
283
- " fn TEXT PRIMARY KEY %s," /* The filename */
283
+ " fn TEXT PRIMARY KEY %s," /* The filename */
284284
" idv INTEGER," /* VFILE entry for current version */
285285
" idp INTEGER," /* VFILE entry for the pivot */
286286
" idm INTEGER," /* VFILE entry for version merging in */
287287
" chnged BOOLEAN," /* True if current version has been edited */
288288
" ridv INTEGER," /* Record ID for current version */
289289
" ridp INTEGER," /* Record ID for pivot */
290290
" ridm INTEGER," /* Record ID for merge */
291291
" isexe BOOLEAN," /* Execute permission enabled */
292
- " fnp TEXT," /* The filename in the pivot */
293
- " fnm TEXT," /* the filename in the merged version */
292
+ " fnp TEXT %s," /* The filename in the pivot */
293
+ " fnm TEXT %s," /* the filename in the merged version */
294294
" islinkv BOOLEAN," /* True if current version is a symlink */
295295
" islinkm BOOLEAN" /* True if merged version in is a symlink */
296296
");",
297
- filename_collation()
297
+ filename_collation(), filename_collation(), filename_collation()
298298
);
299299
300300
/* Add files found in V
301301
*/
302302
db_multi_exec(
@@ -331,12 +331,12 @@
331331
db_multi_exec(
332332
"INSERT OR IGNORE"
333333
" INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
334334
" SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
335335
" FROM vfile"
336
- " WHERE vid=%d AND pathname NOT IN (SELECT fnp FROM fv)",
337
- pid
336
+ " WHERE vid=%d AND pathname %s NOT IN (SELECT fnp FROM fv)",
337
+ pid, filename_collation()
338338
);
339339
340340
/*
341341
** Compute name changes from P->M
342342
*/
@@ -359,27 +359,27 @@
359359
"INSERT OR IGNORE"
360360
" INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
361361
" SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
362362
" FROM vfile"
363363
" WHERE vid=%d"
364
- " AND pathname NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
365
- mid
364
+ " AND pathname %s NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
365
+ mid, filename_collation()
366366
);
367367
368368
/*
369369
** Compute the file version ids for P and M.
370370
*/
371371
db_multi_exec(
372372
"UPDATE fv SET"
373
- " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnp),0),"
374
- " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0),"
375
- " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0),"
376
- " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0),"
373
+ " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnp=pathname),0),"
374
+ " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnp=pathname),0),"
375
+ " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnm=pathname),0),"
376
+ " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnm=pathname),0),"
377377
" islinkv=coalesce((SELECT islink FROM vfile"
378
- " WHERE vid=%d AND pathname=fnm),0),"
378
+ " WHERE vid=%d AND fnm=pathname),0),"
379379
" islinkm=coalesce((SELECT islink FROM vfile"
380
- " WHERE vid=%d AND pathname=fnm),0)",
380
+ " WHERE vid=%d AND fnm=pathname),0)",
381381
pid, pid, mid, mid, vid, mid
382382
);
383383
384384
if( debugFlag ){
385385
db_prepare(&q,
386386
--- src/merge.c
+++ src/merge.c
@@ -278,25 +278,25 @@
278 ** in the current checkout, the pivot, and the version being merged.
279 */
280 db_multi_exec(
281 "DROP TABLE IF EXISTS fv;"
282 "CREATE TEMP TABLE fv("
283 " fn TEXT PRIMARY KEY %s," /* The filename */
284 " idv INTEGER," /* VFILE entry for current version */
285 " idp INTEGER," /* VFILE entry for the pivot */
286 " idm INTEGER," /* VFILE entry for version merging in */
287 " chnged BOOLEAN," /* True if current version has been edited */
288 " ridv INTEGER," /* Record ID for current version */
289 " ridp INTEGER," /* Record ID for pivot */
290 " ridm INTEGER," /* Record ID for merge */
291 " isexe BOOLEAN," /* Execute permission enabled */
292 " fnp TEXT," /* The filename in the pivot */
293 " fnm TEXT," /* the filename in the merged version */
294 " islinkv BOOLEAN," /* True if current version is a symlink */
295 " islinkm BOOLEAN" /* True if merged version in is a symlink */
296 ");",
297 filename_collation()
298 );
299
300 /* Add files found in V
301 */
302 db_multi_exec(
@@ -331,12 +331,12 @@
331 db_multi_exec(
332 "INSERT OR IGNORE"
333 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
334 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
335 " FROM vfile"
336 " WHERE vid=%d AND pathname NOT IN (SELECT fnp FROM fv)",
337 pid
338 );
339
340 /*
341 ** Compute name changes from P->M
342 */
@@ -359,27 +359,27 @@
359 "INSERT OR IGNORE"
360 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
361 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
362 " FROM vfile"
363 " WHERE vid=%d"
364 " AND pathname NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
365 mid
366 );
367
368 /*
369 ** Compute the file version ids for P and M.
370 */
371 db_multi_exec(
372 "UPDATE fv SET"
373 " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnp),0),"
374 " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0),"
375 " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0),"
376 " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0),"
377 " islinkv=coalesce((SELECT islink FROM vfile"
378 " WHERE vid=%d AND pathname=fnm),0),"
379 " islinkm=coalesce((SELECT islink FROM vfile"
380 " WHERE vid=%d AND pathname=fnm),0)",
381 pid, pid, mid, mid, vid, mid
382 );
383
384 if( debugFlag ){
385 db_prepare(&q,
386
--- src/merge.c
+++ src/merge.c
@@ -278,25 +278,25 @@
278 ** in the current checkout, the pivot, and the version being merged.
279 */
280 db_multi_exec(
281 "DROP TABLE IF EXISTS fv;"
282 "CREATE TEMP TABLE fv("
283 " fn TEXT PRIMARY KEY %s," /* The filename */
284 " idv INTEGER," /* VFILE entry for current version */
285 " idp INTEGER," /* VFILE entry for the pivot */
286 " idm INTEGER," /* VFILE entry for version merging in */
287 " chnged BOOLEAN," /* True if current version has been edited */
288 " ridv INTEGER," /* Record ID for current version */
289 " ridp INTEGER," /* Record ID for pivot */
290 " ridm INTEGER," /* Record ID for merge */
291 " isexe BOOLEAN," /* Execute permission enabled */
292 " fnp TEXT %s," /* The filename in the pivot */
293 " fnm TEXT %s," /* the filename in the merged version */
294 " islinkv BOOLEAN," /* True if current version is a symlink */
295 " islinkm BOOLEAN" /* True if merged version in is a symlink */
296 ");",
297 filename_collation(), filename_collation(), filename_collation()
298 );
299
300 /* Add files found in V
301 */
302 db_multi_exec(
@@ -331,12 +331,12 @@
331 db_multi_exec(
332 "INSERT OR IGNORE"
333 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
334 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
335 " FROM vfile"
336 " WHERE vid=%d AND pathname %s NOT IN (SELECT fnp FROM fv)",
337 pid, filename_collation()
338 );
339
340 /*
341 ** Compute name changes from P->M
342 */
@@ -359,27 +359,27 @@
359 "INSERT OR IGNORE"
360 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
361 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
362 " FROM vfile"
363 " WHERE vid=%d"
364 " AND pathname %s NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
365 mid, filename_collation()
366 );
367
368 /*
369 ** Compute the file version ids for P and M.
370 */
371 db_multi_exec(
372 "UPDATE fv SET"
373 " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnp=pathname),0),"
374 " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnp=pathname),0),"
375 " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnm=pathname),0),"
376 " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnm=pathname),0),"
377 " islinkv=coalesce((SELECT islink FROM vfile"
378 " WHERE vid=%d AND fnm=pathname),0),"
379 " islinkm=coalesce((SELECT islink FROM vfile"
380 " WHERE vid=%d AND fnm=pathname),0)",
381 pid, pid, mid, mid, vid, mid
382 );
383
384 if( debugFlag ){
385 db_prepare(&q,
386
+10 -9
--- src/update.c
+++ src/update.c
@@ -213,22 +213,23 @@
213213
** in the current checkout, the pivot, and the version being merged.
214214
*/
215215
db_multi_exec(
216216
"DROP TABLE IF EXISTS fv;"
217217
"CREATE TEMP TABLE fv("
218
- " fn TEXT PRIMARY KEY," /* The filename relative to root */
218
+ " fn TEXT %s PRIMARY KEY," /* The filename relative to root */
219219
" idv INTEGER," /* VFILE entry for current version */
220220
" idt INTEGER," /* VFILE entry for target version */
221221
" chnged BOOLEAN," /* True if current version has been edited */
222222
" islinkv BOOLEAN," /* True if current file is a link */
223223
" islinkt BOOLEAN," /* True if target file is a link */
224224
" ridv INTEGER," /* Record ID for current version */
225225
" ridt INTEGER," /* Record ID for target */
226226
" isexe BOOLEAN," /* Does target have execute permission? */
227227
" deleted BOOLEAN DEFAULT 0,"/* File marke by "rm" to become unmanaged */
228
- " fnt TEXT" /* Filename of same file on target version */
229
- ");"
228
+ " fnt TEXT %s" /* Filename of same file on target version */
229
+ ");",
230
+ filename_collation(), filename_collation()
230231
);
231232
232233
/* Add files found in the current version
233234
*/
234235
db_multi_exec(
@@ -259,33 +260,33 @@
259260
*/
260261
db_multi_exec(
261262
"INSERT OR IGNORE INTO fv(fn,fnt,idv,idt,ridv,ridt,isexe,chnged)"
262263
" SELECT pathname, pathname, 0, 0, 0, 0, isexe, 0 FROM vfile"
263264
" WHERE vid=%d"
264
- " AND pathname NOT IN (SELECT fnt FROM fv)",
265
- tid
265
+ " AND pathname %s NOT IN (SELECT fnt FROM fv)",
266
+ tid, filename_collation()
266267
);
267268
268269
/*
269270
** Compute the file version ids for T
270271
*/
271272
db_multi_exec(
272273
"UPDATE fv SET"
273
- " idt=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnt),0),"
274
- " ridt=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnt),0)",
274
+ " idt=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnt=pathname),0),"
275
+ " ridt=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnt=pathname),0)",
275276
tid, tid
276277
);
277278
278279
/*
279280
** Add islink information
280281
*/
281282
db_multi_exec(
282283
"UPDATE fv SET"
283284
" islinkv=coalesce((SELECT islink FROM vfile"
284
- " WHERE vid=%d AND pathname=fnt),0),"
285
+ " WHERE vid=%d AND fnt=pathname),0),"
285286
" islinkt=coalesce((SELECT islink FROM vfile"
286
- " WHERE vid=%d AND pathname=fnt),0)",
287
+ " WHERE vid=%d AND fnt=pathname),0)",
287288
vid, tid
288289
);
289290
290291
291292
if( debugFlag ){
292293
--- src/update.c
+++ src/update.c
@@ -213,22 +213,23 @@
213 ** in the current checkout, the pivot, and the version being merged.
214 */
215 db_multi_exec(
216 "DROP TABLE IF EXISTS fv;"
217 "CREATE TEMP TABLE fv("
218 " fn TEXT PRIMARY KEY," /* The filename relative to root */
219 " idv INTEGER," /* VFILE entry for current version */
220 " idt INTEGER," /* VFILE entry for target version */
221 " chnged BOOLEAN," /* True if current version has been edited */
222 " islinkv BOOLEAN," /* True if current file is a link */
223 " islinkt BOOLEAN," /* True if target file is a link */
224 " ridv INTEGER," /* Record ID for current version */
225 " ridt INTEGER," /* Record ID for target */
226 " isexe BOOLEAN," /* Does target have execute permission? */
227 " deleted BOOLEAN DEFAULT 0,"/* File marke by "rm" to become unmanaged */
228 " fnt TEXT" /* Filename of same file on target version */
229 ");"
 
230 );
231
232 /* Add files found in the current version
233 */
234 db_multi_exec(
@@ -259,33 +260,33 @@
259 */
260 db_multi_exec(
261 "INSERT OR IGNORE INTO fv(fn,fnt,idv,idt,ridv,ridt,isexe,chnged)"
262 " SELECT pathname, pathname, 0, 0, 0, 0, isexe, 0 FROM vfile"
263 " WHERE vid=%d"
264 " AND pathname NOT IN (SELECT fnt FROM fv)",
265 tid
266 );
267
268 /*
269 ** Compute the file version ids for T
270 */
271 db_multi_exec(
272 "UPDATE fv SET"
273 " idt=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnt),0),"
274 " ridt=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnt),0)",
275 tid, tid
276 );
277
278 /*
279 ** Add islink information
280 */
281 db_multi_exec(
282 "UPDATE fv SET"
283 " islinkv=coalesce((SELECT islink FROM vfile"
284 " WHERE vid=%d AND pathname=fnt),0),"
285 " islinkt=coalesce((SELECT islink FROM vfile"
286 " WHERE vid=%d AND pathname=fnt),0)",
287 vid, tid
288 );
289
290
291 if( debugFlag ){
292
--- src/update.c
+++ src/update.c
@@ -213,22 +213,23 @@
213 ** in the current checkout, the pivot, and the version being merged.
214 */
215 db_multi_exec(
216 "DROP TABLE IF EXISTS fv;"
217 "CREATE TEMP TABLE fv("
218 " fn TEXT %s PRIMARY KEY," /* The filename relative to root */
219 " idv INTEGER," /* VFILE entry for current version */
220 " idt INTEGER," /* VFILE entry for target version */
221 " chnged BOOLEAN," /* True if current version has been edited */
222 " islinkv BOOLEAN," /* True if current file is a link */
223 " islinkt BOOLEAN," /* True if target file is a link */
224 " ridv INTEGER," /* Record ID for current version */
225 " ridt INTEGER," /* Record ID for target */
226 " isexe BOOLEAN," /* Does target have execute permission? */
227 " deleted BOOLEAN DEFAULT 0,"/* File marke by "rm" to become unmanaged */
228 " fnt TEXT %s" /* Filename of same file on target version */
229 ");",
230 filename_collation(), filename_collation()
231 );
232
233 /* Add files found in the current version
234 */
235 db_multi_exec(
@@ -259,33 +260,33 @@
260 */
261 db_multi_exec(
262 "INSERT OR IGNORE INTO fv(fn,fnt,idv,idt,ridv,ridt,isexe,chnged)"
263 " SELECT pathname, pathname, 0, 0, 0, 0, isexe, 0 FROM vfile"
264 " WHERE vid=%d"
265 " AND pathname %s NOT IN (SELECT fnt FROM fv)",
266 tid, filename_collation()
267 );
268
269 /*
270 ** Compute the file version ids for T
271 */
272 db_multi_exec(
273 "UPDATE fv SET"
274 " idt=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnt=pathname),0),"
275 " ridt=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnt=pathname),0)",
276 tid, tid
277 );
278
279 /*
280 ** Add islink information
281 */
282 db_multi_exec(
283 "UPDATE fv SET"
284 " islinkv=coalesce((SELECT islink FROM vfile"
285 " WHERE vid=%d AND fnt=pathname),0),"
286 " islinkt=coalesce((SELECT islink FROM vfile"
287 " WHERE vid=%d AND fnt=pathname),0)",
288 vid, tid
289 );
290
291
292 if( debugFlag ){
293

Keyboard Shortcuts

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