D4099: narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Fri Aug 3 21:25:00 UTC 2018
martinvonz created this revision.
Herald added a reviewer: durin42.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
The narrowspec is more closely related to the store than to the
working copy. For example, if the narrowspec changes, the set of
revlogs also needs to change (the working copy may change, but that
depends on which commit is checked out). Also, when using the share
extension, the narrowspec needs to be shared along with the
store. This patch therefore moves the narrowspec into the store/
directory.
This is clearly a breaking change, but I haven't bothered trying to
fall back to reading the narrowspec from the old location (.hg/),
because there are very few users of narrow out there. (We'll add a
temporary hack to our Google-internal extension to handle the
migration.)
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D4099
AFFECTED FILES
hgext/narrow/__init__.py
hgext/narrow/narrowrepo.py
mercurial/localrepo.py
mercurial/narrowspec.py
mercurial/store.py
tests/test-narrow-debugcommands.t
CHANGE DETAILS
diff --git a/tests/test-narrow-debugcommands.t b/tests/test-narrow-debugcommands.t
--- a/tests/test-narrow-debugcommands.t
+++ b/tests/test-narrow-debugcommands.t
@@ -1,7 +1,7 @@
$ . "$TESTDIR/narrow-library.sh"
$ hg init repo
$ cd repo
- $ cat << EOF > .hg/narrowspec
+ $ cat << EOF > .hg/store/narrowspec
> [includes]
> path:foo
> [excludes]
diff --git a/mercurial/store.py b/mercurial/store.py
--- a/mercurial/store.py
+++ b/mercurial/store.py
@@ -317,8 +317,8 @@
mode = None
return mode
-_data = ('data meta 00manifest.d 00manifest.i 00changelog.d 00changelog.i'
- ' phaseroots obsstore')
+_data = ('narrowspec data meta 00manifest.d 00manifest.i'
+ ' 00changelog.d 00changelog.i phaseroots obsstore')
def isrevlog(f, kind, st):
return kind == stat.S_IFREG and f[-2:] in ('.i', '.d')
@@ -546,7 +546,7 @@
raise
def copylist(self):
- d = ('data meta dh fncache phaseroots obsstore'
+ d = ('narrowspec data meta dh fncache phaseroots obsstore'
' 00manifest.d 00manifest.i 00changelog.d 00changelog.i')
return (['requires', '00changelog.i'] +
['store/' + f for f in d.split()])
diff --git a/mercurial/narrowspec.py b/mercurial/narrowspec.py
--- a/mercurial/narrowspec.py
+++ b/mercurial/narrowspec.py
@@ -130,7 +130,7 @@
def load(repo):
try:
- spec = repo.vfs.read(FILENAME)
+ spec = repo.svfs.read(FILENAME)
except IOError as e:
# Treat "narrowspec does not exist" the same as "narrowspec file exists
# and is empty".
@@ -141,19 +141,19 @@
def save(repo, includepats, excludepats):
spec = format(includepats, excludepats)
- repo.vfs.write(FILENAME, spec)
+ repo.svfs.write(FILENAME, spec)
def savebackup(repo, backupname):
if repository.NARROW_REQUIREMENT not in repo.requirements:
return
vfs = repo.vfs
vfs.tryunlink(backupname)
- util.copyfile(vfs.join(FILENAME), vfs.join(backupname), hardlink=True)
+ util.copyfile(repo.svfs.join(FILENAME), vfs.join(backupname), hardlink=True)
def restorebackup(repo, backupname):
if repository.NARROW_REQUIREMENT not in repo.requirements:
return
- repo.vfs.rename(backupname, FILENAME)
+ util.rename(repo.vfs.join(backupname), repo.svfs.join(FILENAME))
def clearbackup(repo, backupname):
if repository.NARROW_REQUIREMENT not in repo.requirements:
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -811,7 +811,7 @@
" working parent %s!\n") % short(node))
return nullid
- @repofilecache(narrowspec.FILENAME)
+ @storecache(narrowspec.FILENAME)
def narrowpats(self):
"""matcher patterns for this repository's narrowspec
@@ -823,7 +823,7 @@
source = hg.sharedreposource(self)
return narrowspec.load(source)
- @repofilecache(narrowspec.FILENAME)
+ @storecache(narrowspec.FILENAME)
def _narrowmatch(self):
if repository.NARROW_REQUIREMENT not in self.requirements:
return matchmod.always(self.root, '')
diff --git a/hgext/narrow/narrowrepo.py b/hgext/narrow/narrowrepo.py
--- a/hgext/narrow/narrowrepo.py
+++ b/hgext/narrow/narrowrepo.py
@@ -7,34 +7,11 @@
from __future__ import absolute_import
-from mercurial import (
- hg,
- narrowspec,
- repository,
-)
-
from . import (
narrowdirstate,
narrowrevlog,
)
-def wrappostshare(orig, sourcerepo, destrepo, **kwargs):
- orig(sourcerepo, destrepo, **kwargs)
- if repository.NARROW_REQUIREMENT in sourcerepo.requirements:
- with destrepo.wlock():
- with destrepo.vfs('shared', 'a') as fp:
- fp.write(narrowspec.FILENAME + '\n')
-
-def unsharenarrowspec(orig, ui, repo, repopath):
- if (repository.NARROW_REQUIREMENT in repo.requirements
- and repo.path == repopath and repo.shared()):
- srcrepo = hg.sharedreposource(repo)
- with srcrepo.vfs(narrowspec.FILENAME) as f:
- spec = f.read()
- with repo.vfs(narrowspec.FILENAME, 'w') as f:
- f.write(spec)
- return orig(ui, repo, repopath)
-
def wraprepo(repo):
"""Enables narrow clone functionality on a single local repository."""
diff --git a/hgext/narrow/__init__.py b/hgext/narrow/__init__.py
--- a/hgext/narrow/__init__.py
+++ b/hgext/narrow/__init__.py
@@ -16,7 +16,6 @@
from mercurial import (
extensions,
- hg,
localrepo,
registrar,
repository,
@@ -86,8 +85,6 @@
def extsetup(ui):
extensions.wrapfunction(verifymod.verifier, '__init__', _verifierinit)
- extensions.wrapfunction(hg, 'postshare', narrowrepo.wrappostshare)
- extensions.wrapfunction(hg, 'copystore', narrowrepo.unsharenarrowspec)
templatekeyword = narrowtemplates.templatekeyword
revsetpredicate = narrowtemplates.revsetpredicate
To: martinvonz, durin42, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list