Mercurial > hg
annotate mercurial/util.py @ 4106:797dbdd4d7e1
git binary patches: don't print the header for identical files
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Sat, 17 Feb 2007 09:55:00 -0200 |
parents | 587c6c652f82 |
children | 49237d6ae97d e817c68edfed |
rev | line source |
---|---|
1082 | 1 """ |
2 util.py - Mercurial utility functions and platform specfic implementations | |
3 | |
4 Copyright 2005 K. Thananchayan <thananck@yahoo.com> | |
2859 | 5 Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> |
6 Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> | |
1082 | 7 |
8 This software may be used and distributed according to the terms | |
9 of the GNU General Public License, incorporated herein by reference. | |
10 | |
11 This contains helper routines that are independent of the SCM core and hide | |
12 platform-specific details from the core. | |
13 """ | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
14 |
1400
cf9a1233738a
i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents:
1399
diff
changeset
|
15 from i18n import gettext as _ |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
16 from demandload import * |
2652
e6a41cbaa260
fix windows username problem.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2612
diff
changeset
|
17 demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile") |
4054
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
18 demandload(globals(), "os threading time calendar ConfigParser locale glob") |
3769 | 19 |
4057
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
20 try: |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
21 _encoding = os.environ.get("HGENCODING") or locale.getpreferredencoding() \ |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
22 or "ascii" |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
23 except locale.Error: |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
24 _encoding = 'ascii' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
25 _encodingmode = os.environ.get("HGENCODINGMODE", "strict") |
3835
d1ce5461beed
Allow the user to specify the fallback encoding for the changelog
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3813
diff
changeset
|
26 _fallbackencoding = 'ISO-8859-1' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
27 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
28 def tolocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
29 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
30 Convert a string from internal UTF-8 to local encoding |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
31 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
32 All internal strings should be UTF-8 but some repos before the |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
33 implementation of locale support may contain latin1 or possibly |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
34 other character sets. We attempt to decode everything strictly |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
35 using UTF-8, then Latin-1, and failing that, we use UTF-8 and |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
36 replace unknown characters. |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
37 """ |
3835
d1ce5461beed
Allow the user to specify the fallback encoding for the changelog
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3813
diff
changeset
|
38 for e in ('UTF-8', _fallbackencoding): |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
39 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
40 u = s.decode(e) # attempt strict decoding |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
41 return u.encode(_encoding, "replace") |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
42 except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
43 raise Abort(_("%s, please check your locale settings") % k) |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
44 except UnicodeDecodeError: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
45 pass |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
46 u = s.decode("utf-8", "replace") # last ditch |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
47 return u.encode(_encoding, "replace") |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
48 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
49 def fromlocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
50 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
51 Convert a string from the local character encoding to UTF-8 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
52 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
53 We attempt to decode strings using the encoding mode set by |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
54 HG_ENCODINGMODE, which defaults to 'strict'. In this mode, unknown |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
55 characters will cause an error message. Other modes include |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
56 'replace', which replaces unknown characters with a special |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
57 Unicode character, and 'ignore', which drops the character. |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
58 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
59 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
60 return s.decode(_encoding, _encodingmode).encode("utf-8") |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
61 except UnicodeDecodeError, inst: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
62 sub = s[max(0, inst.start-10):inst.start+10] |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
63 raise Abort("decoding near '%s': %s!" % (sub, inst)) |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
64 except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
65 raise Abort(_("%s, please check your locale settings") % k) |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
66 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
67 def locallen(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
68 """Find the length in characters of a local string""" |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
69 return len(s.decode(_encoding, "replace")) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
70 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
71 def localsub(s, a, b=None): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
72 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
73 u = s.decode(_encoding, _encodingmode) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
74 if b is not None: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
75 u = u[a:b] |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
76 else: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
77 u = u[:a] |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
78 return u.encode(_encoding, _encodingmode) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
79 except UnicodeDecodeError, inst: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
80 sub = s[max(0, inst.start-10), inst.start+10] |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
81 raise Abort(_("decoding near '%s': %s!\n") % (sub, inst)) |
1258 | 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', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
96 '%b %d %H:%M:%S %Y', |
3812 | 97 '%b %d %I:%M:%S%p %Y', |
98 '%b %d %H:%M:%S', | |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
99 '%b %d %I:%M:%S%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
100 '%b %d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
101 '%b %d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
102 '%b %d %Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
103 '%b %d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
104 '%H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
105 '%I:%M:%SP', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
106 '%H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
107 '%I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
108 ) |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
109 |
3812 | 110 extendeddateformats = defaultdateformats + ( |
111 "%Y", | |
112 "%Y-%m", | |
113 "%b", | |
114 "%b %Y", | |
115 ) | |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
116 |
2153
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
117 class SignalInterrupt(Exception): |
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
118 """Exception raised on SIGTERM and SIGHUP.""" |
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
119 |
3425
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
120 # like SafeConfigParser but with case-sensitive keys |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
121 class configparser(ConfigParser.SafeConfigParser): |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
122 def optionxform(self, optionstr): |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
123 return optionstr |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
124 |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
125 def cachefunc(func): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
126 '''cache the result of function calls''' |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
127 # XXX doesn't handle keywords args |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
128 cache = {} |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
129 if func.func_code.co_argcount == 1: |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
130 # we gain a small amount of time because |
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
131 # 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
|
132 def f(arg): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
133 if arg not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
134 cache[arg] = func(arg) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
135 return cache[arg] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
136 else: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
137 def f(*args): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
138 if args not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
139 cache[args] = func(*args) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
140 return cache[args] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
141 |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
142 return f |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
143 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
144 def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
145 '''filter string S through command CMD, returning its output''' |
1258 | 146 (pout, pin) = popen2.popen2(cmd, -1, 'b') |
147 def writer(): | |
2096
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
148 try: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
149 pin.write(s) |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
150 pin.close() |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
151 except IOError, inst: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
152 if inst.errno != errno.EPIPE: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
153 raise |
1258 | 154 |
155 # we should use select instead on UNIX, but this will work on most | |
156 # systems, including Windows | |
157 w = threading.Thread(target=writer) | |
158 w.start() | |
159 f = pout.read() | |
160 pout.close() | |
161 w.join() | |
162 return f | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
163 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
164 def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
165 '''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
|
166 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
|
167 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
|
168 the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
169 inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
170 try: |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
171 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
|
172 fp = os.fdopen(infd, 'wb') |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
173 fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
174 fp.close() |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
175 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
|
176 os.close(outfd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
177 cmd = cmd.replace('INFILE', inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
178 cmd = cmd.replace('OUTFILE', outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
179 code = os.system(cmd) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
180 if code: raise Abort(_("command '%s' failed: %s") % |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
181 (cmd, explain_exit(code))) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
182 return open(outname, 'rb').read() |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
183 finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
184 try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
185 if inname: os.unlink(inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
186 except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
187 try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
188 if outname: os.unlink(outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
189 except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
190 |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
191 filtertable = { |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
192 'tempfile:': tempfilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
193 'pipe:': pipefilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
194 } |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
195 |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
196 def filter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
197 "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
|
198 for name, fn in filtertable.iteritems(): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
199 if cmd.startswith(name): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
200 return fn(s, cmd[len(name):].lstrip()) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
201 return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
202 |
2071
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
203 def find_in_path(name, path, default=None): |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
204 '''find name in search path. path can be string (will be split |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
205 with os.pathsep), or iterable thing that returns strings. if name |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
206 found, return path to name. else return default.''' |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
207 if isinstance(path, str): |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
208 path = path.split(os.pathsep) |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
209 for p in path: |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
210 p_name = os.path.join(p, name) |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
211 if os.path.exists(p_name): |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
212 return p_name |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
213 return default |
67a0a3852024
import: use gpatch if present on system. patch is broken on solaris.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2064
diff
changeset
|
214 |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
215 def binary(s): |
1082 | 216 """return true if a string is binary data using diff's heuristic""" |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
217 if s and '\0' in s[:4096]: |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
218 return True |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
219 return False |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
220 |
556 | 221 def unique(g): |
1082 | 222 """return the uniq elements of iterable g""" |
556 | 223 seen = {} |
3535
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
224 l = [] |
556 | 225 for f in g: |
226 if f not in seen: | |
227 seen[f] = 1 | |
3535
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
228 l.append(f) |
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
229 return l |
556 | 230 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
231 class Abort(Exception): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
232 """Raised if a command needs to print an error and exit.""" |
508 | 233 |
3564
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3551
diff
changeset
|
234 class UnexpectedOutput(Abort): |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3551
diff
changeset
|
235 """Raised to print an error with part of output and exit.""" |
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3551
diff
changeset
|
236 |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
237 def always(fn): return True |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
238 def never(fn): return False |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
239 |
4054
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
240 def expand_glob(pats): |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
241 '''On Windows, expand the implicit globs in a list of patterns''' |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
242 if os.name != 'nt': |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
243 return list(pats) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
244 ret = [] |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
245 for p in pats: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
246 kind, name = patkind(p, None) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
247 if kind is None: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
248 globbed = glob.glob(name) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
249 if globbed: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
250 ret.extend(globbed) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
251 continue |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
252 # if we couldn't expand the glob, just keep it around |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
253 ret.append(p) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
254 return ret |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
255 |
1563
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
256 def patkind(name, dflt_pat='glob'): |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
257 """Split a string into an optional pattern kind prefix and the |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
258 actual pattern.""" |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
259 for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre': |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
260 if name.startswith(prefix + ':'): return name.split(':', 1) |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
261 return dflt_pat, name |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
262 |
1062 | 263 def globre(pat, head='^', tail='$'): |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
264 "convert a glob pattern into a regexp" |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
265 i, n = 0, len(pat) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
266 res = '' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
267 group = False |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
268 def peek(): return i < n and pat[i] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
269 while i < n: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
270 c = pat[i] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
271 i = i+1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
272 if c == '*': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
273 if peek() == '*': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
274 i += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
275 res += '.*' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
276 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
277 res += '[^/]*' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
278 elif c == '?': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
279 res += '.' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
280 elif c == '[': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
281 j = i |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
282 if j < n and pat[j] in '!]': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
283 j += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
284 while j < n and pat[j] != ']': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
285 j += 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
286 if j >= n: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
287 res += '\\[' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
288 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
289 stuff = pat[i:j].replace('\\','\\\\') |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
290 i = j + 1 |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
291 if stuff[0] == '!': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
292 stuff = '^' + stuff[1:] |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
293 elif stuff[0] == '^': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
294 stuff = '\\' + stuff |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
295 res = '%s[%s]' % (res, stuff) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
296 elif c == '{': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
297 group = True |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
298 res += '(?:' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
299 elif c == '}' and group: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
300 res += ')' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
301 group = False |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
302 elif c == ',' and group: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
303 res += '|' |
1990
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
304 elif c == '\\': |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
305 p = peek() |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
306 if p: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
307 i += 1 |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
308 res += re.escape(p) |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
309 else: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
310 res += re.escape(c) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
311 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
312 res += re.escape(c) |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
313 return head + res + tail |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
314 |
812
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
315 _globchars = {'[': 1, '{': 1, '*': 1, '?': 1} |
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
316 |
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
|
317 def pathto(n1, n2): |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
318 '''return the relative path from one place to another. |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
319 n1 should use os.sep to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
320 n2 should use "/" to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
321 returns an os.sep-separated path. |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
322 ''' |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
323 if not n1: return localpath(n2) |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
324 a, b = n1.split(os.sep), n2.split('/') |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
325 a.reverse() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
326 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
|
327 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
|
328 a.pop() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
329 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
|
330 b.reverse() |
087771ebe2e6
Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents:
878
diff
changeset
|
331 return os.sep.join((['..'] * len(a)) + b) |
087771ebe2e6
Fix walk code for files that do not exist anywhere, and unhandled types.
Bryan O'Sullivan <bos@serpentine.com>
parents:
878
diff
changeset
|
332 |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
333 def canonpath(root, cwd, myname): |
1082 | 334 """return the canonical path of myname, given cwd and root""" |
1566 | 335 if root == os.sep: |
336 rootsep = os.sep | |
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
|
337 elif root.endswith(os.sep): |
90b122730d32
Make it possible to use the root directory as the root of a repository.
Manpreet Singh <junkblocker@yahoo.com>
parents:
2263
diff
changeset
|
338 rootsep = root |
1566 | 339 else: |
1810
7596611ab3d5
Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1635
diff
changeset
|
340 rootsep = root + os.sep |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
341 name = myname |
2090
eb40db373717
fix util.canonpath on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2085
diff
changeset
|
342 if not os.path.isabs(name): |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
343 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
|
344 name = os.path.normpath(name) |
2278
3711e23ab10a
Make hg status work for repositories in root directory on windows (issue 228)
Manpreet Singh <junkblocker@yahoo.com>
parents:
2271
diff
changeset
|
345 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
|
346 name = name[len(rootsep):] |
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
347 audit_path(name) |
df8416346bb7
Enable path validation for copy, rename, debugwalk and other canonpath users.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1958
diff
changeset
|
348 return pconvert(name) |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
349 elif name == root: |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
350 return '' |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
351 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
|
352 # 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
|
353 # 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
|
354 # 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
|
355 # `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
|
356 # 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
|
357 # 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 break |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
365 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
|
366 if not rel: |
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
367 # 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
|
368 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
|
369 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
|
370 name = os.path.join(*rel) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
371 audit_path(name) |
fd77b7ee4aac
Fix issue 165: `hg status' with abs path containing a symlink-to-dir fails
Jim Meyering <list+hg@meyering.net>
parents:
2096
diff
changeset
|
372 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
|
373 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
|
374 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
|
375 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
|
376 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
|
377 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
|
378 |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
379 raise Abort('%s not under root' % myname) |
897 | 380 |
1610
84e9b3484ff6
if hgignore contains errors, print message that is not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1609
diff
changeset
|
381 def matcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', src=None): |
84e9b3484ff6
if hgignore contains errors, print message that is not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1609
diff
changeset
|
382 return _matcher(canonroot, cwd, names, inc, exc, head, 'glob', src) |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
383 |
4055
e37786b29bed
docopy: deal with globs on windows in a better way
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4054
diff
changeset
|
384 def cmdmatcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head='', |
e37786b29bed
docopy: deal with globs on windows in a better way
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4054
diff
changeset
|
385 src=None, globbed=False): |
e37786b29bed
docopy: deal with globs on windows in a better way
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4054
diff
changeset
|
386 if not globbed: |
e37786b29bed
docopy: deal with globs on windows in a better way
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4054
diff
changeset
|
387 names = expand_glob(names) |
4054
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
388 return _matcher(canonroot, cwd, names, inc, exc, head, 'relpath', src) |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
389 |
1610
84e9b3484ff6
if hgignore contains errors, print message that is not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1609
diff
changeset
|
390 def _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src): |
1082 | 391 """build a function to match a set of file patterns |
392 | |
393 arguments: | |
394 canonroot - the canonical root of the tree you're matching against | |
395 cwd - the current working directory, if relevant | |
396 names - patterns to find | |
397 inc - patterns to include | |
398 exc - patterns to exclude | |
399 head - a regex to prepend to patterns to control whether a match is rooted | |
400 | |
401 a pattern is one of: | |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
402 'glob:<rooted glob>' |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
403 're:<rooted regexp>' |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
404 'path:<rooted path>' |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
405 'relglob:<relative glob>' |
1082 | 406 'relpath:<relative path>' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
407 'relre:<relative regexp>' |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
408 '<rooted path or regexp>' |
1082 | 409 |
410 returns: | |
411 a 3-tuple containing | |
412 - list of explicit non-pattern names passed in | |
413 - a bool match(filename) function | |
414 - a bool indicating if any patterns were passed in | |
415 | |
416 todo: | |
417 make head regex a rooted bool | |
418 """ | |
419 | |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
420 def contains_glob(name): |
812
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
421 for c in name: |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
422 if c in _globchars: return True |
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
423 return False |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
424 |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
425 def regex(kind, name, tail): |
742 | 426 '''convert a pattern into a regular expression''' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
427 if kind == 're': |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
428 return name |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
429 elif kind == 'path': |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
430 return '^' + re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
431 elif kind == 'relglob': |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
432 return head + globre(name, '(?:|.*/)', tail) |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
433 elif kind == 'relpath': |
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
434 return head + re.escape(name) + tail |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
435 elif kind == 'relre': |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
436 if name.startswith('^'): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
437 return name |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
438 return '.*' + name |
742 | 439 return head + globre(name, '', tail) |
440 | |
441 def matchfn(pats, tail): | |
442 """build a matching function from a set of patterns""" | |
1454
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
443 if not pats: |
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
444 return |
1446
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
445 matches = [] |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
446 for k, p in pats: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
447 try: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
448 pat = '(?:%s)' % regex(k, p, tail) |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
449 matches.append(re.compile(pat).match) |
1541
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
450 except re.error: |
1611
301d5cd4abc6
make invalid pattern message not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1610
diff
changeset
|
451 if src: raise Abort("%s: invalid pattern (%s): %s" % (src, k, p)) |
301d5cd4abc6
make invalid pattern message not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1610
diff
changeset
|
452 else: raise Abort("invalid pattern (%s): %s" % (k, p)) |
1446
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
453 |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
454 def buildfn(text): |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
455 for m in matches: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
456 r = m(text) |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
457 if r: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
458 return r |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
459 |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
460 return buildfn |
742 | 461 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
462 def globprefix(pat): |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
463 '''return the non-glob prefix of a path, e.g. foo/* -> foo''' |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
464 root = [] |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
465 for p in pat.split(os.sep): |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
466 if contains_glob(p): break |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
467 root.append(p) |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
468 return '/'.join(root) |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
469 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
470 pats = [] |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
471 files = [] |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
472 roots = [] |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
473 for kind, name in [patkind(p, dflt_pat) for p in names]: |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
474 if kind in ('glob', 'relpath'): |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
475 name = canonpath(canonroot, cwd, name) |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
476 if name == '': |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
477 kind, name = 'glob', '**' |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
478 if kind in ('glob', 'path', 're'): |
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
479 pats.append((kind, name)) |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
480 if kind == 'glob': |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
481 root = globprefix(name) |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
482 if root: roots.append(root) |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
483 elif kind == 'relpath': |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
484 files.append((kind, name)) |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
485 roots.append(name) |
897 | 486 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
487 patmatch = matchfn(pats, '$') or always |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
488 filematch = matchfn(files, '(?:/|$)') or always |
897 | 489 incmatch = always |
490 if inc: | |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
491 inckinds = [patkind(canonpath(canonroot, cwd, i)) for i in inc] |
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
492 incmatch = matchfn(inckinds, '(?:/|$)') |
897 | 493 excmatch = lambda fn: False |
494 if exc: | |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
495 exckinds = [patkind(canonpath(canonroot, cwd, x)) for x in exc] |
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
496 excmatch = matchfn(exckinds, '(?:/|$)') |
742 | 497 |
1031
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
498 return (roots, |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
499 lambda fn: (incmatch(fn) and not excmatch(fn) and |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
500 (fn.endswith('/') or |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
501 (not pats and not files) or |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
502 (pats and patmatch(fn)) or |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
503 (files and filematch(fn)))), |
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
504 (inc or exc or (pats and pats != [('glob', '**')])) and True) |
742 | 505 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
506 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None): |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
507 '''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
508 run with environment maybe modified, maybe in different dir. |
508 | 509 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
510 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
|
511 print error message and return status, else raise onerr object as |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
512 exception.''' |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
513 def py2shell(val): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
514 'convert python object into string that is useful to shell' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
515 if val in (None, False): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
516 return '0' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
517 if val == True: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
518 return '1' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
519 return str(val) |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
520 oldenv = {} |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
521 for k in environ: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
522 oldenv[k] = os.environ.get(k) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
523 if cwd is not None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
524 oldcwd = os.getcwd() |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
525 origcmd = cmd |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
526 if os.name == 'nt': |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
527 cmd = '"%s"' % cmd |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
528 try: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
529 for k, v in environ.iteritems(): |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
530 os.environ[k] = py2shell(v) |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
531 if cwd is not None and oldcwd != cwd: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
532 os.chdir(cwd) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
533 rc = os.system(cmd) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
534 if rc and onerr: |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
535 errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]), |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
536 explain_exit(rc)[0]) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
537 if errprefix: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
538 errmsg = '%s: %s' % (errprefix, errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
539 try: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
540 onerr.warn(errmsg + '\n') |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
541 except AttributeError: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
542 raise onerr(errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
543 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
544 finally: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
545 for k, v in oldenv.iteritems(): |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
546 if v is None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
547 del os.environ[k] |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
548 else: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
549 os.environ[k] = v |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
550 if cwd is not None and oldcwd != cwd: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
551 os.chdir(oldcwd) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
552 |
421 | 553 def rename(src, dst): |
1082 | 554 """forcibly rename a file""" |
421 | 555 try: |
556 os.rename(src, dst) | |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
557 except OSError, err: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
558 # on windows, rename to existing file is not allowed, so we |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
559 # must delete destination first. but if file is open, unlink |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
560 # schedules it for delete but does not delete it. rename |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
561 # happens immediately even for open files, so we create |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
562 # temporary file, delete it, rename destination to that name, |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
563 # then delete that. then rename is safe to do. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
564 fd, temp = tempfile.mkstemp(dir=os.path.dirname(dst) or '.') |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
565 os.close(fd) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
566 os.unlink(temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
567 os.rename(dst, temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
568 os.unlink(temp) |
421 | 569 os.rename(src, dst) |
570 | |
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
|
571 def unlink(f): |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1413
diff
changeset
|
572 """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
|
573 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
|
574 # 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
|
575 try: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
576 os.removedirs(os.path.dirname(f)) |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
577 except OSError: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
578 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
|
579 |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
580 def copyfile(src, dest): |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
581 "copy a file, preserving mode" |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
582 try: |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
583 shutil.copyfile(src, dest) |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
584 shutil.copymode(src, dest) |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
585 except shutil.Error, inst: |
4067
c620376b8fd6
Fix wrong module reference in copyfile exception
Andrei Vermel <avermel@mail.ru>
parents:
4057
diff
changeset
|
586 raise Abort(str(inst)) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
587 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
588 def copyfiles(src, dst, hardlink=None): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
589 """Copy a directory tree using hardlinks if possible""" |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
590 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
591 if hardlink is None: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
592 hardlink = (os.stat(src).st_dev == |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
593 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
|
594 |
1207 | 595 if os.path.isdir(src): |
596 os.mkdir(dst) | |
597 for name in os.listdir(src): | |
598 srcname = os.path.join(src, name) | |
599 dstname = os.path.join(dst, name) | |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
600 copyfiles(srcname, dstname, hardlink) |
1207 | 601 else: |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
602 if hardlink: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
603 try: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
604 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
|
605 except (IOError, OSError): |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
606 hardlink = False |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
607 shutil.copy(src, dst) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
608 else: |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
609 shutil.copy(src, dst) |
698
df78d8ccac4c
Use python function instead of external 'cp' command when cloning repos.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
667
diff
changeset
|
610 |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
611 def audit_path(path): |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
612 """Abort if path contains dangerous components""" |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
613 parts = os.path.normcase(path).split(os.sep) |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
614 if (os.path.splitdrive(path)[0] or parts[0] in ('.hg', '') |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
615 or os.pardir in parts): |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
616 raise Abort(_("path contains illegal component: %s\n") % path) |
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
617 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
618 def _makelock_file(info, pathname): |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
619 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
|
620 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
|
621 os.close(ld) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
622 |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
623 def _readlock_file(pathname): |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
624 return posixfile(pathname).read() |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
625 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
626 def nlinks(pathname): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
627 """Return number of hardlinks for the given file.""" |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2314
diff
changeset
|
628 return os.lstat(pathname).st_nlink |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
629 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
630 if hasattr(os, 'link'): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
631 os_link = os.link |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
632 else: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
633 def os_link(src, dst): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
634 raise OSError(0, _("Hardlinks not supported")) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
635 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
636 def fstat(fp): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
637 '''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
|
638 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
639 return os.fstat(fp.fileno()) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
640 except AttributeError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
641 return os.stat(fp.name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
642 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
643 posixfile = file |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
644 |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
645 def is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
646 '''return true if run on windows 95, 98 or me.''' |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
647 try: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
648 return sys.getwindowsversion()[3] == 1 |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
649 except AttributeError: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
650 return os.name == 'nt' and 'command' in os.environ.get('comspec', '') |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
651 |
3721
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
652 getuser_fallback = None |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
653 |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
654 def getuser(): |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
655 '''return name of current user''' |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
656 try: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
657 return getpass.getuser() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
658 except ImportError: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
659 # import of pwd will fail on windows - try fallback |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
660 if getuser_fallback: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
661 return getuser_fallback() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
662 # raised if win32api not available |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
663 raise Abort(_('user name not available - set USERNAME ' |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
664 'environment variable')) |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
665 |
3551
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
666 def username(uid=None): |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
667 """Return the name of the user with the given uid. |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
668 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
669 If uid is None, return the name of the current user.""" |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
670 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
671 import pwd |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
672 if uid is None: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
673 uid = os.getuid() |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
674 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
675 return pwd.getpwuid(uid)[0] |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
676 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
677 return str(uid) |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
678 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
679 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
680 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
681 def groupname(gid=None): |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
682 """Return the name of the group with the given gid. |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
683 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
684 If gid is None, return the name of the current group.""" |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
685 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
686 import grp |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
687 if gid is None: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
688 gid = os.getgid() |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
689 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
690 return grp.getgrgid(gid)[0] |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
691 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
692 return str(gid) |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
693 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
694 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
695 |
3784 | 696 # File system features |
697 | |
698 def checkfolding(path): | |
699 """ | |
700 Check whether the given path is on a case-sensitive filesystem | |
701 | |
702 Requires a path (like /foo/.hg) ending with a foldable final | |
703 directory component. | |
704 """ | |
705 s1 = os.stat(path) | |
706 d, b = os.path.split(path) | |
707 p2 = os.path.join(d, b.upper()) | |
708 if path == p2: | |
709 p2 = os.path.join(d, b.lower()) | |
710 try: | |
711 s2 = os.stat(p2) | |
712 if s2 == s1: | |
713 return False | |
714 return True | |
715 except: | |
716 return True | |
717 | |
1082 | 718 # Platform specific variants |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
719 if os.name == 'nt': |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
720 demandload(globals(), "msvcrt") |
461 | 721 nulldev = 'NUL:' |
1609
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
722 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
723 class winstdout: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
724 '''stdout on windows misbehaves if sent through a pipe''' |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
725 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
726 def __init__(self, fp): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
727 self.fp = fp |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
728 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
729 def __getattr__(self, key): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
730 return getattr(self.fp, key) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
731 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
732 def close(self): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
733 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
734 self.fp.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
735 except: pass |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
736 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
737 def write(self, s): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
738 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
739 return self.fp.write(s) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
740 except IOError, inst: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
741 if inst.errno != 0: raise |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
742 self.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
743 raise IOError(errno.EPIPE, 'Broken pipe') |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
744 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
745 sys.stdout = winstdout(sys.stdout) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
746 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
747 def system_rcpath(): |
2117 | 748 try: |
749 return system_rcpath_win32() | |
750 except: | |
751 return [r'c:\mercurial\mercurial.ini'] | |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
752 |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
753 def 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
|
754 '''return default os-specific hgrc search path''' |
2280
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
755 path = system_rcpath() |
2284
d6392a7c03dd
On win98 os.path.expanuser('~') does not result in a useable directory.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2280
diff
changeset
|
756 path.append(user_rcpath()) |
2280
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
757 userprofile = os.environ.get('USERPROFILE') |
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
758 if userprofile: |
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
759 path.append(os.path.join(userprofile, 'mercurial.ini')) |
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
760 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
761 |
2284
d6392a7c03dd
On win98 os.path.expanuser('~') does not result in a useable directory.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2280
diff
changeset
|
762 def user_rcpath(): |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3669
diff
changeset
|
763 '''return os-specific hgrc search path to the user dir''' |
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3669
diff
changeset
|
764 return os.path.join(os.path.expanduser('~'), 'mercurial.ini') |
2284
d6392a7c03dd
On win98 os.path.expanuser('~') does not result in a useable directory.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2280
diff
changeset
|
765 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
766 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
767 """parses the output produced by patch and returns the file name""" |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
768 pf = output_line[14:] |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
769 if pf[0] == '`': |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
770 pf = pf[1:-1] # Remove the quotes |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
771 return pf |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
772 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
773 def testpid(pid): |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
774 '''return False if pid dead, True if running or not known''' |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
775 return True |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
776 |
441 | 777 def is_exec(f, last): |
778 return last | |
779 | |
780 def set_exec(f, mode): | |
781 pass | |
515 | 782 |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
783 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
784 msvcrt.setmode(fd.fileno(), os.O_BINARY) |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
785 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
786 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
787 return path.replace("\\", "/") |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
788 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
789 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
790 return path.replace('/', '\\') |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
791 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
792 def normpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
793 return pconvert(os.path.normpath(path)) |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
794 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
795 makelock = _makelock_file |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
796 readlock = _readlock_file |
461 | 797 |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
798 def samestat(s1, s2): |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
799 return False |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
800 |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
801 # A sequence of backslashes is special iff it precedes a double quote: |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
802 # - if there's an even number of backslashes, the double quote is not |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
803 # quoted (i.e. it ends the quoted region) |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
804 # - if there's an odd number of backslashes, the double quote is quoted |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
805 # - in both cases, every pair of backslashes is unquoted into a single |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
806 # backslash |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
807 # (See http://msdn2.microsoft.com/en-us/library/a1y7w461.aspx ) |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
808 # So, to quote a string, we must surround it in double quotes, double |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
809 # the number of backslashes that preceed double quotes and add another |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
810 # backslash before every double quote (being careful with the double |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
811 # quote we've appended to the end) |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
812 _quotere = None |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
813 def shellquote(s): |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
814 global _quotere |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
815 if _quotere is None: |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
816 _quotere = re.compile(r'(\\*)("|\\$)') |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
817 return '"%s"' % _quotere.sub(r'\1\1\\\2', s) |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
818 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
819 def explain_exit(code): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
820 return _("exited with status %d") % code, code |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
821 |
3677
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
822 # if you change this stub into a real check, please try to implement the |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
823 # username and groupname functions above, too. |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
824 def isowner(fp, st=None): |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
825 return True |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
826 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
827 try: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
828 # override functions with win32 versions if possible |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
829 from util_win32 import * |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
830 if not is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
831 posixfile = posixfile_nt |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
832 except ImportError: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
833 pass |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
834 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
835 else: |
461 | 836 nulldev = '/dev/null' |
837 | |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
838 def rcfiles(path): |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
839 rcs = [os.path.join(path, 'hgrc')] |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
840 rcdir = os.path.join(path, 'hgrc.d') |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
841 try: |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
842 rcs.extend([os.path.join(rcdir, f) for f in os.listdir(rcdir) |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
843 if f.endswith(".rc")]) |
3131
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
844 except OSError: |
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
845 pass |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
846 return rcs |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
847 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
848 def 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
|
849 '''return default os-specific hgrc search path''' |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
850 path = [] |
2263
2f64cbaa1e92
make reason for sys.argv change obvious in code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2262
diff
changeset
|
851 # old mod_python does not set sys.argv |
2261
20cf545b4725
Check existance of sys.argv for the use from mod_python.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
2237
diff
changeset
|
852 if len(getattr(sys, 'argv', [])) > 0: |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
853 path.extend(rcfiles(os.path.dirname(sys.argv[0]) + |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
854 '/../etc/mercurial')) |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
855 path.extend(rcfiles('/etc/mercurial')) |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
856 path.append(os.path.expanduser('~/.hgrc')) |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
857 path = [os.path.normpath(f) for f in path] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
858 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
859 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
860 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
861 """parses the output produced by patch and returns the file name""" |
1593
6bb3463b124b
if a filename contains spaces, patch adds quote around it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
862 pf = output_line[14:] |
2579
0875cda033fd
use __contains__, index or split instead of str.find
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2546
diff
changeset
|
863 if pf.startswith("'") and pf.endswith("'") and " " in pf: |
1593
6bb3463b124b
if a filename contains spaces, patch adds quote around it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
864 pf = pf[1:-1] # Remove the quotes |
6bb3463b124b
if a filename contains spaces, patch adds quote around it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
865 return pf |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
866 |
441 | 867 def is_exec(f, last): |
1082 | 868 """check whether a file is executable""" |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2314
diff
changeset
|
869 return (os.lstat(f).st_mode & 0100 != 0) |
441 | 870 |
871 def set_exec(f, mode): | |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2314
diff
changeset
|
872 s = os.lstat(f).st_mode |
441 | 873 if (s & 0100 != 0) == mode: |
874 return | |
875 if mode: | |
876 # Turn on +x for every +r bit when making a file executable | |
877 # and obey umask. | |
878 umask = os.umask(0) | |
879 os.umask(umask) | |
880 os.chmod(f, s | (s & 0444) >> 2 & ~umask) | |
881 else: | |
882 os.chmod(f, s & 0666) | |
883 | |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
884 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
885 pass |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
886 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
887 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
888 return path |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
889 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
890 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
891 return path |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
892 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
893 normpath = os.path.normpath |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
894 samestat = os.path.samestat |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
895 |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
896 def makelock(info, pathname): |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
897 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
898 os.symlink(info, pathname) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
899 except OSError, why: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
900 if why.errno == errno.EEXIST: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
901 raise |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
902 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
903 _makelock_file(info, pathname) |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
904 |
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
905 def readlock(pathname): |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
906 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
907 return os.readlink(pathname) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
908 except OSError, why: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
909 if why.errno == errno.EINVAL: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
910 return _readlock_file(pathname) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
911 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
912 raise |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
913 |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
914 def shellquote(s): |
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
915 return "'%s'" % s.replace("'", "'\\''") |
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
916 |
1877
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
917 def testpid(pid): |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
918 '''return False if pid dead, True if running or not sure''' |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
919 try: |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
920 os.kill(pid, 0) |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
921 return True |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
922 except OSError, inst: |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
923 return inst.errno != errno.ESRCH |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
924 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
925 def explain_exit(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
926 """return a 2-tuple (desc, code) describing a process's status""" |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
927 if os.WIFEXITED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
928 val = os.WEXITSTATUS(code) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
929 return _("exited with status %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
930 elif os.WIFSIGNALED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
931 val = os.WTERMSIG(code) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
932 return _("killed by signal %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
933 elif os.WIFSTOPPED(code): |
912
302f83b85054
Minor tweak: os.STOPSIG -> os.WSTOPSIG. Pychecker spotted this one.
mark.williamson@cl.cam.ac.uk
parents:
897
diff
changeset
|
934 val = os.WSTOPSIG(code) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
935 return _("stopped by signal %d") % val, val |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
936 raise ValueError(_("invalid exit code")) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
937 |
3677
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
938 def isowner(fp, st=None): |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
939 """Return True if the file object f belongs to the current user. |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
940 |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
941 The return value of a util.fstat(f) may be passed as the st argument. |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
942 """ |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
943 if st is None: |
3859
8c24b6fd5866
fix errors spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3854
diff
changeset
|
944 st = fstat(fp) |
3677
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
945 return st.st_uid == os.getuid() |
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
946 |
3852
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
947 def _buildencodefun(): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
948 e = '_' |
3860
8e907b86126b
fix reserved char on windows, '[]+' are allowed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3859
diff
changeset
|
949 win_reserved = [ord(x) for x in '\\:*?"<>|'] |
3852
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
950 cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ]) |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
951 for x in (range(32) + range(126, 256) + win_reserved): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
952 cmap[chr(x)] = "~%02x" % x |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
953 for x in range(ord("A"), ord("Z")+1) + [ord(e)]: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
954 cmap[chr(x)] = e + chr(x).lower() |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
955 dmap = {} |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
956 for k, v in cmap.iteritems(): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
957 dmap[v] = k |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
958 def decode(s): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
959 i = 0 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
960 while i < len(s): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
961 for l in xrange(1, 4): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
962 try: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
963 yield dmap[s[i:i+l]] |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
964 i += l |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
965 break |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
966 except KeyError: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
967 pass |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
968 else: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
969 raise KeyError |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
970 return (lambda s: "".join([cmap[c] for c in s]), |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
971 lambda s: "".join(list(decode(s)))) |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
972 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
973 encodefilename, decodefilename = _buildencodefun() |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
974 |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
975 def encodedopener(openerfn, fn): |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
976 def o(path, *args, **kw): |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
977 return openerfn(fn(path), *args, **kw) |
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
978 return o |
3677
1a0fa3914c46
Avoid looking up usernames if the current user owns the .hgrc file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
979 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
980 def opener(base, audit=True): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
981 """ |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
982 return a function that opens files relative to base |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
983 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
984 this function is used to hide the details of COW semantics and |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
985 remote file access from higher level code. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
986 """ |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
987 p = base |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
988 audit_p = audit |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
989 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
990 def mktempcopy(name): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
991 d, fn = os.path.split(name) |
2177 | 992 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
993 os.close(fd) |
2237
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
994 ofp = posixfile(temp, "wb") |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
995 try: |
2220
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
996 try: |
2237
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
997 ifp = posixfile(name, "rb") |
2220
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
998 except IOError, inst: |
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
999 if not getattr(inst, 'filename', None): |
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
1000 inst.filename = name |
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
1001 raise |
2237
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
1002 for chunk in filechunkiter(ifp): |
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
1003 ofp.write(chunk) |
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
1004 ifp.close() |
4a069064a39b
reduce memory used by util.opener when making a temp copy of a file.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2220
diff
changeset
|
1005 ofp.close() |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1006 except: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1007 try: os.unlink(temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1008 except: pass |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1009 raise |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1010 st = os.lstat(name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1011 os.chmod(temp, st.st_mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1012 return temp |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1013 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1014 class atomictempfile(posixfile): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1015 """the file will only be copied when rename is called""" |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1016 def __init__(self, name, mode): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1017 self.__name = name |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1018 self.temp = mktempcopy(name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1019 posixfile.__init__(self, self.temp, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1020 def rename(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1021 if not self.closed: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1022 posixfile.close(self) |
2308
cb520d961d6a
Use platform path for renaming file in util.atomictempfile.rename()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2284
diff
changeset
|
1023 rename(self.temp, localpath(self.__name)) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1024 def __del__(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1025 if not self.closed: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1026 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1027 os.unlink(self.temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1028 except: pass |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1029 posixfile.close(self) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1030 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1031 class atomicfile(atomictempfile): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1032 """the file will only be copied on close""" |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1033 def __init__(self, name, mode): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1034 atomictempfile.__init__(self, name, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1035 def close(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1036 self.rename() |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1037 def __del__(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1038 self.rename() |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1039 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1040 def o(path, mode="r", text=False, atomic=False, atomictemp=False): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1041 if audit_p: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1042 audit_path(path) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1043 f = os.path.join(p, path) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1044 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1045 if not text: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1046 mode += "b" # for that other OS |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1047 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1048 if mode[0] != "r": |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1049 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1050 nlink = nlinks(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1051 except OSError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1052 d = os.path.dirname(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1053 if not os.path.isdir(d): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1054 os.makedirs(d) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1055 else: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1056 if atomic: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1057 return atomicfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1058 elif atomictemp: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1059 return atomictempfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1060 if nlink > 1: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1061 rename(mktempcopy(f), f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1062 return posixfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1063 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1064 return o |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1065 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1066 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
|
1067 """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
|
1068 iterator over chunks of arbitrary size.""" |
1200 | 1069 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1070 def __init__(self, in_iter, targetsize = 2**16): |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1071 """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
|
1072 targetsize is how big a buffer to try to maintain.""" |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1073 self.in_iter = iter(in_iter) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1074 self.buf = '' |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1075 self.targetsize = int(targetsize) |
1200 | 1076 if self.targetsize <= 0: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1077 raise ValueError(_("targetsize must be greater than 0, was %d") % |
1200 | 1078 targetsize) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1079 self.iterempty = False |
1200 | 1080 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1081 def fillbuf(self): |
1200 | 1082 """Ignore target size; read every chunk from iterator until empty.""" |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1083 if not self.iterempty: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1084 collector = cStringIO.StringIO() |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1085 collector.write(self.buf) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1086 for ch in self.in_iter: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1087 collector.write(ch) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1088 self.buf = collector.getvalue() |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1089 self.iterempty = True |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1090 |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1091 def read(self, l): |
1200 | 1092 """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
|
1093 Returns less than L bytes if the iterator runs dry.""" |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1094 if l > len(self.buf) and not self.iterempty: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1095 # Clamp to a multiple of self.targetsize |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1096 targetsize = self.targetsize * ((l // self.targetsize) + 1) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1097 collector = cStringIO.StringIO() |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1098 collector.write(self.buf) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1099 collected = len(self.buf) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1100 for chunk in self.in_iter: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1101 collector.write(chunk) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1102 collected += len(chunk) |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1103 if collected >= targetsize: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1104 break |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1105 if collected < targetsize: |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1106 self.iterempty = True |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1107 self.buf = collector.getvalue() |
1200 | 1108 s, self.buf = self.buf[:l], buffer(self.buf, l) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1109 return s |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1110 |
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1111 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
|
1112 """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
|
1113 (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
|
1114 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
|
1115 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
|
1116 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
|
1117 requested.""" |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1118 assert size >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1119 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
|
1120 while True: |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1121 if limit is None: nbytes = size |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1122 else: nbytes = min(limit, size) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1123 s = nbytes and f.read(nbytes) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1124 if not s: break |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1125 if limit: limit -= len(s) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1126 yield s |
1320
5f277e73778f
Fix up representation of dates in hgweb.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1312
diff
changeset
|
1127 |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1128 def makedate(): |
1482
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1129 lt = time.localtime() |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1130 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
|
1131 tz = time.altzone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1132 else: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1133 tz = time.timezone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1134 return time.mktime(lt), tz |
1329
8f06817bf266
Allow files to be opened in text mode, even on Windows.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1321
diff
changeset
|
1135 |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1136 def datestr(date=None, format='%a %b %d %H:%M:%S %Y', timezone=True): |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1137 """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
|
1138 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
|
1139 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
|
1140 append time zone to string.""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1141 t, tz = date or makedate() |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1142 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
|
1143 if timezone: |
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1144 s += " %+03d%02d" % (-tz / 3600, ((-tz % 3600) / 60)) |
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1145 return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1146 |
3812 | 1147 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
|
1148 """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
|
1149 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
|
1150 def timezone(string): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1151 tz = string.split()[-1] |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1152 if tz[0] in "+-" and len(tz) == 5 and tz[1:].isdigit(): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1153 tz = int(tz) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1154 offset = - 3600 * (tz / 100) - 60 * (tz % 100) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1155 return offset |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1156 if tz == "GMT" or tz == "UTC": |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1157 return 0 |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1158 return None |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1159 |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1160 # NOTE: unixtime = localunixtime + offset |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1161 offset, date = timezone(string), string |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1162 if offset != None: |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1163 date = " ".join(string.split()[:-1]) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1164 |
3812 | 1165 # add missing elements from defaults |
1166 for part in defaults: | |
1167 found = [True for p in part if ("%"+p) in format] | |
1168 if not found: | |
1169 date += "@" + defaults[part] | |
1170 format += "@%" + part[0] | |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1171 |
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1172 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
|
1173 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
|
1174 if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1175 # local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1176 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
|
1177 offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1178 else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1179 unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1180 return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1181 |
3812 | 1182 def parsedate(string, formats=None, defaults=None): |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1183 """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
|
1184 The date may be a "unixtime offset" string or in one of the specified |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1185 formats.""" |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1186 if not string: |
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1187 return 0, 0 |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1188 if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1189 formats = defaultdateformats |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1190 string = string.strip() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1191 try: |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1192 when, offset = map(int, string.split(' ')) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1193 except ValueError: |
3812 | 1194 # fill out defaults |
1195 if not defaults: | |
1196 defaults = {} | |
1197 now = makedate() | |
1198 for part in "d mb yY HI M S".split(): | |
1199 if part not in defaults: | |
1200 if part[0] in "HMS": | |
1201 defaults[part] = "00" | |
1202 elif part[0] in "dm": | |
1203 defaults[part] = "1" | |
1204 else: | |
1205 defaults[part] = datestr(now, "%" + part[0], False) | |
1206 | |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1207 for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1208 try: |
3812 | 1209 when, offset = strdate(string, format, defaults) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1210 except ValueError: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1211 pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1212 else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1213 break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1214 else: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1215 raise Abort(_('invalid date: %r ') % string) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1216 # 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
|
1217 # 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
|
1218 # 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
|
1219 # to UTC+14 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1220 if abs(when) > 0x7fffffff: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1221 raise Abort(_('date exceeds 32 bits: %d') % when) |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1222 if offset < -50400 or offset > 43200: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1223 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
|
1224 return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1225 |
3812 | 1226 def matchdate(date): |
1227 """Return a function that matches a given date match specifier | |
1228 | |
1229 Formats include: | |
1230 | |
1231 '{date}' match a given date to the accuracy provided | |
1232 | |
1233 '<{date}' on or before a given date | |
1234 | |
1235 '>{date}' on or after a given date | |
1236 | |
1237 """ | |
1238 | |
1239 def lower(date): | |
1240 return parsedate(date, extendeddateformats)[0] | |
1241 | |
1242 def upper(date): | |
1243 d = dict(mb="12", HI="23", M="59", S="59") | |
1244 for days in "31 30 29".split(): | |
1245 try: | |
1246 d["d"] = days | |
1247 return parsedate(date, extendeddateformats, d)[0] | |
1248 except: | |
1249 pass | |
1250 d["d"] = "28" | |
1251 return parsedate(date, extendeddateformats, d)[0] | |
1252 | |
1253 if date[0] == "<": | |
1254 when = upper(date[1:]) | |
1255 return lambda x: x <= when | |
1256 elif date[0] == ">": | |
1257 when = lower(date[1:]) | |
1258 return lambda x: x >= when | |
1259 elif date[0] == "-": | |
1260 try: | |
1261 days = int(date[1:]) | |
1262 except ValueError: | |
1263 raise Abort(_("invalid day spec: %s") % date[1:]) | |
1264 when = makedate()[0] - days * 3600 * 24 | |
3813 | 1265 return lambda x: x >= when |
3812 | 1266 elif " to " in date: |
1267 a, b = date.split(" to ") | |
1268 start, stop = lower(a), upper(b) | |
1269 return lambda x: x >= start and x <= stop | |
1270 else: | |
1271 start, stop = lower(date), upper(date) | |
1272 return lambda x: x >= start and x <= stop | |
1273 | |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1274 def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1275 """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
|
1276 f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1277 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1278 user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1279 f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1280 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1281 user = user[f+1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1282 f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1283 if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1284 user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1285 f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1286 if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1287 user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1288 return user |
1920 | 1289 |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1290 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
|
1291 """Trim string to at most maxlength (default: 400) characters.""" |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1292 if len(text) <= maxlength: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1293 return text |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1294 else: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1295 return "%s..." % (text[:maxlength-3]) |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1296 |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1297 def walkrepos(path): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1298 '''yield every hg repository under path, recursively.''' |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1299 def errhandler(err): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1300 if err.filename == path: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1301 raise err |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1302 |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1303 for root, dirs, files in os.walk(path, onerror=errhandler): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1304 for d in dirs: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1305 if d == '.hg': |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1306 yield root |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1307 dirs[:] = [] |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1308 break |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1309 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1310 _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
|
1311 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1312 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
|
1313 '''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
|
1314 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
|
1315 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
|
1316 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
|
1317 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
|
1318 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
|
1319 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
|
1320 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
|
1321 _rcpath = [] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1322 for p in os.environ['HGRCPATH'].split(os.pathsep): |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1323 if not p: continue |
1956
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1324 if os.path.isdir(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
|
1325 for f in os.listdir(p): |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1326 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
|
1327 _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
|
1328 else: |
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1329 _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
|
1330 else: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1331 _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
|
1332 return _rcpath |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1333 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1334 def bytecount(nbytes): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1335 '''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
|
1336 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1337 units = ( |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1338 (100, 1<<30, _('%.0f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1339 (10, 1<<30, _('%.1f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1340 (1, 1<<30, _('%.2f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1341 (100, 1<<20, _('%.0f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1342 (10, 1<<20, _('%.1f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1343 (1, 1<<20, _('%.2f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1344 (100, 1<<10, _('%.0f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1345 (10, 1<<10, _('%.1f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1346 (1, 1<<10, _('%.2f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1347 (1, 1, _('%.0f bytes')), |
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 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1350 for multiplier, divisor, format in units: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1351 if nbytes >= divisor * multiplier: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1352 return format % (nbytes / float(divisor)) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1353 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
|
1354 |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1355 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
|
1356 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
|
1357 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
|
1358 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
|
1359 if path.startswith('//'): |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1360 path = path[2:] |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1361 return path |