annotate mercurial/windows.py @ 52221:00cdec2398ee stable

run-tests: cleanup the "output" directory after the related tests The output confused the test discovery when left around. And it confuse the Linux and the Windows one a bit differently, so we better clean it up as it serve not purpose to keep it around.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 11 Nov 2024 05:42:44 +0100
parents 19ae7730636a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
1 # windows.py - Windows utility function implementations for Mercurial
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 45942
diff changeset
3 # Copyright 2005-2009 Olivia Mackall <olivia@selenic.com> and others
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
4 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9594
diff changeset
6 # GNU General Public License version 2 or any later version.
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51799
diff changeset
8 from __future__ import annotations
8421
b6d0fa8c7685 posixfile: remove posixfile_nt and fix import bug in windows.py
Sune Foldager <cryo@cyanite.org>
parents: 8364
diff changeset
9
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
10 import errno
43904
1b26cb044097 windows: if username(uid=None) is loaded, just use getpass
Augie Fackler <augie@google.com>
parents: 43787
diff changeset
11 import getpass
49319
a75b530cfc29 typing: add a missing suppression directive for `msvcrt`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49318
diff changeset
12 import msvcrt # pytype: disable=import-error
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
13 import os
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
14 import re
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
15 import stat
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
16 import string
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
17 import sys
49818
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
18 import typing
49318
6b39c7265935 windows: drop some py2 compatibility code
Matt Harbison <matt_harbison@yahoo.com>
parents: 49317
diff changeset
19 import winreg # pytype: disable=import-error
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
20
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
21 from typing import (
52024
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
22 Any,
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
23 AnyStr,
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
24 BinaryIO,
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
25 Iterable,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
26 Iterator,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
27 List,
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
28 Mapping,
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
29 NoReturn,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
30 Optional,
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
31 Pattern,
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
32 Sequence,
49818
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
33 Tuple,
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
34 Union,
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
35 )
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
36
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
37 from .i18n import _
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
38 from . import (
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
39 encoding,
33651
739cc0f9cbb4 ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents: 32686
diff changeset
40 error,
32367
a9c71d578a1c osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
41 policy,
30612
d623cc6b3742 py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30474
diff changeset
42 pycompat,
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
43 typelib,
27436
912255f8f087 windows: correct the import of win32
Matt Harbison <matt_harbison@yahoo.com>
parents: 27360
diff changeset
44 win32,
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
45 )
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
46
29760
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
47
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
48 osutil = policy.importmod('osutil')
32367
a9c71d578a1c osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
49
35513
c4caf530b1c7 util: add a function to show the mount point of the filesystem
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
50 getfsmountpoint = win32.getvolumename
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35509
diff changeset
51 getfstype = win32.getfstype
15016
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
52 getuser = win32.getuser
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
53 hidewindow = win32.hidewindow
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
54 makedir = win32.makedir
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
55 nlinks = win32.nlinks
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
56 oslink = win32.oslink
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
57 samedevice = win32.samedevice
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
58 samefile = win32.samefile
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
59 setsignalhandler = win32.setsignalhandler
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
60 spawndetached = win32.spawndetached
17560
9ee25d7b1aed util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents: 17537
diff changeset
61 split = os.path.split
15016
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
62 testpid = win32.testpid
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
63 unlink = win32.unlink
14985
dbf91976f900 windows: eliminate win32 wildcard import
Adrian Buehlmann <adrian@cadifra.com>
parents: 14969
diff changeset
64
49818
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
65 if typing.TYPE_CHECKING:
51285
9d3721552b6c pytype: import typing directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50929
diff changeset
66
49818
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
67 def split(p: bytes) -> Tuple[bytes, bytes]:
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
68 raise NotImplementedError
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
69
3fd5824f1177 typing: attempt to remove @overloads in the platform module for stdlib methods
Matt Harbison <matt_harbison@yahoo.com>
parents: 49817
diff changeset
70
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
71 umask: int = 0o022
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
72
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
73
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48899
diff changeset
74 class mixedfilemodewrapper:
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
75 """Wraps a file handle when it is opened in read/write mode.
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
76
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
77 fopen() and fdopen() on Windows have a specific-to-Windows requirement
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
78 that files opened with mode r+, w+, or a+ make a call to a file positioning
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
79 function when switching between reads and writes. Without this extra call,
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
80 Python will raise a not very intuitive "IOError: [Errno 0] Error."
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
81
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
82 This class wraps posixfile instances when the file is opened in read/write
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
83 mode and automatically adds checks or inserts appropriate file positioning
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
84 calls when necessary.
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
85 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
86
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
87 OPNONE = 0
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
88 OPREAD = 1
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
89 OPWRITE = 2
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
90
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
91 def __init__(self, fp):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
92 object.__setattr__(self, '_fp', fp)
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
93 object.__setattr__(self, '_lastop', 0)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
94
31891
87f293edabb6 windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 31644
diff changeset
95 def __enter__(self):
40938
9ae4aed27930 windows: ensure mixedfilemodewrapper fd doesn't escape by entering context mgr
Matt Harbison <matt_harbison@yahoo.com>
parents: 40937
diff changeset
96 self._fp.__enter__()
9ae4aed27930 windows: ensure mixedfilemodewrapper fd doesn't escape by entering context mgr
Matt Harbison <matt_harbison@yahoo.com>
parents: 40937
diff changeset
97 return self
31891
87f293edabb6 windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 31644
diff changeset
98
87f293edabb6 windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 31644
diff changeset
99 def __exit__(self, exc_type, exc_val, exc_tb):
87f293edabb6 windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 31644
diff changeset
100 self._fp.__exit__(exc_type, exc_val, exc_tb)
87f293edabb6 windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents: 31644
diff changeset
101
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
102 def __getattr__(self, name):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
103 return getattr(self._fp, name)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
104
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
105 def __setattr__(self, name, value):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
106 return self._fp.__setattr__(name, value)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
107
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
108 def _noopseek(self):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
109 self._fp.seek(0, os.SEEK_CUR)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
110
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
111 def seek(self, *args, **kwargs):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
112 object.__setattr__(self, '_lastop', self.OPNONE)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
113 return self._fp.seek(*args, **kwargs)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
114
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
115 def write(self, d):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
116 if self._lastop == self.OPREAD:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
117 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
118
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
119 object.__setattr__(self, '_lastop', self.OPWRITE)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
120 return self._fp.write(d)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
121
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
122 def writelines(self, *args, **kwargs):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
123 if self._lastop == self.OPREAD:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
124 self._noopeseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
125
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
126 object.__setattr__(self, '_lastop', self.OPWRITE)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
127 return self._fp.writelines(*args, **kwargs)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
128
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
129 def read(self, *args, **kwargs):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
130 if self._lastop == self.OPWRITE:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
131 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
132
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
133 object.__setattr__(self, '_lastop', self.OPREAD)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
134 return self._fp.read(*args, **kwargs)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
135
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
136 def readline(self, *args, **kwargs):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
137 if self._lastop == self.OPWRITE:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
138 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
139
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
140 object.__setattr__(self, '_lastop', self.OPREAD)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
141 return self._fp.readline(*args, **kwargs)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
142
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
143 def readlines(self, *args, **kwargs):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
144 if self._lastop == self.OPWRITE:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
145 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
146
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
147 object.__setattr__(self, '_lastop', self.OPREAD)
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
148 return self._fp.readlines(*args, **kwargs)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
149
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
150
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48899
diff changeset
151 class fdproxy:
39820
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
152 """Wraps osutil.posixfile() to override the name attribute to reflect the
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
153 underlying file name.
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
154 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
155
39820
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
156 def __init__(self, name, fp):
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
157 self.name = name
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
158 self._fp = fp
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
159
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
160 def __enter__(self):
40937
e11e03f72baf py3: ensure the proxied Windows fd doesn't escape by entering context manager
Matt Harbison <matt_harbison@yahoo.com>
parents: 40266
diff changeset
161 self._fp.__enter__()
e11e03f72baf py3: ensure the proxied Windows fd doesn't escape by entering context manager
Matt Harbison <matt_harbison@yahoo.com>
parents: 40266
diff changeset
162 # Return this wrapper for the context manager so that the name is
e11e03f72baf py3: ensure the proxied Windows fd doesn't escape by entering context manager
Matt Harbison <matt_harbison@yahoo.com>
parents: 40266
diff changeset
163 # still available.
e11e03f72baf py3: ensure the proxied Windows fd doesn't escape by entering context manager
Matt Harbison <matt_harbison@yahoo.com>
parents: 40266
diff changeset
164 return self
39820
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
165
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
166 def __exit__(self, exc_type, exc_value, traceback):
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
167 self._fp.__exit__(exc_type, exc_value, traceback)
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
168
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
169 def __iter__(self):
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
170 return iter(self._fp)
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
171
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
172 def __getattr__(self, name):
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
173 return getattr(self._fp, name)
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
174
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
175
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 def posixfile(name, mode=b'r', buffering=-1):
24069
c6666395fdd2 windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents: 24051
diff changeset
177 '''Open a file with even more POSIX-like semantics'''
8421
b6d0fa8c7685 posixfile: remove posixfile_nt and fix import bug in windows.py
Sune Foldager <cryo@cyanite.org>
parents: 8364
diff changeset
178 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
179 fp = osutil.posixfile(name, mode, buffering) # may raise WindowsError
24051
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
180
39820
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
181 # PyFile_FromFd() ignores the name, and seems to report fp.name as the
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
182 # underlying file descriptor.
48898
a98e32e5fca1 windows: remove conditional for Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
183 fp = fdproxy(name, fp)
39820
68ea1f8dcb84 py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
184
24051
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
185 # The position when opening in append mode is implementation defined, so
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
186 # make it consistent with other platforms, which position at EOF.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
187 if b'a' in mode:
25462
021e68d37c5b windows: use os.SEEK_END
Adrian Buehlmann <adrian@cadifra.com>
parents: 25420
diff changeset
188 fp.seek(0, os.SEEK_END)
24051
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
189
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
190 if b'+' in mode:
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
191 return mixedfilemodewrapper(fp)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
192
24051
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
193 return fp
48009
94d4a3f78e99 typing: suppress an name-error warning in `mercurial/windows.py`
Matt Harbison <matt_harbison@yahoo.com>
parents: 47866
diff changeset
194 except WindowsError as err: # pytype: disable=name-error
24069
c6666395fdd2 windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents: 24051
diff changeset
195 # convert to a friendlier exception
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
196 raise IOError(
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
197 err.errno, '%s: %s' % (encoding.strfromlocal(name), err.strerror)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
198 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
199
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
200
32208
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31891
diff changeset
201 # may be wrapped by win32mbcs extension
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31891
diff changeset
202 listdir = osutil.listdir
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31891
diff changeset
203
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
204
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
205 def get_password() -> bytes:
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
206 """Prompt for password with echo off, using Windows getch().
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
207
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
208 This shouldn't be called directly- use ``ui.getpass()`` instead, which
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
209 checks if the session is interactive first.
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
210 """
47789
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
211 pw = u""
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
212 while True:
47424
f77404040776 typing: disable warnings for a couple of Windows specific attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47079
diff changeset
213 c = msvcrt.getwch() # pytype: disable=module-attr
47789
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
214 if c == u'\r' or c == u'\n':
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
215 break
47789
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
216 if c == u'\003':
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
217 raise KeyboardInterrupt
47789
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
218 if c == u'\b':
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
219 pw = pw[:-1]
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
220 else:
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
221 pw = pw + c
47789
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
222 msvcrt.putwch(u'\r') # pytype: disable=module-attr
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
223 msvcrt.putwch(u'\n') # pytype: disable=module-attr
064cd182555f windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents: 47622
diff changeset
224 return encoding.unitolocal(pw)
47079
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
225
5b3513177f2b util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents: 46819
diff changeset
226
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
227 class winstdout(typelib.BinaryIO_Proxy):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
228 """Some files on Windows misbehave.
45145
aea246bc04bd windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents: 44867
diff changeset
229
aea246bc04bd windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents: 44867
diff changeset
230 When writing to a broken pipe, EINVAL instead of EPIPE may be raised.
aea246bc04bd windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents: 44867
diff changeset
231
aea246bc04bd windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents: 44867
diff changeset
232 When writing too many bytes to a console at the same, a "Not enough space"
aea246bc04bd windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents: 44867
diff changeset
233 error may happen. Python 3 already works around that.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
234 """
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
235
49793
8147abc05794 pytype: stop excluding mercurial/ui.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49518
diff changeset
236 def __init__(self, fp: BinaryIO):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
237 self.fp = fp
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
238
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
239 def __getattr__(self, key):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
240 return getattr(self.fp, key)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
241
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
242 def close(self):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
243 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
244 self.fp.close()
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
245 except IOError:
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
246 pass
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
247
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
248 def write(self, s):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
249 try:
48899
563eb25e079b windows: remove write throttling support
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48898
diff changeset
250 return self.fp.write(s)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
251 except IOError as inst:
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 37460
diff changeset
252 if inst.errno != 0 and not win32.lasterrorwaspipeerror(inst):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
253 raise
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
254 self.close()
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
255 raise IOError(errno.EPIPE, 'Broken pipe')
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
256
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
257 def flush(self):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
258 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
259 return self.fp.flush()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
260 except IOError as inst:
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 37460
diff changeset
261 if not win32.lasterrorwaspipeerror(inst):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
262 raise
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
263 raise IOError(errno.EPIPE, 'Broken pipe')
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
264
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
265
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
266 def openhardlinks() -> bool:
43922
70abcb614a5c windows: drop detection of Windows 95/98/ME
Matt Harbison <matt_harbison@yahoo.com>
parents: 43904
diff changeset
267 return True
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
268
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
269
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
270 def parsepatchoutput(output_line: bytes) -> bytes:
8761
0289f384e1e5 Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents: 8657
diff changeset
271 """parses the output produced by patch and returns the filename"""
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
272 pf = output_line[14:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
273 if pf[0] == b'`':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
274 pf = pf[1:-1] # Remove the quotes
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
275 return pf
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
276
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
277
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
278 def sshargs(
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
279 sshcmd: bytes, host: bytes, user: Optional[bytes], port: Optional[bytes]
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
280 ) -> bytes:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
281 '''Build argument list for ssh or Plink'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
282 pflag = b'plink' in sshcmd.lower() and b'-P' or b'-p'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 args = user and (b"%s@%s" % (user, host)) or host
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
284 if args.startswith(b'-') or args.startswith(b'/'):
33651
739cc0f9cbb4 ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents: 32686
diff changeset
285 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
286 _(b'illegal ssh hostname or username starting with - or /: %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
287 % args
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
288 )
33659
8cb9e921ef8c ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents: 33651
diff changeset
289 args = shellquote(args)
8cb9e921ef8c ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents: 33651
diff changeset
290 if port:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
291 args = b'%s %s %s' % (pflag, shellquote(port), args)
33659
8cb9e921ef8c ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents: 33651
diff changeset
292 return args
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
294
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
295 def setflags(f: bytes, l: bool, x: bool) -> None:
15011
5e44e4b3a0a3 util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 14985
diff changeset
296 pass
5e44e4b3a0a3 util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 14985
diff changeset
297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
298
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
299 def copymode(
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
300 src: bytes,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
301 dst: bytes,
51799
1888846a1ee2 typing: fix the hint for the `mode` argument of `platform.copymode()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51720
diff changeset
302 mode: Optional[int] = None,
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
303 enforcewritable: bool = False,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
304 ) -> None:
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
305 pass
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
306
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
307
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
308 def checkexec(path: bytes) -> bool:
13879
5b0a3f6cbead util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13777
diff changeset
309 return False
5b0a3f6cbead util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13777
diff changeset
310
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
311
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
312 def checklink(path: bytes) -> bool:
13890
31eb145b50b6 util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13879
diff changeset
313 return False
31eb145b50b6 util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13879
diff changeset
314
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
315
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
316 def setbinary(fd) -> None:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
317 # When run without console, pipes may expose invalid
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
318 # fileno(), usually set to -1.
14969
a3f97038c1c2 windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14927
diff changeset
319 fno = getattr(fd, 'fileno', None)
a3f97038c1c2 windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14927
diff changeset
320 if fno is not None and fno() >= 0:
43768
fe73ec69350e windows: suppress pytype warnings for Windows imports and functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
321 msvcrt.setmode(fno(), os.O_BINARY) # pytype: disable=module-attr
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
322
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
323
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
324 def pconvert(path: bytes) -> bytes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
325 return path.replace(pycompat.ossep, b'/')
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
326
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
327
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
328 def localpath(path: bytes) -> bytes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 return path.replace(b'/', b'\\')
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
330
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
331
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
332 def normpath(path: bytes) -> bytes:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
333 return pconvert(os.path.normpath(path))
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
334
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
335
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
336 def normcase(path: bytes) -> bytes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
337 return encoding.upper(path) # NTFS compares via upper()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
338
15488
6eff984d8e76 dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents: 15016
diff changeset
339
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
340 DRIVE_RE_B: Pattern[bytes] = re.compile(b'^[a-z]:')
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
341 DRIVE_RE_S: Pattern[str] = re.compile('^[a-z]:')
47622
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
342
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
343
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
344 # TODO: why is this accepting str?
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
345 def abspath(path: AnyStr) -> AnyStr:
47622
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
346 abs_path = os.path.abspath(path) # re-exports
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
347 # Python on Windows is inconsistent regarding the capitalization of drive
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
348 # letter and this cause issue with various path comparison along the way.
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
349 # So we normalize the drive later to upper case here.
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
350 #
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
351 # See https://bugs.python.org/issue40368 for and example of this hell.
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
352 if isinstance(abs_path, bytes):
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
353 if DRIVE_RE_B.match(abs_path):
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
354 abs_path = abs_path[0:1].upper() + abs_path[1:]
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
355 elif DRIVE_RE_S.match(abs_path):
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
356 abs_path = abs_path[0:1].upper() + abs_path[1:]
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
357 return abs_path
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
358
bb917eea1605 windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47424
diff changeset
359
24598
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
360 # see posix.py for definitions
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
361 normcasespec: int = encoding.normcasespecs.upper
24598
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
362 normcasefallback = encoding.upperfallback
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
364
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
365 def samestat(s1: os.stat_result, s2: os.stat_result) -> bool:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
366 return False
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
367
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
368
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
369 def shelltocmdexe(path: bytes, env: Mapping[bytes, bytes]) -> bytes:
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
370 r"""Convert shell variables in the form $var and ${var} inside ``path``
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
371 to %var% form. Existing Windows style variables are left unchanged.
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
372
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
373 The variables are limited to the given environment. Unknown variables are
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
374 left unchanged.
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
375
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
376 >>> e = {b'var1': b'v1', b'var2': b'v2', b'var3': b'v3'}
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
377 >>> # Only valid values are expanded
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
378 >>> shelltocmdexe(b'cmd $var1 ${var2} %var3% $missing ${missing} %missing%',
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
379 ... e)
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
380 'cmd %var1% %var2% %var3% $missing ${missing} %missing%'
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
381 >>> # Single quote prevents expansion, as does \$ escaping
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
382 >>> shelltocmdexe(b"cmd '$var1 ${var2} %var3%' \$var1 \${var2} \\", e)
38724
02b5b5c1bba8 windows: replace single quote with double quote when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38627
diff changeset
383 'cmd "$var1 ${var2} %var3%" $var1 ${var2} \\'
38627
93ed193bc03e windows: don't consider '$$' to be an escaped '$' when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38601
diff changeset
384 >>> # $$ is not special. %% is not special either, but can be the end and
93ed193bc03e windows: don't consider '$$' to be an escaped '$' when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38601
diff changeset
385 >>> # start of consecutive variables
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
386 >>> shelltocmdexe(b"cmd $$ %% %var1%%var2%", e)
38627
93ed193bc03e windows: don't consider '$$' to be an escaped '$' when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38601
diff changeset
387 'cmd $$ %% %var1%%var2%'
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
388 >>> # No double substitution
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
389 >>> shelltocmdexe(b"$var1 %var1%", {b'var1': b'%var2%', b'var2': b'boom'})
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
390 '%var1% %var1%'
38725
c382c19ce9bd windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38724
diff changeset
391 >>> # Tilde expansion
c382c19ce9bd windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38724
diff changeset
392 >>> shelltocmdexe(b"~/dir ~\dir2 ~tmpfile \~/", {})
c382c19ce9bd windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38724
diff changeset
393 '%USERPROFILE%/dir %USERPROFILE%\\dir2 ~tmpfile ~/'
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
394 """
38725
c382c19ce9bd windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38724
diff changeset
395 if not any(c in path for c in b"$'~"):
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
396 return path
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
397
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
398 varchars = pycompat.sysbytes(string.ascii_letters + string.digits) + b'_-'
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
399
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
400 res = b''
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
401 index = 0
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
402 pathlen = len(path)
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
403 while index < pathlen:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
404 c = path[index : index + 1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
405 if c == b'\'': # no expansion within single quotes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
406 path = path[index + 1 :]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
407 pathlen = len(path)
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
408 try:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
409 index = path.index(b'\'')
38724
02b5b5c1bba8 windows: replace single quote with double quote when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38627
diff changeset
410 res += b'"' + path[:index] + b'"'
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
411 except ValueError:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
412 res += c + path
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
413 index = pathlen - 1
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
414 elif c == b'%': # variable
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
415 path = path[index + 1 :]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
416 pathlen = len(path)
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
417 try:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
418 index = path.index(b'%')
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
419 except ValueError:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
420 res += b'%' + path
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
421 index = pathlen - 1
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
422 else:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
423 var = path[:index]
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
424 res += b'%' + var + b'%'
38627
93ed193bc03e windows: don't consider '$$' to be an escaped '$' when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38601
diff changeset
425 elif c == b'$': # variable
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
426 if path[index + 1 : index + 2] == b'{':
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
427 path = path[index + 2 :]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
428 pathlen = len(path)
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
429 try:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
430 index = path.index(b'}')
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
431 var = path[:index]
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
432
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
433 # See below for why empty variables are handled specially
39910
6e2c8f7f894e py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents: 39904
diff changeset
434 if env.get(var, b'') != b'':
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
435 res += b'%' + var + b'%'
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
436 else:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
437 res += b'${' + var + b'}'
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
438 except ValueError:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
439 res += b'${' + path
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
440 index = pathlen - 1
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
441 else:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
442 var = b''
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
443 index += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
444 c = path[index : index + 1]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
445 while c != b'' and c in varchars:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
446 var += c
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
447 index += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
448 c = path[index : index + 1]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
449 # Some variables (like HG_OLDNODE) may be defined, but have an
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
450 # empty value. Those need to be skipped because when spawning
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
451 # cmd.exe to run the hook, it doesn't replace %VAR% for an empty
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
452 # VAR, and that really confuses things like revset expressions.
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
453 # OTOH, if it's left in Unix format and the hook runs sh.exe, it
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
454 # will substitute to an empty string, and everything is happy.
39910
6e2c8f7f894e py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents: 39904
diff changeset
455 if env.get(var, b'') != b'':
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
456 res += b'%' + var + b'%'
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
457 else:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
458 res += b'$' + var
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
459
39910
6e2c8f7f894e py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents: 39904
diff changeset
460 if c != b'':
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
461 index -= 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
462 elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
463 c == b'~'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
464 and index + 1 < pathlen
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
465 and path[index + 1 : index + 2] in (b'\\', b'/')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
466 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
467 res += b"%USERPROFILE%"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
468 elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
469 c == b'\\'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
470 and index + 1 < pathlen
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
471 and path[index + 1 : index + 2] in (b'$', b'~')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
472 ):
38725
c382c19ce9bd windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 38724
diff changeset
473 # Skip '\', but only if it is escaping $ or ~
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
474 res += path[index + 1 : index + 2]
38483
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
475 index += 1
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
476 else:
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
477 res += c
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
478
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
479 index += 1
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
480 return res
3efadf2317c7 windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents: 37460
diff changeset
481
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
482
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
483 # A sequence of backslashes is special iff it precedes a double quote:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
484 # - if there's an even number of backslashes, the double quote is not
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
485 # quoted (i.e. it ends the quoted region)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
486 # - if there's an odd number of backslashes, the double quote is quoted
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
487 # - in both cases, every pair of backslashes is unquoted into a single
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
488 # backslash
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
489 # (See http://msdn2.microsoft.com/en-us/library/a1y7w461.aspx )
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
490 # So, to quote a string, we must surround it in double quotes, double
17505
ae791d371864 spelling: precede
timeless@mozdev.org
parents: 17223
diff changeset
491 # the number of backslashes that precede double quotes and add another
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
492 # backslash before every double quote (being careful with the double
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
493 # quote we've appended to the end)
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
494 _quotere: Optional[Pattern[bytes]] = None
23682
1642eb429536 windows: quote the specified string only when it has to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22245
diff changeset
495 _needsshellquote = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
496
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
497
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
498 def shellquote(s: bytes) -> bytes:
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
499 r"""
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
500 >>> shellquote(br'C:\Users\xyz')
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
501 '"C:\\Users\\xyz"'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
502 >>> shellquote(br'C:\Users\xyz/mixed')
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
503 '"C:\\Users\\xyz/mixed"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
504 >>> # Would be safe not to quote too, since it is all double backslashes
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
505 >>> shellquote(br'C:\\Users\\xyz')
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
506 '"C:\\\\Users\\\\xyz"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
507 >>> # But this must be quoted
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
508 >>> shellquote(br'C:\\Users\\xyz/abc')
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
509 '"C:\\\\Users\\\\xyz/abc"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
510 """
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
511 global _quotere
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
512 if _quotere is None:
39644
3b421154d2ca py3: fix str vs bytes in enough places to run `hg version` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39643
diff changeset
513 _quotere = re.compile(br'(\\*)("|\\$)')
23682
1642eb429536 windows: quote the specified string only when it has to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22245
diff changeset
514 global _needsshellquote
1642eb429536 windows: quote the specified string only when it has to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22245
diff changeset
515 if _needsshellquote is None:
24885
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
516 # ":" is also treated as "safe character", because it is used as a part
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
517 # of path name on Windows. "\" is also part of a path name, but isn't
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
518 # safe because shlex.split() (kind of) treats it as an escape char and
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
519 # drops it. It will leave the next character, even if it is another
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
520 # "\".
39644
3b421154d2ca py3: fix str vs bytes in enough places to run `hg version` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39643
diff changeset
521 _needsshellquote = re.compile(br'[^a-zA-Z0-9._:/-]').search
24108
d65ecb814fc0 shellquote: fix missing quotes for empty string
Yuya Nishihara <yuya@tcha.org>
parents: 23682
diff changeset
522 if s and not _needsshellquote(s) and not _quotere.search(s):
23682
1642eb429536 windows: quote the specified string only when it has to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22245
diff changeset
523 # "s" shouldn't have to be quoted
1642eb429536 windows: quote the specified string only when it has to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22245
diff changeset
524 return s
39644
3b421154d2ca py3: fix str vs bytes in enough places to run `hg version` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39643
diff changeset
525 return b'"%s"' % _quotere.sub(br'\1\1\\\2', s)
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
526
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
527
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
528 def _unquote(s: bytes) -> bytes:
36415
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
529 if s.startswith(b'"') and s.endswith(b'"'):
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
530 return s[1:-1]
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
531 return s
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
532
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
533
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
534 def shellsplit(s: bytes) -> List[bytes]:
36415
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
535 """Parse a command string in cmd.exe way (best-effort)"""
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
536 return pycompat.maplist(_unquote, pycompat.shlexsplit(s, posix=False))
0cb09c322647 util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents: 35513
diff changeset
537
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
538
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
539 # if you change this stub into a real check, please try to implement the
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
540 # username and groupname functions above, too.
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
541 def isowner(st: os.stat_result) -> bool:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
542 return True
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
543
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
544
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
545 def findexe(command: bytes) -> Optional[bytes]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
546 """Find executable for command searching like cmd.exe does.
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
547 If command is a basename then PATH is searched for command.
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
548 PATH isn't searched if command is an absolute or relative path.
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
549 An extension from PATHEXT is found and added if not present.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
550 If command isn't found None is returned."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
551 pathext = encoding.environ.get(b'PATHEXT', b'.COM;.EXE;.BAT;.CMD')
30612
d623cc6b3742 py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30474
diff changeset
552 pathexts = [ext for ext in pathext.lower().split(pycompat.ospathsep)]
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
553 if os.path.splitext(command)[1].lower() in pathexts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
554 pathexts = [b'']
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
555
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
556 def findexisting(pathcommand: bytes) -> Optional[bytes]:
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43768
diff changeset
557 """Will append extension (if needed) and return existing file"""
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
558 for ext in pathexts:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
559 executable = pathcommand + ext
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
560 if os.path.exists(executable):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
561 return executable
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
562 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
563
30615
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30612
diff changeset
564 if pycompat.ossep in command:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
565 return findexisting(command)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
566
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
567 for path in encoding.environ.get(b'PATH', b'').split(pycompat.ospathsep):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
568 executable = findexisting(os.path.join(path, command))
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
569 if executable is not None:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
570 return executable
10156
c31ac3f7fd8f windows: expand environment vars in find_exe
Steve Borho <steve@borho.org>
parents: 9594
diff changeset
571 return findexisting(os.path.expanduser(os.path.expandvars(command)))
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
572
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
573
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32208
diff changeset
574 _wantedkinds = {stat.S_IFREG, stat.S_IFLNK}
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
575
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
576
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
577 def statfiles(files: Sequence[bytes]) -> Iterator[Optional[os.stat_result]]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
578 """Stat each file in files. Yield each stat, or None if a file
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
579 does not exist or has a type we don't care about.
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
580
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
581 Cluster and cache stat per directory to minimize number of OS stat calls."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
582 dircache = {} # dirname -> filename -> status | None if file does not exist
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
583 getkind = stat.S_IFMT
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
584 for nf in files:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
585 nf = normcase(nf)
9099
3d456bf32f18 Use os.path.split() for MBCS with win32mbcs extension.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 8951
diff changeset
586 dir, base = os.path.split(nf)
3d456bf32f18 Use os.path.split() for MBCS with win32mbcs extension.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 8951
diff changeset
587 if not dir:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
588 dir = b'.'
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
589 cache = dircache.get(dir, None)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
590 if cache is None:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
591 try:
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43922
diff changeset
592 dmap = {
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43922
diff changeset
593 normcase(n): s
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43922
diff changeset
594 for n, k, s in listdir(dir, True)
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43922
diff changeset
595 if getkind(s.st_mode) in _wantedkinds
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43922
diff changeset
596 }
49311
defc369d705e py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49305
diff changeset
597 except (FileNotFoundError, NotADirectoryError):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
598 dmap = {}
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
599 cache = dircache.setdefault(dir, dmap)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
600 yield cache.get(base, None)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
601
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
602
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
603 def username(uid: Optional[int] = None) -> Optional[bytes]:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
604 """Return the name of the user with the given uid.
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
605
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
606 If uid is None, return the name of the current user."""
43904
1b26cb044097 windows: if username(uid=None) is loaded, just use getpass
Augie Fackler <augie@google.com>
parents: 43787
diff changeset
607 if not uid:
49518
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
608 try:
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
609 return pycompat.fsencode(getpass.getuser())
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
610 except ModuleNotFoundError:
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
611 # getpass.getuser() checks for a few environment variables first,
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
612 # but if those aren't set, imports pwd and calls getpwuid(), none of
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
613 # which exists on Windows.
805419729e11 windows: gracefully handle when the username cannot be determined
Matt Harbison <matt_harbison@yahoo.com>
parents: 49319
diff changeset
614 pass
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
615 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
617
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
618 def groupname(gid: Optional[int] = None) -> Optional[bytes]:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
619 """Return the name of the group with the given gid.
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
620
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
621 If gid is None, return the name of the current group."""
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
622 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
623
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
624
51720
e618a1756b08 typing: avoid some useless @overload definitions in `mercurial.util`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51716
diff changeset
625 def readlink(path: bytes) -> bytes:
e618a1756b08 typing: avoid some useless @overload definitions in `mercurial.util`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51716
diff changeset
626 path_str = pycompat.fsdecode(path)
47866
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
627 try:
51720
e618a1756b08 typing: avoid some useless @overload definitions in `mercurial.util`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51716
diff changeset
628 link = os.readlink(path_str)
47866
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
629 except ValueError as e:
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
630 # On py2, os.readlink() raises an AttributeError since it is
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
631 # unsupported. On py3, reading a non-link raises a ValueError. Simply
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
632 # treat this as the error the locking code has been expecting up to now
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
633 # until an effort can be made to enable symlink support on Windows.
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
634 raise AttributeError(e)
4162f6b40f2c windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents: 47789
diff changeset
635 return pycompat.fsencode(link)
39904
5fe0b880200e py3: convert os.readlink() path to native strings on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39883
diff changeset
636
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
637
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
638 def removedirs(name: bytes) -> None:
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
639 """special version of os.removedirs that does not remove symlinked
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
640 directories or junction points if they actually contain files"""
32208
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31891
diff changeset
641 if listdir(name):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
642 return
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
643 os.rmdir(name)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
644 head, tail = os.path.split(name)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
645 if not tail:
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
646 head, tail = os.path.split(head)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
647 while head and tail:
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
648 try:
32208
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31891
diff changeset
649 if listdir(head):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
650 return
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
651 os.rmdir(head)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
652 except (ValueError, OSError):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
653 break
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
654 head, tail = os.path.split(head)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
655
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
656
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
657 def rename(src: bytes, dst: bytes) -> None:
9549
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
658 '''atomically rename file src to dst, replacing dst if it exists'''
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
659 try:
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
660 os.rename(src, dst)
49305
53e9422a9b45 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de>
parents: 48986
diff changeset
661 except FileExistsError:
13280
6052bbc7aabd reintroduces util.unlink, for POSIX and Windows.
Adrian Buehlmann <adrian@cadifra.com>
parents: 13278
diff changeset
662 unlink(dst)
9549
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
663 os.rename(src, dst)
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
664
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
665
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
666 def gethgcmd() -> List[bytes]:
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39644
diff changeset
667 return [encoding.strtolocal(arg) for arg in [sys.executable] + sys.argv[:1]]
10239
8e4be44a676f Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents: 10237
diff changeset
668
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
669
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
670 def groupmembers(name: bytes) -> List[bytes]:
11138
99eee847beaa acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents: 11010
diff changeset
671 # Don't support groups on Windows for now
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16076
diff changeset
672 raise KeyError
11138
99eee847beaa acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents: 11010
diff changeset
673
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
674
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
675 def isexec(f: bytes) -> bool:
14926
4e7e63fc685a util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents: 14892
diff changeset
676 return False
4e7e63fc685a util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents: 14892
diff changeset
677
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
678
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48899
diff changeset
679 class cachestat:
52024
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
680 stat: os.stat_result
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
681
49815
464fe8b8f474 typing: add type hints to the platform `cachestat` classes
Matt Harbison <matt_harbison@yahoo.com>
parents: 49812
diff changeset
682 def __init__(self, path: bytes) -> None:
52024
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
683 self.stat = os.stat(path)
14927
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
684
49815
464fe8b8f474 typing: add type hints to the platform `cachestat` classes
Matt Harbison <matt_harbison@yahoo.com>
parents: 49812
diff changeset
685 def cacheable(self) -> bool:
52024
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
686 return bool(self.stat.st_ino)
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
687
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
688 __hash__ = object.__hash__
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
689
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
690 def __eq__(self, other: Any) -> bool:
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
691 try:
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
692 # Only dev, ino, size, mtime and atime are likely to change. Out
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
693 # of these, we shouldn't compare atime but should compare the
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
694 # rest. However, one of the other fields changing indicates
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
695 # something fishy going on, so return False if anything but atime
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
696 # changes.
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
697 return (
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
698 self.stat.st_ino == other.stat.st_ino
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
699 and self.stat.st_dev == other.stat.st_dev
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
700 and self.stat.st_nlink == other.stat.st_nlink
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
701 and self.stat.st_uid == other.stat.st_uid
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
702 and self.stat.st_gid == other.stat.st_gid
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
703 and self.stat.st_size == other.stat.st_size
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
704 and self.stat[stat.ST_MTIME] == other.stat[stat.ST_MTIME]
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
705 and self.stat[stat.ST_CTIME] == other.stat[stat.ST_CTIME]
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
706 )
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
707 except AttributeError:
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
708 return False
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
709
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
710 def __ne__(self, other: Any) -> bool:
e760a36a6013 windows: implement `util.cachestat` to fix numerous dirstate problems
Matt Harbison <matt_harbison@yahoo.com>
parents: 51285
diff changeset
711 return not self == other
14927
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
712
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
713
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
714 def lookupreg(
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
715 key: bytes,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
716 valname: Optional[bytes] = None,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
717 scope: Optional[Union[int, Iterable[int]]] = None,
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
718 ) -> Optional[bytes]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
719 """Look up a key/value name in the Windows registry.
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
720
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
721 valname: value name. If unspecified, the default value for the key
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
722 is used.
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
723 scope: optionally specify scope for registry lookup, this can be
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
724 a sequence of scopes to look up in order. Default (CURRENT_USER,
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
725 LOCAL_MACHINE).
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45158
diff changeset
726 """
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
727 if scope is None:
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
728 # pytype: disable=module-attr
29760
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
729 scope = (winreg.HKEY_CURRENT_USER, winreg.HKEY_LOCAL_MACHINE)
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
730 # pytype: enable=module-attr
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
731 elif not isinstance(scope, (list, tuple)):
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
732 scope = (scope,)
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
733 for s in scope:
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
734 try:
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
735 # pytype: disable=module-attr
39643
47ac5d93d708 windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents: 38725
diff changeset
736 with winreg.OpenKey(s, encoding.strfromlocal(key)) as hkey:
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
737 # pytype: enable=module-attr
49317
709e5f7eec1f windows: prevent bytes from being passed to registry APIs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49311
diff changeset
738 name = None
709e5f7eec1f windows: prevent bytes from being passed to registry APIs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49311
diff changeset
739 if valname is not None:
709e5f7eec1f windows: prevent bytes from being passed to registry APIs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49311
diff changeset
740 name = encoding.strfromlocal(valname)
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
741 # pytype: disable=module-attr
40266
ab04ce6f0674 py3: use str to query registry values on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39910
diff changeset
742 val = winreg.QueryValueEx(hkey, name)[0]
48986
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
743 # pytype: enable=module-attr
d500df2e8034 pytype: disable a few errors about Windows specific module attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 48946
diff changeset
744
39643
47ac5d93d708 windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents: 38725
diff changeset
745 # never let a Unicode string escape into the wild
47ac5d93d708 windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents: 38725
diff changeset
746 return encoding.unitolocal(val)
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
747 except EnvironmentError:
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
748 pass
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
749
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
750
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
751 expandglobs: bool = True
18868
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
752
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
753
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
754 def statislink(st: Optional[os.stat_result]) -> bool:
18868
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
755 '''check whether a stat result is a symlink'''
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
756 return False
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
757
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
758
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
759 def statisexec(st: Optional[os.stat_result]) -> bool:
18868
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
760 '''check whether a stat result is an executable file'''
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
761 return False
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
762
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
763
49817
2b1476714849 typing: add trivial type hints to rest of the windows platform module
Matt Harbison <matt_harbison@yahoo.com>
parents: 49815
diff changeset
764 def poll(fds) -> List:
25420
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
765 # see posix.py for description
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
766 raise NotImplementedError()
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
767
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
768
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
769 def readpipe(pipe) -> bytes:
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
770 """Read all available data from a pipe."""
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
771 chunks = []
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
772 while True:
24653
83f6c4733ecc windows: allow readpipe() to actually read data out of the pipe
Matt Harbison <matt_harbison@yahoo.com>
parents: 24598
diff changeset
773 size = win32.peekpipe(pipe)
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
774 if not size:
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
775 break
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
776
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
777 s = pipe.read(size)
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
778 if not s:
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
779 break
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
780 chunks.append(s)
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
781
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
782 return b''.join(chunks)
29530
3239e2fdd2e2 chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents: 27436
diff changeset
783
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41289
diff changeset
784
49812
58dff81ffba1 typing: add type hints to the common posix/windows platform functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49800
diff changeset
785 def bindunixsocket(sock, path: bytes) -> NoReturn:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43089
diff changeset
786 raise NotImplementedError('unsupported platform')