comparison mercurial/localrepo.py @ 49306:2e726c934fcd

py3: catch FileNotFoundError instead of checking errno == ENOENT
author Manuel Jacob <me@manueljacob.de>
date Tue, 31 May 2022 22:50:01 +0200
parents d44e3c45f0e4
children 5c01ca5f9f1e
comparison
equal deleted inserted replaced
49305:53e9422a9b45 49306:2e726c934fcd
5 # 5 #
6 # This software may be used and distributed according to the terms of the 6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version. 7 # GNU General Public License version 2 or any later version.
8 8
9 9
10 import errno
11 import functools 10 import functools
12 import os 11 import os
13 import random 12 import random
14 import sys 13 import sys
15 import time 14 import time
515 514
516 def _readrequires(vfs, allowmissing): 515 def _readrequires(vfs, allowmissing):
517 """reads the require file present at root of this vfs 516 """reads the require file present at root of this vfs
518 and return a set of requirements 517 and return a set of requirements
519 518
520 If allowmissing is True, we suppress ENOENT if raised""" 519 If allowmissing is True, we suppress FileNotFoundError if raised"""
521 # requires file contains a newline-delimited list of 520 # requires file contains a newline-delimited list of
522 # features/capabilities the opener (us) must have in order to use 521 # features/capabilities the opener (us) must have in order to use
523 # the repository. This file was introduced in Mercurial 0.9.2, 522 # the repository. This file was introduced in Mercurial 0.9.2,
524 # which means very old repositories may not have one. We assume 523 # which means very old repositories may not have one. We assume
525 # a missing file translates to no requirements. 524 # a missing file translates to no requirements.
526 try: 525 try:
527 requirements = set(vfs.read(b'requires').splitlines()) 526 requirements = set(vfs.read(b'requires').splitlines())
528 except IOError as e: 527 except FileNotFoundError:
529 if not (allowmissing and e.errno == errno.ENOENT): 528 if not allowmissing:
530 raise 529 raise
531 requirements = set() 530 requirements = set()
532 return requirements 531 return requirements
533 532
534 533
581 # The .hg/ path should exist and should be a directory. All other 580 # The .hg/ path should exist and should be a directory. All other
582 # cases are errors. 581 # cases are errors.
583 if not hgvfs.isdir(): 582 if not hgvfs.isdir():
584 try: 583 try:
585 hgvfs.stat() 584 hgvfs.stat()
586 except OSError as e: 585 except FileNotFoundError:
587 if e.errno != errno.ENOENT: 586 pass
588 raise
589 except ValueError as e: 587 except ValueError as e:
590 # Can be raised on Python 3.8 when path is invalid. 588 # Can be raised on Python 3.8 when path is invalid.
591 raise error.Abort( 589 raise error.Abort(
592 _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e)) 590 _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e))
593 ) 591 )
3501 # leaving both src and dest on disk. delete dest to make sure 3499 # leaving both src and dest on disk. delete dest to make sure
3502 # the rename couldn't be such a no-op. 3500 # the rename couldn't be such a no-op.
3503 vfs.tryunlink(dest) 3501 vfs.tryunlink(dest)
3504 try: 3502 try:
3505 vfs.rename(src, dest) 3503 vfs.rename(src, dest)
3506 except OSError as exc: # journal file does not yet exist 3504 except FileNotFoundError: # journal file does not yet exist
3507 if exc.errno != errno.ENOENT: 3505 pass
3508 raise
3509 3506
3510 return a 3507 return a
3511 3508
3512 3509
3513 def undoname(fn): 3510 def undoname(fn):