changeset 50765:7f8f6fe13fa9

configitems: move blackbox's config items to the new configitems.toml In order for the Rust code to gain access to default values of in-core extensions that have a Rust implementation, we need to centralize them alongside the core items declarations. This is the first and so far only one of the extensions that have gained Rust support, I don't think it's worth the churn to move the rest of the extension's configitems yet.
author Raphaël Gomès <rgomes@octobus.net>
date Wed, 05 Jul 2023 23:59:22 +0200
parents 8ff187fbbfea
children 58aa5ee9c846
files hgext/blackbox.py mercurial/configitems.py mercurial/configitems.toml mercurial/ui.py rust/hg-core/src/config/config_items.rs rust/hg-core/src/config/mod.rs rust/rhg/src/blackbox.rs
diffstat 7 files changed, 107 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/blackbox.py	Mon Feb 13 18:11:48 2023 +0100
+++ b/hgext/blackbox.py	Wed Jul 05 23:59:22 2023 +0200
@@ -67,41 +67,6 @@
 cmdtable = {}
 command = registrar.command(cmdtable)
 
-configtable = {}
-configitem = registrar.configitem(configtable)
-
-configitem(
-    b'blackbox',
-    b'dirty',
-    default=False,
-)
-configitem(
-    b'blackbox',
-    b'maxsize',
-    default=b'1 MB',
-)
-configitem(
-    b'blackbox',
-    b'logsource',
-    default=False,
-)
-configitem(
-    b'blackbox',
-    b'maxfiles',
-    default=7,
-)
-configitem(
-    b'blackbox',
-    b'track',
-    default=lambda: [b'*'],
-)
-configitem(
-    b'blackbox',
-    b'ignore',
-    default=lambda: [b'chgserver', b'cmdserver', b'extension'],
-)
-configitem(b'blackbox', b'date-format', default=b'')
-
 _lastlogger = loggingutil.proxylogger()
 
 
--- a/mercurial/configitems.py	Mon Feb 13 18:11:48 2023 +0100
+++ b/mercurial/configitems.py	Wed Jul 05 23:59:22 2023 +0200
@@ -59,6 +59,7 @@
         priority=0,
         experimental=False,
         documentation="",
+        in_core_extension=None,
     ):
         self.section = section
         self.name = name
@@ -69,6 +70,7 @@
         self.priority = priority
         self.experimental = experimental
         self._re = None
+        self.in_core_extension = in_core_extension
         if generic:
             self._re = re.compile(self.name)
 
--- a/mercurial/configitems.toml	Mon Feb 13 18:11:48 2023 +0100
+++ b/mercurial/configitems.toml	Wed Jul 05 23:59:22 2023 +0200
@@ -23,6 +23,7 @@
 # - alias: list of 2-tuples of strings
 # - experimental: boolean
 # - documentation: string
+# - in_core_extension: string
 #
 # ## Template
 #
@@ -2695,6 +2696,8 @@
 section = "worker"
 name = "numcpus"
 
+# Templates and template applications
+
 [[template-applications]]
 template = "diff-options"
 section = "annotate"
@@ -2757,3 +2760,48 @@
 suffix = "word-diff"
 default = false
 
+# In-core extensions
+
+[[items]]
+section = "blackbox"
+name = "dirty"
+default = false
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "maxsize"
+default = "1 MB"
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "logsource"
+default = false
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "maxfiles"
+default = 7
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "track"
+default-type = "lambda"
+default = ["*"]
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "ignore"
+default-type = "lambda"
+default = ["chgserver", "cmdserver", "extension"]
+in_core_extension = "blackbox"
+
+[[items]]
+section = "blackbox"
+name = "date-format"
+default = ""
+in_core_extension = "blackbox"
--- a/mercurial/ui.py	Mon Feb 13 18:11:48 2023 +0100
+++ b/mercurial/ui.py	Wed Jul 05 23:59:22 2023 +0200
@@ -47,6 +47,7 @@
     configitems,
     encoding,
     error,
+    extensions,
     formatter,
     loggingutil,
     progress,
@@ -659,6 +660,12 @@
         item = self._knownconfig.get(section, {}).get(name)
         alternates = [(section, name)]
 
+        if item is not None and item.in_core_extension is not None:
+            # Only return the default for an in-core extension item if said
+            # extension is enabled
+            if item.in_core_extension in extensions.extensions(self):
+                item = None
+
         if item is not None:
             alternates.extend(item.alias)
             if callable(item.default):
--- a/rust/hg-core/src/config/config_items.rs	Mon Feb 13 18:11:48 2023 +0100
+++ b/rust/hg-core/src/config/config_items.rs	Wed Jul 05 23:59:22 2023 +0200
@@ -40,6 +40,11 @@
     /// The (possibly empty) docstring for the item
     #[serde(default)]
     documentation: String,
+    /// Whether the item is part of an in-core extension. This allows us to
+    /// hide them if the extension is not enabled, to preserve legacy
+    /// behavior.
+    #[serde(default)]
+    in_core_extension: Option<String>,
 }
 
 /// Corresponds to the raw (i.e. on disk) structure of config items. Used as
