Fossil SCM
Teach the help command and /help page to be able to distinguish completely unknown commands from commands which are only conditionally available depending on their platform or build flags. Based on a /chat discussion.
Commit
e5ace41107d6312366f365cc1a70d1c1b96ea09935b9ff98d8b39b5d3981ee5b
Parent
e2c161bafb2a2a0…
1 file changed
+31
-1
+31
-1
| --- src/dispatch.c | ||
| +++ src/dispatch.c | ||
| @@ -811,10 +811,32 @@ | ||
| 811 | 811 | fossil_print(" %s\n", az[j]); |
| 812 | 812 | } |
| 813 | 813 | } |
| 814 | 814 | } |
| 815 | 815 | |
| 816 | + | |
| 817 | +/* | |
| 818 | +** Returns 1 if the command or page name zName is known to be a | |
| 819 | +** command/page which is only available in certain builds/platforms, | |
| 820 | +** else returns 0. | |
| 821 | +*/ | |
| 822 | +static int help_is_platform_command(const char *zName){ | |
| 823 | + const char *aList[] = { | |
| 824 | + /* List of commands/pages which are known to only be available in | |
| 825 | + ** certain builds/platforms. */ | |
| 826 | + "winsrv", | |
| 827 | + "json", "/json", | |
| 828 | + NULL /* end-of-list sentinel */ | |
| 829 | + }; | |
| 830 | + int i = 0; | |
| 831 | + const char *z; | |
| 832 | + for( z = aList[0]; z ; z = aList[++i] ){ | |
| 833 | + if( 0==fossil_strcmp(zName, z) ) return 1; | |
| 834 | + } | |
| 835 | + return 0; | |
| 836 | +} | |
| 837 | + | |
| 816 | 838 | /* |
| 817 | 839 | ** WEBPAGE: help |
| 818 | 840 | ** URL: /help?name=CMD |
| 819 | 841 | ** |
| 820 | 842 | ** Show the built-in help text for CMD. CMD can be a command-line interface |
| @@ -860,11 +882,15 @@ | ||
| 860 | 882 | @ <h1>The "%h(pCmd->zName)" setting:</h1> |
| 861 | 883 | }else{ |
| 862 | 884 | @ <h1>The "%h(pCmd->zName)" command:</h1> |
| 863 | 885 | } |
| 864 | 886 | if( rc==1 || (rc==2 && zCmd[0]=='/') ){ |
| 865 | - @ Unknown topic: "%h(zCmd)" | |
| 887 | + if( zCmd && help_is_platform_command(zCmd) ){ | |
| 888 | + @ Not available in this build: "%h(zCmd)" | |
| 889 | + }else{ | |
| 890 | + @ Unknown topic: "%h(zCmd)" | |
| 891 | + } | |
| 866 | 892 | }else if( rc==2 ){ |
| 867 | 893 | @ Ambiguous prefix: "%h(zCmd)" |
| 868 | 894 | }else{ |
| 869 | 895 | if( pCmd->zHelp[0]==0 ){ |
| 870 | 896 | @ No help available for "%h(pCmd->zName)" |
| @@ -1518,10 +1544,14 @@ | ||
| 1518 | 1544 | rc = dispatch_name_search(g.argv[2], mask|CMDFLAG_PREFIX, &pCmd); |
| 1519 | 1545 | if( rc ){ |
| 1520 | 1546 | int i, n; |
| 1521 | 1547 | const char *az[5]; |
| 1522 | 1548 | if( rc==1 ){ |
| 1549 | + if( help_is_platform_command(g.argv[2]) ){ | |
| 1550 | + fossil_print("Command is not available in this build: %s\n", g.argv[2]); | |
| 1551 | + return; | |
| 1552 | + } | |
| 1523 | 1553 | fossil_print("unknown %s: %s\n", zCmdOrPage, g.argv[2]); |
| 1524 | 1554 | }else{ |
| 1525 | 1555 | fossil_print("ambiguous %s prefix: %s\n", |
| 1526 | 1556 | zCmdOrPage, g.argv[2]); |
| 1527 | 1557 | } |
| 1528 | 1558 |
| --- src/dispatch.c | |
| +++ src/dispatch.c | |
| @@ -811,10 +811,32 @@ | |
| 811 | fossil_print(" %s\n", az[j]); |
| 812 | } |
| 813 | } |
| 814 | } |
| 815 | |
| 816 | /* |
| 817 | ** WEBPAGE: help |
| 818 | ** URL: /help?name=CMD |
| 819 | ** |
| 820 | ** Show the built-in help text for CMD. CMD can be a command-line interface |
| @@ -860,11 +882,15 @@ | |
| 860 | @ <h1>The "%h(pCmd->zName)" setting:</h1> |
| 861 | }else{ |
| 862 | @ <h1>The "%h(pCmd->zName)" command:</h1> |
| 863 | } |
| 864 | if( rc==1 || (rc==2 && zCmd[0]=='/') ){ |
| 865 | @ Unknown topic: "%h(zCmd)" |
| 866 | }else if( rc==2 ){ |
| 867 | @ Ambiguous prefix: "%h(zCmd)" |
| 868 | }else{ |
| 869 | if( pCmd->zHelp[0]==0 ){ |
| 870 | @ No help available for "%h(pCmd->zName)" |
| @@ -1518,10 +1544,14 @@ | |
| 1518 | rc = dispatch_name_search(g.argv[2], mask|CMDFLAG_PREFIX, &pCmd); |
| 1519 | if( rc ){ |
| 1520 | int i, n; |
| 1521 | const char *az[5]; |
| 1522 | if( rc==1 ){ |
| 1523 | fossil_print("unknown %s: %s\n", zCmdOrPage, g.argv[2]); |
| 1524 | }else{ |
| 1525 | fossil_print("ambiguous %s prefix: %s\n", |
| 1526 | zCmdOrPage, g.argv[2]); |
| 1527 | } |
| 1528 |
| --- src/dispatch.c | |
| +++ src/dispatch.c | |
| @@ -811,10 +811,32 @@ | |
| 811 | fossil_print(" %s\n", az[j]); |
| 812 | } |
| 813 | } |
| 814 | } |
| 815 | |
| 816 | |
| 817 | /* |
| 818 | ** Returns 1 if the command or page name zName is known to be a |
| 819 | ** command/page which is only available in certain builds/platforms, |
| 820 | ** else returns 0. |
| 821 | */ |
| 822 | static int help_is_platform_command(const char *zName){ |
| 823 | const char *aList[] = { |
| 824 | /* List of commands/pages which are known to only be available in |
| 825 | ** certain builds/platforms. */ |
| 826 | "winsrv", |
| 827 | "json", "/json", |
| 828 | NULL /* end-of-list sentinel */ |
| 829 | }; |
| 830 | int i = 0; |
| 831 | const char *z; |
| 832 | for( z = aList[0]; z ; z = aList[++i] ){ |
| 833 | if( 0==fossil_strcmp(zName, z) ) return 1; |
| 834 | } |
| 835 | return 0; |
| 836 | } |
| 837 | |
| 838 | /* |
| 839 | ** WEBPAGE: help |
| 840 | ** URL: /help?name=CMD |
| 841 | ** |
| 842 | ** Show the built-in help text for CMD. CMD can be a command-line interface |
| @@ -860,11 +882,15 @@ | |
| 882 | @ <h1>The "%h(pCmd->zName)" setting:</h1> |
| 883 | }else{ |
| 884 | @ <h1>The "%h(pCmd->zName)" command:</h1> |
| 885 | } |
| 886 | if( rc==1 || (rc==2 && zCmd[0]=='/') ){ |
| 887 | if( zCmd && help_is_platform_command(zCmd) ){ |
| 888 | @ Not available in this build: "%h(zCmd)" |
| 889 | }else{ |
| 890 | @ Unknown topic: "%h(zCmd)" |
| 891 | } |
| 892 | }else if( rc==2 ){ |
| 893 | @ Ambiguous prefix: "%h(zCmd)" |
| 894 | }else{ |
| 895 | if( pCmd->zHelp[0]==0 ){ |
| 896 | @ No help available for "%h(pCmd->zName)" |
| @@ -1518,10 +1544,14 @@ | |
| 1544 | rc = dispatch_name_search(g.argv[2], mask|CMDFLAG_PREFIX, &pCmd); |
| 1545 | if( rc ){ |
| 1546 | int i, n; |
| 1547 | const char *az[5]; |
| 1548 | if( rc==1 ){ |
| 1549 | if( help_is_platform_command(g.argv[2]) ){ |
| 1550 | fossil_print("Command is not available in this build: %s\n", g.argv[2]); |
| 1551 | return; |
| 1552 | } |
| 1553 | fossil_print("unknown %s: %s\n", zCmdOrPage, g.argv[2]); |
| 1554 | }else{ |
| 1555 | fossil_print("ambiguous %s prefix: %s\n", |
| 1556 | zCmdOrPage, g.argv[2]); |
| 1557 | } |
| 1558 |