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.
Commit
a5a8d0477ad69aaebf14e8c2f6bb8e04bdf774b7
Parent
97040d643693f48…
2 files changed
+14
-14
+10
-9
+14
-14
| --- src/merge.c | ||
| +++ src/merge.c | ||
| @@ -278,25 +278,25 @@ | ||
| 278 | 278 | ** in the current checkout, the pivot, and the version being merged. |
| 279 | 279 | */ |
| 280 | 280 | db_multi_exec( |
| 281 | 281 | "DROP TABLE IF EXISTS fv;" |
| 282 | 282 | "CREATE TEMP TABLE fv(" |
| 283 | - " fn TEXT PRIMARY KEY %s," /* The filename */ | |
| 283 | + " fn TEXT PRIMARY KEY %s," /* The filename */ | |
| 284 | 284 | " idv INTEGER," /* VFILE entry for current version */ |
| 285 | 285 | " idp INTEGER," /* VFILE entry for the pivot */ |
| 286 | 286 | " idm INTEGER," /* VFILE entry for version merging in */ |
| 287 | 287 | " chnged BOOLEAN," /* True if current version has been edited */ |
| 288 | 288 | " ridv INTEGER," /* Record ID for current version */ |
| 289 | 289 | " ridp INTEGER," /* Record ID for pivot */ |
| 290 | 290 | " ridm INTEGER," /* Record ID for merge */ |
| 291 | 291 | " 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 */ | |
| 294 | 294 | " islinkv BOOLEAN," /* True if current version is a symlink */ |
| 295 | 295 | " islinkm BOOLEAN" /* True if merged version in is a symlink */ |
| 296 | 296 | ");", |
| 297 | - filename_collation() | |
| 297 | + filename_collation(), filename_collation(), filename_collation() | |
| 298 | 298 | ); |
| 299 | 299 | |
| 300 | 300 | /* Add files found in V |
| 301 | 301 | */ |
| 302 | 302 | db_multi_exec( |
| @@ -331,12 +331,12 @@ | ||
| 331 | 331 | db_multi_exec( |
| 332 | 332 | "INSERT OR IGNORE" |
| 333 | 333 | " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)" |
| 334 | 334 | " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 " |
| 335 | 335 | " 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() | |
| 338 | 338 | ); |
| 339 | 339 | |
| 340 | 340 | /* |
| 341 | 341 | ** Compute name changes from P->M |
| 342 | 342 | */ |
| @@ -359,27 +359,27 @@ | ||
| 359 | 359 | "INSERT OR IGNORE" |
| 360 | 360 | " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)" |
| 361 | 361 | " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 " |
| 362 | 362 | " FROM vfile" |
| 363 | 363 | " 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() | |
| 366 | 366 | ); |
| 367 | 367 | |
| 368 | 368 | /* |
| 369 | 369 | ** Compute the file version ids for P and M. |
| 370 | 370 | */ |
| 371 | 371 | db_multi_exec( |
| 372 | 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)," | |
| 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 | 377 | " islinkv=coalesce((SELECT islink FROM vfile" |
| 378 | - " WHERE vid=%d AND pathname=fnm),0)," | |
| 378 | + " WHERE vid=%d AND fnm=pathname),0)," | |
| 379 | 379 | " islinkm=coalesce((SELECT islink FROM vfile" |
| 380 | - " WHERE vid=%d AND pathname=fnm),0)", | |
| 380 | + " WHERE vid=%d AND fnm=pathname),0)", | |
| 381 | 381 | pid, pid, mid, mid, vid, mid |
| 382 | 382 | ); |
| 383 | 383 | |
| 384 | 384 | if( debugFlag ){ |
| 385 | 385 | db_prepare(&q, |
| 386 | 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," /* 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 @@ | ||
| 213 | 213 | ** in the current checkout, the pivot, and the version being merged. |
| 214 | 214 | */ |
| 215 | 215 | db_multi_exec( |
| 216 | 216 | "DROP TABLE IF EXISTS fv;" |
| 217 | 217 | "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 */ | |
| 219 | 219 | " idv INTEGER," /* VFILE entry for current version */ |
| 220 | 220 | " idt INTEGER," /* VFILE entry for target version */ |
| 221 | 221 | " chnged BOOLEAN," /* True if current version has been edited */ |
| 222 | 222 | " islinkv BOOLEAN," /* True if current file is a link */ |
| 223 | 223 | " islinkt BOOLEAN," /* True if target file is a link */ |
| 224 | 224 | " ridv INTEGER," /* Record ID for current version */ |
| 225 | 225 | " ridt INTEGER," /* Record ID for target */ |
| 226 | 226 | " isexe BOOLEAN," /* Does target have execute permission? */ |
| 227 | 227 | " 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() | |
| 230 | 231 | ); |
| 231 | 232 | |
| 232 | 233 | /* Add files found in the current version |
| 233 | 234 | */ |
| 234 | 235 | db_multi_exec( |
| @@ -259,33 +260,33 @@ | ||
| 259 | 260 | */ |
| 260 | 261 | db_multi_exec( |
| 261 | 262 | "INSERT OR IGNORE INTO fv(fn,fnt,idv,idt,ridv,ridt,isexe,chnged)" |
| 262 | 263 | " SELECT pathname, pathname, 0, 0, 0, 0, isexe, 0 FROM vfile" |
| 263 | 264 | " 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() | |
| 266 | 267 | ); |
| 267 | 268 | |
| 268 | 269 | /* |
| 269 | 270 | ** Compute the file version ids for T |
| 270 | 271 | */ |
| 271 | 272 | db_multi_exec( |
| 272 | 273 | "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)", | |
| 275 | 276 | tid, tid |
| 276 | 277 | ); |
| 277 | 278 | |
| 278 | 279 | /* |
| 279 | 280 | ** Add islink information |
| 280 | 281 | */ |
| 281 | 282 | db_multi_exec( |
| 282 | 283 | "UPDATE fv SET" |
| 283 | 284 | " islinkv=coalesce((SELECT islink FROM vfile" |
| 284 | - " WHERE vid=%d AND pathname=fnt),0)," | |
| 285 | + " WHERE vid=%d AND fnt=pathname),0)," | |
| 285 | 286 | " islinkt=coalesce((SELECT islink FROM vfile" |
| 286 | - " WHERE vid=%d AND pathname=fnt),0)", | |
| 287 | + " WHERE vid=%d AND fnt=pathname),0)", | |
| 287 | 288 | vid, tid |
| 288 | 289 | ); |
| 289 | 290 | |
| 290 | 291 | |
| 291 | 292 | if( debugFlag ){ |
| 292 | 293 |
| --- 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 |