Fossil SCM
Progress toward getting ticket handling to work.
Commit
68c24b185731fad5e835f816428aaa739552cdd5
Parent
5b74febbccab50c…
6 files changed
+2
-2
+9
-4
+8
-1
+1
+9
+1
+2
-2
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -738,13 +738,13 @@ | ||
| 738 | 738 | int i; |
| 739 | 739 | Annotator ann; |
| 740 | 740 | |
| 741 | 741 | login_check_credentials(); |
| 742 | 742 | if( !g.okRead ){ login_needed(); return; } |
| 743 | - if( mid==0 || fnid==0 ){ cgi_redirect("index"); } | |
| 743 | + if( mid==0 || fnid==0 ){ fossil_redirect_home(); } | |
| 744 | 744 | if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){ |
| 745 | - cgi_redirect("index"); | |
| 745 | + fossil_redirect_home(); | |
| 746 | 746 | } |
| 747 | 747 | style_header("File Annotation"); |
| 748 | 748 | annotate_file(&ann, fnid, mid, 1); |
| 749 | 749 | @ <pre> |
| 750 | 750 | for(i=0; i<ann.nOrig; i++){ |
| 751 | 751 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -738,13 +738,13 @@ | |
| 738 | int i; |
| 739 | Annotator ann; |
| 740 | |
| 741 | login_check_credentials(); |
| 742 | if( !g.okRead ){ login_needed(); return; } |
| 743 | if( mid==0 || fnid==0 ){ cgi_redirect("index"); } |
| 744 | if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){ |
| 745 | cgi_redirect("index"); |
| 746 | } |
| 747 | style_header("File Annotation"); |
| 748 | annotate_file(&ann, fnid, mid, 1); |
| 749 | @ <pre> |
| 750 | for(i=0; i<ann.nOrig; i++){ |
| 751 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -738,13 +738,13 @@ | |
| 738 | int i; |
| 739 | Annotator ann; |
| 740 | |
| 741 | login_check_credentials(); |
| 742 | if( !g.okRead ){ login_needed(); return; } |
| 743 | if( mid==0 || fnid==0 ){ fossil_redirect_home(); } |
| 744 | if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d AND fnid=%d",mid,fnid) ){ |
| 745 | fossil_redirect_home(); |
| 746 | } |
| 747 | style_header("File Annotation"); |
| 748 | annotate_file(&ann, fnid, mid, 1); |
| 749 | @ <pre> |
| 750 | for(i=0; i<ann.nOrig; i++){ |
| 751 |
+9
-4
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -97,11 +97,12 @@ | ||
| 97 | 97 | printf("checkout: nil\n"); |
| 98 | 98 | }else{ |
| 99 | 99 | show_common_info(vid, "checkout:", 1); |
| 100 | 100 | } |
| 101 | 101 | }else{ |
| 102 | - int rid = name_to_rid(g.argv[2]); | |
| 102 | + int rid; | |
| 103 | + rid = name_to_rid(g.argv[2]); | |
| 103 | 104 | if( rid==0 ){ |
| 104 | 105 | fossil_panic("no such object: %s\n", g.argv[2]); |
| 105 | 106 | } |
| 106 | 107 | show_common_info(rid, "uuid:", 1); |
| 107 | 108 | } |
| @@ -582,11 +583,11 @@ | ||
| 582 | 583 | style_header("Baseline Changes"); |
| 583 | 584 | login_anonymous_available(); |
| 584 | 585 | |
| 585 | 586 | rid = name_to_rid(PD("name","")); |
| 586 | 587 | if( rid==0 ){ |
| 587 | - cgi_redirect("index"); | |
| 588 | + fossil_redirect_home(); | |
| 588 | 589 | } |
| 589 | 590 | db_prepare(&q, |
| 590 | 591 | "SELECT pid, fid, name" |
| 591 | 592 | " FROM mlink, filename" |
| 592 | 593 | " WHERE mlink.mid=%d" |
| @@ -805,14 +806,18 @@ | ||
| 805 | 806 | void info_page(void){ |
| 806 | 807 | const char *zName; |
| 807 | 808 | int rid, nName; |
| 808 | 809 | |
| 809 | 810 | zName = P("name"); |
| 810 | - if( zName==0 ) cgi_redirect("index"); | |
| 811 | + if( zName==0 ) fossil_redirect_home(); | |
| 811 | 812 | nName = strlen(zName); |
| 812 | 813 | if( nName<4 || nName>UUID_SIZE || !validate16(zName, nName) ){ |
| 813 | - cgi_redirect("index"); | |
| 814 | + fossil_redirect_home(); | |
| 815 | + } | |
| 816 | + if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%s*'", zName) ){ | |
| 817 | + tktview_page(); | |
| 818 | + return; | |
| 814 | 819 | } |
| 815 | 820 | rid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zName); |
| 816 | 821 | if( rid==0 ){ |
| 817 | 822 | style_header("Broken Link"); |
| 818 | 823 | @ <p>No such object: %h(zName)</p> |
| 819 | 824 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -97,11 +97,12 @@ | |
| 97 | printf("checkout: nil\n"); |
| 98 | }else{ |
| 99 | show_common_info(vid, "checkout:", 1); |
| 100 | } |
| 101 | }else{ |
| 102 | int rid = name_to_rid(g.argv[2]); |
| 103 | if( rid==0 ){ |
| 104 | fossil_panic("no such object: %s\n", g.argv[2]); |
| 105 | } |
| 106 | show_common_info(rid, "uuid:", 1); |
| 107 | } |
| @@ -582,11 +583,11 @@ | |
| 582 | style_header("Baseline Changes"); |
| 583 | login_anonymous_available(); |
| 584 | |
| 585 | rid = name_to_rid(PD("name","")); |
| 586 | if( rid==0 ){ |
| 587 | cgi_redirect("index"); |
| 588 | } |
| 589 | db_prepare(&q, |
| 590 | "SELECT pid, fid, name" |
| 591 | " FROM mlink, filename" |
| 592 | " WHERE mlink.mid=%d" |
| @@ -805,14 +806,18 @@ | |
| 805 | void info_page(void){ |
| 806 | const char *zName; |
| 807 | int rid, nName; |
| 808 | |
| 809 | zName = P("name"); |
| 810 | if( zName==0 ) cgi_redirect("index"); |
| 811 | nName = strlen(zName); |
| 812 | if( nName<4 || nName>UUID_SIZE || !validate16(zName, nName) ){ |
| 813 | cgi_redirect("index"); |
| 814 | } |
| 815 | rid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zName); |
| 816 | if( rid==0 ){ |
| 817 | style_header("Broken Link"); |
| 818 | @ <p>No such object: %h(zName)</p> |
| 819 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -97,11 +97,12 @@ | |
| 97 | printf("checkout: nil\n"); |
| 98 | }else{ |
| 99 | show_common_info(vid, "checkout:", 1); |
| 100 | } |
| 101 | }else{ |
| 102 | int rid; |
| 103 | rid = name_to_rid(g.argv[2]); |
| 104 | if( rid==0 ){ |
| 105 | fossil_panic("no such object: %s\n", g.argv[2]); |
| 106 | } |
| 107 | show_common_info(rid, "uuid:", 1); |
| 108 | } |
| @@ -582,11 +583,11 @@ | |
| 583 | style_header("Baseline Changes"); |
| 584 | login_anonymous_available(); |
| 585 | |
| 586 | rid = name_to_rid(PD("name","")); |
| 587 | if( rid==0 ){ |
| 588 | fossil_redirect_home(); |
| 589 | } |
| 590 | db_prepare(&q, |
| 591 | "SELECT pid, fid, name" |
| 592 | " FROM mlink, filename" |
| 593 | " WHERE mlink.mid=%d" |
| @@ -805,14 +806,18 @@ | |
| 806 | void info_page(void){ |
| 807 | const char *zName; |
| 808 | int rid, nName; |
| 809 | |
| 810 | zName = P("name"); |
| 811 | if( zName==0 ) fossil_redirect_home(); |
| 812 | nName = strlen(zName); |
| 813 | if( nName<4 || nName>UUID_SIZE || !validate16(zName, nName) ){ |
| 814 | fossil_redirect_home(); |
| 815 | } |
| 816 | if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%s*'", zName) ){ |
| 817 | tktview_page(); |
| 818 | return; |
| 819 | } |
| 820 | rid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%s*'", zName); |
| 821 | if( rid==0 ){ |
| 822 | style_header("Broken Link"); |
| 823 | @ <p>No such object: %h(zName)</p> |
| 824 |
+8
-1
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -451,10 +451,17 @@ | ||
| 451 | 451 | }else{ |
| 452 | 452 | g.zBaseURL = mprintf("http://%s%.*s", zHost, i, zCur); |
| 453 | 453 | g.zTop = &g.zBaseURL[7+strlen(zHost)]; |
| 454 | 454 | } |
| 455 | 455 | } |
| 456 | + | |
| 457 | +/* | |
| 458 | +** Send an HTTP redirect back to the designated Index Page. | |
| 459 | +*/ | |
| 460 | +void fossil_redirect_home(void){ | |
| 461 | + cgi_redirectf("%s%s", g.zBaseURL, db_get("index-page", "/index")); | |
| 462 | +} | |
| 456 | 463 | |
| 457 | 464 | /* |
| 458 | 465 | ** Preconditions: |
| 459 | 466 | ** |
| 460 | 467 | ** * Environment variables are set up according to the CGI standard. |
| @@ -474,11 +481,11 @@ | ||
| 474 | 481 | */ |
| 475 | 482 | set_base_url(); |
| 476 | 483 | zPathInfo = P("PATH_INFO"); |
| 477 | 484 | if( zPathInfo==0 || zPathInfo[0]==0 |
| 478 | 485 | || (zPathInfo[0]=='/' && zPathInfo[1]==0) ){ |
| 479 | - cgi_redirectf("%s%s", g.zBaseURL, db_get("index-page", "/index")); | |
| 486 | + fossil_redirect_home(); | |
| 480 | 487 | }else{ |
| 481 | 488 | zPath = mprintf("%s", zPathInfo); |
| 482 | 489 | } |
| 483 | 490 | |
| 484 | 491 | /* Remove the leading "/" at the beginning of the path. |
| 485 | 492 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -451,10 +451,17 @@ | |
| 451 | }else{ |
| 452 | g.zBaseURL = mprintf("http://%s%.*s", zHost, i, zCur); |
| 453 | g.zTop = &g.zBaseURL[7+strlen(zHost)]; |
| 454 | } |
| 455 | } |
| 456 | |
| 457 | /* |
| 458 | ** Preconditions: |
| 459 | ** |
| 460 | ** * Environment variables are set up according to the CGI standard. |
| @@ -474,11 +481,11 @@ | |
| 474 | */ |
| 475 | set_base_url(); |
| 476 | zPathInfo = P("PATH_INFO"); |
| 477 | if( zPathInfo==0 || zPathInfo[0]==0 |
| 478 | || (zPathInfo[0]=='/' && zPathInfo[1]==0) ){ |
| 479 | cgi_redirectf("%s%s", g.zBaseURL, db_get("index-page", "/index")); |
| 480 | }else{ |
| 481 | zPath = mprintf("%s", zPathInfo); |
| 482 | } |
| 483 | |
| 484 | /* Remove the leading "/" at the beginning of the path. |
| 485 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -451,10 +451,17 @@ | |
| 451 | }else{ |
| 452 | g.zBaseURL = mprintf("http://%s%.*s", zHost, i, zCur); |
| 453 | g.zTop = &g.zBaseURL[7+strlen(zHost)]; |
| 454 | } |
| 455 | } |
| 456 | |
| 457 | /* |
| 458 | ** Send an HTTP redirect back to the designated Index Page. |
| 459 | */ |
| 460 | void fossil_redirect_home(void){ |
| 461 | cgi_redirectf("%s%s", g.zBaseURL, db_get("index-page", "/index")); |
| 462 | } |
| 463 | |
| 464 | /* |
| 465 | ** Preconditions: |
| 466 | ** |
| 467 | ** * Environment variables are set up according to the CGI standard. |
| @@ -474,11 +481,11 @@ | |
| 481 | */ |
| 482 | set_base_url(); |
| 483 | zPathInfo = P("PATH_INFO"); |
| 484 | if( zPathInfo==0 || zPathInfo[0]==0 |
| 485 | || (zPathInfo[0]=='/' && zPathInfo[1]==0) ){ |
| 486 | fossil_redirect_home(); |
| 487 | }else{ |
| 488 | zPath = mprintf("%s", zPathInfo); |
| 489 | } |
| 490 | |
| 491 | /* Remove the leading "/" at the beginning of the path. |
| 492 |
+1
| --- src/style.c | ||
| +++ src/style.c | ||
| @@ -88,10 +88,11 @@ | ||
| 88 | 88 | Th_Store("manifest_date", MANIFEST_DATE); |
| 89 | 89 | if( g.zLogin ){ |
| 90 | 90 | Th_Store("login", g.zLogin); |
| 91 | 91 | } |
| 92 | 92 | Th_Render(zHeader); |
| 93 | + Th_Unstore("title"); /* Avoid collisions with ticket field names */ | |
| 93 | 94 | cgi_destination(CGI_BODY); |
| 94 | 95 | g.cgiPanic = 1; |
| 95 | 96 | } |
| 96 | 97 | |
| 97 | 98 | /* |
| 98 | 99 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -88,10 +88,11 @@ | |
| 88 | Th_Store("manifest_date", MANIFEST_DATE); |
| 89 | if( g.zLogin ){ |
| 90 | Th_Store("login", g.zLogin); |
| 91 | } |
| 92 | Th_Render(zHeader); |
| 93 | cgi_destination(CGI_BODY); |
| 94 | g.cgiPanic = 1; |
| 95 | } |
| 96 | |
| 97 | /* |
| 98 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -88,10 +88,11 @@ | |
| 88 | Th_Store("manifest_date", MANIFEST_DATE); |
| 89 | if( g.zLogin ){ |
| 90 | Th_Store("login", g.zLogin); |
| 91 | } |
| 92 | Th_Render(zHeader); |
| 93 | Th_Unstore("title"); /* Avoid collisions with ticket field names */ |
| 94 | cgi_destination(CGI_BODY); |
| 95 | g.cgiPanic = 1; |
| 96 | } |
| 97 | |
| 98 | /* |
| 99 |
+9
| --- src/th_main.c | ||
| +++ src/th_main.c | ||
| @@ -281,10 +281,19 @@ | ||
| 281 | 281 | */ |
| 282 | 282 | void Th_Store(const char *zName, const char *zValue){ |
| 283 | 283 | Th_FossilInit(); |
| 284 | 284 | Th_SetVar(g.interp, (uchar*)zName, -1, (uchar*)zValue, strlen(zValue)); |
| 285 | 285 | } |
| 286 | + | |
| 287 | +/* | |
| 288 | +** Unset a variable. | |
| 289 | +*/ | |
| 290 | +void Th_Unstore(const char *zName){ | |
| 291 | + if( g.interp ){ | |
| 292 | + Th_UnsetVar(g.interp, (uchar*)zName, -1); | |
| 293 | + } | |
| 294 | +} | |
| 286 | 295 | |
| 287 | 296 | /* |
| 288 | 297 | ** Retrieve a string value from the interpreter. If no such |
| 289 | 298 | ** variable exists, return NULL. |
| 290 | 299 | */ |
| 291 | 300 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -281,10 +281,19 @@ | |
| 281 | */ |
| 282 | void Th_Store(const char *zName, const char *zValue){ |
| 283 | Th_FossilInit(); |
| 284 | Th_SetVar(g.interp, (uchar*)zName, -1, (uchar*)zValue, strlen(zValue)); |
| 285 | } |
| 286 | |
| 287 | /* |
| 288 | ** Retrieve a string value from the interpreter. If no such |
| 289 | ** variable exists, return NULL. |
| 290 | */ |
| 291 |
| --- src/th_main.c | |
| +++ src/th_main.c | |
| @@ -281,10 +281,19 @@ | |
| 281 | */ |
| 282 | void Th_Store(const char *zName, const char *zValue){ |
| 283 | Th_FossilInit(); |
| 284 | Th_SetVar(g.interp, (uchar*)zName, -1, (uchar*)zValue, strlen(zValue)); |
| 285 | } |
| 286 | |
| 287 | /* |
| 288 | ** Unset a variable. |
| 289 | */ |
| 290 | void Th_Unstore(const char *zName){ |
| 291 | if( g.interp ){ |
| 292 | Th_UnsetVar(g.interp, (uchar*)zName, -1); |
| 293 | } |
| 294 | } |
| 295 | |
| 296 | /* |
| 297 | ** Retrieve a string value from the interpreter. If no such |
| 298 | ** variable exists, return NULL. |
| 299 | */ |
| 300 |
+1
| --- src/tkt.c | ||
| +++ src/tkt.c | ||
| @@ -298,10 +298,11 @@ | ||
| 298 | 298 | db_end_transaction(0); |
| 299 | 299 | } |
| 300 | 300 | |
| 301 | 301 | /* |
| 302 | 302 | ** WEBPAGE: tktview |
| 303 | +** URL: tktview?name=UUID | |
| 303 | 304 | ** |
| 304 | 305 | ** View a ticket. |
| 305 | 306 | */ |
| 306 | 307 | void tktview_page(void){ |
| 307 | 308 | char *zScript; |
| 308 | 309 |
| --- src/tkt.c | |
| +++ src/tkt.c | |
| @@ -298,10 +298,11 @@ | |
| 298 | db_end_transaction(0); |
| 299 | } |
| 300 | |
| 301 | /* |
| 302 | ** WEBPAGE: tktview |
| 303 | ** |
| 304 | ** View a ticket. |
| 305 | */ |
| 306 | void tktview_page(void){ |
| 307 | char *zScript; |
| 308 |
| --- src/tkt.c | |
| +++ src/tkt.c | |
| @@ -298,10 +298,11 @@ | |
| 298 | db_end_transaction(0); |
| 299 | } |
| 300 | |
| 301 | /* |
| 302 | ** WEBPAGE: tktview |
| 303 | ** URL: tktview?name=UUID |
| 304 | ** |
| 305 | ** View a ticket. |
| 306 | */ |
| 307 | void tktview_page(void){ |
| 308 | char *zScript; |
| 309 |