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