Fossil SCM

Add diffs to the /ckout page.

drh 2024-12-10 12:16 ckout-page
Commit 2578684c5c9dd9eddff9a751c49a597b7fe2a50372e6f1c454a788c18e1187a6
1 file changed +77
+77
--- src/info.c
+++ src/info.c
@@ -615,14 +615,20 @@
615615
void ckout_page(void){
616616
const char *zName = P("name");
617617
int vid;
618618
char *zHostname;
619619
char *zCwd;
620
+ int diffType; /* 0: no diff, 1: unified, 2: side-by-side */
621
+ DiffConfig DCfg,*pCfg; /* Diff details */
622
+ Stmt q;
623
+
620624
if( zName || !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){
621625
webpage_notfound_error(0 /*works-like:""*/);
622626
return;
623627
}
628
+ diffType = preferred_diff_type();
629
+ pCfg = construct_diff_flags(diffType, &DCfg);
624630
vid = db_lget_int("checkout", 0);
625631
style_set_current_feature("vinfo");
626632
zHostname = fossil_hostname();
627633
zCwd = file_getcwd(0,0);
628634
if( zHostname ){
@@ -629,10 +635,81 @@
629635
style_header("Checkout at %s:%s", zHostname, zCwd);
630636
}else{
631637
style_header("Checkout at %s", zCwd);
632638
}
633639
render_checkin_context(vid, 0, 0, 0);
640
+ db_prepare(&q,
641
+ /* 0 1 2 3 4 5 6 */
642
+ "SELECT pathname, deleted, chnged , rid==0, rid, islink, uuid"
643
+ " FROM vfile LEFT JOIN blob USING(rid)"
644
+ " WHERE vid=%d"
645
+ " AND (deleted OR chnged OR rid==0)"
646
+ " ORDER BY pathname /*scan*/",
647
+ vid
648
+ );
649
+ if( pCfg->diffFlags & DIFF_SIDEBYSIDE ){
650
+ pCfg->diffFlags |= DIFF_HTML | DIFF_NOTTOOBIG;
651
+ }else{
652
+ pCfg->diffFlags |= DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG;
653
+ }
654
+ while( db_step(&q)==SQLITE_ROW ){
655
+ const char *zTreename = db_column_text(&q,0);
656
+ int isDeleted = db_column_int(&q, 1);
657
+ int isChnged = db_column_int(&q,2);
658
+ int isNew = db_column_int(&q,3);
659
+ int srcid = db_column_int(&q, 4);
660
+ int isLink = db_column_int(&q, 5);
661
+ const char *zUuid = db_column_text(&q, 6);
662
+ int showDiff = 1;
663
+
664
+ pCfg->diffFlags &= (~DIFF_FILE_MASK);
665
+ if( isDeleted ){
666
+ @ <p>DELETED %h(zTreename)</p>
667
+ pCfg->diffFlags |= DIFF_FILE_DELETED;
668
+ showDiff = 0;
669
+ }else if( file_access(zTreename, F_OK) ){
670
+ @ <p>MISSING %h(zTreename)</p>
671
+ showDiff = 0;
672
+ }else if( isNew ){
673
+ @ <p>ADDED %h(zTreename)</p>
674
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
675
+ srcid = 0;
676
+ showDiff = 0;
677
+ }else if( isChnged==3 ){
678
+ @ <p>ADDED_BY_MERGE %h(zTreename)</p>
679
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
680
+ srcid = 0;
681
+ showDiff = 0;
682
+ }else if( isChnged==5 ){
683
+ @ <p>ADDED_BY_INTEGRATE %h(zTreename)</p>
684
+ pCfg->diffFlags |= DIFF_FILE_ADDED;
685
+ srcid = 0;
686
+ showDiff = 0;
687
+ }else{
688
+ @ <p>CHANGED %h(zTreename)</p>
689
+ }
690
+ if( showDiff ){
691
+ Blob old, new;
692
+ if( !isLink != !file_islink(zTreename) ){
693
+ @ %s(DIFF_CANNOT_COMPUTE_SYMLINK)
694
+ continue;
695
+ }
696
+ if( srcid>0 ){
697
+ content_get(srcid, &old);
698
+ pCfg->zLeftHash = zUuid;
699
+ }else{
700
+ blob_zero(&old);
701
+ pCfg->zLeftHash = 0;
702
+ }
703
+ blob_read_from_file(&new, zTreename, ExtFILE);
704
+ text_diff(&old, &new, cgi_output_blob(), pCfg);
705
+ blob_reset(&old);
706
+ blob_reset(&new);
707
+ }
708
+ }
709
+ db_finalize(&q);
710
+ append_diff_javascript(diffType);
634711
style_finish_page();
635712
}
636713
637714
/*
638715
** WEBPAGE: vinfo
639716
--- src/info.c
+++ src/info.c
@@ -615,14 +615,20 @@
615 void ckout_page(void){
616 const char *zName = P("name");
617 int vid;
618 char *zHostname;
619 char *zCwd;
 
 
 
 
620 if( zName || !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){
621 webpage_notfound_error(0 /*works-like:""*/);
622 return;
623 }
 
 
624 vid = db_lget_int("checkout", 0);
625 style_set_current_feature("vinfo");
626 zHostname = fossil_hostname();
627 zCwd = file_getcwd(0,0);
628 if( zHostname ){
@@ -629,10 +635,81 @@
629 style_header("Checkout at %s:%s", zHostname, zCwd);
630 }else{
631 style_header("Checkout at %s", zCwd);
632 }
633 render_checkin_context(vid, 0, 0, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
634 style_finish_page();
635 }
636
637 /*
638 ** WEBPAGE: vinfo
639
--- src/info.c
+++ src/info.c
@@ -615,14 +615,20 @@
615 void ckout_page(void){
616 const char *zName = P("name");
617 int vid;
618 char *zHostname;
619 char *zCwd;
620 int diffType; /* 0: no diff, 1: unified, 2: side-by-side */
621 DiffConfig DCfg,*pCfg; /* Diff details */
622 Stmt q;
623
624 if( zName || !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){
625 webpage_notfound_error(0 /*works-like:""*/);
626 return;
627 }
628 diffType = preferred_diff_type();
629 pCfg = construct_diff_flags(diffType, &DCfg);
630 vid = db_lget_int("checkout", 0);
631 style_set_current_feature("vinfo");
632 zHostname = fossil_hostname();
633 zCwd = file_getcwd(0,0);
634 if( zHostname ){
@@ -629,10 +635,81 @@
635 style_header("Checkout at %s:%s", zHostname, zCwd);
636 }else{
637 style_header("Checkout at %s", zCwd);
638 }
639 render_checkin_context(vid, 0, 0, 0);
640 db_prepare(&q,
641 /* 0 1 2 3 4 5 6 */
642 "SELECT pathname, deleted, chnged , rid==0, rid, islink, uuid"
643 " FROM vfile LEFT JOIN blob USING(rid)"
644 " WHERE vid=%d"
645 " AND (deleted OR chnged OR rid==0)"
646 " ORDER BY pathname /*scan*/",
647 vid
648 );
649 if( pCfg->diffFlags & DIFF_SIDEBYSIDE ){
650 pCfg->diffFlags |= DIFF_HTML | DIFF_NOTTOOBIG;
651 }else{
652 pCfg->diffFlags |= DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG;
653 }
654 while( db_step(&q)==SQLITE_ROW ){
655 const char *zTreename = db_column_text(&q,0);
656 int isDeleted = db_column_int(&q, 1);
657 int isChnged = db_column_int(&q,2);
658 int isNew = db_column_int(&q,3);
659 int srcid = db_column_int(&q, 4);
660 int isLink = db_column_int(&q, 5);
661 const char *zUuid = db_column_text(&q, 6);
662 int showDiff = 1;
663
664 pCfg->diffFlags &= (~DIFF_FILE_MASK);
665 if( isDeleted ){
666 @ <p>DELETED %h(zTreename)</p>
667 pCfg->diffFlags |= DIFF_FILE_DELETED;
668 showDiff = 0;
669 }else if( file_access(zTreename, F_OK) ){
670 @ <p>MISSING %h(zTreename)</p>
671 showDiff = 0;
672 }else if( isNew ){
673 @ <p>ADDED %h(zTreename)</p>
674 pCfg->diffFlags |= DIFF_FILE_ADDED;
675 srcid = 0;
676 showDiff = 0;
677 }else if( isChnged==3 ){
678 @ <p>ADDED_BY_MERGE %h(zTreename)</p>
679 pCfg->diffFlags |= DIFF_FILE_ADDED;
680 srcid = 0;
681 showDiff = 0;
682 }else if( isChnged==5 ){
683 @ <p>ADDED_BY_INTEGRATE %h(zTreename)</p>
684 pCfg->diffFlags |= DIFF_FILE_ADDED;
685 srcid = 0;
686 showDiff = 0;
687 }else{
688 @ <p>CHANGED %h(zTreename)</p>
689 }
690 if( showDiff ){
691 Blob old, new;
692 if( !isLink != !file_islink(zTreename) ){
693 @ %s(DIFF_CANNOT_COMPUTE_SYMLINK)
694 continue;
695 }
696 if( srcid>0 ){
697 content_get(srcid, &old);
698 pCfg->zLeftHash = zUuid;
699 }else{
700 blob_zero(&old);
701 pCfg->zLeftHash = 0;
702 }
703 blob_read_from_file(&new, zTreename, ExtFILE);
704 text_diff(&old, &new, cgi_output_blob(), pCfg);
705 blob_reset(&old);
706 blob_reset(&new);
707 }
708 }
709 db_finalize(&q);
710 append_diff_javascript(diffType);
711 style_finish_page();
712 }
713
714 /*
715 ** WEBPAGE: vinfo
716

Keyboard Shortcuts

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