Fossil SCM

Record merge-info information for the "fossil update" command.

drh 2024-12-09 17:38 trunk
Commit 3a18c95df49f95a5ad726c671038daccc6eb99a5140825559a327c1f0ecb983c
2 files changed +1 -1 +28
+1 -1
--- src/merge.c
+++ src/merge.c
@@ -202,11 +202,11 @@
202202
" WHERE pathname=%Q AND octet_length(content)=%d",
203203
zFN, sz
204204
);
205205
blob_zero(&v1);
206206
if( db_step(&q2)==SQLITE_ROW ){
207
- db_column_blob(&q, 0, &v1);
207
+ db_column_blob(&q2, 0, &v1);
208208
}else{
209209
mb.zV1 = "(local content missing)";
210210
}
211211
db_finalize(&q2);
212212
}else{
213213
--- src/merge.c
+++ src/merge.c
@@ -202,11 +202,11 @@
202 " WHERE pathname=%Q AND octet_length(content)=%d",
203 zFN, sz
204 );
205 blob_zero(&v1);
206 if( db_step(&q2)==SQLITE_ROW ){
207 db_column_blob(&q, 0, &v1);
208 }else{
209 mb.zV1 = "(local content missing)";
210 }
211 db_finalize(&q2);
212 }else{
213
--- src/merge.c
+++ src/merge.c
@@ -202,11 +202,11 @@
202 " WHERE pathname=%Q AND octet_length(content)=%d",
203 zFN, sz
204 );
205 blob_zero(&v1);
206 if( db_step(&q2)==SQLITE_ROW ){
207 db_column_blob(&q2, 0, &v1);
208 }else{
209 mb.zV1 = "(local content missing)";
210 }
211 db_finalize(&q2);
212 }else{
213
+28
--- src/update.c
+++ src/update.c
@@ -407,10 +407,11 @@
407407
" WHERE id=:idt"
408408
);
409409
assert( g.zLocalRoot!=0 );
410410
assert( strlen(g.zLocalRoot)>0 );
411411
assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' );
412
+ merge_info_init();
412413
while( db_step(&q)==SQLITE_ROW ){
413414
const char *zName = db_column_text(&q, 0); /* The filename from root */
414415
int idv = db_column_int(&q, 1); /* VFILE entry for current */
415416
int ridv = db_column_int(&q, 2); /* RecordID for current */
416417
int idt = db_column_int(&q, 3); /* VFILE entry for target */
@@ -500,31 +501,41 @@
500501
}
501502
}else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
502503
/* Merge the changes in the current tree into the target version */
503504
Blob r, t, v;
504505
int rc;
506
+ const char *zOp = "MERGE";
507
+ i64 sz = 0;
508
+ int nc = 0;
509
+ const char *zErrMsg = 0;
510
+
505511
if( nameChng ){
506512
fossil_print("MERGE %s -> %s\n", zName, zNewName);
507513
}else{
508514
fossil_print("MERGE %s\n", zName);
509515
}
510516
if( islinkv || islinkt ){
511517
fossil_print("***** Cannot merge symlink %s\n", zNewName);
518
+ zOp = "CONFLICT";
512519
nConflict++;
513520
}else{
514521
unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
515522
if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
516523
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
517524
content_get(ridt, &t);
518525
content_get(ridv, &v);
526
+ sz = file_size(zFullPath, ExtFILE);
519527
rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
520528
if( rc>=0 ){
521529
if( !dryRunFlag ){
522530
blob_write_to_file(&r, zFullNewPath);
523531
file_setexe(zFullNewPath, isexe);
524532
}
525533
if( rc>0 ){
534
+ nc = rc;
535
+ zOp = "CONFLICT";
536
+ zErrMsg = "merge conflicts";
526537
fossil_print("***** %d merge conflicts in %s\n", rc, zNewName);
527538
nConflict++;
528539
}
529540
}else{
530541
if( !dryRunFlag ){
@@ -543,12 +554,29 @@
543554
if( !dryRunFlag ){
544555
fossil_print(", original copy backed up locally");
545556
}
546557
fossil_print("\n");
547558
nConflict++;
559
+ zOp = "ERROR";
560
+ zErrMsg = "cannot merge binary file";
561
+ nc = 1;
548562
}
549563
}
564
+ db_multi_exec(
565
+ "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)"
566
+ "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)",
567
+ /* op */ zOp,
568
+ /* fnp */ zName,
569
+ /* ridp */ ridv,
570
+ /* fn */ zNewName,
571
+ /* sz */ sz,
572
+ /* fnm */ zName,
573
+ /* ridm */ ridt,
574
+ /* fnr */ zNewName,
575
+ /* nc */ nc,
576
+ /* msg */ zErrMsg
577
+ );
550578
if( nameChng && !dryRunFlag ) file_delete(zFullPath);
551579
blob_reset(&v);
552580
blob_reset(&t);
553581
blob_reset(&r);
554582
}else{
555583
--- src/update.c
+++ src/update.c
@@ -407,10 +407,11 @@
407 " WHERE id=:idt"
408 );
409 assert( g.zLocalRoot!=0 );
410 assert( strlen(g.zLocalRoot)>0 );
411 assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' );
 
