D4570: statichttprepo: use new functions for requirements validation

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Thu Sep 13 16:30:57 UTC 2018


indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The new code in localrepo for requirements gathering and validation
  is more robust than scmutil.readrequires(). Let's port statichttprepo
  to it.
  
  Since scmutil.readrequires() is no longer used, it has been removed.
  
  It is possible extensions were monkeypatching this to supplement the
  set of supported requirements. But the proper way to do that is to
  register a featuresetupfuncs. I'm comfortable forcing the API break
  because featuresetupfuncs is more robust and has been supported for
  a while.
  
  .. api::
  
    ``scmutil.readrequires()`` has been removed.
    
    Use ``localrepo.featuresetupfuncs`` to register new repository
    requirements.
    
    Use ``localrepo.ensurerequirementsrecognized()`` to validate them.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D4570

AFFECTED FILES
  mercurial/scmutil.py
  mercurial/statichttprepo.py

CHANGE DETAILS

diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -19,7 +19,6 @@
     manifest,
     namespaces,
     pathutil,
-    scmutil,
     store,
     url,
     util,
@@ -156,7 +155,7 @@
         self.filtername = None
 
         try:
-            requirements = scmutil.readrequires(self.vfs, self.supported)
+            requirements = set(self.vfs.read(b'requires').splitlines())
         except IOError as inst:
             if inst.errno != errno.ENOENT:
                 raise
@@ -174,6 +173,10 @@
                 msg = _("'%s' does not appear to be an hg repository") % path
                 raise error.RepoError(msg)
 
+        supportedrequirements = localrepo.gathersupportedrequirements(ui)
+        localrepo.ensurerequirementsrecognized(requirements,
+                                               supportedrequirements)
+
         # setup store
         self.store = store.store(requirements, self.path, vfsclass)
         self.spath = self.store.path
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -1145,25 +1145,6 @@
         elif not dryrun:
             wctx.copy(origsrc, dst)
 
-def readrequires(opener, supported):
-    '''Reads and parses .hg/requires and checks if all entries found
-    are in the list of supported features.'''
-    requirements = set(opener.read("requires").splitlines())
-    missings = []
-    for r in requirements:
-        if r not in supported:
-            if not r or not r[0:1].isalnum():
-                raise error.RequirementError(_(".hg/requires file is corrupt"))
-            missings.append(r)
-    missings.sort()
-    if missings:
-        raise error.RequirementError(
-            _("repository requires features unknown to this Mercurial: %s")
-            % " ".join(missings),
-            hint=_("see https://mercurial-scm.org/wiki/MissingRequirement"
-                   " for more information"))
-    return requirements
-
 def writerequires(opener, requirements):
     with opener('requires', 'w') as fp:
         for r in sorted(requirements):



To: indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list