Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | 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. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
00c62a11ad7d2bc6ea3745b87bcf352d |
| User & Date: | drh 2023-02-03 14:32:55.996 |
Context
|
2023-02-03
| ||
| 14:59 | Update the built-in SQLite to the latest trunk version that attempts to fix various harmless compiler warnings reported by the new Clang-15. check-in: ea57625d31 user: drh tags: trunk | |
| 14:32 | 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. check-in: 00c62a11ad user: drh tags: trunk | |
| 07:21 | prefill the tktnew page email field with user emailaddr If the logged-in user has a valid email address in their contact-info, use it to prefill the email field in the /tktnew page when submitting a new ticket. As discussed in /chat, enhance the Fossil builtin find_emailaddr() SQL function--suggested by wyoung@--to parse strings for well-formed email addresses not necessarily wrapped in <...>. Requested by jose i cabrera on the [forum:62838ffe73|forum]. check-in: f974583f90 user: mark tags: trunk | |
Changes
Changes to src/finfo.c.
| ︙ | ︙ | |||
679 680 681 682 683 684 685 686 687 688 689 690 691 692 |
fossil_free(zNewName);
}else{
@ <b>Deleted:</b>
}
}
if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
hyperlink_to_version(zUuid);
@ part of check-in \
hyperlink_to_version(zCkin);
}
}
@ %W(zCom)</span>
if( (tmFlags & TIMELINE_COMPACT)!=0 ){
@ <span class='timelineEllipsis' data-id='%d(frid)' \
| > > > > > > > > | 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 |
fossil_free(zNewName);
}else{
@ <b>Deleted:</b>
}
}
if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
hyperlink_to_version(zUuid);
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId ){
@ (%z(href("%R/deltachain/%d",frid))%d(frid)←%d(srcId)</a>)
}else{
@ (%z(href("%R/deltachain/%d",frid))%d(frid)</a>)
}
}
@ part of check-in \
hyperlink_to_version(zCkin);
}
}
@ %W(zCom)</span>
if( (tmFlags & TIMELINE_COMPACT)!=0 ){
@ <span class='timelineEllipsis' data-id='%d(frid)' \
|
| ︙ | ︙ | |||
706 707 708 709 710 711 712 |
if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("(");
if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
@ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
@ [%S(zUuid)]</a>
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId>0 ){
| > | | | 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 |
if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("(");
if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
@ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
@ [%S(zUuid)]</a>
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId>0 ){
@ id: %z(href("%R/deltachain/%d",frid))\
@ %d(frid)←%d(srcId)</a>
}else{
@ id: %z(href("%R/deltachain/%d",frid))%d(frid)</a>
}
}
}
@ check-in: \
hyperlink_to_version(zCkin);
if( fShowId ){
@ (%d(fmid))
|
| ︙ | ︙ |
Changes to src/name.c.
| ︙ | ︙ | |||
1736 1737 1738 1739 1740 1741 1742 | /* ** WEBPAGE: bigbloblist ** ** Return a page showing the largest artifacts in the repository in order ** of decreasing size. ** | | | 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 |
/*
** WEBPAGE: bigbloblist
**
** Return a page showing the largest artifacts in the repository in order
** of decreasing size.
**
** n=N Show the top N artifacts (default: 250)
*/
void bigbloblist_page(void){
Stmt q;
int n = atoi(PD("n","250"));
login_check_credentials();
if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
|
| ︙ | ︙ | |||
1771 1772 1773 1774 1775 1776 1777 |
" FROM description, blob LEFT JOIN delta ON delta.rid=blob.rid"
" WHERE description.rid=blob.rid"
" ORDER BY length(content) DESC"
);
@ <table cellpadding="2" cellspacing="0" border="1" \
@ class='sortable' data-column-types='NnnttT' data-init-sort='0'>
@ <thead><tr><th align="right">Size<th align="right">RID
| | | 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 |
" FROM description, blob LEFT JOIN delta ON delta.rid=blob.rid"
" WHERE description.rid=blob.rid"
" ORDER BY length(content) DESC"
);
@ <table cellpadding="2" cellspacing="0" border="1" \
@ class='sortable' data-column-types='NnnttT' data-init-sort='0'>
@ <thead><tr><th align="right">Size<th align="right">RID
@ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
@ <tbody>
while( db_step(&q)==SQLITE_ROW ){
int rid = db_column_int(&q,0);
const char *zUuid = db_column_text(&q, 1);
const char *zDesc = db_column_text(&q, 2);
int sz = db_column_int(&q,3);
const char *zSrcId = db_column_text(&q,4);
|
| ︙ | ︙ | |||
1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 |
@ </tr>
}
@ </tbody></table>
db_finalize(&q);
style_table_sorter();
style_finish_page();
}
/*
** COMMAND: test-unsent
**
** Usage: %fossil test-unsent
**
** Show all artifacts in the unsent table
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 |
@ </tr>
}
@ </tbody></table>
db_finalize(&q);
style_table_sorter();
style_finish_page();
}
/*
** WEBPAGE: deltachain
**
** Usage: /deltachain/RID
**
** The RID query parameter is required. Generate a page with a table
** showing storage characteristics of RID and other artifacts that are
** derived from RID via delta.
*/
void deltachain_page(void){
Stmt q;
int id = atoi(PD("name","0"));
int top;
i64 nStored = 0;
i64 nExpanded = 0;
login_check_credentials();
if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
top = db_int(id,
"WITH RECURSIVE chain(aa,bb) AS (\n"
" SELECT rid, srcid FROM delta WHERE rid=%d\n"
" UNION ALL\n"
" SELECT bb, delta.srcid"
" FROM chain LEFT JOIN delta ON delta.rid=bb"
" WHERE bb IS NOT NULL\n"
")\n"
"SELECT aa FROM chain WHERE bb IS NULL",
id
);
style_header("Delta Chain Containing Artifact %d", id);
db_multi_exec(
"CREATE TEMP TABLE toshow(rid INT, gen INT);\n"
"WITH RECURSIVE tx(id,px) AS (\n"
" VALUES(%d,0)\n"
" UNION ALL\n"
" SELECT delta.rid, px+1 FROM tx, delta where delta.srcid=tx.id\n"
" ORDER BY 2\n"
") "
"INSERT INTO toshow(rid,gen) SELECT id,px FROM tx;",
top
);
db_multi_exec("CREATE INDEX toshow_rid ON toshow(rid);");
describe_artifacts("IN (SELECT rid FROM toshow)");
db_prepare(&q,
"SELECT description.rid, description.uuid, description.summary,"
" length(blob.content), coalesce(delta.srcid,''),"
" datetime(description.ctime), toshow.gen, blob.size"
" FROM description, toshow, blob LEFT JOIN delta ON delta.rid=blob.rid"
" WHERE description.rid=blob.rid"
" AND toshow.rid=description.rid"
" ORDER BY toshow.gen, description.ctime"
);
@ <table cellpadding="2" cellspacing="0" border="1" \
@ class='sortable' data-column-types='nNnnttT' data-init-sort='0'>
@ <thead><tr><th align="right">Level</th>
@ <th align="right">Size<th align="right">RID
@ <th align="right">From<th>Hash<th>Description<th>Date</tr></thead>
@ <tbody>
while( db_step(&q)==SQLITE_ROW ){
int rid = db_column_int(&q,0);
const char *zUuid = db_column_text(&q, 1);
const char *zDesc = db_column_text(&q, 2);
int sz = db_column_int(&q,3);
const char *zSrcId = db_column_text(&q,4);
const char *zDate = db_column_text(&q,5);
int gen = db_column_int(&q,6);
nExpanded += db_column_int(&q,7);
nStored += sz;
@ <tr><td align="right">%d(gen)</td>
@ <td align="right">%d(sz)</td>
if( rid==id ){
@ <td align="right"><b>%d(rid)</b></td>
}else{
@ <td align="right">%d(rid)</td>
}
@ <td align="right">%s(zSrcId)</td>
@ <td> %z(href("%R/info/%!S",zUuid))%S(zUuid)</a> </td>
@ <td align="left">%h(zDesc)</td>
@ <td align="left">%z(href("%R/timeline?c=%T",zDate))%s(zDate)</a></td>
@ </tr>
}
@ </tbody></table>
db_finalize(&q);
style_table_sorter();
@ <p>
@ <table border="0" cellspacing="0" cellpadding="0">
@ <tr><td>Bytes of content</td><td> </td>
@ <td align="right">%,lld(nExpanded)</td></tr>
@ <tr><td>Bytes stored in repository</td><td></td>
@ <td align="right">%,lld(nStored)</td>
@ </table>
@ </p>
style_finish_page();
}
/*
** COMMAND: test-unsent
**
** Usage: %fossil test-unsent
**
** Show all artifacts in the unsent table
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
492 493 494 495 496 497 498 |
hyperlink_to_event_tagid(tagid<0?-tagid:tagid);
}else if( (tmFlags & TIMELINE_ARTID)!=0 ){
hyperlink_to_version(zUuid);
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(rid);
if( srcId ){
| | | | 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 |
hyperlink_to_event_tagid(tagid<0?-tagid:tagid);
}else if( (tmFlags & TIMELINE_ARTID)!=0 ){
hyperlink_to_version(zUuid);
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(rid);
if( srcId ){
@ (%z(href("%R/deltachain/%d",rid))%d(rid)←%d(srcId)</a>)
}else{
@ (%z(href("%R/deltachain/%d",rid))%d(rid)</a>)
}
}
}
if( zType[0]!='c' ){
/* Comments for anything other than a check-in are generated by
** "fossil rebuild" and expect to be rendered as text/x-fossil-wiki */
if( zType[0]=='w' ){
|
| ︙ | ︙ | |||
648 649 650 651 652 653 654 |
cgi_printf(" tags: %h", zTagList);
}
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(rid);
if( srcId ){
| | > | > | 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 |
cgi_printf(" tags: %h", zTagList);
}
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(rid);
if( srcId ){
cgi_printf(" id: %z%d←%d</a>",
href("%R/deltachain/%d",rid), rid, srcId);
}else{
cgi_printf(" id: %z%d</a>",
href("%R/deltachain/%d",rid), rid);
}
}
tag_private_status(rid);
if( xExtra ){
xExtra(rid);
}
/* End timelineDetail */
|
| ︙ | ︙ | |||
701 702 703 704 705 706 707 |
int fid = db_column_int(&fchngQuery, 1);
int isDel = fid==0;
const char *zOldName = db_column_text(&fchngQuery, 5);
const char *zOld = db_column_text(&fchngQuery, 4);
const char *zNew = db_column_text(&fchngQuery, 3);
const char *zUnpub = "";
char *zA;
| | > | | > | | 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 |
int fid = db_column_int(&fchngQuery, 1);
int isDel = fid==0;
const char *zOldName = db_column_text(&fchngQuery, 5);
const char *zOld = db_column_text(&fchngQuery, 4);
const char *zNew = db_column_text(&fchngQuery, 3);
const char *zUnpub = "";
char *zA;
char *zId;
if( !inUl ){
@ <ul class="filelist">
inUl = 1;
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(fid);
if( srcId ){
zId = mprintf(" (%z%d←%d</a>) ",
href("%R/deltachain/%d", fid), fid, srcId);
}else{
zId = mprintf(" (%z%d</a>) ",
href("%R/deltachain/%d", fid), fid);
}
}else{
zId = fossil_strdup("");
}
if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
if( !isNew && !isDel && zOldName!=0 ){
@ <li> %h(zOldName) → %h(zFilename)%s(zId)
}
continue;
}
|
| ︙ | ︙ | |||
748 749 750 751 752 753 754 755 756 757 758 759 760 761 |
@ <li>%h(zOldName) → %s(zA)%h(zFilename)%s(zId)</a> %s(zUnpub)
}else{
@ <li>%s(zA)%h(zFilename)</a>%s(zId) %s(zUnpub)
}
@ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a></li>
}
fossil_free(zA);
}
db_reset(&fchngQuery);
if( inUl ){
@ </ul>
}
}
| > | 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 |
@ <li>%h(zOldName) → %s(zA)%h(zFilename)%s(zId)</a> %s(zUnpub)
}else{
@ <li>%s(zA)%h(zFilename)</a>%s(zId) %s(zUnpub)
}
@ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a></li>
}
fossil_free(zA);
fossil_free(zId);
}
db_reset(&fchngQuery);
if( inUl ){
@ </ul>
}
}
|
| ︙ | ︙ |