Fossil SCM

Fix merge when merging UPDATEs a symlink to a regular file and vice versa.

dmitry 2011-09-01 22:55 symlinks
Commit 82a95b4692e96b75864215e88eaa7f0a7ef61cec
1 file changed +24 -18
+24 -18
--- src/merge.c
+++ src/merge.c
@@ -253,23 +253,38 @@
253253
" ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnp),0),"
254254
" idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND pathname=fnm),0),"
255255
" ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND pathname=fnm),0)",
256256
pid, pid, mid, mid
257257
);
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
+ );
258269
259270
if( debugFlag ){
260271
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"
262274
);
263275
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",
265278
db_column_int(&q, 0),
266279
db_column_int(&q, 5),
267280
db_column_int(&q, 6),
268281
db_column_int(&q, 7),
269282
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));
271286
fossil_print(" fn = [%s]\n", db_column_text(&q, 1));
272287
fossil_print(" fnp = [%s]\n", db_column_text(&q, 2));
273288
fossil_print(" fnm = [%s]\n", db_column_text(&q, 3));
274289
}
275290
db_finalize(&q);
@@ -303,12 +318,12 @@
303318
int idm = db_column_int(&q, 0);
304319
int rowid = db_column_int(&q, 1);
305320
int idv;
306321
const char *zName;
307322
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",
310325
vid, idm
311326
);
312327
idv = db_last_insert_rowid();
313328
db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid);
314329
zName = db_column_text(&q, 2);
@@ -317,41 +332,32 @@
317332
undo_save(zName);
318333
vfile_to_disk(0, idm, 0, 0);
319334
}
320335
}
321336
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
- );
333337
334338
/*
335339
** Find files that have changed from P->M but not P->V.
336340
** Copy the M content over into V.
337341
*/
338342
db_prepare(&q,
339
- "SELECT idv, ridm, fn FROM fv"
343
+ "SELECT idv, ridm, fn, islinkm FROM fv"
340344
" WHERE idp>0 AND idv>0 AND idm>0"
341345
" AND ridm!=ridp AND ridv=ridp AND NOT chnged"
342346
);
343347
while( db_step(&q)==SQLITE_ROW ){
344348
int idv = db_column_int(&q, 0);
345349
int ridm = db_column_int(&q, 1);
346350
const char *zName = db_column_text(&q, 2);
351
+ int islinkm = db_column_int(&q, 3);
347352
/* Copy content from idm over into idv. Overwrite idv. */
348353
fossil_print("UPDATE %s\n", zName);
349354
if( !nochangeFlag ){
350355
undo_save(zName);
351356
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
353359
);
354360
vfile_to_disk(0, idv, 0, 0);
355361
}
356362
}
357363
db_finalize(&q);
358364
--- 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

Keyboard Shortcuts

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