diff --git a/rust/rhg/src/main.rs b/rust/rhg/src/main.rs --- a/rust/rhg/src/main.rs +++ b/rust/rhg/src/main.rs @@ -309,27 +309,27 @@ } impl OnUnsupported { - const DEFAULT: Self = OnUnsupported::Abort; const DEFAULT_FALLBACK_EXECUTABLE: &'static [u8] = b"hg"; fn from_config(config: &Config) -> Self { - match config + let fallback = b"fallback"; + match &*config .get(b"rhg", b"on-unsupported") - .map(|value| value.to_ascii_lowercase()) - .as_deref() + .unwrap_or(fallback) + .to_ascii_lowercase() { - Some(b"abort") => OnUnsupported::Abort, - Some(b"abort-silent") => OnUnsupported::AbortSilent, - Some(b"fallback") => OnUnsupported::Fallback { - executable: config - .get(b"rhg", b"fallback-executable") - .unwrap_or(Self::DEFAULT_FALLBACK_EXECUTABLE) - .to_owned(), - }, - None => Self::DEFAULT, - Some(_) => { - // TODO: warn about unknown config value - Self::DEFAULT + b"abort" => OnUnsupported::Abort, + b"abort-silent" => OnUnsupported::AbortSilent, + value => { + if value != fallback { + // TODO: warn about unknown config value + } + OnUnsupported::Fallback { + executable: config + .get(b"rhg", b"fallback-executable") + .unwrap_or(Self::DEFAULT_FALLBACK_EXECUTABLE) + .to_owned(), + } } } } diff --git a/tests/test-rhg.t b/tests/test-rhg.t --- a/tests/test-rhg.t +++ b/tests/test-rhg.t @@ -11,12 +11,14 @@ > fi > } + $ NO_FALLBACK="--config=rhg.on-unsupported=abort" + Unimplemented command - $ rhg unimplemented-command + $ rhg $NO_FALLBACK unimplemented-command unsupported feature: error: Found argument 'unimplemented-command' which wasn't expected, or isn't valid in this context USAGE: - rhg [OPTIONS] + rhg --config ... For more information try --help @@ -25,35 +27,35 @@ [252] Finding root - $ rhg root + $ rhg $NO_FALLBACK root abort: no repository found in '$TESTTMP' (.hg not found)! [255] $ hg init repository $ cd repository - $ rhg root + $ rhg $NO_FALLBACK root $TESTTMP/repository Reading and setting configuration $ echo "[ui]" >> $HGRCPATH $ echo "username = user1" >> $HGRCPATH - $ rhg config ui.username + $ rhg $NO_FALLBACK config ui.username user1 $ echo "[ui]" >> .hg/hgrc $ echo "username = user2" >> .hg/hgrc - $ rhg config ui.username + $ rhg $NO_FALLBACK config ui.username user2 - $ rhg --config ui.username=user3 config ui.username + $ rhg $NO_FALLBACK --config ui.username=user3 config ui.username user3 Unwritable file descriptor - $ rhg root > /dev/full + $ rhg $NO_FALLBACK root > /dev/full abort: No space left on device (os error 28) [255] Deleted repository $ rm -rf `pwd` - $ rhg root + $ rhg $NO_FALLBACK root abort: $ENOENT$: current directory [255] @@ -68,7 +70,7 @@ > hg commit -m "commit $i" -q Listing tracked files from root - $ rhg files + $ rhg $NO_FALLBACK files file1 file2 file3 @@ -76,13 +78,13 @@ Listing tracked files from subdirectory $ mkdir -p path/to/directory $ cd path/to/directory - $ rhg files + $ rhg $NO_FALLBACK files ../../../file1 ../../../file2 ../../../file3 Listing tracked files through broken pipe - $ rhg files | head -n 1 + $ rhg $NO_FALLBACK files | head -n 1 ../../../file1 Debuging data in inline index @@ -95,20 +97,20 @@ > hg add file-$i > hg commit -m "Commit $i" -q > done - $ rhg debugdata -c 2 + $ rhg $NO_FALLBACK debugdata -c 2 8d0267cb034247ebfa5ee58ce59e22e57a492297 test 0 0 file-3 Commit 3 (no-eol) - $ rhg debugdata -m 2 + $ rhg $NO_FALLBACK debugdata -m 2 file-1\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc) file-2\x005d9299349fc01ddd25d0070d149b124d8f10411e (esc) file-3\x002661d26c649684b482d10f91960cc3db683c38b4 (esc) Debuging with full node id - $ rhg debugdata -c `hg log -r 0 -T '{node}'` + $ rhg $NO_FALLBACK debugdata -c `hg log -r 0 -T '{node}'` d1d1c679d3053e8926061b6f45ca52009f011e3f test 0 0 @@ -124,16 +126,16 @@ cf8b83f14ead62b374b6e91a0e9303b85dfd9ed7 91c6f6e73e39318534dc415ea4e8a09c99cd74d6 6ae9681c6d30389694d8701faf24b583cf3ccafe - $ rhg files -r cf8b83 + $ rhg $NO_FALLBACK files -r cf8b83 file-1 file-2 file-3 - $ rhg cat -r cf8b83 file-2 + $ rhg $NO_FALLBACK cat -r cf8b83 file-2 2 - $ rhg cat -r c file-2 + $ rhg $NO_FALLBACK cat -r c file-2 abort: ambiguous revision identifier c [255] - $ rhg cat -r d file-2 + $ rhg $NO_FALLBACK cat -r d file-2 2 Cat files @@ -144,37 +146,36 @@ $ echo "original content" > original $ hg add original $ hg commit -m "add original" original - $ rhg cat -r 0 original + $ rhg $NO_FALLBACK cat -r 0 original original content Cat copied file should not display copy metadata $ hg copy original copy_of_original $ hg commit -m "add copy of original" - $ rhg cat -r 1 copy_of_original + $ rhg $NO_FALLBACK cat -r 1 copy_of_original original content Fallback to Python - $ rhg cat original + $ rhg $NO_FALLBACK cat original unsupported feature: `rhg cat` without `--rev` / `-r` [252] - $ FALLBACK="--config rhg.on-unsupported=fallback" - $ rhg cat original $FALLBACK + $ rhg cat original original content - $ rhg cat original $FALLBACK --config rhg.fallback-executable=false + $ rhg cat original --config rhg.fallback-executable=false [1] - $ rhg cat original $FALLBACK --config rhg.fallback-executable=hg-non-existent + $ rhg cat original --config rhg.fallback-executable=hg-non-existent tried to fall back to a 'hg-non-existent' sub-process but got error $ENOENT$ unsupported feature: `rhg cat` without `--rev` / `-r` [252] - $ rhg cat original $FALLBACK --config rhg.fallback-executable="$RHG" + $ rhg cat original --config rhg.fallback-executable="$RHG" Blocking recursive fallback. The 'rhg.fallback-executable = */rust/target/release/rhg' config points to `rhg` itself. (glob) unsupported feature: `rhg cat` without `--rev` / `-r` [252] Requirements - $ rhg debugrequirements + $ rhg $NO_FALLBACK debugrequirements dotencode fncache generaldelta @@ -183,20 +184,20 @@ store $ echo indoor-pool >> .hg/requires - $ rhg files + $ rhg $NO_FALLBACK files unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool [252] - $ rhg cat -r 1 copy_of_original + $ rhg $NO_FALLBACK cat -r 1 copy_of_original unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool [252] - $ rhg debugrequirements + $ rhg $NO_FALLBACK debugrequirements unsupported feature: repository requires feature unknown to this Mercurial: indoor-pool [252] $ echo -e '\xFF' >> .hg/requires - $ rhg debugrequirements + $ rhg $NO_FALLBACK debugrequirements abort: corrupted repository: parse error in 'requires' file [255] @@ -205,7 +206,7 @@ $ rm -rf repository $ hg init repository $ cd repository - $ rhg debugrequirements | grep nodemap + $ rhg $NO_FALLBACK debugrequirements | grep nodemap [1] $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn" $ hg id -r tip @@ -213,14 +214,14 @@ $ ls .hg/store/00changelog* .hg/store/00changelog.d .hg/store/00changelog.i - $ rhg files -r c3ae8dec9fad + $ rhg $NO_FALLBACK files -r c3ae8dec9fad of $ cd $TESTTMP $ rm -rf repository $ hg --config format.use-persistent-nodemap=True init repository $ cd repository - $ rhg debugrequirements | grep nodemap + $ rhg $NO_FALLBACK debugrequirements | grep nodemap persistent-nodemap $ hg debugbuilddag .+5000 --overwritten-file --config "storage.revlog.nodemap.mode=warn" $ hg id -r tip @@ -232,9 +233,9 @@ .hg/store/00changelog.n Specifying revisions by changeset ID - $ rhg files -r c3ae8dec9fad + $ rhg $NO_FALLBACK files -r c3ae8dec9fad of - $ rhg cat -r c3ae8dec9fad of + $ rhg $NO_FALLBACK cat -r c3ae8dec9fad of r5000 Crate a shared repository @@ -252,11 +253,11 @@ updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved -And check that basic rhg commands work with sharing +And check that basic rhg $NO_FALLBACK commands work with sharing - $ rhg files -R repo2 + $ rhg $NO_FALLBACK files -R repo2 repo2/a - $ rhg -R repo2 cat -r 0 repo2/a + $ rhg $NO_FALLBACK -R repo2 cat -r 0 repo2/a a Same with relative sharing @@ -265,9 +266,9 @@ updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ rhg files -R repo3 + $ rhg $NO_FALLBACK files -R repo3 repo3/a - $ rhg -R repo3 cat -r 0 repo3/a + $ rhg $NO_FALLBACK -R repo3 cat -r 0 repo3/a a Same with share-safe @@ -290,9 +291,9 @@ And check that basic rhg commands work with sharing $ cd repo5 - $ rhg files + $ rhg $NO_FALLBACK files a - $ rhg cat -r 0 a + $ rhg $NO_FALLBACK cat -r 0 a a The blackbox extension is supported @@ -301,9 +302,9 @@ $ echo "blackbox =" >> $HGRCPATH $ echo "[blackbox]" >> $HGRCPATH $ echo "maxsize = 1" >> $HGRCPATH - $ rhg files > /dev/null + $ rhg $NO_FALLBACK files > /dev/null $ cat .hg/blackbox.log - ????/??/?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files exited 0 after 0.??? seconds (glob) + ????/??/?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) '--config=rhg.on-unsupported=abort' files exited 0 after 0.??? seconds (glob) $ cat .hg/blackbox.log.1 - ????/??/?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) files (glob) + ????/??/?? ??:??:??.??? * @d3873e73d99ef67873dac33fbcc66268d5d2b6f4 (*)> (rust) '--config=rhg.on-unsupported=abort' files (glob)