Fossil SCM

Improvements to the /wdiff page.

drh 2018-12-12 01:23 trunk
Commit b695e97d7abf9f40a63580f04759b9ab9393fd50f484e3a57f5503dc5266d6d2
1 file changed +45 -24
+45 -24
--- src/wiki.c
+++ src/wiki.c
@@ -386,12 +386,14 @@
386386
}
387387
}
388388
zMimetype = wiki_filter_mimetypes(zMimetype);
389389
if( !g.isHome ){
390390
if( rid ){
391
- style_submenu_element("Diff", "%R/wdiff?name=%T&a=%d", zPageName, rid);
392391
zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
392
+ if( pWiki && pWiki->nParent ){
393
+ style_submenu_element("Diff", "%R/wdiff?id=%s", zUuid);
394
+ }
393395
style_submenu_element("Details", "%R/info/%s", zUuid);
394396
}
395397
if( (rid && g.anon.WrWiki) || (!rid && g.anon.NewWiki) ){
396398
if( db_get_boolean("wysiwyg-wiki", 0) ){
397399
style_submenu_element("Edit", "%s/wikiedit?name=%T&wysiwyg=1",
@@ -858,11 +860,11 @@
858860
** Function called to output extra text at the end of each line in
859861
** a wiki history listing.
860862
*/
861863
static void wiki_history_extra(int rid){
862864
if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d", rid) ){
863
- @ &nbsp;op: %z(href("%R/wdiff?name=%t&a=%d",zWikiPageName,rid))diff</a>\
865
+ @ &nbsp;op: %z(href("%R/wdiff?rid=%d",rid))diff</a>\
864866
}
865867
}
866868
867869
/*
868870
** WEBPAGE: whistory
@@ -898,45 +900,64 @@
898900
style_footer();
899901
}
900902
901903
/*
902904
** WEBPAGE: wdiff
903
-** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
905
+**
906
+** Show the changes to a wiki page.
907
+**
908
+** Query parameters:
909
+**
910
+** id=HASH Hash prefix for the child version to be diffed.
911
+** rid=INTEGER RecordID for the child version
912
+** pid=HASH Hash prefix for the parent.
904913
**
905
-** Show the difference between two wiki pages.
914
+** The "id" query parameter is required. "pid" is optional. If "pid"
915
+** is omitted, then the diff is against the first parent of the child.
906916
*/
907917
void wdiff_page(void){
908
- int rid1, rid2;
909
- const char *zPageName;
918
+ const char *zId;
919
+ const char *zPid;
910920
Manifest *pW1, *pW2 = 0;
921
+ int rid1, rid2;
911922
Blob w1, w2, d;
912923
u64 diffFlags;
913924
914925
login_check_credentials();
915
- rid1 = atoi(PD("a","0"));
916
- if( !g.perm.Hyperlink ){ login_needed(g.anon.Hyperlink); return; }
917
- if( rid1==0 ) fossil_redirect_home();
918
- rid2 = atoi(PD("b","0"));
919
- zPageName = PD("name","");
920
- style_header("Changes To %s", zPageName);
921
-
922
- if( rid2==0 ){
923
- rid2 = db_int(0,
924
- "SELECT objid FROM event JOIN tagxref ON objid=rid AND tagxref.tagid="
925
- "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
926
- " WHERE event.mtime<(SELECT mtime FROM event WHERE objid=%d)"
927
- " ORDER BY event.mtime DESC LIMIT 1",
928
- zPageName, rid1
929
- );
930
- }
926
+ if( !g.perm.RdWiki ){ login_needed(g.anon.RdWiki); return; }
927
+ zId = P("id");
928
+ if( zId==0 ){
929
+ rid1 = atoi(PD("rid","0"));
930
+ }else{
931
+ rid1 = name_to_typed_rid(zId, "w");
932
+ }
933
+ zId = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid1);
931934
pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
932935
if( pW1==0 ) fossil_redirect_home();
933936
blob_init(&w1, pW1->zWiki, -1);
934
- blob_zero(&w2);
935
- if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI, 0))!=0 ){
937
+ zPid = P("pid");
938
+ if( zPid==0 && pW1->nParent ){
939
+ zPid = pW1->azParent[0];
940
+ }
941
+ if( zPid ){
942
+ rid2 = name_to_typed_rid(zPid, "w");
943
+ pW2 = manifest_get(rid2, CFTYPE_WIKI, 0);
936944
blob_init(&w2, pW2->zWiki, -1);
945
+ char *zDate;
946
+ @ <h2>Changes to \
947
+ @ "%z(href("%R/whistory?name=%s",pW1->zWikiTitle))%h(pW1->zWikiTitle)</a>" \
948
+ zDate = db_text(0, "SELECT datetime(%.16g)",pW2->rDate);
949
+ @ between %z(href("%R/info/%s",zPid))%z(zDate)</a> \
950
+ zDate = db_text(0, "SELECT datetime(%.16g)",pW1->rDate);
951
+ @ and %z(href("%R/info/%s",zId))%z(zDate)</a></h2>
952
+ }else{
953
+ blob_zero(&w2);
954
+ @ <h2>Initial version of \
955
+ @ "%z(href("%R/whistory?name=%s",pW1->zWikiTitle))%h(pW1->zWikiTitle)</a>"\
956
+ @ </h2>
937957
}
958
+ style_header("Changes To %s", pW1->zWikiTitle);
938959
blob_zero(&d);
939960
diffFlags = construct_diff_flags(1);
940961
text_diff(&w2, &w1, &d, 0, diffFlags | DIFF_HTML | DIFF_LINENO);
941962
@ <pre class="udiff">
942963
@ %s(blob_str(&d))
943964
--- src/wiki.c
+++ src/wiki.c
@@ -386,12 +386,14 @@
386 }
387 }
388 zMimetype = wiki_filter_mimetypes(zMimetype);
389 if( !g.isHome ){
390 if( rid ){
391 style_submenu_element("Diff", "%R/wdiff?name=%T&a=%d", zPageName, rid);
392 zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
 
 
 
393 style_submenu_element("Details", "%R/info/%s", zUuid);
394 }
395 if( (rid && g.anon.WrWiki) || (!rid && g.anon.NewWiki) ){
396 if( db_get_boolean("wysiwyg-wiki", 0) ){
397 style_submenu_element("Edit", "%s/wikiedit?name=%T&wysiwyg=1",
@@ -858,11 +860,11 @@
858 ** Function called to output extra text at the end of each line in
859 ** a wiki history listing.
860 */
861 static void wiki_history_extra(int rid){
862 if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d", rid) ){
863 @ &nbsp;op: %z(href("%R/wdiff?name=%t&a=%d",zWikiPageName,rid))diff</a>\
864 }
865 }
866
867 /*
868 ** WEBPAGE: whistory
@@ -898,45 +900,64 @@
898 style_footer();
899 }
900
901 /*
902 ** WEBPAGE: wdiff
903 ** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
 
 
 
 
 
 
 
904 **
905 ** Show the difference between two wiki pages.
 
906 */
907 void wdiff_page(void){
908 int rid1, rid2;
909 const char *zPageName;
910 Manifest *pW1, *pW2 = 0;
 
911 Blob w1, w2, d;
912 u64 diffFlags;
913
914 login_check_credentials();
915 rid1 = atoi(PD("a","0"));
916 if( !g.perm.Hyperlink ){ login_needed(g.anon.Hyperlink); return; }
917 if( rid1==0 ) fossil_redirect_home();
918 rid2 = atoi(PD("b","0"));
919 zPageName = PD("name","");
920 style_header("Changes To %s", zPageName);
921
922 if( rid2==0 ){
923 rid2 = db_int(0,
924 "SELECT objid FROM event JOIN tagxref ON objid=rid AND tagxref.tagid="
925 "(SELECT tagid FROM tag WHERE tagname='wiki-%q')"
926 " WHERE event.mtime<(SELECT mtime FROM event WHERE objid=%d)"
927 " ORDER BY event.mtime DESC LIMIT 1",
928 zPageName, rid1
929 );
930 }
931 pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
932 if( pW1==0 ) fossil_redirect_home();
933 blob_init(&w1, pW1->zWiki, -1);
934 blob_zero(&w2);
935 if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI, 0))!=0 ){
 
 
 
 
 
936 blob_init(&w2, pW2->zWiki, -1);
 
 
 
 
 
 
 
 
 
 
 
 
937 }
 
938 blob_zero(&d);
939 diffFlags = construct_diff_flags(1);
940 text_diff(&w2, &w1, &d, 0, diffFlags | DIFF_HTML | DIFF_LINENO);
941 @ <pre class="udiff">
942 @ %s(blob_str(&d))
943
--- src/wiki.c
+++ src/wiki.c
@@ -386,12 +386,14 @@
386 }
387 }
388 zMimetype = wiki_filter_mimetypes(zMimetype);
389 if( !g.isHome ){
390 if( rid ){
 
391 zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
392 if( pWiki && pWiki->nParent ){
393 style_submenu_element("Diff", "%R/wdiff?id=%s", zUuid);
394 }
395 style_submenu_element("Details", "%R/info/%s", zUuid);
396 }
397 if( (rid && g.anon.WrWiki) || (!rid && g.anon.NewWiki) ){
398 if( db_get_boolean("wysiwyg-wiki", 0) ){
399 style_submenu_element("Edit", "%s/wikiedit?name=%T&wysiwyg=1",
@@ -858,11 +860,11 @@
860 ** Function called to output extra text at the end of each line in
861 ** a wiki history listing.
862 */
863 static void wiki_history_extra(int rid){
864 if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d", rid) ){
865 @ &nbsp;op: %z(href("%R/wdiff?rid=%d",rid))diff</a>\
866 }
867 }
868
869 /*
870 ** WEBPAGE: whistory
@@ -898,45 +900,64 @@
900 style_footer();
901 }
902
903 /*
904 ** WEBPAGE: wdiff
905 **
906 ** Show the changes to a wiki page.
907 **
908 ** Query parameters:
909 **
910 ** id=HASH Hash prefix for the child version to be diffed.
911 ** rid=INTEGER RecordID for the child version
912 ** pid=HASH Hash prefix for the parent.
913 **
914 ** The "id" query parameter is required. "pid" is optional. If "pid"
915 ** is omitted, then the diff is against the first parent of the child.
916 */
917 void wdiff_page(void){
918 const char *zId;
919 const char *zPid;
920 Manifest *pW1, *pW2 = 0;
921 int rid1, rid2;
922 Blob w1, w2, d;
923 u64 diffFlags;
924
925 login_check_credentials();
926 if( !g.perm.RdWiki ){ login_needed(g.anon.RdWiki); return; }
927 zId = P("id");
928 if( zId==0 ){
929 rid1 = atoi(PD("rid","0"));
930 }else{
931 rid1 = name_to_typed_rid(zId, "w");
932 }
933 zId = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid1);
 
 
 
 
 
 
 
 
934 pW1 = manifest_get(rid1, CFTYPE_WIKI, 0);
935 if( pW1==0 ) fossil_redirect_home();
936 blob_init(&w1, pW1->zWiki, -1);
937 zPid = P("pid");
938 if( zPid==0 && pW1->nParent ){
939 zPid = pW1->azParent[0];
940 }
941 if( zPid ){
942 rid2 = name_to_typed_rid(zPid, "w");
943 pW2 = manifest_get(rid2, CFTYPE_WIKI, 0);
944 blob_init(&w2, pW2->zWiki, -1);
945 char *zDate;
946 @ <h2>Changes to \
947 @ "%z(href("%R/whistory?name=%s",pW1->zWikiTitle))%h(pW1->zWikiTitle)</a>" \
948 zDate = db_text(0, "SELECT datetime(%.16g)",pW2->rDate);
949 @ between %z(href("%R/info/%s",zPid))%z(zDate)</a> \
950 zDate = db_text(0, "SELECT datetime(%.16g)",pW1->rDate);
951 @ and %z(href("%R/info/%s",zId))%z(zDate)</a></h2>
952 }else{
953 blob_zero(&w2);
954 @ <h2>Initial version of \
955 @ "%z(href("%R/whistory?name=%s",pW1->zWikiTitle))%h(pW1->zWikiTitle)</a>"\
956 @ </h2>
957 }
958 style_header("Changes To %s", pW1->zWikiTitle);
959 blob_zero(&d);
960 diffFlags = construct_diff_flags(1);
961 text_diff(&w2, &w1, &d, 0, diffFlags | DIFF_HTML | DIFF_LINENO);
962 @ <pre class="udiff">
963 @ %s(blob_str(&d))
964

Keyboard Shortcuts

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