Check-in [74a5e10b9b]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Improvements to settings: (1) add the --changed option to the "fossil settings" command to cause display of only settings whose value differs from the default. (2) omit the idea of settings that are only shown if their value is not the default. (3) For settings with multiple lines of text, show them indented after the setting name on the "fossil settings" output. (4) The /setup_settings page only shows changed settings by default, with a submenu option to show all settings.
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 74a5e10b9b281f1724f3b96572b3234719d583d5543c2903792dffcffdffd54c
User & Date: drh 2025-03-20 17:20:23.903
Context
2025-03-20
17:34
Change default values of various settings: admin-log=ON, access-log=ON, authsync=ON, timeline-plaintext=OFF. check-in: bdf12f44e6 user: drh tags: trunk
17:20
Improvements to settings: (1) add the --changed option to the "fossil settings" command to cause display of only settings whose value differs from the default. (2) omit the idea of settings that are only shown if their value is not the default. (3) For settings with multiple lines of text, show them indented after the setting name on the "fossil... check-in: 74a5e10b9b user: drh tags: trunk
2025-03-19
18:03
Correctly round up fully expanded date/times even if they have a "Z" zulu-time indicator at the end. Fix for the issue identified in [forum:/forumpost/47082fbda8|forum post 47082fbda8] check-in: e588ee26b1 user: drh tags: trunk
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/allrepo.c.
314
315
316
317
318
319
320

321
322
323
324
325
326
327
    }
  }else if( fossil_strcmp(zCmd, "repack")==0 ){
    zCmd = "repack";
  }else if( fossil_strcmp(zCmd, "set")==0
            || fossil_strcmp(zCmd, "setting")==0
            || fossil_strcmp(zCmd, "settings")==0 ){
    zCmd = "settings -R";

    collect_argv(&extra, 3);
  }else if( fossil_strcmp(zCmd, "unset")==0 ){
    zCmd = "unset -R";
    collect_argv(&extra, 3);
  }else if( fossil_strcmp(zCmd, "fts-config")==0 ){
    zCmd = "fts-config -R";
    collect_argv(&extra, 3);







>







314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
    }
  }else if( fossil_strcmp(zCmd, "repack")==0 ){
    zCmd = "repack";
  }else if( fossil_strcmp(zCmd, "set")==0
            || fossil_strcmp(zCmd, "setting")==0
            || fossil_strcmp(zCmd, "settings")==0 ){
    zCmd = "settings -R";
    collect_argument(&extra, "changed", 0);
    collect_argv(&extra, 3);
  }else if( fossil_strcmp(zCmd, "unset")==0 ){
    zCmd = "unset -R";
    collect_argv(&extra, 3);
  }else if( fossil_strcmp(zCmd, "fts-config")==0 ){
    zCmd = "fts-config -R";
    collect_argv(&extra, 3);
Changes to src/checkin.c.
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
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          width=8 default=on if-chng
**
** This setting determines how much sanity checking, if any, the 
** "fossil commit" and "fossil amend" commands do against check-in
** comments. Recognized values:
**
**     on             (Default) Check for bad syntax in check-in comments
**                    and offer the user a chance to continue editing for







|







2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
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                              width=8 default=on
**
** This setting determines how much sanity checking, if any, the 
** "fossil commit" and "fossil amend" commands do against check-in
** comments. Recognized values:
**
**     on             (Default) Check for bad syntax in check-in comments
**                    and offer the user a chance to continue editing for
Changes to src/db.c.
4437
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
  g.argc = 2;
  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 ){







>
>
>
>
>

|


<













|







4437
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
  g.argc = 2;
  info_cmd();
}

/*
** Print the current value of a setting identified by the pSetting
** pointer.
**
** Only show the value, not the setting name, if valueOnly is true.
**
** Show nothing if bIfChng is true and the setting is not currently set
** or is set to its default value.
*/
void print_setting(const Setting *pSetting, int valueOnly, int bIfChng){
  Stmt q;
  int versioned = 0;

  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( !bIfChng || (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 ){
4477
4478
4479
4480
4481
4482
4483

4484
4485













4486
4487
4488
4489
4490















4491



4492
4493

4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
    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",
                 pSetting->name);
  }
  db_finalize(&q);
}







