Fossil SCM

Implement selection of two arbitrary versions of a wiki for comparison (radio-button selects a baseline, anchor sign clears this selection). Also let several sequential edits by the same user be "recycled" into a single row. Effectively this backouts [cef8425cf4a482a3]. See also a [forum:4a67bd1c5d354e75|forum thread]

george 2021-03-23 14:50 trunk merge
Commit 6ebf5c7c9f1b1d1636ea3c95d12ea8a50e0b716dbaba5d98f16af100a5f72699
--- a/src/fossil.page.whistory.js
+++ b/src/fossil.page.whistory.js
@@ -0,0 +1,3 @@
1
+/* This script adds interactivity for wiki-history webpages.
2
+ *
3
+ * Th
--- a/src/fossil.page.whistory.js
+++ b/src/fossil.page.whistory.js
@@ -0,0 +1,3 @@
 
 
 
--- a/src/fossil.page.whistory.js
+++ b/src/fossil.page.whistory.js
@@ -0,0 +1,3 @@
1 /* This script adds interactivity for wiki-history webpages.
2 *
3 * Th
--- src/main.mk
+++ src/main.mk
@@ -229,10 +229,11 @@
229229
$(SRCDIR)/fossil.info-diff.js \
230230
$(SRCDIR)/fossil.numbered-lines.js \
231231
$(SRCDIR)/fossil.page.fileedit.js \
232232
$(SRCDIR)/fossil.page.forumpost.js \
233233
$(SRCDIR)/fossil.page.pikchrshow.js \
234
+ $(SRCDIR)/fossil.page.whistory.js \
234235
$(SRCDIR)/fossil.page.wikiedit.js \
235236
$(SRCDIR)/fossil.pikchr.js \
236237
$(SRCDIR)/fossil.popupwidget.js \
237238
$(SRCDIR)/fossil.storage.js \
238239
$(SRCDIR)/fossil.tabs.js \
239240
--- src/main.mk
+++ src/main.mk
@@ -229,10 +229,11 @@
229 $(SRCDIR)/fossil.info-diff.js \
230 $(SRCDIR)/fossil.numbered-lines.js \
231 $(SRCDIR)/fossil.page.fileedit.js \
232 $(SRCDIR)/fossil.page.forumpost.js \
233 $(SRCDIR)/fossil.page.pikchrshow.js \
 
234 $(SRCDIR)/fossil.page.wikiedit.js \
235 $(SRCDIR)/fossil.pikchr.js \
236 $(SRCDIR)/fossil.popupwidget.js \
237 $(SRCDIR)/fossil.storage.js \
238 $(SRCDIR)/fossil.tabs.js \
239
--- src/main.mk
+++ src/main.mk
@@ -229,10 +229,11 @@
229 $(SRCDIR)/fossil.info-diff.js \
230 $(SRCDIR)/fossil.numbered-lines.js \
231 $(SRCDIR)/fossil.page.fileedit.js \
232 $(SRCDIR)/fossil.page.forumpost.js \
233 $(SRCDIR)/fossil.page.pikchrshow.js \
234 $(SRCDIR)/fossil.page.whistory.js \
235 $(SRCDIR)/fossil.page.wikiedit.js \
236 $(SRCDIR)/fossil.pikchr.js \
237 $(SRCDIR)/fossil.popupwidget.js \
238 $(SRCDIR)/fossil.storage.js \
239 $(SRCDIR)/fossil.tabs.js \
240
+71 -19
--- src/wiki.c
+++ src/wiki.c
@@ -1579,35 +1579,87 @@
15791579
** showid Show RID values
15801580
**
15811581
** Show the complete change history for a single wiki page.
15821582
*/
15831583
void whistory_page(void){
1584
+ Stmt q;
15841585
const char *zPageName;
1585
- Blob sql;
1586
- Stmt q;
1586
+ double rNow;
1587
+ int showRid;
15871588
login_check_credentials();
15881589
if( !g.perm.RdWiki ){ login_needed(g.anon.RdWiki); return; }
15891590
zPageName = PD("name","");
15901591
style_set_current_feature("wiki");
15911592
style_header("History Of %s", zPageName);
1592
- blob_init(&sql, 0, 0);
1593
- blob_append(&sql, timeline_query_for_www(), -1);
1594
- blob_append_sql(&sql,
1595
- "AND event.objid IN ("
1596
- " SELECT tagxref.srcid"
1597
- " FROM tagxref, tag"
1598
- " WHERE tagxref.tagid=tag.tagid"
1599
- " AND tag.tagname='wiki-%q')"
1600
- " ORDER BY mtime DESC",
1601
- zPageName
1593
+ showRid = P("showid")!=0;
1594
+ db_prepare(&q,
1595
+ "SELECT"
1596
+ " event.mtime,"
1597
+ " blob.uuid,"
1598
+ " coalesce(event.euser,event.user),"
1599
+ " event.objid,"
1600
+ " datetime(event.mtime)"
1601
+ " FROM event, blob, tag, tagxref"
1602
+ " WHERE event.type='w' AND blob.rid=event.objid"
1603
+ " AND tag.tagname='wiki-%q'"
1604
+ " AND tagxref.tagid=tag.tagid AND tagxref.srcid=event.objid"
1605
+ " ORDER BY event.mtime DESC",
1606
+ zPageName
16021607
);
1603
- db_prepare(&q, "%s", blob_sql_text(&sql));
1604
- www_print_timeline(&q,
1605
- TIMELINE_DISJOINT|TIMELINE_GRAPH|TIMELINE_REFS,
1606
- 0, 0, 0, 0, 0, 0);
1608
+ @ <h2>History of <a href="%R/wiki?name=%T(zPageName)">%h(zPageName)</a></h2>
1609
+ form_begin( "id='wh-form'", "%R/wdiff" );
1610
+ @ <input id="wh-pid" name="pid" type="radio" hidden />
1611
+ @ <input id="wh-id" name="id" type="hidden" />
1612
+ @ </form>
1613
+ @ <style> .wh-clickable { cursor: pointer; } </style>
1614
+ @ <div class="brlist">
1615
+ @ <table>
1616
+ @ <thead><tr>
1617
+ @ <th>Age</th>
1618
+ @ <th>Hash</th>
1619
+ @ <th><span title="Baseline from which diffs are computed (click to unset)"
1620
+ @ id="wh-cleaner" class="wh-clickable">&#9875;</span></th>
1621
+ @ <th>User<span hidden class="wh-clickable"
1622
+ @ id="wh-collapser">&emsp;&#9842;</span></th>
1623
+ if( showRid ){
1624
+ @ <th>RID</th>
1625
+ }
1626
+ @ <th>&nbsp;</th>
1627
+ @ </tr></thead><tbody>
1628
+ rNow = db_double(0.0, "SELECT julianday('now')");
1629
+ char zAuthor[64]; memset( zAuthor, 0, sizeof(zAuthor) );
1630
+ while( db_step(&q)==SQLITE_ROW ){
1631
+ double rMtime = db_column_double(&q, 0);
1632
+ const char *zUuid = db_column_text(&q, 1);
1633
+ const char *zUser = db_column_text(&q, 2);
1634
+ int wrid = db_column_int(&q, 3);
1635
+ const char *zWhen = db_column_text(&q, 4);
1636
+ /* sqlite3_int64 iMtime = (sqlite3_int64)(rMtime*86400.0); */
1637
+ char *zAge = human_readable_age(rNow - rMtime);
1638
+ if( strncmp( zAuthor, zUser, sizeof(zAuthor) - 1 ) == 0 ) {
1639
+ @ <tr class="wh-intermediate" title="%s(zWhen)">
1640
+ }
1641
+ else {
1642
+ strncpy( zAuthor, zUser, sizeof(zAuthor) - 1 );
1643
+ @ <tr class="wh-major" title="%s(zWhen)">
1644
+ }
1645
+ /* @ <td data-sortkey="%016llx(iMtime)">%s(zAge)</td> */
1646
+ @ <td>%s(zAge)</td>
1647
+ fossil_free(zAge);
1648
+ @ <td>%z(href("%R/info/%s",zUuid))%S(zUuid)</a></td>
1649
+ @ <td><input disabled type="radio" name="baseline" value="%S(zUuid)"/></td>
1650
+ @ <td>%h(zUser)<span class="wh-iterations" hidden /></td>
1651
+ if( showRid ){
1652
+ @ <td>%z(href("%R/artifact/%S",zUuid))%d(wrid)</a></td>
1653
+ }
1654
+ @ <td>%z(chref("wh-difflink","%R/wdiff?id=%S",zUuid))diff</a></td>
1655
+ @ </tr>
1656
+ }
1657
+ @ </tbody></table></div>
16071658
db_finalize(&q);
1608
- blob_reset(&sql);
1659
+ builtin_request_js("fossil.page.whistory.js");
1660
+ /* style_table_sorter(); */
16091661
style_finish_page();
16101662
}
16111663
16121664
/*
16131665
** WEBPAGE: wdiff
@@ -1642,14 +1694,14 @@
16421694
zId = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid1);
16431695
pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
16441696
if( pW1==0 ) fossil_redirect_home();
16451697
blob_init(&w1, pW1->zWiki, -1);
16461698
zPid = P("pid");
1647
- if( zPid==0 && pW1->nParent ){
1699
+ if( ( zPid==0 || zPid[0] == 0 ) && pW1->nParent ){
16481700
zPid = pW1->azParent[0];
16491701
}
1650
- if( zPid ){
1702
+ if( zPid && zPid[0] != 0 ){
16511703
char *zDate;
16521704
rid2 = name_to_typed_rid(zPid, "w");
16531705
pW2 = manifest_get(rid2, CFTYPE_WIKI, 0);
16541706
blob_init(&w2, pW2->zWiki, -1);
16551707
@ <h2>Changes to \
16561708
--- src/wiki.c
+++ src/wiki.c
@@ -1579,35 +1579,87 @@
1579 ** showid Show RID values
1580 **
1581 ** Show the complete change history for a single wiki page.
1582 */
1583 void whistory_page(void){
 
1584 const char *zPageName;
1585 Blob sql;
1586 Stmt q;
1587 login_check_credentials();
1588 if( !g.perm.RdWiki ){ login_needed(g.anon.RdWiki); return; }
1589 zPageName = PD("name","");
1590 style_set_current_feature("wiki");
1591 style_header("History Of %s", zPageName);
1592 blob_init(&sql, 0, 0);
1593 blob_append(&sql, timeline_query_for_www(), -1);
1594 blob_append_sql(&sql,
1595 "AND event.objid IN ("
1596 " SELECT tagxref.srcid"
1597 " FROM tagxref, tag"
1598 " WHERE tagxref.tagid=tag.tagid"
1599 " AND tag.tagname='wiki-%q')"
1600 " ORDER BY mtime DESC",
1601 zPageName
 
 
 
 
1602 );
1603 db_prepare(&q, "%s", blob_sql_text(&sql));
1604 www_print_timeline(&q,
1605 TIMELINE_DISJOINT|TIMELINE_GRAPH|TIMELINE_REFS,
1606 0, 0, 0, 0, 0, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1607 db_finalize(&q);
1608 blob_reset(&sql);
 
1609 style_finish_page();
1610 }
1611
1612 /*
1613 ** WEBPAGE: wdiff
@@ -1642,14 +1694,14 @@
1642 zId = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid1);
1643 pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
1644 if( pW1==0 ) fossil_redirect_home();
1645 blob_init(&w1, pW1->zWiki, -1);
1646 zPid = P("pid");
1647 if( zPid==0 && pW1->nParent ){
1648 zPid = pW1->azParent[0];
1649 }
1650 if( zPid ){
1651 char *zDate;
1652 rid2 = name_to_typed_rid(zPid, "w");
1653 pW2 = manifest_get(rid2, CFTYPE_WIKI, 0);
1654 blob_init(&w2, pW2->zWiki, -1);
1655 @ <h2>Changes to \
1656
--- src/wiki.c
+++ src/wiki.c
@@ -1579,35 +1579,87 @@
1579 ** showid Show RID values
1580 **
1581 ** Show the complete change history for a single wiki page.
1582 */
1583 void whistory_page(void){
1584 Stmt q;
1585 const char *zPageName;
1586 double rNow;
1587 int showRid;
1588 login_check_credentials();
1589 if( !g.perm.RdWiki ){ login_needed(g.anon.RdWiki); return; }
1590 zPageName = PD("name","");
1591 style_set_current_feature("wiki");
1592 style_header("History Of %s", zPageName);
1593 showRid = P("showid")!=0;
1594 db_prepare(&q,
1595 "SELECT"
1596 " event.mtime,"
1597 " blob.uuid,"
1598 " coalesce(event.euser,event.user),"
1599 " event.objid,"
1600 " datetime(event.mtime)"
1601 " FROM event, blob, tag, tagxref"
1602 " WHERE event.type='w' AND blob.rid=event.objid"
1603 " AND tag.tagname='wiki-%q'"
1604 " AND tagxref.tagid=tag.tagid AND tagxref.srcid=event.objid"
1605 " ORDER BY event.mtime DESC",
1606 zPageName
1607 );
1608 @ <h2>History of <a href="%R/wiki?name=%T(zPageName)">%h(zPageName)</a></h2>
1609 form_begin( "id='wh-form'", "%R/wdiff" );
1610 @ <input id="wh-pid" name="pid" type="radio" hidden />
1611 @ <input id="wh-id" name="id" type="hidden" />
1612 @ </form>
1613 @ <style> .wh-clickable { cursor: pointer; } </style>
1614 @ <div class="brlist">
1615 @ <table>
1616 @ <thead><tr>
1617 @ <th>Age</th>
1618 @ <th>Hash</th>
1619 @ <th><span title="Baseline from which diffs are computed (click to unset)"
1620 @ id="wh-cleaner" class="wh-clickable">&#9875;</span></th>
1621 @ <th>User<span hidden class="wh-clickable"
1622 @ id="wh-collapser">&emsp;&#9842;</span></th>
1623 if( showRid ){
1624 @ <th>RID</th>
1625 }
1626 @ <th>&nbsp;</th>
1627 @ </tr></thead><tbody>
1628 rNow = db_double(0.0, "SELECT julianday('now')");
1629 char zAuthor[64]; memset( zAuthor, 0, sizeof(zAuthor) );
1630 while( db_step(&q)==SQLITE_ROW ){
1631 double rMtime = db_column_double(&q, 0);
1632 const char *zUuid = db_column_text(&q, 1);
1633 const char *zUser = db_column_text(&q, 2);
1634 int wrid = db_column_int(&q, 3);
1635 const char *zWhen = db_column_text(&q, 4);
1636 /* sqlite3_int64 iMtime = (sqlite3_int64)(rMtime*86400.0); */
1637 char *zAge = human_readable_age(rNow - rMtime);
1638 if( strncmp( zAuthor, zUser, sizeof(zAuthor) - 1 ) == 0 ) {
1639 @ <tr class="wh-intermediate" title="%s(zWhen)">
1640 }
1641 else {
1642 strncpy( zAuthor, zUser, sizeof(zAuthor) - 1 );
1643 @ <tr class="wh-major" title="%s(zWhen)">
1644 }
1645 /* @ <td data-sortkey="%016llx(iMtime)">%s(zAge)</td> */
1646 @ <td>%s(zAge)</td>
1647 fossil_free(zAge);
1648 @ <td>%z(href("%R/info/%s",zUuid))%S(zUuid)</a></td>
1649 @ <td><input disabled type="radio" name="baseline" value="%S(zUuid)"/></td>
1650 @ <td>%h(zUser)<span class="wh-iterations" hidden /></td>
1651 if( showRid ){
1652 @ <td>%z(href("%R/artifact/%S",zUuid))%d(wrid)</a></td>
1653 }
1654 @ <td>%z(chref("wh-difflink","%R/wdiff?id=%S",zUuid))diff</a></td>
1655 @ </tr>
1656 }
1657 @ </tbody></table></div>
1658 db_finalize(&q);
1659 builtin_request_js("fossil.page.whistory.js");
1660 /* style_table_sorter(); */
1661 style_finish_page();
1662 }
1663
1664 /*
1665 ** WEBPAGE: wdiff
@@ -1642,14 +1694,14 @@
1694 zId = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid1);
1695 pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
1696 if( pW1==0 ) fossil_redirect_home();
1697 blob_init(&w1, pW1->zWiki, -1);
1698 zPid = P("pid");
1699 if( ( zPid==0 || zPid[0] == 0 ) && pW1->nParent ){
1700 zPid = pW1->azParent[0];
1701 }
1702 if( zPid && zPid[0] != 0 ){
1703 char *zDate;
1704 rid2 = name_to_typed_rid(zPid, "w");
1705 pW2 = manifest_get(rid2, CFTYPE_WIKI, 0);
1706 blob_init(&w2, pW2->zWiki, -1);
1707 @ <h2>Changes to \
1708

Keyboard Shortcuts

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