diff mercurial/windows.py @ 43076:2372284d9457

formatting: blacken the codebase This is using my patch to black (https://github.com/psf/black/pull/826) so we don't un-wrap collection literals. Done with: hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S # skip-blame mass-reformatting only # no-check-commit reformats foo_bar functions Differential Revision: https://phab.mercurial-scm.org/D6971
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:45:02 -0400
parents 593f6359681d
children 687b865b95ad
line wrap: on
line diff
--- a/mercurial/windows.py	Sat Oct 05 10:29:34 2019 -0400
+++ b/mercurial/windows.py	Sun Oct 06 09:45:02 2019 -0400
@@ -26,6 +26,7 @@
 
 try:
     import _winreg as winreg
+
     winreg.CloseKey
 except ImportError:
     import winreg
@@ -49,6 +50,7 @@
 
 umask = 0o022
 
+
 class mixedfilemodewrapper(object):
     """Wraps a file handle when it is opened in read/write mode.
 
@@ -61,6 +63,7 @@
     mode and automatically adds checks or inserts appropriate file positioning
     calls when necessary.
     """
+
     OPNONE = 0
     OPREAD = 1
     OPWRITE = 2
@@ -124,10 +127,12 @@
         object.__setattr__(self, r'_lastop', self.OPREAD)
         return self._fp.readlines(*args, **kwargs)
 
+
 class fdproxy(object):
     """Wraps osutil.posixfile() to override the name attribute to reflect the
     underlying file name.
     """
+
     def __init__(self, name, fp):
         self.name = name
         self._fp = fp
@@ -147,10 +152,11 @@
     def __getattr__(self, name):
         return getattr(self._fp, name)
 
+
 def posixfile(name, mode='r', buffering=-1):
     '''Open a file with even more POSIX-like semantics'''
     try:
-        fp = osutil.posixfile(name, mode, buffering) # may raise WindowsError
+        fp = osutil.posixfile(name, mode, buffering)  # may raise WindowsError
 
         # PyFile_FromFd() ignores the name, and seems to report fp.name as the
         # underlying file descriptor.
@@ -168,12 +174,15 @@
         return fp
     except WindowsError as err:
         # convert to a friendlier exception
-        raise IOError(err.errno, r'%s: %s' % (
-            encoding.strfromlocal(name), err.strerror))
+        raise IOError(
+            err.errno, r'%s: %s' % (encoding.strfromlocal(name), err.strerror)
+        )
+
 
 # may be wrapped by win32mbcs extension
 listdir = osutil.listdir
 
+
 class winstdout(object):
     '''stdout on windows misbehaves if sent through a pipe'''
 
@@ -215,6 +224,7 @@
                 raise
             raise IOError(errno.EPIPE, r'Broken pipe')
 
+
 def _is_win_9x():
     '''return true if run on windows 95, 98 or me.'''
     try:
@@ -222,41 +232,50 @@
     except AttributeError:
         return 'command' in encoding.environ.get('comspec', '')
 
+
 def openhardlinks():
     return not _is_win_9x()
 
+
 def parsepatchoutput(output_line):
     """parses the output produced by patch and returns the filename"""
     pf = output_line[14:]
     if pf[0] == '`':
-        pf = pf[1:-1] # Remove the quotes
+        pf = pf[1:-1]  # Remove the quotes
     return pf
 
+
 def sshargs(sshcmd, host, user, port):
     '''Build argument list for ssh or Plink'''
     pflag = 'plink' in sshcmd.lower() and '-P' or '-p'
     args = user and ("%s@%s" % (user, host)) or host
     if args.startswith('-') or args.startswith('/'):
         raise error.Abort(
-            _('illegal ssh hostname or username starting with - or /: %s') %
-            args)
+            _('illegal ssh hostname or username starting with - or /: %s')
+            % args
+        )
     args = shellquote(args)
     if port:
         args = '%s %s %s' % (pflag, shellquote(port), args)
     return args
 
+
 def setflags(f, l, x):
     pass
 
+
 def copymode(src, dst, mode=None, enforcewritable=False):
     pass
 
+
 def checkexec(path):
     return False
 
+
 def checklink(path):
     return False
 
+
 def setbinary(fd):
     # When run without console, pipes may expose invalid
     # fileno(), usually set to -1.
