# HG changeset patch # User Simon Sapin # Date 1606240358 -3600 # Node ID 2ad2745e0be9eae528cbd001c013f2282478e583 # Parent 0ce15a8c7b8b33e843ea03d2452ed45d0366fc58 rhg: exit with relevant code for unsupported requirements Differential Revision: https://phab.mercurial-scm.org/D9399 diff -r 0ce15a8c7b8b -r 2ad2745e0be9 rust/hg-core/src/requirements.rs --- 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", +]; diff -r 0ce15a8c7b8b -r 2ad2745e0be9 rust/rhg/src/commands/cat.rs --- 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)))?; diff -r 0ce15a8c7b8b -r 2ad2745e0be9 rust/rhg/src/commands/files.rs --- 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))?; diff -r 0ce15a8c7b8b -r 2ad2745e0be9 rust/rhg/src/error.rs --- 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, diff -r 0ce15a8c7b8b -r 2ad2745e0be9 tests/test-rhg.t --- 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