Mercurial > hg
annotate mercurial/posix.py @ 25812:68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
This is the last step before supporting extdiff -S. It maintains the existing
behavior of diffing the largefile standins instead of the largefiles themselves.
Note however that the standins are not updated immediately upon modification, so
uncommitted largefile changes are ignored, as they previously were, even with
the diff command.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 11 Jul 2012 20:48:51 -0400 |
parents | 328739ea70c3 |
children | 224a33452ed4 |
rev | line source |
---|---|
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 # posix.py - Posix 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 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
8 from i18n import _ |
17203
0cb55b5c19a3
util, posix: eliminate encodinglower and encodingupper
Adrian Buehlmann <adrian@cadifra.com>
parents:
16726
diff
changeset
|
9 import encoding |
18097
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
10 import os, sys, errno, stat, getpass, pwd, grp, socket, tempfile, unicodedata |
25420
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
11 import select |
23683
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
12 import fcntl, re |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
13 |
9031
3b76321aa0de
compat: use open() instead of file() everywhere
Alejandro Santos <alejolp@alejolp.com>
parents:
8761
diff
changeset
|
14 posixfile = open |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
15 normpath = os.path.normpath |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
16 samestat = os.path.samestat |
14235
b9e1b041744f
rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents:
14234
diff
changeset
|
17 oslink = os.link |
13280
6052bbc7aabd
reintroduces util.unlink, for POSIX and Windows.
Adrian Buehlmann <adrian@cadifra.com>
parents:
13007
diff
changeset
|
18 unlink = os.unlink |
9549
8b8920209317
util: move rename into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
9517
diff
changeset
|
19 rename = os.rename |
24692
144883a8d0d4
util: add removedirs as platform depending function
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24596
diff
changeset
|
20 removedirs = os.removedirs |
8614
573734e7e6d0
cmdutils: Take over glob expansion duties from util
Matt Mackall <mpm@selenic.com>
parents:
8312
diff
changeset
|
21 expandglobs = False |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
22 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
23 umask = os.umask(0) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
24 os.umask(umask) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
25 |
17560
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
26 def split(p): |
18288
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
27 '''Same as posixpath.split, but faster |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
28 |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
29 >>> import posixpath |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
30 >>> for f in ['/absolute/path/to/file', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
31 ... 'relative/path/to/file', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
32 ... 'file_alone', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
33 ... 'path/to/directory/', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
34 ... '/multiple/path//separators', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
35 ... '/file_at_root', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
36 ... '///multiple_leading_separators_at_root', |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
37 ... '']: |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
38 ... assert split(f) == posixpath.split(f), f |
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
39 ''' |
17560
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
40 ht = p.rsplit('/', 1) |
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
41 if len(ht) == 1: |
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
42 return '', p |
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
43 nh = ht[0].rstrip('/') |
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
44 if nh: |
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
45 return nh, ht[1] |
18288
0d5a22f73a1f
posix: fix split() for the case where the path is at the root of the filesystem
Remy Blank <remy.blank@pobox.com>
parents:
18143
diff
changeset
|
46 return ht[0] + '/', ht[1] |
17560
9ee25d7b1aed
util: implement a faster os.path.split for posix systems
Bryan O'Sullivan <bryano@fb.com>
parents:
17391
diff
changeset
|
47 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
48 def openhardlinks(): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
49 '''return true if it is safe to hold open file handles to hardlinks''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
50 return True |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
51 |
13375
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13280
diff
changeset
|
52 def nlinks(name): |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13280
diff
changeset
|
53 '''return number of hardlinks for the given file''' |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13280
diff
changeset
|
54 return os.lstat(name).st_nlink |
f1fa8f481c7c
port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents:
13280
diff
changeset
|
55 |
14231
8abe4db2d162
rename util.parse_patch_output to parsepatchoutput
Adrian Buehlmann <adrian@cadifra.com>
parents:
14165
diff
changeset
|
56 def parsepatchoutput(output_line): |
8761
0289f384e1e5
Generally replace "file name" with "filename" in help and comments.
timeless <timeless@gmail.com>
parents:
8657
diff
changeset
|
57 """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
|
58 pf = output_line[14:] |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
59 if os.sys.platform == 'OpenVMS': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
60 if pf[0] == '`': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
61 pf = pf[1:-1] # Remove the quotes |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
62 else: |
8219
21cf74ff2deb
whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7943
diff
changeset
|
63 if pf.startswith("'") and pf.endswith("'") and " " in pf: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
64 pf = pf[1:-1] # Remove the quotes |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
65 return pf |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
66 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
67 def sshargs(sshcmd, host, user, port): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
68 '''Build argument list for ssh''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
69 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
|
70 return port and ("%s -p %s" % (args, port)) or args |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
71 |
14273
38af0f514134
rename util.is_exec to isexec
Adrian Buehlmann <adrian@cadifra.com>
parents:
14272
diff
changeset
|
72 def isexec(f): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
73 """check whether a file is executable""" |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
74 return (os.lstat(f).st_mode & 0o100 != 0) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
75 |
14232
df2399663392
rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents:
14231
diff
changeset
|
76 def setflags(f, l, x): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
77 s = os.lstat(f).st_mode |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
78 if l: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
79 if not stat.S_ISLNK(s): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
80 # switch file to link |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
81 fp = open(f) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
82 data = fp.read() |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
83 fp.close() |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
84 os.unlink(f) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
85 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
86 os.symlink(data, f) |
14004
97ed99d1f419
eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents:
13986
diff
changeset
|
87 except OSError: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
88 # failed to make a link, rewrite file |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
89 fp = open(f, "w") |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
90 fp.write(data) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
91 fp.close() |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
92 # no chmod needed at this point |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
93 return |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
94 if stat.S_ISLNK(s): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
95 # switch link to file |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
96 data = os.readlink(f) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
97 os.unlink(f) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
98 fp = open(f, "w") |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
99 fp.write(data) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13375
diff
changeset
|
100 fp.close() |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
101 s = 0o666 & ~umask # avoid restatting for chmod |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
102 |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
103 sx = s & 0o100 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
104 if x and not sx: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
105 # Turn on +x for every +r bit when making a file executable |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
106 # and obey umask. |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
107 os.chmod(f, s | (s & 0o444) >> 2 & ~umask) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
108 elif not x and sx: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
109 # Turn off all +x bits |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
110 os.chmod(f, s & 0o666) |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
111 |
15011
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
112 def copymode(src, dst, mode=None): |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
113 '''Copy the file mode from the file at path src to dst. |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
114 If src doesn't exist, we're using mode instead. If mode is None, we're |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
115 using umask.''' |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
116 try: |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
117 st_mode = os.lstat(src).st_mode & 0o777 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
118 except OSError as inst: |
15011
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
119 if inst.errno != errno.ENOENT: |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
120 raise |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
121 st_mode = mode |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
122 if st_mode is None: |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
123 st_mode = ~umask |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
124 st_mode &= 0o666 |
15011
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
125 os.chmod(dst, st_mode) |
5e44e4b3a0a3
util: move copymode into posix.py and windows.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14927
diff
changeset
|
126 |
13879
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
127 def checkexec(path): |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
128 """ |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
129 Check whether the given path is on a filesystem with UNIX-like exec flags |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
130 |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
131 Requires a directory (like /foo/.hg) |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
132 """ |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
133 |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
134 # VFAT on some Linux versions can flip mode but it doesn't persist |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
135 # a FS remount. Frequently we can detect it if files are created |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
136 # with exec bit on. |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
137 |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
138 try: |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
139 EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
140 fh, fn = tempfile.mkstemp(dir=path, prefix='hg-checkexec-') |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
141 try: |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
142 os.close(fh) |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
143 m = os.stat(fn).st_mode & 0o777 |
13879
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
144 new_file_has_exec = m & EXECFLAGS |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
145 os.chmod(fn, m ^ EXECFLAGS) |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
146 exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0o777) == m) |
13879
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
147 finally: |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
148 os.unlink(fn) |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
149 except (IOError, OSError): |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
150 # we don't care, the user probably won't be able to commit anyway |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
151 return False |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
152 return not (new_file_has_exec or exec_flags_cannot_flip) |
5b0a3f6cbead
util: move checkexec() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13400
diff
changeset
|
153 |
13890
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
154 def checklink(path): |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
155 """check whether the given path is on a symlink-capable filesystem""" |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
156 # mktemp is not racy because symlink creation will fail if the |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
157 # file already exists |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
158 name = tempfile.mktemp(dir=path, prefix='hg-checklink-') |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
159 try: |
19514
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
160 fd = tempfile.NamedTemporaryFile(dir=path, prefix='hg-checklink-') |
22946
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
161 try: |
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
162 os.symlink(os.path.basename(fd.name), name) |
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
163 os.unlink(name) |
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
164 return True |
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
165 finally: |
77c121da6143
checklink: always close the NamedTemporaryFile
Augie Fackler <raf@durin42.com>
parents:
22781
diff
changeset
|
166 fd.close() |
19514
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
167 except AttributeError: |
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
168 return False |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
169 except OSError as inst: |
19514
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
170 # sshfs might report failure while successfully creating the link |
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
171 if inst[0] == errno.EIO and os.path.exists(name): |
cfdae231ba78
checklink: work around sshfs brain-damage (issue3636)
Matt Mackall <mpm@selenic.com>
parents:
19131
diff
changeset
|
172 os.unlink(name) |
13890
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
173 return False |
31eb145b50b6
util: move checklink() to posix.py and return False on Windows
Adrian Buehlmann <adrian@cadifra.com>
parents:
13879
diff
changeset
|
174 |
13916
98ee3dd5bab4
path_auditor: check filenames for basic platform validity (issue2755)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13890
diff
changeset
|
175 def checkosfilename(path): |
98ee3dd5bab4
path_auditor: check filenames for basic platform validity (issue2755)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13890
diff
changeset
|
176 '''Check that the base-relative path is a valid filename on this platform. |
98ee3dd5bab4
path_auditor: check filenames for basic platform validity (issue2755)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13890
diff
changeset
|
177 Returns None if the path is ok, or a UI string describing the problem.''' |
98ee3dd5bab4
path_auditor: check filenames for basic platform validity (issue2755)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13890
diff
changeset
|
178 pass # on posix platforms, every path is ok |
98ee3dd5bab4
path_auditor: check filenames for basic platform validity (issue2755)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13890
diff
changeset
|
179 |
14233
659f34b833b9
rename util.set_binary to setbinary
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
180 def setbinary(fd): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
181 pass |
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 pconvert(path): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
184 return path |
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 localpath(path): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
187 return path |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
188 |
10218
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
189 def samefile(fpath1, fpath2): |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
190 """Returns whether path1 and path2 refer to the same file. This is only |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
191 guaranteed to work for files, not directories.""" |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
192 return os.path.samefile(fpath1, fpath2) |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
193 |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
194 def samedevice(fpath1, fpath2): |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
195 """Returns whether fpath1 and fpath2 are on the same device. This is only |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
196 guaranteed to work for files, not directories.""" |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
197 st1 = os.lstat(fpath1) |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
198 st2 = os.lstat(fpath2) |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
199 return st1.st_dev == st2.st_dev |
750b7a4f01f6
Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents:
9549
diff
changeset
|
200 |
15488
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15353
diff
changeset
|
201 # os.path.normcase is a no-op, which doesn't help us on non-native filesystems |
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15353
diff
changeset
|
202 def normcase(path): |
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15353
diff
changeset
|
203 return path.lower() |
6eff984d8e76
dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents:
15353
diff
changeset
|
204 |
24594
609aa973c01d
posix: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24108
diff
changeset
|
205 # what normcase does to ASCII strings |
609aa973c01d
posix: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24108
diff
changeset
|
206 normcasespec = encoding.normcasespecs.lower |
609aa973c01d
posix: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24108
diff
changeset
|
207 # fallback normcase function for non-ASCII strings |
609aa973c01d
posix: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24108
diff
changeset
|
208 normcasefallback = normcase |
609aa973c01d
posix: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24108
diff
changeset
|
209 |
9238
40196d036a71
util: add realpath() for getting the 'true' path.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
9031
diff
changeset
|
210 if sys.platform == 'darwin': |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
211 |
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
212 def normcase(path): |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
213 ''' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
214 Normalize a filename for OS X-compatible comparison: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
215 - escape-encode invalid characters |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
216 - decompose to NFD |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
217 - lowercase |
23597
7a5bcd471f2e
darwin: omit ignorable codepoints when normcase()ing a file path
Augie Fackler <raf@durin42.com>
parents:
22946
diff
changeset
|
218 - omit ignored characters [200c-200f, 202a-202e, 206a-206f,feff] |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
219 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
220 >>> normcase('UPPER') |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
221 'upper' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
222 >>> normcase('Caf\xc3\xa9') |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
223 'cafe\\xcc\\x81' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
224 >>> normcase('\xc3\x89') |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
225 'e\\xcc\\x81' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
226 >>> normcase('\xb8\xca\xc3\xca\xbe\xc8.JPG') # issue3918 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
227 '%b8%ca%c3\\xca\\xbe%c8.jpg' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
228 ''' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
229 |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
230 try: |
22781
70624fda193d
normcase: for darwin, use fast ASCII lower
Siddharth Agarwal <sid0@fb.com>
parents:
22246
diff
changeset
|
231 return encoding.asciilower(path) # exception for non-ASCII |
18501
a3b2dc1aa909
OS X: try cheap ascii .lower() in normcase before making full unicode dance
Mads Kiilerich <madski@unity3d.com>
parents:
18442
diff
changeset
|
232 except UnicodeDecodeError: |
24595
136ab89d61cb
darwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24594
diff
changeset
|
233 return normcasefallback(path) |
136ab89d61cb
darwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24594
diff
changeset
|
234 |
136ab89d61cb
darwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24594
diff
changeset
|
235 normcasespec = encoding.normcasespecs.lower |
136ab89d61cb
darwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24594
diff
changeset
|
236 |
136ab89d61cb
darwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24594
diff
changeset
|
237 def normcasefallback(path): |
18501
a3b2dc1aa909
OS X: try cheap ascii .lower() in normcase before making full unicode dance
Mads Kiilerich <madski@unity3d.com>
parents:
18442
diff
changeset
|
238 try: |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
239 u = path.decode('utf-8') |
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
240 except UnicodeDecodeError: |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
241 # OS X percent-encodes any bytes that aren't valid utf-8 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
242 s = '' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
243 g = '' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
244 l = 0 |
15563
b61fa7481a68
posix: fix HFS+ percent-encoding folding
Matt Mackall <mpm@selenic.com>
parents:
15551
diff
changeset
|
245 for c in path: |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
246 o = ord(c) |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
247 if l and o < 128 or o >= 192: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
248 # we want a continuation byte, but didn't get one |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
249 s += ''.join(["%%%02X" % ord(x) for x in g]) |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
250 g = '' |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
251 l = 0 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
252 if l == 0 and o < 128: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
253 # ascii |
15563
b61fa7481a68
posix: fix HFS+ percent-encoding folding
Matt Mackall <mpm@selenic.com>
parents:
15551
diff
changeset
|
254 s += c |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
255 elif l == 0 and 194 <= o < 245: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
256 # valid leading bytes |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
257 if o < 224: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
258 l = 1 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
259 elif o < 240: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
260 l = 2 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
261 else: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
262 l = 3 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
263 g = c |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
264 elif l > 0 and 128 <= o < 192: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
265 # valid continuations |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
266 g += c |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
267 l -= 1 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
268 if not l: |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
269 s += g |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
270 g = '' |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
271 else: |
19131
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
272 # invalid |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
273 s += "%%%02X" % o |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
274 |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
275 # any remaining partial characters |
af3b651505e2
hfs+: rewrite percent-escaper (issue3918)
Matt Mackall <mpm@selenic.com>
parents:
18868
diff
changeset
|
276 s += ''.join(["%%%02X" % ord(x) for x in g]) |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
277 u = s.decode('utf-8') |
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
278 |
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
279 # Decompose then lowercase (HFS+ technote specifies lower) |
23597
7a5bcd471f2e
darwin: omit ignorable codepoints when normcase()ing a file path
Augie Fackler <raf@durin42.com>
parents:
22946
diff
changeset
|
280 enc = unicodedata.normalize('NFD', u).lower().encode('utf-8') |
7a5bcd471f2e
darwin: omit ignorable codepoints when normcase()ing a file path
Augie Fackler <raf@durin42.com>
parents:
22946
diff
changeset
|
281 # drop HFS+ ignored characters |
7a5bcd471f2e
darwin: omit ignorable codepoints when normcase()ing a file path
Augie Fackler <raf@durin42.com>
parents:
22946
diff
changeset
|
282 return encoding.hfsignoreclean(enc) |
15551
1fa41d1f1351
posix: add extended support for OS X path folding
Matt Mackall <mpm@selenic.com>
parents:
15499
diff
changeset
|
283 |
15711
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
284 if sys.platform == 'cygwin': |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
285 # workaround for cygwin, in which mount point part of path is |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
286 # treated as case sensitive, even though underlying NTFS is case |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
287 # insensitive. |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
288 |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
289 # default mount points |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
290 cygwinmountpoints = sorted([ |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
291 "/usr/bin", |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
292 "/usr/lib", |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
293 "/cygdrive", |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
294 ], reverse=True) |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
295 |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
296 # use upper-ing as normcase as same as NTFS workaround |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
297 def normcase(path): |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
298 pathlen = len(path) |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
299 if (pathlen == 0) or (path[0] != os.sep): |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
300 # treat as relative |
17203
0cb55b5c19a3
util, posix: eliminate encodinglower and encodingupper
Adrian Buehlmann <adrian@cadifra.com>
parents:
16726
diff
changeset
|
301 return encoding.upper(path) |
15711
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
302 |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
303 # to preserve case of mountpoint part |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
304 for mp in cygwinmountpoints: |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
305 if not path.startswith(mp): |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
306 continue |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
307 |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
308 mplen = len(mp) |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
309 if mplen == pathlen: # mount point itself |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
310 return mp |
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
311 if path[mplen] == os.sep: |
17203
0cb55b5c19a3
util, posix: eliminate encodinglower and encodingupper
Adrian Buehlmann <adrian@cadifra.com>
parents:
16726
diff
changeset
|
312 return mp + encoding.upper(path[mplen:]) |
15711
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
313 |
17203
0cb55b5c19a3
util, posix: eliminate encodinglower and encodingupper
Adrian Buehlmann <adrian@cadifra.com>
parents:
16726
diff
changeset
|
314 return encoding.upper(path) |
15711
c51c9dc13a58
cygwin: add cygwin specific normcase logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
315 |
24596
75ea27f1711d
cygwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24595
diff
changeset
|
316 normcasespec = encoding.normcasespecs.other |
75ea27f1711d
cygwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24595
diff
changeset
|
317 normcasefallback = normcase |
75ea27f1711d
cygwin: define normcase spec and fallback
Siddharth Agarwal <sid0@fb.com>
parents:
24595
diff
changeset
|
318 |
16240
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
319 # Cygwin translates native ACLs to POSIX permissions, |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
320 # but these translations are not supported by native |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
321 # tools, so the exec bit tends to be set erroneously. |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
322 # Therefore, disable executable bit access on Cygwin. |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
323 def checkexec(path): |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
324 return False |
95e45abe7e8e
posix: ignore execution bit in cygwin (issue3301)
A. S. Budden <abudden@gmail.com>
parents:
15791
diff
changeset
|
325 |
16241
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
326 # Similarly, Cygwin's symlink emulation is likely to create |
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
327 # problems when Mercurial is used from both Cygwin and native |
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
328 # Windows, with other native tools, or on shared volumes |
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
329 def checklink(path): |
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
330 return False |
60cc3a0d2249
posix: disable cygwin's symlink emulation
Matt Mackall <mpm@selenic.com>
parents:
16240
diff
changeset
|
331 |
23683
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
332 _needsshellquote = None |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
333 def shellquote(s): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
334 if os.sys.platform == 'OpenVMS': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
335 return '"%s"' % s |
23683
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
336 global _needsshellquote |
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
337 if _needsshellquote is None: |
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
338 _needsshellquote = re.compile(r'[^a-zA-Z0-9._/-]').search |
24108
d65ecb814fc0
shellquote: fix missing quotes for empty string
Yuya Nishihara <yuya@tcha.org>
parents:
23683
diff
changeset
|
339 if s and not _needsshellquote(s): |
23683
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
340 # "s" shouldn't have to be quoted |
5edb387158a1
posix: quote the specified string only when it may have to be quoted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23597
diff
changeset
|
341 return s |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
342 else: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
343 return "'%s'" % s.replace("'", "'\\''") |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
344 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
345 def quotecommand(cmd): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
346 return cmd |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
347 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
348 def popen(command, mode='r'): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
349 return os.popen(command, mode) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
350 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
351 def testpid(pid): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
352 '''return False if pid dead, True if running or not sure''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
353 if os.sys.platform == 'OpenVMS': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
354 return True |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
355 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
356 os.kill(pid, 0) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
357 return True |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
358 except OSError as inst: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
359 return inst.errno != errno.ESRCH |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
360 |
14234
600e64004eb5
rename explain_exit to explainexit
Adrian Buehlmann <adrian@cadifra.com>
parents:
14233
diff
changeset
|
361 def explainexit(code): |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9238
diff
changeset
|
362 """return a 2-tuple (desc, code) describing a subprocess status |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9238
diff
changeset
|
363 (codes from kill are negative - not os.system/wait encoding)""" |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9238
diff
changeset
|
364 if code >= 0: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9238
diff
changeset
|
365 return _("exited with status %d") % code, code |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9238
diff
changeset
|
366 return _("killed by signal %d") % -code, -code |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
367 |
8657
3fa92c618624
posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents:
8614
diff
changeset
|
368 def isowner(st): |
3fa92c618624
posix: do not use fstat in isowner
Martin Geisler <mg@lazybytes.net>
parents:
8614
diff
changeset
|
369 """Return True if the stat object st is from the current user.""" |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
370 return st.st_uid == os.getuid() |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
371 |
14271
4030630fb59c
rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents:
14237
diff
changeset
|
372 def findexe(command): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
373 '''Find executable for command searching like which does. |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
374 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
|
375 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
|
376 If command isn't found None is returned.''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
377 if sys.platform == 'OpenVMS': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
378 return command |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
379 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
380 def findexisting(executable): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
381 'Will return executable if existing file' |
15499
58f96703a9ab
posix: fix findexe() to check for file type and access
Marc-Antoine Ruel <maruel@google.com>
parents:
15488
diff
changeset
|
382 if os.path.isfile(executable) and os.access(executable, os.X_OK): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
383 return executable |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
384 return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
385 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
386 if os.sep in command: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
387 return findexisting(command) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
388 |
16383
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16241
diff
changeset
|
389 if sys.platform == 'plan9': |
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16241
diff
changeset
|
390 return findexisting(os.path.join('/bin', command)) |
f5dd179bfa4a
plan9: initial support for plan 9 from bell labs
Steven Stallion <sstallion@gmail.com>
parents:
16241
diff
changeset
|
391 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
392 for path in os.environ.get('PATH', '').split(os.pathsep): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
393 executable = findexisting(os.path.join(path, command)) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
394 if executable is not None: |
15499
58f96703a9ab
posix: fix findexe() to check for file type and access
Marc-Antoine Ruel <maruel@google.com>
parents:
15488
diff
changeset
|
395 return executable |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
396 return None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
397 |
14237
4d684d8210a1
rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents:
14235
diff
changeset
|
398 def setsignalhandler(): |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
399 pass |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
400 |
18017
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
401 _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
|
402 |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
403 def statfiles(files): |
18017
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
404 '''Stat each file in files. Yield each stat, or None if a file does not |
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
405 exist or has a type we don't care about.''' |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
406 lstat = os.lstat |
18017
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
407 getkind = stat.S_IFMT |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
408 for nf in files: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
409 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
410 st = lstat(nf) |
18017
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
411 if getkind(st.st_mode) not in _wantedkinds: |
74912fe3d718
dirstate: move file type filtering to its source
Bryan O'Sullivan <bryano@fb.com>
parents:
17560
diff
changeset
|
412 st = None |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
413 except OSError as err: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
414 if err.errno not in (errno.ENOENT, errno.ENOTDIR): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
415 raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
416 st = None |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
417 yield st |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
418 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
419 def getuser(): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
420 '''return name of current user''' |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
421 return getpass.getuser() |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
422 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
423 def username(uid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
424 """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
|
425 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
426 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
|
427 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
428 if uid is None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
429 uid = os.getuid() |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
430 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
431 return pwd.getpwuid(uid)[0] |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
432 except KeyError: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
433 return str(uid) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
434 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
435 def groupname(gid=None): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
436 """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
|
437 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
438 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
|
439 |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
440 if gid is None: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
441 gid = os.getgid() |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
442 try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
443 return grp.getgrgid(gid)[0] |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
444 except KeyError: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
445 return str(gid) |
10237
2f7a38f336f4
serve: add and use portable spawnvp replacement
Patrick Mezard <pmezard@gmail.com>
parents:
10218
diff
changeset
|
446 |
11138
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
447 def groupmembers(name): |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
448 """Return the list of members of the group with the given |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
449 name, KeyError if the group does not exist. |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
450 """ |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
451 return list(grp.getgrnam(name).gr_mem) |
99eee847beaa
acl: grp module is not available on windows
Patrick Mezard <pmezard@gmail.com>
parents:
11011
diff
changeset
|
452 |
10237
2f7a38f336f4
serve: add and use portable spawnvp replacement
Patrick Mezard <pmezard@gmail.com>
parents:
10218
diff
changeset
|
453 def spawndetached(args): |
2f7a38f336f4
serve: add and use portable spawnvp replacement
Patrick Mezard <pmezard@gmail.com>
parents:
10218
diff
changeset
|
454 return os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0), |
2f7a38f336f4
serve: add and use portable spawnvp replacement
Patrick Mezard <pmezard@gmail.com>
parents:
10218
diff
changeset
|
455 args[0], args) |
2f7a38f336f4
serve: add and use portable spawnvp replacement
Patrick Mezard <pmezard@gmail.com>
parents:
10218
diff
changeset
|
456 |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
457 def gethgcmd(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10237
diff
changeset
|
458 return sys.argv[:1] |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
459 |
12689
c52c629ce19e
termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents:
11138
diff
changeset
|
460 def termwidth(): |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
461 try: |
22246
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
462 import termios, array |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
463 for dev in (sys.stderr, sys.stdout, sys.stdin): |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
464 try: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
465 try: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
466 fd = dev.fileno() |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
467 except AttributeError: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
468 continue |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
469 if not os.isatty(fd): |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
470 continue |
16726
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
471 try: |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
472 arri = fcntl.ioctl(fd, termios.TIOCGWINSZ, '\0' * 8) |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
473 width = array.array('h', arri)[1] |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
474 if width > 0: |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
475 return width |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
476 except AttributeError: |
7002bb17cc5e
posix: workaround lack of TIOCGWINSZ on Irix (issue3449)
Mark Round <hg@markround.com>
parents:
16383
diff
changeset
|
477 pass |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
478 except ValueError: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
479 pass |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
480 except IOError as e: |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
481 if e[0] == errno.EINVAL: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
482 pass |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
483 else: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
484 raise |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
485 except ImportError: |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
486 pass |
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10264
diff
changeset
|
487 return 80 |
14908
e2b5605501df
util: move "default" makedir to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14273
diff
changeset
|
488 |
e2b5605501df
util: move "default" makedir to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14273
diff
changeset
|
489 def makedir(path, notindexed): |
e2b5605501df
util: move "default" makedir to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14273
diff
changeset
|
490 os.mkdir(path) |
14909
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
491 |
18143
242d2f4ec01c
util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents:
18097
diff
changeset
|
492 def unlinkpath(f, ignoremissing=False): |
14909
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
493 """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:
18097
diff
changeset
|
494 try: |
242d2f4ec01c
util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents:
18097
diff
changeset
|
495 os.unlink(f) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
496 except OSError as e: |
18143
242d2f4ec01c
util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com>
parents:
18097
diff
changeset
|
497 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:
18097
diff
changeset
|
498 raise |
14909
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
499 # try removing directories that might now be empty |
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
500 try: |
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
501 os.removedirs(os.path.dirname(f)) |
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
502 except OSError: |
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
503 pass |
c627fe32c923
util: move "default" unlinkpath to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14908
diff
changeset
|
504 |
14910
570ea0259b0a
util: move "default" lookupreg to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14909
diff
changeset
|
505 def lookupreg(key, name=None, scope=None): |
570ea0259b0a
util: move "default" lookupreg to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14909
diff
changeset
|
506 return None |
14911
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
507 |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
508 def hidewindow(): |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
509 """Hide current shell window. |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
510 |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
511 Used to hide the window opened when starting asynchronous |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
512 child process under Windows, unneeded on other systems. |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
513 """ |
5b39503157fd
util: move "default" hidewindow to posix.py
Adrian Buehlmann <adrian@cadifra.com>
parents:
14910
diff
changeset
|
514 pass |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
515 |
14927
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
516 class cachestat(object): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
517 def __init__(self, path): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
518 self.stat = os.stat(path) |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
519 |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
520 def cacheable(self): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
521 return bool(self.stat.st_ino) |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
522 |
15791
a814f8fcc65a
Use explicit integer division
Martin Geisler <mg@aragost.com>
parents:
15711
diff
changeset
|
523 __hash__ = object.__hash__ |
a814f8fcc65a
Use explicit integer division
Martin Geisler <mg@aragost.com>
parents:
15711
diff
changeset
|
524 |
14927
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
525 def __eq__(self, other): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
526 try: |
18442
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
527 # Only dev, ino, size, mtime and atime are likely to change. Out |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
528 # of these, we shouldn't compare atime but should compare the |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
529 # rest. However, one of the other fields changing indicates |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
530 # something fishy going on, so return False if anything but atime |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
531 # changes. |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
532 return (self.stat.st_mode == other.stat.st_mode and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
533 self.stat.st_ino == other.stat.st_ino and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
534 self.stat.st_dev == other.stat.st_dev and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
535 self.stat.st_nlink == other.stat.st_nlink and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
536 self.stat.st_uid == other.stat.st_uid and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
537 self.stat.st_gid == other.stat.st_gid and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
538 self.stat.st_size == other.stat.st_size and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
539 self.stat.st_mtime == other.stat.st_mtime and |
ecba9b0e7672
posix: don't compare atime when determining if a file has changed
Siddharth Agarwal <sid0@fb.com>
parents:
18288
diff
changeset
|
540 self.stat.st_ctime == other.stat.st_ctime) |
14927
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
541 except AttributeError: |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
542 return False |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
543 |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
544 def __ne__(self, other): |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
545 return not self == other |
2aa3e07b2f07
posix, windows: introduce cachestat
Idan Kamara <idankk86@gmail.com>
parents:
14926
diff
changeset
|
546 |
14926
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
547 def executablepath(): |
4e7e63fc685a
util: eliminate wildcard imports
Adrian Buehlmann <adrian@cadifra.com>
parents:
14911
diff
changeset
|
548 return None # available on Windows only |
18097
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
549 |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
550 class unixdomainserver(socket.socket): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
551 def __init__(self, join, subsystem): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
552 '''Create a unix domain socket with the given prefix.''' |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
553 super(unixdomainserver, self).__init__(socket.AF_UNIX) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
554 sockname = subsystem + '.sock' |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
555 self.realpath = self.path = join(sockname) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
556 if os.path.islink(self.path): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
557 if os.path.exists(self.path): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
558 self.realpath = os.readlink(self.path) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
559 else: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
560 os.unlink(self.path) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
561 try: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
562 self.bind(self.realpath) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
563 except socket.error as err: |
18097
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
564 if err.args[0] == 'AF_UNIX path too long': |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
565 tmpdir = tempfile.mkdtemp(prefix='hg-%s-' % subsystem) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
566 self.realpath = os.path.join(tmpdir, sockname) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
567 try: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
568 self.bind(self.realpath) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
569 os.symlink(self.realpath, self.path) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
570 except (OSError, socket.error): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
571 self.cleanup() |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
572 raise |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
573 else: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
574 raise |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
575 self.listen(5) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
576 |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
577 def cleanup(self): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
578 def okayifmissing(f, path): |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
579 try: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
580 f(path) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25658
diff
changeset
|
581 except OSError as err: |
18097
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
582 if err.errno != errno.ENOENT: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
583 raise |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
584 |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
585 okayifmissing(os.unlink, self.path) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
586 if self.realpath != self.path: |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
587 okayifmissing(os.unlink, self.realpath) |
ae54cff742e2
posix: move server side of unix domain sockets out of inotify
Bryan O'Sullivan <bryano@fb.com>
parents:
18017
diff
changeset
|
588 okayifmissing(os.rmdir, os.path.dirname(self.realpath)) |
18868
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
589 |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
590 def statislink(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
591 '''check whether a stat result is a symlink''' |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
592 return st and stat.S_ISLNK(st.st_mode) |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
593 |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
594 def statisexec(st): |
cafa447a7d3b
util: add functions to check symlink/exec bits
Bryan O'Sullivan <bryano@fb.com>
parents:
18501
diff
changeset
|
595 '''check whether a stat result is an executable file''' |
25658
e93036747902
global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25420
diff
changeset
|
596 return st and (st.st_mode & 0o100 != 0) |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
597 |
25420
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
598 def poll(fds): |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
599 """block until something happens on any file descriptor |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
600 |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
601 This is a generic helper that will check for any activity |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
602 (read, write. exception) and return the list of touched files. |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
603 |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
604 In unsupported cases, it will raise a NotImplementedError""" |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
605 try: |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
606 res = select.select(fds, fds, fds) |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
607 except ValueError: # out of range file descriptor |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
608 raise NotImplementedError() |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
diff
changeset
|
609 return sorted(list(set(sum(res, [])))) |
c2ec81891502
util: add a simple poll utility
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24692
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.""" |
22246
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
613 # We can't fstat() a pipe because Linux will always report 0. |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
614 # So, we set the pipe to non-blocking mode and read everything |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
615 # that's available. |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
616 flags = fcntl.fcntl(pipe, fcntl.F_GETFL) |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
617 flags |= os.O_NONBLOCK |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
618 oldflags = fcntl.fcntl(pipe, fcntl.F_SETFL, flags) |
22245
234e4c24b980
platform: implement readpipe()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20202
diff
changeset
|
619 |
22246
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
620 try: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
621 chunks = [] |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
622 while True: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
623 try: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
624 s = pipe.read() |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
625 if not s: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
626 break |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
627 chunks.append(s) |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
628 except IOError: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
629 break |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
630 |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
631 return ''.join(chunks) |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
632 finally: |
331cbf088c4c
posix: implement readpipe using non-blocking I/O (issue4336)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
22245
diff
changeset
|
633 fcntl.fcntl(pipe, fcntl.F_SETFL, oldflags) |