author | Matt Mackall <mpm@selenic.com> |
Sat, 05 Mar 2011 16:34:59 -0600 | |
changeset 13536 | fac040b7e822 |
parent 13439 | d724a69309e0 |
child 13734 | 16118b4859a1 |
permissions | -rw-r--r-- |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
1 |
# util.py - Mercurial utility functions and platform specfic implementations |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 |
# |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 |
# Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 |
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 |
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 |
# |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 |
# This software may be used and distributed according to the terms of the |
10263 | 8 |
# GNU General Public License version 2 or any later version. |
1082 | 9 |
|
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
10 |
"""Mercurial utility functions and platform specfic implementations. |
1082 | 11 |
|
8227
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
12 |
This contains helper routines that are independent of the SCM core and |
0a9542703300
turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents:
8226
diff
changeset
|
13 |
hide platform-specific details from the core. |
1082 | 14 |
""" |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
15 |
|
3891 | 16 |
from i18n import _ |
9480
44758742ad2e
util: do not corrupt multi-byte characters in wrap
Martin Geisler <mg@lazybytes.net>
parents:
9383
diff
changeset
|
17 |
import error, osutil, encoding |
11758
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
18 |
import errno, re, shutil, sys, tempfile, traceback |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
19 |
import os, stat, time, calendar, textwrap, unicodedata, signal |
12076
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
20 |
import imp, socket |
3769 | 21 |
|
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
22 |
# Python compatibility |
3769 | 23 |
|
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
24 |
def sha1(s): |
8297
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
25 |
return _fastsha1(s) |
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
26 |
|
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
27 |
def _fastsha1(s): |
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
28 |
# This function will import sha1 from hashlib or sha (whichever is |
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
29 |
# available) and overwrite itself with it on the first call. |
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
30 |
# Subsequent calls will go directly to the imported function. |
12051
ff5cec76b1c5
util: avoid using hashlib on Python < 2.5 (issue2278)
Sol Jerome <sol.jerome@gmail.com>
parents:
11758
diff
changeset
|
31 |
if sys.version_info >= (2, 5): |
8297
7f27e69dd27f
util: stop overwriting sha1, overwrite _fastsha1 instead
Martin Geisler <mg@lazybytes.net>
parents:
8296
diff
changeset
|
32 |
from hashlib import sha1 as _sha1 |
12051
ff5cec76b1c5
util: avoid using hashlib on Python < 2.5 (issue2278)
Sol Jerome <sol.jerome@gmail.com>
parents:
11758
diff
changeset
|
33 |
else: |
8295
1ea7e7d90007
util: remove warnings when importing md5 and sha
Sune Foldager <cryo@cyanite.org>
parents:
8281
diff
changeset
|
34 |
from sha import sha as _sha1 |
8309
4ff63d699256
util: overwrite sha1 and _fastsha1
Simon Heimberg <simohe@besonet.ch>
parents:
8302
diff
changeset
|
35 |
global _fastsha1, sha1 |
4ff63d699256
util: overwrite sha1 and _fastsha1
Simon Heimberg <simohe@besonet.ch>
parents:
8302
diff
changeset
|
36 |
_fastsha1 = sha1 = _sha1 |
6470
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
37 |
return _sha1(s) |
ac0bcd951c2c
python 2.6 compatibility: compatibility wrappers for hash functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6339
diff
changeset
|
38 |
|
10756
cb681cc59a8d
util: fake the builtin buffer if it's missing (jython)
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10487
diff
changeset
|
39 |
import __builtin__ |
cb681cc59a8d
util: fake the builtin buffer if it's missing (jython)
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10487
diff
changeset
|
40 |
|
11566
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
41 |
if sys.version_info[0] < 3: |
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
42 |
def fakebuffer(sliceable, offset=0): |
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
43 |
return sliceable[offset:] |
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
44 |
else: |
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
45 |
def fakebuffer(sliceable, offset=0): |
4d11fde55cc5
util: use fakebuffer as buffer in py3k
Renato Cunha <renatoc@gmail.com>
parents:
11565
diff
changeset
|
46 |
return memoryview(sliceable)[offset:] |
11565
7546d4a272c8
util: improved the check for the existence of the 'buffer' builtin
Renato Cunha <renatoc@gmail.com>
parents:
11469
diff
changeset
|
47 |
try: |
7546d4a272c8
util: improved the check for the existence of the 'buffer' builtin
Renato Cunha <renatoc@gmail.com>
parents:
11469
diff
changeset
|
48 |
buffer |
7546d4a272c8
util: improved the check for the existence of the 'buffer' builtin
Renato Cunha <renatoc@gmail.com>
parents:
11469
diff
changeset
|
49 |
except NameError: |
10756
cb681cc59a8d
util: fake the builtin buffer if it's missing (jython)
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10487
diff
changeset
|
50 |
__builtin__.buffer = fakebuffer |
cb681cc59a8d
util: fake the builtin buffer if it's missing (jython)
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
10487
diff
changeset
|
51 |
|
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
52 |
import subprocess |
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
53 |
closefds = os.name == 'posix' |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
54 |
|
10199
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
55 |
def popen2(cmd, env=None, newlines=False): |
9089
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
56 |
# Setting bufsize to -1 lets the system decide the buffer size. |
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
57 |
# The default for bufsize is 0, meaning unbuffered. This leads to |
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
58 |
# poor performance on Mac OS X: http://bugs.python.org/issue4194 |
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
59 |
p = subprocess.Popen(cmd, shell=True, bufsize=-1, |
9083
ec171737aaf1
Backed out changeset fce065538bcf: it caused a 5x performance regression on OS X
Bryan O'Sullivan <bos@serpentine.com>
parents:
8340
diff
changeset
|
60 |
close_fds=closefds, |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
61 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
10199
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
62 |
universal_newlines=newlines, |
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
63 |
env=env) |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
64 |
return p.stdin, p.stdout |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
65 |
|
10199
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
66 |
def popen3(cmd, env=None, newlines=False): |
9089
8ec39725d966
util: remove unused bufsize argument
Martin Geisler <mg@lazybytes.net>
parents:
9084
diff
changeset
|
67 |
p = subprocess.Popen(cmd, shell=True, bufsize=-1, |
9083
ec171737aaf1
Backed out changeset fce065538bcf: it caused a 5x performance regression on OS X
Bryan O'Sullivan <bos@serpentine.com>
parents:
8340
diff
changeset
|
68 |
close_fds=closefds, |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
69 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
10197
29e3c4a7699b
subrepo: normalize svn output line-endings
Patrick Mezard <pmezard@gmail.com>
parents:
9996
diff
changeset
|
70 |
stderr=subprocess.PIPE, |
10199
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
71 |
universal_newlines=newlines, |
c2e2a5e6c36b
subrepo: force en_US.UTF-8 locale when calling svn
Patrick Mezard <pmezard@gmail.com>
parents:
10197
diff
changeset
|
72 |
env=env) |
8280
0b02d98d44d0
util: always use subprocess
Martin Geisler <mg@lazybytes.net>
parents:
8257
diff
changeset
|
73 |
return p.stdin, p.stdout, p.stderr |
7106
4674706b5b95
python2.6: use subprocess if available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6884
diff
changeset
|
74 |
|
7632 | 75 |
def version(): |
76 |
"""Return version information if available.""" |
|
77 |
try: |
|
78 |
import __version__ |
|
79 |
return __version__.version |
|
80 |
except ImportError: |
|
81 |
return 'unknown' |
|
82 |
||
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
83 |
# used by parsedate |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
84 |
defaultdateformats = ( |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
85 |
'%Y-%m-%d %H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
86 |
'%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
|
87 |
'%Y-%m-%d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
88 |
'%Y-%m-%d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
89 |
'%Y-%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
90 |
'%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
91 |
'%m/%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
92 |
'%m/%d/%y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
93 |
'%m/%d/%Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
94 |
'%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
|
95 |
'%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
|
96 |
'%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
|
97 |
'%b %d %H:%M:%S %Y', |
3812 | 98 |
'%b %d %I:%M:%S%p %Y', |
99 |
'%b %d %H:%M:%S', |
|
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
100 |
'%b %d %I:%M:%S%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
101 |
'%b %d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
102 |
'%b %d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
103 |
'%b %d %Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
104 |
'%b %d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
105 |
'%H:%M:%S', |
9383
7116494c48ab
util: Fix date format for 12-hour time.
Carey Evans <carey@carey.geek.nz>
parents:
9097
diff
changeset
|
106 |
'%I:%M:%S%p', |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
107 |
'%H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
108 |
'%I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
109 |
) |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
110 |
|
3812 | 111 |
extendeddateformats = defaultdateformats + ( |
112 |
"%Y", |
|
113 |
"%Y-%m", |
|
114 |
"%b", |
|
115 |
"%b %Y", |
|
116 |
) |
|
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
117 |
|
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
118 |
def cachefunc(func): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
119 |
'''cache the result of function calls''' |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
120 |
# XXX doesn't handle keywords args |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
121 |
cache = {} |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
122 |
if func.func_code.co_argcount == 1: |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
123 |
# we gain a small amount of time because |
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
124 |
# 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
|
125 |
def f(arg): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
126 |
if arg not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
127 |
cache[arg] = func(arg) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
128 |
return cache[arg] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
129 |
else: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
130 |
def f(*args): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
131 |
if args not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
132 |
cache[args] = func(*args) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
133 |
return cache[args] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
134 |
|
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
135 |
return f |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
136 |
|
9097
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
137 |
def lrucachefunc(func): |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
138 |
'''cache most recent results of function calls''' |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
139 |
cache = {} |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
140 |
order = [] |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
141 |
if func.func_code.co_argcount == 1: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
142 |
def f(arg): |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
143 |
if arg not in cache: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
144 |
if len(cache) > 20: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
145 |
del cache[order.pop(0)] |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
146 |
cache[arg] = func(arg) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
147 |
else: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
148 |
order.remove(arg) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
149 |
order.append(arg) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
150 |
return cache[arg] |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
151 |
else: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
152 |
def f(*args): |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
153 |
if args not in cache: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
154 |
if len(cache) > 20: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
155 |
del cache[order.pop(0)] |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
156 |
cache[args] = func(*args) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
157 |
else: |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
158 |
order.remove(args) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
159 |
order.append(args) |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
160 |
return cache[args] |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
161 |
|
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
162 |
return f |
431462bd8478
fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents:
9089
diff
changeset
|
163 |
|
8207
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
164 |
class propertycache(object): |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
165 |
def __init__(self, func): |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
166 |
self.func = func |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
167 |
self.name = func.__name__ |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
168 |
def __get__(self, obj, type=None): |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
169 |
result = self.func(obj) |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
170 |
setattr(obj, self.name, result) |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
171 |
return result |
dd8d5be57d65
util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents:
8181
diff
changeset
|
172 |
|
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
173 |
def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
174 |
'''filter string S through command CMD, returning its output''' |
8302
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
175 |
p = subprocess.Popen(cmd, shell=True, close_fds=closefds, |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
176 |
stdin=subprocess.PIPE, stdout=subprocess.PIPE) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
177 |
pout, perr = p.communicate(s) |
d2ad8c066676
util: simplify pipefilter and avoid subprocess race
Martin Geisler <mg@lazybytes.net>
parents:
8299
diff
changeset
|
178 |
return pout |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
179 |
|
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
180 |
def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
181 |
'''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
|
182 |
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
|
183 |
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
|
184 |
the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
185 |
inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
186 |
try: |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
187 |
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
|
188 |
fp = os.fdopen(infd, 'wb') |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
189 |
fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
190 |
fp.close() |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
191 |
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
|
192 |
os.close(outfd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
193 |
cmd = cmd.replace('INFILE', inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
194 |
cmd = cmd.replace('OUTFILE', outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
195 |
code = os.system(cmd) |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
196 |
if sys.platform == 'OpenVMS' and code & 1: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
197 |
code = 0 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
198 |
if code: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
199 |
raise Abort(_("command '%s' failed: %s") % |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
200 |
(cmd, explain_exit(code))) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
201 |
fp = open(outname, 'rb') |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
202 |
r = fp.read() |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
203 |
fp.close() |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
204 |
return r |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
205 |
finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
206 |
try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
207 |
if inname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
208 |
os.unlink(inname) |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
209 |
except: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
210 |
pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
211 |
try: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
212 |
if outname: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
213 |
os.unlink(outname) |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
214 |
except: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
215 |
pass |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
216 |
|
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
217 |
filtertable = { |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
218 |
'tempfile:': tempfilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
219 |
'pipe:': pipefilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
220 |
} |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
221 |
|
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
222 |
def filter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
223 |
"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
|
224 |
for name, fn in filtertable.iteritems(): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
225 |
if cmd.startswith(name): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
226 |
return fn(s, cmd[len(name):].lstrip()) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
227 |
return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
228 |
|
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
229 |
def binary(s): |
6507
9699864de219
Let util.binary check entire data for \0 (issue1066, issue1079)
Christian Ebert <blacktrash@gmx.net>
parents:
6501
diff
changeset
|
230 |
"""return true if a string is binary data""" |
8118
35f7fda52c92
util: return boolean result directly in util.binary
Martin Geisler <mg@lazybytes.net>
parents:
8011
diff
changeset
|
231 |
return bool(s and '\0' in s) |
6762 | 232 |
|
7396
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
233 |
def increasingchunks(source, min=1024, max=65536): |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
234 |
'''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
|
235 |
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
|
236 |
def log2(x): |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
237 |
if not x: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
238 |
return 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
239 |
i = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
240 |
while x: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
241 |
x >>= 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
242 |
i += 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
243 |
return i - 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
244 |
|
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
245 |
buf = [] |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
246 |
blen = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
247 |
for chunk in source: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
248 |
buf.append(chunk) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
249 |
blen += len(chunk) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
250 |
if blen >= min: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
251 |
if min < max: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
252 |
min = min << 1 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
253 |
nmin = 1 << log2(blen) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
254 |
if nmin > min: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
255 |
min = nmin |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
256 |
if min > max: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
257 |
min = max |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
258 |
yield ''.join(buf) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
259 |
blen = 0 |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
260 |
buf = [] |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
261 |
if buf: |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
262 |
yield ''.join(buf) |
526c40a74bd0
templater: return data in increasing chunk sizes
Brendan Cully <brendan@kublai.com>
parents:
7301
diff
changeset
|
263 |
|
7947
a454eeb1b827
move util.Abort to error.py
Matt Mackall <mpm@selenic.com>
parents:
7913
diff
changeset
|
264 |
Abort = error.Abort |
508 | 265 |
|
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
266 |
def always(fn): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
267 |
return True |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
268 |
|
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
269 |
def never(fn): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
270 |
return False |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
271 |
|
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
|
272 |
def pathto(root, n1, n2): |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
273 |
'''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
|
274 |
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
|
275 |
n1 should use os.sep to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
276 |
n2 should use "/" to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
277 |
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
|
278 |
|
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
|
279 |
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
|
280 |
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
|
281 |
n2 should always be relative to root. |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
282 |
''' |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
283 |
if not n1: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
284 |
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
|
285 |
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
|
286 |
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
|
287 |
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
|
288 |
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
|
289 |
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
|
290 |
a.reverse() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
291 |
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
|
292 |
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
|
293 |
a.pop() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
294 |
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
|
295 |
b.reverse() |
6111
213ea6eed412
util.pathto: return '.' instead of an empty string
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6091
diff
changeset
|
296 |
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
|
297 |
|
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
298 |
def canonpath(root, cwd, myname, auditor=None): |
1082 | 299 |
"""return the canonical path of myname, given cwd and root""" |
9386
eae98607b349
util: canonpath: simplify logic
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9385
diff
changeset
|
300 |
if 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
|
301 |
rootsep = root |
1566 | 302 |
else: |
1810
7596611ab3d5
Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1635
diff
changeset
|
303 |
rootsep = root + os.sep |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
304 |
name = myname |
2090
eb40db373717
fix util.canonpath on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2085
diff
changeset
|
305 |
if not os.path.isabs(name): |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
306 |
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
|
307 |
name = os.path.normpath(name) |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
308 |
if auditor is None: |
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
309 |
auditor = 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
|
310 |
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
|
311 |
name = name[len(rootsep):] |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
312 |
auditor(name) |
1976
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
313 |
return pconvert(name) |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
314 |
elif name == root: |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
315 |
return '' |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
316 |
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
|
317 |
# 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
|
318 |
# 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
|
319 |
# 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
|
320 |
# `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
|
321 |
# 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
|
322 |
# 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
|
323 |
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
|
324 |
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
|
325 |
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
|
326 |
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
|
327 |
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
|
328 |
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
|
329 |
break |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
330 |
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
|
331 |
if not rel: |
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
332 |
# 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
|
333 |
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
|
334 |
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
|
335 |
name = os.path.join(*rel) |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
336 |
auditor(name) |
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
|
337 |
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
|
338 |
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
|
339 |
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
|
340 |
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
|
341 |
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
|
342 |
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
|
343 |
|
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
344 |
raise Abort('%s not under root' % myname) |
897 | 345 |
|
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
346 |
_hgexecutable = None |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
347 |
|
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
348 |
def main_is_frozen(): |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
349 |
"""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
|
350 |
|
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
351 |
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
|
352 |
(portable, not much used). |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
353 |
""" |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
354 |
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
|
355 |
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
|
356 |
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
|
357 |
|
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
358 |
def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
359 |
"""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
|
360 |
|
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
361 |
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
|
362 |
""" |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
363 |
if _hgexecutable is None: |
6500 | 364 |
hg = os.environ.get('HG') |
365 |
if hg: |
|
366 |
set_hgexecutable(hg) |
|
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
367 |
elif main_is_frozen(): |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
368 |
set_hgexecutable(sys.executable) |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
369 |
else: |
9632
16698d87ad20
util: use sys.argv[0] if $HG is unset and 'hg' is not in PATH
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9610
diff
changeset
|
370 |
exe = find_exe('hg') or os.path.basename(sys.argv[0]) |
16698d87ad20
util: use sys.argv[0] if $HG is unset and 'hg' is not in PATH
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9610
diff
changeset
|
371 |
set_hgexecutable(exe) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
372 |
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
|
373 |
|
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
|
374 |
def set_hgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
375 |
"""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
|
376 |
global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
377 |
_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
|
378 |
|
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
379 |
def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None, out=None): |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
380 |
'''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
381 |
run with environment maybe modified, maybe in different dir. |
508 | 382 |
|
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
383 |
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
|
384 |
print error message and return status, else raise onerr object as |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
385 |
exception. |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
386 |
|
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
387 |
if out is specified, it is assumed to be a file-like object that has a |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
388 |
write() method. stdout and stderr will be redirected to out.''' |
13439
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
389 |
try: |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
390 |
sys.stdout.flush() |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
391 |
except Exception: |
d724a69309e0
util: flush stdout before calling external processes
Mads Kiilerich <mads@kiilerich.com>
parents:
13400
diff
changeset
|
392 |
pass |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
393 |
def py2shell(val): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
394 |
'convert python object into string that is useful to shell' |
8534
22ec9cf4d0ce
util: use "is" for True/False/None comparisons
Martin Geisler <mg@lazybytes.net>
parents:
8516
diff
changeset
|
395 |
if val is None or val is False: |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
396 |
return '0' |
8534
22ec9cf4d0ce
util: use "is" for True/False/None comparisons
Martin Geisler <mg@lazybytes.net>
parents:
8516
diff
changeset
|
397 |
if val is True: |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
398 |
return '1' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
399 |
return str(val) |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
400 |
origcmd = cmd |
13188
6c9345f9edca
util: concentrate quoting knowledge to windows.py quotecommand()
Steve Borho <steve@borho.org>
parents:
13128
diff
changeset
|
401 |
cmd = quotecommand(cmd) |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
402 |
env = dict(os.environ) |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
403 |
env.update((k, py2shell(v)) for k, v in environ.iteritems()) |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
404 |
env['HG'] = hgexecutable() |
11469
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
405 |
if out is None: |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
406 |
rc = subprocess.call(cmd, shell=True, close_fds=closefds, |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
407 |
env=env, cwd=cwd) |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
408 |
else: |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
409 |
proc = subprocess.Popen(cmd, shell=True, close_fds=closefds, |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
410 |
env=env, cwd=cwd, stdout=subprocess.PIPE, |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
411 |
stderr=subprocess.STDOUT) |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
412 |
for line in proc.stdout: |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
413 |
out.write(line) |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
414 |
proc.wait() |
c37f35d7f2f5
http: deliver hook output to client
Maxim Khitrov <mkhitrov@gmail.com>
parents:
11297
diff
changeset
|
415 |
rc = proc.returncode |
9517
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
416 |
if sys.platform == 'OpenVMS' and rc & 1: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
417 |
rc = 0 |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
418 |
if rc and onerr: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
419 |
errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]), |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
420 |
explain_exit(rc)[0]) |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
421 |
if errprefix: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
422 |
errmsg = '%s: %s' % (errprefix, errmsg) |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
423 |
try: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
424 |
onerr.warn(errmsg + '\n') |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
425 |
except AttributeError: |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
426 |
raise onerr(errmsg) |
4368f582c806
util.system: Use subprocess instead of os.system
Mads Kiilerich <mads@kiilerich.com>
parents:
9508
diff
changeset
|
427 |
return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
428 |
|
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
429 |
def checksignature(func): |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
430 |
'''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
|
431 |
def check(*args, **kwargs): |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
432 |
try: |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
433 |
return func(*args, **kwargs) |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
434 |
except TypeError: |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
435 |
if len(traceback.extract_tb(sys.exc_info()[2])) == 1: |
7646 | 436 |
raise error.SignatureError |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
437 |
raise |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
438 |
|
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
439 |
return check |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7301
diff
changeset
|
440 |
|
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13228
diff
changeset
|
441 |
def unlinkpath(f): |
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
|
442 |
"""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
|
443 |
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
|
444 |
# 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
|
445 |
try: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
446 |
os.removedirs(os.path.dirname(f)) |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
447 |
except OSError: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
448 |
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
|
449 |
|
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
450 |
def copyfile(src, dest): |
7767
b2410ed2cbe9
Use shutil.copystat in copyfile().
Will Maier <willmaier@ml1.net>
parents:
7732
diff
changeset
|
451 |
"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
|
452 |
if os.path.islink(src): |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
453 |
try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
454 |
os.unlink(dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
455 |
except: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
456 |
pass |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
457 |
os.symlink(os.readlink(src), dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
458 |
else: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
459 |
try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
460 |
shutil.copyfile(src, dest) |
13099
a08b49d2f116
record: move copystat() hack out of util.copyfile() and into record
Brodie Rao <brodie@bitheap.org>
parents:
13098
diff
changeset
|
461 |
shutil.copymode(src, dest) |
4271
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
462 |
except shutil.Error, inst: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
463 |
raise Abort(str(inst)) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
464 |
|
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
465 |
def copyfiles(src, dst, hardlink=None): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
466 |
"""Copy a directory tree using hardlinks if possible""" |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
467 |
|
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
468 |
if hardlink is None: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
469 |
hardlink = (os.stat(src).st_dev == |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
470 |
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
|
471 |
|
11251
c61442f6d106
clone: print number of linked/copied files on --debug
Adrian Buehlmann <adrian@cadifra.com>
parents:
11232
diff
changeset
|
472 |
num = 0 |
1207 | 473 |
if os.path.isdir(src): |
474 |
os.mkdir(dst) |
|
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
475 |
for name, kind in osutil.listdir(src): |
1207 | 476 |
srcname = os.path.join(src, name) |
477 |
dstname = os.path.join(dst, name) |
|
11251
c61442f6d106
clone: print number of linked/copied files on --debug
Adrian Buehlmann <adrian@cadifra.com>
parents:
11232
diff
changeset
|
478 |
hardlink, n = copyfiles(srcname, dstname, hardlink) |
c61442f6d106
clone: print number of linked/copied files on --debug
Adrian Buehlmann <adrian@cadifra.com>
parents:
11232
diff
changeset
|
479 |
num += n |
1207 | 480 |
else: |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
481 |
if hardlink: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
482 |
try: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
483 |
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
|
484 |
except (IOError, OSError): |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
485 |
hardlink = False |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
486 |
shutil.copy(src, dst) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
487 |
else: |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
488 |
shutil.copy(src, dst) |
11251
c61442f6d106
clone: print number of linked/copied files on --debug
Adrian Buehlmann <adrian@cadifra.com>
parents:
11232
diff
changeset
|
489 |
num += 1 |
698
df78d8ccac4c
Use python function instead of external 'cp' command when cloning repos.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
667
diff
changeset
|
490 |
|
11251
c61442f6d106
clone: print number of linked/copied files on --debug
Adrian Buehlmann <adrian@cadifra.com>
parents:
11232
diff
changeset
|
491 |
return hardlink, num |
11254
640d419725d0
util.copyfiles: don't try os_link() again if it failed before
Adrian Buehlmann <adrian@cadifra.com>
parents:
11010
diff
changeset
|
492 |
|
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
493 |
class path_auditor(object): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
494 |
'''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
|
495 |
the following properties of a path are checked: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
496 |
|
13197
684a977c2ae0
opener: forbid paths ending with directory separator (issue2507)
Jim Hague <jim.hague@acm.org>
parents:
13189
diff
changeset
|
497 |
- ends with a directory separator |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
498 |
- under top-level .hg |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
499 |
- starts at the root of a windows drive |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
500 |
- contains ".." |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
501 |
- traverses a symlink (e.g. a/symlink_here/b) |
12079
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
502 |
- inside a nested repository (a callback can be used to approve |
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
503 |
some nested repositories, e.g., subrepositories) |
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
504 |
''' |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
505 |
|
12079
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
506 |
def __init__(self, root, callback=None): |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
507 |
self.audited = set() |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
508 |
self.auditeddir = set() |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
509 |
self.root = root |
12079
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
510 |
self.callback = callback |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
511 |
|
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
512 |
def __call__(self, path): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
513 |
if path in self.audited: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
514 |
return |
13197
684a977c2ae0
opener: forbid paths ending with directory separator (issue2507)
Jim Hague <jim.hague@acm.org>
parents:
13189
diff
changeset
|
515 |
# AIX ignores "/" at end of path, others raise EISDIR. |
684a977c2ae0
opener: forbid paths ending with directory separator (issue2507)
Jim Hague <jim.hague@acm.org>
parents:
13189
diff
changeset
|
516 |
if endswithsep(path): |
684a977c2ae0
opener: forbid paths ending with directory separator (issue2507)
Jim Hague <jim.hague@acm.org>
parents:
13189
diff
changeset
|
517 |
raise Abort(_("path ends in directory separator: %s") % path) |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
518 |
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
|
519 |
parts = splitpath(normpath) |
7784
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
520 |
if (os.path.splitdrive(path)[0] |
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
521 |
or parts[0].lower() in ('.hg', '.hg.', '') |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
522 |
or os.pardir in parts): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
523 |
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
|
524 |
if '.hg' in path.lower(): |
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
525 |
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
|
526 |
for p in '.hg', '.hg.': |
7820
346fafc144fc
audit: be even pickier (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7784
diff
changeset
|
527 |
if p in lparts[1:]: |
7784
8a217626bb0c
audit: check for casefolding of .hg (issue1450)
Matt Mackall <mpm@selenic.com>
parents:
7780
diff
changeset
|
528 |
pos = lparts.index(p) |
7553
71be8688f2db
audit: reject paths with .hg (issue 1450)
Matt Mackall <mpm@selenic.com>
parents:
7525
diff
changeset
|
529 |
base = os.path.join(*parts[:pos]) |
71be8688f2db
audit: reject paths with .hg (issue 1450)
Matt Mackall <mpm@selenic.com>
parents:
7525
diff
changeset
|
530 |
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
|
531 |
def check(prefix): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
532 |
curpath = os.path.join(self.root, prefix) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
533 |
try: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
534 |
st = os.lstat(curpath) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
535 |
except OSError, err: |
5162
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
536 |
# 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
|
537 |
# 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
|
538 |
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
|
539 |
raise |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
540 |
else: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
541 |
if stat.S_ISLNK(st.st_mode): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
542 |
raise Abort(_('path %r traverses symbolic link %r') % |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
543 |
(path, prefix)) |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
544 |
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
|
545 |
os.path.isdir(os.path.join(curpath, '.hg'))): |
12079
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
546 |
if not self.callback or not self.callback(curpath): |
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
547 |
raise Abort(_('path %r is inside repo %r') % |
41e56e07eef5
path_auditor: delegate checking of nested repos to a callback
Martin Geisler <mg@lazybytes.net>
parents:
12078
diff
changeset
|
548 |
(path, prefix)) |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
549 |
parts.pop() |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
550 |
prefixes = [] |
8631
a87c41f65aff
util: simplify range expression
Martin Geisler <mg@lazybytes.net>
parents:
8614
diff
changeset
|
551 |
while parts: |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
552 |
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
|
553 |
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
|
554 |
break |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
555 |
check(prefix) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
556 |
prefixes.append(prefix) |
5845
5924a11aa419
Fix not to use os.sep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
5844
diff
changeset
|
557 |
parts.pop() |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
558 |
|
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
559 |
self.audited.add(path) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
560 |
# 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
|
561 |
# 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
|
562 |
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
|
563 |
|
8011
25b63941b17b
util: don't overwrite os-specific functions with general ones
Sune Foldager <cryo@cyanite.org>
parents:
7953
diff
changeset
|
564 |
def lookup_reg(key, name=None, scope=None): |
25b63941b17b
util: don't overwrite os-specific functions with general ones
Sune Foldager <cryo@cyanite.org>
parents:
7953
diff
changeset
|
565 |
return None |
25b63941b17b
util: don't overwrite os-specific functions with general ones
Sune Foldager <cryo@cyanite.org>
parents:
7953
diff
changeset
|
566 |
|
10240
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
567 |
def hidewindow(): |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
568 |
"""Hide current shell window. |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
569 |
|
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
570 |
Used to hide the window opened when starting asynchronous |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
571 |
child process under Windows, unneeded on other systems. |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
572 |
""" |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
573 |
pass |
3af4b39afe2a
cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents:
10239
diff
changeset
|
574 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
575 |
if os.name == 'nt': |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
576 |
from windows import * |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
577 |
else: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
578 |
from posix import * |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
579 |
|
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
580 |
def makelock(info, pathname): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
581 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
582 |
return os.symlink(info, pathname) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
583 |
except OSError, why: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
584 |
if why.errno == errno.EEXIST: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
585 |
raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
586 |
except AttributeError: # no symlink in os |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
587 |
pass |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
588 |
|
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
589 |
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
|
590 |
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
|
591 |
os.close(ld) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
592 |
|
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
593 |
def readlock(pathname): |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
594 |
try: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
595 |
return os.readlink(pathname) |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
596 |
except OSError, why: |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
597 |
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
|
598 |
raise |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
599 |
except AttributeError: # no symlink in os |
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
600 |
pass |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
601 |
fp = posixfile(pathname) |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
602 |
r = fp.read() |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
603 |
fp.close() |
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13392
diff
changeset
|
604 |
return r |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
605 |
|
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
606 |
def fstat(fp): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
607 |
'''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
|
608 |
try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
609 |
return os.fstat(fp.fileno()) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
610 |
except AttributeError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
611 |
return os.stat(fp.name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
612 |
|
3784 | 613 |
# File system features |
614 |
||
6746
1dca460e7d1e
rename checkfolding to checkcase
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
615 |
def checkcase(path): |
3784 | 616 |
""" |
617 |
Check whether the given path is on a case-sensitive filesystem |
|
618 |
||
619 |
Requires a path (like /foo/.hg) ending with a foldable final |
|
620 |
directory component. |
|
621 |
""" |
|
622 |
s1 = os.stat(path) |
|
623 |
d, b = os.path.split(path) |
|
624 |
p2 = os.path.join(d, b.upper()) |
|
625 |
if path == p2: |
|
626 |
p2 = os.path.join(d, b.lower()) |
|
627 |
try: |
|
628 |
s2 = os.stat(p2) |
|
629 |
if s2 == s1: |
|
630 |
return False |
|
631 |
return True |
|
632 |
except: |
|
633 |
return True |
|
634 |
||
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
635 |
_fspathcache = {} |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
636 |
def fspath(name, root): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
637 |
'''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
|
638 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
639 |
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
|
640 |
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
|
641 |
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
|
642 |
''' |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
643 |
# If name is absolute, make it relative |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
644 |
if name.lower().startswith(root.lower()): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
645 |
l = len(root) |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
646 |
if name[l] == os.sep or name[l] == os.altsep: |
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
647 |
l = l + 1 |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
648 |
name = name[l:] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
649 |
|
12344
b6173aee4a47
Use lexists() instead of exists() where appropriate
Patrick Mezard <pmezard@gmail.com>
parents:
12051
diff
changeset
|
650 |
if not os.path.lexists(os.path.join(root, name)): |
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
651 |
return None |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
652 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
653 |
seps = os.sep |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
654 |
if os.altsep: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
655 |
seps = seps + os.altsep |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
656 |
# Protect backslashes. This gets silly very quickly. |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
657 |
seps.replace('\\','\\\\') |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
658 |
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
|
659 |
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
|
660 |
result = [] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
661 |
for part, sep in pattern.findall(name): |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
662 |
if sep: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
663 |
result.append(sep) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
664 |
continue |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
665 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
666 |
if dir not in _fspathcache: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
667 |
_fspathcache[dir] = os.listdir(dir) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
668 |
contents = _fspathcache[dir] |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
669 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
670 |
lpart = part.lower() |
9397
5b117c90f036
util: quicker fspath, do not lower names when the length is different
Simon Heimberg <simohe@besonet.ch>
parents:
9386
diff
changeset
|
671 |
lenp = len(part) |
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
672 |
for n in contents: |
9397
5b117c90f036
util: quicker fspath, do not lower names when the length is different
Simon Heimberg <simohe@besonet.ch>
parents:
9386
diff
changeset
|
673 |
if lenp == len(n) and n.lower() == lpart: |
6676
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
674 |
result.append(n) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
675 |
break |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
676 |
else: |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
677 |
# Cannot happen, as the file exists! |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
678 |
result.append(part) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
679 |
dir = os.path.join(dir, lpart) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
680 |
|
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
681 |
return ''.join(result) |
33045179d079
Add a new function, fspath
Paul Moore <p.f.moore@gmail.com>
parents:
6595
diff
changeset
|
682 |
|
3994
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
683 |
def checkexec(path): |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
684 |
""" |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
685 |
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
|
686 |
|
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
687 |
Requires a directory (like /foo/.hg) |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
688 |
""" |
5739
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
689 |
|
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
690 |
# 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
|
691 |
# 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
|
692 |
# with exec bit on. |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
693 |
|
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
694 |
try: |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
695 |
EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
10896
2d61b612a09d
checkexec: use an explicit prefix for the temporary file
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10789
diff
changeset
|
696 |
fh, fn = tempfile.mkstemp(dir=path, prefix='hg-checkexec-') |
5739
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
697 |
try: |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
698 |
os.close(fh) |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
699 |
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
|
700 |
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
|
701 |
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
|
702 |
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
|
703 |
finally: |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
704 |
os.unlink(fn) |
45fa7b1c5d4c
checkexec: fix VFAT tempfile droppings with more modern Linux kernels
Matt Mackall <mpm@selenic.com>
parents:
5707
diff
changeset
|
705 |
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
|
706 |
# 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
|
707 |
return False |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
708 |
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
|
709 |
|
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
4000
diff
changeset
|
710 |
def checklink(path): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
711 |
"""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
|
712 |
# 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
|
713 |
# file already exists |
10901
997173e49115
checklink: use an explicit prefix for the temporary file
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10896
diff
changeset
|
714 |
name = tempfile.mktemp(dir=path, prefix='hg-checklink-') |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
715 |
try: |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
716 |
os.symlink(".", name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
717 |
os.unlink(name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
718 |
return True |
4017
ea6174c96ae1
catch AttributeError in util.checklink
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4002
diff
changeset
|
719 |
except (OSError, AttributeError): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
720 |
return False |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
721 |
|
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
722 |
def checknlink(testfile): |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
723 |
'''check whether hardlink count reporting works properly''' |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
724 |
|
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
725 |
# testfile may be open, so we need a separate file for checking to |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
726 |
# work around issue2543 (or testfile may get lost on Samba shares) |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
727 |
f1 = testfile + ".hgtmp1" |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
728 |
if os.path.lexists(f1): |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
729 |
return False |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
730 |
try: |
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
731 |
posixfile(f1, 'w').close() |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
732 |
except IOError: |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
733 |
return False |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
734 |
|
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
735 |
f2 = testfile + ".hgtmp2" |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
736 |
fd = None |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
737 |
try: |
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
738 |
try: |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
739 |
os_link(f1, f2) |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
740 |
except OSError: |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
741 |
return False |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
742 |
|
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
743 |
# nlinks() may behave differently for files on Windows shares if |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
744 |
# the file is open. |
13342
2dc7a2a96cfd
opener: use posixfile to hold file open when calling nlinks()
Adrian Buehlmann <adrian@cadifra.com>
parents:
13316
diff
changeset
|
745 |
fd = posixfile(f2) |
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
746 |
return nlinks(f2) > 1 |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
747 |
finally: |
13204
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
748 |
if fd is not None: |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
749 |
fd.close() |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
750 |
for f in (f1, f2): |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
751 |
try: |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
752 |
os.unlink(f) |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
753 |
except OSError: |
5b83ab614dab
checknlink: use two testfiles (issue2543)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13188
diff
changeset
|
754 |
pass |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
755 |
|
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
756 |
return False |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
757 |
|
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
|
758 |
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
|
759 |
'''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
|
760 |
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
|
761 |
|
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
|
762 |
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
|
763 |
'''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
|
764 |
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
|
765 |
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
|
766 |
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
|
767 |
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
|
768 |
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
|
769 |
|
6007
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
770 |
def gui(): |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
771 |
'''Are we running in a GUI?''' |
090b1a665901
filemerge: add config item for GUI tools
Matt Mackall <mpm@selenic.com>
parents:
6006
diff
changeset
|
772 |
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
|
773 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
774 |
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
|
775 |
"""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
|
776 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
777 |
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
|
778 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
779 |
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
|
780 |
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
|
781 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
782 |
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
|
783 |
""" |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
784 |
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
|
785 |
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
|
786 |
os.close(fd) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
787 |
# 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
|
788 |
# 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
|
789 |
# 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
|
790 |
try: |
5740
9046a4f6a07c
atomictempfile: avoid chmod weirdness on Linux vfat
Matt Mackall <mpm@selenic.com>
parents:
5739
diff
changeset
|
791 |
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
|
792 |
except OSError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
793 |
if inst.errno != errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
794 |
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
|
795 |
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
|
796 |
if st_mode is None: |
7890
e710f0f592b2
util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents:
7879
diff
changeset
|
797 |
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
|
798 |
st_mode &= 0666 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
799 |
os.chmod(temp, st_mode) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
800 |
if emptyok: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
801 |
return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
802 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
803 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
804 |
ifp = posixfile(name, "rb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
805 |
except IOError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
806 |
if inst.errno == errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
807 |
return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
808 |
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
|
809 |
inst.filename = name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
810 |
raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
811 |
ofp = posixfile(temp, "wb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
812 |
for chunk in filechunkiter(ifp): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
813 |
ofp.write(chunk) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
814 |
ifp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
815 |
ofp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
816 |
except: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
817 |
try: os.unlink(temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
818 |
except: pass |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
819 |
raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
820 |
return temp |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
821 |
|
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8631
diff
changeset
|
822 |
class atomictempfile(object): |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
823 |
"""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
|
824 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
825 |
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
|
826 |
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
|
827 |
name, making the changes visible. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
828 |
""" |
11212
4d8db9676171
util: give appropriate default args to atomictempfile()
Yuya Nishihara <yuya@tcha.org>
parents:
11011
diff
changeset
|
829 |
def __init__(self, name, mode='w+b', createmode=None): |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
830 |
self.__name = name |
8420
f53bc3e37655
util: make atomictempfile saner if mktempcopy fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
8419
diff
changeset
|
831 |
self._fp = None |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
832 |
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
|
833 |
createmode=createmode) |
8327
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
834 |
self._fp = posixfile(self.temp, mode) |
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
835 |
|
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
836 |
def __getattr__(self, name): |
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
837 |
return getattr(self._fp, name) |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
838 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
839 |
def rename(self): |
8785
7a9151bc5b37
atomictempfile: fix exception in __del__ if mktempcopy fails (self._fp is None)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8778
diff
changeset
|
840 |
if not self._fp.closed: |
8327
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
841 |
self._fp.close() |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
842 |
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
|
843 |
|
13098
f7d6750dcd01
util: make atomicfiles closable
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13072
diff
changeset
|
844 |
def close(self): |
8785
7a9151bc5b37
atomictempfile: fix exception in __del__ if mktempcopy fails (self._fp is None)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8778
diff
changeset
|
845 |
if not self._fp: |
7a9151bc5b37
atomictempfile: fix exception in __del__ if mktempcopy fails (self._fp is None)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8778
diff
changeset
|
846 |
return |
7a9151bc5b37
atomictempfile: fix exception in __del__ if mktempcopy fails (self._fp is None)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8778
diff
changeset
|
847 |
if not self._fp.closed: |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
848 |
try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
849 |
os.unlink(self.temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
850 |
except: pass |
8327
aa25be1c2889
atomictempfile: delegate to posixfile instead of inheriting from it
Bryan O'Sullivan <bos@serpentine.com>
parents:
8312
diff
changeset
|
851 |
self._fp.close() |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
852 |
|
13098
f7d6750dcd01
util: make atomicfiles closable
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13072
diff
changeset
|
853 |
def __del__(self): |
f7d6750dcd01
util: make atomicfiles closable
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13072
diff
changeset
|
854 |
self.close() |
f7d6750dcd01
util: make atomicfiles closable
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13072
diff
changeset
|
855 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
856 |
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
|
857 |
"""recursive directory creation with parent mode inheritance""" |
13068
adff480db558
makedirs: abort if parent == name (issue2531)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13063
diff
changeset
|
858 |
parent = os.path.abspath(os.path.dirname(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
|
859 |
try: |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
860 |
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
|
861 |
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
|
862 |
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
|
863 |
return |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
864 |
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
|
865 |
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
|
866 |
return |
13068
adff480db558
makedirs: abort if parent == name (issue2531)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13063
diff
changeset
|
867 |
if not name or parent == name or err.errno != errno.ENOENT: |
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
868 |
raise |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
869 |
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
|
870 |
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
|
871 |
|
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
872 |
class opener(object): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
873 |
"""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
|
874 |
|
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
875 |
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
|
876 |
remote file access from higher level code. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
877 |
""" |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
878 |
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
|
879 |
self.base = base |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
880 |
if audit: |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
881 |
self.auditor = path_auditor(base) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
882 |
else: |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
883 |
self.auditor = 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
|
884 |
self.createmode = None |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
885 |
self._trustnlink = None |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
886 |
|
9112
54eb3782d32f
util: use propertycache in opener instead of __getattr__
Simon Heimberg <simohe@besonet.ch>
parents:
9102
diff
changeset
|
887 |
@propertycache |
54eb3782d32f
util: use propertycache in opener instead of __getattr__
Simon Heimberg <simohe@besonet.ch>
parents:
9102
diff
changeset
|
888 |
def _can_symlink(self): |
54eb3782d32f
util: use propertycache in opener instead of __getattr__
Simon Heimberg <simohe@besonet.ch>
parents:
9102
diff
changeset
|
889 |
return checklink(self.base) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
890 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
891 |
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
|
892 |
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
|
893 |
return |
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
894 |
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
|
895 |
|
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
896 |
def __call__(self, path, mode="r", text=False, atomictemp=False): |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
897 |
self.auditor(path) |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
898 |
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
|
899 |
|
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
900 |
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
|
901 |
mode += "b" # for that other OS |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
902 |
|
6062
3c3b126e5619
Make files in .hg inherit the permissions from .hg/store
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6007
diff
changeset
|
903 |
nlink = -1 |
12927
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
904 |
dirname, basename = os.path.split(f) |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
905 |
# If basename is empty, then the path is malformed because it points |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
906 |
# to a directory. Let the posixfile() call below raise IOError. |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
907 |
if basename and mode not in ('r', 'rb'): |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
908 |
if atomictemp: |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
909 |
if not os.path.isdir(dirname): |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
910 |
makedirs(dirname, self.createmode) |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
911 |
return atomictempfile(f, mode, self.createmode) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
912 |
try: |
12927
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
913 |
if 'w' in mode: |
13282
c01eea6c455b
opener: use util.unlink (issue2524)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13279
diff
changeset
|
914 |
unlink(f) |
12927
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
915 |
nlink = 0 |
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
916 |
else: |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
917 |
# nlinks() may behave differently for files on Windows |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
918 |
# shares if the file is open. |
13342
2dc7a2a96cfd
opener: use posixfile to hold file open when calling nlinks()
Adrian Buehlmann <adrian@cadifra.com>
parents:
13316
diff
changeset
|
919 |
fd = posixfile(f) |
12927
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
920 |
nlink = nlinks(f) |
13305
035684c6b69a
opener: force copy on 'a'ppend if nlinks() returns 0 (issue1922)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13225
diff
changeset
|
921 |
if nlink < 1: |
035684c6b69a
opener: force copy on 'a'ppend if nlinks() returns 0 (issue1922)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13225
diff
changeset
|
922 |
nlink = 2 # force mktempcopy (issue1922) |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
923 |
fd.close() |
13279
eed22340b7aa
opener: check exception for ENOENT
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
924 |
except (OSError, IOError), e: |
eed22340b7aa
opener: check exception for ENOENT
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
925 |
if e.errno != errno.ENOENT: |
eed22340b7aa
opener: check exception for ENOENT
Adrian Buehlmann <adrian@cadifra.com>
parents:
13235
diff
changeset
|
926 |
raise |
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
|
927 |
nlink = 0 |
12927
b6245c2470a9
util: refactor opener
Adrian Buehlmann <adrian@cadifra.com>
parents:
12877
diff
changeset
|
928 |
if not os.path.isdir(dirname): |
12877
551aa6e27929
opener: do not create "foo" directory when writing to "foo/"
Martin Geisler <mg@aragost.com>
parents:
12698
diff
changeset
|
929 |
makedirs(dirname, self.createmode) |
12938
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
930 |
if nlink > 0: |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
931 |
if self._trustnlink is None: |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
932 |
self._trustnlink = nlink > 1 or checknlink(f) |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
933 |
if nlink > 1 or not self._trustnlink: |
bf826c0b9537
opener: check hardlink count reporting (issue1866)
Adrian Buehlmann <adrian@cadifra.com>
parents:
12927
diff
changeset
|
934 |
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
|
935 |
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
|
936 |
if nlink == 0: |
13112
039a964dbbb3
opener: always reset flags on 'w'rite
Adrian Buehlmann <adrian@cadifra.com>
parents:
13099
diff
changeset
|
937 |
self._fixfilemode(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
|
938 |
return fp |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
939 |
|
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
940 |
def symlink(self, src, dst): |
12078
e03ca36ba9f3
util: use 'auditor' as consistent name for path auditors
Martin Geisler <mg@lazybytes.net>
parents:
12077
diff
changeset
|
941 |
self.auditor(dst) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
942 |
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
|
943 |
try: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
944 |
os.unlink(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
945 |
except OSError: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
946 |
pass |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
947 |
|
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
948 |
dirname = os.path.dirname(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
949 |
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
|
950 |
makedirs(dirname, self.createmode) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
951 |
|
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
952 |
if self._can_symlink: |
4948
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
953 |
try: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
954 |
os.symlink(src, linkname) |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
955 |
except OSError, err: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
956 |
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
|
957 |
(src, err.strerror), linkname) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
958 |
else: |
5077
84b10dc3dccc
Fix issue 653: symlinks checkout failure on non-supporting platforms
Patrick Mezard <pmezard@gmail.com>
parents:
5062
diff
changeset
|
959 |
f = self(dst, "w") |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
960 |
f.write(src) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
961 |
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
|
962 |
self._fixfilemode(dst) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
963 |
|
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
964 |
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
|
965 |
"""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
|
966 |
iterator over chunks of arbitrary size.""" |
1200 | 967 |
|
5446
fa836e050c50
chunkbuffer: removed unused method and arg
Matt Mackall <mpm@selenic.com>
parents:
5420
diff
changeset
|
968 |
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
|
969 |
"""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
|
970 |
targetsize is how big a buffer to try to maintain.""" |
11670
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
971 |
def splitbig(chunks): |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
972 |
for chunk in chunks: |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
973 |
if len(chunk) > 2**20: |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
974 |
pos = 0 |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
975 |
while pos < len(chunk): |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
976 |
end = pos + 2 ** 18 |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
977 |
yield chunk[pos:end] |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
978 |
pos = end |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
979 |
else: |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
980 |
yield chunk |
1b3b843e1100
chunkbuffer: split big strings directly in chunkbuffer
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11668
diff
changeset
|
981 |
self.iter = splitbig(in_iter) |
11758
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
982 |
self._queue = [] |
1200 | 983 |
|
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
984 |
def read(self, l): |
1200 | 985 |
"""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
|
986 |
Returns less than L bytes if the iterator runs dry.""" |
11758
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
987 |
left = l |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
988 |
buf = '' |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
989 |
queue = self._queue |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
990 |
while left > 0: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
991 |
# refill the queue |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
992 |
if not queue: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
993 |
target = 2**18 |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
994 |
for chunk in self.iter: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
995 |
queue.append(chunk) |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
996 |
target -= len(chunk) |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
997 |
if target <= 0: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
998 |
break |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
999 |
if not queue: |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1000 |
break |
11758
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1001 |
|
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1002 |
chunk = queue.pop(0) |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1003 |
left -= len(chunk) |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1004 |
if left < 0: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1005 |
queue.insert(0, chunk[left:]) |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1006 |
buf += chunk[:left] |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1007 |
else: |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1008 |
buf += chunk |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1009 |
|
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1010 |
return buf |
a79214972da2
chunkbuffer: use += rather than cStringIO to reduce memory footprint
Matt Mackall <mpm@selenic.com>
parents:
11469
diff
changeset
|
1011 |
|
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1012 |
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
|
1013 |
"""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
|
1014 |
(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
|
1015 |
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
|
1016 |
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
|
1017 |
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
|
1018 |
requested.""" |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1019 |
assert size >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1020 |
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
|
1021 |
while True: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1022 |
if limit is None: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1023 |
nbytes = size |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1024 |
else: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1025 |
nbytes = min(limit, size) |
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1026 |
s = nbytes and f.read(nbytes) |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1027 |
if not s: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1028 |
break |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1029 |
if limit: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1030 |
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
|
1031 |
yield s |
1320
5f277e73778f
Fix up representation of dates in hgweb.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1312
diff
changeset
|
1032 |
|
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1033 |
def makedate(): |
1482
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1034 |
lt = time.localtime() |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1035 |
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
|
1036 |
tz = time.altzone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1037 |
else: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1038 |
tz = time.timezone |
13063
e98581d44f0b
makedate: abort on negative timestamps (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13062
diff
changeset
|
1039 |
t = time.mktime(lt) |
e98581d44f0b
makedate: abort on negative timestamps (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13062
diff
changeset
|
1040 |
if t < 0: |
e98581d44f0b
makedate: abort on negative timestamps (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13062
diff
changeset
|
1041 |
hint = _("check your clock") |
e98581d44f0b
makedate: abort on negative timestamps (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13062
diff
changeset
|
1042 |
raise Abort(_("negative timestamp: %d") % t, hint=hint) |
e98581d44f0b
makedate: abort on negative timestamps (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13062
diff
changeset
|
1043 |
return t, tz |
1329
8f06817bf266
Allow files to be opened in text mode, even on Windows.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1321
diff
changeset
|
1044 |
|
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1045 |
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
|
1046 |
"""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
|
1047 |
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
|
1048 |
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
|
1049 |
append time zone to string.""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1050 |
t, tz = date or makedate() |
13039
dd24f3e7ca9e
util.datestr: do not crash on revisions with negative timestamp (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13038
diff
changeset
|
1051 |
if t < 0: |
dd24f3e7ca9e
util.datestr: do not crash on revisions with negative timestamp (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13038
diff
changeset
|
1052 |
t = 0 # time.gmtime(lt) fails on Windows for lt < -43200 |
dd24f3e7ca9e
util.datestr: do not crash on revisions with negative timestamp (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13038
diff
changeset
|
1053 |
tz = 0 |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1054 |
if "%1" in format or "%2" in format: |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1055 |
sign = (tz > 0) and "-" or "+" |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8938
diff
changeset
|
1056 |
minutes = abs(tz) // 60 |
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8938
diff
changeset
|
1057 |
format = format.replace("%1", "%c%02d" % (sign, minutes // 60)) |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1058 |
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
|
1059 |
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
|
1060 |
return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1061 |
|
6134
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
1062 |
def shortdate(date=None): |
7b937b26adf7
Make annotae/grep print short dates with -q/--quiet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6111
diff
changeset
|
1063 |
"""turn (timestamp, tzoff) tuple into iso 8631 date.""" |
6229
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1064 |
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
|
1065 |
|
5357
c6adf2be6069
util: add default argument to strdate
Bryan O'Sullivan <bos@serpentine.com>
parents:
5293
diff
changeset
|
1066 |
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
|
1067 |
"""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
|
1068 |
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
|
1069 |
def timezone(string): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1070 |
tz = string.split()[-1] |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1071 |
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
|
1072 |
sign = (tz[0] == "+") and 1 or -1 |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1073 |
hours = int(tz[1:3]) |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1074 |
minutes = int(tz[3:5]) |
c3182eeb70ea
dates: improve timezone handling
Matt Mackall <mpm@selenic.com>
parents:
6224
diff
changeset
|
1075 |
return -sign * (hours * 60 + minutes) * 60 |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
1076 |
if tz == "GMT" or tz == "UTC": |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1077 |
return 0 |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1078 |
return None |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1079 |
|
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1080 |
# NOTE: unixtime = localunixtime + offset |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1081 |
offset, date = timezone(string), string |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12957
diff
changeset
|
1082 |
if offset is not None: |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1083 |
date = " ".join(string.split()[:-1]) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1084 |
|
3812 | 1085 |
# add missing elements from defaults |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1086 |
usenow = False # default to using biased defaults |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1087 |
for part in ("S", "M", "HI", "d", "mb", "yY"): # decreasing specificity |
3812 | 1088 |
found = [True for p in part if ("%"+p) in format] |
1089 |
if not found: |
|
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1090 |
date += "@" + defaults[part][usenow] |
3812 | 1091 |
format += "@%" + part[0] |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1092 |
else: |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1093 |
# We've found a specific time element, less specific time |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1094 |
# elements are relative to today |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1095 |
usenow = True |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1096 |
|
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1097 |
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
|
1098 |
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
|
1099 |
if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1100 |
# local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1101 |
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
|
1102 |
offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1103 |
else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1104 |
unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1105 |
return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1106 |
|
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1107 |
def parsedate(date, formats=None, bias={}): |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1108 |
"""parse a localized date/time and return a (unixtime, offset) tuple. |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1109 |
|
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1110 |
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
|
1111 |
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
|
1112 |
""" |
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1113 |
if not date: |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1114 |
return 0, 0 |
6230
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
1115 |
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
|
1116 |
return date |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1117 |
if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1118 |
formats = defaultdateformats |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1119 |
date = date.strip() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1120 |
try: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1121 |
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
|
1122 |
except ValueError: |
3812 | 1123 |
# fill out defaults |
1124 |
now = makedate() |
|
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1125 |
defaults = {} |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1126 |
nowmap = {} |
13200
6f011cf52f9a
avoid .split() in for loops and use tuples instead
David Soria Parra <dsp@php.net>
parents:
13197
diff
changeset
|
1127 |
for part in ("d", "mb", "yY", "HI", "M", "S"): |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1128 |
# this piece is for rounding the specific end of unknowns |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1129 |
b = bias.get(part) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1130 |
if b is None: |
3812 | 1131 |
if part[0] in "HMS": |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1132 |
b = "00" |
3812 | 1133 |
else: |
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1134 |
b = "0" |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1135 |
|
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1136 |
# this piece is for matching the generic end to today's date |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1137 |
n = datestr(now, "%" + part[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1138 |
|
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1139 |
defaults[part] = (b, n) |
3812 | 1140 |
|
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1141 |
for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1142 |
try: |
6139
989467e8e3a9
Fix bad behaviour when specifying an invalid date (issue700)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6135
diff
changeset
|
1143 |
when, offset = strdate(date, format, defaults) |
6087
12856a1742dc
better handle errors with date parsing (issue983)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5917
diff
changeset
|
1144 |
except (ValueError, OverflowError): |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1145 |
pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1146 |
else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1147 |
break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1148 |
else: |
12105
6f58430dfdd0
util: get rid of extra trailing whitespace in parsedate abort message
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12088
diff
changeset
|
1149 |
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
|
1150 |
# 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
|
1151 |
# 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
|
1152 |
# 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
|
1153 |
# to UTC+14 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1154 |
if abs(when) > 0x7fffffff: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1155 |
raise Abort(_('date exceeds 32 bits: %d') % when) |
13062
e1002cf9fe54
parsedate: abort on negative dates (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13053
diff
changeset
|
1156 |
if when < 0: |
e1002cf9fe54
parsedate: abort on negative dates (issue2513)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13053
diff
changeset
|
1157 |
raise Abort(_('negative date value: %d') % when) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1158 |
if offset < -50400 or offset > 43200: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1159 |
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
|
1160 |
return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1161 |
|
3812 | 1162 |
def matchdate(date): |
1163 |
"""Return a function that matches a given date match specifier |
|
1164 |
||
1165 |
Formats include: |
|
1166 |
||
1167 |
'{date}' match a given date to the accuracy provided |
|
1168 |
||
1169 |
'<{date}' on or before a given date |
|
1170 |
||
1171 |
'>{date}' on or after a given date |
|
1172 |
||
13212
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1173 |
>>> p1 = parsedate("10:29:59") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1174 |
>>> p2 = parsedate("10:30:00") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1175 |
>>> p3 = parsedate("10:30:59") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1176 |
>>> p4 = parsedate("10:31:00") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1177 |
>>> p5 = parsedate("Sep 15 10:30:00 1999") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1178 |
>>> f = matchdate("10:30") |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1179 |
>>> f(p1[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1180 |
False |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1181 |
>>> f(p2[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1182 |
True |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1183 |
>>> f(p3[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1184 |
True |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1185 |
>>> f(p4[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1186 |
False |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1187 |
>>> f(p5[0]) |
5d0a30fad7de
date: fix matching of underspecified date ranges
Matt Mackall <mpm@selenic.com>
parents:
13204
diff
changeset
|
1188 |
False |
3812 | 1189 |
""" |
1190 |
||
1191 |
def lower(date): |
|
6230
c7253d1a774e
dates: Fix bare times to be relative to "today"
Matt Mackall <mpm@selenic.com>
parents:
6229
diff
changeset
|
1192 |
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
|
1193 |
return parsedate(date, extendeddateformats, d)[0] |
3812 | 1194 |
|
1195 |
def upper(date): |
|
1196 |
d = dict(mb="12", HI="23", M="59", S="59") |
|
13200
6f011cf52f9a
avoid .split() in for loops and use tuples instead
David Soria Parra <dsp@php.net>
parents:
13197
diff
changeset
|
1197 |
for days in ("31", "30", "29"): |
3812 | 1198 |
try: |
1199 |
d["d"] = days |
|
1200 |
return parsedate(date, extendeddateformats, d)[0] |
|
1201 |
except: |
|
1202 |
pass |
|
1203 |
d["d"] = "28" |
|
1204 |
return parsedate(date, extendeddateformats, d)[0] |
|
1205 |
||
7953
8c6f823efcc9
Correct a bug on date formats with '>' or '<' accompanied by space characters.
Justin Peng <justin.peng.sw@gmail.com>
parents:
7948
diff
changeset
|
1206 |
date = date.strip() |
3812 | 1207 |
if date[0] == "<": |
1208 |
when = upper(date[1:]) |
|
1209 |
return lambda x: x <= when |
|
1210 |
elif date[0] == ">": |
|
1211 |
when = lower(date[1:]) |
|
1212 |
return lambda x: x >= when |
|
1213 |
elif date[0] == "-": |
|
1214 |
try: |
|
1215 |
days = int(date[1:]) |
|
1216 |
except ValueError: |
|
1217 |
raise Abort(_("invalid day spec: %s") % date[1:]) |
|
1218 |
when = makedate()[0] - days * 3600 * 24 |
|
3813 | 1219 |
return lambda x: x >= when |
3812 | 1220 |
elif " to " in date: |
1221 |
a, b = date.split(" to ") |
|
1222 |
start, stop = lower(a), upper(b) |
|
1223 |
return lambda x: x >= start and x <= stop |
|
1224 |
else: |
|
1225 |
start, stop = lower(date), upper(date) |
|
1226 |
return lambda x: x >= start and x <= stop |
|
1227 |
||
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1228 |
def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1229 |
"""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
|
1230 |
f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1231 |
if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1232 |
user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1233 |
f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1234 |
if f >= 0: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1235 |
user = user[f + 1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1236 |
f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1237 |
if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1238 |
user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1239 |
f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1240 |
if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1241 |
user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1242 |
return user |
1920 | 1243 |
|
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1244 |
def email(author): |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1245 |
'''get email of author.''' |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1246 |
r = author.find('>') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1247 |
if r == -1: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1248 |
r = None |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1249 |
return author[author.find('<') + 1:r] |
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
1250 |
|
13225
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1251 |
def _ellipsis(text, maxlength): |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1252 |
if len(text) <= maxlength: |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1253 |
return text, False |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1254 |
else: |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1255 |
return "%s..." % (text[:maxlength - 3]), True |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1256 |
|
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1257 |
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
|
1258 |
"""Trim string to at most maxlength (default: 400) characters.""" |
13225
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1259 |
try: |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1260 |
# use unicode not to split at intermediate multi-byte sequence |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1261 |
utext, truncated = _ellipsis(text.decode(encoding.encoding), |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1262 |
maxlength) |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1263 |
if not truncated: |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1264 |
return text |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1265 |
return utext.encode(encoding.encoding) |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1266 |
except (UnicodeDecodeError, UnicodeEncodeError): |
e3bf16703e26
util: fix ellipsis() not to break multi-byte sequence (issue2564)
Yuya Nishihara <yuya@tcha.org>
parents:
13212
diff
changeset
|
1267 |
return _ellipsis(text, maxlength)[0] |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1268 |
|
7523
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1269 |
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
|
1270 |
'''yield every hg repository under path, recursively.''' |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1271 |
def errhandler(err): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1272 |
if err.filename == path: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1273 |
raise err |
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1274 |
if followsym and hasattr(os.path, 'samestat'): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1275 |
def _add_dir_if_not_there(dirlst, dirname): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1276 |
match = False |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1277 |
samestat = os.path.samestat |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1278 |
dirstat = os.stat(dirname) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1279 |
for lstdirstat in dirlst: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1280 |
if samestat(dirstat, lstdirstat): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1281 |
match = True |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1282 |
break |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1283 |
if not match: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1284 |
dirlst.append(dirstat) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1285 |
return not match |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1286 |
else: |
6317
b0d937869417
hgwebdir: Tiny fix for webdir on non-symlink capable platforms.
Eric Hopper <hopper@omnifarious.org>
parents:
6284
diff
changeset
|
1287 |
followsym = False |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1288 |
|
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1289 |
if (seen_dirs is None) and followsym: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1290 |
seen_dirs = [] |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1291 |
_add_dir_if_not_there(seen_dirs, path) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1292 |
for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler): |
9732
092bcf431562
util: sort paths in walkrepos() (fixes test failures in test-hgwebdir)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
9712
diff
changeset
|
1293 |
dirs.sort() |
6140
47e6d5d5913a
Simplify utils.walkrepos().
Walter Doerwald <walter@livinglogic.de>
parents:
6139
diff
changeset
|
1294 |
if '.hg' in dirs: |
47e6d5d5913a
Simplify utils.walkrepos().
Walter Doerwald <walter@livinglogic.de>
parents:
6139
diff
changeset
|
1295 |
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
|
1296 |
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
|
1297 |
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
|
1298 |
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
|
1299 |
if recurse: |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1300 |
# avoid recursing inside the .hg directory |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1301 |
dirs.remove('.hg') |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1302 |
else: |
e60aaae83323
hgweb: recurse down collections only if ** in [paths]
Benoit Allard <benoit@aeteurope.nl>
parents:
7494
diff
changeset
|
1303 |
dirs[:] = [] # don't descend further |
6284
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1304 |
elif followsym: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1305 |
newdirs = [] |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1306 |
for d in dirs: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1307 |
fname = os.path.join(root, d) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1308 |
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
|
1309 |
if os.path.islink(fname): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1310 |
for hgname in walkrepos(fname, True, seen_dirs): |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1311 |
yield hgname |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1312 |
else: |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1313 |
newdirs.append(d) |
c93b6c0e6e84
Allow hgwebdir collections to follow symlinks.
Eric Hopper <hopper@omnifarious.org>
parents:
6267
diff
changeset
|
1314 |
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
|
1315 |
|
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1316 |
_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
|
1317 |
|
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
|
1318 |
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
|
1319 |
'''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
|
1320 |
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
|
1321 |
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
|
1322 |
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
|
1323 |
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
|
1324 |
|
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1325 |
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
|
1326 |
'''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
|
1327 |
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
|
1328 |
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
|
1329 |
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
|
1330 |
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
|
1331 |
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
|
1332 |
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
|
1333 |
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
|
1334 |
_rcpath = [] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1335 |
for p in os.environ['HGRCPATH'].split(os.pathsep): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1336 |
if not p: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1337 |
continue |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
1338 |
p = expandpath(p) |
1956
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1339 |
if os.path.isdir(p): |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
1340 |
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
|
1341 |
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
|
1342 |
_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
|
1343 |
else: |
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1344 |
_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
|
1345 |
else: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1346 |
_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
|
1347 |
return _rcpath |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1348 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1349 |
def bytecount(nbytes): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1350 |
'''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
|
1351 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1352 |
units = ( |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1353 |
(100, 1 << 30, _('%.0f GB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1354 |
(10, 1 << 30, _('%.1f GB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1355 |
(1, 1 << 30, _('%.2f GB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1356 |
(100, 1 << 20, _('%.0f MB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1357 |
(10, 1 << 20, _('%.1f MB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1358 |
(1, 1 << 20, _('%.2f MB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1359 |
(100, 1 << 10, _('%.0f KB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1360 |
(10, 1 << 10, _('%.1f KB')), |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1361 |
(1, 1 << 10, _('%.2f KB')), |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1362 |
(1, 1, _('%.0f bytes')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1363 |
) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1364 |
|
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1365 |
for multiplier, divisor, format in units: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1366 |
if nbytes >= divisor * multiplier: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1367 |
return format % (nbytes / float(divisor)) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1368 |
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
|
1369 |
|
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1370 |
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
|
1371 |
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
|
1372 |
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
|
1373 |
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
|
1374 |
if path.startswith('//'): |
9996
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1375 |
if scheme == 'file': |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1376 |
i = path.find('/', 2) |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1377 |
if i == -1: |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1378 |
return '' |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1379 |
# On Windows, absolute paths are rooted at the current drive |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1380 |
# root. On POSIX they are rooted at the file system root. |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1381 |
if os.name == 'nt': |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1382 |
droot = os.path.splitdrive(os.getcwd())[0] + '/' |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1383 |
path = os.path.join(droot, path[i + 1:]) |
9996
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1384 |
else: |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1385 |
path = path[i:] |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1386 |
else: |
2770d03ae49f
handle file URIs correctly, according to RFC 2396 (issue1153)
Sune Foldager <cryo@cyanite.org>
parents:
9732
diff
changeset
|
1387 |
path = path[2:] |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1388 |
return path |
5291
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1389 |
|
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1390 |
def uirepr(s): |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1391 |
# 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
|
1392 |
return repr(s).replace('\\\\', '\\') |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
1393 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1394 |
# delay import of textwrap |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1395 |
def MBTextWrapper(**kwargs): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1396 |
class tw(textwrap.TextWrapper): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1397 |
""" |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1398 |
Extend TextWrapper for double-width characters. |
12957
9f2ac318b92e
util: clarify purpose of MBTextWrapper class
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12938
diff
changeset
|
1399 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1400 |
Some Asian characters use two terminal columns instead of one. |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1401 |
A good example of this behavior can be seen with u'\u65e5\u672c', |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1402 |
the two Japanese characters for "Japan": |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1403 |
len() returns 2, but when printed to a terminal, they eat 4 columns. |
12957
9f2ac318b92e
util: clarify purpose of MBTextWrapper class
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12938
diff
changeset
|
1404 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1405 |
(Note that this has nothing to do whatsoever with unicode |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1406 |
representation, or encoding of the underlying string) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1407 |
""" |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1408 |
def __init__(self, **kwargs): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1409 |
textwrap.TextWrapper.__init__(self, **kwargs) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1410 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1411 |
def _cutdown(self, str, space_left): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1412 |
l = 0 |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1413 |
ucstr = unicode(str, encoding.encoding) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1414 |
colwidth = unicodedata.east_asian_width |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1415 |
for i in xrange(len(ucstr)): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1416 |
l += colwidth(ucstr[i]) in 'WFA' and 2 or 1 |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1417 |
if space_left < l: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1418 |
return (ucstr[:i].encode(encoding.encoding), |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1419 |
ucstr[i:].encode(encoding.encoding)) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1420 |
return str, '' |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1421 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1422 |
# overriding of base class |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1423 |
def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1424 |
space_left = max(width - cur_len, 1) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1425 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1426 |
if self.break_long_words: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1427 |
cut, res = self._cutdown(reversed_chunks[-1], space_left) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1428 |
cur_line.append(cut) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1429 |
reversed_chunks[-1] = res |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1430 |
elif not cur_line: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1431 |
cur_line.append(reversed_chunks.pop()) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1432 |
|
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1433 |
global MBTextWrapper |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1434 |
MBTextWrapper = tw |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
1435 |
return tw(**kwargs) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1436 |
|
12698
7aef77e74cf3
util: make wrap() require a width argument
Matt Mackall <mpm@selenic.com>
parents:
12689
diff
changeset
|
1437 |
def wrap(line, width, initindent='', hangindent=''): |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1438 |
maxindent = max(len(hangindent), len(initindent)) |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1439 |
if width <= maxindent: |
9417
4c3fb45123e5
util, minirst: do not crash with COLUMNS=0
Martin Geisler <mg@lazybytes.net>
parents:
9397
diff
changeset
|
1440 |
# adjust for weird terminal size |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1441 |
width = max(78, maxindent + 1) |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1442 |
wrapper = MBTextWrapper(width=width, |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1443 |
initial_indent=initindent, |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1444 |
subsequent_indent=hangindent) |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
1445 |
return wrapper.fill(line) |
8938
9b8c9266c59d
commands: wrap short descriptions in 'hg help'
Martin Geisler <mg@lazybytes.net>
parents:
8785
diff
changeset
|
1446 |
|
7879
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1447 |
def iterlines(iterator): |
5c4026a289a4
templater: ability to display diffstat for log-like commands
Alexander Solovyov <piranha at piranha.org.ua>
parents:
7875
diff
changeset
|
1448 |
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
|
1449 |
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
|
1450 |
yield line |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
1451 |
|
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
1452 |
def expandpath(path): |
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
1453 |
return os.path.expanduser(os.path.expandvars(path)) |
10239
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1454 |
|
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1455 |
def hgcmd(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1456 |
"""Return the command used to execute current hg |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1457 |
|
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1458 |
This is different from hgexecutable() because on Windows we want |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1459 |
to avoid things opening new shell windows like batch files, so we |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1460 |
get either the python call or current executable. |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1461 |
""" |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1462 |
if main_is_frozen(): |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1463 |
return [sys.executable] |
8e4be44a676f
Find right hg command for detached process
Patrick Mezard <pmezard@gmail.com>
parents:
10199
diff
changeset
|
1464 |
return gethgcmd() |
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1465 |
|
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1466 |
def rundetached(args, condfn): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1467 |
"""Execute the argument list in a detached process. |
10422
600142e7a028
util: fix trailing whitespace found by check-code
Augie Fackler <durin42@gmail.com>
parents:
10344
diff
changeset
|
1468 |
|
10344
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1469 |
condfn is a callable which is called repeatedly and should return |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1470 |
True once the child process is known to have started successfully. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1471 |
At this point, the child process PID is returned. If the child |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1472 |
process fails to start or finishes before condfn() evaluates to |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1473 |
True, return -1. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1474 |
""" |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1475 |
# Windows case is easier because the child process is either |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1476 |
# successfully starting and validating the condition or exiting |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1477 |
# on failure. We just poll on its PID. On Unix, if the child |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1478 |
# process fails to start, it will be left in a zombie state until |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1479 |
# the parent wait on it, which we cannot do since we expect a long |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1480 |
# running process on success. Instead we listen for SIGCHLD telling |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1481 |
# us our child process terminated. |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1482 |
terminated = set() |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1483 |
def handler(signum, frame): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1484 |
terminated.add(os.wait()) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1485 |
prevhandler = None |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1486 |
if hasattr(signal, 'SIGCHLD'): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1487 |
prevhandler = signal.signal(signal.SIGCHLD, handler) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1488 |
try: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1489 |
pid = spawndetached(args) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1490 |
while not condfn(): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1491 |
if ((pid in terminated or not testpid(pid)) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1492 |
and not condfn()): |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1493 |
return -1 |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1494 |
time.sleep(0.1) |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1495 |
return pid |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1496 |
finally: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1497 |
if prevhandler is not None: |
9501cde4c034
util: make spawndetached() handle subprocess early terminations
Patrick Mezard <pmezard@gmail.com>
parents:
10282
diff
changeset
|
1498 |
signal.signal(signal.SIGCHLD, prevhandler) |
10438
e6dc44147234
util: add any() and all() functions for Python 2.4 compatibility
Steve Losh <steve@stevelosh.com>
parents:
10422
diff
changeset
|
1499 |
|
10487
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1500 |
try: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1501 |
any, all = any, all |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1502 |
except NameError: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1503 |
def any(iterable): |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1504 |
for i in iterable: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1505 |
if i: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1506 |
return True |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1507 |
return False |
10438
e6dc44147234
util: add any() and all() functions for Python 2.4 compatibility
Steve Losh <steve@stevelosh.com>
parents:
10422
diff
changeset
|
1508 |
|
10487
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1509 |
def all(iterable): |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1510 |
for i in iterable: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1511 |
if not i: |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1512 |
return False |
7a6b5f85c3ab
util: use the built-in any() and all() methods if they are available
Steve Losh <steve@stevelosh.com>
parents:
10438
diff
changeset
|
1513 |
return True |
11010
18e81d42ee5c
util: fix default termwidth() under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
10901
diff
changeset
|
1514 |
|
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1515 |
def interpolate(prefix, mapping, s, fn=None, escape_prefix=False): |
11988
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1516 |
"""Return the result of interpolating items in the mapping into string s. |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1517 |
|
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1518 |
prefix is a single character string, or a two character string with |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1519 |
a backslash as the first character if the prefix needs to be escaped in |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1520 |
a regular expression. |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1521 |
|
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1522 |
fn is an optional function that will be applied to the replacement text |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1523 |
just before replacement. |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1524 |
|
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1525 |
escape_prefix is an optional flag that allows using doubled prefix for |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1526 |
its escaping. |
11988
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1527 |
""" |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1528 |
fn = fn or (lambda s: s) |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1529 |
patterns = '|'.join(mapping.keys()) |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1530 |
if escape_prefix: |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1531 |
patterns += '|' + prefix |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1532 |
if len(prefix) > 1: |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1533 |
prefix_char = prefix[1:] |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1534 |
else: |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1535 |
prefix_char = prefix |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1536 |
mapping[prefix_char] = prefix_char |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13375
diff
changeset
|
1537 |
r = re.compile(r'%s(%s)' % (prefix, patterns)) |
11988
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1538 |
return r.sub(lambda x: fn(mapping[x.group()[1:]]), s) |
8380ed691df8
util: add an interpolate() function to for replacing multiple values
Steve Losh <steve@stevelosh.com>
parents:
11946
diff
changeset
|
1539 |
|
12076
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1540 |
def getport(port): |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1541 |
"""Return the port for a given network service. |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1542 |
|
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1543 |
If port is an integer, it's returned as is. If it's a string, it's |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1544 |
looked up using socket.getservbyname(). If there's no matching |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1545 |
service, util.Abort is raised. |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1546 |
""" |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1547 |
try: |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1548 |
return int(port) |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1549 |
except ValueError: |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1550 |
pass |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1551 |
|
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1552 |
try: |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1553 |
return socket.getservbyname(port) |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1554 |
except socket.error: |
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
12054
diff
changeset
|
1555 |
raise Abort(_("no port number associated with service '%s'") % port) |
12087
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1556 |
|
12088
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
1557 |
_booleans = {'1': True, 'yes': True, 'true': True, 'on': True, 'always': True, |
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
1558 |
'0': False, 'no': False, 'false': False, 'off': False, |
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
1559 |
'never': False} |
12087
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1560 |
|
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1561 |
def parsebool(s): |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1562 |
"""Parse s into a boolean. |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1563 |
|
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1564 |
If s is not a valid boolean, returns None. |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1565 |
""" |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
1566 |
return _booleans.get(s.lower(), None) |