Mercurial > public > mercurial-scm > hg
annotate mercurial/util.py @ 4195:e8ee8fdeddb1
change locate to use relglobs by default
This makes its default behaviour useful again (issue108), and
changes it search the entire repository by default (instead
of just the cwd), just like all other commands.
It also hides issue204 by default, but you'll still see the
same behaviour if you give it a relpath: pattern.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Sat, 10 Mar 2007 23:00:57 -0300 |
parents | dd0d9bd91e0a |
children | 492d0d5b6976 |
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 |
4190
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
381 def matcher(canonroot, cwd='', names=[], inc=[], exc=[], head='', src=None): |
1610
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 |
4190
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
384 def cmdmatcher(canonroot, cwd='', names=[], inc=[], exc=[], head='', |
4195
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
385 src=None, globbed=False, default=None): |
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
386 default = default or 'relpath' |
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
387 if default == 'relpath' and not globbed: |
4055
e37786b29bed
docopy: deal with globs on windows in a better way
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4054
diff
changeset
|
388 names = expand_glob(names) |
4195
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
389 return _matcher(canonroot, cwd, names, inc, exc, head, default, src) |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
390 |
1610
84e9b3484ff6
if hgignore contains errors, print message that is not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1609
diff
changeset
|
391 def _matcher(canonroot, cwd, names, inc, exc, head, dflt_pat, src): |
1082 | 392 """build a function to match a set of file patterns |
393 | |
394 arguments: | |
395 canonroot - the canonical root of the tree you're matching against | |
396 cwd - the current working directory, if relevant | |
397 names - patterns to find | |
398 inc - patterns to include | |
399 exc - patterns to exclude | |
400 head - a regex to prepend to patterns to control whether a match is rooted | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
401 dflt_pat - if a pattern in names has no explicit type, assume this one |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
402 src - where these patterns came from (e.g. .hgignore) |
1082 | 403 |
404 a pattern is one of: | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
405 'glob:<glob>' - a glob relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
406 're:<regexp>' - a regular expression |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
407 'path:<path>' - a path relative to canonroot |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
408 'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs) |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
409 'relpath:<path>' - a path relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
410 'relre:<regexp>' - a regexp that doesn't have to match the start of a name |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
411 '<something>' - one of the cases above, selected by the dflt_pat argument |
1082 | 412 |
413 returns: | |
414 a 3-tuple containing | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
415 - list of roots (places where one should start a recursive walk of the fs); |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
416 this often matches the explicit non-pattern names passed in, but also |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
417 includes the initial part of glob: patterns that has no glob characters |
1082 | 418 - a bool match(filename) function |
419 - a bool indicating if any patterns were passed in | |
420 | |
421 todo: | |
422 make head regex a rooted bool | |
423 """ | |
424 | |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
425 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
|
426 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
|
427 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
|
428 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
|
429 |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
430 def regex(kind, name, tail): |
742 | 431 '''convert a pattern into a regular expression''' |
4190
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
432 if not name: |
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
433 return '' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
434 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
|
435 return name |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
436 elif kind == 'path': |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
437 return '^' + re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
438 elif kind == 'relglob': |
4188
ce3ecf99a18b
util._matcher: fix handling of relglob: patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4187
diff
changeset
|
439 return head + globre(name, '(?:|.*/)', '(?:/|$)') |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
440 elif kind == 'relpath': |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
441 return head + re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
442 elif kind == 'relre': |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
443 if name.startswith('^'): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
444 return name |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
445 return '.*' + name |
742 | 446 return head + globre(name, '', tail) |
447 | |
448 def matchfn(pats, tail): | |
449 """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
|
450 if not pats: |
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
451 return |
1446
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
452 matches = [] |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
453 for k, p in pats: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
454 try: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
455 pat = '(?:%s)' % regex(k, p, tail) |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
456 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
|
457 except re.error: |
1611
301d5cd4abc6
make invalid pattern message not confusing.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1610
diff
changeset
|
458 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
|
459 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
|
460 |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
461 def buildfn(text): |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
462 for m in matches: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
463 r = m(text) |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
464 if r: |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
465 return r |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
466 |
4babaa52badf
abort on invalid pattern in matcher
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1420
diff
changeset
|
467 return buildfn |
742 | 468 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
469 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
|
470 '''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
|
471 root = [] |
4183
6f9474044736
small globprefix fix
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
472 for p in pat.split('/'): |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
473 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
|
474 root.append(p) |
4187
01c4ea5e788c
A 'glob:foo?bar' pattern determines a root - the tree root
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4185
diff
changeset
|
475 return '/'.join(root) or '.' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
476 |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
477 def normalizepats(names, default): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
478 pats = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
479 files = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
480 roots = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
481 anypats = False |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
482 for kind, name in [patkind(p, default) for p in names]: |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
483 if kind in ('glob', 'relpath'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
484 name = canonpath(canonroot, cwd, name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
485 elif kind in ('relglob', 'path'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
486 name = normpath(name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
487 if kind in ('glob', 're', 'relglob', 'relre'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
488 pats.append((kind, name)) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
489 anypats = True |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
490 if kind == 'glob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
491 root = globprefix(name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
492 roots.append(root) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
493 elif kind in ('relpath', 'path'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
494 files.append((kind, name)) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
495 roots.append(name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
496 elif kind == 'relglob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
497 roots.append('.') |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
498 return roots, pats + files, anypats |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
499 |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
500 roots, pats, anypats = normalizepats(names, dflt_pat) |
897 | 501 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
502 patmatch = matchfn(pats, '$') or always |
897 | 503 incmatch = always |
504 if inc: | |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
505 dummy, inckinds, dummy = normalizepats(inc, 'glob') |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
506 incmatch = matchfn(inckinds, '(?:/|$)') |
897 | 507 excmatch = lambda fn: False |
508 if exc: | |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
509 dummy, exckinds, dummy = normalizepats(exc, 'glob') |
2480
519a1011db91
fix -I/-X when relative paths used or in subdir
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2471
diff
changeset
|
510 excmatch = matchfn(exckinds, '(?:/|$)') |
742 | 511 |
1031
503aaf19a040
Rewrite log command. New version is faster and more featureful.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1015
diff
changeset
|
512 return (roots, |
4193
dd0d9bd91e0a
dirstate.statwalk: explicitly test for ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4192
diff
changeset
|
513 lambda fn: (incmatch(fn) and not excmatch(fn) and patmatch(fn)), |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
514 (inc or exc or anypats) and True) |
742 | 515 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
516 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
|
517 '''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
518 run with environment maybe modified, maybe in different dir. |
508 | 519 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
520 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
|
521 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
|
522 exception.''' |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
523 def py2shell(val): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
524 '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
|
525 if val in (None, False): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
526 return '0' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
527 if val == True: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
528 return '1' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
529 return str(val) |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
530 oldenv = {} |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
531 for k in environ: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
532 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
|
533 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
|
534 oldcwd = os.getcwd() |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
535 origcmd = cmd |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
536 if os.name == 'nt': |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
537 cmd = '"%s"' % cmd |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
538 try: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
539 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
|
540 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
|
541 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
|
542 os.chdir(cwd) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
543 rc = os.system(cmd) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
544 if rc and onerr: |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
545 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
|
546 explain_exit(rc)[0]) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
547 if errprefix: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
548 errmsg = '%s: %s' % (errprefix, errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
549 try: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
550 onerr.warn(errmsg + '\n') |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
551 except AttributeError: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
552 raise onerr(errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
553 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
554 finally: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
555 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
|
556 if v is None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
557 del os.environ[k] |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
558 else: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
559 os.environ[k] = v |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
560 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
|
561 os.chdir(oldcwd) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
562 |
421 | 563 def rename(src, dst): |
1082 | 564 """forcibly rename a file""" |
421 | 565 try: |
566 os.rename(src, dst) | |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
567 except OSError, err: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
568 # 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
|
569 # 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
|
570 # 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
|
571 # 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
|
572 # 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
|
573 # 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
|
574 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
|
575 os.close(fd) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
576 os.unlink(temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
577 os.rename(dst, temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
578 os.unlink(temp) |
421 | 579 os.rename(src, dst) |
580 | |
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
|
581 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
|
582 """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
|
583 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
|
584 # 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
|
585 try: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
586 os.removedirs(os.path.dirname(f)) |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
587 except OSError: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
588 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
|
589 |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
590 def copyfile(src, dest): |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
591 "copy a file, preserving mode" |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
592 try: |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
593 shutil.copyfile(src, dest) |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
594 shutil.copymode(src, dest) |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
595 except shutil.Error, inst: |
4067
c620376b8fd6
Fix wrong module reference in copyfile exception
Andrei Vermel <avermel@mail.ru>
parents:
4057
diff
changeset
|
596 raise Abort(str(inst)) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
597 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
598 def copyfiles(src, dst, hardlink=None): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
599 """Copy a directory tree using hardlinks if possible""" |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
600 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
601 if hardlink is None: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
602 hardlink = (os.stat(src).st_dev == |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
603 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
|
604 |
1207 | 605 if os.path.isdir(src): |
606 os.mkdir(dst) | |
607 for name in os.listdir(src): | |
608 srcname = os.path.join(src, name) | |
609 dstname = os.path.join(dst, name) | |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
610 copyfiles(srcname, dstname, hardlink) |
1207 | 611 else: |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
612 if hardlink: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
613 try: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
614 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
|
615 except (IOError, OSError): |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
616 hardlink = False |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
617 shutil.copy(src, dst) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
618 else: |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
619 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
|
620 |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
621 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
|
622 """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
|
623 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
|
624 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
|
625 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
|
626 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
|
627 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
628 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
|
629 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
|
630 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
|
631 os.close(ld) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
632 |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
633 def _readlock_file(pathname): |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
634 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
|
635 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
636 def nlinks(pathname): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
637 """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
|
638 return os.lstat(pathname).st_nlink |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
639 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
640 if hasattr(os, 'link'): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
641 os_link = os.link |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
642 else: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
643 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
|
644 raise OSError(0, _("Hardlinks not supported")) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
645 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
646 def fstat(fp): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
647 '''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
|
648 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
649 return os.fstat(fp.fileno()) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
650 except AttributeError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
651 return os.stat(fp.name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
652 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
653 posixfile = file |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
654 |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
655 def is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
656 '''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
|
657 try: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
658 return sys.getwindowsversion()[3] == 1 |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
659 except AttributeError: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
660 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
|
661 |
3721
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
662 getuser_fallback = None |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
663 |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
664 def getuser(): |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
665 '''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
|
666 try: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
667 return getpass.getuser() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
668 except ImportError: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
669 # 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
|
670 if getuser_fallback: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
671 return getuser_fallback() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
672 # 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
|
673 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
|
674 'environment variable')) |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
675 |
3551
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
676 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
|
677 """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
|
678 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
679 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
|
680 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
681 import pwd |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
682 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
|
683 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
|
684 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
685 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
|
686 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
687 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
|
688 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
689 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
690 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
691 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
|
692 """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
|
693 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
694 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
|
695 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
696 import grp |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
697 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
|
698 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
|
699 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
700 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
|
701 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
702 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
|
703 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
704 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
705 |
3784 | 706 # File system features |
707 | |
708 def checkfolding(path): | |
709 """ | |
710 Check whether the given path is on a case-sensitive filesystem | |
711 | |
712 Requires a path (like /foo/.hg) ending with a foldable final | |
713 directory component. | |
714 """ | |
715 s1 = os.stat(path) | |
716 d, b = os.path.split(path) | |
717 p2 = os.path.join(d, b.upper()) | |
718 if path == p2: | |
719 p2 = os.path.join(d, b.lower()) | |
720 try: | |
721 s2 = os.stat(p2) | |
722 if s2 == s1: | |
723 return False | |
724 return True | |
725 except: | |
726 return True | |
727 | |
1082 | 728 # Platform specific variants |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
729 if os.name == 'nt': |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
730 demandload(globals(), "msvcrt") |
461 | 731 nulldev = 'NUL:' |
1609
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
732 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
733 class winstdout: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
734 '''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
|
735 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
736 def __init__(self, fp): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
737 self.fp = fp |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
738 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
739 def __getattr__(self, key): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
740 return getattr(self.fp, key) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
741 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
742 def close(self): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
743 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
744 self.fp.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
745 except: pass |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
746 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
747 def write(self, s): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
748 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
749 return self.fp.write(s) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
750 except IOError, inst: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
751 if inst.errno != 0: raise |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
752 self.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
753 raise IOError(errno.EPIPE, 'Broken pipe') |
4129
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
754 |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
755 def flush(self): |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
756 try: |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
757 return self.fp.flush() |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
758 except IOError, inst: |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
759 if inst.errno != errno.EINVAL: raise |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
760 self.close() |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
761 raise IOError(errno.EPIPE, 'Broken pipe') |
1609
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
762 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
763 sys.stdout = winstdout(sys.stdout) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
764 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
765 def system_rcpath(): |
2117 | 766 try: |
767 return system_rcpath_win32() | |
768 except: | |
769 return [r'c:\mercurial\mercurial.ini'] | |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
770 |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
771 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
|
772 '''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
|
773 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
|
774 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
|
775 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
|
776 if userprofile: |
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
777 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
|
778 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
779 |
2284
d6392a7c03dd
On win98 os.path.expanuser('~') does not result in a useable directory.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
2280
diff
changeset
|
780 def user_rcpath(): |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3669
diff
changeset
|
781 '''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
|
782 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
|
783 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
784 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
785 """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
|
786 pf = output_line[14:] |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
787 if pf[0] == '`': |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
788 pf = pf[1:-1] # Remove the quotes |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
789 return pf |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
790 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
791 def testpid(pid): |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
792 '''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
|
793 return True |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
794 |
441 | 795 def is_exec(f, last): |
796 return last | |
797 | |
798 def set_exec(f, mode): | |
799 pass | |
515 | 800 |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
801 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
802 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
|
803 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
804 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
805 return path.replace("\\", "/") |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
806 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
807 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
808 return path.replace('/', '\\') |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
809 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
810 def normpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
811 return pconvert(os.path.normpath(path)) |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
812 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
813 makelock = _makelock_file |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
814 readlock = _readlock_file |
461 | 815 |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
816 def samestat(s1, s2): |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
817 return False |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
818 |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
819 # 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
|
820 # - 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
|
821 # 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
|
822 # - 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
|
823 # - 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
|
824 # backslash |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
825 # (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
|
826 # 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
|
827 # 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
|
828 # 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
|
829 # 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
|
830 _quotere = None |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
831 def shellquote(s): |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
832 global _quotere |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
833 if _quotere is None: |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
834 _quotere = re.compile(r'(\\*)("|\\$)') |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
835 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
|
836 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
837 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
|
838 return _("exited with status %d") % code, code |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
839 |
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
|
840 # 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
|
841 # 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
|
842 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
|
843 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
|
844 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
845 try: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
846 # override functions with win32 versions if possible |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
847 from util_win32 import * |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
848 if not is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
849 posixfile = posixfile_nt |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
850 except ImportError: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
851 pass |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
852 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
853 else: |
461 | 854 nulldev = '/dev/null' |
855 | |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
856 def rcfiles(path): |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
857 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
|
858 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
|
859 try: |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
860 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
|
861 if f.endswith(".rc")]) |
3131
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
862 except OSError: |
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
863 pass |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
864 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
|
865 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
866 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
|
867 '''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
|
868 path = [] |
2263
2f64cbaa1e92
make reason for sys.argv change obvious in code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2262
diff
changeset
|
869 # 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
|
870 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
|
871 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
|
872 '/../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
|
873 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
|
874 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
|
875 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
|
876 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
877 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
878 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
879 """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
|
880 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
|
881 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
|
882 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
|
883 return pf |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
884 |
441 | 885 def is_exec(f, last): |
1082 | 886 """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
|
887 return (os.lstat(f).st_mode & 0100 != 0) |
441 | 888 |
889 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
|
890 s = os.lstat(f).st_mode |
441 | 891 if (s & 0100 != 0) == mode: |
892 return | |
893 if mode: | |
894 # Turn on +x for every +r bit when making a file executable | |
895 # and obey umask. | |
896 umask = os.umask(0) | |
897 os.umask(umask) | |
898 os.chmod(f, s | (s & 0444) >> 2 & ~umask) | |
899 else: | |
900 os.chmod(f, s & 0666) | |
901 | |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
902 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
903 pass |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
904 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
905 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
906 return path |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
907 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
908 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
909 return path |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
910 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
911 normpath = os.path.normpath |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
912 samestat = os.path.samestat |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
913 |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
914 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
|
915 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
916 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
|
917 except OSError, why: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
918 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
|
919 raise |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
920 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
921 _makelock_file(info, pathname) |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
922 |
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
923 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
|
924 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
925 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
|
926 except OSError, why: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
927 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
|
928 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
|
929 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
930 raise |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
931 |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
932 def shellquote(s): |
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
933 return "'%s'" % s.replace("'", "'\\''") |
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
934 |
1877
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
935 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
|
936 '''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
|
937 try: |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
938 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
|
939 return True |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
940 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
|
941 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
|
942 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
943 def explain_exit(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
944 """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
|
945 if os.WIFEXITED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
946 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
|
947 return _("exited with status %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
948 elif os.WIFSIGNALED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
949 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
|
950 return _("killed by signal %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
951 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
|
952 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
|
953 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
|
954 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
|
955 |
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
|
956 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
|
957 """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
|
958 |
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
|
959 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
|
960 """ |
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
|
961 if st is None: |
3859
8c24b6fd5866
fix errors spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3854
diff
changeset
|
962 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
|
963 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
|
964 |
3852
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
965 def _buildencodefun(): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
966 e = '_' |
3860
8e907b86126b
fix reserved char on windows, '[]+' are allowed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3859
diff
changeset
|
967 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
|
968 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
|
969 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
|
970 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
|
971 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
|
972 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
|
973 dmap = {} |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
974 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
|
975 dmap[v] = k |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
976 def decode(s): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
977 i = 0 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
978 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
|
979 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
|
980 try: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
981 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
|
982 i += l |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
983 break |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
984 except KeyError: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
985 pass |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
986 else: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
987 raise KeyError |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
988 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
|
989 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
|
990 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
991 encodefilename, decodefilename = _buildencodefun() |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
992 |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
993 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
|
994 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
|
995 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
|
996 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
|
997 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
998 def opener(base, audit=True): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
999 """ |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1000 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
|
1001 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1002 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
|
1003 remote file access from higher level code. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1004 """ |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1005 p = base |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1006 audit_p = audit |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1007 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1008 def mktempcopy(name): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1009 d, fn = os.path.split(name) |
2177 | 1010 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
|
1011 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
|
1012 ofp = posixfile(temp, "wb") |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1013 try: |
2220
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
1014 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
|
1015 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
|
1016 except IOError, inst: |
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
1017 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
|
1018 inst.filename = name |
6d3cc2a982f3
add filename to IOError if read of file fails.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2193
diff
changeset
|
1019 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
|
1020 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
|
1021 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
|
1022 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
|
1023 ofp.close() |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1024 except: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1025 try: os.unlink(temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1026 except: pass |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1027 raise |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1028 st = os.lstat(name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1029 os.chmod(temp, st.st_mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1030 return temp |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1031 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1032 class atomictempfile(posixfile): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1033 """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
|
1034 def __init__(self, name, mode): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1035 self.__name = name |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1036 self.temp = mktempcopy(name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1037 posixfile.__init__(self, self.temp, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1038 def rename(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1039 if not self.closed: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1040 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
|
1041 rename(self.temp, localpath(self.__name)) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1042 def __del__(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1043 if not self.closed: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1044 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1045 os.unlink(self.temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1046 except: pass |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1047 posixfile.close(self) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1048 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1049 class atomicfile(atomictempfile): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1050 """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
|
1051 def __init__(self, name, mode): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1052 atomictempfile.__init__(self, name, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1053 def close(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1054 self.rename() |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1055 def __del__(self): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1056 self.rename() |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1057 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1058 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
|
1059 if audit_p: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1060 audit_path(path) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1061 f = os.path.join(p, path) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1062 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1063 if not text: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1064 mode += "b" # for that other OS |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1065 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1066 if mode[0] != "r": |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1067 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1068 nlink = nlinks(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1069 except OSError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1070 d = os.path.dirname(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1071 if not os.path.isdir(d): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1072 os.makedirs(d) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1073 else: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1074 if atomic: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1075 return atomicfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1076 elif atomictemp: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1077 return atomictempfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1078 if nlink > 1: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1079 rename(mktempcopy(f), f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1080 return posixfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1081 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1082 return o |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1083 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1084 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
|
1085 """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
|
1086 iterator over chunks of arbitrary size.""" |
1200 | 1087 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1088 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
|
1089 """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
|
1090 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
|
1091 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
|
1092 self.buf = '' |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1093 self.targetsize = int(targetsize) |
1200 | 1094 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
|
1095 raise ValueError(_("targetsize must be greater than 0, was %d") % |
1200 | 1096 targetsize) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1097 self.iterempty = False |
1200 | 1098 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1099 def fillbuf(self): |
1200 | 1100 """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
|
1101 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
|
1102 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
|
1103 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
|
1104 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
|
1105 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
|
1106 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
|
1107 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
|
1108 |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1109 def read(self, l): |
1200 | 1110 """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
|
1111 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
|
1112 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
|
1113 # 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
|
1114 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
|
1115 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
|
1116 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
|
1117 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
|
1118 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
|
1119 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
|
1120 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
|
1121 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
|
1122 break |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1123 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
|
1124 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
|
1125 self.buf = collector.getvalue() |
1200 | 1126 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
|
1127 return s |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1128 |
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1129 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
|
1130 """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
|
1131 (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
|
1132 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
|
1133 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
|
1134 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
|
1135 requested.""" |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1136 assert size >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1137 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
|
1138 while True: |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1139 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
|
1140 else: nbytes = min(limit, size) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1141 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
|
1142 if not s: break |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1143 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
|
1144 yield s |
1320
5f277e73778f
Fix up representation of dates in hgweb.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1312
diff
changeset
|
1145 |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1146 def makedate(): |
1482
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1147 lt = time.localtime() |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1148 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
|
1149 tz = time.altzone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1150 else: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1151 tz = time.timezone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1152 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
|
1153 |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1154 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
|
1155 """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
|
1156 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
|
1157 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
|
1158 append time zone to string.""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1159 t, tz = date or makedate() |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1160 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
|
1161 if timezone: |
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1162 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
|
1163 return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1164 |
3812 | 1165 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
|
1166 """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
|
1167 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
|
1168 def timezone(string): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1169 tz = string.split()[-1] |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1170 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
|
1171 tz = int(tz) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1172 offset = - 3600 * (tz / 100) - 60 * (tz % 100) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1173 return offset |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1174 if tz == "GMT" or tz == "UTC": |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1175 return 0 |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1176 return None |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1177 |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1178 # NOTE: unixtime = localunixtime + offset |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1179 offset, date = timezone(string), string |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1180 if offset != None: |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1181 date = " ".join(string.split()[:-1]) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1182 |
3812 | 1183 # add missing elements from defaults |
1184 for part in defaults: | |
1185 found = [True for p in part if ("%"+p) in format] | |
1186 if not found: | |
1187 date += "@" + defaults[part] | |
1188 format += "@%" + part[0] | |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1189 |
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1190 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
|
1191 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
|
1192 if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1193 # local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1194 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
|
1195 offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1196 else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1197 unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1198 return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1199 |
3812 | 1200 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
|
1201 """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
|
1202 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
|
1203 formats.""" |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1204 if not string: |
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1205 return 0, 0 |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1206 if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1207 formats = defaultdateformats |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1208 string = string.strip() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1209 try: |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1210 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
|
1211 except ValueError: |
3812 | 1212 # fill out defaults |
1213 if not defaults: | |
1214 defaults = {} | |
1215 now = makedate() | |
1216 for part in "d mb yY HI M S".split(): | |
1217 if part not in defaults: | |
1218 if part[0] in "HMS": | |
1219 defaults[part] = "00" | |
1220 elif part[0] in "dm": | |
1221 defaults[part] = "1" | |
1222 else: | |
1223 defaults[part] = datestr(now, "%" + part[0], False) | |
1224 | |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1225 for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1226 try: |
3812 | 1227 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
|
1228 except ValueError: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1229 pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1230 else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1231 break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1232 else: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1233 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
|
1234 # 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
|
1235 # 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
|
1236 # 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
|
1237 # to UTC+14 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1238 if abs(when) > 0x7fffffff: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1239 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
|
1240 if offset < -50400 or offset > 43200: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1241 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
|
1242 return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1243 |
3812 | 1244 def matchdate(date): |
1245 """Return a function that matches a given date match specifier | |
1246 | |
1247 Formats include: | |
1248 | |
1249 '{date}' match a given date to the accuracy provided | |
1250 | |
1251 '<{date}' on or before a given date | |
1252 | |
1253 '>{date}' on or after a given date | |
1254 | |
1255 """ | |
1256 | |
1257 def lower(date): | |
1258 return parsedate(date, extendeddateformats)[0] | |
1259 | |
1260 def upper(date): | |
1261 d = dict(mb="12", HI="23", M="59", S="59") | |
1262 for days in "31 30 29".split(): | |
1263 try: | |
1264 d["d"] = days | |
1265 return parsedate(date, extendeddateformats, d)[0] | |
1266 except: | |
1267 pass | |
1268 d["d"] = "28" | |
1269 return parsedate(date, extendeddateformats, d)[0] | |
1270 | |
1271 if date[0] == "<": | |
1272 when = upper(date[1:]) | |
1273 return lambda x: x <= when | |
1274 elif date[0] == ">": | |
1275 when = lower(date[1:]) | |
1276 return lambda x: x >= when | |
1277 elif date[0] == "-": | |
1278 try: | |
1279 days = int(date[1:]) | |
1280 except ValueError: | |
1281 raise Abort(_("invalid day spec: %s") % date[1:]) | |
1282 when = makedate()[0] - days * 3600 * 24 | |
3813 | 1283 return lambda x: x >= when |
3812 | 1284 elif " to " in date: |
1285 a, b = date.split(" to ") | |
1286 start, stop = lower(a), upper(b) | |
1287 return lambda x: x >= start and x <= stop | |
1288 else: | |
1289 start, stop = lower(date), upper(date) | |
1290 return lambda x: x >= start and x <= stop | |
1291 | |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1292 def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1293 """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
|
1294 f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1295 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1296 user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1297 f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1298 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1299 user = user[f+1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1300 f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1301 if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1302 user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1303 f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1304 if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1305 user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1306 return user |
1920 | 1307 |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1308 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
|
1309 """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
|
1310 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
|
1311 return text |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1312 else: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1313 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
|
1314 |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1315 def walkrepos(path): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1316 '''yield every hg repository under path, recursively.''' |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1317 def errhandler(err): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1318 if err.filename == path: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1319 raise err |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1320 |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1321 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
|
1322 for d in dirs: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1323 if d == '.hg': |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1324 yield root |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1325 dirs[:] = [] |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1326 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
|
1327 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1328 _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
|
1329 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1330 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
|
1331 '''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
|
1332 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
|
1333 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
|
1334 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
|
1335 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
|
1336 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
|
1337 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
|
1338 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
|
1339 _rcpath = [] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1340 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
|
1341 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
|
1342 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
|
1343 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
|
1344 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
|
1345 _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
|
1346 else: |
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1347 _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
|
1348 else: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1349 _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
|
1350 return _rcpath |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1351 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1352 def bytecount(nbytes): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1353 '''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
|
1354 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1355 units = ( |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1356 (100, 1<<30, _('%.0f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1357 (10, 1<<30, _('%.1f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1358 (1, 1<<30, _('%.2f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1359 (100, 1<<20, _('%.0f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1360 (10, 1<<20, _('%.1f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1361 (1, 1<<20, _('%.2f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1362 (100, 1<<10, _('%.0f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1363 (10, 1<<10, _('%.1f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1364 (1, 1<<10, _('%.2f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1365 (1, 1, _('%.0f bytes')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1366 ) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1367 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1368 for multiplier, divisor, format in units: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1369 if nbytes >= divisor * multiplier: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1370 return format % (nbytes / float(divisor)) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1371 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
|
1372 |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1373 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
|
1374 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
|
1375 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
|
1376 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
|
1377 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
|
1378 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
|
1379 return path |