author | Gregory Szorc <gregory.szorc@gmail.com> |
Thu, 03 Mar 2022 08:04:33 -0800 | |
changeset 48885 | a2c59b361e0f |
parent 48875 | 6000f5b25c9b |
child 48898 | a98e32e5fca1 |
permissions | -rw-r--r-- |
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 | 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 |
|
8421
b6d0fa8c7685
posixfile: remove posixfile_nt and fix import bug in windows.py
Sune Foldager <cryo@cyanite.org>
parents:
8364
diff
changeset
|
8 |
|
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
9 |
import errno |
43904
1b26cb044097
windows: if username(uid=None) is loaded, just use getpass
Augie Fackler <augie@google.com>
parents:
43787
diff
changeset
|
10 |
import getpass |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
11 |
import msvcrt |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
12 |
import os |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
13 |
import re |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
14 |
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
|
15 |
import string |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
16 |
import sys |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
17 |
|
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
18 |
from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
19 |
from .pycompat import getattr |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
20 |
from . import ( |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
21 |
encoding, |
33651
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
22 |
error, |
32367
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
23 |
policy, |
30612
d623cc6b3742
py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30474
diff
changeset
|
24 |
pycompat, |
27436
912255f8f087
windows: correct the import of win32
Matt Harbison <matt_harbison@yahoo.com>
parents:
27360
diff
changeset
|
25 |
win32, |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
26 |
) |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
27 |
|
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
28 |
try: |
43768
fe73ec69350e
windows: suppress pytype warnings for Windows imports and functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
29 |
import _winreg as winreg # pytype: disable=import-error |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
30 |
|
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
31 |
winreg.CloseKey |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
32 |
except ImportError: |
43768
fe73ec69350e
windows: suppress pytype warnings for Windows imports and functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
33 |
# py2 only |
fe73ec69350e
windows: suppress pytype warnings for Windows imports and functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
34 |
import winreg # pytype: disable=import-error |
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
35 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
36 |
osutil = policy.importmod('osutil') |
32367
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
37 |
|
35513
c4caf530b1c7
util: add a function to show the mount point of the filesystem
Matt Harbison <matt_harbison@yahoo.com>
parents:
35510
diff
changeset
|
38 |
getfsmountpoint = win32.getvolumename |
35510
2062f7c2ac83
win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
39 |
getfstype = win32.getfstype |
15016
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
40 |
getuser = win32.getuser |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
41 |
hidewindow = win32.hidewindow |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
42 |
makedir = win32.makedir |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
43 |
nlinks = win32.nlinks |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
44 |
oslink = win32.oslink |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
45 |
samedevice = win32.samedevice |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
46 |
samefile = win32.samefile |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
47 |
setsignalhandler = win32.setsignalhandler |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
48 |
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
|
49 |
split = os.path.split |
15016
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
50 |
testpid = win32.testpid |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
51 |
unlink = win32.unlink |
14985
dbf91976f900
windows: eliminate win32 wildcard import
Adrian Buehlmann <adrian@cadifra.com>
parents:
14969
diff
changeset
|
52 |
|
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25462
diff
changeset
|
53 |
umask = 0o022 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
54 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
55 |
|
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
56 |
class mixedfilemodewrapper(object): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
57 |
"""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
|
58 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
59 |
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
|
60 |
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
|
61 |
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
|
62 |
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
|
63 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
64 |
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
|
65 |
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
|
66 |
calls when necessary. |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
67 |
""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
68 |
|
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
69 |
OPNONE = 0 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
70 |
OPREAD = 1 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
71 |
OPWRITE = 2 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
72 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
73 |
def __init__(self, fp): |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
74 |
object.__setattr__(self, '_fp', fp) |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
75 |
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
|
76 |
|
31891
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
77 |
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
|
78 |
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
|
79 |
return self |
31891
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
80 |
|
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
81 |
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
|
82 |
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
|
83 |
|
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
84 |
def __getattr__(self, name): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
85 |
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
|
86 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
87 |
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
|
88 |
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
|
89 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
90 |
def _noopseek(self): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
91 |
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
|
92 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
93 |
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
|
94 |
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
|
95 |
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
|
96 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
97 |
def write(self, d): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
98 |
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
|
99 |
self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
100 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
101 |
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
|
102 |
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
|
103 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
104 |
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
|
105 |
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
|
106 |
self._noopeseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
107 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
108 |
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
|
109 |
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
|
110 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
111 |
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
|
112 |
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
|
113 |
self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
114 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
115 |
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
|
116 |
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
|
117 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
118 |
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
|
119 |
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
|
120 |
self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
121 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
122 |
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
|
123 |
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
|
124 |
|
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
125 |
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
|
126 |
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
|
127 |
self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
128 |
|
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
129 |
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
|
130 |
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
|
131 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
132 |
|
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
|
133 |
class fdproxy(object): |
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
134 |
"""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
|
135 |
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
|
136 |
""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
137 |
|
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
|
138 |
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
|
139 |
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
|
140 |
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
|
141 |
|
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
142 |
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
|
143 |
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
|
144 |
# 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
|
145 |
# 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
|
146 |
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
|
147 |
|
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
148 |
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
|
149 |
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
|
150 |
|
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
151 |
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
|
152 |
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
|
153 |
|
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 |
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
|
155 |
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
|
156 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
157 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
158 |
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
|
159 |
'''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
|
160 |
try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
161 |
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
|
162 |
|
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
|
163 |
# 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
|
164 |
# underlying file descriptor. |
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 |
if pycompat.ispy3: |
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 |
fp = fdproxy(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
|
167 |
|
24051
7956d17431bc
windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents:
23682
diff
changeset
|
168 |
# 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
|
169 |
# 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
|
170 |
if b'a' in mode: |
25462
021e68d37c5b
windows: use os.SEEK_END
Adrian Buehlmann <adrian@cadifra.com>
parents:
25420
diff
changeset
|
171 |
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
|
172 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
173 |
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
|
174 |
return mixedfilemodewrapper(fp) |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
175 |
|
24051
7956d17431bc
windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents:
23682
diff
changeset
|
176 |
return fp |
48009
94d4a3f78e99
typing: suppress an name-error warning in `mercurial/windows.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
47866
diff
changeset
|
177 |
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
|
178 |
# convert to a friendlier exception |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
179 |
raise IOError( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
180 |
err.errno, '%s: %s' % (encoding.strfromlocal(name), err.strerror) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
181 |
) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
182 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
183 |
|
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
184 |
# may be wrapped by win32mbcs extension |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
185 |
listdir = osutil.listdir |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
186 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
187 |
|
45157
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
188 |
# copied from .utils.procutil, remove after Python 2 support was dropped |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
189 |
def _isatty(fp): |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
190 |
try: |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
191 |
return fp.isatty() |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
192 |
except AttributeError: |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
193 |
return False |
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
194 |
|
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
195 |
|
47079
5b3513177f2b
util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents:
46819
diff
changeset
|
196 |
def get_password(): |
5b3513177f2b
util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents:
46819
diff
changeset
|
197 |
"""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
|
198 |
|
5b3513177f2b
util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents:
46819
diff
changeset
|
199 |
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
|
200 |
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
|
201 |
""" |
47789
064cd182555f
windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents:
47622
diff
changeset
|
202 |
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
|
203 |
while True: |
47424
f77404040776
typing: disable warnings for a couple of Windows specific attributes
Matt Harbison <matt_harbison@yahoo.com>
parents:
47079
diff
changeset
|
204 |
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
|
205 |
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
|
206 |
break |
47789
064cd182555f
windows: avoid a bytes vs unicode crash reading passwords on py2
Matt Harbison <matt_harbison@yahoo.com>
parents:
47622
diff
changeset
|
207 |
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
|
208 |
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
|
209 |
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
|
210 |
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
|
211 |
else: |
5b3513177f2b
util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents:
46819
diff
changeset
|
212 |
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
|
213 |
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
|
214 |
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
|
215 |
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
|
216 |
|
5b3513177f2b
util: avoid echoing the password to the console on Windows py3 (issue6446)
Matt Harbison <matt_harbison@yahoo.com>
parents:
46819
diff
changeset
|
217 |
|
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
218 |
class winstdout(object): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
219 |
"""Some files on Windows misbehave. |
45145
aea246bc04bd
windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents:
44867
diff
changeset
|
220 |
|
aea246bc04bd
windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents:
44867
diff
changeset
|
221 |
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
|
222 |
|
aea246bc04bd
windows: augment docstring of `winstdout` class
Manuel Jacob <me@manueljacob.de>
parents:
44867
diff
changeset
|
223 |
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
|
224 |
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
|
225 |
""" |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
226 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
227 |
def __init__(self, fp): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
228 |
self.fp = fp |
45157
74b486226480
windows: handle file-like objects without isatty() method
Manuel Jacob <me@manueljacob.de>
parents:
45148
diff
changeset
|
229 |
self.throttle = not pycompat.ispy3 and _isatty(fp) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
230 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
231 |
def __getattr__(self, key): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
232 |
return getattr(self.fp, key) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
233 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
234 |
def close(self): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
235 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
236 |
self.fp.close() |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
237 |
except IOError: |
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
238 |
pass |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
239 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
240 |
def write(self, s): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
241 |
try: |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45145
diff
changeset
|
242 |
if not self.throttle: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45145
diff
changeset
|
243 |
return self.fp.write(s) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
244 |
# This is workaround for "Not enough space" error on |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
245 |
# writing large size of data to console. |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
246 |
limit = 16000 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
247 |
l = len(s) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
248 |
start = 0 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
249 |
while start < l: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
250 |
end = start + limit |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
251 |
self.fp.write(s[start:end]) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
252 |
start = end |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
253 |
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
|
254 |
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
|
255 |
raise |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
256 |
self.close() |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
257 |
raise IOError(errno.EPIPE, 'Broken pipe') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
258 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
259 |
def flush(self): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
260 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
261 |
return self.fp.flush() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
262 |
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
|
263 |
if not win32.lasterrorwaspipeerror(inst): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
264 |
raise |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
265 |
raise IOError(errno.EPIPE, 'Broken pipe') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
266 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
267 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
268 |
def openhardlinks(): |
43922
70abcb614a5c
windows: drop detection of Windows 95/98/ME
Matt Harbison <matt_harbison@yahoo.com>
parents:
43904
diff
changeset
|
269 |
return True |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
270 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
271 |
|
14231
8abe4db2d162
rename util.parse_patch_output to parsepatchoutput
Adrian Buehlmann <adrian@cadifra.com>
parents:
14064
diff
changeset
|
272 |
def parsepatchoutput(output_line): |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8657
diff
changeset
|
273 |
"""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
|
274 |
pf = output_line[14:] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
275 |
if pf[0] == b'`': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
276 |
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
|
277 |
return pf |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
278 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
279 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
280 |
def sshargs(sshcmd, host, user, port): |
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 |
|
14232
df2399663392
rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents:
14231
diff
changeset
|
295 |
def setflags(f, l, x): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
296 |
pass |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
297 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
298 |
|
41289
593f6359681d
update: fix edge-case with update.atomic-file and read-only files
Boris Feld <boris.feld@octobus.net>
parents:
40938
diff
changeset
|
299 |
def copymode(src, dst, mode=None, enforcewritable=False): |
15011
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14985
diff
changeset
|
300 |
pass |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14985
diff
changeset
|
301 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
302 |
|
13879
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
303 |
def checkexec(path): |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
304 |
return False |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
305 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
306 |
|
13890
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
307 |
def checklink(path): |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
308 |
return False |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
309 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
310 |
|
14233
659f34b833b9
rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
311 |
def setbinary(fd): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
312 |
# 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
|
313 |
# fileno(), usually set to -1. |
14969
a3f97038c1c2
windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14927
diff
changeset
|
314 |
fno = getattr(fd, 'fileno', None) |
a3f97038c1c2
windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14927
diff
changeset
|
315 |
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
|
316 |
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
|
317 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
318 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
319 |
def pconvert(path): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
320 |
return path.replace(pycompat.ossep, b'/') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
321 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
322 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
323 |
def localpath(path): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
324 |
return path.replace(b'/', b'\\') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
325 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
326 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
327 |
def normpath(path): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
328 |
return pconvert(os.path.normpath(path)) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
329 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
330 |
|
15671
3c5e818ac679
windows: use upper() instead of lower() or os.path.normcase()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
331 |
def normcase(path): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
332 |
return encoding.upper(path) # NTFS compares via upper() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
333 |
|
15488
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15016
diff
changeset
|
334 |
|
47622
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
335 |
DRIVE_RE_B = re.compile(b'^[a-z]:') |
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
336 |
DRIVE_RE_S = re.compile('^[a-z]:') |
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
337 |
|
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
338 |
|
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
339 |
def abspath(path): |
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
340 |
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
|
341 |
# 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
|
342 |
# 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
|
343 |
# 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
|
344 |
# |
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
345 |
# 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
|
346 |
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
|
347 |
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
|
348 |
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
|
349 |
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
|
350 |
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
|
351 |
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
|
352 |
|
bb917eea1605
windows: introduce a `util.abspath` to replace os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47424
diff
changeset
|
353 |
|
24598
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
354 |
# see posix.py for definitions |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
355 |
normcasespec = encoding.normcasespecs.upper |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
356 |
normcasefallback = encoding.upperfallback |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
357 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
358 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
359 |
def samestat(s1, s2): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
360 |
return False |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
361 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
362 |
|
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
|
363 |
def shelltocmdexe(path, env): |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
364 |
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
|
365 |
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
|
366 |
|
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
367 |
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
|
368 |
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
|
369 |
|
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 |
>>> 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
|
371 |
>>> # 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
|
372 |
>>> 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
|
373 |
... 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
|
374 |
'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
|
375 |
>>> # 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
|
376 |
>>> 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
|
377 |
'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
|
378 |
>>> # $$ 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
|
379 |
>>> # 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
|
380 |
>>> 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
|
381 |
'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
|
382 |
>>> # 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
|
383 |
>>> 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
|
384 |
'%var1% %var1%' |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
385 |
>>> # Tilde expansion |
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
386 |
>>> 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
|
387 |
'%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
|
388 |
""" |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
389 |
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
|
390 |
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
|
391 |
|
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
392 |
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
|
393 |
|
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 |
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
|
395 |
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
|
396 |
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
|
397 |
while index < pathlen: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
398 |
c = path[index : index + 1] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
399 |
if c == b'\'': # no expansion within single quotes |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
400 |
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
|
401 |
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
|
402 |
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
|
403 |
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
|
404 |
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
|
405 |
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
|
406 |
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
|
407 |
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
|
408 |
elif c == b'%': # variable |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
409 |
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
|
410 |
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
|
411 |
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
|
412 |
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
|
413 |
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
|
414 |
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
|
415 |
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
|
416 |
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
|
417 |
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
|
418 |
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
|
419 |
elif c == b'$': # variable |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
420 |
if path[index + 1 : index + 2] == b'{': |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
421 |
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
|
422 |
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
|
423 |
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
|
424 |
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
|
425 |
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
|
426 |
|
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
427 |
# 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
|
428 |
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
|
429 |
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
|
430 |
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
|
431 |
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
|
432 |
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
|
433 |
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
|
434 |
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
|
435 |
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
|
436 |
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
|
437 |
index += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
438 |
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
|
439 |
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
|
440 |
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
|
441 |
index += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
442 |
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
|
443 |
# 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
|
444 |
# 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
|
445 |
# 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
|
446 |
# 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
|
447 |
# 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
|
448 |
# 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
|
449 |
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
|
450 |
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
|
451 |
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
|
452 |
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
|
453 |
|
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
454 |
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
|
455 |
index -= 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
456 |
elif ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
457 |
c == b'~' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
458 |
and index + 1 < pathlen |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
459 |
and path[index + 1 : index + 2] in (b'\\', b'/') |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
460 |
): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
461 |
res += b"%USERPROFILE%" |
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 |
): |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
467 |
# Skip '\', but only if it is escaping $ or ~ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
468 |
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
|
469 |
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
|
470 |
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
|
471 |
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
|
472 |
|
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
473 |
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
|
474 |
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
|
475 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
476 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
477 |
# 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
|
478 |
# - 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
|
479 |
# 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
|
480 |
# - 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
|
481 |
# - 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
|
482 |
# backslash |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
483 |
# (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
|
484 |
# So, to quote a string, we must surround it in double quotes, double |
17505 | 485 |
# 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
|
486 |
# 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
|
487 |
# quote we've appended to the end) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
488 |
_quotere = 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
|
489 |
_needsshellquote = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
490 |
|
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
491 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
492 |
def shellquote(s): |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
493 |
r""" |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34022
diff
changeset
|
494 |
>>> shellquote(br'C:\Users\xyz') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
495 |
'"C:\\Users\\xyz"' |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34022
diff
changeset
|
496 |
>>> shellquote(br'C:\Users\xyz/mixed') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
497 |
'"C:\\Users\\xyz/mixed"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
498 |
>>> # 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
|
499 |
>>> shellquote(br'C:\\Users\\xyz') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
500 |
'"C:\\\\Users\\\\xyz"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
501 |
>>> # 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
|
502 |
>>> shellquote(br'C:\\Users\\xyz/abc') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
503 |
'"C:\\\\Users\\\\xyz/abc"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
504 |
""" |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
505 |
global _quotere |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
506 |
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
|
507 |
_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
|
508 |
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
|
509 |
if _needsshellquote is None: |
24885
eea3977e6fca
windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents:
24692
diff
changeset
|
510 |
# ":" 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
|
511 |
# 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
|
512 |
# 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
|
513 |
# 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
|
514 |
# "\". |
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
|
515 |
_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
|
516 |
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
|
517 |
# "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
|
518 |
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
|
519 |
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
|
520 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
521 |
|
36415
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
522 |
def _unquote(s): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
523 |
if s.startswith(b'"') and s.endswith(b'"'): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
524 |
return s[1:-1] |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
525 |
return s |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
526 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
527 |
|
36415
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
528 |
def shellsplit(s): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
529 |
"""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
|
530 |
return pycompat.maplist(_unquote, pycompat.shlexsplit(s, posix=False)) |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
531 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
532 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
533 |
# 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
|
534 |
# username and groupname functions above, too. |
8657
3fa92c618624
posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents:
8614
diff
changeset
|
535 |
def isowner(st): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
536 |
return True |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
537 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
538 |
|
14271
4030630fb59c
rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents:
14234
diff
changeset
|
539 |
def findexe(command): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
540 |
"""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
|
541 |
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
|
542 |
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
|
543 |
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
|
544 |
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
|
545 |
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
|
546 |
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
|
547 |
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
|
548 |
pathexts = [b''] |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
549 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
550 |
def findexisting(pathcommand): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43768
diff
changeset
|
551 |
"""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
|
552 |
for ext in pathexts: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
553 |
executable = pathcommand + ext |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
554 |
if os.path.exists(executable): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
555 |
return executable |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
556 |
return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
557 |
|
30615
bb77654dc7ae
py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30612
diff
changeset
|
558 |
if pycompat.ossep in command: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
559 |
return findexisting(command) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
560 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
561 |
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
|
562 |
executable = findexisting(os.path.join(path, command)) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
563 |
if executable is not None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
564 |
return executable |
10156
c31ac3f7fd8f
windows: expand environment vars in find_exe
Steve Borho <steve@borho.org>
parents:
9594
diff
changeset
|
565 |
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
|
566 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
567 |
|
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32208
diff
changeset
|
568 |
_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
|
569 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
570 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
571 |
def statfiles(files): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
572 |
"""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
|
573 |
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
|
574 |
|
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
575 |
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
|
576 |
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
|
577 |
getkind = stat.S_IFMT |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
578 |
for nf in files: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
579 |
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
|
580 |
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
|
581 |
if not dir: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
582 |
dir = b'.' |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
583 |
cache = dircache.get(dir, None) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
584 |
if cache is None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
585 |
try: |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
43922
diff
changeset
|
586 |
dmap = { |
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
43922
diff
changeset
|
587 |
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
|
588 |
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
|
589 |
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
|
590 |
} |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
591 |
except OSError as err: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
592 |
# Python >= 2.5 returns ENOENT and adds winerror field |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
593 |
# EINVAL is raised if dir is not a directory. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
594 |
if err.errno not in (errno.ENOENT, errno.EINVAL, errno.ENOTDIR): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
595 |
raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
596 |
dmap = {} |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
597 |
cache = dircache.setdefault(dir, dmap) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
598 |
yield cache.get(base, None) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
599 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
600 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
601 |
def username(uid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
602 |
"""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
|
603 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
604 |
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
|
605 |
if not uid: |
1b26cb044097
windows: if username(uid=None) is loaded, just use getpass
Augie Fackler <augie@google.com>
parents:
43787
diff
changeset
|
606 |
return pycompat.fsencode(getpass.getuser()) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
607 |
return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
608 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
609 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
610 |
def groupname(gid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
611 |
"""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
|
612 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
613 |
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
|
614 |
return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
615 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
616 |
|
39904
5fe0b880200e
py3: convert os.readlink() path to native strings on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39883
diff
changeset
|
617 |
def readlink(pathname): |
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
|
618 |
path = pycompat.fsdecode(pathname) |
4162f6b40f2c
windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents:
47789
diff
changeset
|
619 |
try: |
4162f6b40f2c
windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents:
47789
diff
changeset
|
620 |
link = os.readlink(path) |
4162f6b40f2c
windows: degrade to py2 behavior when reading a non-symlink as a symlink
Matt Harbison <matt_harbison@yahoo.com>
parents:
47789
diff
changeset
|
621 |
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
|
622 |
# 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
|
623 |
# 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
|
624 |
# 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
|
625 |
# 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
|
626 |
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
|
627 |
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
|
628 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
629 |
|
24692
144883a8d0d4
util: add removedirs as platform depending function
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24653
diff
changeset
|
630 |
def removedirs(name): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
631 |
"""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
|
632 |
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
|
633 |
if listdir(name): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
634 |
return |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
635 |
os.rmdir(name) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
636 |
head, tail = os.path.split(name) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
637 |
if not tail: |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
638 |
head, tail = os.path.split(head) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
639 |
while head and tail: |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
640 |
try: |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
641 |
if listdir(head): |
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(head) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
644 |
except (ValueError, OSError): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
645 |
break |
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 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
648 |
|
9549
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
649 |
def rename(src, dst): |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
650 |
'''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
|
651 |
try: |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
652 |
os.rename(src, dst) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
653 |
except OSError as e: |
13278
e9a52ed28157
windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
654 |
if e.errno != errno.EEXIST: |
e9a52ed28157
windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
655 |
raise |
13280
6052bbc7aabd
reintroduces util.unlink, for POSIX and Windows.
Adrian Buehlmann <adrian@cadifra.com>
parents:
13278
diff
changeset
|
656 |
unlink(dst) |
9549
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
657 |
os.rename(src, dst) |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
658 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
659 |
|
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
660 |
def gethgcmd(): |
39719
255d1885c7f8
py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39644
diff
changeset
|
661 |
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
|
662 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
663 |
|
11138
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
664 |
def groupmembers(name): |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
665 |
# Don't support groups on Windows for now |
16687
e34106fa0dc3
cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents:
16076
diff
changeset
|
666 |
raise KeyError |
11138
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
667 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
668 |
|
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
669 |
def isexec(f): |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
670 |
return False |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
671 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
672 |
|
14927
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
673 |
class cachestat(object): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
674 |
def __init__(self, path): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
675 |
pass |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
676 |
|
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
677 |
def cacheable(self): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
678 |
return False |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
679 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
680 |
|
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
681 |
def lookupreg(key, valname=None, scope=None): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
682 |
"""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
|
683 |
|
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
684 |
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
|
685 |
is used. |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
686 |
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
|
687 |
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
|
688 |
LOCAL_MACHINE). |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45158
diff
changeset
|
689 |
""" |
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
690 |
if scope is None: |
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
691 |
scope = (winreg.HKEY_CURRENT_USER, winreg.HKEY_LOCAL_MACHINE) |
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
692 |
elif not isinstance(scope, (list, tuple)): |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
693 |
scope = (scope,) |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
694 |
for s in scope: |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
695 |
try: |
39643
47ac5d93d708
windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents:
38725
diff
changeset
|
696 |
with winreg.OpenKey(s, encoding.strfromlocal(key)) as hkey: |
40266
ab04ce6f0674
py3: use str to query registry values on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39910
diff
changeset
|
697 |
name = valname and encoding.strfromlocal(valname) or valname |
ab04ce6f0674
py3: use str to query registry values on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39910
diff
changeset
|
698 |
val = winreg.QueryValueEx(hkey, name)[0] |
39643
47ac5d93d708
windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents:
38725
diff
changeset
|
699 |
# 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
|
700 |
return encoding.unitolocal(val) |
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
701 |
except EnvironmentError: |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
702 |
pass |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
703 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
704 |
|
8614
573734e7e6d0
cmdutils: Take over glob expansion duties from util
Matt Mackall <mpm@selenic.com>
parents:
8559
diff
changeset
|
705 |
expandglobs = True |
18868
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
706 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
707 |
|
18868
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
708 |
def statislink(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
709 |
'''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
|
710 |
return False |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
711 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
712 |
|
18868
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
713 |
def statisexec(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
714 |
'''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
|
715 |
return False |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
716 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
717 |
|
25420
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
718 |
def poll(fds): |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
719 |
# see posix.py for description |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
720 |
raise NotImplementedError() |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
721 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
722 |
|
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
723 |
def readpipe(pipe): |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
724 |
"""Read all available data from a pipe.""" |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
725 |
chunks = [] |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
726 |
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
|
727 |
size = win32.peekpipe(pipe) |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
728 |
if not size: |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
729 |
break |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
730 |
|
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
731 |
s = pipe.read(size) |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
732 |
if not s: |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
733 |
break |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
734 |
chunks.append(s) |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
735 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
736 |
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
|
737 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41289
diff
changeset
|
738 |
|
29530
3239e2fdd2e2
chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents:
27436
diff
changeset
|
739 |
def bindunixsocket(sock, path): |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43089
diff
changeset
|
740 |
raise NotImplementedError('unsupported platform') |