Fossil SCM
Improvements to the /wdiff page.
Commit
b695e97d7abf9f40a63580f04759b9ab9393fd50f484e3a57f5503dc5266d6d2
Parent
606421edc5892a4…
1 file changed
+45
-24
+45
-24
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -386,12 +386,14 @@ | ||
| 386 | 386 | } |
| 387 | 387 | } |
| 388 | 388 | zMimetype = wiki_filter_mimetypes(zMimetype); |
| 389 | 389 | if( !g.isHome ){ |
| 390 | 390 | if( rid ){ |
| 391 | - style_submenu_element("Diff", "%R/wdiff?name=%T&a=%d", zPageName, rid); | |
| 392 | 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 | + } | |
| 393 | 395 | style_submenu_element("Details", "%R/info/%s", zUuid); |
| 394 | 396 | } |
| 395 | 397 | if( (rid && g.anon.WrWiki) || (!rid && g.anon.NewWiki) ){ |
| 396 | 398 | if( db_get_boolean("wysiwyg-wiki", 0) ){ |
| 397 | 399 | style_submenu_element("Edit", "%s/wikiedit?name=%T&wysiwyg=1", |
| @@ -858,11 +860,11 @@ | ||
| 858 | 860 | ** Function called to output extra text at the end of each line in |
| 859 | 861 | ** a wiki history listing. |
| 860 | 862 | */ |
| 861 | 863 | static void wiki_history_extra(int rid){ |
| 862 | 864 | if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d", rid) ){ |
| 863 | - @ op: %z(href("%R/wdiff?name=%t&a=%d",zWikiPageName,rid))diff</a>\ | |
| 865 | + @ op: %z(href("%R/wdiff?rid=%d",rid))diff</a>\ | |
| 864 | 866 | } |
| 865 | 867 | } |
| 866 | 868 | |
| 867 | 869 | /* |
| 868 | 870 | ** WEBPAGE: whistory |
| @@ -898,45 +900,64 @@ | ||
| 898 | 900 | style_footer(); |
| 899 | 901 | } |
| 900 | 902 | |
| 901 | 903 | /* |
| 902 | 904 | ** 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. | |
| 904 | 913 | ** |
| 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. | |
| 906 | 916 | */ |
| 907 | 917 | void wdiff_page(void){ |
| 908 | - int rid1, rid2; | |
| 909 | - const char *zPageName; | |
| 918 | + const char *zId; | |
| 919 | + const char *zPid; | |
| 910 | 920 | Manifest *pW1, *pW2 = 0; |
| 921 | + int rid1, rid2; | |
| 911 | 922 | Blob w1, w2, d; |
| 912 | 923 | u64 diffFlags; |
| 913 | 924 | |
| 914 | 925 | 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); | |
| 931 | 934 | pW1 = manifest_get(rid1, CFTYPE_WIKI, 0); |
| 932 | 935 | if( pW1==0 ) fossil_redirect_home(); |
| 933 | 936 | 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); | |
| 936 | 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> | |
| 937 | 957 | } |
| 958 | + style_header("Changes To %s", pW1->zWikiTitle); | |
| 938 | 959 | blob_zero(&d); |
| 939 | 960 | diffFlags = construct_diff_flags(1); |
| 940 | 961 | text_diff(&w2, &w1, &d, 0, diffFlags | DIFF_HTML | DIFF_LINENO); |
| 941 | 962 | @ <pre class="udiff"> |
| 942 | 963 | @ %s(blob_str(&d)) |
| 943 | 964 |
| --- 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 | @ 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 | @ 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 |