Fossil SCM
Add diffs to the /ckout page.
Commit
2578684c5c9dd9eddff9a751c49a597b7fe2a50372e6f1c454a788c18e1187a6
Parent
c620a8c74c6f9c7…
1 file changed
+77
+77
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -615,14 +615,20 @@ | ||
| 615 | 615 | void ckout_page(void){ |
| 616 | 616 | const char *zName = P("name"); |
| 617 | 617 | int vid; |
| 618 | 618 | char *zHostname; |
| 619 | 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 | + | |
| 620 | 624 | if( zName || !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){ |
| 621 | 625 | webpage_notfound_error(0 /*works-like:""*/); |
| 622 | 626 | return; |
| 623 | 627 | } |
| 628 | + diffType = preferred_diff_type(); | |
| 629 | + pCfg = construct_diff_flags(diffType, &DCfg); | |
| 624 | 630 | vid = db_lget_int("checkout", 0); |
| 625 | 631 | style_set_current_feature("vinfo"); |
| 626 | 632 | zHostname = fossil_hostname(); |
| 627 | 633 | zCwd = file_getcwd(0,0); |
| 628 | 634 | if( zHostname ){ |
| @@ -629,10 +635,81 @@ | ||
| 629 | 635 | style_header("Checkout at %s:%s", zHostname, zCwd); |
| 630 | 636 | }else{ |
| 631 | 637 | style_header("Checkout at %s", zCwd); |
| 632 | 638 | } |
| 633 | 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); | |
| 634 | 711 | style_finish_page(); |
| 635 | 712 | } |
| 636 | 713 | |
| 637 | 714 | /* |
| 638 | 715 | ** WEBPAGE: vinfo |
| 639 | 716 |
| --- 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 |