406 if e.errno != errno.ENOENT: |
406 if e.errno != errno.ENOENT: |
407 raise |
407 raise |
408 |
408 |
409 raise error.RepoError(_(b'repository %s not found') % path) |
409 raise error.RepoError(_(b'repository %s not found') % path) |
410 |
410 |
|
411 # .hg/requires file contains a newline-delimited list of |
|
412 # features/capabilities the opener (us) must have in order to use |
|
413 # the repository. This file was introduced in Mercurial 0.9.2, |
|
414 # which means very old repositories may not have one. We assume |
|
415 # a missing file translates to no requirements. |
|
416 try: |
|
417 requirements = set(hgvfs.read(b'requires').splitlines()) |
|
418 except IOError as e: |
|
419 if e.errno != errno.ENOENT: |
|
420 raise |
|
421 requirements = set() |
|
422 |
411 # The .hg/hgrc file may load extensions or contain config options |
423 # The .hg/hgrc file may load extensions or contain config options |
412 # that influence repository construction. Attempt to load it and |
424 # that influence repository construction. Attempt to load it and |
413 # process any new extensions that it may have pulled in. |
425 # process any new extensions that it may have pulled in. |
414 try: |
426 try: |
415 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base) |
427 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base) |
474 # this changeset was introduced. Someone should fix |
487 # this changeset was introduced. Someone should fix |
475 # the remainig bit and drop this line |
488 # the remainig bit and drop this line |
476 'bisect.state', |
489 'bisect.state', |
477 } |
490 } |
478 |
491 |
479 def __init__(self, baseui, ui, origroot, wdirvfs, hgvfs, intents=None): |
492 def __init__(self, baseui, ui, origroot, wdirvfs, hgvfs, requirements, |
|
493 intents=None): |
480 """Create a new local repository instance. |
494 """Create a new local repository instance. |
481 |
495 |
482 Most callers should use ``hg.repository()``, ``localrepo.instance()``, |
496 Most callers should use ``hg.repository()``, ``localrepo.instance()``, |
483 or ``localrepo.makelocalrepository()`` for obtaining a new repository |
497 or ``localrepo.makelocalrepository()`` for obtaining a new repository |
484 object. |
498 object. |
543 for name in util.compengines: |
560 for name in util.compengines: |
544 engine = util.compengines[name] |
561 engine = util.compengines[name] |
545 if engine.revlogheader(): |
562 if engine.revlogheader(): |
546 self.supported.add('exp-compression-%s' % name) |
563 self.supported.add('exp-compression-%s' % name) |
547 |
564 |
548 try: |
565 # Validate that all seen repository requirements are supported. |
549 self.requirements = scmutil.readrequires(self.vfs, self.supported) |
566 missingrequirements = [] |
550 except IOError as inst: |
567 for r in requirements: |
551 if inst.errno != errno.ENOENT: |
568 if r not in self.supported: |
552 raise |
569 if not r or not r[0:1].isalnum(): |
553 self.requirements = set() |
570 raise error.RequirementError( |
|
571 _(".hg/requires file is corrupt")) |
|
572 missingrequirements.append(r) |
|
573 missingrequirements.sort() |
|
574 if missingrequirements: |
|
575 raise error.RequirementError( |
|
576 _("repository requires features unknown to this Mercurial: %s") |
|
577 % " ".join(missingrequirements), |
|
578 hint=_("see https://mercurial-scm.org/wiki/MissingRequirement" |
|
579 " for more information")) |
|
580 |
|
581 self.requirements = requirements |
554 |
582 |
555 cachepath = self.vfs.join('cache') |
583 cachepath = self.vfs.join('cache') |
556 self.sharedpath = self.path |
584 self.sharedpath = self.path |
557 try: |
585 try: |
558 sharedpath = self.vfs.read("sharedpath").rstrip('\n') |
586 sharedpath = self.vfs.read("sharedpath").rstrip('\n') |