author | Tobias Bell <tobias.bell@gmail.com> |
Sat, 28 Mar 2009 16:34:40 +0100 | |
changeset 7901 | ccc6531e6db8 |
parent 7890 | e710f0f592b2 |
child 7913 | 1b1b3dd630a5 |
permissions | -rw-r--r-- |
1082 | 1 |
""" |
2 |
util.py - Mercurial utility functions and platform specfic implementations |
|
3 |
||
4 |
Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
|
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4625
diff
changeset
|
5 |
Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2859 | 6 |
Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
1082 | 7 |
|
8 |
This software may be used and distributed according to the terms |
|
9 |
of the GNU General Public License, incorporated herein by reference. |
|
10 |
||
11 |
This contains helper routines that are independent of the SCM core and hide |
|
12 |
platform-specific details from the core. |
|
13 |
""" |
|
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
14 |
|
3891 | 15 |
from i18n import _ |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
16 |
import cStringIO, errno, re, shutil, sys, tempfile, traceback, error |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
17 |
import os, stat, threading, time, calendar, ConfigParser, locale, glob, osutil |
7695
deec6628e62b
Also find correct column width of wide characters.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
7646
diff
changeset
|
18 |
import imp, unicodedata |
3769 | 19 |
|
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
20 |
# Python compatibility |
3769 | 21 |
|
4057
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
22 |
try: |
4647
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
23 |
set = set |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
24 |
frozenset = frozenset |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
25 |
except NameError: |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
26 |
from sets import Set as set, ImmutableSet as frozenset |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
27 |
|
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
28 |
_md5 = None |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
29 |
def md5(s): |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
30 |
global _md5 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
31 |
if _md5 is None: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
32 |
try: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
33 |
import hashlib |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
34 |
_md5 = hashlib.md5 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
35 |
except ImportError: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
36 |
import md5 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
37 |
_md5 = md5.md5 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
38 |
return _md5(s) |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
39 |
|
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
40 |
_sha1 = None |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
41 |
def sha1(s): |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
42 |
global _sha1 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
43 |
if _sha1 is None: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
44 |
try: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
45 |
import hashlib |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
46 |
_sha1 = hashlib.sha1 |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
47 |
except ImportError: |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
48 |
import sha |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
49 |
_sha1 = sha.sha |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
50 |
return _sha1(s) |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
51 |
|
4647
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
52 |
try: |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
53 |
import subprocess |
7163
1be530a3180e
Fix util.popen2 for Python 2.3
Thomas Arendsen Hein <thomas@intevation.de>
parents:
7137
diff
changeset
|
54 |
subprocess.Popen # trigger ImportError early |
7123
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
55 |
closefds = os.name == 'posix' |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
56 |
def popen2(cmd, mode='t', bufsize=-1): |
7123
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
57 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
58 |
close_fds=closefds, |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
59 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE) |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
60 |
return p.stdin, p.stdout |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
61 |
def popen3(cmd, mode='t', bufsize=-1): |
7123
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
62 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
63 |
close_fds=closefds, |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
64 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
65 |
stderr=subprocess.PIPE) |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
66 |
return p.stdin, p.stdout, p.stderr |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
67 |
def Popen3(cmd, capturestderr=False, bufsize=-1): |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
68 |
stderr = capturestderr and subprocess.PIPE or None |
7123
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
69 |
p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, |
716277f5867e
util: subprocess close_fds option is unix only
Patrick Mezard <pmezard@gmail.com>
parents:
7118
diff
changeset
|
70 |
close_fds=closefds, |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
71 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
72 |
stderr=stderr) |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
73 |
p.fromchild = p.stdout |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
74 |
p.tochild = p.stdin |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
75 |
p.childerr = p.stderr |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
76 |
return p |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
77 |
except ImportError: |
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
78 |
subprocess = None |
7164
cae820101762
Add util.popen3 fallback, simplify import of Popen3
Thomas Arendsen Hein <thomas@intevation.de>
parents:
7163
diff
changeset
|
79 |
from popen2 import Popen3 |
7163
1be530a3180e
Fix util.popen2 for Python 2.3
Thomas Arendsen Hein <thomas@intevation.de>
parents:
7137
diff
changeset
|
80 |
popen2 = os.popen2 |
7164
cae820101762
Add util.popen3 fallback, simplify import of Popen3
Thomas Arendsen Hein <thomas@intevation.de>
parents:
7163
diff
changeset
|
81 |
popen3 = os.popen3 |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
82 |
|
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
83 |
|
7461
2a67430f92f1
encoding: normalize some silly encoding names
Matt Mackall <mpm@selenic.com>
parents:
7430
diff
changeset
|
84 |
_encodingfixup = {'646': 'ascii', 'ANSI_X3.4-1968': 'ascii'} |
2a67430f92f1
encoding: normalize some silly encoding names
Matt Mackall <mpm@selenic.com>
parents:
7430
diff
changeset
|
85 |
|
4647
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
86 |
try: |
4540
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
87 |
_encoding = os.environ.get("HGENCODING") |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
88 |
if sys.platform == 'darwin' and not _encoding: |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
89 |
# On darwin, getpreferredencoding ignores the locale environment and |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
90 |
# always returns mac-roman. We override this if the environment is |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
91 |
# not C (has been customized by the user). |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
92 |
locale.setlocale(locale.LC_CTYPE, '') |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
93 |
_encoding = locale.getlocale()[1] |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
94 |
if not _encoding: |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
95 |
_encoding = locale.getpreferredencoding() or 'ascii' |
7461
2a67430f92f1
encoding: normalize some silly encoding names
Matt Mackall <mpm@selenic.com>
parents:
7430
diff
changeset
|
96 |
_encoding = _encodingfixup.get(_encoding, _encoding) |
4057
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
97 |
except locale.Error: |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
98 |
_encoding = 'ascii' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
99 |
_encodingmode = os.environ.get("HGENCODINGMODE", "strict") |
3835
d1ce5461beed
Allow the user to specify the fallback encoding for the changelog
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3813
diff
changeset
|
100 |
_fallbackencoding = 'ISO-8859-1' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
101 |
|
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
102 |
def tolocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
103 |
""" |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
104 |
Convert a string from internal UTF-8 to local encoding |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
105 |
|
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
106 |
All internal strings should be UTF-8 but some repos before the |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
107 |
implementation of locale support may contain latin1 or possibly |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
108 |
other character sets. We attempt to decode everything strictly |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
109 |
using UTF-8, then Latin-1, and failing that, we use UTF-8 and |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
110 |
replace unknown characters. |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
111 |
""" |
3835
d1ce5461beed
Allow the user to specify the fallback encoding for the changelog
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3813
diff
changeset
|
112 |
for e in ('UTF-8', _fallbackencoding): |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
113 |
try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
114 |
u = s.decode(e) # attempt strict decoding |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
115 |
return u.encode(_encoding, "replace") |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
116 |
except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
117 |
raise Abort(_("%s, please check your locale settings") % k) |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
118 |
except UnicodeDecodeError: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
119 |
pass |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
120 |
u = s.decode("utf-8", "replace") # last ditch |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
121 |
return u.encode(_encoding, "replace") |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
122 |
|
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
123 |
def fromlocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
124 |
""" |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
125 |
Convert a string from the local character encoding to UTF-8 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
126 |
|
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
127 |
We attempt to decode strings using the encoding mode set by |
4876 | 128 |
HGENCODINGMODE, which defaults to 'strict'. In this mode, unknown |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
129 |
characters will cause an error message. Other modes include |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
130 |
'replace', which replaces unknown characters with a special |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
131 |
Unicode character, and 'ignore', which drops the character. |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
132 |
""" |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
133 |
try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
134 |
return s.decode(_encoding, _encodingmode).encode("utf-8") |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
135 |
except UnicodeDecodeError, inst: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
136 |
sub = s[max(0, inst.start-10):inst.start+10] |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
137 |
raise Abort("decoding near '%s': %s!" % (sub, inst)) |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
138 |
except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
139 |
raise Abort(_("%s, please check your locale settings") % k) |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
140 |
|
7695
deec6628e62b
Also find correct column width of wide characters.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
7646
diff
changeset
|
141 |
def colwidth(s): |
7696 | 142 |
"Find the column width of a UTF-8 string for display" |
143 |
d = s.decode(_encoding, 'replace') |
|
144 |
if hasattr(unicodedata, 'east_asian_width'): |
|
145 |
w = unicodedata.east_asian_width |
|
146 |
return sum([w(c) in 'WF' and 2 or 1 for c in d]) |
|
147 |
return len(d) |
|
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
148 |
|
7632 | 149 |
def version(): |
150 |
"""Return version information if available.""" |
|
151 |
try: |
|
152 |
import __version__ |
|
153 |
return __version__.version |
|
154 |
except ImportError: |
|
155 |
return 'unknown' |
|
156 |
||
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
157 |
# used by parsedate |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
158 |
defaultdateformats = ( |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
159 |
'%Y-%m-%d %H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
160 |
'%Y-%m-%d %I:%M:%S%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
161 |
'%Y-%m-%d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
162 |
'%Y-%m-%d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
163 |
'%Y-%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
164 |
'%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
165 |
'%m/%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
166 |
'%m/%d/%y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
167 |
'%m/%d/%Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
168 |
'%a %b %d %H:%M:%S %Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
169 |
'%a %b %d %I:%M:%S%p %Y', |
4708
01f9ee4de1ad
Add support for RFC2822 to util.parsedate().
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents:
4686
diff
changeset
|
170 |
'%a, %d %b %Y %H:%M:%S', # GNU coreutils "/bin/date --rfc-2822" |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
171 |
'%b %d %H:%M:%S %Y', |
3812 | 172 |
'%b %d %I:%M:%S%p %Y', |
173 |
'%b %d %H:%M:%S', |
|
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
174 |
'%b %d %I:%M:%S%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
175 |
'%b %d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
176 |
'%b %d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
177 |
'%b %d %Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
178 |
'%b %d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
179 |
'%H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
180 |
'%I:%M:%SP', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
181 |
'%H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
182 |
'%I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
183 |
) |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
184 |
|
3812 | 185 |
extendeddateformats = defaultdateformats + ( |
186 |
"%Y", |
|
187 |
"%Y-%m", |
|
188 |
"%b", |
|
189 |
"%b %Y", |
|
190 |
) |
|
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
191 |
|
4069
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
192 |
# differences from SafeConfigParser: |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
193 |
# - case-sensitive keys |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
194 |
# - allows values that are not strings (this means that you may not |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
195 |
# be able to save the configuration to a file) |
3425
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
196 |
class configparser(ConfigParser.SafeConfigParser): |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
197 |
def optionxform(self, optionstr): |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
198 |
return optionstr |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
199 |
|
4069
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
200 |
def set(self, section, option, value): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
201 |
return ConfigParser.ConfigParser.set(self, section, option, value) |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
202 |
|
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
203 |
def _interpolate(self, section, option, rawval, vars): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
204 |
if not isinstance(rawval, basestring): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
205 |
return rawval |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
206 |
return ConfigParser.SafeConfigParser._interpolate(self, section, |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
207 |
option, rawval, vars) |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
208 |
|
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
209 |
def cachefunc(func): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
210 |
'''cache the result of function calls''' |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
211 |
# XXX doesn't handle keywords args |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
212 |
cache = {} |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
213 |
if func.func_code.co_argcount == 1: |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
214 |
# we gain a small amount of time because |
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
215 |
# we don't need to pack/unpack the list |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
216 |
def f(arg): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
217 |
if arg not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
218 |
cache[arg] = func(arg) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
219 |
return cache[arg] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
220 |
else: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
221 |
def f(*args): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
222 |
if args not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
223 |
cache[args] = func(*args) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
224 |
return cache[args] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
225 |
|
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
226 |
return f |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
227 |
|
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
228 |
def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
229 |
'''filter string S through command CMD, returning its output''' |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
230 |
(pin, pout) = popen2(cmd, 'b') |
1258 | 231 |
def writer(): |
2096
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
232 |
try: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
233 |
pin.write(s) |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
234 |
pin.close() |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
235 |
except IOError, inst: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
236 |
if inst.errno != errno.EPIPE: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
237 |
raise |
1258 | 238 |
|
239 |
# we should use select instead on UNIX, but this will work on most |
|
240 |
# systems, including Windows |
|
241 |
w = threading.Thread(target=writer) |
|
242 |
w.start() |
|
243 |
f = pout.read() |
|
244 |
pout.close() |
|
245 |
w.join() |
|
246 |
return f |
|
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
247 |
|
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
248 |
def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
249 |
'''filter string S through a pair of temporary files with CMD. |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
250 |
CMD is used as a template to create the real command to be run, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
251 |
with the strings INFILE and OUTFILE replaced by the real names of |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
252 |
the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
253 |
inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
254 |
try: |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
255 |
infd, inname = tempfile.mkstemp(prefix='hg-filter-in-') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
256 |
fp = os.fdopen(infd, 'wb') |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
257 |
fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
258 |
fp.close() |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
259 |
outfd, outname = tempfile.mkstemp(prefix='hg-filter-out-') |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
260 |
os.close(outfd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
261 |
cmd = cmd.replace('INFILE', inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
262 |
cmd = cmd.replace('OUTFILE', outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
263 |
code = os.system(cmd) |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
264 |
if sys.platform == 'OpenVMS' and code & 1: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
265 |
code = 0 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
266 |
if code: raise Abort(_("command '%s' failed: %s") % |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
267 |
(cmd, explain_exit(code))) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
268 |
return open(outname, 'rb').read() |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
269 |
finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
270 |
try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
271 |
if inname: os.unlink(inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
272 |
except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
273 |
try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
274 |
if outname: os.unlink(outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
275 |
except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
276 |
|
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
277 |
filtertable = { |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
278 |
'tempfile:': tempfilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
279 |
'pipe:': pipefilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
280 |
} |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
281 |
|
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
282 |
def filter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
283 |
"filter a string through a command that transforms its input to its output" |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
284 |
for name, fn in filtertable.iteritems(): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
285 |
if cmd.startswith(name): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
286 |
return fn(s, cmd[len(name):].lstrip()) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
287 |
return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
288 |
|
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
289 |
def binary(s): |
6507
9699864de219
Let util.binary check entire data for \0 (issue1066, issue1079)
Christian Ebert <blacktrash@gmx.net>
parents:
6501
diff
changeset
|
290 |
"""return true if a string is binary data""" |
9699864de219
Let util.binary check entire data for \0 (issue1066, issue1079)
Christian Ebert <blacktrash@gmx.net>
parents:
6501
diff
changeset
|
291 |
if s and '\0' in s: |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
292 |
return True |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
293 |
return False |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
294 |
|
556 | 295 |
def unique(g): |
1082 | 296 |
"""return the uniq elements of iterable g""" |
5881 | 297 |
return dict.fromkeys(g).keys() |
556 | 298 |
|
6762 | 299 |
def sort(l): |
300 |
if not isinstance(l, list): |
|
301 |
l = list(l) |
|
302 |
l.sort() |
|
303 |
return l |
|
304 |
||
7396
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
305 |
def increasingchunks(source, min=1024, max=65536): |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
306 |
'''return no less than min bytes per chunk while data remains, |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
307 |
doubling min after each chunk until it reaches max''' |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
308 |
def log2(x): |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
309 |
if not x: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
310 |
return 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
311 |
i = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
312 |
while x: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
313 |
x >>= 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
314 |
i += 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
315 |
return i - 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
316 |
|
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
317 |
buf = [] |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
318 |
blen = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
319 |
for chunk in source: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
320 |
buf.append(chunk) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
321 |
blen += len(chunk) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
322 |
if blen >= min: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
323 |
if min < max: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
324 |
min = min << 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
325 |
nmin = 1 << log2(blen) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
326 |
if nmin > min: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
327 |
min = nmin |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
328 |
if min > max: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
329 |
min = max |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
330 |
yield ''.join(buf) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
331 |
blen = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
332 |
buf = [] |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
333 |
if buf: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
334 |
yield ''.join(buf) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
335 |
|
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
336 |
class Abort(Exception): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
337 |
"""Raised if a command needs to print an error and exit.""" |
508 | 338 |
|
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
339 |
def always(fn): return True |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
340 |
def never(fn): return False |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
341 |
|
6595
99a92acafdb9
remove default arg from patkind
Matt Mackall <mpm@selenic.com>
parents:
6575
diff
changeset
|
342 |
def patkind(name, default): |
1563
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
343 |
"""Split a string into an optional pattern kind prefix and the |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
344 |
actual pattern.""" |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
345 |
for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre': |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
346 |
if name.startswith(prefix + ':'): return name.split(':', 1) |
6595
99a92acafdb9
remove default arg from patkind
Matt Mackall <mpm@selenic.com>
parents:
6575
diff
changeset
|
347 |
return default, name |
1563
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
348 |
|
1062 | 349 |
def globre(pat, head='^', tail='$'): |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
350 |
"convert a glob pattern into a regexp" |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
351 |
i, n = 0, len(pat) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
352 |
res = '' |
5949
48d01b1e315f
Permit glob patterns to use nested curly braces.
Jesse Glick <jesse.glick@sun.com>
parents:
5921
diff
changeset
|
353 |
group = 0 |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
354 |
def peek(): return i < n and pat[i] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
355 |
while i < n: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
356 |
c = pat[i] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
357 |
i = i+1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
358 |
if c == '*': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
359 |
if peek() == '*': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
360 |
i += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
361 |
res += '.*' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
362 |
else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
363 |
res += '[^/]*' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
364 |
elif c == '?': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
365 |
res += '.' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
366 |
elif c == '[': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
367 |
j = i |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
368 |
if j < n and pat[j] in '!]': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
369 |
j += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
370 |
while j < n and pat[j] != ']': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
371 |
j += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
372 |
if j >= n: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
373 |
res += '\\[' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
374 |
else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
375 |
stuff = pat[i:j].replace('\\','\\\\') |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
376 |
i = j + 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
377 |
if stuff[0] == '!': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
378 |
stuff = '^' + stuff[1:] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
379 |
elif stuff[0] == '^': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
380 |
stuff = '\\' + stuff |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
381 |
res = '%s[%s]' % (res, stuff) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
382 |
elif c == '{': |
5949
48d01b1e315f
Permit glob patterns to use nested curly braces.
Jesse Glick <jesse.glick@sun.com>
parents:
5921
diff
changeset
|
383 |
group += 1 |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
384 |
res += '(?:' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
385 |
elif c == '}' and group: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
386 |
res += ')' |
5949
48d01b1e315f
Permit glob patterns to use nested curly braces.
Jesse Glick <jesse.glick@sun.com>
parents:
5921
diff
changeset
|
387 |
group -= 1 |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
388 |
elif c == ',' and group: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
389 |
res += '|' |
1990
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
390 |
elif c == '\\': |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
391 |
p = peek() |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
392 |
if p: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
393 |
i += 1 |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
394 |
res += re.escape(p) |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
395 |
else: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
396 |
res += re.escape(c) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
397 |
else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
398 |
res += re.escape(c) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
399 |
return head + res + tail |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
400 |
|
812
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
401 |
_globchars = {'[': 1, '{': 1, '*': 1, '?': 1} |
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
402 |
|
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
403 |
def pathto(root, n1, n2): |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
404 |
'''return the relative path from one place to another. |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
405 |
root should use os.sep to separate directories |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
406 |
n1 should use os.sep to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
407 |
n2 should use "/" to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
408 |
returns an os.sep-separated path. |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
409 |
|
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
410 |
If n1 is a relative path, it's assumed it's |
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
411 |
relative to root. |
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
412 |
n2 should always be relative to root. |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
413 |
''' |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
414 |
if not n1: return localpath(n2) |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
415 |
if os.path.isabs(n1): |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
416 |
if os.path.splitdrive(root)[0] != os.path.splitdrive(n1)[0]: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
417 |
return os.path.join(root, localpath(n2)) |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
418 |
n2 = '/'.join((pconvert(root), n2)) |
5844
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
419 |
a, b = splitpath(n1), n2.split('/') |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
420 |
a.reverse() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
421 |
b.reverse() |
884
087771ebe2e6
Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents:
878
diff
changeset
|
422 |
while a and b and a[-1] == b[-1]: |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
423 |
a.pop() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
424 |
b.pop() |
884
087771ebe2e6
Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents:
878
diff
changeset
|
425 |
b.reverse() |
6111
213ea6eed412
util.pathto: return '.' instead of an empty string
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6091
diff
changeset
|
426 |
return os.sep.join((['..'] * len(a)) + b) or '.' |
884
087771ebe2e6
Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents:
878
diff
changeset
|
427 |
|
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
428 |
def canonpath(root, cwd, myname): |
1082 | 429 |
"""return the canonical path of myname, given cwd and root""" |
1566 | 430 |
if root == os.sep: |
431 |
rootsep = os.sep |
|
5843
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5802
diff
changeset
|
432 |
elif endswithsep(root): |
2271
90b122730d32
Make it possible to use the root directory as the root of a repository.
Manpreet Singh <junkblocker@yahoo.com>
parents:
2263
diff
changeset
|
433 |
rootsep = root |
1566 | 434 |
else: |
1810
7596611ab3d5
Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1635
diff
changeset
|
435 |
rootsep = root + os.sep |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
436 |
name = myname |
2090
eb40db373717
fix util.canonpath on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2085
diff
changeset
|
437 |
if not os.path.isabs(name): |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
438 |
name = os.path.join(root, cwd, name) |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
439 |
name = os.path.normpath(name) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
440 |
audit_path = path_auditor(root) |
2278
3711e23ab10a
Make hg status work for repositories in root directory on windows (issue 228)
Manpreet Singh <junkblocker@yahoo.com>
parents:
2271
diff
changeset
|
441 |
if name != rootsep and name.startswith(rootsep): |
1976
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
442 |
name = name[len(rootsep):] |
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
443 |
audit_path(name) |
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
444 |
return pconvert(name) |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
445 |
elif name == root: |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
446 |
return '' |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
447 |
else: |
2115
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
448 |
# Determine whether `name' is in the hierarchy at or beneath `root', |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
449 |
# by iterating name=dirname(name) until that causes no change (can't |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
450 |
# check name == '/', because that doesn't work on windows). For each |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
451 |
# `name', compare dev/inode numbers. If they match, the list `rel' |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
452 |
# holds the reversed list of components making up the relative file |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
453 |
# name we want. |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
454 |
root_st = os.stat(root) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
455 |
rel = [] |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
456 |
while True: |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
457 |
try: |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
458 |
name_st = os.stat(name) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
459 |
except OSError: |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
460 |
break |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
461 |
if samestat(name_st, root_st): |
4086
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
462 |
if not rel: |
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
463 |
# name was actually the same as root (maybe a symlink) |
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
464 |
return '' |
2115
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
465 |
rel.reverse() |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
466 |
name = os.path.join(*rel) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
467 |
audit_path(name) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
468 |
return pconvert(name) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
469 |
dirname, basename = os.path.split(name) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
470 |
rel.append(basename) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
471 |
if dirname == name: |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
472 |
break |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
473 |
name = dirname |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
474 |
|
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
475 |
raise Abort('%s not under root' % myname) |
897 | 476 |
|
6575
e08e0367ba15
walk: kill util.cmdmatcher and _matcher
Matt Mackall <mpm@selenic.com>
parents:
6548
diff
changeset
|
477 |
def matcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None, dflt_pat='glob'): |
1082 | 478 |
"""build a function to match a set of file patterns |
479 |
||
480 |
arguments: |
|
481 |
canonroot - the canonical root of the tree you're matching against |
|
482 |
cwd - the current working directory, if relevant |
|
483 |
names - patterns to find |
|
484 |
inc - patterns to include |
|
485 |
exc - patterns to exclude |
|
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
486 |
dflt_pat - if a pattern in names has no explicit type, assume this one |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
487 |
src - where these patterns came from (e.g. .hgignore) |
1082 | 488 |
|
489 |
a pattern is one of: |
|
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
490 |
'glob:<glob>' - a glob relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
491 |
're:<regexp>' - a regular expression |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
492 |
'path:<path>' - a path relative to canonroot |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
493 |
'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs) |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
494 |
'relpath:<path>' - a path relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
495 |
'relre:<regexp>' - a regexp that doesn't have to match the start of a name |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
496 |
'<something>' - one of the cases above, selected by the dflt_pat argument |
1082 | 497 |
|
498 |
returns: |
|
499 |
a 3-tuple containing |
|
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
500 |
- list of roots (places where one should start a recursive walk of the fs); |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
501 |
this often matches the explicit non-pattern names passed in, but also |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
502 |
includes the initial part of glob: patterns that has no glob characters |
1082 | 503 |
- a bool match(filename) function |
504 |
- a bool indicating if any patterns were passed in |
|
505 |
""" |
|
506 |
||
4198
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
507 |
# a common case: no patterns at all |
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
508 |
if not names and not inc and not exc: |
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
509 |
return [], always, False |
1082 | 510 |
|
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
511 |
def contains_glob(name): |
812
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
512 |
for c in name: |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
513 |
if c in _globchars: return True |
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
514 |
return False |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
515 |
|
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
516 |
def regex(kind, name, tail): |
742 | 517 |
'''convert a pattern into a regular expression''' |
4190
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
518 |
if not name: |
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
519 |
return '' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
520 |
if kind == 're': |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
521 |
return name |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
522 |
elif kind == 'path': |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
523 |
return '^' + re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
524 |
elif kind == 'relglob': |
4307
702f48570eb3
change relglob: patterns to be consistent with glob: patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4306
diff
changeset
|
525 |
return globre(name, '(?:|.*/)', tail) |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
526 |
elif kind == 'relpath': |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
527 |
return re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
528 |
elif kind == 'relre': |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
529 |
if name.startswith('^'): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
530 |
return name |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
531 |
return '.*' + name |
4306
6cecaec07cc9
Revert changeset ef1f1a4b2efb; add another test for glob: patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4255
diff
changeset
|
532 |
return globre(name, '', tail) |
742 | 533 |
|
534 |
def matchfn(pats, tail): |
|
535 |
"""build a matching function from a set of patterns""" |
|
1454
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
536 |
if not pats: |
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
537 |
return |
4371
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
538 |
try: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
539 |
pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats]) |
6074
59a9dc9562e2
ignore: split up huge patterns
Matt Mackall <mpm@selenic.com>
parents:
6062
diff
changeset
|
540 |
if len(pat) > 20000: |
59a9dc9562e2
ignore: split up huge patterns
Matt Mackall <mpm@selenic.com>
parents:
6062
diff
changeset
|
541 |
raise OverflowError() |
4371
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
542 |
return re.compile(pat).match |
5201
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
543 |
except OverflowError: |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
544 |
# We're using a Python with a tiny regex engine and we |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
545 |
# made it explode, so we'll divide the pattern list in two |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
546 |
# until it works |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
547 |
l = len(pats) |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
548 |
if l < 2: |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
549 |
raise |
5454
f2ca8d2c988f
explicitely use integer division
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5450
diff
changeset
|
550 |
a, b = matchfn(pats[:l//2], tail), matchfn(pats[l//2:], tail) |
5201
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
551 |
return lambda s: a(s) or b(s) |
4371
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
552 |
except re.error: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
553 |
for k, p in pats: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
554 |
try: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
555 |
re.compile('(?:%s)' % regex(k, p, tail)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
556 |
except re.error: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
557 |
if src: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
558 |
raise Abort("%s: invalid pattern (%s): %s" % |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
559 |
(src, k, p)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
560 |
else: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
561 |
raise Abort("invalid pattern (%s): %s" % (k, p)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
562 |
raise Abort("invalid pattern") |
742 | 563 |
|
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
564 |
def globprefix(pat): |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
565 |
'''return the non-glob prefix of a path, e.g. foo/* -> foo''' |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
566 |
root = [] |
4183
6f9474044736
small globprefix fix
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
567 |
for p in pat.split('/'): |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
568 |
if contains_glob(p): break |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
569 |
root.append(p) |
4187
01c4ea5e788c
A 'glob:foo?bar' pattern determines a root - the tree root
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4185
diff
changeset
|
570 |
return '/'.join(root) or '.' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
571 |
|
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
572 |
def normalizepats(names, default): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
573 |
pats = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
574 |
roots = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
575 |
anypats = False |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
576 |
for kind, name in [patkind(p, default) for p in names]: |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
577 |
if kind in ('glob', 'relpath'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
578 |
name = canonpath(canonroot, cwd, name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
579 |
elif kind in ('relglob', 'path'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
580 |
name = normpath(name) |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
581 |
|
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
582 |
pats.append((kind, name)) |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
583 |
|
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
584 |
if kind in ('glob', 're', 'relglob', 'relre'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
585 |
anypats = True |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
586 |
|
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
587 |
if kind == 'glob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
588 |
root = globprefix(name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
589 |
roots.append(root) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
590 |
elif kind in ('relpath', 'path'): |
4233
03a665f9f913
util._matcher: use "." as the root of empty {rel,}path patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4199
diff
changeset
|
591 |
roots.append(name or '.') |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
592 |
elif kind == 'relglob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
593 |
roots.append('.') |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
594 |
return roots, pats, anypats |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
595 |
|
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
596 |
roots, pats, anypats = normalizepats(names, dflt_pat) |
897 | 597 |
|
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
598 |
patmatch = matchfn(pats, '$') or always |
897 | 599 |
incmatch = always |
600 |
if inc: |
|
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
601 |
dummy, inckinds, dummy = normalizepats(inc, 'glob') |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
602 |
incmatch = matchfn(inckinds, '(?:/|$)') |
7430
f0a3e87c810d
util: use existing never() instead of custom lambda
Mads Kiilerich <mads@kiilerich.com>
parents:
7414
diff
changeset
|
603 |
excmatch = never |
897 | 604 |
if exc: |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
605 |
dummy, exckinds, dummy = normalizepats(exc, 'glob') |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
606 |
excmatch = matchfn(exckinds, '(?:/|$)') |
742 | 607 |
|
4199
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
608 |
if not names and inc and not exc: |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
609 |
# common case: hgignore patterns |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
610 |
match = incmatch |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
611 |
else: |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
612 |
match = lambda fn: incmatch(fn) and not excmatch(fn) and patmatch(fn) |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
613 |
|
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
614 |
return (roots, match, (inc or exc or anypats) and True) |
742 | 615 |
|
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
616 |
_hgexecutable = None |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
617 |
|
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
618 |
def main_is_frozen(): |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
619 |
"""return True if we are a frozen executable. |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
620 |
|
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
621 |
The code supports py2exe (most common, Windows only) and tools/freeze |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
622 |
(portable, not much used). |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
623 |
""" |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
624 |
return (hasattr(sys, "frozen") or # new py2exe |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
625 |
hasattr(sys, "importers") or # old py2exe |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
626 |
imp.is_frozen("__main__")) # tools/freeze |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
627 |
|
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
628 |
def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
629 |
"""return location of the 'hg' executable. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
630 |
|
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
631 |
Defaults to $HG or 'hg' in the search path. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
632 |
""" |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
633 |
if _hgexecutable is None: |
6500 | 634 |
hg = os.environ.get('HG') |
635 |
if hg: |
|
636 |
set_hgexecutable(hg) |
|
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
637 |
elif main_is_frozen(): |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
638 |
set_hgexecutable(sys.executable) |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
639 |
else: |
7732
3793802ea41b
Make util.find_exe alway returns existing file, fixing issue1459
Mads Kiilerich <mads@kiilerich.com>
parents:
7696
diff
changeset
|
640 |
set_hgexecutable(find_exe('hg') or 'hg') |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
641 |
return _hgexecutable |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
642 |
|
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
643 |
def set_hgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
644 |
"""set location of the 'hg' executable""" |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
645 |
global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
646 |
_hgexecutable = path |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
647 |
|
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
648 |
def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None): |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
649 |
'''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
650 |
run with environment maybe modified, maybe in different dir. |
508 | 651 |
|
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
652 |
if command fails and onerr is None, return status. if ui object, |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
653 |
print error message and return status, else raise onerr object as |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
654 |
exception.''' |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
655 |
def py2shell(val): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
656 |
'convert python object into string that is useful to shell' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
657 |
if val in (None, False): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
658 |
return '0' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
659 |
if val == True: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
660 |
return '1' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
661 |
return str(val) |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
662 |
oldenv = {} |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
663 |
for k in environ: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
664 |
oldenv[k] = os.environ.get(k) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
665 |
if cwd is not None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
666 |
oldcwd = os.getcwd() |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
667 |
origcmd = cmd |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
668 |
if os.name == 'nt': |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
669 |
cmd = '"%s"' % cmd |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
670 |
try: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
671 |
for k, v in environ.iteritems(): |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
672 |
os.environ[k] = py2shell(v) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
673 |
os.environ['HG'] = hgexecutable() |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
674 |
if cwd is not None and oldcwd != cwd: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
675 |
os.chdir(cwd) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
676 |
rc = os.system(cmd) |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
677 |
if sys.platform == 'OpenVMS' and rc & 1: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
678 |
rc = 0 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
679 |
if rc and onerr: |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
680 |
errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]), |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
681 |
explain_exit(rc)[0]) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
682 |
if errprefix: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
683 |
errmsg = '%s: %s' % (errprefix, errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
684 |
try: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
685 |
onerr.warn(errmsg + '\n') |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
686 |
except AttributeError: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
687 |
raise onerr(errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
688 |
return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
689 |
finally: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
690 |
for k, v in oldenv.iteritems(): |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
691 |
if v is None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
692 |
del os.environ[k] |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
693 |
else: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
694 |
os.environ[k] = v |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
695 |
if cwd is not None and oldcwd != cwd: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
696 |
os.chdir(oldcwd) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
697 |
|
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
698 |
def checksignature(func): |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
699 |
'''wrap a function with code to check for calling errors''' |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
700 |
def check(*args, **kwargs): |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
701 |
try: |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
702 |
return func(*args, **kwargs) |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
703 |
except TypeError: |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
704 |
if len(traceback.extract_tb(sys.exc_info()[2])) == 1: |
7646 | 705 |
raise error.SignatureError |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
706 |
raise |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
707 |
|
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
708 |
return check |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
709 |
|
4281
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
710 |
# os.path.lexists is not available on python2.3 |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
711 |
def lexists(filename): |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
712 |
"test whether a file with this name exists. does not follow symlinks" |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
713 |
try: |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
714 |
os.lstat(filename) |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
715 |
except: |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
716 |
return False |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
717 |
return True |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
718 |
|
421 | 719 |
def rename(src, dst): |
1082 | 720 |
"""forcibly rename a file""" |
421 | 721 |
try: |
722 |
os.rename(src, dst) |
|
4956
02b127749dc0
fix unused variables reported by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4948
diff
changeset
|
723 |
except OSError, err: # FIXME: check err (EEXIST ?) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
724 |
# on windows, rename to existing file is not allowed, so we |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
725 |
# must delete destination first. but if file is open, unlink |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
726 |
# schedules it for delete but does not delete it. rename |
7780
9892c4d94fb7
rename: simplify forced renaming
Matt Mackall <mpm@selenic.com>
parents:
7767
diff
changeset
|
727 |
# happens immediately even for open files, so we rename |
9892c4d94fb7
rename: simplify forced renaming
Matt Mackall <mpm@selenic.com>
parents:
7767
diff
changeset
|
728 |
# destination to a temporary name, then delete that. then |
9892c4d94fb7
rename: simplify forced renaming
Matt Mackall <mpm@selenic.com>
parents:
7767
diff
changeset
|
729 |
# rename is safe to do. |
9892c4d94fb7
rename: simplify forced renaming
Matt Mackall <mpm@selenic.com>
parents:
7767
diff
changeset
|
730 |
temp = dst + "-force-rename" |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
731 |
os.rename(dst, temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
732 |
os.unlink(temp) |
421 | 733 |
os.rename(src, dst) |
734 |
||
1415
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
735 |
def unlink(f): |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
736 |
"""unlink and remove the directory if it is empty""" |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
737 |
os.unlink(f) |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
738 |
# try removing directories that might now be empty |
2064
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
739 |
try: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
740 |
os.removedirs(os.path.dirname(f)) |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
741 |
except OSError: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
742 |
pass |
1415
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
743 |
|
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
744 |
def copyfile(src, dest): |
7767
b2410ed2cbe9
Use shutil.copystat in copyfile().
Will Maier <willmaier@ml1.net>
parents:
7732
diff
changeset
|
745 |
"copy a file, preserving mode and atime/mtime" |
4271
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
746 |
if os.path.islink(src): |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
747 |
try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
748 |
os.unlink(dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
749 |
except: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
750 |
pass |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
751 |
os.symlink(os.readlink(src), dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
752 |
else: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
753 |
try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
754 |
shutil.copyfile(src, dest) |
7767
b2410ed2cbe9
Use shutil.copystat in copyfile().
Will Maier <willmaier@ml1.net>
parents:
7732
diff
changeset
|
755 |
shutil.copystat(src, dest) |
4271
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
756 |
except shutil.Error, inst: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
757 |
raise Abort(str(inst)) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
758 |
|
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
759 |
def copyfiles(src, dst, hardlink=None): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
760 |
"""Copy a directory tree using hardlinks if possible""" |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
761 |
|
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
762 |
if hardlink is None: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
763 |
hardlink = (os.stat(src).st_dev == |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
764 |
os.stat(os.path.dirname(dst)).st_dev) |
698
df78d8ccac4c
Use python function instead of external 'cp' command when cloning repos.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
667
diff
changeset
|
765 |
|
1207 | 766 |
if os.path.isdir(src): |
767 |
os.mkdir(dst) |
|
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
768 |
for name, kind in osutil.listdir(src): |
1207 | 769 |
srcname = os.path.join(src, name) |
770 |
dstname = os.path.join(dst, name) |
|
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
771 |
copyfiles(srcname, dstname, hardlink) |
1207 | 772 |
else: |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
773 |
if hardlink: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
774 |
try: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
775 |
os_link(src, dst) |
2050
e49d0fa38176
util.copyfiles: only switch to copy if hardlink raises IOError or OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2026
diff
changeset
|
776 |
except (IOError, OSError): |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
777 |
hardlink = False |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
778 |
shutil.copy(src, dst) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
779 |
else: |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
780 |
shutil.copy(src, dst) |
698
df78d8ccac4c
Use python function instead of external 'cp' command when cloning repos.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
667
diff
changeset
|
781 |
|
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
782 |
class path_auditor(object): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
783 |
'''ensure that a filesystem path contains no banned components. |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
784 |
the following properties of a path are checked: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
785 |
|
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
786 |
- under top-level .hg |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
787 |
- starts at the root of a windows drive |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
788 |
- contains ".." |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
789 |
- traverses a symlink (e.g. a/symlink_here/b) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
790 |
- inside a nested repository''' |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
791 |
|
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
792 |
def __init__(self, root): |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
793 |
self.audited = set() |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
794 |
self.auditeddir = set() |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
795 |
self.root = root |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
796 |
|
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
797 |
def __call__(self, path): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
798 |
if path in self.audited: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
799 |
return |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
800 |
normpath = os.path.normcase(path) |
5844
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
801 |
parts = splitpath(normpath) |
7784
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
802 |
if (os.path.splitdrive(path)[0] |
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
803 |
or parts[0].lower() in ('.hg', '.hg.', '') |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
804 |
or os.pardir in parts): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
805 |
raise Abort(_("path contains illegal component: %s") % path) |
7784
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
806 |
if '.hg' in path.lower(): |
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
807 |
lparts = [p.lower() for p in parts] |
7553
71be8688f2db
audit: reject paths with .hg (issue 1450)
Matt Mackall <mpm@selenic.com>
parents:
7525
diff
changeset
|
808 |
for p in '.hg', '.hg.': |
7820
346fafc144fc
audit: be even pickier (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7784
diff
changeset
|
809 |
if p in lparts[1:]: |
7784
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
810 |
pos = lparts.index(p) |
7553
71be8688f2db
audit: reject paths with .hg (issue 1450)
Matt Mackall <mpm@selenic.com>
parents:
7525
diff
changeset
|
811 |
base = os.path.join(*parts[:pos]) |
71be8688f2db
audit: reject paths with .hg (issue 1450)
Matt Mackall <mpm@selenic.com>
parents:
7525
diff
changeset
|
812 |
raise Abort(_('path %r is inside repo %r') % (path, base)) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
813 |
def check(prefix): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
814 |
curpath = os.path.join(self.root, prefix) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
815 |
try: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
816 |
st = os.lstat(curpath) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
817 |
except OSError, err: |
5162
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
818 |
# EINVAL can be raised as invalid path syntax under win32. |
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
819 |
# They must be ignored for patterns can be checked too. |
5487
7a64931e2d76
Fix file-changed-to-dir and dir-to-file commits (issue660).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5481
diff
changeset
|
820 |
if err.errno not in (errno.ENOENT, errno.ENOTDIR, errno.EINVAL): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
821 |
raise |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
822 |
else: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
823 |
if stat.S_ISLNK(st.st_mode): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
824 |
raise Abort(_('path %r traverses symbolic link %r') % |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
825 |
(path, prefix)) |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
826 |
elif (stat.S_ISDIR(st.st_mode) and |
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
827 |
os.path.isdir(os.path.join(curpath, '.hg'))): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
828 |
raise Abort(_('path %r is inside repo %r') % |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
829 |
(path, prefix)) |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
830 |
parts.pop() |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
831 |
prefixes = [] |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
832 |
for n in range(len(parts)): |
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
833 |
prefix = os.sep.join(parts) |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
834 |
if prefix in self.auditeddir: |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
835 |
break |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
836 |
check(prefix) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
837 |
prefixes.append(prefix) |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
838 |
parts.pop() |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
839 |
|
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
840 |
self.audited.add(path) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
841 |
# only add prefixes to the cache after checking everything: we don't |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
842 |
# want to add "foo/bar/baz" before checking if there's a "foo/.hg" |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
843 |
self.auditeddir.update(prefixes) |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
844 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
845 |
if os.name == 'nt': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
846 |
from windows import * |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
847 |
else: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
848 |
from posix import * |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
849 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
850 |
def makelock(info, pathname): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
851 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
852 |
return os.symlink(info, pathname) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
853 |
except OSError, why: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
854 |
if why.errno == errno.EEXIST: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
855 |
raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
856 |
except AttributeError: # no symlink in os |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
857 |
pass |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
858 |
|
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
859 |
ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
860 |
os.write(ld, info) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
861 |
os.close(ld) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
862 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
863 |
def readlock(pathname): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
864 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
865 |
return os.readlink(pathname) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
866 |
except OSError, why: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
867 |
if why.errno not in (errno.EINVAL, errno.ENOSYS): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
868 |
raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
869 |
except AttributeError: # no symlink in os |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
870 |
pass |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
871 |
return posixfile(pathname).read() |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
872 |
|
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
873 |
def nlinks(pathname): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
874 |
"""Return number of hardlinks for the given file.""" |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2314
diff
changeset
|
875 |
return os.lstat(pathname).st_nlink |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
876 |
|
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
877 |
if hasattr(os, 'link'): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
878 |
os_link = os.link |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
879 |
else: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
880 |
def os_link(src, dst): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
881 |
raise OSError(0, _("Hardlinks not supported")) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
882 |
|
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
883 |
def fstat(fp): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
884 |
'''stat file object that may not have fileno method.''' |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
885 |
try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
886 |
return os.fstat(fp.fileno()) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
887 |
except AttributeError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
888 |
return os.stat(fp.name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
889 |
|
3784 | 890 |
# File system features |
891 |
||
6746
1dca460e7d1e
rename checkfolding to checkcase
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
892 |
def checkcase(path): |
3784 | 893 |
""" |
894 |
Check whether the given path is on a case-sensitive filesystem |
|
895 |
||
896 |
Requires a path (like /foo/.hg) ending with a foldable final |
|
897 |
directory component. |
|
898 |
""" |
|
899 |
s1 = os.stat(path) |
|
900 |
d, b = os.path.split(path) |
|
901 |
p2 = os.path.join(d, b.upper()) |
|
902 |
if path == p2: |
|
903 |
p2 = os.path.join(d, b.lower()) |
|
904 |
try: |
|
905 |
s2 = os.stat(p2) |
|
906 |
if s2 == s1: |
|
907 |
return False |
|
908 |
return True |
|
909 |
except: |
|
910 |
return True |
|
911 |
||
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
912 |
_fspathcache = {} |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
913 |
def fspath(name, root): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
914 |
'''Get name in the case stored in the filesystem |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
915 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
916 |
The name is either relative to root, or it is an absolute path starting |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
917 |
with root. Note that this function is unnecessary, and should not be |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
918 |
called, for case-sensitive filesystems (simply because it's expensive). |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
919 |
''' |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
920 |
# If name is absolute, make it relative |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
921 |
if name.lower().startswith(root.lower()): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
922 |
l = len(root) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
923 |
if name[l] == os.sep or name[l] == os.altsep: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
924 |
l = l + 1 |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
925 |
name = name[l:] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
926 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
927 |
if not os.path.exists(os.path.join(root, name)): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
928 |
return None |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
929 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
930 |
seps = os.sep |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
931 |
if os.altsep: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
932 |
seps = seps + os.altsep |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
933 |
# Protect backslashes. This gets silly very quickly. |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
934 |
seps.replace('\\','\\\\') |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
935 |
pattern = re.compile(r'([^%s]+)|([%s]+)' % (seps, seps)) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
936 |
dir = os.path.normcase(os.path.normpath(root)) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
937 |
result = [] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
938 |
for part, sep in pattern.findall(name): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
939 |
if sep: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
940 |
result.append(sep) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
941 |
continue |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
942 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
943 |
if dir not in _fspathcache: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
944 |
_fspathcache[dir] = os.listdir(dir) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
945 |
contents = _fspathcache[dir] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
946 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
947 |
lpart = part.lower() |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
948 |
for n in contents: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
949 |
if n.lower() == lpart: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
950 |
result.append(n) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
951 |
break |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
952 |
else: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
953 |
# Cannot happen, as the file exists! |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
954 |
result.append(part) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
955 |
dir = os.path.join(dir, lpart) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
956 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
957 |
return ''.join(result) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
958 |
|
3994
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
959 |
def checkexec(path): |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
960 |
""" |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
961 |
Check whether the given path is on a filesystem with UNIX-like exec flags |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
962 |
|
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
963 |
Requires a directory (like /foo/.hg) |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
964 |
""" |
5739
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
965 |
|
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
966 |
# VFAT on some Linux versions can flip mode but it doesn't persist |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
967 |
# a FS remount. Frequently we can detect it if files are created |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
968 |
# with exec bit on. |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
969 |
|
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
970 |
try: |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
971 |
EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
972 |
fh, fn = tempfile.mkstemp("", "", path) |
5739
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
973 |
try: |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
974 |
os.close(fh) |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
975 |
m = os.stat(fn).st_mode & 0777 |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
976 |
new_file_has_exec = m & EXECFLAGS |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
977 |
os.chmod(fn, m ^ EXECFLAGS) |
5759
027264e720aa
util: filter all st_mode with 0777 in checkexec
Patrick Mezard <pmezard@gmail.com>
parents:
5743
diff
changeset
|
978 |
exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m) |
5739
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
979 |
finally: |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
980 |
os.unlink(fn) |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
981 |
except (IOError, OSError): |
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
982 |
# we don't care, the user probably won't be able to commit anyway |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
983 |
return False |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
984 |
return not (new_file_has_exec or exec_flags_cannot_flip) |
3994
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
985 |
|
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
4000
diff
changeset
|
986 |
def checklink(path): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
987 |
"""check whether the given path is on a symlink-capable filesystem""" |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
988 |
# mktemp is not racy because symlink creation will fail if the |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
989 |
# file already exists |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
990 |
name = tempfile.mktemp(dir=path) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
991 |
try: |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
992 |
os.symlink(".", name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
993 |
os.unlink(name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
994 |
return True |
4017
ea6174c96ae1
catch AttributeError in util.checklink
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4002
diff
changeset
|
995 |
except (OSError, AttributeError): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
996 |
return False |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
997 |
|
4434
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
998 |
def needbinarypatch(): |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
999 |
"""return True if patches should be applied in binary mode by default.""" |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
1000 |
return os.name == 'nt' |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
1001 |
|
5843
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5802
diff
changeset
|
1002 |
def endswithsep(path): |
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5802
diff
changeset
|
1003 |
'''Check path ends with os.sep or os.altsep.''' |
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5802
diff
changeset
|
1004 |
return path.endswith(os.sep) or os.altsep and path.endswith(os.altsep) |
83c354c4d529
Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5802
diff
changeset
|
1005 |
|
5844
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1006 |
def splitpath(path): |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1007 |
'''Split path by os.sep. |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1008 |
Note that this function does not use os.altsep because this is |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1009 |
an alternative of simple "xxx.split(os.sep)". |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1010 |
It is recommended to use os.path.normpath() before using this |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1011 |
function if need.''' |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1012 |
return path.split(os.sep) |
07d8eb78dd68
Add util.splitpath() and use it instead of using os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5843
diff
changeset
|
1013 |
|
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
1014 |
def gui(): |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
1015 |
'''Are we running in a GUI?''' |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
1016 |
return os.name == "nt" or os.name == "mac" or os.environ.get("DISPLAY") |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
1017 |
|
6132
1ee95f7df611
util: always define a dummy lookup_reg()
Patrick Mezard <pmezard@gmail.com>
parents:
6111
diff
changeset
|
1018 |
def lookup_reg(key, name=None, scope=None): |
1ee95f7df611
util: always define a dummy lookup_reg()
Patrick Mezard <pmezard@gmail.com>
parents:
6111
diff
changeset
|
1019 |
return None |
1ee95f7df611
util: always define a dummy lookup_reg()
Patrick Mezard <pmezard@gmail.com>
parents:
6111
diff
changeset
|
1020 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1021 |
def mktempcopy(name, emptyok=False, createmode=None): |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1022 |
"""Create a temporary file with the same contents from name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1023 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1024 |
The permission bits are copied from the original file. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1025 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1026 |
If the temporary file is going to be truncated immediately, you |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1027 |
can use emptyok=True as an optimization. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1028 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1029 |
Returns the name of the temporary file. |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1030 |
""" |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1031 |
d, fn = os.path.split(name) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1032 |
fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1033 |
os.close(fd) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1034 |
# Temporary files are created with mode 0600, which is usually not |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1035 |
# what we want. If the original file already exists, just copy |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1036 |
# its mode. Otherwise, manually obey umask. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1037 |
try: |
5740
9046a4f6a07c
atomictempfile: avoid chmod weirdness on Linux vfat
Matt Mackall <mpm@selenic.com>
parents:
5739
diff
changeset
|
1038 |
st_mode = os.lstat(name).st_mode & 0777 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1039 |
except OSError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1040 |
if inst.errno != errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1041 |
raise |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1042 |
st_mode = createmode |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1043 |
if st_mode is None: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
1044 |
st_mode = ~umask |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1045 |
st_mode &= 0666 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1046 |
os.chmod(temp, st_mode) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1047 |
if emptyok: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1048 |
return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1049 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1050 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1051 |
ifp = posixfile(name, "rb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1052 |
except IOError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1053 |
if inst.errno == errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1054 |
return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1055 |
if not getattr(inst, 'filename', None): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1056 |
inst.filename = name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1057 |
raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1058 |
ofp = posixfile(temp, "wb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1059 |
for chunk in filechunkiter(ifp): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1060 |
ofp.write(chunk) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1061 |
ifp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1062 |
ofp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1063 |
except: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1064 |
try: os.unlink(temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1065 |
except: pass |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1066 |
raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1067 |
return temp |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1068 |
|
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1069 |
class atomictempfile(posixfile): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1070 |
"""file-like object that atomically updates a file |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1071 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1072 |
All writes will be redirected to a temporary copy of the original |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1073 |
file. When rename is called, the copy is renamed to the original |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1074 |
name, making the changes visible. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1075 |
""" |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1076 |
def __init__(self, name, mode, createmode): |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1077 |
self.__name = name |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1078 |
self.temp = mktempcopy(name, emptyok=('w' in mode), |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1079 |
createmode=createmode) |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1080 |
posixfile.__init__(self, self.temp, mode) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1081 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1082 |
def rename(self): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1083 |
if not self.closed: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1084 |
posixfile.close(self) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1085 |
rename(self.temp, localpath(self.__name)) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1086 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1087 |
def __del__(self): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1088 |
if not self.closed: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1089 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1090 |
os.unlink(self.temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1091 |
except: pass |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1092 |
posixfile.close(self) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1093 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1094 |
def makedirs(name, mode=None): |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1095 |
"""recursive directory creation with parent mode inheritance""" |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1096 |
try: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1097 |
os.mkdir(name) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1098 |
if mode is not None: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1099 |
os.chmod(name, mode) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1100 |
return |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1101 |
except OSError, err: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1102 |
if err.errno == errno.EEXIST: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1103 |
return |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1104 |
if err.errno != errno.ENOENT: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1105 |
raise |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1106 |
parent = os.path.abspath(os.path.dirname(name)) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1107 |
makedirs(parent, mode) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1108 |
makedirs(name, mode) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1109 |
|
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1110 |
class opener(object): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1111 |
"""Open files relative to a base directory |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1112 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1113 |
This class is used to hide the details of COW semantics and |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1114 |
remote file access from higher level code. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1115 |
""" |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1116 |
def __init__(self, base, audit=True): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1117 |
self.base = base |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1118 |
if audit: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1119 |
self.audit_path = path_auditor(base) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1120 |
else: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1121 |
self.audit_path = always |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1122 |
self.createmode = None |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1123 |
|
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1124 |
def __getattr__(self, name): |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1125 |
if name == '_can_symlink': |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1126 |
self._can_symlink = checklink(self.base) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1127 |
return self._can_symlink |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1128 |
raise AttributeError(name) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1129 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1130 |
def _fixfilemode(self, name): |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1131 |
if self.createmode is None: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1132 |
return |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1133 |
os.chmod(name, self.createmode & 0666) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1134 |
|
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1135 |
def __call__(self, path, mode="r", text=False, atomictemp=False): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1136 |
self.audit_path(path) |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1137 |
f = os.path.join(self.base, path) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1138 |
|
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1139 |
if not text and "b" not in mode: |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1140 |
mode += "b" # for that other OS |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1141 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1142 |
nlink = -1 |
6835
08d9e0f974d9
make mq and tags hardlink safe
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6339
diff
changeset
|
1143 |
if mode not in ("r", "rb"): |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1144 |
try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1145 |
nlink = nlinks(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1146 |
except OSError: |
4328
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1147 |
nlink = 0 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1148 |
d = os.path.dirname(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1149 |
if not os.path.isdir(d): |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1150 |
makedirs(d, self.createmode) |
4508
0026ccc2bf23
Remove atomicfile class.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4488
diff
changeset
|
1151 |
if atomictemp: |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1152 |
return atomictempfile(f, mode, self.createmode) |
4328
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1153 |
if nlink > 1: |
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1154 |
rename(mktempcopy(f), f) |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1155 |
fp = posixfile(f, mode) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1156 |
if nlink == 0: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1157 |
self._fixfilemode(f) |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1158 |
return fp |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1159 |
|
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1160 |
def symlink(self, src, dst): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1161 |
self.audit_path(dst) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1162 |
linkname = os.path.join(self.base, dst) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1163 |
try: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1164 |
os.unlink(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1165 |
except OSError: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1166 |
pass |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1167 |
|
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1168 |
dirname = os.path.dirname(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1169 |
if not os.path.exists(dirname): |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1170 |
makedirs(dirname, self.createmode) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1171 |
|
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1172 |
if self._can_symlink: |
4948
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1173 |
try: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1174 |
os.symlink(src, linkname) |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1175 |
except OSError, err: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1176 |
raise OSError(err.errno, _('could not symlink to %r: %s') % |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1177 |
(src, err.strerror), linkname) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1178 |
else: |
5077
84b10dc3dccc
Fix issue 653: symlinks checkout failure on non-supporting platforms
Patrick Mezard <pmezard@gmail.com>
parents:
5062
diff
changeset
|
1179 |
f = self(dst, "w") |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1180 |
f.write(src) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1181 |
f.close() |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
1182 |
self._fixfilemode(dst) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1183 |
|
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1184 |
class chunkbuffer(object): |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1185 |
"""Allow arbitrary sized chunks of data to be efficiently read from an |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1186 |
iterator over chunks of arbitrary size.""" |
1200 | 1187 |
|
5446
fa836e050c50
chunkbuffer: removed unused method and arg
Matt Mackall <mpm@selenic.com>
parents:
5420
diff
changeset
|
1188 |
def __init__(self, in_iter): |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1189 |
"""in_iter is the iterator that's iterating over the input chunks. |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1190 |
targetsize is how big a buffer to try to maintain.""" |
5447
56591846f819
chunkiter: simplify iter logic
Matt Mackall <mpm@selenic.com>
parents:
5446
diff
changeset
|
1191 |
self.iter = iter(in_iter) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1192 |
self.buf = '' |
5446
fa836e050c50
chunkbuffer: removed unused method and arg
Matt Mackall <mpm@selenic.com>
parents:
5420
diff
changeset
|
1193 |
self.targetsize = 2**16 |
1200 | 1194 |
|
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1195 |
def read(self, l): |
1200 | 1196 |
"""Read L bytes of data from the iterator of chunks of data. |
1308
2073e5a71008
Cleanup of tabs and trailing spaces.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1285
diff
changeset
|
1197 |
Returns less than L bytes if the iterator runs dry.""" |
5447
56591846f819
chunkiter: simplify iter logic
Matt Mackall <mpm@selenic.com>
parents:
5446
diff
changeset
|
1198 |
if l > len(self.buf) and self.iter: |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1199 |
# Clamp to a multiple of self.targetsize |
5449
17a4b20eda7b
chunkiter: handle large reads more efficiently
Matt Mackall <mpm@selenic.com>
parents:
5447
diff
changeset
|
1200 |
targetsize = max(l, self.targetsize) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1201 |
collector = cStringIO.StringIO() |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1202 |
collector.write(self.buf) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1203 |
collected = len(self.buf) |
5447
56591846f819
chunkiter: simplify iter logic
Matt Mackall <mpm@selenic.com>
parents:
5446
diff
changeset
|
1204 |
for chunk in self.iter: |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1205 |
collector.write(chunk) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1206 |
collected += len(chunk) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1207 |
if collected >= targetsize: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1208 |
break |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1209 |
if collected < targetsize: |
5447
56591846f819
chunkiter: simplify iter logic
Matt Mackall <mpm@selenic.com>
parents:
5446
diff
changeset
|
1210 |
self.iter = False |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1211 |
self.buf = collector.getvalue() |
5449
17a4b20eda7b
chunkiter: handle large reads more efficiently
Matt Mackall <mpm@selenic.com>
parents:
5447
diff
changeset
|
1212 |
if len(self.buf) == l: |
5450
c728424d44c6
revlog: fix caching of buffer objects
Matt Mackall <mpm@selenic.com>
parents:
5449
diff
changeset
|
1213 |
s, self.buf = str(self.buf), '' |
5449
17a4b20eda7b
chunkiter: handle large reads more efficiently
Matt Mackall <mpm@selenic.com>
parents:
5447
diff
changeset
|
1214 |
else: |
17a4b20eda7b
chunkiter: handle large reads more efficiently
Matt Mackall <mpm@selenic.com>
parents:
5447
diff
changeset
|
1215 |
s, self.buf = self.buf[:l], buffer(self.buf, l) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1216 |
return s |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1217 |
|
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1218 |
def filechunkiter(f, size=65536, limit=None): |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1219 |
"""Create a generator that produces the data in the file size |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1220 |
(default 65536) bytes at a time, up to optional limit (default is |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1221 |
to read all data). Chunks may be less than size bytes if the |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1222 |
chunk is the last chunk in the file, or the file is a socket or |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1223 |
some other type of file that sometimes reads less data than is |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1224 |
requested.""" |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1225 |
assert size >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1226 |
assert limit is None or limit >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1227 |
while True: |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1228 |
if limit is None: nbytes = size |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1229 |
else: nbytes = min(limit, size) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1230 |
s = nbytes and f.read(nbytes) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1231 |
if not s: break |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1232 |
if limit: limit -= len(s) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1233 |
yield s |
1320
5f277e73778f
Fix up representation of dates in hgweb.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1312
diff
changeset
|
1234 |
|
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1235 |
def makedate(): |
1482
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1236 |
lt = time.localtime() |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1237 |
if lt[8] == 1 and time.daylight: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1238 |
tz = time.altzone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1239 |
else: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1240 |
tz = time.timezone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1241 |
return time.mktime(lt), tz |
1329
8f06817bf266
Allow files to be opened in text mode, even on Windows.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1321
diff
changeset
|
1242 |
|
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1243 |
def datestr(date=None, format='%a %b %d %H:%M:%S %Y %1%2'): |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1244 |
"""represent a (unixtime, offset) tuple as a localized time. |
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1245 |
unixtime is seconds since the epoch, and offset is the time zone's |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1246 |
number of seconds away from UTC. if timezone is false, do not |
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1247 |
append time zone to string.""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1248 |
t, tz = date or makedate() |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1249 |
if "%1" in format or "%2" in format: |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1250 |
sign = (tz > 0) and "-" or "+" |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1251 |
minutes = abs(tz) / 60 |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1252 |
format = format.replace("%1", "%c%02d" % (sign, minutes / 60)) |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1253 |
format = format.replace("%2", "%02d" % (minutes % 60)) |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1254 |
s = time.strftime(format, time.gmtime(float(t) - tz)) |
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1255 |
return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1256 |
|
6134
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
1257 |
def shortdate(date=None): |
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
1258 |
"""turn (timestamp, tzoff) tuple into iso 8631 date.""" |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1259 |
return datestr(date, format='%Y-%m-%d') |
6134
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
1260 |
|
5357
c6adf2be6069
util: add default argument to strdate
Bryan O'Sullivan <bos@serpentine.com>
parents:
5293
diff
changeset
|
1261 |
def strdate(string, format, defaults=[]): |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1262 |
"""parse a localized time string and return a (unixtime, offset) tuple. |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1263 |
if the string cannot be parsed, ValueError is raised.""" |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1264 |
def timezone(string): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1265 |
tz = string.split()[-1] |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1266 |
if tz[0] in "+-" and len(tz) == 5 and tz[1:].isdigit(): |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1267 |
sign = (tz[0] == "+") and 1 or -1 |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1268 |
hours = int(tz[1:3]) |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1269 |
minutes = int(tz[3:5]) |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1270 |
return -sign * (hours * 60 + minutes) * 60 |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1271 |
if tz == "GMT" or tz == "UTC": |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1272 |
return 0 |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1273 |
return None |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1274 |
|
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1275 |
# NOTE: unixtime = localunixtime + offset |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1276 |
offset, date = timezone(string), string |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1277 |
if offset != None: |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1278 |
date = " ".join(string.split()[:-1]) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1279 |
|
3812 | 1280 |
# add missing elements from defaults |
1281 |
for part in defaults: |
|
1282 |
found = [True for p in part if ("%"+p) in format] |
|
1283 |
if not found: |
|
1284 |
date += "@" + defaults[part] |
|
1285 |
format += "@%" + part[0] |
|
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1286 |
|
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1287 |
timetuple = time.strptime(date, format) |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1288 |
localunixtime = int(calendar.timegm(timetuple)) |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1289 |
if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1290 |
# local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1291 |
unixtime = int(time.mktime(timetuple)) |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1292 |
offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1293 |
else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1294 |
unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1295 |
return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1296 |
|
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1297 |
def parsedate(date, formats=None, defaults=None): |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1298 |
"""parse a localized date/time string and return a (unixtime, offset) tuple. |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1299 |
|
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1300 |
The date may be a "unixtime offset" string or in one of the specified |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1301 |
formats. If the date already is a (unixtime, offset) tuple, it is returned. |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1302 |
""" |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1303 |
if not date: |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1304 |
return 0, 0 |
6230
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
1305 |
if isinstance(date, tuple) and len(date) == 2: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1306 |
return date |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1307 |
if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1308 |
formats = defaultdateformats |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1309 |
date = date.strip() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1310 |
try: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1311 |
when, offset = map(int, date.split(' ')) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1312 |
except ValueError: |
3812 | 1313 |
# fill out defaults |
1314 |
if not defaults: |
|
1315 |
defaults = {} |
|
1316 |
now = makedate() |
|
1317 |
for part in "d mb yY HI M S".split(): |
|
1318 |
if part not in defaults: |
|
1319 |
if part[0] in "HMS": |
|
1320 |
defaults[part] = "00" |
|
1321 |
else: |
|
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1322 |
defaults[part] = datestr(now, "%" + part[0]) |
3812 | 1323 |
|
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1324 |
for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1325 |
try: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1326 |
when, offset = strdate(date, format, defaults) |
6087
12856a1742dc
better handle errors with date parsing (issue983)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5917
diff
changeset
|
1327 |
except (ValueError, OverflowError): |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1328 |
pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1329 |
else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1330 |
break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1331 |
else: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1332 |
raise Abort(_('invalid date: %r ') % date) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1333 |
# validate explicit (probably user-specified) date and |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1334 |
# time zone offset. values must fit in signed 32 bits for |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1335 |
# current 32-bit linux runtimes. timezones go from UTC-12 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1336 |
# to UTC+14 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1337 |
if abs(when) > 0x7fffffff: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1338 |
raise Abort(_('date exceeds 32 bits: %d') % when) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1339 |
if offset < -50400 or offset > 43200: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1340 |
raise Abort(_('impossible time zone offset: %d') % offset) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1341 |
return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1342 |
|
3812 | 1343 |
def matchdate(date): |
1344 |
"""Return a function that matches a given date match specifier |
|
1345 |
||
1346 |
Formats include: |
|
1347 |
||
1348 |
'{date}' match a given date to the accuracy provided |
|
1349 |
||
1350 |
'<{date}' on or before a given date |
|
1351 |
||
1352 |
'>{date}' on or after a given date |
|
1353 |
||
1354 |
""" |
|
1355 |
||
1356 |
def lower(date): |
|
6230
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
1357 |
d = dict(mb="1", d="1") |
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
1358 |
return parsedate(date, extendeddateformats, d)[0] |
3812 | 1359 |
|
1360 |
def upper(date): |
|
1361 |
d = dict(mb="12", HI="23", M="59", S="59") |
|
1362 |
for days in "31 30 29".split(): |
|
1363 |
try: |
|
1364 |
d["d"] = days |
|
1365 |
return parsedate(date, extendeddateformats, d)[0] |
|
1366 |
except: |
|
1367 |
pass |
|
1368 |
d["d"] = "28" |
|
1369 |
return parsedate(date, extendeddateformats, d)[0] |
|
1370 |
||
1371 |
if date[0] == "<": |
|
1372 |
when = upper(date[1:]) |
|
1373 |
return lambda x: x <= when |
|
1374 |
elif date[0] == ">": |
|
1375 |
when = lower(date[1:]) |
|
1376 |
return lambda x: x >= when |
|
1377 |
elif date[0] == "-": |
|
1378 |
try: |
|
1379 |
days = int(date[1:]) |
|
1380 |
except ValueError: |
|
1381 |
raise Abort(_("invalid day spec: %s") % date[1:]) |
|
1382 |
when = makedate()[0] - days * 3600 * 24 |
|
3813 | 1383 |
return lambda x: x >= when |
3812 | 1384 |
elif " to " in date: |
1385 |
a, b = date.split(" to ") |
|
1386 |
start, stop = lower(a), upper(b) |
|
1387 |
return lambda x: x >= start and x <= stop |
|
1388 |
else: |
|
1389 |
start, stop = lower(date), upper(date) |
|
1390 |
return lambda x: x >= start and x <= stop |
|
1391 |
||
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1392 |
def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1393 |
"""Return a short representation of a user name or email address.""" |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1394 |
f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1395 |
if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1396 |
user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1397 |
f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1398 |
if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1399 |
user = user[f+1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1400 |
f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1401 |
if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1402 |
user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1403 |
f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1404 |
if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1405 |
user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1406 |
return user |
1920 | 1407 |
|
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1408 |
def email(author): |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1409 |
'''get email of author.''' |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1410 |
r = author.find('>') |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1411 |
if r == -1: r = None |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1412 |
return author[author.find('<')+1:r] |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1413 |
|
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1414 |
def ellipsis(text, maxlength=400): |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1415 |
"""Trim string to at most maxlength (default: 400) characters.""" |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1416 |
if len(text) <= maxlength: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1417 |
return text |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1418 |
else: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1419 |
return "%s..." % (text[:maxlength-3]) |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1420 |
|
7523
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1421 |
def walkrepos(path, followsym=False, seen_dirs=None, recurse=False): |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1422 |
'''yield every hg repository under path, recursively.''' |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1423 |
def errhandler(err): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1424 |
if err.filename == path: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1425 |
raise err |
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1426 |
if followsym and hasattr(os.path, 'samestat'): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1427 |
def _add_dir_if_not_there(dirlst, dirname): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1428 |
match = False |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1429 |
samestat = os.path.samestat |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1430 |
dirstat = os.stat(dirname) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1431 |
for lstdirstat in dirlst: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1432 |
if samestat(dirstat, lstdirstat): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1433 |
match = True |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1434 |
break |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1435 |
if not match: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1436 |
dirlst.append(dirstat) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1437 |
return not match |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1438 |
else: |
6317
b0d937869417
hgwebdir: Tiny fix for webdir on non-symlink capable platforms.
Eric Hopper <hopper@omnifarious.org>
parents:
6284
diff
changeset
|
1439 |
followsym = False |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1440 |
|
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1441 |
if (seen_dirs is None) and followsym: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1442 |
seen_dirs = [] |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1443 |
_add_dir_if_not_there(seen_dirs, path) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1444 |
for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler): |
6140
47e6d5d5913a
Simplify utils.walkrepos().
Walter Doerwald <walter@livinglogic.de>
parents:
6139
diff
changeset
|
1445 |
if '.hg' in dirs: |
47e6d5d5913a
Simplify utils.walkrepos().
Walter Doerwald <walter@livinglogic.de>
parents:
6139
diff
changeset
|
1446 |
yield root # found a repository |
7525
6a49fa7674c1
hgweb: mq repos should be in non-recursive collections, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7523
diff
changeset
|
1447 |
qroot = os.path.join(root, '.hg', 'patches') |
6a49fa7674c1
hgweb: mq repos should be in non-recursive collections, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7523
diff
changeset
|
1448 |
if os.path.isdir(os.path.join(qroot, '.hg')): |
6a49fa7674c1
hgweb: mq repos should be in non-recursive collections, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7523
diff
changeset
|
1449 |
yield qroot # we have a patch queue repo here |
7523
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1450 |
if recurse: |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1451 |
# avoid recursing inside the .hg directory |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1452 |
dirs.remove('.hg') |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1453 |
else: |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1454 |
dirs[:] = [] # don't descend further |
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1455 |
elif followsym: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1456 |
newdirs = [] |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1457 |
for d in dirs: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1458 |
fname = os.path.join(root, d) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1459 |
if _add_dir_if_not_there(seen_dirs, fname): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1460 |
if os.path.islink(fname): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1461 |
for hgname in walkrepos(fname, True, seen_dirs): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1462 |
yield hgname |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1463 |
else: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1464 |
newdirs.append(d) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1465 |
dirs[:] = newdirs |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1466 |
|
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1467 |
_rcpath = None |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1468 |
|
4097
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1469 |
def os_rcpath(): |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1470 |
'''return default os-specific hgrc search path''' |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1471 |
path = system_rcpath() |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1472 |
path.extend(user_rcpath()) |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1473 |
path = [os.path.normpath(f) for f in path] |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1474 |
return path |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1475 |
|
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1476 |
def rcpath(): |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1477 |
'''return hgrc search path. if env var HGRCPATH is set, use it. |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1478 |
for each item in path, if directory, use files ending in .rc, |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1479 |
else use item. |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1480 |
make HGRCPATH empty to only look in .hg/hgrc of current repo. |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1481 |
if no HGRCPATH, use default os-specific path.''' |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1482 |
global _rcpath |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1483 |
if _rcpath is None: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1484 |
if 'HGRCPATH' in os.environ: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1485 |
_rcpath = [] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1486 |
for p in os.environ['HGRCPATH'].split(os.pathsep): |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1487 |
if not p: continue |
1956
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1488 |
if os.path.isdir(p): |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
1489 |
for f, kind in osutil.listdir(p): |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1490 |
if f.endswith('.rc'): |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1491 |
_rcpath.append(os.path.join(p, f)) |
1956
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1492 |
else: |
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1493 |
_rcpath.append(p) |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1494 |
else: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1495 |
_rcpath = os_rcpath() |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1496 |
return _rcpath |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1497 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1498 |
def bytecount(nbytes): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1499 |
'''return byte count formatted as readable string, with units''' |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1500 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1501 |
units = ( |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1502 |
(100, 1<<30, _('%.0f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1503 |
(10, 1<<30, _('%.1f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1504 |
(1, 1<<30, _('%.2f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1505 |
(100, 1<<20, _('%.0f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1506 |
(10, 1<<20, _('%.1f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1507 |
(1, 1<<20, _('%.2f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1508 |
(100, 1<<10, _('%.0f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1509 |
(10, 1<<10, _('%.1f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1510 |
(1, 1<<10, _('%.2f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1511 |
(1, 1, _('%.0f bytes')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1512 |
) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1513 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1514 |
for multiplier, divisor, format in units: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1515 |
if nbytes >= divisor * multiplier: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1516 |
return format % (nbytes / float(divisor)) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1517 |
return units[-1][2] % nbytes |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1518 |
|
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1519 |
def drop_scheme(scheme, path): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1520 |
sc = scheme + ':' |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1521 |
if path.startswith(sc): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1522 |
path = path[len(sc):] |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1523 |
if path.startswith('//'): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1524 |
path = path[2:] |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1525 |
return path |
5291
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1526 |
|
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1527 |
def uirepr(s): |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1528 |
# Avoid double backslash in Windows path repr() |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1529 |
return repr(s).replace('\\\\', '\\') |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1530 |
|
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1531 |
def termwidth(): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1532 |
if 'COLUMNS' in os.environ: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1533 |
try: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1534 |
return int(os.environ['COLUMNS']) |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1535 |
except ValueError: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1536 |
pass |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1537 |
try: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1538 |
import termios, array, fcntl |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1539 |
for dev in (sys.stdout, sys.stdin): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1540 |
try: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1541 |
fd = dev.fileno() |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1542 |
if not os.isatty(fd): |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1543 |
continue |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1544 |
arri = fcntl.ioctl(fd, termios.TIOCGWINSZ, '\0' * 8) |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1545 |
return array.array('h', arri)[1] |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1546 |
except ValueError: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1547 |
pass |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1548 |
except ImportError: |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1549 |
pass |
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1550 |
return 80 |
7879
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1551 |
|
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1552 |
def iterlines(iterator): |
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1553 |
for chunk in iterator: |
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1554 |
for line in chunk.splitlines(): |
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1555 |
yield line |