Fossil SCM

Enhancements to the /sitemap page. New configuration options to add optional entries to the /sitemap page.

drh 2018-08-31 10:47 trunk
Commit 6898b3e73040889d57b5ca2917cf302cefc69a023f361fa3a3389d64e7018169
--- src/alerts.c
+++ src/alerts.c
@@ -1519,10 +1519,14 @@
15191519
int eErr = 0;
15201520
char *zErr = 0;
15211521
15221522
if( alert_webpages_disabled() ) return;
15231523
login_check_credentials();
1524
+ if( !g.perm.EmailAlert ){
1525
+ login_needed(g.anon.EmailAlert);
1526
+ return;
1527
+ }
15241528
if( zName==0 && login_is_individual() ){
15251529
zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
15261530
" WHERE suname=%Q", g.zLogin);
15271531
}
15281532
if( zName==0 || !validate16(zName, -1) ){
15291533
--- src/alerts.c
+++ src/alerts.c
@@ -1519,10 +1519,14 @@
1519 int eErr = 0;
1520 char *zErr = 0;
1521
1522 if( alert_webpages_disabled() ) return;
1523 login_check_credentials();
 
 
 
 
1524 if( zName==0 && login_is_individual() ){
1525 zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
1526 " WHERE suname=%Q", g.zLogin);
1527 }
1528 if( zName==0 || !validate16(zName, -1) ){
1529
--- src/alerts.c
+++ src/alerts.c
@@ -1519,10 +1519,14 @@
1519 int eErr = 0;
1520 char *zErr = 0;
1521
1522 if( alert_webpages_disabled() ) return;
1523 login_check_credentials();
1524 if( !g.perm.EmailAlert ){
1525 login_needed(g.anon.EmailAlert);
1526 return;
1527 }
1528 if( zName==0 && login_is_individual() ){
1529 zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
1530 " WHERE suname=%Q", g.zLogin);
1531 }
1532 if( zName==0 || !validate16(zName, -1) ){
1533
--- src/configure.c
+++ src/configure.c
@@ -99,10 +99,14 @@
9999
{ "timeline-max-comment", CONFIGSET_SKIN },
100100
{ "timeline-plaintext", CONFIGSET_SKIN },
101101
{ "adunit", CONFIGSET_SKIN },
102102
{ "adunit-omit-if-admin", CONFIGSET_SKIN },
103103
{ "adunit-omit-if-user", CONFIGSET_SKIN },
104
+ { "sitemap-docidx", CONFIGSET_SKIN },
105
+ { "sitemap-download", CONFIGSET_SKIN },
106
+ { "sitemap-license", CONFIGSET_SKIN },
107
+ { "sitemap-contact", CONFIGSET_SKIN },
104108
105109
#ifdef FOSSIL_ENABLE_TH1_DOCS
106110
{ "th1-docs", CONFIGSET_TH1 },
107111
#endif
108112
#ifdef FOSSIL_ENABLE_TH1_HOOKS
109113
--- src/configure.c
+++ src/configure.c
@@ -99,10 +99,14 @@
99 { "timeline-max-comment", CONFIGSET_SKIN },
100 { "timeline-plaintext", CONFIGSET_SKIN },
101 { "adunit", CONFIGSET_SKIN },
102 { "adunit-omit-if-admin", CONFIGSET_SKIN },
103 { "adunit-omit-if-user", CONFIGSET_SKIN },
 
 
 
 
104
105 #ifdef FOSSIL_ENABLE_TH1_DOCS
106 { "th1-docs", CONFIGSET_TH1 },
107 #endif
108 #ifdef FOSSIL_ENABLE_TH1_HOOKS
109
--- src/configure.c
+++ src/configure.c
@@ -99,10 +99,14 @@
99 { "timeline-max-comment", CONFIGSET_SKIN },
100 { "timeline-plaintext", CONFIGSET_SKIN },
101 { "adunit", CONFIGSET_SKIN },
102 { "adunit-omit-if-admin", CONFIGSET_SKIN },
103 { "adunit-omit-if-user", CONFIGSET_SKIN },
104 { "sitemap-docidx", CONFIGSET_SKIN },
105 { "sitemap-download", CONFIGSET_SKIN },
106 { "sitemap-license", CONFIGSET_SKIN },
107 { "sitemap-contact", CONFIGSET_SKIN },
108
109 #ifdef FOSSIL_ENABLE_TH1_DOCS
110 { "th1-docs", CONFIGSET_TH1 },
111 #endif
112 #ifdef FOSSIL_ENABLE_TH1_HOOKS
113
+18 -16
--- src/login.c
+++ src/login.c
@@ -789,30 +789,32 @@
789789
@ </div>
790790
free(zCaptcha);
791791
}
792792
@ </form>
793793
}
794
- if( login_is_individual() && g.perm.Password ){
795
- if( alert_enabled() ){
794
+ if( login_is_individual() ){
795
+ if( g.perm.EmailAlert && alert_enabled() ){
796796
@ <hr>
797797
@ <p>Configure <a href="%R/alerts">Email Alerts</a>
798798
@ for user <b>%h(g.zLogin)</b></p>
799799
}
800
- @ <hr />
801
- @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
802
- form_begin(0, "%R/login");
803
- @ <table>
804
- @ <tr><td class="form_label">Old Password:</td>
805
- @ <td><input type="password" name="p" size="30" /></td></tr>
806
- @ <tr><td class="form_label">New Password:</td>
807
- @ <td><input type="password" name="n1" size="30" /></td></tr>
808
- @ <tr><td class="form_label">Repeat New Password:</td>
809
- @ <td><input type="password" name="n2" size="30" /></td></tr>
810
- @ <tr><td></td>
811
- @ <td><input type="submit" value="Change Password" /></td></tr>
812
- @ </table>
813
- @ </form>
800
+ if( g.perm.Password ){
801
+ @ <hr>
802
+ @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
803
+ form_begin(0, "%R/login");
804
+ @ <table>
805
+ @ <tr><td class="form_label">Old Password:</td>
806
+ @ <td><input type="password" name="p" size="30" /></td></tr>
807
+ @ <tr><td class="form_label">New Password:</td>
808
+ @ <td><input type="password" name="n1" size="30" /></td></tr>
809
+ @ <tr><td class="form_label">Repeat New Password:</td>
810
+ @ <td><input type="password" name="n2" size="30" /></td></tr>
811
+ @ <tr><td></td>
812
+ @ <td><input type="submit" value="Change Password" /></td></tr>
813
+ @ </table>
814
+ @ </form>
815
+ }
814816
}
815817
style_footer();
816818
}
817819
818820
/*
819821
--- src/login.c
+++ src/login.c
@@ -789,30 +789,32 @@
789 @ </div>
790 free(zCaptcha);
791 }
792 @ </form>
793 }
794 if( login_is_individual() && g.perm.Password ){
795 if( alert_enabled() ){
796 @ <hr>
797 @ <p>Configure <a href="%R/alerts">Email Alerts</a>
798 @ for user <b>%h(g.zLogin)</b></p>
799 }
800 @ <hr />
801 @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
802 form_begin(0, "%R/login");
803 @ <table>
804 @ <tr><td class="form_label">Old Password:</td>
805 @ <td><input type="password" name="p" size="30" /></td></tr>
806 @ <tr><td class="form_label">New Password:</td>
807 @ <td><input type="password" name="n1" size="30" /></td></tr>
808 @ <tr><td class="form_label">Repeat New Password:</td>
809 @ <td><input type="password" name="n2" size="30" /></td></tr>
810 @ <tr><td></td>
811 @ <td><input type="submit" value="Change Password" /></td></tr>
812 @ </table>
813 @ </form>
 
 
814 }
815 style_footer();
816 }
817
818 /*
819
--- src/login.c
+++ src/login.c
@@ -789,30 +789,32 @@
789 @ </div>
790 free(zCaptcha);
791 }
792 @ </form>
793 }
794 if( login_is_individual() ){
795 if( g.perm.EmailAlert && alert_enabled() ){
796 @ <hr>
797 @ <p>Configure <a href="%R/alerts">Email Alerts</a>
798 @ for user <b>%h(g.zLogin)</b></p>
799 }
800 if( g.perm.Password ){
801 @ <hr>
802 @ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
803 form_begin(0, "%R/login");
804 @ <table>
805 @ <tr><td class="form_label">Old Password:</td>
806 @ <td><input type="password" name="p" size="30" /></td></tr>
807 @ <tr><td class="form_label">New Password:</td>
808 @ <td><input type="password" name="n1" size="30" /></td></tr>
809 @ <tr><td class="form_label">Repeat New Password:</td>
810 @ <td><input type="password" name="n2" size="30" /></td></tr>
811 @ <tr><td></td>
812 @ <td><input type="submit" value="Change Password" /></td></tr>
813 @ </table>
814 @ </form>
815 }
816 }
817 style_footer();
818 }
819
820 /*
821
+23
--- src/setup.c
+++ src/setup.c
@@ -886,10 +886,33 @@
886886
@ <p>Note: To avoid a redirect loop or other problems, this entry must
887887
@ begin with "/" and it must specify a valid page. For example,
888888
@ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the
889889
@ leading "/".</p>
890890
@ <p>(Property: "index-page")
891
+ @ <hr>
892
+ @ <p>Extra links to appear on the <a href="%R/sitemap">/sitemap</a> page.
893
+ @ Often these are filled in with links like
894
+ @ "/doc/trunk/doc/<i>filename</i>.md" so that they refer to
895
+ @ embedded documentation, or like "/wiki/<i>pagename</i>" to refer
896
+ @ to wiki pages.
897
+ @ Leave blank to omit.
898
+ @ <p>
899
+ entry_attribute("Documentation Index", 40, "sitemap-docidx", "smdocidx",
900
+ "", 0);
901
+ @ (Property: sitemap-docidx)<br>
902
+ entry_attribute("Download", 40, "sitemap-download", "smdownload",
903
+ "", 0);
904
+ @ (Property: sitemap-download)<br>
905
+ entry_attribute("Copyright", 40, "sitemap-copyright", "smcopyright",
906
+ "", 0);
907
+ @ (Property: sitemap-copyright)<br>
908
+ entry_attribute("Contact", 40, "sitemap-contact", "smcontact",
909
+ "", 0);
910
+ @ (Property: sitemap-contact)
911
+ entry_attribute("Purchase", 40, "sitemap-purchase", "smcontact",
912
+ "", 0);
913
+ @ (Property: sitemap-purchase)
891914
@ <hr />
892915
onoff_attribute("Use HTML as wiki markup language",
893916
"wiki-use-html", "wiki-use-html", 0, 0);
894917
@ <p>Use HTML as the wiki markup language. Wiki links will still be parsed
895918
@ but all other wiki formatting will be ignored. This option is helpful
896919
--- src/setup.c
+++ src/setup.c
@@ -886,10 +886,33 @@
886 @ <p>Note: To avoid a redirect loop or other problems, this entry must
887 @ begin with "/" and it must specify a valid page. For example,
888 @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the
889 @ leading "/".</p>
890 @ <p>(Property: "index-page")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
891 @ <hr />
892 onoff_attribute("Use HTML as wiki markup language",
893 "wiki-use-html", "wiki-use-html", 0, 0);
894 @ <p>Use HTML as the wiki markup language. Wiki links will still be parsed
895 @ but all other wiki formatting will be ignored. This option is helpful
896
--- src/setup.c
+++ src/setup.c
@@ -886,10 +886,33 @@
886 @ <p>Note: To avoid a redirect loop or other problems, this entry must
887 @ begin with "/" and it must specify a valid page. For example,
888 @ "<b>/home</b>" will work but "<b>home</b>" will not, since it omits the
889 @ leading "/".</p>
890 @ <p>(Property: "index-page")
891 @ <hr>
892 @ <p>Extra links to appear on the <a href="%R/sitemap">/sitemap</a> page.
893 @ Often these are filled in with links like
894 @ "/doc/trunk/doc/<i>filename</i>.md" so that they refer to
895 @ embedded documentation, or like "/wiki/<i>pagename</i>" to refer
896 @ to wiki pages.
897 @ Leave blank to omit.
898 @ <p>
899 entry_attribute("Documentation Index", 40, "sitemap-docidx", "smdocidx",
900 "", 0);
901 @ (Property: sitemap-docidx)<br>
902 entry_attribute("Download", 40, "sitemap-download", "smdownload",
903 "", 0);
904 @ (Property: sitemap-download)<br>
905 entry_attribute("Copyright", 40, "sitemap-copyright", "smcopyright",
906 "", 0);
907 @ (Property: sitemap-copyright)<br>
908 entry_attribute("Contact", 40, "sitemap-contact", "smcontact",
909 "", 0);
910 @ (Property: sitemap-contact)
911 entry_attribute("Purchase", 40, "sitemap-purchase", "smcontact",
912 "", 0);
913 @ (Property: sitemap-purchase)
914 @ <hr />
915 onoff_attribute("Use HTML as wiki markup language",
916 "wiki-use-html", "wiki-use-html", 0, 0);
917 @ <p>Use HTML as the wiki markup language. Wiki links will still be parsed
918 @ but all other wiki formatting will be ignored. This option is helpful
919
+85 -32
--- src/sitemap.c
+++ src/sitemap.c
@@ -29,36 +29,57 @@
2929
** That is, this page is designed to hold links that are omitted from
3030
** the main menu due to lack of space.
3131
*/
3232
void sitemap_page(void){
3333
int srchFlags;
34
+ int inSublist = 0;
35
+ int i;
36
+ const struct {
37
+ const char *zTitle;
38
+ const char *zProperty;
39
+ } aExtra[] = {
40
+ { "Documentation", "sitemap-docidx" },
41
+ { "Download", "sitemap-download" },
42
+ { "License", "sitemap-license" },
43
+ { "Contact", "sitemap-contact" },
44
+ };
45
+
3446
login_check_credentials();
3547
srchFlags = search_restrict(SRCH_ALL);
3648
style_header("Site Map");
3749
style_adunit_config(ADUNIT_RIGHT_OK);
38
-#if 0
39
- @ <p>
40
- @ The following links are just a few of the many web-pages available for
41
- @ this Fossil repository:
42
- @ </p>
43
- @
44
-#endif
4550
@ <ul>
4651
@ <li>%z(href("%R/home"))Home Page</a>
52
+ for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
53
+ char *z = db_get(aExtra[i].zProperty,0);
54
+ if( z==0 ) continue;
55
+ if( !inSublist ){
56
+ @ <ul>
57
+ inSublist = 1;
58
+ }
59
+ @ <li>%z(href("%s",z))%s(aExtra[i].zTitle)</li>
60
+ }
4761
if( srchFlags & SRCH_DOC ){
48
- @ <ul>
49
- @ <li>%z(href("%R/docsrch"))Search Project Documentation</a></li>
50
- @ </ul>
62
+ if( !inSublist ){
63
+ @ <ul>
64
+ inSublist = 1;
65
+ }
66
+ @ <li>%z(href("%R/docsrch"))Documentation Search</a></li>
67
+ }
68
+ if( inSublist ){
69
+ @ </ul>
70
+ inSublist = 0;
5171
}
5272
@ </li>
5373
if( g.perm.Read ){
5474
@ <li>%z(href("%R/tree"))File Browser</a></li>
5575
@ <ul>
5676
@ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view,
5777
@ Trunk Check-in</a></li>
5878
@ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li>
5979
@ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li>
80
+ @ <li>%z(href("%R/uvlist"))Unversioned Files</a>
6081
@ </ul>
6182
}
6283
if( g.perm.Read ){
6384
@ <li>%z(href("%R/timeline?n=200"))Project Timeline</a></li>
6485
@ <ul>
@@ -70,32 +91,23 @@
7091
@ </ul>
7192
}
7293
if( g.perm.Read ){
7394
@ <li>%z(href("%R/brlist"))Branches</a></li>
7495
@ <ul>
96
+ @ <li>%z(href("%R/taglist"))Tags</a></li>
7597
@ <li>%z(href("%R/leaves"))Leaf Check-ins</a></li>
76
- @ <li>%z(href("%R/taglist"))List of Tags</a></li>
7798
@ </ul>
7899
@ </li>
79100
}
80
- if( g.perm.RdWiki ){
81
- @ <li>%z(href("%R/wikihelp"))Wiki</a>
82
- @ <ul>
83
- if( srchFlags & SRCH_WIKI ){
84
- @ <li>%z(href("%R/wikisrch"))Wiki Search</a></li>
85
- }
86
- @ <li>%z(href("%R/wcontent"))List of Wiki Pages</a></li>
87
- @ <li>%z(href("%R/timeline?y=w"))Recent activity</a></li>
88
- @ <li>%z(href("%R/wiki_rules"))Wiki Formatting Rules</a></li>
89
- @ <li>%z(href("%R/md_rules"))Markdown Formatting Rules</a></li>
90
- @ <li>%z(href("%R/wiki?name=Sandbox"))Sandbox</a></li>
91
- @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
92
- @ </ul>
93
- @ </li>
101
+ if( srchFlags ){
102
+ @ <li>%z(href("%R/search"))Search</a></li>
94103
}
95104
if( g.perm.RdForum ){
96
- @ <li>%z(href("%R/forum"))Forum</a></li>
105
+ @ <li>%z(href("%R/forum"))Forum</a>
106
+ @ <ul>
107
+ @ <li>%z(href("%R/timeline?y=f"))Recent activity</a></li>
108
+ @ </ul>
97109
}
98110
if( g.perm.RdTkt ){
99111
@ <li>%z(href("%R/reportlist"))Tickets</a>
100112
@ <ul>
101113
if( srchFlags & SRCH_TKT ){
@@ -104,17 +116,56 @@
104116
@ <li>%z(href("%R/timeline?y=t"))Recent activity</a></li>
105117
@ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
106118
@ </ul>
107119
@ </li>
108120
}
109
- if( g.perm.Read ){
110
- @ <li>%z(href("%R/uvlist"))Unversioned Files</a>
121
+ if( g.perm.RdWiki ){
122
+ @ <li>%z(href("%R/wikihelp"))Wiki</a>
123
+ @ <ul>
124
+ if( srchFlags & SRCH_WIKI ){
125
+ @ <li>%z(href("%R/wikisrch"))Wiki Search</a></li>
126
+ }
127
+ @ <li>%z(href("%R/wcontent"))List of Wiki Pages</a></li>
128
+ @ <li>%z(href("%R/timeline?y=w"))Recent activity</a></li>
129
+ @ <li>%z(href("%R/wiki?name=Sandbox"))Sandbox</a></li>
130
+ @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
131
+ @ </ul>
132
+ @ </li>
133
+ }
134
+
135
+ if( !g.zLogin ){
136
+ @ <li>%z(href("%R/login"))Login</a>
137
+ if( login_self_register_available(0) ){
138
+ @ <ul>
139
+ @ <li>%z(href("%R/register"))Create a new account</a></li>
140
+ inSublist = 1;
141
+ }
142
+ }else {
143
+ @ <li>%z(href("%R/logout"))Logout</a>
144
+ if( g.perm.Password ){
145
+ @ <ul>
146
+ @ <li>%z(href("%R/logout"))Change Password</a></li>
147
+ inSublist = 1;
148
+ }
149
+ }
150
+ if( alert_enabled() && g.perm.EmailAlert ){
151
+ if( !inSublist ){
152
+ inSublist = 1;
153
+ @ <ul>
154
+ }
155
+ if( login_is_individual() ){
156
+ @ <li>%z(href("%R/alerts"))Email Alerts</a></li>
157
+ }else{
158
+ @ <li>%z(href("%R/subscribe"))Subscribe to Email Alerts</a></li>
159
+ }
111160
}
112
- if( srchFlags ){
113
- @ <li>%z(href("%R/search"))Full-Text Search</a></li>
161
+ if( inSublist ){
162
+ @ </ul>
163
+ inSublist = 0;
114164
}
115
- @ <li>%z(href("%R/login"))Login/Logout/Change Password</a></li>
165
+ @ </li>
166
+
116167
if( g.perm.Read ){
117168
@ <li>%z(href("%R/stat"))Repository Status</a>
118169
@ <ul>
119170
@ <li>%z(href("%R/hash-collisions"))Collisions on hash prefixes</a></li>
120171
if( g.perm.Admin ){
@@ -124,12 +175,14 @@
124175
@ <li>%z(href("%R/bloblist"))List of Artifacts</a></li>
125176
@ <li>%z(href("%R/timewarps"))List of "Timewarp" Check-ins</a></li>
126177
@ </ul>
127178
@ </li>
128179
}
129
- @ <li>On-line Documentation
180
+ @ <li>Help
130181
@ <ul>
182
+ @ <li>%z(href("%R/wiki_rules"))Wiki Formatting Rules</a></li>
183
+ @ <li>%z(href("%R/md_rules"))Markdown Formatting Rules</a></li>
131184
@ <li>%z(href("%R/help"))List of All Commands and Web Pages</a></li>
132185
@ <li>%z(href("%R/test-all-help"))All "help" text on a single page</a></li>
133186
@ <li>%z(href("%R/mimetype_list"))Filename suffix to mimetype map</a></li>
134187
@ </ul></li>
135188
if( g.perm.Admin ){
136189
--- src/sitemap.c
+++ src/sitemap.c
@@ -29,36 +29,57 @@
29 ** That is, this page is designed to hold links that are omitted from
30 ** the main menu due to lack of space.
31 */
32 void sitemap_page(void){
33 int srchFlags;
 
 
 
 
 
 
 
 
 
 
 
 
34 login_check_credentials();
35 srchFlags = search_restrict(SRCH_ALL);
36 style_header("Site Map");
37 style_adunit_config(ADUNIT_RIGHT_OK);
38 #if 0
39 @ <p>
40 @ The following links are just a few of the many web-pages available for
41 @ this Fossil repository:
42 @ </p>
43 @
44 #endif
45 @ <ul>
46 @ <li>%z(href("%R/home"))Home Page</a>
 
 
 
 
 
 
 
 
 
47 if( srchFlags & SRCH_DOC ){
48 @ <ul>
49 @ <li>%z(href("%R/docsrch"))Search Project Documentation</a></li>
50 @ </ul>
 
 
 
 
 
 
51 }
52 @ </li>
53 if( g.perm.Read ){
54 @ <li>%z(href("%R/tree"))File Browser</a></li>
55 @ <ul>
56 @ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view,
57 @ Trunk Check-in</a></li>
58 @ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li>
59 @ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li>
 
60 @ </ul>
61 }
62 if( g.perm.Read ){
63 @ <li>%z(href("%R/timeline?n=200"))Project Timeline</a></li>
64 @ <ul>
@@ -70,32 +91,23 @@
70 @ </ul>
71 }
72 if( g.perm.Read ){
73 @ <li>%z(href("%R/brlist"))Branches</a></li>
74 @ <ul>
 
75 @ <li>%z(href("%R/leaves"))Leaf Check-ins</a></li>
76 @ <li>%z(href("%R/taglist"))List of Tags</a></li>
77 @ </ul>
78 @ </li>
79 }
80 if( g.perm.RdWiki ){
81 @ <li>%z(href("%R/wikihelp"))Wiki</a>
82 @ <ul>
83 if( srchFlags & SRCH_WIKI ){
84 @ <li>%z(href("%R/wikisrch"))Wiki Search</a></li>
85 }
86 @ <li>%z(href("%R/wcontent"))List of Wiki Pages</a></li>
87 @ <li>%z(href("%R/timeline?y=w"))Recent activity</a></li>
88 @ <li>%z(href("%R/wiki_rules"))Wiki Formatting Rules</a></li>
89 @ <li>%z(href("%R/md_rules"))Markdown Formatting Rules</a></li>
90 @ <li>%z(href("%R/wiki?name=Sandbox"))Sandbox</a></li>
91 @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
92 @ </ul>
93 @ </li>
94 }
95 if( g.perm.RdForum ){
96 @ <li>%z(href("%R/forum"))Forum</a></li>
 
 
 
97 }
98 if( g.perm.RdTkt ){
99 @ <li>%z(href("%R/reportlist"))Tickets</a>
100 @ <ul>
101 if( srchFlags & SRCH_TKT ){
@@ -104,17 +116,56 @@
104 @ <li>%z(href("%R/timeline?y=t"))Recent activity</a></li>
105 @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
106 @ </ul>
107 @ </li>
108 }
109 if( g.perm.Read ){
110 @ <li>%z(href("%R/uvlist"))Unversioned Files</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111 }
112 if( srchFlags ){
113 @ <li>%z(href("%R/search"))Full-Text Search</a></li>
 
114 }
115 @ <li>%z(href("%R/login"))Login/Logout/Change Password</a></li>
 
116 if( g.perm.Read ){
117 @ <li>%z(href("%R/stat"))Repository Status</a>
118 @ <ul>
119 @ <li>%z(href("%R/hash-collisions"))Collisions on hash prefixes</a></li>
120 if( g.perm.Admin ){
@@ -124,12 +175,14 @@
124 @ <li>%z(href("%R/bloblist"))List of Artifacts</a></li>
125 @ <li>%z(href("%R/timewarps"))List of "Timewarp" Check-ins</a></li>
126 @ </ul>
127 @ </li>
128 }
129 @ <li>On-line Documentation
130 @ <ul>
 
 
131 @ <li>%z(href("%R/help"))List of All Commands and Web Pages</a></li>
132 @ <li>%z(href("%R/test-all-help"))All "help" text on a single page</a></li>
133 @ <li>%z(href("%R/mimetype_list"))Filename suffix to mimetype map</a></li>
134 @ </ul></li>
135 if( g.perm.Admin ){
136
--- src/sitemap.c
+++ src/sitemap.c
@@ -29,36 +29,57 @@
29 ** That is, this page is designed to hold links that are omitted from
30 ** the main menu due to lack of space.
31 */
32 void sitemap_page(void){
33 int srchFlags;
34 int inSublist = 0;
35 int i;
36 const struct {
37 const char *zTitle;
38 const char *zProperty;
39 } aExtra[] = {
40 { "Documentation", "sitemap-docidx" },
41 { "Download", "sitemap-download" },
42 { "License", "sitemap-license" },
43 { "Contact", "sitemap-contact" },
44 };
45
46 login_check_credentials();
47 srchFlags = search_restrict(SRCH_ALL);
48 style_header("Site Map");
49 style_adunit_config(ADUNIT_RIGHT_OK);
 
 
 
 
 
 
 
50 @ <ul>
51 @ <li>%z(href("%R/home"))Home Page</a>
52 for(i=0; i<sizeof(aExtra)/sizeof(aExtra[0]); i++){
53 char *z = db_get(aExtra[i].zProperty,0);
54 if( z==0 ) continue;
55 if( !inSublist ){
56 @ <ul>
57 inSublist = 1;
58 }
59 @ <li>%z(href("%s",z))%s(aExtra[i].zTitle)</li>
60 }
61 if( srchFlags & SRCH_DOC ){
62 if( !inSublist ){
63 @ <ul>
64 inSublist = 1;
65 }
66 @ <li>%z(href("%R/docsrch"))Documentation Search</a></li>
67 }
68 if( inSublist ){
69 @ </ul>
70 inSublist = 0;
71 }
72 @ </li>
73 if( g.perm.Read ){
74 @ <li>%z(href("%R/tree"))File Browser</a></li>
75 @ <ul>
76 @ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view,
77 @ Trunk Check-in</a></li>
78 @ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li>
79 @ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li>
80 @ <li>%z(href("%R/uvlist"))Unversioned Files</a>
81 @ </ul>
82 }
83 if( g.perm.Read ){
84 @ <li>%z(href("%R/timeline?n=200"))Project Timeline</a></li>
85 @ <ul>
@@ -70,32 +91,23 @@
91 @ </ul>
92 }
93 if( g.perm.Read ){
94 @ <li>%z(href("%R/brlist"))Branches</a></li>
95 @ <ul>
96 @ <li>%z(href("%R/taglist"))Tags</a></li>
97 @ <li>%z(href("%R/leaves"))Leaf Check-ins</a></li>
 
98 @ </ul>
99 @ </li>
100 }
101 if( srchFlags ){
102 @ <li>%z(href("%R/search"))Search</a></li>
 
 
 
 
 
 
 
 
 
 
 
 
103 }
104 if( g.perm.RdForum ){
105 @ <li>%z(href("%R/forum"))Forum</a>
106 @ <ul>
107 @ <li>%z(href("%R/timeline?y=f"))Recent activity</a></li>
108 @ </ul>
109 }
110 if( g.perm.RdTkt ){
111 @ <li>%z(href("%R/reportlist"))Tickets</a>
112 @ <ul>
113 if( srchFlags & SRCH_TKT ){
@@ -104,17 +116,56 @@
116 @ <li>%z(href("%R/timeline?y=t"))Recent activity</a></li>
117 @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
118 @ </ul>
119 @ </li>
120 }
121 if( g.perm.RdWiki ){
122 @ <li>%z(href("%R/wikihelp"))Wiki</a>
123 @ <ul>
124 if( srchFlags & SRCH_WIKI ){
125 @ <li>%z(href("%R/wikisrch"))Wiki Search</a></li>
126 }
127 @ <li>%z(href("%R/wcontent"))List of Wiki Pages</a></li>
128 @ <li>%z(href("%R/timeline?y=w"))Recent activity</a></li>
129 @ <li>%z(href("%R/wiki?name=Sandbox"))Sandbox</a></li>
130 @ <li>%z(href("%R/attachlist"))List of Attachments</a></li>
131 @ </ul>
132 @ </li>
133 }
134
135 if( !g.zLogin ){
136 @ <li>%z(href("%R/login"))Login</a>
137 if( login_self_register_available(0) ){
138 @ <ul>
139 @ <li>%z(href("%R/register"))Create a new account</a></li>
140 inSublist = 1;
141 }
142 }else {
143 @ <li>%z(href("%R/logout"))Logout</a>
144 if( g.perm.Password ){
145 @ <ul>
146 @ <li>%z(href("%R/logout"))Change Password</a></li>
147 inSublist = 1;
148 }
149 }
150 if( alert_enabled() && g.perm.EmailAlert ){
151 if( !inSublist ){
152 inSublist = 1;
153 @ <ul>
154 }
155 if( login_is_individual() ){
156 @ <li>%z(href("%R/alerts"))Email Alerts</a></li>
157 }else{
158 @ <li>%z(href("%R/subscribe"))Subscribe to Email Alerts</a></li>
159 }
160 }
161 if( inSublist ){
162 @ </ul>
163 inSublist = 0;
164 }
165 @ </li>
166
167 if( g.perm.Read ){
168 @ <li>%z(href("%R/stat"))Repository Status</a>
169 @ <ul>
170 @ <li>%z(href("%R/hash-collisions"))Collisions on hash prefixes</a></li>
171 if( g.perm.Admin ){
@@ -124,12 +175,14 @@
175 @ <li>%z(href("%R/bloblist"))List of Artifacts</a></li>
176 @ <li>%z(href("%R/timewarps"))List of "Timewarp" Check-ins</a></li>
177 @ </ul>
178 @ </li>
179 }
180 @ <li>Help
181 @ <ul>
182 @ <li>%z(href("%R/wiki_rules"))Wiki Formatting Rules</a></li>
183 @ <li>%z(href("%R/md_rules"))Markdown Formatting Rules</a></li>
184 @ <li>%z(href("%R/help"))List of All Commands and Web Pages</a></li>
185 @ <li>%z(href("%R/test-all-help"))All "help" text on a single page</a></li>
186 @ <li>%z(href("%R/mimetype_list"))Filename suffix to mimetype map</a></li>
187 @ </ul></li>
188 if( g.perm.Admin ){
189

Keyboard Shortcuts

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