Fossil SCM

The g.zExtra parameter is now always available as P("name"). This means the /wiki/xyz and /wiki?name=xyz are equivalent URLs.

drh 2007-10-12 22:56 UTC trunk
Commit 677aa71bca93b776afc2f0d9b2e06bb972c1d94d
+7 -1
--- src/cgi.c
+++ src/cgi.c
@@ -306,10 +306,16 @@
306306
cgi_set_status(302, "Moved Temporarily");
307307
free(zLocation);
308308
cgi_reply();
309309
exit(0);
310310
}
311
+void cgi_redirectf(const char *zFormat, ...){
312
+ va_list ap;
313
+ va_start(ap, zFormat);
314
+ cgi_redirect(vmprintf(zFormat, ap));
315
+ va_end(ap);
316
+}
311317
312318
/*
313319
** Information about all query parameters and cookies are stored
314320
** in these variables.
315321
*/
@@ -329,11 +335,11 @@
329335
** is its fully decoded value.
330336
**
331337
** zName and zValue are not copied and must not change or be
332338
** deallocated after this routine returns.
333339
*/
334
-static void cgi_set_parameter_nocopy(const char *zName, const char *zValue){
340
+void cgi_set_parameter_nocopy(const char *zName, const char *zValue){
335341
if( nAllocQP<=nUsedQP ){
336342
nAllocQP = nAllocQP*2 + 10;
337343
aParamQP = realloc( aParamQP, nAllocQP*sizeof(aParamQP[0]) );
338344
if( aParamQP==0 ) exit(1);
339345
}
340346
--- src/cgi.c
+++ src/cgi.c
@@ -306,10 +306,16 @@
306 cgi_set_status(302, "Moved Temporarily");
307 free(zLocation);
308 cgi_reply();
309 exit(0);
310 }
 
 
 
 
 
 
311
312 /*
313 ** Information about all query parameters and cookies are stored
314 ** in these variables.
315 */
@@ -329,11 +335,11 @@
329 ** is its fully decoded value.
330 **
331 ** zName and zValue are not copied and must not change or be
332 ** deallocated after this routine returns.
333 */
334 static void cgi_set_parameter_nocopy(const char *zName, const char *zValue){
335 if( nAllocQP<=nUsedQP ){
336 nAllocQP = nAllocQP*2 + 10;
337 aParamQP = realloc( aParamQP, nAllocQP*sizeof(aParamQP[0]) );
338 if( aParamQP==0 ) exit(1);
339 }
340
--- src/cgi.c
+++ src/cgi.c
@@ -306,10 +306,16 @@
306 cgi_set_status(302, "Moved Temporarily");
307 free(zLocation);
308 cgi_reply();
309 exit(0);
310 }
311 void cgi_redirectf(const char *zFormat, ...){
312 va_list ap;
313 va_start(ap, zFormat);
314 cgi_redirect(vmprintf(zFormat, ap));
315 va_end(ap);
316 }
317
318 /*
319 ** Information about all query parameters and cookies are stored
320 ** in these variables.
321 */
@@ -329,11 +335,11 @@
335 ** is its fully decoded value.
336 **
337 ** zName and zValue are not copied and must not change or be
338 ** deallocated after this routine returns.
339 */
340 void cgi_set_parameter_nocopy(const char *zName, const char *zValue){
341 if( nAllocQP<=nUsedQP ){
342 nAllocQP = nAllocQP*2 + 10;
343 aParamQP = realloc( aParamQP, nAllocQP*sizeof(aParamQP[0]) );
344 if( aParamQP==0 ) exit(1);
345 }
346
+26 -20
--- src/info.c
+++ src/info.c
@@ -289,22 +289,22 @@
289289
}
290290
291291
292292
/*
293293
** WEBPAGE: vinfo
294
+** URL: /vinfo?name=RID|UUID
294295
**
295
-** Return information about a version. The version number is contained
296
-** in g.zExtra.
296
+** Return information about a version.
297297
*/
298298
void vinfo_page(void){
299299
Stmt q;
300300
int rid;
301301
int isLeaf;
302302
303303
login_check_credentials();
304304
if( !g.okHistory ){ login_needed(); return; }
305
- rid = name_to_rid(g.zExtra);
305
+ rid = name_to_rid(PD("name","0"));
306306
if( rid==0 ){
307307
style_header("Version Information Error");
308308
@ No such object: %h(g.argv[2])
309309
style_footer();
310310
return;
@@ -364,11 +364,11 @@
364364
}else if( fid ){
365365
@ <b>Added:</b>
366366
}else{
367367
@ <b>Deleted:</b>
368368
}
369
- @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li>
369
+ @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
370370
}
371371
@ </ul>
372372
compute_leaves(rid);
373373
showDescendents(rid, 2, "Descendents");
374374
showLeaves();
@@ -376,21 +376,21 @@
376376
style_footer();
377377
}
378378
379379
/*
380380
** WEBPAGE: winfo
381
+** URL: /winfo?name=RID
381382
**
382
-** Return information about a wiki page. The version number is contained
383
-** in g.zExtra.
383
+** Return information about a wiki page.
384384
*/
385385
void winfo_page(void){
386386
Stmt q;
387387
int rid;
388388
389389
login_check_credentials();
390390
if( !g.okHistory ){ login_needed(); return; }
391
- rid = name_to_rid(g.zExtra);
391
+ rid = name_to_rid(PD("name","0"));
392392
if( rid==0 ){
393393
style_header("Wiki Page Information Error");
394394
@ No such object: %h(g.argv[2])
395395
style_footer();
396396
return;
@@ -421,11 +421,11 @@
421421
}
422422
@ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
423423
@ <tr><th>Commands:</th>
424424
@ <td>
425425
/* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
426
- @ <a href="%s(g.zBaseURL)/whistory/%t(zName)">history</a>
426
+ @ <a href="%s(g.zBaseURL)/whistory?page=%t(zName)">history</a>
427427
@ | <a href="%s(g.zBaseURL)/fview/%d(rid)">raw-text</a>
428428
@ </td>
429429
@ </tr>
430430
@ </table></p>
431431
}else{
@@ -436,22 +436,24 @@
436436
style_footer();
437437
}
438438
439439
/*
440440
** WEBPAGE: finfo
441
+** URL: /finfo?name=FILENAME
441442
**
442
-** Show the complete change history for a single file. The name
443
-** of the file is in g.zExtra
443
+** Show the complete change history for a single file.
444444
*/
445445
void finfo_page(void){
446446
Stmt q;
447
+ const char *zFilename;
447448
char zPrevDate[20];
448449
login_check_credentials();
449450
if( !g.okHistory ){ login_needed(); return; }
450451
style_header("File History");
451452
452453
zPrevDate[0] = 0;
454
+ zFilename = PD("name","");
453455
db_prepare(&q,
454456
"SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
455457
" coalesce(event.ecomment, event.comment),"
456458
" coalesce(event.euser, event.user),"
457459
" mlink.pid, mlink.fid"
@@ -459,13 +461,13 @@
459461
" WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
460462
" AND a.rid=mlink.mid"
461463
" AND b.rid=mlink.fid"
462464
" AND event.objid=mlink.mid"
463465
" ORDER BY event.mtime DESC",
464
- g.zExtra
466
+ zFilename
465467
);
466
- @ <h2>History of %h(g.zExtra)</h2>
468
+ @ <h2>History of %h(zFilename)</h2>
467469
@ <table cellspacing=0 border=0 cellpadding=0>
468470
while( db_step(&q)==SQLITE_ROW ){
469471
const char *zVers = db_column_text(&q, 0);
470472
const char *zUuid = db_column_text(&q, 1);
471473
const char *zDate = db_column_text(&q, 2);
@@ -489,11 +491,13 @@
489491
@ <td valign="top" align="left">
490492
hyperlink_to_uuid(zVers);
491493
@ %h(zCom) (By: %h(zUser))
492494
@ Id: %s(zUuid)/%d(frid)
493495
@ <a href="%s(g.zBaseURL)/fview/%d(frid)">[view]</a>
494
- @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
496
+ if( fpid ){
497
+ @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
498
+ }
495499
@ </td>
496500
}
497501
db_finalize(&q);
498502
@ </table>
499503
style_footer();
@@ -515,12 +519,13 @@
515519
blob_reset(&out);
516520
}
517521
518522
/*
519523
** WEBPAGE: vdiff
524
+** URL: /vdiff?name=RID
520525
**
521
-** Show all differences for a particular check-in specified by g.zExtra
526
+** Show all differences for a particular check-in.
522527
*/
523528
void vdiff_page(void){
524529
int rid;
525530
Stmt q;
526531
char *zUuid;
@@ -527,11 +532,11 @@
527532
528533
login_check_credentials();
529534
if( !g.okHistory ){ login_needed(); return; }
530535
style_header("Version Diff");
531536
532
- rid = name_to_rid(g.zExtra);
537
+ rid = name_to_rid(PD("name",""));
533538
if( rid==0 ){
534539
cgi_redirect("index");
535540
}
536541
db_prepare(&q,
537542
"SELECT pid, fid, name"
@@ -547,11 +552,11 @@
547552
@ </h2>
548553
while( db_step(&q)==SQLITE_ROW ){
549554
int pid = db_column_int(&q,0);
550555
int fid = db_column_int(&q,1);
551556
const char *zName = db_column_text(&q,2);
552
- @ <p><a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></p>
557
+ @ <p><a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></p>
553558
@ <blockquote><pre>
554559
append_diff(pid, fid);
555560
@ </pre></blockquote>
556561
}
557562
db_finalize(&q);
@@ -596,11 +601,11 @@
596601
const char *zDate = db_column_text(&q, 1);
597602
const char *zFuuid = db_column_text(&q, 2);
598603
const char *zCom = db_column_text(&q, 3);
599604
const char *zUser = db_column_text(&q, 4);
600605
const char *zVers = db_column_text(&q, 5);
601
- @ File <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a>
606
+ @ File <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a>
602607
@ uuid %s(zFuuid) part of check-in
603608
hyperlink_to_uuid(zVers);
604609
@ %s(zCom) by %s(zUser) on %s(zDate).
605610
cnt++;
606611
}
@@ -619,11 +624,12 @@
619624
while( db_step(&q)==SQLITE_ROW ){
620625
const char *zPagename = db_column_text(&q, 0);
621626
const char *zDate = db_column_text(&q, 1);
622627
const char *zUser = db_column_text(&q, 2);
623628
const char *zUuid = db_column_text(&q, 3);
624
- @ Wiki page [<a href="%s(g.zBaseURL)/wiki/%t(zPagename)">%h(zPagename)</a>]
629
+ @ Wiki page
630
+ @ [<a href="%s(g.zBaseURL)/wiki?page=%t(zPagename)">%h(zPagename)</a>]
625631
@ uuid %s(zUuid) by %h(zUser) on %s(zDate)
626632
nWiki++;
627633
cnt++;
628634
}
629635
db_finalize(&q);
@@ -692,20 +698,20 @@
692698
}
693699
694700
/*
695701
** WEBPAGE: info
696702
** WEBPAGE: fview
697
-** URL: /fview/UUID
703
+** URL: /fview?name=UUID
698704
**
699705
** Show the complete content of a file identified by UUID
700706
** as preformatted text.
701707
*/
702708
void fview_page(void){
703709
int rid;
704710
Blob content;
705711
706
- rid = name_to_rid(g.zExtra);
712
+ rid = name_to_rid(PD("name","0"));
707713
login_check_credentials();
708714
if( !g.okHistory ){ login_needed(); return; }
709715
if( g.zPath[0]=='i' ){
710716
if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
711717
" WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
712718
--- src/info.c
+++ src/info.c
@@ -289,22 +289,22 @@
289 }
290
291
292 /*
293 ** WEBPAGE: vinfo
 
294 **
295 ** Return information about a version. The version number is contained
296 ** in g.zExtra.
297 */
298 void vinfo_page(void){
299 Stmt q;
300 int rid;
301 int isLeaf;
302
303 login_check_credentials();
304 if( !g.okHistory ){ login_needed(); return; }
305 rid = name_to_rid(g.zExtra);
306 if( rid==0 ){
307 style_header("Version Information Error");
308 @ No such object: %h(g.argv[2])
309 style_footer();
310 return;
@@ -364,11 +364,11 @@
364 }else if( fid ){
365 @ <b>Added:</b>
366 }else{
367 @ <b>Deleted:</b>
368 }
369 @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li>
370 }
371 @ </ul>
372 compute_leaves(rid);
373 showDescendents(rid, 2, "Descendents");
374 showLeaves();
@@ -376,21 +376,21 @@
376 style_footer();
377 }
378
379 /*
380 ** WEBPAGE: winfo
 
381 **
382 ** Return information about a wiki page. The version number is contained
383 ** in g.zExtra.
384 */
385 void winfo_page(void){
386 Stmt q;
387 int rid;
388
389 login_check_credentials();
390 if( !g.okHistory ){ login_needed(); return; }
391 rid = name_to_rid(g.zExtra);
392 if( rid==0 ){
393 style_header("Wiki Page Information Error");
394 @ No such object: %h(g.argv[2])
395 style_footer();
396 return;
@@ -421,11 +421,11 @@
421 }
422 @ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
423 @ <tr><th>Commands:</th>
424 @ <td>
425 /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
426 @ <a href="%s(g.zBaseURL)/whistory/%t(zName)">history</a>
427 @ | <a href="%s(g.zBaseURL)/fview/%d(rid)">raw-text</a>
428 @ </td>
429 @ </tr>
430 @ </table></p>
431 }else{
@@ -436,22 +436,24 @@
436 style_footer();
437 }
438
439 /*
440 ** WEBPAGE: finfo
 
441 **
442 ** Show the complete change history for a single file. The name
443 ** of the file is in g.zExtra
444 */
445 void finfo_page(void){
446 Stmt q;
 
447 char zPrevDate[20];
448 login_check_credentials();
449 if( !g.okHistory ){ login_needed(); return; }
450 style_header("File History");
451
452 zPrevDate[0] = 0;
 
453 db_prepare(&q,
454 "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
455 " coalesce(event.ecomment, event.comment),"
456 " coalesce(event.euser, event.user),"
457 " mlink.pid, mlink.fid"
@@ -459,13 +461,13 @@
459 " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
460 " AND a.rid=mlink.mid"
461 " AND b.rid=mlink.fid"
462 " AND event.objid=mlink.mid"
463 " ORDER BY event.mtime DESC",
464 g.zExtra
465 );
466 @ <h2>History of %h(g.zExtra)</h2>
467 @ <table cellspacing=0 border=0 cellpadding=0>
468 while( db_step(&q)==SQLITE_ROW ){
469 const char *zVers = db_column_text(&q, 0);
470 const char *zUuid = db_column_text(&q, 1);
471 const char *zDate = db_column_text(&q, 2);
@@ -489,11 +491,13 @@
489 @ <td valign="top" align="left">
490 hyperlink_to_uuid(zVers);
491 @ %h(zCom) (By: %h(zUser))
492 @ Id: %s(zUuid)/%d(frid)
493 @ <a href="%s(g.zBaseURL)/fview/%d(frid)">[view]</a>
494 @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
 
 
495 @ </td>
496 }
497 db_finalize(&q);
498 @ </table>
499 style_footer();
@@ -515,12 +519,13 @@
515 blob_reset(&out);
516 }
517
518 /*
519 ** WEBPAGE: vdiff
 
520 **
521 ** Show all differences for a particular check-in specified by g.zExtra
522 */
523 void vdiff_page(void){
524 int rid;
525 Stmt q;
526 char *zUuid;
@@ -527,11 +532,11 @@
527
528 login_check_credentials();
529 if( !g.okHistory ){ login_needed(); return; }
530 style_header("Version Diff");
531
532 rid = name_to_rid(g.zExtra);
533 if( rid==0 ){
534 cgi_redirect("index");
535 }
536 db_prepare(&q,
537 "SELECT pid, fid, name"
@@ -547,11 +552,11 @@
547 @ </h2>
548 while( db_step(&q)==SQLITE_ROW ){
549 int pid = db_column_int(&q,0);
550 int fid = db_column_int(&q,1);
551 const char *zName = db_column_text(&q,2);
552 @ <p><a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></p>
553 @ <blockquote><pre>
554 append_diff(pid, fid);
555 @ </pre></blockquote>
556 }
557 db_finalize(&q);
@@ -596,11 +601,11 @@
596 const char *zDate = db_column_text(&q, 1);
597 const char *zFuuid = db_column_text(&q, 2);
598 const char *zCom = db_column_text(&q, 3);
599 const char *zUser = db_column_text(&q, 4);
600 const char *zVers = db_column_text(&q, 5);
601 @ File <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a>
602 @ uuid %s(zFuuid) part of check-in
603 hyperlink_to_uuid(zVers);
604 @ %s(zCom) by %s(zUser) on %s(zDate).
605 cnt++;
606 }
@@ -619,11 +624,12 @@
619 while( db_step(&q)==SQLITE_ROW ){
620 const char *zPagename = db_column_text(&q, 0);
621 const char *zDate = db_column_text(&q, 1);
622 const char *zUser = db_column_text(&q, 2);
623 const char *zUuid = db_column_text(&q, 3);
624 @ Wiki page [<a href="%s(g.zBaseURL)/wiki/%t(zPagename)">%h(zPagename)</a>]
 
625 @ uuid %s(zUuid) by %h(zUser) on %s(zDate)
626 nWiki++;
627 cnt++;
628 }
629 db_finalize(&q);
@@ -692,20 +698,20 @@
692 }
693
694 /*
695 ** WEBPAGE: info
696 ** WEBPAGE: fview
697 ** URL: /fview/UUID
698 **
699 ** Show the complete content of a file identified by UUID
700 ** as preformatted text.
701 */
702 void fview_page(void){
703 int rid;
704 Blob content;
705
706 rid = name_to_rid(g.zExtra);
707 login_check_credentials();
708 if( !g.okHistory ){ login_needed(); return; }
709 if( g.zPath[0]=='i' ){
710 if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
711 " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
712
--- src/info.c
+++ src/info.c
@@ -289,22 +289,22 @@
289 }
290
291
292 /*
293 ** WEBPAGE: vinfo
294 ** URL: /vinfo?name=RID|UUID
295 **
296 ** Return information about a version.
 
297 */
298 void vinfo_page(void){
299 Stmt q;
300 int rid;
301 int isLeaf;
302
303 login_check_credentials();
304 if( !g.okHistory ){ login_needed(); return; }
305 rid = name_to_rid(PD("name","0"));
306 if( rid==0 ){
307 style_header("Version Information Error");
308 @ No such object: %h(g.argv[2])
309 style_footer();
310 return;
@@ -364,11 +364,11 @@
364 }else if( fid ){
365 @ <b>Added:</b>
366 }else{
367 @ <b>Deleted:</b>
368 }
369 @ <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></li>
370 }
371 @ </ul>
372 compute_leaves(rid);
373 showDescendents(rid, 2, "Descendents");
374 showLeaves();
@@ -376,21 +376,21 @@
376 style_footer();
377 }
378
379 /*
380 ** WEBPAGE: winfo
381 ** URL: /winfo?name=RID
382 **
383 ** Return information about a wiki page.
 
384 */
385 void winfo_page(void){
386 Stmt q;
387 int rid;
388
389 login_check_credentials();
390 if( !g.okHistory ){ login_needed(); return; }
391 rid = name_to_rid(PD("name","0"));
392 if( rid==0 ){
393 style_header("Wiki Page Information Error");
394 @ No such object: %h(g.argv[2])
395 style_footer();
396 return;
@@ -421,11 +421,11 @@
421 }
422 @ <tr><th>Original&nbsp;User:</th><td>%s(db_column_text(&q, 3))</td></tr>
423 @ <tr><th>Commands:</th>
424 @ <td>
425 /* @ <a href="%s(g.zBaseURL)/wdiff/%d(rid)">diff</a> | */
426 @ <a href="%s(g.zBaseURL)/whistory?page=%t(zName)">history</a>
427 @ | <a href="%s(g.zBaseURL)/fview/%d(rid)">raw-text</a>
428 @ </td>
429 @ </tr>
430 @ </table></p>
431 }else{
@@ -436,22 +436,24 @@
436 style_footer();
437 }
438
439 /*
440 ** WEBPAGE: finfo
441 ** URL: /finfo?name=FILENAME
442 **
443 ** Show the complete change history for a single file.
 
444 */
445 void finfo_page(void){
446 Stmt q;
447 const char *zFilename;
448 char zPrevDate[20];
449 login_check_credentials();
450 if( !g.okHistory ){ login_needed(); return; }
451 style_header("File History");
452
453 zPrevDate[0] = 0;
454 zFilename = PD("name","");
455 db_prepare(&q,
456 "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
457 " coalesce(event.ecomment, event.comment),"
458 " coalesce(event.euser, event.user),"
459 " mlink.pid, mlink.fid"
@@ -459,13 +461,13 @@
461 " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
462 " AND a.rid=mlink.mid"
463 " AND b.rid=mlink.fid"
464 " AND event.objid=mlink.mid"
465 " ORDER BY event.mtime DESC",
466 zFilename
467 );
468 @ <h2>History of %h(zFilename)</h2>
469 @ <table cellspacing=0 border=0 cellpadding=0>
470 while( db_step(&q)==SQLITE_ROW ){
471 const char *zVers = db_column_text(&q, 0);
472 const char *zUuid = db_column_text(&q, 1);
473 const char *zDate = db_column_text(&q, 2);
@@ -489,11 +491,13 @@
491 @ <td valign="top" align="left">
492 hyperlink_to_uuid(zVers);
493 @ %h(zCom) (By: %h(zUser))
494 @ Id: %s(zUuid)/%d(frid)
495 @ <a href="%s(g.zBaseURL)/fview/%d(frid)">[view]</a>
496 if( fpid ){
497 @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
498 }
499 @ </td>
500 }
501 db_finalize(&q);
502 @ </table>
503 style_footer();
@@ -515,12 +519,13 @@
519 blob_reset(&out);
520 }
521
522 /*
523 ** WEBPAGE: vdiff
524 ** URL: /vdiff?name=RID
525 **
526 ** Show all differences for a particular check-in.
527 */
528 void vdiff_page(void){
529 int rid;
530 Stmt q;
531 char *zUuid;
@@ -527,11 +532,11 @@
532
533 login_check_credentials();
534 if( !g.okHistory ){ login_needed(); return; }
535 style_header("Version Diff");
536
537 rid = name_to_rid(PD("name",""));
538 if( rid==0 ){
539 cgi_redirect("index");
540 }
541 db_prepare(&q,
542 "SELECT pid, fid, name"
@@ -547,11 +552,11 @@
552 @ </h2>
553 while( db_step(&q)==SQLITE_ROW ){
554 int pid = db_column_int(&q,0);
555 int fid = db_column_int(&q,1);
556 const char *zName = db_column_text(&q,2);
557 @ <p><a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a></p>
558 @ <blockquote><pre>
559 append_diff(pid, fid);
560 @ </pre></blockquote>
561 }
562 db_finalize(&q);
@@ -596,11 +601,11 @@
601 const char *zDate = db_column_text(&q, 1);
602 const char *zFuuid = db_column_text(&q, 2);
603 const char *zCom = db_column_text(&q, 3);
604 const char *zUser = db_column_text(&q, 4);
605 const char *zVers = db_column_text(&q, 5);
606 @ File <a href="%s(g.zBaseURL)/finfo?name=%T(zName)">%h(zName)</a>
607 @ uuid %s(zFuuid) part of check-in
608 hyperlink_to_uuid(zVers);
609 @ %s(zCom) by %s(zUser) on %s(zDate).
610 cnt++;
611 }
@@ -619,11 +624,12 @@
624 while( db_step(&q)==SQLITE_ROW ){
625 const char *zPagename = db_column_text(&q, 0);
626 const char *zDate = db_column_text(&q, 1);
627 const char *zUser = db_column_text(&q, 2);
628 const char *zUuid = db_column_text(&q, 3);
629 @ Wiki page
630 @ [<a href="%s(g.zBaseURL)/wiki?page=%t(zPagename)">%h(zPagename)</a>]
631 @ uuid %s(zUuid) by %h(zUser) on %s(zDate)
632 nWiki++;
633 cnt++;
634 }
635 db_finalize(&q);
@@ -692,20 +698,20 @@
698 }
699
700 /*
701 ** WEBPAGE: info
702 ** WEBPAGE: fview
703 ** URL: /fview?name=UUID
704 **
705 ** Show the complete content of a file identified by UUID
706 ** as preformatted text.
707 */
708 void fview_page(void){
709 int rid;
710 Blob content;
711
712 rid = name_to_rid(PD("name","0"));
713 login_check_credentials();
714 if( !g.okHistory ){ login_needed(); return; }
715 if( g.zPath[0]=='i' ){
716 if( db_exists("SELECT 1 FROM tagxref JOIN tag USING(tagid)"
717 " WHERE rid=%d AND tagname LIKE 'wiki-%%'", rid) ){
718
+2 -1
--- src/main.c
+++ src/main.c
@@ -448,11 +448,11 @@
448448
}
449449
450450
/*
451451
** Preconditions:
452452
**
453
-** * Environment various are set up according to the CGI standard.
453
+** * Environment variables are set up according to the CGI standard.
454454
** * The respository database has been located and opened.
455455
**
456456
** Process the webpage specified by the PATH_INFO or REQUEST_URI
457457
** environment variable.
458458
*/
@@ -494,10 +494,11 @@
494494
if( g.zExtra ){
495495
/* CGI parameters get this treatment elsewhere, but places like getfile
496496
** will use g.zExtra directly.
497497
*/
498498
dehttpize(g.zExtra);
499
+ cgi_set_parameter_nocopy("name", g.zExtra);
499500
}
500501
501502
/* Prevent robots from indexing this site.
502503
*/
503504
if( strcmp(g.zPath, "robots.txt")==0 ){
504505
--- src/main.c
+++ src/main.c
@@ -448,11 +448,11 @@
448 }
449
450 /*
451 ** Preconditions:
452 **
453 ** * Environment various are set up according to the CGI standard.
454 ** * The respository database has been located and opened.
455 **
456 ** Process the webpage specified by the PATH_INFO or REQUEST_URI
457 ** environment variable.
458 */
@@ -494,10 +494,11 @@
494 if( g.zExtra ){
495 /* CGI parameters get this treatment elsewhere, but places like getfile
496 ** will use g.zExtra directly.
497 */
498 dehttpize(g.zExtra);
 
499 }
500
501 /* Prevent robots from indexing this site.
502 */
503 if( strcmp(g.zPath, "robots.txt")==0 ){
504
--- src/main.c
+++ src/main.c
@@ -448,11 +448,11 @@
448 }
449
450 /*
451 ** Preconditions:
452 **
453 ** * Environment variables are set up according to the CGI standard.
454 ** * The respository database has been located and opened.
455 **
456 ** Process the webpage specified by the PATH_INFO or REQUEST_URI
457 ** environment variable.
458 */
@@ -494,10 +494,11 @@
494 if( g.zExtra ){
495 /* CGI parameters get this treatment elsewhere, but places like getfile
496 ** will use g.zExtra directly.
497 */
498 dehttpize(g.zExtra);
499 cgi_set_parameter_nocopy("name", g.zExtra);
500 }
501
502 /* Prevent robots from indexing this site.
503 */
504 if( strcmp(g.zPath, "robots.txt")==0 ){
505
+1 -2
--- src/style.c
+++ src/style.c
@@ -119,11 +119,11 @@
119119
char *zTail = i<nSubmenu-1 ? " | " : "";
120120
if( p->zLink==0 ){
121121
@ <span class="label">%h(p->zLabel)</span>
122122
@ <span class="tail">%s(zTail)</span>
123123
}else{
124
- @ <a class="label" href="%T(p->zLink)">%h(p->zLabel)</a>
124
+ @ <a class="label" href="%s(p->zLink)">%h(p->zLabel)</a>
125125
@ <span class="tail">%s(zTail)</span>
126126
}
127127
}
128128
@ </div>
129129
}
@@ -239,9 +239,8 @@
239239
*/
240240
void page_test_env(void){
241241
style_header("Environment Test");
242242
@ g.zBaseURL = %h(g.zBaseURL)<br>
243243
@ g.zTop = %h(g.zTop)<br>
244
- @ g.zExtra = %h(g.zExtra)<hr>
245244
cgi_print_all();
246245
style_footer();
247246
}
248247
--- src/style.c
+++ src/style.c
@@ -119,11 +119,11 @@
119 char *zTail = i<nSubmenu-1 ? " | " : "";
120 if( p->zLink==0 ){
121 @ <span class="label">%h(p->zLabel)</span>
122 @ <span class="tail">%s(zTail)</span>
123 }else{
124 @ <a class="label" href="%T(p->zLink)">%h(p->zLabel)</a>
125 @ <span class="tail">%s(zTail)</span>
126 }
127 }
128 @ </div>
129 }
@@ -239,9 +239,8 @@
239 */
240 void page_test_env(void){
241 style_header("Environment Test");
242 @ g.zBaseURL = %h(g.zBaseURL)<br>
243 @ g.zTop = %h(g.zTop)<br>
244 @ g.zExtra = %h(g.zExtra)<hr>
245 cgi_print_all();
246 style_footer();
247 }
248
--- src/style.c
+++ src/style.c
@@ -119,11 +119,11 @@
119 char *zTail = i<nSubmenu-1 ? " | " : "";
120 if( p->zLink==0 ){
121 @ <span class="label">%h(p->zLabel)</span>
122 @ <span class="tail">%s(zTail)</span>
123 }else{
124 @ <a class="label" href="%s(p->zLink)">%h(p->zLabel)</a>
125 @ <span class="tail">%s(zTail)</span>
126 }
127 }
128 @ </div>
129 }
@@ -239,9 +239,8 @@
239 */
240 void page_test_env(void){
241 style_header("Environment Test");
242 @ g.zBaseURL = %h(g.zBaseURL)<br>
243 @ g.zTop = %h(g.zTop)<br>
 
244 cgi_print_all();
245 style_footer();
246 }
247
+30 -54
--- src/wiki.c
+++ src/wiki.c
@@ -79,10 +79,11 @@
7979
void home_page(void){
8080
char *zPageName = db_get("project-name",0);
8181
if( zPageName ){
8282
login_check_credentials();
8383
g.zExtra = zPageName;
84
+ cgi_set_parameter_nocopy("name", g.zExtra);
8485
g.okRdWiki = 1;
8586
g.okApndWiki = 0;
8687
g.okWrWiki = 0;
8788
g.okHistory = 0;
8889
wiki_page();
@@ -98,25 +99,24 @@
9899
style_footer();
99100
}
100101
101102
/*
102103
** WEBPAGE: wiki
103
-** URL: /wiki/PAGENAME
104
+** URL: /wiki?name=PAGENAME
104105
*/
105106
void wiki_page(void){
106107
char *zTag;
107108
int rid;
108109
Blob wiki;
109110
Manifest m;
110
- char *zPageName;
111
+ const char *zPageName;
111112
char *zHtmlPageName;
112113
char *zBody = mprintf("%s","<i>Empty Page</i>");
113114
114115
login_check_credentials();
115116
if( !g.okRdWiki ){ login_needed(); return; }
116
- zPageName = mprintf("%s", g.zExtra);
117
- dehttpize(zPageName);
117
+ zPageName = PD("name","");
118118
if( check_name(zPageName) ) return;
119119
zTag = mprintf("wiki-%s", zPageName);
120120
rid = db_int(0,
121121
"SELECT rid FROM tagxref"
122122
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -133,19 +133,19 @@
133133
zBody = m.zWiki;
134134
}
135135
}
136136
if( (rid && g.okWrWiki) || (!rid && g.okNewWiki) ){
137137
style_submenu_element("Edit", "Edit Wiki Page",
138
- mprintf("%s/wikiedit/%s", g.zTop, g.zExtra));
138
+ mprintf("%s/wikiedit?name=%t", g.zTop, zPageName));
139139
}
140140
if( rid && g.okApndWiki ){
141141
style_submenu_element("Append", "Add A Comment",
142
- mprintf("%s/wikiappend/%s", g.zTop, g.zExtra));
142
+ mprintf("%s/wikiappend?name=%t", g.zTop, zPageName));
143143
}
144144
if( g.okHistory ){
145145
style_submenu_element("History", "History",
146
- mprintf("%s/whistory/%s", g.zTop, g.zExtra));
146
+ mprintf("%s/whistory?name=%t", g.zTop, zPageName));
147147
}
148148
zHtmlPageName = mprintf("%h", zPageName);
149149
style_header(zHtmlPageName);
150150
blob_init(&wiki, zBody, -1);
151151
wiki_convert(&wiki, 0);
@@ -154,29 +154,28 @@
154154
style_footer();
155155
}
156156
157157
/*
158158
** WEBPAGE: wikiedit
159
-** URL: /wikiedit/PAGENAME
159
+** URL: /wikiedit?page=PAGENAME
160160
*/
161161
void wikiedit_page(void){
162162
char *zTag;
163163
int rid;
164164
Blob wiki;
165165
Manifest m;
166
- char *zPageName;
166
+ const char *zPageName;
167167
char *zHtmlPageName;
168168
int n;
169169
const char *z;
170170
char *zBody = (char*)P("w");
171171
172172
if( zBody ){
173173
zBody = mprintf("%s", zBody);
174174
}
175175
login_check_credentials();
176
- zPageName = mprintf("%s", g.zExtra);
177
- dehttpize(zPageName);
176
+ zPageName = PD("name","");
178177
if( check_name(zPageName) ) return;
179178
zTag = mprintf("wiki-%s", zPageName);
180179
rid = db_int(0,
181180
"SELECT rid FROM tagxref"
182181
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -224,14 +223,14 @@
224223
db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
225224
manifest_crosslink(nrid, &wiki);
226225
blob_reset(&wiki);
227226
content_deltify(rid, nrid, 0);
228227
db_end_transaction(0);
229
- cgi_redirect(mprintf("wiki/%s", g.zExtra));
228
+ cgi_redirectf("wiki?name=%t", zPageName);
230229
}
231230
if( P("cancel")!=0 ){
232
- cgi_redirect(mprintf("wiki/%s", g.zExtra));
231
+ cgi_redirectf("wiki?name=%t", zPageName);
233232
return;
234233
}
235234
if( zBody==0 ){
236235
zBody = mprintf("<i>Empty Page</i>");
237236
}
@@ -248,11 +247,12 @@
248247
for(n=2, z=zBody; z[0]; z++){
249248
if( z[0]=='\n' ) n++;
250249
}
251250
if( n<20 ) n = 20;
252251
if( n>200 ) n = 200;
253
- @ <form method="POST" action="%s(g.zBaseURL)/wikiedit/%t(g.zExtra)">
252
+ @ <form method="POST" action="%s(g.zBaseURL)/wikiedit">
253
+ @ <input type="hidden" name="name" value="%t(zPageName)">
254254
@ <textarea name="w" class="wikiedit" cols="80"
255255
@ rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
256256
@ <br>
257257
@ <input type="submit" name="preview" value="Preview Your Changes">
258258
@ <input type="submit" name="submit" value="Apply These Changes">
@@ -281,22 +281,21 @@
281281
blob_appendf(p, " added:\n\n%s", zRemark);
282282
}
283283
284284
/*
285285
** WEBPAGE: wikiappend
286
-** URL: /wikiappend/PAGENAME
286
+** URL: /wikiappend?name=PAGENAME
287287
*/
288288
void wikiappend_page(void){
289289
char *zTag;
290290
int rid;
291
- char *zPageName;
291
+ const char *zPageName;
292292
char *zHtmlPageName;
293293
const char *zUser;
294294
295295
login_check_credentials();
296
- zPageName = mprintf("%s", g.zExtra);
297
- dehttpize(zPageName);
296
+ zPageName = PD("name","");
298297
if( check_name(zPageName) ) return;
299298
zTag = mprintf("wiki-%s", zPageName);
300299
rid = db_int(0,
301300
"SELECT rid FROM tagxref"
302301
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -351,14 +350,14 @@
351350
db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
352351
manifest_crosslink(nrid, &wiki);
353352
blob_reset(&wiki);
354353
content_deltify(rid, nrid, 0);
355354
db_end_transaction(0);
356
- cgi_redirect(mprintf("wiki/%s", g.zExtra));
355
+ cgi_redirectf("wiki?name=%t", zPageName);
357356
}
358357
if( P("cancel")!=0 ){
359
- cgi_redirect(mprintf("wiki/%s", g.zExtra));
358
+ cgi_redirectf("wiki?name=%t", zPageName);
360359
return;
361360
}
362361
zHtmlPageName = mprintf("Append Comment To: %h", zPageName);
363362
style_header(zHtmlPageName);
364363
if( P("preview")!=0 ){
@@ -369,11 +368,12 @@
369368
wiki_convert(&preview, 0);
370369
@ <hr>
371370
blob_reset(&preview);
372371
}
373372
zUser = PD("u", g.zLogin);
374
- @ <form method="POST" action="%s(g.zBaseURL)/wikiappend/%t(g.zExtra)">
373
+ @ <form method="POST" action="%s(g.zBaseURL)/wikiappend">
374
+ @ <input type="hidden" name="name" value="%t(zPageName)">
375375
@ Your Name:
376376
@ <input type="text" name="u" size="20" value="%h(zUser)"><br>
377377
@ Comment to append:<br>
378378
@ <textarea name="r" class="wikiedit" cols="80"
379379
@ rows="10" wrap="virtual">%h(PD("r",""))</textarea>
@@ -385,29 +385,31 @@
385385
style_footer();
386386
}
387387
388388
/*
389389
** WEBPAGE: whistory
390
+** URL: /whistory?name=PAGENAME
390391
**
391
-** Show the complete change history for a single wiki page. The name
392
-** of the wiki is in g.zExtra
392
+** Show the complete change history for a single wiki page.
393393
*/
394394
void whistory_page(void){
395395
Stmt q;
396396
char *zTitle;
397397
char *zSQL;
398
+ const char *zPageName;
398399
login_check_credentials();
399400
if( !g.okHistory ){ login_needed(); return; }
400
- zTitle = mprintf("History Of %h", g.zExtra);
401
+ zPageName = PD("name","");
402
+ zTitle = mprintf("History Of %h", zPageName);
401403
style_header(zTitle);
402404
free(zTitle);
403405
404406
zSQL = mprintf("%s AND event.objid IN "
405407
" (SELECT rid FROM tagxref WHERE tagid="
406408
"(SELECT tagid FROM tag WHERE tagname='wiki-%q'))"
407409
"ORDER BY mtime DESC",
408
- timeline_query_for_www(), g.zExtra);
410
+ timeline_query_for_www(), zPageName);
409411
db_prepare(&q, zSQL);
410412
free(zSQL);
411413
www_print_timeline(&q, 0, 0, 0, 0);
412414
db_finalize(&q);
413415
style_footer();
@@ -428,36 +430,10 @@
428430
"SELECT substr(tagname, 6, 1000) FROM tag WHERE tagname GLOB 'wiki-*'"
429431
" ORDER BY lower(tagname)"
430432
);
431433
while( db_step(&q)==SQLITE_ROW ){
432434
const char *zName = db_column_text(&q, 0);
433
- @ <li><a href="%s(g.zBaseURL)/wiki/%t(zName)">%h(zName)</a></li>
434
- }
435
- db_finalize(&q);
436
- style_footer();
437
-}
438
-
439
-/*
440
-** WEBPAGE: ambiguous
441
-**
442
-** This is the destination for UUID hyperlinks that are ambiguous.
443
-** Show all possible choices for the destination with links to each.
444
-**
445
-** The ambiguous UUID prefix is in g.zExtra
446
-*/
447
-void ambiguous_page(void){
448
- Stmt q;
449
- style_header("Ambiguous UUID");
450
- @ <p>The link <a href="%s(g.zBaseURL)/ambiguous/%T(g.zExtra)">
451
- @ [%h(g.zExtra)]</a> is ambiguous. It might mean any of the following:</p>
452
- @ <ul>
453
- db_prepare(&q, "SELECT uuid, rid FROM blob WHERE uuid>=%Q AND uuid<'%qz'"
454
- " ORDER BY uuid", g.zExtra, g.zExtra);
455
- while( db_step(&q)==SQLITE_ROW ){
456
- const char *zUuid = db_column_text(&q, 0);
457
- int rid = db_column_int(&q, 1);
458
- @ <li> %s(zUuid) - %d(rid)
459
- }
460
- db_finalize(&q);
461
- @ </ul>
435
+ @ <li><a href="%s(g.zBaseURL)/wiki?page=%t(zName)">%h(zName)</a></li>
436
+ }
437
+ db_finalize(&q);
462438
style_footer();
463439
}
464440
--- src/wiki.c
+++ src/wiki.c
@@ -79,10 +79,11 @@
79 void home_page(void){
80 char *zPageName = db_get("project-name",0);
81 if( zPageName ){
82 login_check_credentials();
83 g.zExtra = zPageName;
 
84 g.okRdWiki = 1;
85 g.okApndWiki = 0;
86 g.okWrWiki = 0;
87 g.okHistory = 0;
88 wiki_page();
@@ -98,25 +99,24 @@
98 style_footer();
99 }
100
101 /*
102 ** WEBPAGE: wiki
103 ** URL: /wiki/PAGENAME
104 */
105 void wiki_page(void){
106 char *zTag;
107 int rid;
108 Blob wiki;
109 Manifest m;
110 char *zPageName;
111 char *zHtmlPageName;
112 char *zBody = mprintf("%s","<i>Empty Page</i>");
113
114 login_check_credentials();
115 if( !g.okRdWiki ){ login_needed(); return; }
116 zPageName = mprintf("%s", g.zExtra);
117 dehttpize(zPageName);
118 if( check_name(zPageName) ) return;
119 zTag = mprintf("wiki-%s", zPageName);
120 rid = db_int(0,
121 "SELECT rid FROM tagxref"
122 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -133,19 +133,19 @@
133 zBody = m.zWiki;
134 }
135 }
136 if( (rid && g.okWrWiki) || (!rid && g.okNewWiki) ){
137 style_submenu_element("Edit", "Edit Wiki Page",
138 mprintf("%s/wikiedit/%s", g.zTop, g.zExtra));
139 }
140 if( rid && g.okApndWiki ){
141 style_submenu_element("Append", "Add A Comment",
142 mprintf("%s/wikiappend/%s", g.zTop, g.zExtra));
143 }
144 if( g.okHistory ){
145 style_submenu_element("History", "History",
146 mprintf("%s/whistory/%s", g.zTop, g.zExtra));
147 }
148 zHtmlPageName = mprintf("%h", zPageName);
149 style_header(zHtmlPageName);
150 blob_init(&wiki, zBody, -1);
151 wiki_convert(&wiki, 0);
@@ -154,29 +154,28 @@
154 style_footer();
155 }
156
157 /*
158 ** WEBPAGE: wikiedit
159 ** URL: /wikiedit/PAGENAME
160 */
161 void wikiedit_page(void){
162 char *zTag;
163 int rid;
164 Blob wiki;
165 Manifest m;
166 char *zPageName;
167 char *zHtmlPageName;
168 int n;
169 const char *z;
170 char *zBody = (char*)P("w");
171
172 if( zBody ){
173 zBody = mprintf("%s", zBody);
174 }
175 login_check_credentials();
176 zPageName = mprintf("%s", g.zExtra);
177 dehttpize(zPageName);
178 if( check_name(zPageName) ) return;
179 zTag = mprintf("wiki-%s", zPageName);
180 rid = db_int(0,
181 "SELECT rid FROM tagxref"
182 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -224,14 +223,14 @@
224 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
225 manifest_crosslink(nrid, &wiki);
226 blob_reset(&wiki);
227 content_deltify(rid, nrid, 0);
228 db_end_transaction(0);
229 cgi_redirect(mprintf("wiki/%s", g.zExtra));
230 }
231 if( P("cancel")!=0 ){
232 cgi_redirect(mprintf("wiki/%s", g.zExtra));
233 return;
234 }
235 if( zBody==0 ){
236 zBody = mprintf("<i>Empty Page</i>");
237 }
@@ -248,11 +247,12 @@
248 for(n=2, z=zBody; z[0]; z++){
249 if( z[0]=='\n' ) n++;
250 }
251 if( n<20 ) n = 20;
252 if( n>200 ) n = 200;
253 @ <form method="POST" action="%s(g.zBaseURL)/wikiedit/%t(g.zExtra)">
 
254 @ <textarea name="w" class="wikiedit" cols="80"
255 @ rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
256 @ <br>
257 @ <input type="submit" name="preview" value="Preview Your Changes">
258 @ <input type="submit" name="submit" value="Apply These Changes">
@@ -281,22 +281,21 @@
281 blob_appendf(p, " added:\n\n%s", zRemark);
282 }
283
284 /*
285 ** WEBPAGE: wikiappend
286 ** URL: /wikiappend/PAGENAME
287 */
288 void wikiappend_page(void){
289 char *zTag;
290 int rid;
291 char *zPageName;
292 char *zHtmlPageName;
293 const char *zUser;
294
295 login_check_credentials();
296 zPageName = mprintf("%s", g.zExtra);
297 dehttpize(zPageName);
298 if( check_name(zPageName) ) return;
299 zTag = mprintf("wiki-%s", zPageName);
300 rid = db_int(0,
301 "SELECT rid FROM tagxref"
302 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -351,14 +350,14 @@
351 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
352 manifest_crosslink(nrid, &wiki);
353 blob_reset(&wiki);
354 content_deltify(rid, nrid, 0);
355 db_end_transaction(0);
356 cgi_redirect(mprintf("wiki/%s", g.zExtra));
357 }
358 if( P("cancel")!=0 ){
359 cgi_redirect(mprintf("wiki/%s", g.zExtra));
360 return;
361 }
362 zHtmlPageName = mprintf("Append Comment To: %h", zPageName);
363 style_header(zHtmlPageName);
364 if( P("preview")!=0 ){
@@ -369,11 +368,12 @@
369 wiki_convert(&preview, 0);
370 @ <hr>
371 blob_reset(&preview);
372 }
373 zUser = PD("u", g.zLogin);
374 @ <form method="POST" action="%s(g.zBaseURL)/wikiappend/%t(g.zExtra)">
 
375 @ Your Name:
376 @ <input type="text" name="u" size="20" value="%h(zUser)"><br>
377 @ Comment to append:<br>
378 @ <textarea name="r" class="wikiedit" cols="80"
379 @ rows="10" wrap="virtual">%h(PD("r",""))</textarea>
@@ -385,29 +385,31 @@
385 style_footer();
386 }
387
388 /*
389 ** WEBPAGE: whistory
 
390 **
391 ** Show the complete change history for a single wiki page. The name
392 ** of the wiki is in g.zExtra
393 */
394 void whistory_page(void){
395 Stmt q;
396 char *zTitle;
397 char *zSQL;
 
398 login_check_credentials();
399 if( !g.okHistory ){ login_needed(); return; }
400 zTitle = mprintf("History Of %h", g.zExtra);
 
401 style_header(zTitle);
402 free(zTitle);
403
404 zSQL = mprintf("%s AND event.objid IN "
405 " (SELECT rid FROM tagxref WHERE tagid="
406 "(SELECT tagid FROM tag WHERE tagname='wiki-%q'))"
407 "ORDER BY mtime DESC",
408 timeline_query_for_www(), g.zExtra);
409 db_prepare(&q, zSQL);
410 free(zSQL);
411 www_print_timeline(&q, 0, 0, 0, 0);
412 db_finalize(&q);
413 style_footer();
@@ -428,36 +430,10 @@
428 "SELECT substr(tagname, 6, 1000) FROM tag WHERE tagname GLOB 'wiki-*'"
429 " ORDER BY lower(tagname)"
430 );
431 while( db_step(&q)==SQLITE_ROW ){
432 const char *zName = db_column_text(&q, 0);
433 @ <li><a href="%s(g.zBaseURL)/wiki/%t(zName)">%h(zName)</a></li>
434 }
435 db_finalize(&q);
436 style_footer();
437 }
438
439 /*
440 ** WEBPAGE: ambiguous
441 **
442 ** This is the destination for UUID hyperlinks that are ambiguous.
443 ** Show all possible choices for the destination with links to each.
444 **
445 ** The ambiguous UUID prefix is in g.zExtra
446 */
447 void ambiguous_page(void){
448 Stmt q;
449 style_header("Ambiguous UUID");
450 @ <p>The link <a href="%s(g.zBaseURL)/ambiguous/%T(g.zExtra)">
451 @ [%h(g.zExtra)]</a> is ambiguous. It might mean any of the following:</p>
452 @ <ul>
453 db_prepare(&q, "SELECT uuid, rid FROM blob WHERE uuid>=%Q AND uuid<'%qz'"
454 " ORDER BY uuid", g.zExtra, g.zExtra);
455 while( db_step(&q)==SQLITE_ROW ){
456 const char *zUuid = db_column_text(&q, 0);
457 int rid = db_column_int(&q, 1);
458 @ <li> %s(zUuid) - %d(rid)
459 }
460 db_finalize(&q);
461 @ </ul>
462 style_footer();
463 }
464
--- src/wiki.c
+++ src/wiki.c
@@ -79,10 +79,11 @@
79 void home_page(void){
80 char *zPageName = db_get("project-name",0);
81 if( zPageName ){
82 login_check_credentials();
83 g.zExtra = zPageName;
84 cgi_set_parameter_nocopy("name", g.zExtra);
85 g.okRdWiki = 1;
86 g.okApndWiki = 0;
87 g.okWrWiki = 0;
88 g.okHistory = 0;
89 wiki_page();
@@ -98,25 +99,24 @@
99 style_footer();
100 }
101
102 /*
103 ** WEBPAGE: wiki
104 ** URL: /wiki?name=PAGENAME
105 */
106 void wiki_page(void){
107 char *zTag;
108 int rid;
109 Blob wiki;
110 Manifest m;
111 const char *zPageName;
112 char *zHtmlPageName;
113 char *zBody = mprintf("%s","<i>Empty Page</i>");
114
115 login_check_credentials();
116 if( !g.okRdWiki ){ login_needed(); return; }
117 zPageName = PD("name","");
 
118 if( check_name(zPageName) ) return;
119 zTag = mprintf("wiki-%s", zPageName);
120 rid = db_int(0,
121 "SELECT rid FROM tagxref"
122 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -133,19 +133,19 @@
133 zBody = m.zWiki;
134 }
135 }
136 if( (rid && g.okWrWiki) || (!rid && g.okNewWiki) ){
137 style_submenu_element("Edit", "Edit Wiki Page",
138 mprintf("%s/wikiedit?name=%t", g.zTop, zPageName));
139 }
140 if( rid && g.okApndWiki ){
141 style_submenu_element("Append", "Add A Comment",
142 mprintf("%s/wikiappend?name=%t", g.zTop, zPageName));
143 }
144 if( g.okHistory ){
145 style_submenu_element("History", "History",
146 mprintf("%s/whistory?name=%t", g.zTop, zPageName));
147 }
148 zHtmlPageName = mprintf("%h", zPageName);
149 style_header(zHtmlPageName);
150 blob_init(&wiki, zBody, -1);
151 wiki_convert(&wiki, 0);
@@ -154,29 +154,28 @@
154 style_footer();
155 }
156
157 /*
158 ** WEBPAGE: wikiedit
159 ** URL: /wikiedit?page=PAGENAME
160 */
161 void wikiedit_page(void){
162 char *zTag;
163 int rid;
164 Blob wiki;
165 Manifest m;
166 const char *zPageName;
167 char *zHtmlPageName;
168 int n;
169 const char *z;
170 char *zBody = (char*)P("w");
171
172 if( zBody ){
173 zBody = mprintf("%s", zBody);
174 }
175 login_check_credentials();
176 zPageName = PD("name","");
 
177 if( check_name(zPageName) ) return;
178 zTag = mprintf("wiki-%s", zPageName);
179 rid = db_int(0,
180 "SELECT rid FROM tagxref"
181 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -224,14 +223,14 @@
223 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
224 manifest_crosslink(nrid, &wiki);
225 blob_reset(&wiki);
226 content_deltify(rid, nrid, 0);
227 db_end_transaction(0);
228 cgi_redirectf("wiki?name=%t", zPageName);
229 }
230 if( P("cancel")!=0 ){
231 cgi_redirectf("wiki?name=%t", zPageName);
232 return;
233 }
234 if( zBody==0 ){
235 zBody = mprintf("<i>Empty Page</i>");
236 }
@@ -248,11 +247,12 @@
247 for(n=2, z=zBody; z[0]; z++){
248 if( z[0]=='\n' ) n++;
249 }
250 if( n<20 ) n = 20;
251 if( n>200 ) n = 200;
252 @ <form method="POST" action="%s(g.zBaseURL)/wikiedit">
253 @ <input type="hidden" name="name" value="%t(zPageName)">
254 @ <textarea name="w" class="wikiedit" cols="80"
255 @ rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
256 @ <br>
257 @ <input type="submit" name="preview" value="Preview Your Changes">
258 @ <input type="submit" name="submit" value="Apply These Changes">
@@ -281,22 +281,21 @@
281 blob_appendf(p, " added:\n\n%s", zRemark);
282 }
283
284 /*
285 ** WEBPAGE: wikiappend
286 ** URL: /wikiappend?name=PAGENAME
287 */
288 void wikiappend_page(void){
289 char *zTag;
290 int rid;
291 const char *zPageName;
292 char *zHtmlPageName;
293 const char *zUser;
294
295 login_check_credentials();
296 zPageName = PD("name","");
 
297 if( check_name(zPageName) ) return;
298 zTag = mprintf("wiki-%s", zPageName);
299 rid = db_int(0,
300 "SELECT rid FROM tagxref"
301 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%Q)"
@@ -351,14 +350,14 @@
350 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
351 manifest_crosslink(nrid, &wiki);
352 blob_reset(&wiki);
353 content_deltify(rid, nrid, 0);
354 db_end_transaction(0);
355 cgi_redirectf("wiki?name=%t", zPageName);
356 }
357 if( P("cancel")!=0 ){
358 cgi_redirectf("wiki?name=%t", zPageName);
359 return;
360 }
361 zHtmlPageName = mprintf("Append Comment To: %h", zPageName);
362 style_header(zHtmlPageName);
363 if( P("preview")!=0 ){
@@ -369,11 +368,12 @@
368 wiki_convert(&preview, 0);
369 @ <hr>
370 blob_reset(&preview);
371 }
372 zUser = PD("u", g.zLogin);
373 @ <form method="POST" action="%s(g.zBaseURL)/wikiappend">
374 @ <input type="hidden" name="name" value="%t(zPageName)">
375 @ Your Name:
376 @ <input type="text" name="u" size="20" value="%h(zUser)"><br>
377 @ Comment to append:<br>
378 @ <textarea name="r" class="wikiedit" cols="80"
379 @ rows="10" wrap="virtual">%h(PD("r",""))</textarea>
@@ -385,29 +385,31 @@
385 style_footer();
386 }
387
388 /*
389 ** WEBPAGE: whistory
390 ** URL: /whistory?name=PAGENAME
391 **
392 ** Show the complete change history for a single wiki page.
 
393 */
394 void whistory_page(void){
395 Stmt q;
396 char *zTitle;
397 char *zSQL;
398 const char *zPageName;
399 login_check_credentials();
400 if( !g.okHistory ){ login_needed(); return; }
401 zPageName = PD("name","");
402 zTitle = mprintf("History Of %h", zPageName);
403 style_header(zTitle);
404 free(zTitle);
405
406 zSQL = mprintf("%s AND event.objid IN "
407 " (SELECT rid FROM tagxref WHERE tagid="
408 "(SELECT tagid FROM tag WHERE tagname='wiki-%q'))"
409 "ORDER BY mtime DESC",
410 timeline_query_for_www(), zPageName);
411 db_prepare(&q, zSQL);
412 free(zSQL);
413 www_print_timeline(&q, 0, 0, 0, 0);
414 db_finalize(&q);
415 style_footer();
@@ -428,36 +430,10 @@
430 "SELECT substr(tagname, 6, 1000) FROM tag WHERE tagname GLOB 'wiki-*'"
431 " ORDER BY lower(tagname)"
432 );
433 while( db_step(&q)==SQLITE_ROW ){
434 const char *zName = db_column_text(&q, 0);
435 @ <li><a href="%s(g.zBaseURL)/wiki?page=%t(zName)">%h(zName)</a></li>
436 }
437 db_finalize(&q);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438 style_footer();
439 }
440
+4 -3
--- src/zip.c
+++ src/zip.c
@@ -322,23 +322,24 @@
322322
blob_write_to_file(&zip, g.argv[3]);
323323
}
324324
325325
/*
326326
** WEBPAGE: zip
327
+** URL: /zip/RID.zip
327328
**
328
-** Generate a ZIP archive for the baseline specified by g.zExtra
329
-** and return that ZIP archive as the HTTP reply content.
329
+** Generate a ZIP archive for the baseline.
330
+** Return that ZIP archive as the HTTP reply content.
330331
*/
331332
void baseline_zip_page(void){
332333
int rid;
333334
char *zName;
334335
int i;
335336
Blob zip;
336337
337338
login_check_credentials();
338339
if( !g.okRead || !g.okHistory ){ login_needed(); return; }
339
- zName = mprintf("%s", g.zExtra);
340
+ zName = mprintf("%s", PD("name",""));
340341
i = strlen(zName);
341342
for(i=strlen(zName)-1; i>5; i--){
342343
if( zName[i]=='.' ){
343344
zName[i] = 0;
344345
break;
345346
--- src/zip.c
+++ src/zip.c
@@ -322,23 +322,24 @@
322 blob_write_to_file(&zip, g.argv[3]);
323 }
324
325 /*
326 ** WEBPAGE: zip
 
327 **
328 ** Generate a ZIP archive for the baseline specified by g.zExtra
329 ** and return that ZIP archive as the HTTP reply content.
330 */
331 void baseline_zip_page(void){
332 int rid;
333 char *zName;
334 int i;
335 Blob zip;
336
337 login_check_credentials();
338 if( !g.okRead || !g.okHistory ){ login_needed(); return; }
339 zName = mprintf("%s", g.zExtra);
340 i = strlen(zName);
341 for(i=strlen(zName)-1; i>5; i--){
342 if( zName[i]=='.' ){
343 zName[i] = 0;
344 break;
345
--- src/zip.c
+++ src/zip.c
@@ -322,23 +322,24 @@
322 blob_write_to_file(&zip, g.argv[3]);
323 }
324
325 /*
326 ** WEBPAGE: zip
327 ** URL: /zip/RID.zip
328 **
329 ** Generate a ZIP archive for the baseline.
330 ** Return that ZIP archive as the HTTP reply content.
331 */
332 void baseline_zip_page(void){
333 int rid;
334 char *zName;
335 int i;
336 Blob zip;
337
338 login_check_credentials();
339 if( !g.okRead || !g.okHistory ){ login_needed(); return; }
340 zName = mprintf("%s", PD("name",""));
341 i = strlen(zName);
342 for(i=strlen(zName)-1; i>5; i--){
343 if( zName[i]=='.' ){
344 zName[i] = 0;
345 break;
346

Keyboard Shortcuts

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