@@ -264,25 +283,32 @@
     if fno is not None and fno() >= 0:
         msvcrt.setmode(fno(), os.O_BINARY)
 
+
 def pconvert(path):
     return path.replace(pycompat.ossep, '/')
 
+
 def localpath(path):
     return path.replace('/', '\\')
 
+
 def normpath(path):
     return pconvert(os.path.normpath(path))
 
+
 def normcase(path):
-    return encoding.upper(path) # NTFS compares via upper()
+    return encoding.upper(path)  # NTFS compares via upper()
+
 
 # see posix.py for definitions
 normcasespec = encoding.normcasespecs.upper
 normcasefallback = encoding.upperfallback
 
+
 def samestat(s1, s2):
     return False
 
+
 def shelltocmdexe(path, env):
     r"""Convert shell variables in the form $var and ${var} inside ``path``
     to %var% form.  Existing Windows style variables are left unchanged.
@@ -318,9 +344,9 @@
     index = 0
     pathlen = len(path)
     while index < pathlen:
-        c = path[index:index + 1]
-        if c == b'\'':   # no expansion within single quotes
-            path = path[index + 1:]
+        c = path[index : index + 1]
+        if c == b'\'':  # no expansion within single quotes
+            path = path[index + 1 :]
             pathlen = len(path)
             try:
                 index = path.index(b'\'')
@@ -329,7 +355,7 @@
                 res += c + path
                 index = pathlen - 1
         elif c == b'%':  # variable
-            path = path[index + 1:]
+            path = path[index + 1 :]
             pathlen = len(path)
             try:
                 index = path.index(b'%')
@@ -340,8 +366,8 @@
                 var = path[:index]
                 res += b'%' + var + b'%'
         elif c == b'$':  # variable
-            if path[index + 1:index + 2] == b'{':
-                path = path[index + 2:]
+            if path[index + 1 : index + 2] == b'{':
+                path = path[index + 2 :]
                 pathlen = len(path)
                 try:
                     index = path.index(b'}')
@@ -358,11 +384,11 @@
             else:
                 var = b''
                 index += 1
-                c = path[index:index + 1]
+                c = path[index : index + 1]
                 while c != b'' and c in varchars:
                     var += c
                     index += 1
-                    c = path[index:index + 1]
+                    c = path[index : index + 1]
                 # Some variables (like HG_OLDNODE) may be defined, but have an
                 # empty value.  Those need to be skipped because when spawning
                 # cmd.exe to run the hook, it doesn't replace %VAR% for an empty
@@ -376,13 +402,19 @@
 
                 if c != b'':
                     index -= 1
-        elif (c == b'~' and index + 1 < pathlen
-              and path[index + 1:index + 2] in (b'\\', b'/')):
+        elif (
+            c == b'~'
+            and index + 1 < pathlen
+            and path[index + 1 : index + 2] in (b'\\', b'/')
+        ):
             res += "%USERPROFILE%"
-        elif (c == b'\\' and index + 1 < pathlen
-              and path[index + 1:index + 2] in (b'$', b'~')):
+        elif (
+            c == b'\\'
+            and index + 1 < pathlen
+            and path[index + 1 : index + 2] in (b'$', b'~')
+        ):
             # Skip '\', but only if it is escaping $ or ~
-            res += path[index + 1:index + 2]
+            res += path[index + 1 : index + 2]
             index += 1
         else:
             res += c
@@ -390,6 +422,7 @@
         index += 1
     return res
 
+
 # A sequence of backslashes is special iff it precedes a double quote:
 # - if there's an even number of backslashes, the double quote is not
 #   quoted (i.e. it ends the quoted region)
@@ -403,6 +436,8 @@
 # quote we've appended to the end)
 _quotere = None
 _needsshellquote = None
+
+
 def shellquote(s):
     r"""
     >>> shellquote(br'C:\Users\xyz')
@@ -432,15 +467,18 @@
         return s
     return b'"%s"' % _quotere.sub(br'\1\1\\\2', s)
 
+
 def _unquote(s):
     if s.startswith(b'"') and s.endswith(b'"'):
         return s[1:-1]
     return s
 
+
 def shellsplit(s):
     """Parse a command string in cmd.exe way (best-effort)"""
     return pycompat.maplist(_unquote, pycompat.shlexsplit(s, posix=False))
 