>
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>



|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
|

>



|







4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
    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);
    int noShow = 0;
    if( bIfChng ){
      /* Don't display the value is equal to the default */
      if( zVal==0 ){
        noShow = 1;
      }else if( pSetting->def ){
        if( pSetting->width==0 ){
          if( is_false(zVal) && is_false(pSetting->def) ) noShow = 1;
        }else{
          if( fossil_strcmp(zVal, pSetting->def)==0 ) noShow = 1;
        }
      }
    }
    if( noShow ){
      fossil_print("%-24s (versioned)\n", pSetting->name);
      versioned = 0;
    }else if( valueOnly ){
      fossil_print("%s\n", db_column_text(&q, 1));
    }else{
      const char *zVal = (const char*)db_column_text(&q,1);
      const char *zName = (const char*)db_column_text(&q,0);
      if( zVal==0 ) zVal = "NULL";
      if( strchr(zVal,'\n')==0 ){
        fossil_print("%-24s %-11s %s\n", pSetting->name, zName, zVal);
      }else{
        fossil_print("%-24s %-11s\n", pSetting->name, zName);
        while( zVal[0] ){
          char *zNL = strchr(zVal, '\n');
          if( zNL==0 ){
            fossil_print("    %s\n", zVal);
            break;
          }else{
            int n = (int)(zNL - zVal);
            while( n>0 && fossil_isspace(zVal[n-1]) ){ n--; }
            fossil_print("    %.*s\n", n, zVal);
            zVal = zNL+1;
          }
        }
      }
    }
  }else if( bIfChng ){
    /* Display nothing */
    versioned = 0;
  }else if( valueOnly ){
    fossil_print("\n");
  }else{
    fossil_print("%-24s\n", pSetting->name);
  }
  if( versioned ){
    fossil_print("  (overridden by contents of file .fossil-settings/%s)\n",
                 pSetting->name);
  }
  db_finalize(&q);
}
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
  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







<







4562
4563
4564
4565
4566
4567
4568

4569
4570
4571
4572
4573
4574
4575
  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
5236
5237
5238
5239
5240
5241
5242

5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254

5255
5256
5257
5258
5259
5260
5261
5262
5263
** 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);







>

<
<









>

<







5272
5273
5274
5275
5276
5277
5278
5279
5280


5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291

5292
5293
5294
5295
5296
5297
5298
** 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:
**   --changed  Only show settings if the value differs from the default
**   --exact    Only consider exact name matches


**   --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 bIfChng = find_option("changed",0,0)!=0;
  int exactFlag = find_option("exact",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);
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
  if( unsetFlag && g.argc!=3 ){
    usage("PROPERTY ?-global?");
  }
  if( valueFlag ){
    if( g.argc!=3 ){
      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

5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
  if( unsetFlag && g.argc!=3 ){
    usage("PROPERTY ?-global?");
  }
  if( valueFlag ){
    if( g.argc!=3 ){
      fossil_fatal("--value is only supported when qurying a given property");
    }

  }

  if( g.argc==2 ){
    for(i=0; i<nSetting; i++){
      print_setting(&aSetting[i], 0, bIfChng);
    }
  }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);
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
          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?");
  }







|







5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
          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, bIfChng);
        }
        pSetting++;
      }
    }
  }else{
    usage("?PROPERTY? ?VALUE? ?-global?");
  }
Changes to src/printf.c.
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  int n = 0;
  while( (N-- != 0) && *(z++)!=0 ){ n++; }
  return n;
}
#endif

