Mercurial > hg
annotate mercurial/windows.py @ 41948:dd1ab72be983
test: demonstrate crash with in-memory rebase and copies
In the added test case, there is a merge commit that has one obsolete
parent with a rename. Since the rename is not in the other parent,
pathcopies() from that other parent will include the copy. Then when
we try to rebase this merge commit onto another commit that has the
same content changes, but no tracking of the rename (because it was
done with "hg remove; hg add" instead of "hg mv"), we try to propagate
the copy information. That fails because overlayworkingctx expects a
file to be modified if it's going to have copy information.
Differential Revision: https://phab.mercurial-scm.org/D6132
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 14 Mar 2019 13:53:20 -0700 |
parents | 593f6359681d |
children | 2372284d9457 |
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 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others |
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 |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
11 import msvcrt |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
12 import os |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
13 import re |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
14 import stat |
38483
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
15 import string |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
16 import sys |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
17 |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
18 from .i18n import _ |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
19 from . import ( |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
20 encoding, |
33651
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
21 error, |
32367
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
22 policy, |
30612
d623cc6b3742
py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30474
diff
changeset
|
23 pycompat, |
27436
912255f8f087
windows: correct the import of win32
Matt Harbison <matt_harbison@yahoo.com>
parents:
27360
diff
changeset
|
24 win32, |
27360
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
25 ) |
6daa795ed32f
windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26375
diff
changeset
|
26 |
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
27 try: |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
28 import _winreg as winreg |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
29 winreg.CloseKey |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
30 except ImportError: |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
31 import winreg |
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
32 |
32367
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
33 osutil = policy.importmod(r'osutil') |
a9c71d578a1c
osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
34 |
35513
c4caf530b1c7
util: add a function to show the mount point of the filesystem
Matt Harbison <matt_harbison@yahoo.com>
parents:
35510
diff
changeset
|
35 getfsmountpoint = win32.getvolumename |
35510
2062f7c2ac83
win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents:
35509
diff
changeset
|
36 getfstype = win32.getfstype |
15016
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
37 getuser = win32.getuser |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
38 hidewindow = win32.hidewindow |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
39 makedir = win32.makedir |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
40 nlinks = win32.nlinks |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
41 oslink = win32.oslink |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
42 samedevice = win32.samedevice |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
43 samefile = win32.samefile |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
44 setsignalhandler = win32.setsignalhandler |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
45 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
|
46 split = os.path.split |
15016
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
47 testpid = win32.testpid |
871c77e78f5d
windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents:
15011
diff
changeset
|
48 unlink = win32.unlink |
14985
dbf91976f900
windows: eliminate win32 wildcard import
Adrian Buehlmann <adrian@cadifra.com>
parents:
14969
diff
changeset
|
49 |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25462
diff
changeset
|
50 umask = 0o022 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
51 |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
52 class mixedfilemodewrapper(object): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
53 """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
|
54 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
55 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
|
56 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
|
57 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
|
58 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
|
59 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
60 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
|
61 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
|
62 calls when necessary. |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
63 """ |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
64 OPNONE = 0 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
65 OPREAD = 1 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
66 OPWRITE = 2 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
67 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
68 def __init__(self, fp): |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
69 object.__setattr__(self, r'_fp', fp) |
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
70 object.__setattr__(self, r'_lastop', 0) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
71 |
31891
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
72 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
|
73 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
|
74 return self |
31891
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
75 |
87f293edabb6
windows: add context manager support to mixedfilemodewrapper
Matt Harbison <matt_harbison@yahoo.com>
parents:
31644
diff
changeset
|
76 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
|
77 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
|
78 |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
79 def __getattr__(self, name): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
80 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
|
81 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
82 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
|
83 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
|
84 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
85 def _noopseek(self): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
86 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
|
87 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
88 def seek(self, *args, **kwargs): |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
89 object.__setattr__(self, r'_lastop', self.OPNONE) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
90 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
|
91 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
92 def write(self, d): |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
93 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
|
94 self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
95 |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
96 object.__setattr__(self, r'_lastop', self.OPWRITE) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
97 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
|
98 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
99 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
|
100 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
|
101 self._noopeseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
102 |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
103 object.__setattr__(self, r'_lastop', self.OPWRITE) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
104 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
|
105 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
106 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
|
107 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
|
108 self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
109 |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
110 object.__setattr__(self, r'_lastop', self.OPREAD) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
111 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
|
112 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
113 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
|
114 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
|
115 self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
116 |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
117 object.__setattr__(self, r'_lastop', self.OPREAD) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
118 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
|
119 |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
120 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
|
121 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
|
122 self._noopseek() |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
123 |
31644
f80d9ddc40f3
py3: abuse r'' to preserve str-ness of literals passed to __setattr__()
Yuya Nishihara <yuya@tcha.org>
parents:
31539
diff
changeset
|
124 object.__setattr__(self, r'_lastop', self.OPREAD) |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
125 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
|
126 |
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
|
127 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
|
128 """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
|
129 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
|
130 """ |
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 |
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 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
|
136 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
|
137 # 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
|
138 # 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
|
139 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
|
140 |
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 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
|
142 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
|
143 |
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
144 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
|
145 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
|
146 |
68ea1f8dcb84
py3: proxy posixfile objects to re-add a useful 'name' attribute on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39719
diff
changeset
|
147 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
|
148 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
|
149 |
8421
b6d0fa8c7685
posixfile: remove posixfile_nt and fix import bug in windows.py
Sune Foldager <cryo@cyanite.org>
parents:
8364
diff
changeset
|
150 def posixfile(name, mode='r', buffering=-1): |
24069
c6666395fdd2
windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents:
24051
diff
changeset
|
151 '''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
|
152 try: |
24069
c6666395fdd2
windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents:
24051
diff
changeset
|
153 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
|
154 |
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
|
155 # 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
|
156 # 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
|
157 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
|
158 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
|
159 |
24051
7956d17431bc
windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents:
23682
diff
changeset
|
160 # 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
|
161 # make it consistent with other platforms, which position at EOF. |
7956d17431bc
windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents:
23682
diff
changeset
|
162 if 'a' in mode: |
25462
021e68d37c5b
windows: use os.SEEK_END
Adrian Buehlmann <adrian@cadifra.com>
parents:
25420
diff
changeset
|
163 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
|
164 |
26375
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
165 if '+' in mode: |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
166 return mixedfilemodewrapper(fp) |
3686fa2b8eee
windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
167 |
24051
7956d17431bc
windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents:
23682
diff
changeset
|
168 return fp |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
169 except WindowsError as err: |
24069
c6666395fdd2
windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents:
24051
diff
changeset
|
170 # convert to a friendlier exception |
39883
2209e72f9fcb
py3: ensure standard exceptions use `str` type strings in windows.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
39820
diff
changeset
|
171 raise IOError(err.errno, r'%s: %s' % ( |
2209e72f9fcb
py3: ensure standard exceptions use `str` type strings in windows.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
39820
diff
changeset
|
172 encoding.strfromlocal(name), err.strerror)) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
173 |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
174 # may be wrapped by win32mbcs extension |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
175 listdir = osutil.listdir |
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
176 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8761
diff
changeset
|
177 class winstdout(object): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
178 '''stdout on windows misbehaves if sent through a pipe''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
179 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
180 def __init__(self, fp): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
181 self.fp = fp |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
182 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
183 def __getattr__(self, key): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
184 return getattr(self.fp, key) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
185 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
186 def close(self): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
187 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
188 self.fp.close() |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
189 except IOError: |
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
190 pass |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
191 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
192 def write(self, s): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
193 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
194 # 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
|
195 # writing large size of data to console. |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
196 limit = 16000 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
197 l = len(s) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
198 start = 0 |
10394
4612cded5176
fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
199 self.softspace = 0 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
200 while start < l: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
201 end = start + limit |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
202 self.fp.write(s[start:end]) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
203 start = end |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
204 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
|
205 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
|
206 raise |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
207 self.close() |
39883
2209e72f9fcb
py3: ensure standard exceptions use `str` type strings in windows.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
39820
diff
changeset
|
208 raise IOError(errno.EPIPE, r'Broken pipe') |
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 flush(self): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
211 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
212 return self.fp.flush() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
213 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
|
214 if not win32.lasterrorwaspipeerror(inst): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
215 raise |
39883
2209e72f9fcb
py3: ensure standard exceptions use `str` type strings in windows.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
39820
diff
changeset
|
216 raise IOError(errno.EPIPE, r'Broken pipe') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
217 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
218 def _is_win_9x(): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
219 '''return true if run on windows 95, 98 or me.''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
220 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
221 return sys.getwindowsversion()[3] == 1 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
222 except AttributeError: |
30636
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30615
diff
changeset
|
223 return 'command' in encoding.environ.get('comspec', '') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
224 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
225 def openhardlinks(): |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13280
diff
changeset
|
226 return not _is_win_9x() |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
227 |
14231
8abe4db2d162
rename util.parse_patch_output to parsepatchoutput
Adrian Buehlmann <adrian@cadifra.com>
parents:
14064
diff
changeset
|
228 def parsepatchoutput(output_line): |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8657
diff
changeset
|
229 """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
|
230 pf = output_line[14:] |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
231 if pf[0] == '`': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
232 pf = pf[1:-1] # Remove the quotes |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
233 return pf |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
234 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
235 def sshargs(sshcmd, host, user, port): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
236 '''Build argument list for ssh or Plink''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
237 pflag = 'plink' in sshcmd.lower() and '-P' or '-p' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
238 args = user and ("%s@%s" % (user, host)) or host |
33651
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
239 if args.startswith('-') or args.startswith('/'): |
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
240 raise error.Abort( |
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
241 _('illegal ssh hostname or username starting with - or /: %s') % |
739cc0f9cbb4
ssh: ban any username@host or host that starts with - (SEC)
Augie Fackler <augie@google.com>
parents:
32686
diff
changeset
|
242 args) |
33659
8cb9e921ef8c
ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents:
33651
diff
changeset
|
243 args = shellquote(args) |
8cb9e921ef8c
ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents:
33651
diff
changeset
|
244 if port: |
8cb9e921ef8c
ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents:
33651
diff
changeset
|
245 args = '%s %s %s' % (pflag, shellquote(port), args) |
8cb9e921ef8c
ssh: quote parameters using shellquote (SEC)
Jun Wu <quark@fb.com>
parents:
33651
diff
changeset
|
246 return args |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
247 |
14232
df2399663392
rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents:
14231
diff
changeset
|
248 def setflags(f, l, x): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
249 pass |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
250 |
41289
593f6359681d
update: fix edge-case with update.atomic-file and read-only files
Boris Feld <boris.feld@octobus.net>
parents:
40938
diff
changeset
|
251 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
|
252 pass |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14985
diff
changeset
|
253 |
13879
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
254 def checkexec(path): |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
255 return False |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13777
diff
changeset
|
256 |
13890
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
257 def checklink(path): |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
258 return False |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
259 |
14233
659f34b833b9
rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
260 def setbinary(fd): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
261 # 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
|
262 # fileno(), usually set to -1. |
14969
a3f97038c1c2
windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14927
diff
changeset
|
263 fno = getattr(fd, 'fileno', None) |
a3f97038c1c2
windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14927
diff
changeset
|
264 if fno is not None and fno() >= 0: |
a3f97038c1c2
windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14927
diff
changeset
|
265 msvcrt.setmode(fno(), os.O_BINARY) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
266 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
267 def pconvert(path): |
30615
bb77654dc7ae
py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30612
diff
changeset
|
268 return path.replace(pycompat.ossep, '/') |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
269 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
270 def localpath(path): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
271 return path.replace('/', '\\') |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
272 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
273 def normpath(path): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
274 return pconvert(os.path.normpath(path)) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
275 |
15671
3c5e818ac679
windows: use upper() instead of lower() or os.path.normcase()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
276 def normcase(path): |
25071
8ce36dba70d1
windows: add comment in normcase()
Adrian Buehlmann <adrian@cadifra.com>
parents:
24908
diff
changeset
|
277 return encoding.upper(path) # NTFS compares via upper() |
15488
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15016
diff
changeset
|
278 |
24598
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
279 # see posix.py for definitions |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
280 normcasespec = encoding.normcasespecs.upper |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
281 normcasefallback = encoding.upperfallback |
22f49c7dd11b
windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24148
diff
changeset
|
282 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
283 def samestat(s1, s2): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
284 return False |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
285 |
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
|
286 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
|
287 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
|
288 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
|
289 |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
290 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
|
291 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
|
292 |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
293 >>> 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
|
294 >>> # 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
|
295 >>> 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
|
296 ... 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
|
297 '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
|
298 >>> # 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
|
299 >>> 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
|
300 '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
|
301 >>> # $$ 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
|
302 >>> # 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
|
303 >>> 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
|
304 '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
|
305 >>> # 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
|
306 >>> 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
|
307 '%var1% %var1%' |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
308 >>> # Tilde expansion |
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
309 >>> 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
|
310 '%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
|
311 """ |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
312 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
|
313 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
|
314 |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
315 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
|
316 |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
317 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
|
318 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
|
319 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
|
320 while index < pathlen: |
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
321 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
|
322 if c == b'\'': # no expansion within single quotes |
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 path = path[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
|
324 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
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 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
|
331 elif c == b'%': # variable |
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 path = path[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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 elif c == b'$': # variable |
93ed193bc03e
windows: don't consider '$$' to be an escaped '$' when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38601
diff
changeset
|
343 if path[index + 1:index + 2] == 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
|
344 path = path[index + 2:] |
3efadf2317c7
windows: add a method to convert Unix style command lines to Windows style
Matt Harbison <matt_harbison@yahoo.com>
parents:
37460
diff
changeset
|
345 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
|
346 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
|
347 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
|
348 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
|
349 |
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 # 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
|
351 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
|
352 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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 c = path[index: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
|
362 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
|
363 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
|
364 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
|
365 c = path[index: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
|
366 # 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
|
367 # 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
|
368 # 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
|
369 # 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
|
370 # 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
|
371 # 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
|
372 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
|
373 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
|
374 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
|
375 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
|
376 |
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
377 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
|
378 index -= 1 |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
379 elif (c == b'~' and index + 1 < pathlen |
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
380 and path[index + 1:index + 2] in (b'\\', b'/')): |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
381 res += "%USERPROFILE%" |
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
382 elif (c == b'\\' and index + 1 < pathlen |
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
383 and path[index + 1:index + 2] in (b'$', b'~')): |
38725
c382c19ce9bd
windows: expand '~/' and '~\' to %USERPROFILE% when translating to cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
38724
diff
changeset
|
384 # Skip '\', but only if it is escaping $ or ~ |
39910
6e2c8f7f894e
py3: byteify windows.shelltocmdexe()
Matt Harbison <matt_harbison@yahoo.com>
parents:
39904
diff
changeset
|
385 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
|
386 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
|
387 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
|
388 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
|
389 |
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 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
|
391 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
|
392 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
393 # 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
|
394 # - 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
|
395 # 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
|
396 # - 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
|
397 # - 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
|
398 # backslash |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
399 # (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
|
400 # So, to quote a string, we must surround it in double quotes, double |
17505 | 401 # 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
|
402 # 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
|
403 # quote we've appended to the end) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
404 _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
|
405 _needsshellquote = None |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
406 def shellquote(s): |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
407 r""" |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34022
diff
changeset
|
408 >>> shellquote(br'C:\Users\xyz') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
409 '"C:\\Users\\xyz"' |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34022
diff
changeset
|
410 >>> shellquote(br'C:\Users\xyz/mixed') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
411 '"C:\\Users\\xyz/mixed"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
412 >>> # 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
|
413 >>> shellquote(br'C:\\Users\\xyz') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
414 '"C:\\\\Users\\\\xyz"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
415 >>> # 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
|
416 >>> shellquote(br'C:\\Users\\xyz/abc') |
24908
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
417 '"C:\\\\Users\\\\xyz/abc"' |
30b910fea244
windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents:
24885
diff
changeset
|
418 """ |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
419 global _quotere |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
420 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
|
421 _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
|
422 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
|
423 if _needsshellquote is None: |
24885
eea3977e6fca
windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents:
24692
diff
changeset
|
424 # ":" 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
|
425 # 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
|
426 # 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
|
427 # 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
|
428 # "\". |
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
|
429 _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
|
430 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
|
431 # "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
|
432 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
|
433 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
|
434 |
36415
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
435 def _unquote(s): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
436 if s.startswith(b'"') and s.endswith(b'"'): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
437 return s[1:-1] |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
438 return s |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
439 |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
440 def shellsplit(s): |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
441 """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
|
442 return pycompat.maplist(_unquote, pycompat.shlexsplit(s, posix=False)) |
0cb09c322647
util: factor out shellsplit() function
Yuya Nishihara <yuya@tcha.org>
parents:
35513
diff
changeset
|
443 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
444 def quotecommand(cmd): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
445 """Build a command string suitable for os.popen* calls.""" |
13188
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
12689
diff
changeset
|
446 if sys.version_info < (2, 7, 1): |
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
12689
diff
changeset
|
447 # Python versions since 2.7.1 do this extra quoting themselves |
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
12689
diff
changeset
|
448 return '"' + cmd + '"' |
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
12689
diff
changeset
|
449 return cmd |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
450 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
451 # 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
|
452 # username and groupname functions above, too. |
8657
3fa92c618624
posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents:
8614
diff
changeset
|
453 def isowner(st): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
454 return True |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
455 |
14271
4030630fb59c
rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents:
14234
diff
changeset
|
456 def findexe(command): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
457 '''Find executable for command searching like cmd.exe does. |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
458 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
|
459 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
|
460 An extension from PATHEXT is found and added if not present. |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
461 If command isn't found None is returned.''' |
30636
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30615
diff
changeset
|
462 pathext = encoding.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD') |
30612
d623cc6b3742
py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30474
diff
changeset
|
463 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
|
464 if os.path.splitext(command)[1].lower() in pathexts: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
465 pathexts = [''] |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
466 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
467 def findexisting(pathcommand): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
468 'Will append extension (if needed) and return existing file' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
469 for ext in pathexts: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
470 executable = pathcommand + ext |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
471 if os.path.exists(executable): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
472 return executable |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
473 return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
474 |
30615
bb77654dc7ae
py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30612
diff
changeset
|
475 if pycompat.ossep in command: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
476 return findexisting(command) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
477 |
30636
f1c9fafcbf46
py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30615
diff
changeset
|
478 for path in encoding.environ.get('PATH', '').split(pycompat.ospathsep): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
479 executable = findexisting(os.path.join(path, command)) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
480 if executable is not None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
481 return executable |
10156
c31ac3f7fd8f
windows: expand environment vars in find_exe
Steve Borho <steve@borho.org>
parents:
9594
diff
changeset
|
482 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
|
483 |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32208
diff
changeset
|
484 _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
|
485 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
486 def statfiles(files): |
18017
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
487 '''Stat each file in files. Yield each stat, or None if a file |
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
488 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
|
489 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
490 Cluster and cache stat per directory to minimize number of OS stat calls.''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
491 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
|
492 getkind = stat.S_IFMT |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
493 for nf in files: |
15637
7f01ad702405
icasefs: use util.normcase() instead of str.lower() or os.path.normpath()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15488
diff
changeset
|
494 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
|
495 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
|
496 if not dir: |
3d456bf32f18
Use os.path.split() for MBCS with win32mbcs extension.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
8951
diff
changeset
|
497 dir = '.' |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
498 cache = dircache.get(dir, None) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
499 if cache is None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
500 try: |
15637
7f01ad702405
icasefs: use util.normcase() instead of str.lower() or os.path.normpath()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15488
diff
changeset
|
501 dmap = dict([(normcase(n), s) |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
502 for n, k, s in listdir(dir, True) |
18041
f0cfa27c712a
windows: correctly pass a mode to S_IFMT in statfiles
Matt Mackall <mpm@selenic.com>
parents:
18017
diff
changeset
|
503 if getkind(s.st_mode) in _wantedkinds]) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
504 except OSError as err: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
505 # 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
|
506 # EINVAL is raised if dir is not a directory. |
25204
0a48380b61fb
windows: drop Python2.4 specific hack for directory not found handling
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25071
diff
changeset
|
507 if err.errno not in (errno.ENOENT, errno.EINVAL, |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
508 errno.ENOTDIR): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
509 raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
510 dmap = {} |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
511 cache = dircache.setdefault(dir, dmap) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
512 yield cache.get(base, None) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
513 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
514 def username(uid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
515 """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
|
516 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
517 If uid is None, return the name of the current user.""" |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
518 return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
519 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
520 def groupname(gid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
521 """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
|
522 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
523 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
|
524 return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
525 |
39904
5fe0b880200e
py3: convert os.readlink() path to native strings on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39883
diff
changeset
|
526 def readlink(pathname): |
5fe0b880200e
py3: convert os.readlink() path to native strings on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39883
diff
changeset
|
527 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
|
528 |
24692
144883a8d0d4
util: add removedirs as platform depending function
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24653
diff
changeset
|
529 def removedirs(name): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
530 """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
|
531 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
|
532 if listdir(name): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
533 return |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
534 os.rmdir(name) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
535 head, tail = os.path.split(name) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
536 if not tail: |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
537 head, tail = os.path.split(head) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
538 while head and tail: |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
539 try: |
32208
d74b0cff94a9
osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents:
31891
diff
changeset
|
540 if listdir(head): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
541 return |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
542 os.rmdir(head) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
543 except (ValueError, OSError): |
8364
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
544 break |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
545 head, tail = os.path.split(head) |
fa901423ac23
windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
8330
diff
changeset
|
546 |
9549
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
547 def rename(src, dst): |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
548 '''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
|
549 try: |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
550 os.rename(src, dst) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
551 except OSError as e: |
13278
e9a52ed28157
windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
552 if e.errno != errno.EEXIST: |
e9a52ed28157
windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
553 raise |
13280
6052bbc7aabd
reintroduces util.unlink, for POSIX and Windows.
Adrian Buehlmann <adrian@cadifra.com>
parents:
13278
diff
changeset
|
554 unlink(dst) |
9549
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
555 os.rename(src, dst) |
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9449
diff
changeset
|
556 |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
557 def gethgcmd(): |
39719
255d1885c7f8
py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
39644
diff
changeset
|
558 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
|
559 |
11138
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
560 def groupmembers(name): |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
561 # Don't support groups on Windows for now |
16687
e34106fa0dc3
cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents:
16076
diff
changeset
|
562 raise KeyError |
11138
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11010
diff
changeset
|
563 |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
564 def isexec(f): |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
565 return False |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14892
diff
changeset
|
566 |
14927
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
567 class cachestat(object): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
568 def __init__(self, path): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
569 pass |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
570 |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
571 def cacheable(self): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
572 return False |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
573 |
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
574 def lookupreg(key, valname=None, scope=None): |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
575 ''' Look up a key/value name in the Windows registry. |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
576 |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
577 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
|
578 is used. |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
579 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
|
580 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
|
581 LOCAL_MACHINE). |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
582 ''' |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
583 if scope is None: |
29760
3df9f780c90e
py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29530
diff
changeset
|
584 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
|
585 elif not isinstance(scope, (list, tuple)): |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
586 scope = (scope,) |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
587 for s in scope: |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
588 try: |
39643
47ac5d93d708
windows: open registry keys using unicode names
Matt Harbison <matt_harbison@yahoo.com>
parents:
38725
diff
changeset
|
589 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
|
590 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
|
591 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
|
592 # 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
|
593 return encoding.unitolocal(val) |
16807
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
594 except EnvironmentError: |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
595 pass |
80142f385af9
win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
16687
diff
changeset
|
596 |
8614
573734e7e6d0
cmdutils: Take over glob expansion duties from util
Matt Mackall <mpm@selenic.com>
parents:
8559
diff
changeset
|
597 expandglobs = True |
18868
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
598 |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
599 def statislink(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
600 '''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
|
601 return False |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
602 |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
603 def statisexec(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18143
diff
changeset
|
604 '''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
|
605 return False |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
606 |
25420
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
607 def poll(fds): |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
608 # see posix.py for description |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
609 raise NotImplementedError() |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25204
diff
changeset
|
610 |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
611 def readpipe(pipe): |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
612 """Read all available data from a pipe.""" |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
613 chunks = [] |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
614 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
|
615 size = win32.peekpipe(pipe) |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
616 if not size: |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
617 break |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
618 |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
619 s = pipe.read(size) |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
620 if not s: |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
621 break |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
622 chunks.append(s) |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
623 |
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
624 return ''.join(chunks) |
29530
3239e2fdd2e2
chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents:
27436
diff
changeset
|
625 |
3239e2fdd2e2
chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents:
27436
diff
changeset
|
626 def bindunixsocket(sock, path): |
39883
2209e72f9fcb
py3: ensure standard exceptions use `str` type strings in windows.py
Matt Harbison <matt_harbison@yahoo.com>
parents:
39820
diff
changeset
|
627 raise NotImplementedError(r'unsupported platform') |