rhg: exit with relevant code for unsupported requirements
authorSimon Sapin <simon-commits@exyr.org>
Tue, 24 Nov 2020 18:52:38 +0100
changeset 45937 2ad2745e0be9
parent 45936 0ce15a8c7b8b
child 45938 f5d62f4d5327
rhg: exit with relevant code for unsupported requirements Differential Revision: https://phab.mercurial-scm.org/D9399
rust/hg-core/src/requirements.rs
rust/rhg/src/commands/cat.rs
rust/rhg/src/commands/files.rs
rust/rhg/src/error.rs
tests/test-rhg.t
--- a/rust/hg-core/src/requirements.rs	Tue Oct 06 03:25:15 2020 +0200
+++ b/rust/hg-core/src/requirements.rs	Tue Nov 24 18:52:38 2020 +0100
@@ -51,3 +51,22 @@
         Err(error) => Err(RequirementsError::Io(error))?,
     }
 }
+
+pub fn check(repo_root: &Path) -> Result<(), RequirementsError> {
+    for feature in load(repo_root)? {
+        if !SUPPORTED.contains(&&*feature) {
+            return Err(RequirementsError::Unsupported { feature })
+        }
+    }
+    Ok(())
+}
+
+// TODO: set this to actually-supported features
+const SUPPORTED: &[&str] = &[
+    "dotencode",
+    "fncache",
+    "generaldelta",
+    "revlogv1",
+    "sparserevlog",
+    "store",
+];
--- a/rust/rhg/src/commands/cat.rs	Tue Oct 06 03:25:15 2020 +0200
+++ b/rust/rhg/src/commands/cat.rs	Tue Nov 24 18:52:38 2020 +0100
@@ -4,6 +4,7 @@
 use crate::ui::Ui;
 use hg::operations::FindRoot;
 use hg::operations::{CatRev, CatRevError, CatRevErrorKind};
+use hg::requirements;
 use hg::utils::hg_path::HgPathBuf;
 use micro_timer::timed;
 use std::convert::TryFrom;
@@ -32,6 +33,7 @@
     #[timed]
     fn run(&self, ui: &Ui) -> Result<(), CommandError> {
         let root = FindRoot::new().run()?;
+        requirements::check(&root)?;
         let cwd = std::env::current_dir()
             .or_else(|e| Err(CommandErrorKind::CurrentDirNotFound(e)))?;
 
--- a/rust/rhg/src/commands/files.rs	Tue Oct 06 03:25:15 2020 +0200
+++ b/rust/rhg/src/commands/files.rs	Tue Nov 24 18:52:38 2020 +0100
@@ -11,6 +11,7 @@
     ListRevTrackedFiles, ListRevTrackedFilesError,
     ListRevTrackedFilesErrorKind,
 };
+use hg::requirements;
 use hg::utils::files::{get_bytes_from_path, relativize_path};
 use hg::utils::hg_path::{HgPath, HgPathBuf};
 use std::path::PathBuf;
@@ -57,6 +58,7 @@
 impl<'a> Command for FilesCommand<'a> {
     fn run(&self, ui: &Ui) -> Result<(), CommandError> {
         let root = FindRoot::new().run()?;
+        requirements::check(&root)?;
         if let Some(rev) = self.rev {
             let mut operation = ListRevTrackedFiles::new(&root, rev)
                 .map_err(|e| map_rev_error(rev, e))?;
--- a/rust/rhg/src/error.rs	Tue Oct 06 03:25:15 2020 +0200
+++ b/rust/rhg/src/error.rs	Tue Nov 24 18:52:38 2020 +0100
@@ -30,6 +30,9 @@
         match self {
             CommandErrorKind::RootNotFound(_) => exitcode::ABORT,
             CommandErrorKind::CurrentDirNotFound(_) => exitcode::ABORT,
+            CommandErrorKind::RequirementsError(
+                RequirementsError::Unsupported { .. },
+            ) => exitcode::UNIMPLEMENTED_COMMAND,
             CommandErrorKind::RequirementsError(_) => exitcode::ABORT,
             CommandErrorKind::StdoutError => exitcode::ABORT,
             CommandErrorKind::StderrError => exitcode::ABORT,
--- a/tests/test-rhg.t	Tue Oct 06 03:25:15 2020 +0200
+++ b/tests/test-rhg.t	Tue Nov 24 18:52:38 2020 +0100
@@ -124,3 +124,19 @@
   revlogv1
   sparserevlog
   store
+
+  $ echo indoor-pool >> .hg/requires
+  $ rhg files
+  [252]
+
+  $ rhg cat -r 1 copy_of_original
+  [252]
+
+  $ rhg debugrequirements
+  dotencode
+  fncache
+  generaldelta
+  revlogv1
+  sparserevlog
+  store
+  indoor-pool