Fossil SCM

Add the /deltachain page, indented for analysis of the delta compression and future improvements to that algorithm. There are links to the delta chain on the /timeline and /finfo when the showid query parameter is used.

drh 2023-02-03 14:32 trunk
Commit 00c62a11ad7d2bc6ea3745b87bcf352d4460e2d17ea6dadf233c3eeed8c4bc4c
3 files changed +11 -2 +97 -2 +13 -8
+11 -2
--- src/finfo.c
+++ src/finfo.c
@@ -681,10 +681,18 @@
681681
@ <b>Deleted:</b>
682682
}
683683
}
684684
if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
685685
hyperlink_to_version(zUuid);
686
+ if( fShowId ){
687
+ int srcId = delta_source_rid(frid);
688
+ if( srcId ){
689
+ @ (%z(href("%R/deltachain/%d",frid))%d(frid)&larr;%d(srcId)</a>)
690
+ }else{
691
+ @ (%z(href("%R/deltachain/%d",frid))%d(frid)</a>)
692
+ }
693
+ }
686694
@ part of check-in \
687695
hyperlink_to_version(zCkin);
688696
}
689697
}
690698
@ %W(zCom)</span>
@@ -708,13 +716,14 @@
708716
@ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
709717
@ [%S(zUuid)]</a>
710718
if( fShowId ){
711719
int srcId = delta_source_rid(frid);
712720
if( srcId>0 ){
713
- @ id:&nbsp;%d(frid)&larr;%d(srcId)
721
+ @ id:&nbsp;%z(href("%R/deltachain/%d",frid))\
722
+ @ %d(frid)&larr;%d(srcId)</a>
714723
}else{
715
- @ id:&nbsp;%d(frid)
724
+ @ id:&nbsp;%z(href("%R/deltachain/%d",frid))%d(frid)</a>
716725
}
717726
}
718727
}
719728
@ check-in:&nbsp;\
720729
hyperlink_to_version(zCkin);
721730
--- src/finfo.c
+++ src/finfo.c
@@ -681,10 +681,18 @@
681 @ <b>Deleted:</b>
682 }
683 }
684 if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
685 hyperlink_to_version(zUuid);
 
 
 
 
 
 
 
 
686 @ part of check-in \
687 hyperlink_to_version(zCkin);
688 }
689 }
690 @ %W(zCom)</span>
@@ -708,13 +716,14 @@
708 @ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
709 @ [%S(zUuid)]</a>
710 if( fShowId ){
711 int srcId = delta_source_rid(frid);
712 if( srcId>0 ){
713 @ id:&nbsp;%d(frid)&larr;%d(srcId)
 
714 }else{
715 @ id:&nbsp;%d(frid)
716 }
717 }
718 }
719 @ check-in:&nbsp;\
720 hyperlink_to_version(zCkin);
721
--- src/finfo.c
+++ src/finfo.c
@@ -681,10 +681,18 @@
681 @ <b>Deleted:</b>
682 }
683 }
684 if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
685 hyperlink_to_version(zUuid);
686 if( fShowId ){
687 int srcId = delta_source_rid(frid);
688 if( srcId ){
689 @ (%z(href("%R/deltachain/%d",frid))%d(frid)&larr;%d(srcId)</a>)
690 }else{
691 @ (%z(href("%R/deltachain/%d",frid))%d(frid)</a>)
692 }
693 }
694 @ part of check-in \
695 hyperlink_to_version(zCkin);
696 }
697 }
698 @ %W(zCom)</span>
@@ -708,13 +716,14 @@
716 @ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
717 @ [%S(zUuid)]</a>
718 if( fShowId ){
719 int srcId = delta_source_rid(frid);
720 if( srcId>0 ){
721 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))\
722 @ %d(frid)&larr;%d(srcId)</a>
723 }else{
724 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))%d(frid)</a>
725 }
726 }
727 }
728 @ check-in:&nbsp;\
729 hyperlink_to_version(zCkin);
730
+97 -2
--- src/name.c
+++ src/name.c
@@ -1738,11 +1738,11 @@
17381738
** WEBPAGE: bigbloblist
17391739
**
17401740
** Return a page showing the largest artifacts in the repository in order
17411741
** of decreasing size.
17421742
**
1743
-** n=N Show the top N artifacts
1743
+** n=N Show the top N artifacts (default: 250)
17441744
*/
17451745
void bigbloblist_page(void){
17461746
Stmt q;
17471747
int n = atoi(PD("n","250"));
17481748
@@ -1773,11 +1773,11 @@
17731773
" ORDER BY length(content) DESC"
17741774
);
17751775
@ <table cellpadding="2" cellspacing="0" border="1" \
17761776
@ class='sortable' data-column-types='NnnttT' data-init-sort='0'>
17771777
@ <thead><tr><th align="right">Size<th align="right">RID
1778
- @ <th align="right">Delta From<th>Hash<th>Description<th>Date</tr></thead>
1778
+ @ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
17791779
@ <tbody>
17801780
while( db_step(&q)==SQLITE_ROW ){
17811781
int rid = db_column_int(&q,0);
17821782
const char *zUuid = db_column_text(&q, 1);
17831783
const char *zDesc = db_column_text(&q, 2);
@@ -1795,10 +1795,105 @@
17951795
@ </tbody></table>
17961796
db_finalize(&q);
17971797
style_table_sorter();
17981798
style_finish_page();
17991799
}
1800
+
1801
+/*
1802
+** WEBPAGE: deltachain
1803
+**
1804
+** Usage: /deltachain/RID
1805
+**
1806
+** The RID query parameter is required. Generate a page with a table
1807
+** showing storage characteristics of RID and other artifacts that are
1808
+** derived from RID via delta.
1809
+*/
1810
+void deltachain_page(void){
1811
+ Stmt q;
1812
+ int id = atoi(PD("name","0"));
1813
+ int top;
1814
+ i64 nStored = 0;
1815
+ i64 nExpanded = 0;
1816
+
1817
+ login_check_credentials();
1818
+ if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1819
+ top = db_int(id,
1820
+ "WITH RECURSIVE chain(aa,bb) AS (\n"
1821
+ " SELECT rid, srcid FROM delta WHERE rid=%d\n"
1822
+ " UNION ALL\n"
1823
+ " SELECT bb, delta.srcid"
1824
+ " FROM chain LEFT JOIN delta ON delta.rid=bb"
1825
+ " WHERE bb IS NOT NULL\n"
1826
+ ")\n"
1827
+ "SELECT aa FROM chain WHERE bb IS NULL",
1828
+ id
1829
+ );
1830
+ style_header("Delta Chain Containing Artifact %d", id);
1831
+ db_multi_exec(
1832
+ "CREATE TEMP TABLE toshow(rid INT, gen INT);\n"
1833
+ "WITH RECURSIVE tx(id,px) AS (\n"
1834
+ " VALUES(%d,0)\n"
1835
+ " UNION ALL\n"
1836
+ " SELECT delta.rid, px+1 FROM tx, delta where delta.srcid=tx.id\n"
1837
+ " ORDER BY 2\n"
1838
+ ") "
1839
+ "INSERT INTO toshow(rid,gen) SELECT id,px FROM tx;",
1840
+ top
1841
+ );
1842
+ db_multi_exec("CREATE INDEX toshow_rid ON toshow(rid);");
1843
+ describe_artifacts("IN (SELECT rid FROM toshow)");
1844
+ db_prepare(&q,
1845
+ "SELECT description.rid, description.uuid, description.summary,"
1846
+ " length(blob.content), coalesce(delta.srcid,''),"
1847
+ " datetime(description.ctime), toshow.gen, blob.size"
1848
+ " FROM description, toshow, blob LEFT JOIN delta ON delta.rid=blob.rid"
1849
+ " WHERE description.rid=blob.rid"
1850
+ " AND toshow.rid=description.rid"
1851
+ " ORDER BY toshow.gen, description.ctime"
1852
+ );
1853
+ @ <table cellpadding="2" cellspacing="0" border="1" \
1854
+ @ class='sortable' data-column-types='nNnnttT' data-init-sort='0'>
1855
+ @ <thead><tr><th align="right">Level</th>
1856
+ @ <th align="right">Size<th align="right">RID
1857
+ @ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
1858
+ @ <tbody>
1859
+ while( db_step(&q)==SQLITE_ROW ){
1860
+ int rid = db_column_int(&q,0);
1861
+ const char *zUuid = db_column_text(&q, 1);
1862
+ const char *zDesc = db_column_text(&q, 2);
1863
+ int sz = db_column_int(&q,3);
1864
+ const char *zSrcId = db_column_text(&q,4);
1865
+ const char *zDate = db_column_text(&q,5);
1866
+ int gen = db_column_int(&q,6);
1867
+ nExpanded += db_column_int(&q,7);
1868
+ nStored += sz;
1869
+ @ <tr><td align="right">%d(gen)</td>
1870
+ @ <td align="right">%d(sz)</td>
1871
+ if( rid==id ){
1872
+ @ <td align="right"><b>%d(rid)</b></td>
1873
+ }else{
1874
+ @ <td align="right">%d(rid)</td>
1875
+ }
1876
+ @ <td align="right">%s(zSrcId)</td>
1877
+ @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
1878
+ @ <td align="left">%h(zDesc)</td>
1879
+ @ <td align="left">%z(href("%R/timeline?c=%T",zDate))%s(zDate)</a></td>
1880
+ @ </tr>
1881
+ }
1882
+ @ </tbody></table>
1883
+ db_finalize(&q);
1884
+ style_table_sorter();
1885
+ @ <p>
1886
+ @ <table border="0" cellspacing="0" cellpadding="0">
1887
+ @ <tr><td>Bytes of content</td><td>&nbsp;&nbsp;&nbsp;</td>
1888
+ @ <td align="right">%,lld(nExpanded)</td></tr>
1889
+ @ <tr><td>Bytes stored in repository</td><td></td>
1890
+ @ <td align="right">%,lld(nStored)</td>
1891
+ @ </table>
1892
+ @ </p>
1893
+ style_finish_page();
1894
+}
18001895
18011896
/*
18021897
** COMMAND: test-unsent
18031898
**
18041899
** Usage: %fossil test-unsent
18051900
--- src/name.c
+++ src/name.c
@@ -1738,11 +1738,11 @@
1738 ** WEBPAGE: bigbloblist
1739 **
1740 ** Return a page showing the largest artifacts in the repository in order
1741 ** of decreasing size.
1742 **
1743 ** n=N Show the top N artifacts
1744 */
1745 void bigbloblist_page(void){
1746 Stmt q;
1747 int n = atoi(PD("n","250"));
1748
@@ -1773,11 +1773,11 @@
1773 " ORDER BY length(content) DESC"
1774 );
1775 @ <table cellpadding="2" cellspacing="0" border="1" \
1776 @ class='sortable' data-column-types='NnnttT' data-init-sort='0'>
1777 @ <thead><tr><th align="right">Size<th align="right">RID
1778 @ <th align="right">Delta From<th>Hash<th>Description<th>Date</tr></thead>
1779 @ <tbody>
1780 while( db_step(&q)==SQLITE_ROW ){
1781 int rid = db_column_int(&q,0);
1782 const char *zUuid = db_column_text(&q, 1);
1783 const char *zDesc = db_column_text(&q, 2);
@@ -1795,10 +1795,105 @@
1795 @ </tbody></table>
1796 db_finalize(&q);
1797 style_table_sorter();
1798 style_finish_page();
1799 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1800
1801 /*
1802 ** COMMAND: test-unsent
1803 **
1804 ** Usage: %fossil test-unsent
1805
--- src/name.c
+++ src/name.c
@@ -1738,11 +1738,11 @@
1738 ** WEBPAGE: bigbloblist
1739 **
1740 ** Return a page showing the largest artifacts in the repository in order
1741 ** of decreasing size.
1742 **
1743 ** n=N Show the top N artifacts (default: 250)
1744 */
1745 void bigbloblist_page(void){
1746 Stmt q;
1747 int n = atoi(PD("n","250"));
1748
@@ -1773,11 +1773,11 @@
1773 " ORDER BY length(content) DESC"
1774 );
1775 @ <table cellpadding="2" cellspacing="0" border="1" \
1776 @ class='sortable' data-column-types='NnnttT' data-init-sort='0'>
1777 @ <thead><tr><th align="right">Size<th align="right">RID
1778 @ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
1779 @ <tbody>
1780 while( db_step(&q)==SQLITE_ROW ){
1781 int rid = db_column_int(&q,0);
1782 const char *zUuid = db_column_text(&q, 1);
1783 const char *zDesc = db_column_text(&q, 2);
@@ -1795,10 +1795,105 @@
1795 @ </tbody></table>
1796 db_finalize(&q);
1797 style_table_sorter();
1798 style_finish_page();
1799 }
1800
1801 /*
1802 ** WEBPAGE: deltachain
1803 **
1804 ** Usage: /deltachain/RID
1805 **
1806 ** The RID query parameter is required. Generate a page with a table
1807 ** showing storage characteristics of RID and other artifacts that are
1808 ** derived from RID via delta.
1809 */
1810 void deltachain_page(void){
1811 Stmt q;
1812 int id = atoi(PD("name","0"));
1813 int top;
1814 i64 nStored = 0;
1815 i64 nExpanded = 0;
1816
1817 login_check_credentials();
1818 if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1819 top = db_int(id,
1820 "WITH RECURSIVE chain(aa,bb) AS (\n"
1821 " SELECT rid, srcid FROM delta WHERE rid=%d\n"
1822 " UNION ALL\n"
1823 " SELECT bb, delta.srcid"
1824 " FROM chain LEFT JOIN delta ON delta.rid=bb"
1825 " WHERE bb IS NOT NULL\n"
1826 ")\n"
1827 "SELECT aa FROM chain WHERE bb IS NULL",
1828 id
1829 );
1830 style_header("Delta Chain Containing Artifact %d", id);
1831 db_multi_exec(
1832 "CREATE TEMP TABLE toshow(rid INT, gen INT);\n"
1833 "WITH RECURSIVE tx(id,px) AS (\n"
1834 " VALUES(%d,0)\n"
1835 " UNION ALL\n"
1836 " SELECT delta.rid, px+1 FROM tx, delta where delta.srcid=tx.id\n"
1837 " ORDER BY 2\n"
1838 ") "
1839 "INSERT INTO toshow(rid,gen) SELECT id,px FROM tx;",
1840 top
1841 );
1842 db_multi_exec("CREATE INDEX toshow_rid ON toshow(rid);");
1843 describe_artifacts("IN (SELECT rid FROM toshow)");
1844 db_prepare(&q,
1845 "SELECT description.rid, description.uuid, description.summary,"
1846 " length(blob.content), coalesce(delta.srcid,''),"
1847 " datetime(description.ctime), toshow.gen, blob.size"
1848 " FROM description, toshow, blob LEFT JOIN delta ON delta.rid=blob.rid"
1849 " WHERE description.rid=blob.rid"
1850 " AND toshow.rid=description.rid"
1851 " ORDER BY toshow.gen, description.ctime"
1852 );
1853 @ <table cellpadding="2" cellspacing="0" border="1" \
1854 @ class='sortable' data-column-types='nNnnttT' data-init-sort='0'>
1855 @ <thead><tr><th align="right">Level</th>
1856 @ <th align="right">Size<th align="right">RID
1857 @ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
1858 @ <tbody>
1859 while( db_step(&q)==SQLITE_ROW ){
1860 int rid = db_column_int(&q,0);
1861 const char *zUuid = db_column_text(&q, 1);
1862 const char *zDesc = db_column_text(&q, 2);
1863 int sz = db_column_int(&q,3);
1864 const char *zSrcId = db_column_text(&q,4);
1865 const char *zDate = db_column_text(&q,5);
1866 int gen = db_column_int(&q,6);
1867 nExpanded += db_column_int(&q,7);
1868 nStored += sz;
1869 @ <tr><td align="right">%d(gen)</td>
1870 @ <td align="right">%d(sz)</td>
1871 if( rid==id ){
1872 @ <td align="right"><b>%d(rid)</b></td>
1873 }else{
1874 @ <td align="right">%d(rid)</td>
1875 }
1876 @ <td align="right">%s(zSrcId)</td>
1877 @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
1878 @ <td align="left">%h(zDesc)</td>
1879 @ <td align="left">%z(href("%R/timeline?c=%T",zDate))%s(zDate)</a></td>
1880 @ </tr>
1881 }
1882 @ </tbody></table>
1883 db_finalize(&q);
1884 style_table_sorter();
1885 @ <p>
1886 @ <table border="0" cellspacing="0" cellpadding="0">
1887 @ <tr><td>Bytes of content</td><td>&nbsp;&nbsp;&nbsp;</td>
1888 @ <td align="right">%,lld(nExpanded)</td></tr>
1889 @ <tr><td>Bytes stored in repository</td><td></td>
1890 @ <td align="right">%,lld(nStored)</td>
1891 @ </table>
1892 @ </p>
1893 style_finish_page();
1894 }
1895
1896 /*
1897 ** COMMAND: test-unsent
1898 **
1899 ** Usage: %fossil test-unsent
1900
+13 -8
--- src/timeline.c
+++ src/timeline.c
@@ -494,13 +494,13 @@
494494
hyperlink_to_version(zUuid);
495495
}
496496
if( tmFlags & TIMELINE_SHOWRID ){
497497
int srcId = delta_source_rid(rid);
498498
if( srcId ){
499
- @ (%d(rid)&larr;%d(srcId))
499
+ @ (%z(href("%R/deltachain/%d",rid))%d(rid)&larr;%d(srcId)</a>)
500500
}else{
501
- @ (%d(rid))
501
+ @ (%z(href("%R/deltachain/%d",rid))%d(rid)</a>)
502502
}
503503
}
504504
}
505505
if( zType[0]!='c' ){
506506
/* Comments for anything other than a check-in are generated by
@@ -650,13 +650,15 @@
650650
}
651651
652652
if( tmFlags & TIMELINE_SHOWRID ){
653653
int srcId = delta_source_rid(rid);
654654
if( srcId ){
655
- cgi_printf(" id:&nbsp;%d&larr;%d", rid, srcId);
655
+ cgi_printf(" id:&nbsp;%z%d&larr;%d</a>",
656
+ href("%R/deltachain/%d",rid), rid, srcId);
656657
}else{
657
- cgi_printf(" id:&nbsp;%d", rid);
658
+ cgi_printf(" id:&nbsp;%z%d</a>",
659
+ href("%R/deltachain/%d",rid), rid);
658660
}
659661
}
660662
tag_private_status(rid);
661663
if( xExtra ){
662664
xExtra(rid);
@@ -703,24 +705,26 @@
703705
const char *zOldName = db_column_text(&fchngQuery, 5);
704706
const char *zOld = db_column_text(&fchngQuery, 4);
705707
const char *zNew = db_column_text(&fchngQuery, 3);
706708
const char *zUnpub = "";
707709
char *zA;
708
- char zId[40];
710
+ char *zId;
709711
if( !inUl ){
710712
@ <ul class="filelist">
711713
inUl = 1;
712714
}
713715
if( tmFlags & TIMELINE_SHOWRID ){
714716
int srcId = delta_source_rid(fid);
715717
if( srcId ){
716
- sqlite3_snprintf(sizeof(zId), zId, " (%d&larr;%d) ", fid, srcId);
718
+ zId = mprintf(" (%z%d&larr;%d</a>) ",
719
+ href("%R/deltachain/%d", fid), fid, srcId);
717720
}else{
718
- sqlite3_snprintf(sizeof(zId), zId, " (%d) ", fid);
721
+ zId = mprintf(" (%z%d</a>) ",
722
+ href("%R/deltachain/%d", fid), fid);
719723
}
720724
}else{
721
- zId[0] = 0;
725
+ zId = fossil_strdup("");
722726
}
723727
if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
724728
if( !isNew && !isDel && zOldName!=0 ){
725729
@ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId)
726730
}
@@ -750,10 +754,11 @@
750754
@ <li>%s(zA)%h(zFilename)</a>%s(zId) &nbsp; %s(zUnpub)
751755
}
752756
@ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a></li>
753757
}
754758
fossil_free(zA);
759
+ fossil_free(zId);
755760
}
756761
db_reset(&fchngQuery);
757762
if( inUl ){
758763
@ </ul>
759764
}
760765
--- src/timeline.c
+++ src/timeline.c
@@ -494,13 +494,13 @@
494 hyperlink_to_version(zUuid);
495 }
496 if( tmFlags & TIMELINE_SHOWRID ){
497 int srcId = delta_source_rid(rid);
498 if( srcId ){
499 @ (%d(rid)&larr;%d(srcId))
500 }else{
501 @ (%d(rid))
502 }
503 }
504 }
505 if( zType[0]!='c' ){
506 /* Comments for anything other than a check-in are generated by
@@ -650,13 +650,15 @@
650 }
651
652 if( tmFlags & TIMELINE_SHOWRID ){
653 int srcId = delta_source_rid(rid);
654 if( srcId ){
655 cgi_printf(" id:&nbsp;%d&larr;%d", rid, srcId);
 
656 }else{
657 cgi_printf(" id:&nbsp;%d", rid);
 
658 }
659 }
660 tag_private_status(rid);
661 if( xExtra ){
662 xExtra(rid);
@@ -703,24 +705,26 @@
703 const char *zOldName = db_column_text(&fchngQuery, 5);
704 const char *zOld = db_column_text(&fchngQuery, 4);
705 const char *zNew = db_column_text(&fchngQuery, 3);
706 const char *zUnpub = "";
707 char *zA;
708 char zId[40];
709 if( !inUl ){
710 @ <ul class="filelist">
711 inUl = 1;
712 }
713 if( tmFlags & TIMELINE_SHOWRID ){
714 int srcId = delta_source_rid(fid);
715 if( srcId ){
716 sqlite3_snprintf(sizeof(zId), zId, " (%d&larr;%d) ", fid, srcId);
 
717 }else{
718 sqlite3_snprintf(sizeof(zId), zId, " (%d) ", fid);
 
719 }
720 }else{
721 zId[0] = 0;
722 }
723 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
724 if( !isNew && !isDel && zOldName!=0 ){
725 @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId)
726 }
@@ -750,10 +754,11 @@
750 @ <li>%s(zA)%h(zFilename)</a>%s(zId) &nbsp; %s(zUnpub)
751 }
752 @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a></li>
753 }
754 fossil_free(zA);
 
755 }
756 db_reset(&fchngQuery);
757 if( inUl ){
758 @ </ul>
759 }
760
--- src/timeline.c
+++ src/timeline.c
@@ -494,13 +494,13 @@
494 hyperlink_to_version(zUuid);
495 }
496 if( tmFlags & TIMELINE_SHOWRID ){
497 int srcId = delta_source_rid(rid);
498 if( srcId ){
499 @ (%z(href("%R/deltachain/%d",rid))%d(rid)&larr;%d(srcId)</a>)
500 }else{
501 @ (%z(href("%R/deltachain/%d",rid))%d(rid)</a>)
502 }
503 }
504 }
505 if( zType[0]!='c' ){
506 /* Comments for anything other than a check-in are generated by
@@ -650,13 +650,15 @@
650 }
651
652 if( tmFlags & TIMELINE_SHOWRID ){
653 int srcId = delta_source_rid(rid);
654 if( srcId ){
655 cgi_printf(" id:&nbsp;%z%d&larr;%d</a>",
656 href("%R/deltachain/%d",rid), rid, srcId);
657 }else{
658 cgi_printf(" id:&nbsp;%z%d</a>",
659 href("%R/deltachain/%d",rid), rid);
660 }
661 }
662 tag_private_status(rid);
663 if( xExtra ){
664 xExtra(rid);
@@ -703,24 +705,26 @@
705 const char *zOldName = db_column_text(&fchngQuery, 5);
706 const char *zOld = db_column_text(&fchngQuery, 4);
707 const char *zNew = db_column_text(&fchngQuery, 3);
708 const char *zUnpub = "";
709 char *zA;
710 char *zId;
711 if( !inUl ){
712 @ <ul class="filelist">
713 inUl = 1;
714 }
715 if( tmFlags & TIMELINE_SHOWRID ){
716 int srcId = delta_source_rid(fid);
717 if( srcId ){
718 zId = mprintf(" (%z%d&larr;%d</a>) ",
719 href("%R/deltachain/%d", fid), fid, srcId);
720 }else{
721 zId = mprintf(" (%z%d</a>) ",
722 href("%R/deltachain/%d", fid), fid);
723 }
724 }else{
725 zId = fossil_strdup("");
726 }
727 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
728 if( !isNew && !isDel && zOldName!=0 ){
729 @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId)
730 }
@@ -750,10 +754,11 @@
754 @ <li>%s(zA)%h(zFilename)</a>%s(zId) &nbsp; %s(zUnpub)
755 }
756 @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a></li>
757 }
758 fossil_free(zA);
759 fossil_free(zId);
760 }
761 db_reset(&fchngQuery);
762 if( inUl ){
763 @ </ul>
764 }
765

Keyboard Shortcuts

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