Fossil SCM

Fix a long-standing mtime race condition that can cause problems if a "merge" takes places within the same second as an "update".

drh 2010-12-13 23:04 trunk
Commit af365579e73bd31b9e5594ffe2edad095409b117
+5 -2
--- src/merge.c
+++ src/merge.c
@@ -307,11 +307,11 @@
307307
/* Copy content from idm over into idv. Overwrite idv. */
308308
printf("UPDATE %s\n", zName);
309309
if( !nochangeFlag ){
310310
undo_save(zName);
311311
db_multi_exec(
312
- "UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv
312
+ "UPDATE vfile SET mtime=0, mrid=%d, chnged=2 WHERE id=%d", ridm, idv
313313
);
314314
vfile_to_disk(0, idv, 0, 0);
315315
}
316316
}
317317
db_finalize(&q);
@@ -352,11 +352,14 @@
352352
blob_zero(&r);
353353
}else{
354354
rc = blob_merge(&p, &m, &v, &r);
355355
}
356356
if( rc>=0 ){
357
- if( !nochangeFlag ) blob_write_to_file(&r, zFullPath);
357
+ if( !nochangeFlag ){
358
+ blob_write_to_file(&r, zFullPath);
359
+ }
360
+ db_multi_exec("UPDATE vfile SET mtime=0 WHERE id=%d", ridv);
358361
if( rc>0 ){
359362
printf("***** %d merge conflicts in %s\n", rc, zName);
360363
nConflict++;
361364
}
362365
}else{
363366
--- src/merge.c
+++ src/merge.c
@@ -307,11 +307,11 @@
307 /* Copy content from idm over into idv. Overwrite idv. */
308 printf("UPDATE %s\n", zName);
309 if( !nochangeFlag ){
310 undo_save(zName);
311 db_multi_exec(
312 "UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv
313 );
314 vfile_to_disk(0, idv, 0, 0);
315 }
316 }
317 db_finalize(&q);
@@ -352,11 +352,14 @@
352 blob_zero(&r);
353 }else{
354 rc = blob_merge(&p, &m, &v, &r);
355 }
356 if( rc>=0 ){
357 if( !nochangeFlag ) blob_write_to_file(&r, zFullPath);
 
 
 
358 if( rc>0 ){
359 printf("***** %d merge conflicts in %s\n", rc, zName);
360 nConflict++;
361 }
362 }else{
363
--- src/merge.c
+++ src/merge.c
@@ -307,11 +307,11 @@
307 /* Copy content from idm over into idv. Overwrite idv. */
308 printf("UPDATE %s\n", zName);
309 if( !nochangeFlag ){
310 undo_save(zName);
311 db_multi_exec(
312 "UPDATE vfile SET mtime=0, mrid=%d, chnged=2 WHERE id=%d", ridm, idv
313 );
314 vfile_to_disk(0, idv, 0, 0);
315 }
316 }
317 db_finalize(&q);
@@ -352,11 +352,14 @@
352 blob_zero(&r);
353 }else{
354 rc = blob_merge(&p, &m, &v, &r);
355 }
356 if( rc>=0 ){
357 if( !nochangeFlag ){
358 blob_write_to_file(&r, zFullPath);
359 }
360 db_multi_exec("UPDATE vfile SET mtime=0 WHERE id=%d", ridv);
361 if( rc>0 ){
362 printf("***** %d merge conflicts in %s\n", rc, zName);
363 nConflict++;
364 }
365 }else{
366
+1 -1
--- src/vfile.c
+++ src/vfile.c
@@ -191,11 +191,11 @@
191191
currentMtime, id);
192192
}
193193
blob_reset(&origCksum);
194194
blob_reset(&fileCksum);
195195
}
196
- if( chnged!=oldChnged ){
196
+ if( chnged!=oldChnged && (chnged || !checkMtime) ){
197197
db_multi_exec("UPDATE vfile SET chnged=%d WHERE id=%d", chnged, id);
198198
}
199199
}
200200
db_finalize(&q);
201201
if( nErr ) fossil_fatal("abort due to prior errors");
202202
--- src/vfile.c
+++ src/vfile.c
@@ -191,11 +191,11 @@
191 currentMtime, id);
192 }
193 blob_reset(&origCksum);
194 blob_reset(&fileCksum);
195 }
196 if( chnged!=oldChnged ){
197 db_multi_exec("UPDATE vfile SET chnged=%d WHERE id=%d", chnged, id);
198 }
199 }
200 db_finalize(&q);
201 if( nErr ) fossil_fatal("abort due to prior errors");
202
--- src/vfile.c
+++ src/vfile.c
@@ -191,11 +191,11 @@
191 currentMtime, id);
192 }
193 blob_reset(&origCksum);
194 blob_reset(&fileCksum);
195 }
196 if( chnged!=oldChnged && (chnged || !checkMtime) ){
197 db_multi_exec("UPDATE vfile SET chnged=%d WHERE id=%d", chnged, id);
198 }
199 }
200 db_finalize(&q);
201 if( nErr ) fossil_fatal("abort due to prior errors");
202
--- test/merge5.test
+++ test/merge5.test
@@ -252,5 +252,29 @@
252252
checkout-test 132 {
253253
6f525ab779ad66e24474d845c5fb7938be42d50d one.txt
254254
64a8a5c7320fccfa4b2e5dfc5fd20a5381a86c5b three.txt
255255
b262fee89ed8a27a23a5e09d3917e0bebe22cd24 two.txt
256256
}
257
+fossil merge br5
258
+checkout-test 131 {
259
+ 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
260
+ 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
261
+ e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
262
+}
263
+fossil commit -nosign -m {merge with rename} -branch {trunk+br5}
264
+checkout-test 133 {
265
+ 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
266
+ 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
267
+ e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
268
+}
269
+fossil update chng3
270
+checkout-test 134 {
271
+ 6f525ab779ad66e24474d845c5fb7938be42d50d one.txt
272
+ 64a8a5c7320fccfa4b2e5dfc5fd20a5381a86c5b three.txt
273
+ b262fee89ed8a27a23a5e09d3917e0bebe22cd24 two.txt
274
+}
275
+fossil update trunk+br5
276
+checkout-test 135 {
277
+ 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
278
+ 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
279
+ e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
280
+}
257281
--- test/merge5.test
+++ test/merge5.test
@@ -252,5 +252,29 @@
252 checkout-test 132 {
253 6f525ab779ad66e24474d845c5fb7938be42d50d one.txt
254 64a8a5c7320fccfa4b2e5dfc5fd20a5381a86c5b three.txt
255 b262fee89ed8a27a23a5e09d3917e0bebe22cd24 two.txt
256 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
--- test/merge5.test
+++ test/merge5.test
@@ -252,5 +252,29 @@
252 checkout-test 132 {
253 6f525ab779ad66e24474d845c5fb7938be42d50d one.txt
254 64a8a5c7320fccfa4b2e5dfc5fd20a5381a86c5b three.txt
255 b262fee89ed8a27a23a5e09d3917e0bebe22cd24 two.txt
256 }
257 fossil merge br5
258 checkout-test 131 {
259 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
260 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
261 e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
262 }
263 fossil commit -nosign -m {merge with rename} -branch {trunk+br5}
264 checkout-test 133 {
265 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
266 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
267 e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
268 }
269 fossil update chng3
270 checkout-test 134 {
271 6f525ab779ad66e24474d845c5fb7938be42d50d one.txt
272 64a8a5c7320fccfa4b2e5dfc5fd20a5381a86c5b three.txt
273 b262fee89ed8a27a23a5e09d3917e0bebe22cd24 two.txt
274 }
275 fossil update trunk+br5
276 checkout-test 135 {
277 7eaf64a2c9141277b4c24259c7766d6a77047af7 one.txt
278 98e47f99bb9fed4fdcd407f553615ca7f15a38a2 three.txt
279 e58c5da3e6007d0e30600ea31611813093ad180f two-rename.txt
280 }
281

Keyboard Shortcuts

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