+
 def quotecommand(cmd):
     """Build a command string suitable for os.popen* calls."""
     if sys.version_info < (2, 7, 1):
@@ -448,11 +486,13 @@
         return '"' + cmd + '"'
     return cmd
 
+
 # if you change this stub into a real check, please try to implement the
 # username and groupname functions above, too.
 def isowner(st):
     return True
 
+
 def findexe(command):
     '''Find executable for command searching like cmd.exe does.
     If command is a basename then PATH is searched for command.
@@ -481,51 +521,60 @@
             return executable
     return findexisting(os.path.expanduser(os.path.expandvars(command)))
 
+
 _wantedkinds = {stat.S_IFREG, stat.S_IFLNK}
 
+
 def statfiles(files):
     '''Stat each file in files. Yield each stat, or None if a file
     does not exist or has a type we don't care about.
 
     Cluster and cache stat per directory to minimize number of OS stat calls.'''
-    dircache = {} # dirname -> filename -> status | None if file does not exist
+    dircache = {}  # dirname -> filename -> status | None if file does not exist
     getkind = stat.S_IFMT
     for nf in files:
-        nf  = normcase(nf)
+        nf = normcase(nf)
         dir, base = os.path.split(nf)
         if not dir:
             dir = '.'
         cache = dircache.get(dir, None)
         if cache is None:
             try:
-                dmap = dict([(normcase(n), s)
-                             for n, k, s in listdir(dir, True)
-                             if getkind(s.st_mode) in _wantedkinds])
+                dmap = dict(
+                    [
+                        (normcase(n), s)
+                        for n, k, s in listdir(dir, True)
+                        if getkind(s.st_mode) in _wantedkinds
+                    ]
+                )
             except OSError as err:
                 # Python >= 2.5 returns ENOENT and adds winerror field
                 # EINVAL is raised if dir is not a directory.
-                if err.errno not in (errno.ENOENT, errno.EINVAL,
-                                     errno.ENOTDIR):
+                if err.errno not in (errno.ENOENT, errno.EINVAL, errno.ENOTDIR):
                     raise
                 dmap = {}
             cache = dircache.setdefault(dir, dmap)
         yield cache.get(base, None)
 
+
 def username(uid=None):
     """Return the name of the user with the given uid.
 
     If uid is None, return the name of the current user."""
     return None
 
+
 def groupname(gid=None):
     """Return the name of the group with the given gid.
 
     If gid is None, return the name of the current group."""
     return None
 
+
 def readlink(pathname):
     return pycompat.fsencode(os.readlink(pycompat.fsdecode(pathname)))
 
+
 def removedirs(name):
     """special version of os.removedirs that does not remove symlinked
     directories or junction points if they actually contain files"""
@@ -544,6 +593,7 @@
             break
         head, tail = os.path.split(head)
 
+
 def rename(src, dst):
     '''atomically rename file src to dst, replacing dst if it exists'''
     try:
@@ -554,16 +604,20 @@
         unlink(dst)
         os.rename(src, dst)
 
+
 def gethgcmd():
     return [encoding.strtolocal(arg) for arg in [sys.executable] + sys.argv[:1]]
 
+
 def groupmembers(name):
     # Don't support groups on Windows for now
     raise KeyError
 
+
 def isexec(f):
     return False
 
+
 class cachestat(object):
     def __init__(self, path):
         pass
@@ -571,6 +625,7 @@
     def cacheable(self):
         return False
 
+
 def lookupreg(key, valname=None, scope=None):
     ''' Look up a key/value name in the Windows registry.
 
@@ -594,20 +649,25 @@
         except EnvironmentError:
             pass
 
+
 expandglobs = True
 
+
 def statislink(st):
     '''check whether a stat result is a symlink'''
     return False
 
+
 def statisexec(st):
     '''check whether a stat result is an executable file'''
     return False
 
+
 def poll(fds):
     # see posix.py for description
     raise NotImplementedError()
 
+
 def readpipe(pipe):
     """Read all available data from a pipe."""
     chunks = []
@@ -623,5 +683,6 @@
 
     return ''.join(chunks)
 
+
 def bindunixsocket(sock, path):
     raise NotImplementedError(r'unsupported platform')