/*
** SETTING: timeline-plaintext         boolean default=off if-chng
**
** If enabled, no wiki-formatting is done for timeline comment messages.
** Hyperlinks are activated, but they show up on screen using the 
** complete input text, not just the display text.  No other formatting
** is done.
*/
/*
** SETTING: timeline-block-markup      boolean default=off if-chng
**
** If enabled, block markup (paragraph brakes, tables, lists, headings, etc)
** is enabled while rendering check-in comment message on the timeline.
** This is disabled by default, because the timeline works best if the
** check-in comments are short and do not take up too much vertical space.
*/
/*
** SETTING: timeline-hard-newlines     boolean default=off if-chng
**
** If enabled, the timeline honors newline characters in check-in comments.
** In other words, newlines are coverted into <br> for HTML display.
** The default behavior, when this setting is off, is that newlines are
** treated like any other whitespace character.
*/








|







|







|







239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  int n = 0;
  while( (N-- != 0) && *(z++)!=0 ){ n++; }
  return n;
}
#endif

/*
** SETTING: timeline-plaintext         boolean default=off
**
** If enabled, no wiki-formatting is done for timeline comment messages.
** Hyperlinks are activated, but they show up on screen using the 
** complete input text, not just the display text.  No other formatting
** is done.
*/
/*
** SETTING: timeline-block-markup      boolean default=off
**
** If enabled, block markup (paragraph brakes, tables, lists, headings, etc)
** is enabled while rendering check-in comment message on the timeline.
** This is disabled by default, because the timeline works best if the
** check-in comments are short and do not take up too much vertical space.
*/
/*
** SETTING: timeline-hard-newlines     boolean default=off
**
** If enabled, the timeline honors newline characters in check-in comments.
** In other words, newlines are coverted into <br> for HTML display.
** The default behavior, when this setting is off, is that newlines are
** treated like any other whitespace character.
*/

Changes to src/setup.c.
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
** Change or view miscellaneous settings.  Part of the
** /setup pages requiring Setup privileges.
*/
void setup_settings(void){
  int nSetting;
  int i;
  Setting const *pSet;
  int bExtra = P("extra")!=0;
  const Setting *aSetting = setting_info(&nSetting);

  login_check_credentials();
  if( !g.perm.Setup ){
    login_needed(0);
    return;
  }

  style_set_current_feature("setup");
  style_header("Settings");
  if(!g.repositoryOpen){
    /* Provide read-only access to versioned settings,
       but only if no repo file was explicitly provided. */
    db_open_local(0);
  }
  db_begin_transaction();




  @ <p>Settings marked with (v) are "versionable" and will be overridden
  @ by the contents of managed files named
  @ "<tt>.fossil-settings/</tt><i>SETTING-NAME</i>".
  @ If the file for a versionable setting exists, the value cannot be
  @ changed on this screen.</p><hr><p>
  @
  @ <form action="%R/setup_settings" method="post"><div>
  if( bExtra ){
    @ <input type="hidden" name="extra" value="1">
    style_submenu_element("No-Extras", "%R/setup_settings");
  }else{

    style_submenu_element("Extras", "%R/setup_settings?extra");
  }
  @ <table border="0"><tr><td valign="top">
  login_insert_csrf_secret();
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width==0 ){
      int hasVersionableValue = pSet->versionable &&
          (db_get_versioned(pSet->name, NULL, NULL)!=0);
      if( pSet->bIfChng && !bExtra ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || is_false(zVal)==is_false(pSet->def) ) continue;
      }
      onoff_attribute("", pSet->name,
                      pSet->var!=0 ? pSet->var : pSet->name /*works-like:"x"*/,
                      is_truth(pSet->def), hasVersionableValue);
      @ <a href='%R/help?cmd=%s(pSet->name)'>%h(pSet->name)</a>







|
















>
>
>
>







|
<
|

>
|







