Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Improvements to rendering in the "fossil help" command, especially in combination with the -u/--usage and -o/--options command-line options. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
62cb8ea785506f04907265173071b988 |
| User & Date: | drh 2025-03-01 16:02:08.934 |
Context
|
2025-03-01
| ||
| 20:31 | Remove the "fossil usage" and "fossil options" command. Use instead the the --usage/-u or --options/-o options on the "fossil help" command. Other improvements and fixes to the recent "fossil help" enhancement. ... (check-in: b097e6899e user: drh tags: trunk) | |
| 16:02 | Improvements to rendering in the "fossil help" command, especially in combination with the -u/--usage and -o/--options command-line options. ... (check-in: 62cb8ea785 user: drh tags: trunk) | |
| 11:14 | Make "fossil help --options" work the same as "fossil options". ... (check-in: 692a28394e user: drh tags: trunk) | |
Changes
Changes to src/alerts.c.
| ︙ | ︙ | |||
1131 1132 1133 1134 1135 1136 1137 | ** are sent when email-send-method is "relay". There should be an ** SMTP server configured as a Mail Submission Agent listening on the ** designated host and port and all times. */ /* | | | 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 | ** are sent when email-send-method is "relay". There should be an ** SMTP server configured as a Mail Submission Agent listening on the ** designated host and port and all times. */ /* ** COMMAND: alerts* abbreviated-subcommands ** ** Usage: %fossil alerts SUBCOMMAND ARGS... ** ** Subcommands: ** ** pending Show all pending alerts. Useful for debugging. ** |
| ︙ | ︙ |
Changes to src/allrepo.c.
| ︙ | ︙ | |||
49 50 51 52 53 54 55 |
int i;
for(i=iStart; i<g.argc; i++){
blob_appendf(pExtra, " %s", g.argv[i]);
}
}
/*
| | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
int i;
for(i=iStart; i<g.argc; i++){
blob_appendf(pExtra, " %s", g.argv[i]);
}
}
/*
** COMMAND: all abbreviated-subcommands
**
** Usage: %fossil all SUBCOMMAND ...
**
** The ~/.fossil file records the location of all repositories for a
** user. This command performs certain operations on all repositories
** that can be useful before or after a period of disconnected operation.
**
|
| ︙ | ︙ |
Changes to src/branch.c.
| ︙ | ︙ | |||
596 597 598 599 600 601 602 | ** COMMAND: branch ** ** Usage: %fossil branch SUBCOMMAND ... ?OPTIONS? ** ** Run various subcommands to manage branches of the open repository or ** of the repository identified by the -R or --repository option. ** | | | | | | | | 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 | ** COMMAND: branch ** ** Usage: %fossil branch SUBCOMMAND ... ?OPTIONS? ** ** Run various subcommands to manage branches of the open repository or ** of the repository identified by the -R or --repository option. ** ** > fossil branch close|reopen ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES? ** ** Adds or cancels the "closed" tag to one or more branches. ** It accepts arbitrary unambiguous symbolic names but ** will only resolve check-in names and skips any which resolve ** to non-leaf check-ins. ** ** Options: ** -n|--dry-run Do not commit changes, but dump artifact ** to stdout ** -v|--verbose Output more information ** --date-override DATE DATE to use instead of 'now' ** --user-override USER USER to use instead of the current default ** ** > fossil branch current ** ** Print the name of the branch for the current check-out ** ** > fossil branch hide|unhide ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES? ** ** Adds or cancels the "hidden" tag for the specified branches or ** or check-in IDs. Accepts the same options as the close ** subcommand. ** ** > fossil branch info BRANCH-NAME ** ** Print information about a branch ** ** > fossil branch list|ls ?OPTIONS? ?GLOB? ** > fossil branch lsh ?OPTIONS? ?LIMIT? ** ** List all branches. ** ** Options: ** -a|--all List all branches. Default show only open branches ** -c|--closed List closed branches ** -m|--merged List branches merged into the current branch |
| ︙ | ︙ | |||
651 652 653 654 655 656 657 | ** If GLOB is given, show only branches matching the pattern. ** ** The "lsh" variant of this subcommand shows recently changed branches, ** and accepts an optional LIMIT argument (defaults to 5) to cap output, ** but no GLOB argument. All other options are supported, with -t being ** an implied no-op. ** | | | 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 | ** If GLOB is given, show only branches matching the pattern. ** ** The "lsh" variant of this subcommand shows recently changed branches, ** and accepts an optional LIMIT argument (defaults to 5) to cap output, ** but no GLOB argument. All other options are supported, with -t being ** an implied no-op. ** ** > fossil branch new BRANCH-NAME BASIS ?OPTIONS? ** ** Create a new branch BRANCH-NAME off of check-in BASIS. ** ** Options: ** --private Branch is private (i.e., remains local) ** --bgcolor COLOR Use COLOR instead of automatic background ** --nosign Do not sign the manifest for the check-in |
| ︙ | ︙ |
Changes to src/cache.c.
| ︙ | ︙ | |||
253 254 255 256 257 258 259 |
** database already exists.
*/
void cache_initialize(void){
sqlite3_close(cacheOpen(1));
}
/*
| | | 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
** database already exists.
*/
void cache_initialize(void){
sqlite3_close(cacheOpen(1));
}
/*
** COMMAND: cache* abbreviated-subcommands
**
** Usage: %fossil cache SUBCOMMAND
**
** Manage the cache used for potentially expensive web pages such as
** /zip and /tarball. SUBCOMMAND can be:
**
** clear Remove all entries from the cache.
|
| ︙ | ︙ |
Changes to src/dispatch.c.
| ︙ | ︙ | |||
52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */ #define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret POST content */ /* NOTE: 0x0400 = CMDFLAG_SENSITIVE in mkindex.c! */ #define CMDFLAG_HIDDEN 0x0800 /* Elide from most listings */ #define CMDFLAG_LDAVG_EXEMPT 0x1000 /* Exempt from load_control() */ #define CMDFLAG_ALIAS 0x2000 /* Command aliases */ #define CMDFLAG_KEEPEMPTY 0x4000 /* Do not unset empty settings */ /**************************************************************************/ /* Values for the 2nd parameter to dispatch_name_search() */ #define CMDFLAG_ANY 0x0038 /* Match anything */ #define CMDFLAG_PREFIX 0x0200 /* Prefix match is ok */ #endif /* INTERFACE */ | > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */ #define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret POST content */ /* NOTE: 0x0400 = CMDFLAG_SENSITIVE in mkindex.c! */ #define CMDFLAG_HIDDEN 0x0800 /* Elide from most listings */ #define CMDFLAG_LDAVG_EXEMPT 0x1000 /* Exempt from load_control() */ #define CMDFLAG_ALIAS 0x2000 /* Command aliases */ #define CMDFLAG_KEEPEMPTY 0x4000 /* Do not unset empty settings */ #define CMDFLAG_ABBREVSUBCMD 0x8000 /* Help text abbreviates subcommands */ /**************************************************************************/ /* Values for the 2nd parameter to dispatch_name_search() */ #define CMDFLAG_ANY 0x0038 /* Match anything */ #define CMDFLAG_PREFIX 0x0200 /* Prefix match is ok */ #endif /* INTERFACE */ |
| ︙ | ︙ | |||
520 521 522 523 524 525 526 |
blob_appendf(pHtml, "%s\n", azEnd[iLevel--]);
}
}
/*
** Format help text for TTY display.
*/
| | | | 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
blob_appendf(pHtml, "%s\n", azEnd[iLevel--]);
}
}
/*
** Format help text for TTY display.
*/
static void help_to_text(const char *zHelp, Blob *pText, int bUsage){
int i, x;
char c;
if( !bUsage && zHelp[0]=='>' ){
blob_appendf(pText, "Usage:");
zHelp++;
}
for(i=0; (c = zHelp[i])!=0; i++){
if( c=='%' && strncmp(zHelp+i,"%fossil",7)==0 ){
if( i>0 ) blob_append(pText, zHelp, i);
blob_append(pText, "fossil", 6);
|
| ︙ | ︙ | |||
605 606 607 608 609 610 611 |
}else if( rawOut ){
for(j=0; j<occHelp[aCommand[i].iHelp]; j++)
fossil_print("# %s\n", aCommand[bktHelp[aCommand[i].iHelp][j]].zName);
fossil_print("%s\n\n", aCommand[i].zHelp);
}else{
Blob txt;
blob_init(&txt, 0, 0);
| | | 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 |
}else if( rawOut ){
for(j=0; j<occHelp[aCommand[i].iHelp]; j++)
fossil_print("# %s\n", aCommand[bktHelp[aCommand[i].iHelp][j]].zName);
fossil_print("%s\n\n", aCommand[i].zHelp);
}else{
Blob txt;
blob_init(&txt, 0, 0);
help_to_text(aCommand[i].zHelp, &txt, 0);
for(j=0; j<occHelp[aCommand[i].iHelp]; j++){
fossil_print("# %s%s\n",
aCommand[bktHelp[aCommand[i].iHelp][j]].zName,
(aCommand[i].eCmdFlags & CMDFLAG_VERSIONABLE)!=0 ?
" (versionable)" : "");
}
fossil_print("%s\n\n", blob_str(&txt));
|
| ︙ | ︙ | |||
857 858 859 860 861 862 863 |
@ ambiguous command prefix: %h(zCmd)
}else{
if( pCmd->zHelp[0]==0 ){
@ No help available for "%h(pCmd->zName)"
}else if( P("plaintext") ){
Blob txt;
blob_init(&txt, 0, 0);
| | | 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 |
@ ambiguous command prefix: %h(zCmd)
}else{
if( pCmd->zHelp[0]==0 ){
@ No help available for "%h(pCmd->zName)"
}else if( P("plaintext") ){
Blob txt;
blob_init(&txt, 0, 0);
help_to_text(pCmd->zHelp, &txt, 0);
@ <pre class="helpPage">
@ %h(blob_str(&txt))
@ </pre>
blob_reset(&txt);
}else if( P("raw") ){
@ <pre class="helpPage">
@ %h(pCmd->zHelp)
|
| ︙ | ︙ | |||
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 |
occHelp[aCommand[i].iHelp] = 0;
}
}
@ </dl>
blob_reset(&buf);
style_finish_page();
}
/*
** Input z[] is help text for zTopic. If zTopic has sub-command zSub,
** then cut out all portions of the original help text that do not
** directly pertain to zSub and write the zSub-relevant parts into
** pOut.
**
** Return the number of lines of z[] written into pOut. A return of
** zero means no simplification occurred.
*/
static int simplify_to_subtopic(
const char *z, /* Full original help text */
Blob *pOut, /* Write simplified help text here */
const char *zTopic, /* TOPIC */
| > > > > > > > > > > > > > > > > > > | > | > > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | > | | > > > | > | | | > > > > | > > > > > > > | 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 |
occHelp[aCommand[i].iHelp] = 0;
}
}
@ </dl>
blob_reset(&buf);
style_finish_page();
}
/*
** Return true if p is the first line paste the end of
** the previous subcommand.
*/
static int is_subcommand_end(Blob *p, int bAbbrevSubcmd, ReCompiled *pRe){
if( bAbbrevSubcmd ){
int i;
if( re_match(pRe, (unsigned char*)blob_buffer(p), blob_strlen(p)) ){
return 0;
}
if( blob_size(p)<4 ) return 1;
for(i=0; i<4 && blob_buffer(p)[i]==' '; i++){}
return i<4;
}else{
return blob_buffer(p)[0]=='>';
}
}
/*
** Input z[] is help text for zTopic. If zTopic has sub-command zSub,
** then cut out all portions of the original help text that do not
** directly pertain to zSub and write the zSub-relevant parts into
** pOut.
**
** Return the number of lines of z[] written into pOut. A return of
** zero means no simplification occurred.
*/
static int simplify_to_subtopic(
const char *z, /* Full original help text */
Blob *pOut, /* Write simplified help text here */
const char *zTopic, /* TOPIC */
const char *zSubtopic, /* SUBTOPIC */
int bAbbrevSubcmd /* True if z[] contains abbreviated subcommands */
){
Blob in, line; //, subsection;
int n = 0;
char *zQTop = re_quote(zTopic);
char *zQSub = re_quote(zSubtopic);
char *zPattern;
ReCompiled *pRe = 0;
if( bAbbrevSubcmd ){
zPattern = mprintf(" ([a-z]+ ?\\| ?)*%s\\b", zQSub);
}else{
zPattern = mprintf("> ?fossil %s .*\\b%s\\b", zQTop, zQSub);
}
fossil_free(zQTop);
fossil_free(zQSub);
re_compile(&pRe, zPattern, 0);
fossil_free(zPattern);
blob_init(&in, z, -1);
while( blob_line(&in, &line) ){
if( re_match(pRe, (unsigned char*)blob_buffer(&line), blob_strlen(&line)) ){
blob_appendb(pOut, &line);
n++;
while( blob_line(&in, &line)
&& !is_subcommand_end(&line,bAbbrevSubcmd,pRe)
){
blob_appendb(pOut, &line);
n++;
}
if( !bAbbrevSubcmd ) break;
}
}
blob_reset(&line);
re_free(pRe);
if( n ){
blob_trim(pOut);
blob_reset(&in);
}
return n;
}
/*
** Input p is a "Usage:" line or a subcommand line. Simplify this line
** for the --usage option and write it into pOut.
*/
static void simplify_usage_line(
Blob *p,
Blob *pOut,
int bAbbrevSubcmd,
const char *zCmd
){
const char *z = blob_buffer(p);
int sz = blob_size(p);
int i = 0;
if( sz>6 && z[0]=='U' ){
for(i=1; i<sz && !fossil_isspace(z[i]); i++){}
}else if( sz>0 && z[0]=='>' ){
i = 1;
}else if( sz>4 && bAbbrevSubcmd
&& memcmp(z," ",3)==0 && !fossil_isspace(z[3]) ){
int j;
for(j=3; j<sz-1 && (z[j]!=' ' || z[j+1]!=' '); j++){}
blob_appendf(pOut, "fossil %s %.*s\n", zCmd, j-3, &z[3]);
return;
}else{
while( i<sz && fossil_isspace(z[i]) ) i++;
if( i+2<sz && (z[i]=='o' || z[i]=='O') && z[i+1]=='r' ){
while( i<sz && !fossil_isspace(z[i]) ) i++;
}
}
while( i<sz && fossil_isspace(z[i]) ) i++;
blob_append(pOut, &z[i], sz-i);
}
/*
** Input z[] is help text for a command zTopic. Write into pOut all lines of
** z[] that show the command-line syntax for that command. Lines written
** to pOut are lines that begin with out of:
**
** Usage:
** or:
** > fossil TOPIC
**
** Return the number of lines written into pOut.
*/
static int simplify_to_usage(
const char *z, /* Full original help text */
Blob *pOut, /* Write simplified help text here */
const char *zTopic, /* The command for which z[] is full help text */
int bAbbrevSubcmd /* z[] uses abbreviated subcommands */
){
ReCompiled *pRe = 0;
Blob in, line;
int n = 0;
if( bAbbrevSubcmd ){
re_compile(&pRe, "^(Usage: | [a-z][-a-z|]+ .*)", 0);
}else{
re_compile(&pRe, "^(Usage: | *[Oo]r: +%fossi |> ?fossil )", 0);
}
blob_init(&in, z, -1);
while( blob_line(&in, &line) ){
if( re_match(pRe, (unsigned char*)blob_buffer(&line), blob_strlen(&line)) ){
simplify_usage_line(&line, pOut, bAbbrevSubcmd, zTopic);
n++;
}
}
re_free(pRe);
if( n ) blob_trim(pOut);
return n;
}
/*
** Input z[] is help text. Write into pOut all lines of z[] that show
** command-line options. Return the number of lines written.
*/
static int simplify_to_options(
const char *z, /* Full original help text */
Blob *pOut, /* Write simplified help text here */
int bAbbrevSubcmd, /* z[] uses abbreviated subcommands */
const char *zCmd /* Name of the command that z[] describes */
){
ReCompiled *pRe = 0;
Blob txt, line, subsection;
int n = 0;
int bSubsectionSeen = 0;
blob_init(&txt, z, -1);
blob_init(&subsection, 0, 0);
re_compile(&pRe, "^ +-.* ", 0);
while( blob_line(&txt, &line) ){
int len = blob_size(&line);
unsigned char *zLine = (unsigned char *)blob_buffer(&line);
if( re_match(pRe, zLine, len) ){
if( blob_size(&subsection) ){
simplify_usage_line(&subsection, pOut, bAbbrevSubcmd, zCmd);
blob_reset(&subsection);
}
blob_appendb(pOut, &line);
}else if( len>7 && !fossil_isspace(zLine[0]) && bSubsectionSeen
&& sqlite3_strlike("%options:%",blob_str(&line),0)==0 ){
subsection = line;
}else if( !bAbbrevSubcmd && len>9
&& (memcmp(zLine,"> fossil ",9)==0 || memcmp(zLine,"> fossil",9)) ){
subsection = line;
bSubsectionSeen = 1;
}else if( bAbbrevSubcmd && len>5 && memcmp(zLine," ",3)==0
&& fossil_isalpha(zLine[3]) ){
subsection = line;
bSubsectionSeen = 1;
}else if( len>1 && !fossil_isspace(zLine[0]) && bSubsectionSeen ){
blob_reset(&subsection);
}
}
re_free(pRe);
blob_trim(pOut);
blob_reset(&subsection);
return n;
}
|
| ︙ | ︙ | |||
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 |
** fossil options COMMAND SUBCMD Show options specific to SUBCMD
**
** See also: [[help]], [[usage]]
*/
void options_cmd(void){
Blob s1, s2, out;
const char *z;
verify_all_options();
if( g.argc>4 ){
usage("[COMMAND] [SUBCOMMAND]");
}
blob_init(&s1, 0, 0);
if( g.argc==2 ){
fossil_print("%s", zOptions);
return;
}else{
int rc;
| > > < > > | | | | 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 |
** fossil options COMMAND SUBCMD Show options specific to SUBCMD
**
** See also: [[help]], [[usage]]
*/
void options_cmd(void){
Blob s1, s2, out;
const char *z;
const char *zTopic;
int bAbbrevSubcmd = 0;
verify_all_options();
if( g.argc>4 ){
usage("[COMMAND] [SUBCOMMAND]");
}
blob_init(&s1, 0, 0);
if( g.argc==2 ){
fossil_print("%s", zOptions);
return;
}else{
int rc;
const char *zSubtopic = g.argc==4 ? g.argv[3] : 0;
const CmdOrPage *pCmd = 0;
zTopic = g.argv[2];
rc = dispatch_name_search(zTopic, CMDFLAG_COMMAND|CMDFLAG_PREFIX, &pCmd);
if( rc ){
if( rc==1 ){
fossil_print("unknown command: %s\n", zTopic);
}else{
fossil_print("ambiguous command prefix: %s\n", zTopic);
}
return;
}
z = pCmd->zHelp;
if( z==0 ){
fossil_fatal("no help available for the %s", pCmd->zName);
}
bAbbrevSubcmd = (pCmd->eCmdFlags & CMDFLAG_ABBREVSUBCMD)!=0;
if( zSubtopic ){
if( simplify_to_subtopic(z, &s1, zTopic, zSubtopic, bAbbrevSubcmd) ){
z = blob_str(&s1);
}else{
fossil_print("No subcommand \"%s\" for \"%s\".\n", zSubtopic, zTopic);
}
}
}
blob_init(&s2, 0, 0);
simplify_to_options(z, &s2, bAbbrevSubcmd, zTopic);
blob_init(&out, 0, 0);
help_to_text(blob_str(&s2), &out, 1);
fossil_print("%s\n", blob_str(&out));
blob_reset(&out);
blob_reset(&s1);
blob_reset(&s2);
}
/*
|
| ︙ | ︙ | |||
1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 |
void usage_cmd(void){
int rc;
const char *zTopic;
const char *zSubtopic;
const CmdOrPage *pCmd = 0;
Blob s1, s2, out;
const char *z;
verify_all_options();
if( g.argc<3 || g.argc>4 ){
usage("COMMAND [SUBCOMMAND]");
}
zTopic = g.argv[2];
zSubtopic = g.argc==4 ? g.argv[3] : 0;
| > | 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 |
void usage_cmd(void){
int rc;
const char *zTopic;
const char *zSubtopic;
const CmdOrPage *pCmd = 0;
Blob s1, s2, out;
const char *z;
int bAbbrevSubcmd = 0;
verify_all_options();
if( g.argc<3 || g.argc>4 ){
usage("COMMAND [SUBCOMMAND]");
}
zTopic = g.argv[2];
zSubtopic = g.argc==4 ? g.argv[3] : 0;
|
| ︙ | ︙ | |||
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 |
fossil_print("Did you mean one of these TOPICs:\n");
n = dispatch_approx_match(zTopic, 5, az);
for(i=0; i<n; i++){
fossil_print(" * %s\n", az[i]);
}
return;
}
z = pCmd->zHelp;
if( z==0 ){
fossil_fatal("no help available for the %s", pCmd->zName);
}
blob_init(&s1, 0, 0);
blob_init(&s2, 0, 0);
if( zSubtopic!=0 ){
| > | | | | 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 |
fossil_print("Did you mean one of these TOPICs:\n");
n = dispatch_approx_match(zTopic, 5, az);
for(i=0; i<n; i++){
fossil_print(" * %s\n", az[i]);
}
return;
}
bAbbrevSubcmd = (pCmd->eCmdFlags & CMDFLAG_ABBREVSUBCMD)!=0;
z = pCmd->zHelp;
if( z==0 ){
fossil_fatal("no help available for the %s", pCmd->zName);
}
blob_init(&s1, 0, 0);
blob_init(&s2, 0, 0);
if( zSubtopic!=0 ){
if( simplify_to_subtopic(z, &s1, zTopic, zSubtopic, bAbbrevSubcmd) ){
z = blob_str(&s1);
}else{
fossil_print("No subcommand \"%s\" for \"%s\".\n", zSubtopic, zTopic);
}
}
if( simplify_to_usage(z, &s2, zTopic, bAbbrevSubcmd) ){
z = blob_str(&s2);
}
blob_init(&out, 0, 0);
help_to_text(z, &out, 1);
fossil_print("%s\n", blob_str(&out));
blob_reset(&out);
blob_reset(&s1);
blob_reset(&s2);
}
/*
|
| ︙ | ︙ | |||
1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 |
int bUsage; /* --usage */
int bRaw; /* --raw option */
int bOptions; /* --options */
const char *zTopic; /* TOPIC argument */
const char *zSubtopic = 0; /* SUBTOPIC argument */
Blob subtext1, subtext2, s3; /* Subsets of z[] containing subtopic/usage */
Blob txt; /* Text after rendering */
verboseFlag = find_option("verbose","v",0)!=0;
commandsFlag = find_option("commands","c",0)!=0;
useHtml = find_option("html","h",0)!=0;
bRaw = find_option("raw",0,0)!=0;
bOptions = find_option("options","o",0)!=0;
bUsage = find_option("usage","u",0)!=0;
| > | 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 |
int bUsage; /* --usage */
int bRaw; /* --raw option */
int bOptions; /* --options */
const char *zTopic; /* TOPIC argument */
const char *zSubtopic = 0; /* SUBTOPIC argument */
Blob subtext1, subtext2, s3; /* Subsets of z[] containing subtopic/usage */
Blob txt; /* Text after rendering */
int bAbbrevSubcmd = 0; /* Help text uses abbreviated subcommands */
verboseFlag = find_option("verbose","v",0)!=0;
commandsFlag = find_option("commands","c",0)!=0;
useHtml = find_option("html","h",0)!=0;
bRaw = find_option("raw",0,0)!=0;
bOptions = find_option("options","o",0)!=0;
bUsage = find_option("usage","u",0)!=0;
|
| ︙ | ︙ | |||
1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 |
fossil_print(" fossil search -h PATTERN ;# search all help text\n");
fossil_print(" fossil help -a ;# show all commands\n");
fossil_print(" fossil help -w ;# show all web-pages\n");
fossil_print(" fossil help -s ;# show all settings\n");
fossil_print(" fossil help -o ;# show global options\n");
return;
}
z = pCmd->zHelp;
if( z==0 ){
fossil_fatal("no help available for the %s %s",
pCmd->zName, zCmdOrPage);
}
blob_init(&subtext1, 0, 0);
blob_init(&subtext2, 0, 0);
blob_init(&s3, 0, 0);
if( zSubtopic!=0 ){
| > | | > | | > > | > | | | | 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 |
fossil_print(" fossil search -h PATTERN ;# search all help text\n");
fossil_print(" fossil help -a ;# show all commands\n");
fossil_print(" fossil help -w ;# show all web-pages\n");
fossil_print(" fossil help -s ;# show all settings\n");
fossil_print(" fossil help -o ;# show global options\n");
return;
}
bAbbrevSubcmd = (pCmd->eCmdFlags & CMDFLAG_ABBREVSUBCMD)!=0;
z = pCmd->zHelp;
if( z==0 ){
fossil_fatal("no help available for the %s %s",
pCmd->zName, zCmdOrPage);
}
blob_init(&subtext1, 0, 0);
blob_init(&subtext2, 0, 0);
blob_init(&s3, 0, 0);
if( zSubtopic!=0 ){
if( simplify_to_subtopic(z, &subtext1, zTopic, zSubtopic, bAbbrevSubcmd) ){
z = blob_str(&subtext1);
}else{
fossil_print("No subtopic \"%s\" for \"%s\".\n", zTopic, zSubtopic);
if( strstr(z, "Usage:")!=0 || strstr(z, "\n> ?fossil")!=0 ){
bUsage = 1;
}
}
}
if( bUsage ){
if( simplify_to_usage(z, &subtext2, zTopic, bAbbrevSubcmd) ){
z = blob_str(&subtext2);
}else{
bUsage = 0;
}
}
if( bOptions ){
simplify_to_options(z, &s3, bAbbrevSubcmd, zTopic);
z = blob_str(&s3);
}
if( pCmd && pCmd->eCmdFlags & CMDFLAG_SETTING ){
const Setting *pSetting = db_find_setting(pCmd->zName, 0);
char *zDflt = 0;
if( pSetting!=0 && pSetting->def!=0 && *pSetting->def!=0 ){
zDflt = mprintf(" (default: %s)", pSetting->def);
}
fossil_print("Setting: \"%s\"%s%s\n\n",
pCmd->zName, zDflt!=0 ? zDflt : "",
(pCmd->eCmdFlags & CMDFLAG_VERSIONABLE)!=0 ? " (versionable)" : ""
);
fossil_free(zDflt);
}
blob_init(&txt, 0, 0);
if( bRaw ){
blob_append(&txt, z, -1);
}else if( useHtml ){
help_to_html(z, &txt);
}else{
help_to_text(z, &txt, bUsage);
}
if( blob_strlen(&txt)>0 ) fossil_print("%s\n", blob_str(&txt));
blob_reset(&txt);
blob_reset(&subtext1);
blob_reset(&subtext2);
}
/*
** Return a pointer to the setting information array.
|
| ︙ | ︙ | |||
1770 1771 1772 1773 1774 1775 1776 |
break;
case 3: /* helptext */
sqlite3_result_text(ctx, pPage->zHelp, -1, SQLITE_STATIC);
break;
case 4: { /* formatted */
Blob txt;
blob_init(&txt, 0, 0);
| | | 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 |
break;
case 3: /* helptext */
sqlite3_result_text(ctx, pPage->zHelp, -1, SQLITE_STATIC);
break;
case 4: { /* formatted */
Blob txt;
blob_init(&txt, 0, 0);
help_to_text(pPage->zHelp, &txt, 0);
sqlite3_result_text(ctx, blob_str(&txt), -1, fossil_free);
break;
}
case 5: { /* formatted */
Blob txt;
blob_init(&txt, 0, 0);
help_to_html(pPage->zHelp, &txt);
|
| ︙ | ︙ |
Changes to src/hook.c.
| ︙ | ︙ | |||
196 197 198 199 200 201 202 | /* ** COMMAND: hook* ** ** Usage: %fossil hook COMMAND ... ** ** Commands include: ** | | | | | | | | 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | /* ** COMMAND: hook* ** ** Usage: %fossil hook COMMAND ... ** ** Commands include: ** ** > fossil hook add --command COMMAND --type TYPE --sequence NUMBER ** ** Create a new hook. The --command and --type arguments are ** required. --sequence is optional. ** ** > fossil hook delete ID ... ** ** Delete one or more hooks by their IDs. ID can be "all" ** to delete all hooks. Caution: There is no "undo" for ** this operation. Deleted hooks are permanently lost. ** ** > fossil hook edit --command COMMAND --type TYPE --sequence NUMBER ID ... ** ** Make changes to one or more existing hooks. The ID argument ** is either a hook-id, or a list of hook-ids, or the keyword ** "all". For example, to disable hook number 2, use: ** ** fossil hook edit --type disabled 2 ** ** > fossil hook list ** ** Show all current hooks ** ** > fossil hook status ** ** Print the values of CONFIG table entries that are relevant to ** hook processing. Used for debugging. ** ** > fossil hook test [OPTIONS] ID ** ** Run the hook script given by ID for testing purposes. ** Options: ** ** --dry-run Print the script on stdout rather than run it ** --base-rcvid N Pretend that the hook-last-rcvid value is N ** --new-rcvid M Pretend that the last rcvid value is M |
| ︙ | ︙ |
Changes to src/http_ssl.c.
| ︙ | ︙ | |||
908 909 910 911 912 913 914 |
static void trust_location_usable(const char *zPath, const char **pzStore){
if( *pzStore!=0 ) return;
if( file_isdir(zPath, ExtFILE)>0 ) *pzStore = zPath;
}
#endif /* FOSSIL_ENABLE_SSL */
/*
| | | | | | | | | | | | 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
static void trust_location_usable(const char *zPath, const char **pzStore){
if( *pzStore!=0 ) return;
if( file_isdir(zPath, ExtFILE)>0 ) *pzStore = zPath;
}
#endif /* FOSSIL_ENABLE_SSL */
/*
** COMMAND: tls-config* abbreviated-subcommands
** COMMAND: ssl-config abbreviated-subcommands
**
** Usage: %fossil ssl-config [SUBCOMMAND] [OPTIONS...] [ARGS...]
**
** This command is used to view or modify the TLS (Transport Layer
** Security) configuration for Fossil. TLS (formerly SSL) is the
** encryption technology used for secure HTTPS transport.
**
** Sub-commands:
**
** remove-exception DOMAINS Remove TLS cert exceptions for the domains
** listed. Or remove them all if the --all
** option is specified.
**
** scrub ?--force? Remove all SSL configuration data from the
** repository. Use --force to omit the
** confirmation.
**
** show ?-v? Show the TLS configuration. Add -v to see
** additional explanation
*/
void test_tlsconfig_info(void){
const char *zCmd;
size_t nCmd;
int nHit = 0;
db_find_and_open_repository(OPEN_OK_NOT_FOUND|OPEN_SUBSTITUTE,0);
|
| ︙ | ︙ |
Changes to src/interwiki.c.
| ︙ | ︙ | |||
159 160 161 162 163 164 165 | ** COMMAND: interwiki* ** ** Usage: %fossil interwiki COMMAND ... ** ** Manage the "intermap" that defines the mapping from interwiki tags ** to complete URLs for interwiki links. ** | | | | | 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
** COMMAND: interwiki*
**
** Usage: %fossil interwiki COMMAND ...
**
** Manage the "intermap" that defines the mapping from interwiki tags
** to complete URLs for interwiki links.
**
** > fossil interwiki delete TAG ...
**
** Delete one or more interwiki maps.
**
** > fossil interwiki edit TAG --base URL --hash PATH --wiki PATH
**
** Create an interwiki referenced call TAG. The base URL is
** the --base option, which is required. The --hash and --wiki
** paths are optional. The TAG must be lower-case alphanumeric
** and must be unique. A new entry is created if it does not
** already exit.
**
** > fossil interwiki list
**
** Show all interwiki mappings.
*/
void interwiki_cmd(void){
const char *zCmd;
int nCmd;
db_find_and_open_repository(0, 0);
|
| ︙ | ︙ |
Changes to src/rebuild.c.
| ︙ | ︙ | |||
1412 1413 1414 1415 1416 1417 1418 |
zPassword);
hash_user_password(g.zLogin);
}
/*
** COMMAND: deconstruct*
**
| | | 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 |
zPassword);
hash_user_password(g.zLogin);
}
/*
** COMMAND: deconstruct*
**
** Usage: %fossil deconstruct ?OPTIONS? DESTINATION
**
** This command exports all artifacts of a given repository and writes all
** artifacts to the file system. The DESTINATION directory will be populated
** with subdirectories AA and files AA/BBBBBBBBB.., where AABBBBBBBBB.. is the
** 40+ character artifact ID, AA the first 2 characters.
** If -L|--prefixlength is given, the length (default 2) of the directory prefix
** can be set to 0,1,..,9 characters.
|
| ︙ | ︙ |
Changes to src/search.c.
| ︙ | ︙ | |||
2289 2290 2291 2292 2293 2294 2295 |
if( db_table_exists("repository","chat") ){
chat_rebuild_index(1);
}
fossil_print(" done\n");
}
/*
| | | | | | | | | | | | | | 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 |
if( db_table_exists("repository","chat") ){
chat_rebuild_index(1);
}
fossil_print(" done\n");
}
/*
** COMMAND: fts-config* abbreviated-subcommands
**
** Usage: fossil fts-config ?SUBCOMMAND? ?ARGUMENT?
**
** The "fossil fts-config" command configures the full-text search capabilities
** of the repository. Subcommands:
**
** reindex Rebuild the search index. This is a no-op if
** index search is disabled
**
** index (on|off) Turn the search index on or off
**
** enable TYPE .. Enable search for TYPE. TYPE is one of:
** check-in, document, ticket, wiki, technote,
** forum, help, or all
**
** disable TYPE ... Disable search for TYPE
**
** tokenizer VALUE Select a tokenizer for indexed search. VALUE
** may be one of (porter, on, off, trigram, unicode61),
** and "on" is equivalent to "porter". Unindexed
** search never uses tokenization or stemming.
**
** The current search settings are displayed after any changes are applied.
** Run this command with no arguments to simply see the settings.
*/
void fts_config_cmd(void){
static const struct {
int iCmd;
|
| ︙ | ︙ |
Changes to src/unversioned.c.
| ︙ | ︙ | |||
216 217 218 219 220 221 222 |
if( fossil_isspace(zName[0]) ) return 1;
zName++;
}
return 0;
}
/*
| | | | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
if( fossil_isspace(zName[0]) ) return 1;
zName++;
}
return 0;
}
/*
** COMMAND: uv# abbreviated-subcommands
** COMMAND: unversioned abbreviated-subcommands
**
** Usage: %fossil unversioned SUBCOMMAND ARGS...
** or: %fossil uv SUBCOMMAND ARGS..
**
** Unversioned files (UV-files) are artifacts that are synced and are available
** for download but which do not preserve history. Only the most recent version
** of each UV-file is retained. Changes to an UV-file are permanent and cannot
|
| ︙ | ︙ |
Changes to src/user.c.
| ︙ | ︙ | |||
329 330 331 332 333 334 335 | ** Query or set contact information for user USERNAME ** ** > fossil user default ?USERNAME? ** ** Query or set the default user. The default user is the ** user for command-line interaction. ** | | < | 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | ** Query or set contact information for user USERNAME ** ** > fossil user default ?USERNAME? ** ** Query or set the default user. The default user is the ** user for command-line interaction. ** ** > fossil user list | ls ** ** List all users known to the repository ** ** > fossil user new ?USERNAME? ?CONTACT-INFO? ?PASSWORD? ** ** Create a new user in the repository. Users can never be ** deleted. They can be denied all access but they must continue |
| ︙ | ︙ |
Changes to tools/mkindex.c.
| ︙ | ︙ | |||
98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */
#define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret webpage content */
#define CMDFLAG_SENSITIVE 0x0400 /* Security-sensitive setting */
#define CMDFLAG_HIDDEN 0x0800 /* Elide from most listings */
#define CMDFLAG_LDAVG_EXEMPT 0x1000 /* Exempt from load_control() */
#define CMDFLAG_ALIAS 0x2000 /* Command aliases */
#define CMDFLAG_KEEPEMPTY 0x4000 /* Do not unset empty settings */
/**************************************************************************/
/*
** Each entry looks like this:
*/
typedef struct Entry {
int eType; /* CMDFLAG_* values */
| > | 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */
#define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret webpage content */
#define CMDFLAG_SENSITIVE 0x0400 /* Security-sensitive setting */
#define CMDFLAG_HIDDEN 0x0800 /* Elide from most listings */
#define CMDFLAG_LDAVG_EXEMPT 0x1000 /* Exempt from load_control() */
#define CMDFLAG_ALIAS 0x2000 /* Command aliases */
#define CMDFLAG_KEEPEMPTY 0x4000 /* Do not unset empty settings */
#define CMDFLAG_ABBREVSUBCMD 0x8000 /* Abbreviated subcmd in help text */
/**************************************************************************/
/*
** Each entry looks like this:
*/
typedef struct Entry {
int eType; /* CMDFLAG_* values */
|
| ︙ | ︙ | |||
278 279 280 281 282 283 284 285 286 287 288 289 290 291 |
aEntry[nUsed].zDflt = string_dup(&zLine[i+8], j-8);
}else if( j>9 && strncmp(&zLine[i], "variable=", 9)==0 ){
aEntry[nUsed].zVar = string_dup(&zLine[i+9], j-9);
}else if( j==6 && strncmp(&zLine[i], "hidden", 6)==0 ){
aEntry[nUsed].eType |= CMDFLAG_HIDDEN;
}else if( j==14 && strncmp(&zLine[i], "loadavg-exempt", 14)==0 ){
aEntry[nUsed].eType |= CMDFLAG_LDAVG_EXEMPT;
}else{
fprintf(stderr, "%s:%d: unknown option: '%.*s'\n",
zFile, nLine, j, &zLine[i]);
nErr++;
}
}
| > > | 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
aEntry[nUsed].zDflt = string_dup(&zLine[i+8], j-8);
}else if( j>9 && strncmp(&zLine[i], "variable=", 9)==0 ){
aEntry[nUsed].zVar = string_dup(&zLine[i+9], j-9);
}else if( j==6 && strncmp(&zLine[i], "hidden", 6)==0 ){
aEntry[nUsed].eType |= CMDFLAG_HIDDEN;
}else if( j==14 && strncmp(&zLine[i], "loadavg-exempt", 14)==0 ){
aEntry[nUsed].eType |= CMDFLAG_LDAVG_EXEMPT;
}else if( j==23 && strncmp(&zLine[i], "abbreviated-subcommands", 23)==0 ){
aEntry[nUsed].eType |= CMDFLAG_ABBREVSUBCMD;
}else{
fprintf(stderr, "%s:%d: unknown option: '%.*s'\n",
zFile, nLine, j, &zLine[i]);
nErr++;
}
}
|
| ︙ | ︙ |