Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | New setting "verify-comments" defaults to on, but can be turned off to prevent checkin comment sanity checking. This setting does not appear in the "fossil settings" list unless it differs from the default, or unless the "--extra" argument is added to "fossil settings". |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
8f4aedcf849a1a68eaab1d53c13d8400 |
| User & Date: | drh 2025-03-16 22:40:27.120 |
Context
|
2025-03-16
| ||
| 22:44 | Honor the show-only-if-changed flag for boolean settings on the /setup_settings page in addition to in the "settings" command. check-in: 3ba0763bfc user: drh tags: trunk | |
| 22:40 | New setting "verify-comments" defaults to on, but can be turned off to prevent checkin comment sanity checking. This setting does not appear in the "fossil settings" list unless it differs from the default, or unless the "--extra" argument is added to "fossil settings". check-in: 8f4aedcf84 user: drh tags: trunk | |
| 19:15 | Add the "fossil which" command, which even works on Windows. Enhance the fossil_text_editor() function so that it looks for common text editor names if it does not find a user-specified preference. check-in: fc60e44417 user: drh tags: trunk | |
Changes
Changes to src/alerts.c.
| ︙ | ︙ | |||
1257 1258 1259 1260 1261 1262 1263 |
}
db_set(pSetting->name/*works-like:""*/, g.argv[4], isGlobal);
g.argc = 3;
}
pSetting = setting_info(&nSetting);
for(; nSetting>0; nSetting--, pSetting++ ){
if( strncmp(pSetting->name,"email-",6)!=0 ) continue;
| | | | 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 |
}
db_set(pSetting->name/*works-like:""*/, g.argv[4], isGlobal);
g.argc = 3;
}
pSetting = setting_info(&nSetting);
for(; nSetting>0; nSetting--, pSetting++ ){
if( strncmp(pSetting->name,"email-",6)!=0 ) continue;
print_setting(pSetting, 0, 0);
}
}else
if( strncmp(zCmd, "status", nCmd)==0 ){
Stmt q;
int iCutoff;
int nSetting, n;
static const char *zFmt = "%-29s %d\n";
const Setting *pSetting = setting_info(&nSetting);
db_open_config(1, 0);
verify_all_options();
if( g.argc!=3 ) usage("status");
pSetting = setting_info(&nSetting);
for(; nSetting>0; nSetting--, pSetting++ ){
if( strncmp(pSetting->name,"email-",6)!=0 ) continue;
print_setting(pSetting, 0, 0);
}
n = db_int(0,"SELECT count(*) FROM pending_alert WHERE NOT sentSep");
fossil_print(zFmt/*works-like:"%s%d"*/, "pending-alerts", n);
n = db_int(0,"SELECT count(*) FROM pending_alert WHERE NOT sentDigest");
fossil_print(zFmt/*works-like:"%s%d"*/, "pending-digest-alerts", n);
db_prepare(&q,
"SELECT"
|
| ︙ | ︙ |
Changes to src/checkin.c.
| ︙ | ︙ | |||
2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 |
*/
static int tagCmp(const void *a, const void *b){
char **pA = (char**)a;
char **pB = (char**)b;
return fossil_strcmp(pA[0], pB[0]);
}
/*
** Check for possible formatting errors in the comment string pComment.
** If found, write a description of the problem(s) into pSus and return
** true. If everything looks ok, return false.
*/
static int suspicious_comment(Blob *pComment, Blob *pSus){
char *zStart = blob_str(pComment);
char *z;
char *zEnd, *zEnd2;
char *zSep;
char cSave1;
int nIssue = 0;
z = zStart;
blob_init(pSus, 0, 0);
while( (z = strchr(z,'['))!=0 ){
zEnd = strchr(z,']');
if( zEnd==0 ){
blob_appendf(pSus,"\n (%d) ", ++nIssue);
blob_appendf(pSus, "Unterminated hyperlink \"%.12s...\"", z);
| > > > > > > > > > > > > | 2280 2281 2282 2283 2284 2285 2286 2287 2288 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 |
*/
static int tagCmp(const void *a, const void *b){
char **pA = (char**)a;
char **pB = (char**)b;
return fossil_strcmp(pA[0], pB[0]);
}
/*
** SETTING: verify-comments boolean default=on show-only-if-changed
**
** If enabled (the default) then the "fossil commit" command does sanity
** checking on the checkin comment. The sanity checks can be overridden
** on a case by case basis using the --allow-suspect-comment option to
** the "fossil commit" command. If disabled, this setting makes every
** "fossil commit" behave as if the --allow-suspect-comment option were
** provided.
*/
/*
** Check for possible formatting errors in the comment string pComment.
** If found, write a description of the problem(s) into pSus and return
** true. If everything looks ok, return false.
*/
static int suspicious_comment(Blob *pComment, Blob *pSus){
char *zStart = blob_str(pComment);
char *z;
char *zEnd, *zEnd2;
char *zSep;
char cSave1;
int nIssue = 0;
if( !db_get_boolean("verify-comments",1) ) return 0;
z = zStart;
blob_init(pSus, 0, 0);
while( (z = strchr(z,'['))!=0 ){
zEnd = strchr(z,']');
if( zEnd==0 ){
blob_appendf(pSus,"\n (%d) ", ++nIssue);
blob_appendf(pSus, "Unterminated hyperlink \"%.12s...\"", z);
|
| ︙ | ︙ |
Changes to src/db.c.
| ︙ | ︙ | |||
4438 4439 4440 4441 4442 4443 4444 | info_cmd(); } /* ** Print the current value of a setting identified by the pSetting ** pointer. */ | | > > > | > > > > > > | > > | 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 |
info_cmd();
}
/*
** Print the current value of a setting identified by the pSetting
** pointer.
*/
void print_setting(const Setting *pSetting, int valueOnly, int bAlways){
Stmt q;
int versioned = 0;
if( !pSetting->bIfChng ) bAlways = 1;
if( pSetting->versionable && g.localOpen ){
/* Check to see if this is overridden by a versionable settings file */
Blob versionedPathname;
blob_zero(&versionedPathname);
blob_appendf(&versionedPathname, "%s.fossil-settings/%s",
g.zLocalRoot, pSetting->name);
if( file_size(blob_str(&versionedPathname), ExtFILE)>=0 ){
versioned = 1;
}
blob_reset(&versionedPathname);
}
if( valueOnly && versioned ){
const char *zVal = db_get_versioned(pSetting->name, NULL, NULL);
if( bAlways || (zVal!=0 && fossil_strcmp(zVal, pSetting->def)!=0) ){
fossil_print("%s\n", db_get_versioned(pSetting->name, NULL, NULL));
}else{
versioned = 0;
}
return;
}
if( g.repositoryOpen ){
db_prepare(&q,
"SELECT '(local)', value FROM config WHERE name=%Q"
" UNION ALL "
"SELECT '(global)', value FROM global_config WHERE name=%Q",
pSetting->name, pSetting->name
);
}else{
db_prepare(&q,
"SELECT '(global)', value FROM global_config WHERE name=%Q",
pSetting->name
);
}
if( db_step(&q)==SQLITE_ROW ){
const char *zVal = db_column_text(&q,1);
if( !bAlways && (zVal==0 || fossil_strcmp(zVal, pSetting->def)==0) ){
/* Don't display because the value is equal to the default */
}else if( valueOnly ){
fossil_print("%s\n", db_column_text(&q, 1));
}else{
fossil_print("%-20s %-8s %s\n", pSetting->name, db_column_text(&q, 0),
db_column_text(&q, 1));
}
}else if( !bAlways ){
/* Display nothing */
}else if( valueOnly ){
fossil_print("\n");
}else{
fossil_print("%-20s\n", pSetting->name);
}
if( versioned ){
fossil_print(" (overridden by contents of file .fossil-settings/%s)\n",
|
| ︙ | ︙ | |||
4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 |
const char *var; /* Internal variable name used by db_set() */
int width; /* Width of display. 0 for boolean values and
** negative for values which should not appear
** on the /setup_settings page. */
char versionable; /* Is this setting versionable? */
char forceTextArea; /* Force using a text area for display? */
char sensitive; /* True if this a security-sensitive setting */
const char *def; /* Default value */
};
#endif /* INTERFACE */
/*
** SETTING: access-log boolean default=off
**
** When the access-log setting is enabled, all login attempts (successful
** and unsuccessful) on the web interface are recorded in the "access" table
| > > | 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 |
const char *var; /* Internal variable name used by db_set() */
int width; /* Width of display. 0 for boolean values and
** negative for values which should not appear
** on the /setup_settings page. */
char versionable; /* Is this setting versionable? */
char forceTextArea; /* Force using a text area for display? */
char sensitive; /* True if this a security-sensitive setting */
char bIfChng; /* Only display if value differs from default */
const char *def; /* Default value */
};
#endif /* INTERFACE */
/*
** SETTING: access-log boolean default=off
**
** When the access-log setting is enabled, all login attempts (successful
** and unsuccessful) on the web interface are recorded in the "access" table
|
| ︙ | ︙ | |||
5214 5215 5216 5217 5218 5219 5220 5221 5222 | ** that applies to all repositories. The local values are stored in the ** "config" table of the repository and the global values are stored in the ** configuration database. If both a local and a global value exists for a ** setting, the local value takes precedence. This command normally operates ** on the local settings. Use the --global option to change global settings. ** ** Options: ** --global Set or unset the given property globally instead of ** setting or unsetting it for the open repository only | > > > < > | 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 |
** that applies to all repositories. The local values are stored in the
** "config" table of the repository and the global values are stored in the
** configuration database. If both a local and a global value exists for a
** setting, the local value takes precedence. This command normally operates
** on the local settings. Use the --global option to change global settings.
**
** Options:
** --exact Only consider exact name matches
** --extra When listing settings, show them all, even those that are
** normally only shown if there values are different from default
** --global Set or unset the given property globally instead of
** setting or unsetting it for the open repository only
** --value Only show the value of a given property (implies --exact)
**
** See also: [[configuration]]
*/
void setting_cmd(void){
int i;
int globalFlag = find_option("global","g",0)!=0;
int exactFlag = find_option("exact",0,0)!=0;
int extraFlag = find_option("extra",0,0)!=0;
int valueFlag = find_option("value",0,0)!=0;
/* Undocumented "--test-for-subsystem SUBSYS" option used to test
** the db_get_for_subsystem() interface: */
const char *zSubsys = find_option("test-for-subsystem",0,1);
int unsetFlag = g.argv[1][0]=='u';
int nSetting;
const Setting *aSetting = setting_info(&nSetting);
|
| ︙ | ︙ | |||
5253 5254 5255 5256 5257 5258 5259 |
fossil_fatal("--value is only supported when qurying a given property");
}
exactFlag = 1;
}
if( g.argc==2 ){
for(i=0; i<nSetting; i++){
| | | 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 |
fossil_fatal("--value is only supported when qurying a given property");
}
exactFlag = 1;
}
if( g.argc==2 ){
for(i=0; i<nSetting; i++){
print_setting(&aSetting[i], 0, extraFlag);
}
}else if( g.argc==3 || g.argc==4 ){
const char *zName = g.argv[2];
int n = (int)strlen(zName);
const Setting *pSetting = db_find_setting(zName, !exactFlag);
if( pSetting==0 ){
fossil_fatal("no such setting: %s", zName);
|
| ︙ | ︙ | |||
5308 5309 5310 5311 5312 5313 5314 |
fossil_print("%s (subsystem %s) ->", pSetting->name, zSubsys);
if( zValue ){
fossil_print(" [%s]", zValue);
fossil_free(zValue);
}
fossil_print("\n");
}else{
| | | 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 |
fossil_print("%s (subsystem %s) ->", pSetting->name, zSubsys);
if( zValue ){
fossil_print(" [%s]", zValue);
fossil_free(zValue);
}
fossil_print("\n");
}else{
print_setting(pSetting, valueFlag, extraFlag);
}
pSetting++;
}
}
}else{
usage("?PROPERTY? ?VALUE? ?-global?");
}
|
| ︙ | ︙ |
Changes to tools/mkindex.c.
| ︙ | ︙ | |||
83 84 85 86 87 88 89 | #include <assert.h> #include <string.h> /*************************************************************************** ** These macros must match similar macros in dispatch.c. ** ** Allowed values for CmdOrPage.eCmdFlags. */ | | | | | | | | | | | | | | | | | > | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#include <assert.h>
#include <string.h>
/***************************************************************************
** These macros must match similar macros in dispatch.c.
**
** Allowed values for CmdOrPage.eCmdFlags. */
#define CMDFLAG_1ST_TIER 0x00001 /* Most important commands */
#define CMDFLAG_2ND_TIER 0x00002 /* Obscure and seldom used commands */
#define CMDFLAG_TEST 0x00004 /* Commands for testing only */
#define CMDFLAG_WEBPAGE 0x00008 /* Web pages */
#define CMDFLAG_COMMAND 0x00010 /* A command */
#define CMDFLAG_SETTING 0x00020 /* A setting */
#define CMDFLAG_VERSIONABLE 0x00040 /* A versionable setting */
#define CMDFLAG_BLOCKTEXT 0x00080 /* Multi-line text setting */
#define CMDFLAG_BOOLEAN 0x00100 /* A boolean setting */
#define CMDFLAG_RAWCONTENT 0x00200 /* Do not interpret webpage content */
#define CMDFLAG_SENSITIVE 0x00400 /* Security-sensitive setting */
#define CMDFLAG_HIDDEN 0x00800 /* Elide from most listings */
#define CMDFLAG_LDAVG_EXEMPT 0x01000 /* Exempt from load_control() */
#define CMDFLAG_ALIAS 0x02000 /* Command aliases */
#define CMDFLAG_KEEPEMPTY 0x04000 /* Do not unset empty settings */
#define CMDFLAG_ABBREVSUBCMD 0x08000 /* Abbreviated subcmd in help text */
#define CMDFLAG_IFCHNG 0x10000 /* Show settting only if not default */
/**************************************************************************/
/*
** Each entry looks like this:
*/
typedef struct Entry {
int eType; /* CMDFLAG_* values */
|
| ︙ | ︙ | |||
281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
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++;
}
}
| > > | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
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 if( j==20 && strncmp(&zLine[i], "show-only-if-changed", 20)==0 ){
aEntry[nUsed].eType |= CMDFLAG_IFCHNG;
}else{
fprintf(stderr, "%s:%d: unknown option: '%.*s'\n",
zFile, nLine, j, &zLine[i]);
nErr++;
}
}
|
| ︙ | ︙ | |||
513 514 515 516 517 518 519 |
}
printf(" { \"%s\",%*s", z, (int)(20-strlen(z)), "");
if( zVar ){
printf(" \"%s\",%*s", zVar, (int)(15-strlen(zVar)), "");
}else{
printf(" 0,%*s", 16, "");
}
| | > | | 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 |
}
printf(" { \"%s\",%*s", z, (int)(20-strlen(z)), "");
if( zVar ){
printf(" \"%s\",%*s", zVar, (int)(15-strlen(zVar)), "");
}else{
printf(" 0,%*s", 16, "");
}
printf(" %3d, %d, %d, %d, %d, \"%s\"%*s },\n",
aEntry[i].iWidth,
(aEntry[i].eType & CMDFLAG_VERSIONABLE)!=0,
(aEntry[i].eType & CMDFLAG_BLOCKTEXT)!=0,
(aEntry[i].eType & CMDFLAG_SENSITIVE)!=0,
(aEntry[i].eType & CMDFLAG_IFCHNG)!=0,
zDef, (int)(10-strlen(zDef)), ""
);
if( aEntry[i].zIf ){
printf("#endif\n");
}
}
printf("{0,0,0,0,0,0,0,0}};\n");
}
/*
** Process a single file of input
*/
void process_file(void){
|
| ︙ | ︙ |