Fossil SCM

Gather more transformations for merge-info in a "fossil update".

drh 2024-12-09 22:45 trunk
Commit 565a49062c741c9d79909c92955b49e97f3e7a87a840e7aac5f65e634d795ea4
1 file changed +34 -19
+34 -19
--- src/update.c
+++ src/update.c
@@ -423,13 +423,18 @@
423423
int islinkt = db_column_int(&q, 9); /* Is target file is a link */
424424
int deleted = db_column_int(&q, 10); /* Marked for deletion */
425425
char *zFullPath; /* Full pathname of the file */
426426
char *zFullNewPath; /* Full pathname of dest */
427427
char nameChng; /* True if the name changed */
428
+ const char *zOp = 0; /* Type of change. */
429
+ i64 sz = 0; /* Size of the file */
430
+ int nc = 0; /* Number of conflicts */
431
+ const char *zErrMsg = 0; /* Error message */
428432
429433
zFullPath = mprintf("%s%s", g.zLocalRoot, zName);
430434
zFullNewPath = mprintf("%s%s", g.zLocalRoot, zNewName);
435
+ sz = file_size(zFullNewPath, ExtFILE);
431436
nameChng = fossil_strcmp(zName, zNewName);
432437
nUpdate++;
433438
if( deleted ){
434439
db_multi_exec("UPDATE vfile SET deleted=1 WHERE id=%d", idt);
435440
}
@@ -437,10 +442,13 @@
437442
/* Conflict. This file has been added to the current check-out
438443
** but also exists in the target check-out. Use the current version.
439444
*/
440445
fossil_print("CONFLICT %s\n", zName);
441446
nConflict++;
447
+ zOp = "CONFLICT";
448
+ nc = 1;
449
+ zErrMsg = "duplicate file";
442450
}else if( idt>0 && idv==0 ){
443451
/* File added in the target. */
444452
if( file_isfile_or_link(zFullPath) ){
445453
/* Name of backup file with Original content */
446454
char *zOrig = file_newname(zFullPath, "original", 1);
@@ -449,10 +457,13 @@
449457
fossil_free(zOrig);
450458
fossil_print("ADD %s - overwrites an unmanaged file", zName);
451459
if( !dryRunFlag ) fossil_print(", original copy backed up locally");
452460
fossil_print("\n");
453461
nOverwrite++;
462
+ nc = 1;
463
+ zOp = "CONFLICT";
464
+ zErrMsg = "new file overwrites unmanaged file";
454465
}else{
455466
fossil_print("ADD %s\n", zName);
456467
}
457468
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
458469
if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
@@ -463,16 +474,18 @@
463474
}else{
464475
fossil_print("UPDATE %s\n", zName);
465476
}
466477
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
467478
if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
479
+ zOp = "UPDATE";
468480
}else if( idt>0 && idv>0 && !deleted && file_size(zFullPath, RepoFILE)<0 ){
469481
/* The file missing from the local check-out. Restore it to the
470482
** version that appears in the target. */
471483
fossil_print("UPDATE %s\n", zName);
472484
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
473485
if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
486
+ zOp = "UPDATE";
474487
}else if( idt==0 && idv>0 ){
475488
if( ridv==0 ){
476489
/* Added in current check-out. Continue to hold the file as
477490
** as an addition */
478491
db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv);
@@ -479,10 +492,13 @@
479492
}else if( chnged ){
480493
/* Edited locally but deleted from the target. Do not track the
481494
** file but keep the edited version around. */
482495
fossil_print("CONFLICT %s - edited locally but deleted by update\n",
483496
zName);
497
+ zOp = "CONFLICT";
498
+ zErrMsg = "edited locally but deleted by update";
499
+ nc = 1;
484500
nConflict++;
485501
}else{
486502
fossil_print("REMOVE %s\n", zName);
487503
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
488504
if( !dryRunFlag ){
@@ -501,14 +517,10 @@
501517
}
502518
}else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
503519
/* Merge the changes in the current tree into the target version */
504520
Blob r, t, v;
505521
int rc;
506
- const char *zOp = "MERGE";
507
- i64 sz = 0;
508
- int nc = 0;
509
- const char *zErrMsg = 0;
510522
511523
if( nameChng ){
512524
fossil_print("MERGE %s -> %s\n", zName, zNewName);
513525
}else{
514526
fossil_print("MERGE %s\n", zName);
@@ -521,11 +533,10 @@
521533
unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
522534
if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
523535
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
524536
content_get(ridt, &t);
525537
content_get(ridv, &v);
526
- sz = file_size(zFullPath, ExtFILE);
527538
rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
528539
if( rc>=0 ){
529540
if( !dryRunFlag ){
530541
blob_write_to_file(&r, zFullNewPath);
531542
file_setexe(zFullNewPath, isexe);
@@ -534,10 +545,12 @@
534545
nc = rc;
535546
zOp = "CONFLICT";
536547
zErrMsg = "merge conflicts";
537548
fossil_print("***** %d merge conflicts in %s\n", rc, zNewName);
538549
nConflict++;
550
+ }else{
551
+ zOp = "MERGE";
539552
}
540553
}else{
541554
if( !dryRunFlag ){
542555
if( !keepMergeFlag ){
543556
/* Name of backup file with Original content */
@@ -559,24 +572,10 @@
559572
zOp = "ERROR";
560573
zErrMsg = "cannot merge binary file";
561574
nc = 1;
562575
}
563576
}
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
- );
578577
if( nameChng && !dryRunFlag ) file_delete(zFullPath);
579578
blob_reset(&v);
580579
blob_reset(&t);
581580
blob_reset(&r);
582581
}else{
@@ -588,10 +587,26 @@
588587
db_bind_int(&mtimeXfer, ":idt", idt);
589588
db_step(&mtimeXfer);
590589
db_reset(&mtimeXfer);
591590
if( verboseFlag ) fossil_print("UNCHANGED %s\n", zName);
592591
}
592
+ }
593
+ if( zOp!=0 ){
594
+ db_multi_exec(
595
+ "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)"
596
+ "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)",
597
+ /* op */ zOp,
598
+ /* fnp */ zName,
599
+ /* ridp */ ridv,
600
+ /* fn */ zNewName,
601
+ /* sz */ sz,
602
+ /* fnm */ zName,
603
+ /* ridm */ ridt,
604
+ /* fnr */ zNewName,
605
+ /* nc */ nc,
606
+ /* msg */ zErrMsg
607
+ );
593608
}
594609
free(zFullPath);
595610
free(zFullNewPath);
596611
}
597612
db_finalize(&q);
598613
--- src/update.c
+++ src/update.c
@@ -423,13 +423,18 @@
423 int islinkt = db_column_int(&q, 9); /* Is target file is a link */
424 int deleted = db_column_int(&q, 10); /* Marked for deletion */
425 char *zFullPath; /* Full pathname of the file */
426 char *zFullNewPath; /* Full pathname of dest */
427 char nameChng; /* True if the name changed */
 
 
 
 
428
429 zFullPath = mprintf("%s%s", g.zLocalRoot, zName);
430 zFullNewPath = mprintf("%s%s", g.zLocalRoot, zNewName);
 
