annotate mercurial/windows.py @ 30720:32f160ceb99d

log: drop unnecessary ui.note label from "trouble: " line Follow-up on f05ede08dcf7 and 6d0b1a69f98c.
author Denis Laxalde <denis@laxalde.org>
date Sat, 07 Jan 2017 12:07:56 +0100
parents f1c9fafcbf46
children 067add650129
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
1 # windows.py - Windows utility function implementations for Mercurial
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9594
diff changeset
6 # GNU General Public License version 2 or any later version.
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
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
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
15 import sys
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
16
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
17 from .i18n import _
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
18 from . import (
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
19 encoding,
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
20 osutil,
30612
d623cc6b3742 py3: replace os.pathsep with pycompat.ospathsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30474
diff changeset
21 pycompat,
27436
912255f8f087 windows: correct the import of win32
Matt Harbison <matt_harbison@yahoo.com>
parents: 27360
diff changeset
22 win32,
27360
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
23 )
6daa795ed32f windows: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26375
diff changeset
24
29760
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
25 try:
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
26 import _winreg as winreg
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
27 winreg.CloseKey
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
28 except ImportError:
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
29 import winreg
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
30
15016
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
31 executablepath = win32.executablepath
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
32 getuser = win32.getuser
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
33 hidewindow = win32.hidewindow
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
34 makedir = win32.makedir
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
35 nlinks = win32.nlinks
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
36 oslink = win32.oslink
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
37 samedevice = win32.samedevice
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
38 samefile = win32.samefile
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
39 setsignalhandler = win32.setsignalhandler
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
40 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
41 split = os.path.split
15016
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
42 testpid = win32.testpid
871c77e78f5d windows: fix pyflakes warning on unused imports
Matt Mackall <mpm@selenic.com>
parents: 15011
diff changeset
43 unlink = win32.unlink
14985
dbf91976f900 windows: eliminate win32 wildcard import
Adrian Buehlmann <adrian@cadifra.com>
parents: 14969
diff changeset
44
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25462
diff changeset
45 umask = 0o022
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
46
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
47 class mixedfilemodewrapper(object):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
48 """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
49
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
50 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
51 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
52 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
53 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
54
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
55 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
56 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
57 calls when necessary.
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
58 """
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
59 OPNONE = 0
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
60 OPREAD = 1
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
61 OPWRITE = 2
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
62
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
63 def __init__(self, fp):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
64 object.__setattr__(self, '_fp', fp)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
65 object.__setattr__(self, '_lastop', 0)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
66
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
67 def __getattr__(self, name):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
68 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
69
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
70 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
71 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
72
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
73 def _noopseek(self):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
74 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
75
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
76 def seek(self, *args, **kwargs):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
77 object.__setattr__(self, '_lastop', self.OPNONE)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
78 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
79
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
80 def write(self, d):
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
81 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
82 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
83
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
84 object.__setattr__(self, '_lastop', self.OPWRITE)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
85 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
86
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
87 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
88 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
89 self._noopeseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
90
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
91 object.__setattr__(self, '_lastop', self.OPWRITE)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
92 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
93
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
94 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
95 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
96 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
97
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
98 object.__setattr__(self, '_lastop', self.OPREAD)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
99 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
100
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
101 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
102 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
103 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
104
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
105 object.__setattr__(self, '_lastop', self.OPREAD)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
106 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
107
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
108 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
109 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
110 self._noopseek()
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
111
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
112 object.__setattr__(self, '_lastop', self.OPREAD)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
113 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
114
8421
b6d0fa8c7685 posixfile: remove posixfile_nt and fix import bug in windows.py
Sune Foldager <cryo@cyanite.org>
parents: 8364
diff changeset
115 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
116 '''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
117 try:
24069
c6666395fdd2 windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents: 24051
diff changeset
118 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
119
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
120 # 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
121 # 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
122 if 'a' in mode:
25462
021e68d37c5b windows: use os.SEEK_END
Adrian Buehlmann <adrian@cadifra.com>
parents: 25420
diff changeset
123 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
124
26375
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
125 if '+' in mode:
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
126 return mixedfilemodewrapper(fp)
3686fa2b8eee windows: insert file positioning call between reads and writes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
127
24051
7956d17431bc windows: seek to the end of posixfile when opening in append mode
Matt Harbison <matt_harbison@yahoo.com>
parents: 23682
diff changeset
128 return fp
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
129 except WindowsError as err:
24069
c6666395fdd2 windows: adjust doc string and comments of posixfile()
Adrian Buehlmann <adrian@cadifra.com>
parents: 24051
diff changeset
130 # convert to a friendlier exception
9448
bc6b0fef9495 windows: provide filename in IOError exceptions
Steve Borho <steve@borho.org>
parents: 9174
diff changeset
131 raise IOError(err.errno, '%s: %s' % (name, err.strerror))
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
132
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8761
diff changeset
133 class winstdout(object):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
134 '''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
135
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
136 def __init__(self, fp):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
137 self.fp = fp
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
138
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
139 def __getattr__(self, key):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
140 return getattr(self.fp, key)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
141
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
142 def close(self):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
143 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
144 self.fp.close()
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
145 except IOError:
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
146 pass
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
147
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
148 def write(self, s):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
149 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
150 # 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
151 # writing large size of data to console.
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
152 limit = 16000
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
153 l = len(s)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
154 start = 0
10394
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
155 self.softspace = 0
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
156 while start < l:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
157 end = start + limit
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
158 self.fp.write(s[start:end])
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
159 start = end
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
160 except IOError as inst:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
161 if inst.errno != 0:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
162 raise
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
163 self.close()
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
164 raise IOError(errno.EPIPE, 'Broken pipe')
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
165
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
166 def flush(self):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
167 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
168 return self.fp.flush()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
169 except IOError as inst:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
170 if inst.errno != errno.EINVAL:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
171 raise
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
172 self.close()
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
173 raise IOError(errno.EPIPE, 'Broken pipe')
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
174
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
175 def _is_win_9x():
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
176 '''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
177 try:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
178 return sys.getwindowsversion()[3] == 1
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
179 except AttributeError:
30636
f1c9fafcbf46 py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
180 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
181
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
182 def openhardlinks():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13280
diff changeset
183 return not _is_win_9x()
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
184
14231
8abe4db2d162 rename util.parse_patch_output to parsepatchoutput
Adrian Buehlmann <adrian@cadifra.com>
parents: 14064
diff changeset
185 def parsepatchoutput(output_line):
8761
0289f384e1e5 Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents: 8657
diff changeset
186 """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
187 pf = output_line[14:]
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
188 if pf[0] == '`':
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
189 pf = pf[1:-1] # Remove the quotes
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
190 return pf
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 sshargs(sshcmd, host, user, port):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
193 '''Build argument list for ssh or Plink'''
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
194 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
195 args = user and ("%s@%s" % (user, host)) or host
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
196 return port and ("%s %s %s" % (args, pflag, port)) or args
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
197
14232
df2399663392 rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents: 14231
diff changeset
198 def setflags(f, l, x):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
199 pass
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
200
15011
5e44e4b3a0a3 util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 14985
diff changeset
201 def copymode(src, dst, mode=None):
5e44e4b3a0a3 util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 14985
diff changeset
202 pass
5e44e4b3a0a3 util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 14985
diff changeset
203
13879
5b0a3f6cbead util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13777
diff changeset
204 def checkexec(path):
5b0a3f6cbead util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13777
diff changeset
205 return False
5b0a3f6cbead util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13777
diff changeset
206
13890
31eb145b50b6 util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13879
diff changeset
207 def checklink(path):
31eb145b50b6 util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13879
diff changeset
208 return False
31eb145b50b6 util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents: 13879
diff changeset
209
14233
659f34b833b9 rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents: 14232
diff changeset
210 def setbinary(fd):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
211 # 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
212 # fileno(), usually set to -1.
14969
a3f97038c1c2 windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14927
diff changeset
213 fno = getattr(fd, 'fileno', None)
a3f97038c1c2 windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14927
diff changeset
214 if fno is not None and fno() >= 0:
a3f97038c1c2 windows: use getattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14927
diff changeset
215 msvcrt.setmode(fno(), os.O_BINARY)
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
216
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
217 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
218 return path.replace(pycompat.ossep, '/')
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
219
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
220 def localpath(path):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
221 return path.replace('/', '\\')
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
222
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
223 def normpath(path):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
224 return pconvert(os.path.normpath(path))
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
225
15671
3c5e818ac679 windows: use upper() instead of lower() or os.path.normcase()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15637
diff changeset
226 def normcase(path):
25071
8ce36dba70d1 windows: add comment in normcase()
Adrian Buehlmann <adrian@cadifra.com>
parents: 24908
diff changeset
227 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
228
24598
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
229 # see posix.py for definitions
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
230 normcasespec = encoding.normcasespecs.upper
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
231 normcasefallback = encoding.upperfallback
22f49c7dd11b windows: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents: 24148
diff changeset
232
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
233 def samestat(s1, s2):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
234 return False
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
235
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
236 # 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
237 # - 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
238 # 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
239 # - 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
240 # - 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
241 # backslash
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
242 # (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
243 # So, to quote a string, we must surround it in double quotes, double
17505
ae791d371864 spelling: precede
timeless@mozdev.org
parents: 17223
diff changeset
244 # 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
245 # 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
246 # quote we've appended to the end)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
247 _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
248 _needsshellquote = None
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
249 def shellquote(s):
24908
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
250 r"""
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
251 >>> shellquote(r'C:\Users\xyz')
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
252 '"C:\\Users\\xyz"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
253 >>> shellquote(r'C:\Users\xyz/mixed')
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
254 '"C:\\Users\\xyz/mixed"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
255 >>> # Would be safe not to quote too, since it is all double backslashes
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
256 >>> shellquote(r'C:\\Users\\xyz')
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
257 '"C:\\\\Users\\\\xyz"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
258 >>> # But this must be quoted
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
259 >>> shellquote(r'C:\\Users\\xyz/abc')
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
260 '"C:\\\\Users\\\\xyz/abc"'
30b910fea244 windows: add doctest for shellquote()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24885
diff changeset
261 """
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
262 global _quotere
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
263 if _quotere is None:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
264 _quotere = re.compile(r'(\\*)("|\\$)')
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
265 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
266 if _needsshellquote is None:
24885
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
267 # ":" 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
268 # 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
269 # 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
270 # 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
271 # "\".
eea3977e6fca windows: make shellquote() quote any path containing '\' (issue4629)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24692
diff changeset
272 _needsshellquote = re.compile(r'[^a-zA-Z0-9._:/-]').search
24108
d65ecb814fc0 shellquote: fix missing quotes for empty string
Yuya Nishihara <yuya@tcha.org>
parents: 23682
diff changeset
273 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
274 # "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
275 return s
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
276 return '"%s"' % _quotere.sub(r'\1\1\\\2', s)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
277
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
278 def quotecommand(cmd):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
279 """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
280 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
281 # 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
282 return '"' + cmd + '"'
6c9345f9edca util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents: 12689
diff changeset
283 return cmd
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
284
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
285 def popen(command, mode='r'):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
286 # Work around "popen spawned process may not write to stdout
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
287 # under windows"
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
288 # http://bugs.python.org/issue1366
17391
fc24c10424d2 util: replace util.nulldev with os.devnull
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17223
diff changeset
289 command += " 2> %s" % os.devnull
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
290 return os.popen(quotecommand(command), mode)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
291
14234
600e64004eb5 rename explain_exit to explainexit
Adrian Buehlmann <adrian@cadifra.com>
parents: 14233
diff changeset
292 def explainexit(code):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
293 return _("exited with status %d") % code, code
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
294
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
295 # 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
296 # username and groupname functions above, too.
8657
3fa92c618624 posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents: 8614
diff changeset
297 def isowner(st):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
298 return True
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
299
14271
4030630fb59c rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents: 14234
diff changeset
300 def findexe(command):
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
301 '''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
302 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
303 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
304 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
305 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
306 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
307 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
308 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
309 pathexts = ['']
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
310
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
311 def findexisting(pathcommand):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
312 '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
313 for ext in pathexts:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
314 executable = pathcommand + ext
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
315 if os.path.exists(executable):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
316 return executable
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
317 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
318
30615
bb77654dc7ae py3: replace os.sep with pycompat.ossep (part 3 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30612
diff changeset
319 if pycompat.ossep in command:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
320 return findexisting(command)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
321
30636
f1c9fafcbf46 py3: replace os.environ with encoding.environ (part 3 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30615
diff changeset
322 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
323 executable = findexisting(os.path.join(path, command))
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
324 if executable is not None:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
325 return executable
10156
c31ac3f7fd8f windows: expand environment vars in find_exe
Steve Borho <steve@borho.org>
parents: 9594
diff changeset
326 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
327
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
328 _wantedkinds = set([stat.S_IFREG, stat.S_IFLNK])
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
329
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
330 def statfiles(files):
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
331 '''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
332 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
333
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
334 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
335 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
336 getkind = stat.S_IFMT
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
337 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
338 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
339 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
340 if not dir:
3d456bf32f18 Use os.path.split() for MBCS with win32mbcs extension.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 8951
diff changeset
341 dir = '.'
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
342 cache = dircache.get(dir, None)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
343 if cache is None:
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
344 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
345 dmap = dict([(normcase(n), s)
18017
74912fe3d718 dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents: 17560
diff changeset
346 for n, k, s in osutil.listdir(dir, True)
18041
f0cfa27c712a windows: correctly pass a mode to S_IFMT in statfiles
Matt Mackall <mpm@selenic.com>
parents: 18017
diff changeset
347 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
348 except OSError as err:
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
349 # 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
350 # 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
351 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
352 errno.ENOTDIR):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
353 raise
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
354 dmap = {}
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
355 cache = dircache.setdefault(dir, dmap)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
356 yield cache.get(base, None)
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
357
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
358 def username(uid=None):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
359 """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
360
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
361 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
362 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
363
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
364 def groupname(gid=None):
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
365 """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
366
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
367 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
368 return None
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
369
24692
144883a8d0d4 util: add removedirs as platform depending function
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24653
diff changeset
370 def removedirs(name):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
371 """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
372 directories or junction points if they actually contain files"""
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
373 if osutil.listdir(name):
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
374 return
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
375 os.rmdir(name)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
376 head, tail = os.path.split(name)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
377 if not tail:
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
378 head, tail = os.path.split(head)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
379 while head and tail:
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
380 try:
9572
1f665246dab3 windows: fix unlink() not dropping empty tree (issue1861)
Patrick Mezard <pmezard@gmail.com>
parents: 9448
diff changeset
381 if osutil.listdir(head):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
382 return
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
383 os.rmdir(head)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13986
diff changeset
384 except (ValueError, OSError):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
385 break
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
386 head, tail = os.path.split(head)
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
387
18143
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18041
diff changeset
388 def unlinkpath(f, ignoremissing=False):
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
389 """unlink and remove the directory if it is empty"""
18143
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18041
diff changeset
390 try:
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18041
diff changeset
391 unlink(f)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
392 except OSError as e:
18143
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18041
diff changeset
393 if not (ignoremissing and e.errno == errno.ENOENT):
242d2f4ec01c util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents: 18041
diff changeset
394 raise
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
395 # try removing directories that might now be empty
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
396 try:
24692
144883a8d0d4 util: add removedirs as platform depending function
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24653
diff changeset
397 removedirs(os.path.dirname(f))
8364
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
398 except OSError:
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
399 pass
fa901423ac23 windows: avoid deleting non-empty reparse points
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 8330
diff changeset
400
9549
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
401 def rename(src, dst):
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
402 '''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
403 try:
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
404 os.rename(src, dst)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
405 except OSError as e:
13278
e9a52ed28157 windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents: 13235
diff changeset
406 if e.errno != errno.EEXIST:
e9a52ed28157 windows.rename: check OSError for EEXIST
Adrian Buehlmann <adrian@cadifra.com>
parents: 13235
diff changeset
407 raise
13280
6052bbc7aabd reintroduces util.unlink, for POSIX and Windows.
Adrian Buehlmann <adrian@cadifra.com>
parents: 13278
diff changeset
408 unlink(dst)
9549
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
409 os.rename(src, dst)
8b8920209317 util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 9449
diff changeset
410
10239
8e4be44a676f Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents: 10237
diff changeset
411 def gethgcmd():
8e4be44a676f Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents: 10237
diff changeset
412 return [sys.executable] + sys.argv[:1]
8e4be44a676f Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents: 10237
diff changeset
413
11138
99eee847beaa acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents: 11010
diff changeset
414 def groupmembers(name):
99eee847beaa acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents: 11010
diff changeset
415 # Don't support groups on Windows for now
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16076
diff changeset
416 raise KeyError
11138
99eee847beaa acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents: 11010
diff changeset
417
14926
4e7e63fc685a util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents: 14892
diff changeset
418 def isexec(f):
4e7e63fc685a util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents: 14892
diff changeset
419 return False
4e7e63fc685a util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents: 14892
diff changeset
420
14927
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
421 class cachestat(object):
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
422 def __init__(self, path):
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
423 pass
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
424
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
425 def cacheable(self):
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
426 return False
2aa3e07b2f07 posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents: 14926
diff changeset
427
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
428 def lookupreg(key, valname=None, scope=None):
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
429 ''' 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
430
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
431 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
432 is used.
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
433 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
434 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
435 LOCAL_MACHINE).
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
436 '''
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
437 if scope is None:
29760
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
438 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
439 elif not isinstance(scope, (list, tuple)):
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
440 scope = (scope,)
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
441 for s in scope:
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
442 try:
29760
3df9f780c90e py3: conditionalize _winreg import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29530
diff changeset
443 val = winreg.QueryValueEx(winreg.OpenKey(s, key), valname)[0]
16807
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
444 # never let a Unicode string escape into the wild
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
445 return encoding.tolocal(val.encode('UTF-8'))
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
446 except EnvironmentError:
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
447 pass
80142f385af9 win32: move lookupreg() to windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 16687
diff changeset
448
8614
573734e7e6d0 cmdutils: Take over glob expansion duties from util
Matt Mackall <mpm@selenic.com>
parents: 8559
diff changeset
449 expandglobs = True
18868
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
450
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
451 def statislink(st):
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
452 '''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
453 return False
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
454
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
455 def statisexec(st):
cafa447a7d3b util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents: 18143
diff changeset
456 '''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
457 return False
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
458
25420
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
459 def poll(fds):
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
460 # see posix.py for description
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
461 raise NotImplementedError()
c2ec81891502 util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25204
diff changeset
462
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
463 def readpipe(pipe):
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
464 """Read all available data from a pipe."""
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
465 chunks = []
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
466 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
467 size = win32.peekpipe(pipe)
22245
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
468 if not size:
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
469 break
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
470
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
471 s = pipe.read(size)
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
472 if not s:
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
473 break
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
474 chunks.append(s)
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
475
234e4c24b980 platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20202
diff changeset
476 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
477
3239e2fdd2e2 chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents: 27436
diff changeset
478 def bindunixsocket(sock, path):
3239e2fdd2e2 chgserver: extract utility to bind unix domain socket to long path
Yuya Nishihara <yuya@tcha.org>
parents: 27436
diff changeset
479 raise NotImplementedError('unsupported platform')