|







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
** Change or view miscellaneous settings.  Part of the
** /setup pages requiring Setup privileges.
*/
void setup_settings(void){
  int nSetting;
  int i;
  Setting const *pSet;
  int bIfChng = P("all")==0;
  const Setting *aSetting = setting_info(&nSetting);

  login_check_credentials();
  if( !g.perm.Setup ){
    login_needed(0);
    return;
  }

  style_set_current_feature("setup");
  style_header("Settings");
  if(!g.repositoryOpen){
    /* Provide read-only access to versioned settings,
       but only if no repo file was explicitly provided. */
    db_open_local(0);
  }
  db_begin_transaction();
  if( bIfChng ){
    @ <p>Only settings whose value is different from the default are shown.
    @ Click the "All" button above to set all settings.
  }
  @ <p>Settings marked with (v) are "versionable" and will be overridden
  @ by the contents of managed files named
  @ "<tt>.fossil-settings/</tt><i>SETTING-NAME</i>".
  @ If the file for a versionable setting exists, the value cannot be
  @ changed on this screen.</p><hr><p>
  @
  @ <form action="%R/setup_settings" method="post"><div>
  if( bIfChng ){

    style_submenu_element("All", "%R/setup_settings?all");
  }else{
    @ <input type="hidden" name="all" value="1">
    style_submenu_element("Changes-Only", "%R/setup_settings");
  }
  @ <table border="0"><tr><td valign="top">
  login_insert_csrf_secret();
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width==0 ){
      int hasVersionableValue = pSet->versionable &&
          (db_get_versioned(pSet->name, NULL, NULL)!=0);
      if( bIfChng ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || is_false(zVal)==is_false(pSet->def) ) continue;
      }
      onoff_attribute("", pSet->name,
                      pSet->var!=0 ? pSet->var : pSet->name /*works-like:"x"*/,
                      is_truth(pSet->def), hasVersionableValue);
      @ <a href='%R/help?cmd=%s(pSet->name)'>%h(pSet->name)</a>
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  @ <br><input type="submit"  name="submit" value="Apply Changes">
  @ </td><td style="width:50px;"></td><td valign="top">
  @ <table>
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width>0 && !pSet->forceTextArea ){
      int hasVersionableValue = pSet->versionable &&
          (db_get_versioned(pSet->name, NULL, NULL)!=0);
      if( pSet->bIfChng && !bExtra ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || fossil_strcmp(zVal,pSet->def)==0 ) continue;
      }
      @ <tr><td>
      @ <a href='%R/help?cmd=%s(pSet->name)'>%h(pSet->name)</a>
      if( pSet->versionable ){
        @  (v)







|







1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
  @ <br><input type="submit"  name="submit" value="Apply Changes">
  @ </td><td style="width:50px;"></td><td valign="top">
  @ <table>
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width>0 && !pSet->forceTextArea ){
      int hasVersionableValue = pSet->versionable &&
          (db_get_versioned(pSet->name, NULL, NULL)!=0);
      if( bIfChng ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || fossil_strcmp(zVal,pSet->def)==0 ) continue;
      }
      @ <tr><td>
      @ <a href='%R/help?cmd=%s(pSet->name)'>%h(pSet->name)</a>
      if( pSet->versionable ){
        @  (v)
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
    }
  }
  @</table>
  @ </td><td style="width:50px;"></td><td valign="top">
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width>0 && pSet->forceTextArea ){
      int hasVersionableValue = db_get_versioned(pSet->name, NULL, NULL)!=0;
      if( pSet->bIfChng && !bExtra ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || fossil_strcmp(zVal,pSet->def)==0 ) continue;
      }
      @ <a href='%R/help?cmd=%s(pSet->name)'>%s(pSet->name)</a>
      if( pSet->versionable ){
        @  (v)<br>
      } else {







|







1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
    }
  }
  @</table>
  @ </td><td style="width:50px;"></td><td valign="top">
  for(i=0, pSet=aSetting; i<nSetting; i++, pSet++){
    if( pSet->width>0 && pSet->forceTextArea ){
      int hasVersionableValue = db_get_versioned(pSet->name, NULL, NULL)!=0;
      if( bIfChng ){
        const char *zVal = db_get(pSet->name, 0);
        if( zVal==0 || fossil_strcmp(zVal,pSet->def)==0 ) continue;
      }
      @ <a href='%R/help?cmd=%s(pSet->name)'>%s(pSet->name)</a>
      if( pSet->versionable ){
        @  (v)<br>
      } else {
Changes to src/timeline.c.
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
  if( cgi_is_loopback(g.zIpAddr) && db_open_local(0) ){
    vid = db_lget_int("checkout", 0);
  }
  zPrevDate[0] = 0;
  mxWikiLen = db_get_int("timeline-max-comment", 0);
  dateFormat = db_get_int("timeline-date-format", 0);
  /*
  ** SETTING: timeline-truncate-at-blank  boolean default=off if-chng
  **
  ** If enabled, check-in comments displayed on the timeline are truncated
  ** at the first blank line of the comment text.  The comment text after
  ** the first blank line is only seen in the /info or similar pages that
  ** show details about the check-in.
  */
  bCommentGitStyle = db_get_int("timeline-truncate-at-blank", 0);
  /*
  ** SETTING: timeline-tslink-info       boolean default=off if-chng
  **
  ** The hyperlink on the timestamp associated with each timeline entry,
  ** on the far left-hand side of the screen, normally targets another
  ** /timeline page that shows the entry in context.  However, if this
  ** option is turned on, that hyperlink targets the /info page showing
  ** the details of the entry.
  */







|








|







220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
  if( cgi_is_loopback(g.zIpAddr) && db_open_local(0) ){
    vid = db_lget_int("checkout", 0);
  }
  zPrevDate[0] = 0;
  mxWikiLen = db_get_int("timeline-max-comment", 0);
  dateFormat = db_get_int("timeline-date-format", 0);
  /*
  ** SETTING: timeline-truncate-at-blank  boolean default=off
  **
  ** If enabled, check-in comments displayed on the timeline are truncated
  ** at the first blank line of the comment text.  The comment text after
  ** the first blank line is only seen in the /info or similar pages that
  ** show details about the check-in.
  */
  bCommentGitStyle = db_get_int("timeline-truncate-at-blank", 0);
  /*
  ** SETTING: timeline-tslink-info       boolean default=off
  **
  ** The hyperlink on the timestamp associated with each timeline entry,
  ** on the far left-hand side of the screen, normally targets another
  ** /timeline page that shows the entry in context.  However, if this
  ** option is turned on, that hyperlink targets the /info page showing
  ** the details of the entry.
  */
Changes to tools/mkindex.c.
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#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 */







<







99
100
101
102
103
104
105

106
107
108
109
110
111
112
#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 */

/**************************************************************************/

/*
** Each entry looks like this:
*/
typedef struct Entry {
  int eType;        /* CMDFLAG_* values */
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
    }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)
           || (j==12 && strncmp(&zLine[i], "abbrv-subcom", 12)==0) ){
      aEntry[nUsed].eType |= CMDFLAG_ABBREVSUBCMD;
    }else if( (j==20 && strncmp(&zLine[i], "show-only-if-changed", 20)==0)
           || (j==7  && strncmp(&zLine[i], "if-chng", 7)==0) ){
      aEntry[nUsed].eType |= CMDFLAG_IFCHNG;
    }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
    }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)
           || (j==12 && strncmp(&zLine[i], "abbrv-subcom", 12)==0) ){
      aEntry[nUsed].eType |= CMDFLAG_ABBREVSUBCMD;



    }else{
      fprintf(stderr, "%s:%d: unknown option: '%.*s'\n",
              zFile, nLine, j, &zLine[i]);
      nErr++;
    }
  }

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
543
544
    }
    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){







|




<






|







514
515
516
517
518
519
520
521
522
523
524
525

526
527
528
529
530
531
532
533
534
535
536
537
538
539
    }
    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, \"%s\"%*s },\n",
      aEntry[i].iWidth,
      (aEntry[i].eType & CMDFLAG_VERSIONABLE)!=0,
      (aEntry[i].eType & CMDFLAG_BLOCKTEXT)!=0,
      (aEntry[i].eType & CMDFLAG_SENSITIVE)!=0,

      zDef, (int)(10-strlen(zDef)), ""
    );
    if( aEntry[i].zIf ){
      printf("#endif\n");
    }
  }
  printf("{0,0,0,0,0,0,0}};\n");

}

/*
** Process a single file of input
*/
void process_file(void){