Comments
Patch
new file mode 100644
@@ -0,0 +1,120 @@
+#require rhg
+
+ $ NO_FALLBACK="env RHG_ON_UNSUPPORTED=abort"
+
+Rhg works well when sparse working copy is enabled.
+
+ $ cd "$TESTTMP"
+ $ hg init repo-sparse
+ $ cd repo-sparse
+ $ cat > .hg/hgrc <<EOF
+ > [extensions]
+ > sparse=
+ > EOF
+
+ $ echo a > show
+ $ echo x > hide
+ $ mkdir dir1 dir2
+ $ echo x > dir1/x
+ $ echo y > dir1/y
+ $ echo z > dir2/z
+
+ $ hg ci -Aqm 'initial'
+ $ hg debugsparse --include 'show'
+ $ ls -A
+ .hg
+ show
+
+ $ tip=$(hg log -r . --template '{node}')
+ $ $NO_FALLBACK rhg files -r "$tip"
+ dir1/x
+ dir1/y
+ dir2/z
+ hide
+ show
+ $ $NO_FALLBACK rhg files
+ show
+
+ $ $NO_FALLBACK rhg cat -r "$tip" hide
+ x
+
+ $ cd ..
+
+We support most things when narrow is enabled, too, with a couple of caveats.
+
+ $ . "$TESTDIR/narrow-library.sh"
+ $ real_hg=$RHG_FALLBACK_EXECUTABLE
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > narrow=
+ > EOF
+
+ $ hg clone --narrow ./repo-sparse repo-narrow --include dir1
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ new changesets 6d714a4a2998
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd repo-narrow
+
+ $ $NO_FALLBACK rhg cat -r "$tip" dir1/x
+ x
+ $ "$real_hg" cat -r "$tip" dir1/x
+ x
+
+TODO: bad error message
+
+ $ $NO_FALLBACK rhg cat -r "$tip" hide
+ abort: invalid revision identifier: 6d714a4a2998cbfd0620db44da58b749f6565d63
+ [255]
+ $ "$real_hg" cat -r "$tip" hide
+ [1]
+
+A naive implementation of [rhg files] leaks the paths that are supposed to be
+hidden by narrow, so we just fall back to hg.
+
+ $ $NO_FALLBACK rhg files -r "$tip"
+ unsupported feature: rhg files -r <rev> is not support in narrow clones
+ [252]
+ $ "$real_hg" files -r "$tip"
+ dir1/x
+ dir1/y
+
+Hg status needs to do some filtering based on narrow spec, so we don't
+support it in rhg for narrow clones yet.
+
+ $ mkdir dir2
+ $ touch dir2/q
+ $ "$real_hg" status
+ $ $NO_FALLBACK rhg --config rhg.status=true status
+ unsupported feature: rhg status is not supported for sparse checkouts or narrow clones yet
+ [252]
+
+Adding "orphaned" index files:
+
+ $ (cd ..; cp {repo-sparse,repo-narrow}/.hg/store/data/hide.i)
+ $ (cd ..; mkdir repo-narrow/.hg/store/data/dir2; cp {repo-sparse,repo-narrow}/.hg/store/data/dir2/z.i)
+ $ "$real_hg" verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checked 1 changesets with 2 changes to 2 files
+
+ $ "$real_hg" files -r "$tip"
+ dir1/x
+ dir1/y
+
+# TODO: even though [hg files] hides the orphaned dir2/z, [hg cat] still shows it.
+# rhg has the same issue, but at least it's not specific to rhg.
+# This is despite [hg verify] succeeding above.
+
+ $ $NO_FALLBACK rhg cat -r "$tip" dir2/z
+ z
+ $ "$real_hg" cat -r "$tip" dir2/z
+ z
@@ -588,7 +588,8 @@
}
}
-const SUPPORTED_EXTENSIONS: &[&[u8]] = &[b"blackbox", b"share"];
+const SUPPORTED_EXTENSIONS: &[&[u8]] =
+ &[b"blackbox", b"share", b"sparse", b"narrow"];
fn check_extensions(config: &Config) -> Result<(), CommandError> {
let enabled = config.get_section_keys(b"extensions");
@@ -174,6 +174,12 @@
};
let repo = invocation.repo?;
+ if repo.has_sparse() || repo.has_narrow() {
+ return Err(CommandError::unsupported(
+ "rhg status is not supported for sparse checkouts or narrow clones yet"
+ ));
+ }
+
let mut dmap = repo.dirstate_map_mut()?;
let options = StatusOptions {
@@ -40,6 +40,11 @@
let repo = invocation.repo?;
if let Some(rev) = rev {
+ if repo.has_narrow() {
+ return Err(CommandError::unsupported(
+ "rhg files -r <rev> is not support in narrow clones",
+ ));
+ }
let files = list_rev_tracked_files(repo, rev).map_err(|e| (e, rev))?;
display_files(invocation.ui, repo, files.iter())
} else {
@@ -88,6 +88,8 @@
// When it starts writing to the repository, it’ll need to either keep the
// persistent nodemap up to date or remove this entry:
NODEMAP_REQUIREMENT,
+ SPARSE_REQUIREMENT,
+ NARROW_REQUIREMENT,
];
// Copied from mercurial/requirements.py:
@@ -248,6 +248,14 @@
.contains(requirements::DIRSTATE_V2_REQUIREMENT)
}
+ pub fn has_sparse(&self) -> bool {
+ self.requirements.contains(requirements::SPARSE_REQUIREMENT)
+ }
+
+ pub fn has_narrow(&self) -> bool {
+ self.requirements.contains(requirements::NARROW_REQUIREMENT)
+ }
+
fn dirstate_file_contents(&self) -> Result<Vec<u8>, HgError> {
Ok(self
.hg_vfs()