rhg: Remove `rhg.fallback-executable=hg` default configuration
authorSimon Sapin <simon.sapin@octobus.net>
Fri, 12 Mar 2021 21:44:07 +0100
changeset 46748 bde90e9b4507
parent 46747 b1e6265e8336
child 46749 5a2212d40398
rhg: Remove `rhg.fallback-executable=hg` default configuration When `rhg.on-unsupported` is configured to `fallback` and an unsupported feature is encountered, the previous default was to look for an `hg` executable in `$PATH`. This default was fragile since it was easy to end up accidentally using an older version of Mercurial installed system-wide, when a local (perhaps patched) installation was intended. Instead, it is now an error to have `rhg.on-unsupported=fallback` without also configuring an explicit path or the fallback executable. Differential Revision: https://phab.mercurial-scm.org/D10189
rust/rhg/src/main.rs
tests/test-rhg.t
--- a/rust/rhg/src/main.rs	Tue Mar 09 09:17:24 2021 +0100
+++ b/rust/rhg/src/main.rs	Fri Mar 12 21:44:07 2021 +0100
@@ -138,7 +138,7 @@
             exit(
                 &initial_current_dir,
                 &ui,
-                OnUnsupported::from_config(&non_repo_config),
+                OnUnsupported::from_config(&ui, &non_repo_config),
                 Err(CommandError::UnsupportedFeature {
                     message: format_bytes!(
                         b"URL-like --repository {}",
@@ -158,7 +158,7 @@
         Err(error) => exit(
             &initial_current_dir,
             &ui,
-            OnUnsupported::from_config(&non_repo_config),
+            OnUnsupported::from_config(&ui, &non_repo_config),
             Err(error.into()),
         ),
     };
@@ -168,6 +168,7 @@
     } else {
         &non_repo_config
     };
+    let on_unsupported = OnUnsupported::from_config(&ui, config);
 
     let result = main_with_result(
         &process_start_time,
@@ -175,12 +176,7 @@
         repo_result.as_ref(),
         config,
     );
-    exit(
-        &initial_current_dir,
-        &ui,
-        OnUnsupported::from_config(config),
-        result,
-    )
+    exit(&initial_current_dir, &ui, on_unsupported, result)
 }
 
 fn exit_code(result: &Result<(), CommandError>) -> i32 {
@@ -242,6 +238,14 @@
             }
         }
     }
+    exit_no_fallback(ui, on_unsupported, result)
+}
+
+fn exit_no_fallback(
+    ui: &Ui,
+    on_unsupported: OnUnsupported,
+    result: Result<(), CommandError>,
+) -> ! {
     match &result {
         Ok(_) => {}
         Err(CommandError::Unsuccessful) => {}
@@ -387,9 +391,8 @@
 
 impl OnUnsupported {
     const DEFAULT: Self = OnUnsupported::Abort;
-    const DEFAULT_FALLBACK_EXECUTABLE: &'static [u8] = b"hg";
 
-    fn from_config(config: &Config) -> Self {
+    fn from_config(ui: &Ui, config: &Config) -> Self {
         match config
             .get(b"rhg", b"on-unsupported")
             .map(|value| value.to_ascii_lowercase())
@@ -400,7 +403,16 @@
             Some(b"fallback") => OnUnsupported::Fallback {
                 executable: config
                     .get(b"rhg", b"fallback-executable")
-                    .unwrap_or(Self::DEFAULT_FALLBACK_EXECUTABLE)
+                    .unwrap_or_else(|| {
+                        exit_no_fallback(
+                            ui,
+                            Self::Abort,
+                            Err(CommandError::abort(
+                                "abort: 'rhg.on-unsupported=fallback' without \
+                                'rhg.fallback-executable' set."
+                            )),
+                        )
+                    })
                     .to_owned(),
             },
             None => Self::DEFAULT,
--- a/tests/test-rhg.t	Tue Mar 09 09:17:24 2021 +0100
+++ b/tests/test-rhg.t	Fri Mar 12 21:44:07 2021 +0100
@@ -150,6 +150,14 @@
   $ rhg cat original
   original content
 
+  $ FALLBACK_EXE="$RHG_FALLBACK_EXECUTABLE"
+  $ unset RHG_FALLBACK_EXECUTABLE
+  $ rhg cat original
+  abort: 'rhg.on-unsupported=fallback' without 'rhg.fallback-executable' set.
+  [255]
+  $ RHG_FALLBACK_EXECUTABLE="$FALLBACK_EXE"
+  $ export RHG_FALLBACK_EXECUTABLE
+
   $ rhg cat original --config rhg.fallback-executable=false
   [1]