@@ -61,6 +66,8 @@
     experimental: bool,
     #[serde(default)]
     documentation: String,
+    #[serde(default)]
+    in_core_extension: Option<String>,
 }
 
 impl TryFrom<RawDefaultConfigItem> for DefaultConfigItem {
@@ -82,6 +89,7 @@
             alias: value.alias,
             experimental: value.experimental,
             documentation: value.documentation,
+            in_core_extension: value.in_core_extension,
         })
     }
 }
@@ -90,6 +98,14 @@
     fn is_generic(&self) -> bool {
         self.priority.is_some()
     }
+
+    pub fn in_core_extension(&self) -> Option<&str> {
+        self.in_core_extension.as_deref()
+    }
+
+    pub fn section(&self) -> &str {
+        self.section.as_ref()
+    }
 }
 
 impl<'a> TryFrom<&'a DefaultConfigItem> for Option<&'a str> {
@@ -302,6 +318,7 @@
             alias: self.alias,
             experimental: self.experimental,
             documentation: self.documentation,
+            in_core_extension: None,
         }
     }
 }
@@ -596,6 +613,7 @@
             alias: vec![],
             experimental: true,
             documentation: "".into(),
+            in_core_extension: None,
         };
         assert_eq!(config.get(b"censor", b"policy"), Some(&expected));
 
@@ -609,6 +627,7 @@
             alias: vec![],
             experimental: false,
             documentation: "".into(),
+            in_core_extension: None,
         };
         assert_eq!(config.get(b"alias", b"abcdsomething"), Some(&expected));
 
@@ -621,6 +640,7 @@
             alias: vec![],
             experimental: false,
             documentation: "".into(),
+            in_core_extension: None,
         };
         assert_eq!(config.get(b"alias", b"something"), Some(&expected));
 
@@ -632,6 +652,7 @@
             alias: vec![],
             experimental: false,
             documentation: "".into(),
+            in_core_extension: None,
         };
         assert_eq!(config.get(b"chgserver", b"idletimeout"), Some(&expected));
 
@@ -647,6 +668,7 @@
             alias: vec![],
             experimental: false,
             documentation: "".into(),
+            in_core_extension: None,
         };
         assert_eq!(config.get(b"cmdserver", b"track-log"), Some(&expected));
 
@@ -660,6 +682,7 @@
             documentation:
                 "This is a docstring.\nThis is another line but this is not."
                     .into(),
+            in_core_extension: None,
         };
         assert_eq!(
             config.get(b"command-templates", b"graphnode"),
--- a/rust/hg-core/src/config/mod.rs	Mon Feb 13 18:11:48 2023 +0100
+++ b/rust/hg-core/src/config/mod.rs	Wed Jul 05 23:59:22 2023 +0200
@@ -373,7 +373,17 @@
                 Some("`mercurial/configitems.toml` is not valid".into()),
             )
         })?;
-        Ok(default_config.get(section, item))
+        let default_opt = default_config.get(section, item);
+        Ok(default_opt.filter(|default| {
+            default
+                .in_core_extension()
+                .map(|extension| {
+                    // Only return the default for an in-core extension item
+                    // if said extension is enabled
+                    self.is_extension_enabled(extension.as_bytes())
+                })
+                .unwrap_or(true)
+        }))
     }
 
     fn get_parse<'config, T: 'config>(
--- a/rust/rhg/src/blackbox.rs	Mon Feb 13 18:11:48 2023 +0100
+++ b/rust/rhg/src/blackbox.rs	Wed Jul 05 23:59:22 2023 +0200
@@ -7,12 +7,6 @@
 use hg::utils::{files::get_bytes_from_os_str, shell_quote};
 use std::ffi::OsString;
 
-const ONE_MEBIBYTE: u64 = 1 << 20;
-
-// TODO: somehow keep defaults in sync with `configitem` in `hgext/blackbox.py`
-const DEFAULT_MAX_SIZE: u64 = ONE_MEBIBYTE;
-const DEFAULT_MAX_FILES: u32 = 7;
-
 // Python does not support %.3f, only %f
 const DEFAULT_DATE_FORMAT: &str = "%Y-%m-%d %H:%M:%S%.3f";
 
@@ -62,15 +56,28 @@
                     max_size: invocation
                         .config
                         .get_byte_size(b"blackbox", b"maxsize")?
-                        .unwrap_or(DEFAULT_MAX_SIZE),
+                        .expect(
+                            "blackbox.maxsize should have a default value",
+                        ),
                     max_files: invocation
                         .config
                         .get_u32(b"blackbox", b"maxfiles")?
-                        .unwrap_or(DEFAULT_MAX_FILES),
+                        .expect(
+                            "blackbox.maxfiles should have a default value",
+                        ),
                     date_format: invocation
                         .config
                         .get_str(b"blackbox", b"date-format")?
-                        .unwrap_or(DEFAULT_DATE_FORMAT),
+                        .map(|f| {
+                            if f.is_empty() {
+                                DEFAULT_DATE_FORMAT
+                            } else {
+                                f
+                            }
+                        })
+                        .expect(
+                            "blackbox.date-format should have a default value",
+                        ),
                 })
             }
         } else {