Fossil SCM
Fix merge when merging UPDATEs a symlink to a regular file and vice versa.
Commit
82a95b4692e96b75864215e88eaa7f0a7ef61cec
Parent
324763b93201489…
1 file changed
+24
-18
+24
-18
| --- src/merge.c | ||
| +++ src/merge.c | ||
| @@ -253,23 +253,38 @@ | ||
| 253 | 253 | " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0)," |
| 254 | 254 | " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0)," |
| 255 | 255 | " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0)", |
| 256 | 256 | pid, pid, mid, mid |
| 257 | 257 | ); |
| 258 | + | |
| 259 | + /* | |
| 260 | + ** Add islink information for files in V and M | |
| 261 | + ** | |
| 262 | + */ | |
| 263 | + db_multi_exec( | |
| 264 | + "UPDATE fv SET" | |
| 265 | + " islinkv=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)," | |
| 266 | + " islinkm=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)", | |
| 267 | + vid, mid | |
| 268 | + ); | |
| 258 | 269 | |
| 259 | 270 | if( debugFlag ){ |
| 260 | 271 | db_prepare(&q, |
| 261 | - "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, isexe FROM fv" | |
| 272 | + "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, " | |
| 273 | + " isexe, islinkv, islinkm FROM fv" | |
| 262 | 274 | ); |
| 263 | 275 | while( db_step(&q)==SQLITE_ROW ){ |
| 264 | - fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d\n", | |
| 276 | + fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d " | |
| 277 | + " islinkv=%d islinkm=%d", | |
| 265 | 278 | db_column_int(&q, 0), |
| 266 | 279 | db_column_int(&q, 5), |
| 267 | 280 | db_column_int(&q, 6), |
| 268 | 281 | db_column_int(&q, 7), |
| 269 | 282 | db_column_int(&q, 4), |
| 270 | - db_column_int(&q, 8)); | |
| 283 | + db_column_int(&q, 8), | |
| 284 | + db_column_int(&q, 9), | |
| 285 | + db_column_int(&q, 10)); | |
| 271 | 286 | fossil_print(" fn = [%s]\n", db_column_text(&q, 1)); |
| 272 | 287 | fossil_print(" fnp = [%s]\n", db_column_text(&q, 2)); |
| 273 | 288 | fossil_print(" fnm = [%s]\n", db_column_text(&q, 3)); |
| 274 | 289 | } |
| 275 | 290 | db_finalize(&q); |
| @@ -303,12 +318,12 @@ | ||
| 303 | 318 | int idm = db_column_int(&q, 0); |
| 304 | 319 | int rowid = db_column_int(&q, 1); |
| 305 | 320 | int idv; |
| 306 | 321 | const char *zName; |
| 307 | 322 | db_multi_exec( |
| 308 | - "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,pathname)" | |
| 309 | - " SELECT %d,3,0,rid,mrid,isexe,pathname FROM vfile WHERE id=%d", | |
| 323 | + "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)" | |
| 324 | + " SELECT %d,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=%d", | |
| 310 | 325 | vid, idm |
| 311 | 326 | ); |
| 312 | 327 | idv = db_last_insert_rowid(); |
| 313 | 328 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 314 | 329 | zName = db_column_text(&q, 2); |
| @@ -317,41 +332,32 @@ | ||
| 317 | 332 | undo_save(zName); |
| 318 | 333 | vfile_to_disk(0, idm, 0, 0); |
| 319 | 334 | } |
| 320 | 335 | } |
| 321 | 336 | db_finalize(&q); |
| 322 | - | |
| 323 | - /* | |
| 324 | - ** Add islink information for files in V and M | |
| 325 | - ** | |
| 326 | - */ | |
| 327 | - db_multi_exec( | |
| 328 | - "UPDATE fv SET" | |
| 329 | - " islinkv=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)," | |
| 330 | - " islinkm=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)", | |
| 331 | - vid, mid | |
| 332 | - ); | |
| 333 | 337 | |
| 334 | 338 | /* |
| 335 | 339 | ** Find files that have changed from P->M but not P->V. |
| 336 | 340 | ** Copy the M content over into V. |
| 337 | 341 | */ |
| 338 | 342 | db_prepare(&q, |
| 339 | - "SELECT idv, ridm, fn FROM fv" | |
| 343 | + "SELECT idv, ridm, fn, islinkm FROM fv" | |
| 340 | 344 | " WHERE idp>0 AND idv>0 AND idm>0" |
| 341 | 345 | " AND ridm!=ridp AND ridv=ridp AND NOT chnged" |
| 342 | 346 | ); |
| 343 | 347 | while( db_step(&q)==SQLITE_ROW ){ |
| 344 | 348 | int idv = db_column_int(&q, 0); |
| 345 | 349 | int ridm = db_column_int(&q, 1); |
| 346 | 350 | const char *zName = db_column_text(&q, 2); |
| 351 | + int islinkm = db_column_int(&q, 3); | |
| 347 | 352 | /* Copy content from idm over into idv. Overwrite idv. */ |
| 348 | 353 | fossil_print("UPDATE %s\n", zName); |
| 349 | 354 | if( !nochangeFlag ){ |
| 350 | 355 | undo_save(zName); |
| 351 | 356 | db_multi_exec( |
| 352 | - "UPDATE vfile SET mtime=0, mrid=%d, chnged=2 WHERE id=%d", ridm, idv | |
| 357 | + "UPDATE vfile SET mtime=0, mrid=%d, chnged=2, islink=%d " | |
| 358 | + " WHERE id=%d", ridm, islinkm, idv | |
| 353 | 359 | ); |
| 354 | 360 | vfile_to_disk(0, idv, 0, 0); |
| 355 | 361 | } |
| 356 | 362 | } |
| 357 | 363 | db_finalize(&q); |
| 358 | 364 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -253,23 +253,38 @@ | |
| 253 | " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0)," |
| 254 | " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0)," |
| 255 | " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0)", |
| 256 | pid, pid, mid, mid |
| 257 | ); |
| 258 | |
| 259 | if( debugFlag ){ |
| 260 | db_prepare(&q, |
| 261 | "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, isexe FROM fv" |
| 262 | ); |
| 263 | while( db_step(&q)==SQLITE_ROW ){ |
| 264 | fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d\n", |
| 265 | db_column_int(&q, 0), |
| 266 | db_column_int(&q, 5), |
| 267 | db_column_int(&q, 6), |
| 268 | db_column_int(&q, 7), |
| 269 | db_column_int(&q, 4), |
| 270 | db_column_int(&q, 8)); |
| 271 | fossil_print(" fn = [%s]\n", db_column_text(&q, 1)); |
| 272 | fossil_print(" fnp = [%s]\n", db_column_text(&q, 2)); |
| 273 | fossil_print(" fnm = [%s]\n", db_column_text(&q, 3)); |
| 274 | } |
| 275 | db_finalize(&q); |
| @@ -303,12 +318,12 @@ | |
| 303 | int idm = db_column_int(&q, 0); |
| 304 | int rowid = db_column_int(&q, 1); |
| 305 | int idv; |
| 306 | const char *zName; |
| 307 | db_multi_exec( |
| 308 | "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,pathname)" |
| 309 | " SELECT %d,3,0,rid,mrid,isexe,pathname FROM vfile WHERE id=%d", |
| 310 | vid, idm |
| 311 | ); |
| 312 | idv = db_last_insert_rowid(); |
| 313 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 314 | zName = db_column_text(&q, 2); |
| @@ -317,41 +332,32 @@ | |
| 317 | undo_save(zName); |
| 318 | vfile_to_disk(0, idm, 0, 0); |
| 319 | } |
| 320 | } |
| 321 | db_finalize(&q); |
| 322 | |
| 323 | /* |
| 324 | ** Add islink information for files in V and M |
| 325 | ** |
| 326 | */ |
| 327 | db_multi_exec( |
| 328 | "UPDATE fv SET" |
| 329 | " islinkv=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)," |
| 330 | " islinkm=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)", |
| 331 | vid, mid |
| 332 | ); |
| 333 | |
| 334 | /* |
| 335 | ** Find files that have changed from P->M but not P->V. |
| 336 | ** Copy the M content over into V. |
| 337 | */ |
| 338 | db_prepare(&q, |
| 339 | "SELECT idv, ridm, fn FROM fv" |
| 340 | " WHERE idp>0 AND idv>0 AND idm>0" |
| 341 | " AND ridm!=ridp AND ridv=ridp AND NOT chnged" |
| 342 | ); |
| 343 | while( db_step(&q)==SQLITE_ROW ){ |
| 344 | int idv = db_column_int(&q, 0); |
| 345 | int ridm = db_column_int(&q, 1); |
| 346 | const char *zName = db_column_text(&q, 2); |
| 347 | /* Copy content from idm over into idv. Overwrite idv. */ |
| 348 | fossil_print("UPDATE %s\n", zName); |
| 349 | if( !nochangeFlag ){ |
| 350 | undo_save(zName); |
| 351 | db_multi_exec( |
| 352 | "UPDATE vfile SET mtime=0, mrid=%d, chnged=2 WHERE id=%d", ridm, idv |
| 353 | ); |
| 354 | vfile_to_disk(0, idv, 0, 0); |
| 355 | } |
| 356 | } |
| 357 | db_finalize(&q); |
| 358 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -253,23 +253,38 @@ | |
| 253 | " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0)," |
| 254 | " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0)," |
| 255 | " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0)", |
| 256 | pid, pid, mid, mid |
| 257 | ); |
| 258 | |
| 259 | /* |
| 260 | ** Add islink information for files in V and M |
| 261 | ** |
| 262 | */ |
| 263 | db_multi_exec( |
| 264 | "UPDATE fv SET" |
| 265 | " islinkv=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)," |
| 266 | " islinkm=coalesce((SELECT islink FROM vfile WHERE vid=%d AND pathname=fnm),0)", |
| 267 | vid, mid |
| 268 | ); |
| 269 | |
| 270 | if( debugFlag ){ |
| 271 | db_prepare(&q, |
| 272 | "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, " |
| 273 | " isexe, islinkv, islinkm FROM fv" |
| 274 | ); |
| 275 | while( db_step(&q)==SQLITE_ROW ){ |
| 276 | fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d " |
| 277 | " islinkv=%d islinkm=%d", |
| 278 | db_column_int(&q, 0), |
| 279 | db_column_int(&q, 5), |
| 280 | db_column_int(&q, 6), |
| 281 | db_column_int(&q, 7), |
| 282 | db_column_int(&q, 4), |
| 283 | db_column_int(&q, 8), |
| 284 | db_column_int(&q, 9), |
| 285 | db_column_int(&q, 10)); |
| 286 | fossil_print(" fn = [%s]\n", db_column_text(&q, 1)); |
| 287 | fossil_print(" fnp = [%s]\n", db_column_text(&q, 2)); |
| 288 | fossil_print(" fnm = [%s]\n", db_column_text(&q, 3)); |
| 289 | } |
| 290 | db_finalize(&q); |
| @@ -303,12 +318,12 @@ | |
| 318 | int idm = db_column_int(&q, 0); |
| 319 | int rowid = db_column_int(&q, 1); |
| 320 | int idv; |
| 321 | const char *zName; |
| 322 | db_multi_exec( |
| 323 | "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)" |
| 324 | " SELECT %d,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=%d", |
| 325 | vid, idm |
| 326 | ); |
| 327 | idv = db_last_insert_rowid(); |
| 328 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 329 | zName = db_column_text(&q, 2); |
| @@ -317,41 +332,32 @@ | |
| 332 | undo_save(zName); |
| 333 | vfile_to_disk(0, idm, 0, 0); |
| 334 | } |
| 335 | } |
| 336 | db_finalize(&q); |
| 337 | |
| 338 | /* |
| 339 | ** Find files that have changed from P->M but not P->V. |
| 340 | ** Copy the M content over into V. |
| 341 | */ |
| 342 | db_prepare(&q, |
| 343 | "SELECT idv, ridm, fn, islinkm FROM fv" |
| 344 | " WHERE idp>0 AND idv>0 AND idm>0" |
| 345 | " AND ridm!=ridp AND ridv=ridp AND NOT chnged" |
| 346 | ); |
| 347 | while( db_step(&q)==SQLITE_ROW ){ |
| 348 | int idv = db_column_int(&q, 0); |
| 349 | int ridm = db_column_int(&q, 1); |
| 350 | const char *zName = db_column_text(&q, 2); |
| 351 | int islinkm = db_column_int(&q, 3); |
| 352 | /* Copy content from idm over into idv. Overwrite idv. */ |
| 353 | fossil_print("UPDATE %s\n", zName); |
| 354 | if( !nochangeFlag ){ |
| 355 | undo_save(zName); |
| 356 | db_multi_exec( |
| 357 | "UPDATE vfile SET mtime=0, mrid=%d, chnged=2, islink=%d " |
| 358 | " WHERE id=%d", ridm, islinkm, idv |
| 359 | ); |
| 360 | vfile_to_disk(0, idv, 0, 0); |
| 361 | } |
| 362 | } |
| 363 | db_finalize(&q); |
| 364 |