# HG changeset patch # User Shun-ichi GOTO # Date 2013-07-12 02:14:42 # Node ID 004f965630d907a3417a93e87d056ad4c2dab541 # Parent 68f7129af6a84eeb0f22c24a4ee00f017f245bd3 osutil: consider WindowsError's behaviour to support python 2.4 on Windows This change treat the ESRCH error as ENOENT like WindowsError class does in python 2.5 or later. Without this change, some try..execpt code which expects errno is ENOENT may fail. Actually hg command does not work with python 2.4 on Windows. CreateFile() will fail with error code ESRCH when parent directory of specified path is not exist, or ENOENT when parent directory exist but file is not exist. Two errors are same in the mean of "file is not exist". So WindowsError class treats error code ESRCH as ENOENT in python 2.5 or later, but python 2.4 does not. Actual results with python 2.4: >>> errno.ENOENT 2 >>> errno.ESRCH 3 >>> WindowsError(3, 'msg').errno 3 >>> WindowsError(3, 'msg').args (3, 'msg') And with python 2.5 (or later): >>> errno.ENOENT 2 >>> errno.ESRCH 3 >>> WindowsError(3, 'msg').errno 2 >>> WindowsError(3, 'msg').args (3, 'msg') Note that there is no need to fix osutil.c because it never be used with python 2.4. diff --git a/mercurial/pure/osutil.py b/mercurial/pure/osutil.py --- a/mercurial/pure/osutil.py +++ b/mercurial/pure/osutil.py @@ -59,6 +59,7 @@ if os.name != 'nt': posixfile = open else: import ctypes, msvcrt + from errno import ESRCH, ENOENT _kernel32 = ctypes.windll.kernel32 @@ -98,7 +99,14 @@ else: def _raiseioerror(name): err = ctypes.WinError() - raise IOError(err.errno, '%s: %s' % (name, err.strerror)) + # For python 2.4, treat ESRCH as ENOENT like WindowsError does + # in python 2.5 or later. + # py24: WindowsError(3, '').errno => 3 + # py25 or later: WindowsError(3, '').errno => 2 + errno = err.errno + if errno == ESRCH: + errno = ENOENT + raise IOError(errno, '%s: %s' % (name, err.strerror)) class posixfile(object): '''a file object aiming for POSIX-like semantics