412 while( db_step(&q)==SQLITE_ROW ){
413 const char *zName = db_column_text(&q, 0); /* The filename from root */
414 int idv = db_column_int(&q, 1); /* VFILE entry for current */
415 int ridv = db_column_int(&q, 2); /* RecordID for current */
416 int idt = db_column_int(&q, 3); /* VFILE entry for target */
@@ -500,31 +501,41 @@
500 }
501 }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
502 /* Merge the changes in the current tree into the target version */
503 Blob r, t, v;
504 int rc;
 
 
 
 
 
505 if( nameChng ){
506 fossil_print("MERGE %s -> %s\n", zName, zNewName);
507 }else{
508 fossil_print("MERGE %s\n", zName);
509 }
510 if( islinkv || islinkt ){
511 fossil_print("***** Cannot merge symlink %s\n", zNewName);
 
512 nConflict++;
513 }else{
514 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
515 if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
516 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
517 content_get(ridt, &t);
518 content_get(ridv, &v);
 
519 rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
520 if( rc>=0 ){
521 if( !dryRunFlag ){
522 blob_write_to_file(&r, zFullNewPath);
523 file_setexe(zFullNewPath, isexe);
524 }
525 if( rc>0 ){
 
 
 
526 fossil_print("***** %d merge conflicts in %s\n", rc, zNewName);
527 nConflict++;
528 }
529 }else{
530 if( !dryRunFlag ){
@@ -543,12 +554,29 @@
543 if( !dryRunFlag ){
544 fossil_print(", original copy backed up locally");
545 }
546 fossil_print("\n");
547 nConflict++;
 
 
 
548 }
549 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
550 if( nameChng && !dryRunFlag ) file_delete(zFullPath);
551 blob_reset(&v);
552 blob_reset(&t);
553 blob_reset(&r);
554 }else{
555
--- src/update.c
+++ src/update.c
@@ -407,10 +407,11 @@
407 " WHERE id=:idt"
408 );
409 assert( g.zLocalRoot!=0 );
410 assert( strlen(g.zLocalRoot)>0 );
411 assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' );
412 merge_info_init();
413 while( db_step(&q)==SQLITE_ROW ){
414 const char *zName = db_column_text(&q, 0); /* The filename from root */
415 int idv = db_column_int(&q, 1); /* VFILE entry for current */
416 int ridv = db_column_int(&q, 2); /* RecordID for current */
417 int idt = db_column_int(&q, 3); /* VFILE entry for target */
@@ -500,31 +501,41 @@
501 }
502 }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
503 /* Merge the changes in the current tree into the target version */
504 Blob r, t, v;
505 int rc;
506 const char *zOp = "MERGE";
507 i64 sz = 0;
508 int nc = 0;
509 const char *zErrMsg = 0;
510
511 if( nameChng ){
512 fossil_print("MERGE %s -> %s\n", zName, zNewName);
513 }else{
514 fossil_print("MERGE %s\n", zName);
515 }
516 if( islinkv || islinkt ){
517 fossil_print("***** Cannot merge symlink %s\n", zNewName);
518 zOp = "CONFLICT";
519 nConflict++;
520 }else{
521 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
522 if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
523 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
524 content_get(ridt, &t);
525 content_get(ridv, &v);
526 sz = file_size(zFullPath, ExtFILE);
527 rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
528 if( rc>=0 ){
529 if( !dryRunFlag ){
530 blob_write_to_file(&r, zFullNewPath);
531 file_setexe(zFullNewPath, isexe);
532 }
533 if( rc>0 ){
534 nc = rc;
535 zOp = "CONFLICT";
536 zErrMsg = "merge conflicts";
537 fossil_print("***** %d merge conflicts in %s\n", rc, zNewName);
538 nConflict++;
539 }
540 }else{
541 if( !dryRunFlag ){
@@ -543,12 +554,29 @@
554 if( !dryRunFlag ){
555 fossil_print(", original copy backed up locally");
556 }
557 fossil_print("\n");
558 nConflict++;
559 zOp = "ERROR";
560 zErrMsg = "cannot merge binary file";
561 nc = 1;
562 }
563 }
564 db_multi_exec(
565 "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)"
566 "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)",
567 /* op */ zOp,
568 /* fnp */ zName,
569 /* ridp */ ridv,
570 /* fn */ zNewName,
571 /* sz */ sz,
572 /* fnm */ zName,
573 /* ridm */ ridt,
574 /* fnr */ zNewName,
575 /* nc */ nc,
576 /* msg */ zErrMsg
577 );
578 if( nameChng && !dryRunFlag ) file_delete(zFullPath);
579 blob_reset(&v);
580 blob_reset(&t);
581 blob_reset(&r);
582 }else{
583

Keyboard Shortcuts

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