431 nameChng = fossil_strcmp(zName, zNewName);
432 nUpdate++;
433 if( deleted ){
434 db_multi_exec("UPDATE vfile SET deleted=1 WHERE id=%d", idt);
435 }
@@ -437,10 +442,13 @@
437 /* Conflict. This file has been added to the current check-out
438 ** but also exists in the target check-out. Use the current version.
439 */
440 fossil_print("CONFLICT %s\n", zName);
441 nConflict++;
 
 
 
442 }else if( idt>0 && idv==0 ){
443 /* File added in the target. */
444 if( file_isfile_or_link(zFullPath) ){
445 /* Name of backup file with Original content */
446 char *zOrig = file_newname(zFullPath, "original", 1);
@@ -449,10 +457,13 @@
449 fossil_free(zOrig);
450 fossil_print("ADD %s - overwrites an unmanaged file", zName);
451 if( !dryRunFlag ) fossil_print(", original copy backed up locally");
452 fossil_print("\n");
453 nOverwrite++;
 
 
 
454 }else{
455 fossil_print("ADD %s\n", zName);
456 }
457 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
458 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
@@ -463,16 +474,18 @@
463 }else{
464 fossil_print("UPDATE %s\n", zName);
465 }
466 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
467 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
 
468 }else if( idt>0 && idv>0 && !deleted && file_size(zFullPath, RepoFILE)<0 ){
469 /* The file missing from the local check-out. Restore it to the
470 ** version that appears in the target. */
471 fossil_print("UPDATE %s\n", zName);
472 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
473 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
 
474 }else if( idt==0 && idv>0 ){
475 if( ridv==0 ){
476 /* Added in current check-out. Continue to hold the file as
477 ** as an addition */
478 db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv);
@@ -479,10 +492,13 @@
479 }else if( chnged ){
480 /* Edited locally but deleted from the target. Do not track the
481 ** file but keep the edited version around. */
482 fossil_print("CONFLICT %s - edited locally but deleted by update\n",
483 zName);
 
 
 
484 nConflict++;
485 }else{
486 fossil_print("REMOVE %s\n", zName);
487 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
488 if( !dryRunFlag ){
@@ -501,14 +517,10 @@
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);
@@ -521,11 +533,10 @@
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);
@@ -534,10 +545,12 @@
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 ){
542 if( !keepMergeFlag ){
543 /* Name of backup file with Original content */
@@ -559,24 +572,10 @@
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{
@@ -588,10 +587,26 @@
588 db_bind_int(&mtimeXfer, ":idt", idt);
589 db_step(&mtimeXfer);
590 db_reset(&mtimeXfer);
591 if( verboseFlag ) fossil_print("UNCHANGED %s\n", zName);
592 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
593 }
594 free(zFullPath);
595 free(zFullNewPath);
596 }
597 db_finalize(&q);
598
--- src/update.c
+++ src/update.c
@@ -423,13 +423,18 @@
423 int islinkt = db_column_int(&q, 9); /* Is target file is a link */
424 int deleted = db_column_int(&q, 10); /* Marked for deletion */
425 char *zFullPath; /* Full pathname of the file */
426 char *zFullNewPath; /* Full pathname of dest */
427 char nameChng; /* True if the name changed */
428 const char *zOp = 0; /* Type of change. */
429 i64 sz = 0; /* Size of the file */
430 int nc = 0; /* Number of conflicts */
431 const char *zErrMsg = 0; /* Error message */
432
433 zFullPath = mprintf("%s%s", g.zLocalRoot, zName);
434 zFullNewPath = mprintf("%s%s", g.zLocalRoot, zNewName);
435 sz = file_size(zFullNewPath, ExtFILE);
436 nameChng = fossil_strcmp(zName, zNewName);
437 nUpdate++;
438 if( deleted ){
439 db_multi_exec("UPDATE vfile SET deleted=1 WHERE id=%d", idt);
440 }
@@ -437,10 +442,13 @@
442 /* Conflict. This file has been added to the current check-out
443 ** but also exists in the target check-out. Use the current version.
444 */
445 fossil_print("CONFLICT %s\n", zName);
446 nConflict++;
447 zOp = "CONFLICT";
448 nc = 1;
449 zErrMsg = "duplicate file";
450 }else if( idt>0 && idv==0 ){
451 /* File added in the target. */
452 if( file_isfile_or_link(zFullPath) ){
453 /* Name of backup file with Original content */
454 char *zOrig = file_newname(zFullPath, "original", 1);
@@ -449,10 +457,13 @@
457 fossil_free(zOrig);
458 fossil_print("ADD %s - overwrites an unmanaged file", zName);
459 if( !dryRunFlag ) fossil_print(", original copy backed up locally");
460 fossil_print("\n");
461 nOverwrite++;
462 nc = 1;
463 zOp = "CONFLICT";
464 zErrMsg = "new file overwrites unmanaged file";
465 }else{
466 fossil_print("ADD %s\n", zName);
467 }
468 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
469 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
@@ -463,16 +474,18 @@
474 }else{
475 fossil_print("UPDATE %s\n", zName);
476 }
477 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
478 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
479 zOp = "UPDATE";
480 }else if( idt>0 && idv>0 && !deleted && file_size(zFullPath, RepoFILE)<0 ){
481 /* The file missing from the local check-out. Restore it to the
482 ** version that appears in the target. */
483 fossil_print("UPDATE %s\n", zName);
484 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
485 if( !dryRunFlag ) vfile_to_disk(0, idt, 0, 0);
486 zOp = "UPDATE";
487 }else if( idt==0 && idv>0 ){
488 if( ridv==0 ){
489 /* Added in current check-out. Continue to hold the file as
490 ** as an addition */
491 db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv);
@@ -479,10 +492,13 @@
492 }else if( chnged ){
493 /* Edited locally but deleted from the target. Do not track the
494 ** file but keep the edited version around. */
495 fossil_print("CONFLICT %s - edited locally but deleted by update\n",
496 zName);
497 zOp = "CONFLICT";
498 zErrMsg = "edited locally but deleted by update";
499 nc = 1;
500 nConflict++;
501 }else{
502 fossil_print("REMOVE %s\n", zName);
503 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
504 if( !dryRunFlag ){
@@ -501,14 +517,10 @@
517 }
518 }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){
519 /* Merge the changes in the current tree into the target version */
520 Blob r, t, v;
521 int rc;
 
 
 
 
522
523 if( nameChng ){
524 fossil_print("MERGE %s -> %s\n", zName, zNewName);
525 }else{
526 fossil_print("MERGE %s\n", zName);
@@ -521,11 +533,10 @@
533 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
534 if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
535 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
536 content_get(ridt, &t);
537 content_get(ridv, &v);
 
538 rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
539 if( rc>=0 ){
540 if( !dryRunFlag ){
541 blob_write_to_file(&r, zFullNewPath);
542 file_setexe(zFullNewPath, isexe);
@@ -534,10 +545,12 @@
545 nc = rc;
546 zOp = "CONFLICT";
547 zErrMsg = "merge conflicts";
548 fossil_print("***** %d merge conflicts in %s\n", rc, zNewName);
549 nConflict++;
550 }else{
551 zOp = "MERGE";
552 }
553 }else{
554 if( !dryRunFlag ){
555 if( !keepMergeFlag ){
556 /* Name of backup file with Original content */
@@ -559,24 +572,10 @@
572 zOp = "ERROR";
573 zErrMsg = "cannot merge binary file";
574 nc = 1;
575 }
576 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
577 if( nameChng && !dryRunFlag ) file_delete(zFullPath);
578 blob_reset(&v);
579 blob_reset(&t);
580 blob_reset(&r);
581 }else{
@@ -588,10 +587,26 @@
587 db_bind_int(&mtimeXfer, ":idt", idt);
588 db_step(&mtimeXfer);
589 db_reset(&mtimeXfer);
590 if( verboseFlag ) fossil_print("UNCHANGED %s\n", zName);
591 }
592 }
593 if( zOp!=0 ){
594 db_multi_exec(
595 "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)"
596 "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)",
597 /* op */ zOp,
598 /* fnp */ zName,
599 /* ridp */ ridv,
600 /* fn */ zNewName,
601 /* sz */ sz,
602 /* fnm */ zName,
603 /* ridm */ ridt,
604 /* fnr */ zNewName,
605 /* nc */ nc,
606 /* msg */ zErrMsg
607 );
608 }
609 free(zFullPath);
610 free(zFullNewPath);
611 }
612 db_finalize(&q);
613

Keyboard Shortcuts

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