Fossil SCM

Initial 'help' support for WEBPAGE entries. Not yet finished, but seems to work in CLI mode.

stephan 2013-02-20 22:10 UTC trunk
Commit e788795bbfd0db1ca601670e3fae84967c58c8ad
3 files changed +17 -9 +22 -17 +1 -1
+17 -9
--- src/main.c
+++ src/main.c
@@ -933,14 +933,17 @@
933933
**
934934
** List all web pages
935935
*/
936936
void cmd_test_webpage_list(void){
937937
int i, nCmd;
938
- const char *aCmd[count(aWebpage)];
939
- for(i=nCmd=0; i<count(aWebpage); i++){
940
- aCmd[nCmd++] = aWebpage[i].zName;
938
+ const char *aCmd[count(aCommand)];
939
+ for(i=nCmd=0; i<count(aCommand); i++){
940
+ if(0x08 & aCommand[i].cmdFlags){
941
+ aCmd[nCmd++] = aWebpage[i].zName;
942
+ }
941943
}
944
+ assert(nCmd && "page list is empty?");
942945
multi_column_list(aCmd, nCmd);
943946
}
944947
945948
/*
946949
** COMMAND: version
@@ -966,10 +969,11 @@
966969
**
967970
** %fossil help Show common commands
968971
** %fossil help --all Show both common and auxiliary commands
969972
** %fossil help --test Show test commands only
970973
** %fossil help --aux Show auxiliary commands only
974
+** %fossil help --www Show list of WWW pages
971975
*/
972976
void help_cmd(void){
973977
int rc, idx;
974978
const char *z;
975979
if( g.argc<3 ){
@@ -984,30 +988,34 @@
984988
}
985989
if( find_option("all",0,0) ){
986990
command_list(0, CMDFLAG_1ST_TIER | CMDFLAG_2ND_TIER);
987991
return;
988992
}
989
- if( find_option("aux",0,0) ){
993
+ else if( find_option("www",0,0) ){
994
+ command_list(0, CMDFLAG_WEBPAGE);
995
+ return;
996
+ }
997
+ else if( find_option("aux",0,0) ){
990998
command_list(0, CMDFLAG_2ND_TIER);
991999
return;
9921000
}
993
- if( find_option("test",0,0) ){
1001
+ else if( find_option("test",0,0) ){
9941002
command_list(0, CMDFLAG_TEST);
9951003
return;
9961004
}
9971005
rc = name_search(g.argv[2], aCommand, count(aCommand), &idx);
9981006
if( rc==1 ){
9991007
fossil_print("unknown command: %s\nAvailable commands:\n", g.argv[2]);
1000
- command_list(0, 0xff);
1008
+ command_list(0, 0xff & ~CMDFLAG_WEBPAGE);
10011009
fossil_exit(1);
10021010
}else if( rc==2 ){
10031011
fossil_print("ambiguous command prefix: %s\nMatching commands:\n",
10041012
g.argv[2]);
10051013
command_list(g.argv[2], 0xff);
10061014
fossil_exit(1);
10071015
}
1008
- z = aCmdHelp[idx];
1016
+ z = aCmdHelp[idx].zText;
10091017
if( z==0 ){
10101018
fossil_fatal("no help available for the %s command",
10111019
aCommand[idx].zName);
10121020
}
10131021
while( *z ){
@@ -1041,11 +1049,11 @@
10411049
if( rc==1 ){
10421050
@ unknown command: %s(zCmd)
10431051
}else if( rc==2 ){
10441052
@ ambiguous command prefix: %s(zCmd)
10451053
}else{
1046
- z = (char*)aCmdHelp[idx];
1054
+ z = (char*)aCmdHelp[idx].zText;
10471055
if( z==0 ){
10481056
@ no help available for the %s(aCommand[idx].zName) command
10491057
}else{
10501058
z=s=d=mprintf("%s",z);
10511059
while( *s ){
@@ -1104,11 +1112,11 @@
11041112
style_header("Testpage: All Help Text");
11051113
for(i=0; i<count(aCommand); i++){
11061114
if( memcmp(aCommand[i].zName, "test", 4)==0 ) continue;
11071115
@ <h2>%s(aCommand[i].zName):</h2>
11081116
@ <blockquote><pre>
1109
- @ %h(aCmdHelp[i])
1117
+ @ %h(aCmdHelp[i].zText)
11101118
@ </pre></blockquote>
11111119
}
11121120
style_footer();
11131121
}
11141122
11151123
--- src/main.c
+++ src/main.c
@@ -933,14 +933,17 @@
933 **
934 ** List all web pages
935 */
936 void cmd_test_webpage_list(void){
937 int i, nCmd;
938 const char *aCmd[count(aWebpage)];
939 for(i=nCmd=0; i<count(aWebpage); i++){
940 aCmd[nCmd++] = aWebpage[i].zName;
 
 
941 }
 
942 multi_column_list(aCmd, nCmd);
943 }
944
945 /*
946 ** COMMAND: version
@@ -966,10 +969,11 @@
966 **
967 ** %fossil help Show common commands
968 ** %fossil help --all Show both common and auxiliary commands
969 ** %fossil help --test Show test commands only
970 ** %fossil help --aux Show auxiliary commands only
 
971 */
972 void help_cmd(void){
973 int rc, idx;
974 const char *z;
975 if( g.argc<3 ){
@@ -984,30 +988,34 @@
984 }
985 if( find_option("all",0,0) ){
986 command_list(0, CMDFLAG_1ST_TIER | CMDFLAG_2ND_TIER);
987 return;
988 }
989 if( find_option("aux",0,0) ){
 
 
 
 
990 command_list(0, CMDFLAG_2ND_TIER);
991 return;
992 }
993 if( find_option("test",0,0) ){
994 command_list(0, CMDFLAG_TEST);
995 return;
996 }
997 rc = name_search(g.argv[2], aCommand, count(aCommand), &idx);
998 if( rc==1 ){
999 fossil_print("unknown command: %s\nAvailable commands:\n", g.argv[2]);
1000 command_list(0, 0xff);
1001 fossil_exit(1);
1002 }else if( rc==2 ){
1003 fossil_print("ambiguous command prefix: %s\nMatching commands:\n",
1004 g.argv[2]);
1005 command_list(g.argv[2], 0xff);
1006 fossil_exit(1);
1007 }
1008 z = aCmdHelp[idx];
1009 if( z==0 ){
1010 fossil_fatal("no help available for the %s command",
1011 aCommand[idx].zName);
1012 }
1013 while( *z ){
@@ -1041,11 +1049,11 @@
1041 if( rc==1 ){
1042 @ unknown command: %s(zCmd)
1043 }else if( rc==2 ){
1044 @ ambiguous command prefix: %s(zCmd)
1045 }else{
1046 z = (char*)aCmdHelp[idx];
1047 if( z==0 ){
1048 @ no help available for the %s(aCommand[idx].zName) command
1049 }else{
1050 z=s=d=mprintf("%s",z);
1051 while( *s ){
@@ -1104,11 +1112,11 @@
1104 style_header("Testpage: All Help Text");
1105 for(i=0; i<count(aCommand); i++){
1106 if( memcmp(aCommand[i].zName, "test", 4)==0 ) continue;
1107 @ <h2>%s(aCommand[i].zName):</h2>
1108 @ <blockquote><pre>
1109 @ %h(aCmdHelp[i])
1110 @ </pre></blockquote>
1111 }
1112 style_footer();
1113 }
1114
1115
--- src/main.c
+++ src/main.c
@@ -933,14 +933,17 @@
933 **
934 ** List all web pages
935 */
936 void cmd_test_webpage_list(void){
937 int i, nCmd;
938 const char *aCmd[count(aCommand)];
939 for(i=nCmd=0; i<count(aCommand); i++){
940 if(0x08 & aCommand[i].cmdFlags){
941 aCmd[nCmd++] = aWebpage[i].zName;
942 }
943 }
944 assert(nCmd && "page list is empty?");
945 multi_column_list(aCmd, nCmd);
946 }
947
948 /*
949 ** COMMAND: version
@@ -966,10 +969,11 @@
969 **
970 ** %fossil help Show common commands
971 ** %fossil help --all Show both common and auxiliary commands
972 ** %fossil help --test Show test commands only
973 ** %fossil help --aux Show auxiliary commands only
974 ** %fossil help --www Show list of WWW pages
975 */
976 void help_cmd(void){
977 int rc, idx;
978 const char *z;
979 if( g.argc<3 ){
@@ -984,30 +988,34 @@
988 }
989 if( find_option("all",0,0) ){
990 command_list(0, CMDFLAG_1ST_TIER | CMDFLAG_2ND_TIER);
991 return;
992 }
993 else if( find_option("www",0,0) ){
994 command_list(0, CMDFLAG_WEBPAGE);
995 return;
996 }
997 else if( find_option("aux",0,0) ){
998 command_list(0, CMDFLAG_2ND_TIER);
999 return;
1000 }
1001 else if( find_option("test",0,0) ){
1002 command_list(0, CMDFLAG_TEST);
1003 return;
1004 }
1005 rc = name_search(g.argv[2], aCommand, count(aCommand), &idx);
1006 if( rc==1 ){
1007 fossil_print("unknown command: %s\nAvailable commands:\n", g.argv[2]);
1008 command_list(0, 0xff & ~CMDFLAG_WEBPAGE);
1009 fossil_exit(1);
1010 }else if( rc==2 ){
1011 fossil_print("ambiguous command prefix: %s\nMatching commands:\n",
1012 g.argv[2]);
1013 command_list(g.argv[2], 0xff);
1014 fossil_exit(1);
1015 }
1016 z = aCmdHelp[idx].zText;
1017 if( z==0 ){
1018 fossil_fatal("no help available for the %s command",
1019 aCommand[idx].zName);
1020 }
1021 while( *z ){
@@ -1041,11 +1049,11 @@
1049 if( rc==1 ){
1050 @ unknown command: %s(zCmd)
1051 }else if( rc==2 ){
1052 @ ambiguous command prefix: %s(zCmd)
1053 }else{
1054 z = (char*)aCmdHelp[idx].zText;
1055 if( z==0 ){
1056 @ no help available for the %s(aCommand[idx].zName) command
1057 }else{
1058 z=s=d=mprintf("%s",z);
1059 while( *s ){
@@ -1104,11 +1112,11 @@
1112 style_header("Testpage: All Help Text");
1113 for(i=0; i<count(aCommand); i++){
1114 if( memcmp(aCommand[i].zName, "test", 4)==0 ) continue;
1115 @ <h2>%s(aCommand[i].zName):</h2>
1116 @ <blockquote><pre>
1117 @ %h(aCmdHelp[i].zText)
1118 @ </pre></blockquote>
1119 }
1120 style_footer();
1121 }
1122
1123
+22 -17
--- src/mkindex.c
+++ src/mkindex.c
@@ -174,10 +174,11 @@
174174
if( strncmp(zLine, "**", 2)==0
175175
&& isspace(zLine[2])
176176
&& strlen(zLine)<sizeof(zHelp)-nHelp-1
177177
&& nUsed>nFixed
178178
&& memcmp(zLine,"** COMMAND:",11)!=0
179
+ && memcmp(zLine,"** WEBPAGE:",11)!=0
179180
){
180181
if( zLine[2]=='\n' ){
181182
zHelp[nHelp++] = '\n';
182183
}else{
183184
if( strncmp(&zLine[3], "Usage: ", 6)==0 ) nHelp = 0;
@@ -242,11 +243,10 @@
242243
/*
243244
** Build the binary search table.
244245
*/
245246
void build_table(void){
246247
int i;
247
- int nType0;
248248
249249
qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare);
250250
for(i=0; i<nFixed; i++){
251251
if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
252252
printf("extern void %s(void);\n", aEntry[i].zFunc);
@@ -260,10 +260,11 @@
260260
" char cmdFlags;\n"
261261
"};\n"
262262
"#define CMDFLAG_1ST_TIER 0x01\n"
263263
"#define CMDFLAG_2ND_TIER 0x02\n"
264264
"#define CMDFLAG_TEST 0x04\n"
265
+ "#define CMDFLAG_WEBPAGE 0x08\n"
265266
"static const NameMap aWebpage[] = {\n"
266267
);
267268
for(i=0; i<nFixed && aEntry[i].eType==0; i++){
268269
const char *z = aEntry[i].zPath;
269270
int n = strlen(z);
@@ -275,36 +276,38 @@
275276
(int)(35-strlen(aEntry[i].zFunc)), ""
276277
);
277278
if( aEntry[i].zIf ) printf("#endif\n");
278279
}
279280
printf("};\n");
280
- nType0 = i;
281281
printf(
282282
"static const NameMap aCommand[] = {\n"
283283
);
284
- for(i=nType0; i<nFixed && aEntry[i].eType==1; i++){
284
+ for(i=0; i<nFixed /*&& aEntry[i].eType==1*/; i++){
285285
const char *z = aEntry[i].zPath;
286286
int n = strlen(z);
287
- int cmdFlags = 0x01;
288
- if( z[n-1]=='*' ){
289
- n--;
290
- cmdFlags = 0x02;
291
- }else if( memcmp(z, "test-", 5)==0 ){
292
- cmdFlags = 0x04;
287
+ int cmdFlags = (1==aEntry[i].eType) ? 0x01 : 0x08;
288
+ if(0x01==cmdFlags){
289
+ if( z[n-1]=='*' ){
290
+ n--;
291
+ cmdFlags = 0x02;
292
+ }else if( memcmp(z, "test-", 5)==0 ){
293
+ cmdFlags = 0x04;
294
+ }
293295
}
294296
if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
295
- printf(" { \"%.*s\",%*s %s,%*s %d },\n",
297
+ printf(" { \"%s%.*s\",%*s %s,%*s %d },\n",
298
+ (0x08 & cmdFlags) ? "/" : "",
296299
n, z,
297300
25-n, "",
298301
aEntry[i].zFunc,
299302
(int)(35-strlen(aEntry[i].zFunc)), "",
300303
cmdFlags
301304
);
302305
if( aEntry[i].zIf ) printf("#endif\n");
303306
}
304307
printf("};\n");
305
- for(i=nType0; i<nFixed; i++){
308
+ for(i=0; i<nFixed; i++){
306309
char *z = aEntry[i].zHelp;
307310
if( z && z[0] ){
308311
if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
309312
printf("static const char zHelp_%s[] = \n", aEntry[i].zFunc);
310313
printf(" \"");
@@ -321,19 +324,21 @@
321324
printf("\";\n");
322325
if( aEntry[i].zIf ) printf("#endif\n");
323326
aEntry[i].zHelp[0] = 0;
324327
}
325328
}
326
- printf(
327
- "static const char * const aCmdHelp[] = {\n"
328
- );
329
- for(i=nType0; i<nFixed; i++){
329
+ puts("struct CmdHelp {"
330
+ "int eType; "
331
+ "char const * zText;"
332
+ "};");
333
+ puts("static struct CmdHelp aCmdHelp[] = {");
334
+ for(i=0; i<nFixed; i++){
330335
if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
331336
if( aEntry[i].zHelp==0 ){
332
- printf(" 0,\n");
337
+ printf("{%d, 0},\n", aEntry[i].eType);
333338
}else{
334
- printf(" zHelp_%s,\n", aEntry[i].zFunc);
339
+ printf("{%d, zHelp_%s},\n", aEntry[i].eType, aEntry[i].zFunc);
335340
}
336341
if( aEntry[i].zIf ) printf("#endif\n");
337342
}
338343
printf("};\n");
339344
}
340345
--- src/mkindex.c
+++ src/mkindex.c
@@ -174,10 +174,11 @@
174 if( strncmp(zLine, "**", 2)==0
175 && isspace(zLine[2])
176 && strlen(zLine)<sizeof(zHelp)-nHelp-1
177 && nUsed>nFixed
178 && memcmp(zLine,"** COMMAND:",11)!=0
 
179 ){
180 if( zLine[2]=='\n' ){
181 zHelp[nHelp++] = '\n';
182 }else{
183 if( strncmp(&zLine[3], "Usage: ", 6)==0 ) nHelp = 0;
@@ -242,11 +243,10 @@
242 /*
243 ** Build the binary search table.
244 */
245 void build_table(void){
246 int i;
247 int nType0;
248
249 qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare);
250 for(i=0; i<nFixed; i++){
251 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
252 printf("extern void %s(void);\n", aEntry[i].zFunc);
@@ -260,10 +260,11 @@
260 " char cmdFlags;\n"
261 "};\n"
262 "#define CMDFLAG_1ST_TIER 0x01\n"
263 "#define CMDFLAG_2ND_TIER 0x02\n"
264 "#define CMDFLAG_TEST 0x04\n"
 
265 "static const NameMap aWebpage[] = {\n"
266 );
267 for(i=0; i<nFixed && aEntry[i].eType==0; i++){
268 const char *z = aEntry[i].zPath;
269 int n = strlen(z);
@@ -275,36 +276,38 @@
275 (int)(35-strlen(aEntry[i].zFunc)), ""
276 );
277 if( aEntry[i].zIf ) printf("#endif\n");
278 }
279 printf("};\n");
280 nType0 = i;
281 printf(
282 "static const NameMap aCommand[] = {\n"
283 );
284 for(i=nType0; i<nFixed && aEntry[i].eType==1; i++){
285 const char *z = aEntry[i].zPath;
286 int n = strlen(z);
287 int cmdFlags = 0x01;
288 if( z[n-1]=='*' ){
289 n--;
290 cmdFlags = 0x02;
291 }else if( memcmp(z, "test-", 5)==0 ){
292 cmdFlags = 0x04;
 
 
293 }
294 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
295 printf(" { \"%.*s\",%*s %s,%*s %d },\n",
 
296 n, z,
297 25-n, "",
298 aEntry[i].zFunc,
299 (int)(35-strlen(aEntry[i].zFunc)), "",
300 cmdFlags
301 );
302 if( aEntry[i].zIf ) printf("#endif\n");
303 }
304 printf("};\n");
305 for(i=nType0; i<nFixed; i++){
306 char *z = aEntry[i].zHelp;
307 if( z && z[0] ){
308 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
309 printf("static const char zHelp_%s[] = \n", aEntry[i].zFunc);
310 printf(" \"");
@@ -321,19 +324,21 @@
321 printf("\";\n");
322 if( aEntry[i].zIf ) printf("#endif\n");
323 aEntry[i].zHelp[0] = 0;
324 }
325 }
326 printf(
327 "static const char * const aCmdHelp[] = {\n"
328 );
329 for(i=nType0; i<nFixed; i++){
 
 
330 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
331 if( aEntry[i].zHelp==0 ){
332 printf(" 0,\n");
333 }else{
334 printf(" zHelp_%s,\n", aEntry[i].zFunc);
335 }
336 if( aEntry[i].zIf ) printf("#endif\n");
337 }
338 printf("};\n");
339 }
340
--- src/mkindex.c
+++ src/mkindex.c
@@ -174,10 +174,11 @@
174 if( strncmp(zLine, "**", 2)==0
175 && isspace(zLine[2])
176 && strlen(zLine)<sizeof(zHelp)-nHelp-1
177 && nUsed>nFixed
178 && memcmp(zLine,"** COMMAND:",11)!=0
179 && memcmp(zLine,"** WEBPAGE:",11)!=0
180 ){
181 if( zLine[2]=='\n' ){
182 zHelp[nHelp++] = '\n';
183 }else{
184 if( strncmp(&zLine[3], "Usage: ", 6)==0 ) nHelp = 0;
@@ -242,11 +243,10 @@
243 /*
244 ** Build the binary search table.
245 */
246 void build_table(void){
247 int i;
 
248
249 qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare);
250 for(i=0; i<nFixed; i++){
251 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
252 printf("extern void %s(void);\n", aEntry[i].zFunc);
@@ -260,10 +260,11 @@
260 " char cmdFlags;\n"
261 "};\n"
262 "#define CMDFLAG_1ST_TIER 0x01\n"
263 "#define CMDFLAG_2ND_TIER 0x02\n"
264 "#define CMDFLAG_TEST 0x04\n"
265 "#define CMDFLAG_WEBPAGE 0x08\n"
266 "static const NameMap aWebpage[] = {\n"
267 );
268 for(i=0; i<nFixed && aEntry[i].eType==0; i++){
269 const char *z = aEntry[i].zPath;
270 int n = strlen(z);
@@ -275,36 +276,38 @@
276 (int)(35-strlen(aEntry[i].zFunc)), ""
277 );
278 if( aEntry[i].zIf ) printf("#endif\n");
279 }
280 printf("};\n");
 
281 printf(
282 "static const NameMap aCommand[] = {\n"
283 );
284 for(i=0; i<nFixed /*&& aEntry[i].eType==1*/; i++){
285 const char *z = aEntry[i].zPath;
286 int n = strlen(z);
287 int cmdFlags = (1==aEntry[i].eType) ? 0x01 : 0x08;
288 if(0x01==cmdFlags){
289 if( z[n-1]=='*' ){
290 n--;
291 cmdFlags = 0x02;
292 }else if( memcmp(z, "test-", 5)==0 ){
293 cmdFlags = 0x04;
294 }
295 }
296 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
297 printf(" { \"%s%.*s\",%*s %s,%*s %d },\n",
298 (0x08 & cmdFlags) ? "/" : "",
299 n, z,
300 25-n, "",
301 aEntry[i].zFunc,
302 (int)(35-strlen(aEntry[i].zFunc)), "",
303 cmdFlags
304 );
305 if( aEntry[i].zIf ) printf("#endif\n");
306 }
307 printf("};\n");
308 for(i=0; i<nFixed; i++){
309 char *z = aEntry[i].zHelp;
310 if( z && z[0] ){
311 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
312 printf("static const char zHelp_%s[] = \n", aEntry[i].zFunc);
313 printf(" \"");
@@ -321,19 +324,21 @@
324 printf("\";\n");
325 if( aEntry[i].zIf ) printf("#endif\n");
326 aEntry[i].zHelp[0] = 0;
327 }
328 }
329 puts("struct CmdHelp {"
330 "int eType; "
331 "char const * zText;"
332 "};");
333 puts("static struct CmdHelp aCmdHelp[] = {");
334 for(i=0; i<nFixed; i++){
335 if( aEntry[i].zIf ) printf("%s", aEntry[i].zIf);
336 if( aEntry[i].zHelp==0 ){
337 printf("{%d, 0},\n", aEntry[i].eType);
338 }else{
339 printf("{%d, zHelp_%s},\n", aEntry[i].eType, aEntry[i].zFunc);
340 }
341 if( aEntry[i].zIf ) printf("#endif\n");
342 }
343 printf("};\n");
344 }
345
+1 -1
--- src/rss.c
+++ src/rss.c
@@ -22,11 +22,11 @@
2222
#include "rss.h"
2323
#include <assert.h>
2424
2525
/*
2626
** WEBPAGE: timeline.rss
27
-** URL: /timeline.rss/y=TYPE&n=LIMIT&tkt=UUID&tag=TAG&wiki=NAME&name=FILENAME
27
+** URL: /timeline.rss?y=TYPE&n=LIMIT&tkt=UUID&tag=TAG&wiki=NAME&name=FILENAME
2828
**
2929
** Produce an RSS feed of the timeline.
3030
**
3131
** TYPE may be: all, ci (show checkins only), t (show tickets only),
3232
** w (show wiki only). LIMIT is the number of items to show.
3333
--- src/rss.c
+++ src/rss.c
@@ -22,11 +22,11 @@
22 #include "rss.h"
23 #include <assert.h>
24
25 /*
26 ** WEBPAGE: timeline.rss
27 ** URL: /timeline.rss/y=TYPE&n=LIMIT&tkt=UUID&tag=TAG&wiki=NAME&name=FILENAME
28 **
29 ** Produce an RSS feed of the timeline.
30 **
31 ** TYPE may be: all, ci (show checkins only), t (show tickets only),
32 ** w (show wiki only). LIMIT is the number of items to show.
33
--- src/rss.c
+++ src/rss.c
@@ -22,11 +22,11 @@
22 #include "rss.h"
23 #include <assert.h>
24
25 /*
26 ** WEBPAGE: timeline.rss
27 ** URL: /timeline.rss?y=TYPE&n=LIMIT&tkt=UUID&tag=TAG&wiki=NAME&name=FILENAME
28 **
29 ** Produce an RSS feed of the timeline.
30 **
31 ** TYPE may be: all, ci (show checkins only), t (show tickets only),
32 ** w (show wiki only). LIMIT is the number of items to show.
33

Keyboard Shortcuts

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