Mercurial > public > mercurial-scm > hg
annotate mercurial/util.py @ 5420:6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
On Linux VFAT execution mode can be modified, but changes don't
persist a filesy stem remount. The current test can be trickled by
this. We can help with the det ection of VFAT checking whether new
files get created with the execution bits on
(as usually these partitions are mounted with the exec option, for
convenience)
.
author | Rafael Villar Burke <pachi@rvburke.com> |
---|---|
date | Fri, 05 Oct 2007 01:52:53 +0200 |
parents | 5105b119edd2 |
children | fa836e050c50 |
rev | line source |
---|---|
1082 | 1 """ |
2 util.py - Mercurial utility functions and platform specfic implementations | |
3 | |
4 Copyright 2005 K. Thananchayan <thananck@yahoo.com> | |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4625
diff
changeset
|
5 Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2859 | 6 Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
1082 | 7 |
8 This software may be used and distributed according to the terms | |
9 of the GNU General Public License, incorporated herein by reference. | |
10 | |
11 This contains helper routines that are independent of the SCM core and hide | |
12 platform-specific details from the core. | |
13 """ | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
14 |
3891 | 15 from i18n import _ |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
16 import cStringIO, errno, getpass, popen2, re, shutil, sys, tempfile, strutil |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
17 import os, stat, threading, time, calendar, ConfigParser, locale, glob, osutil |
3769 | 18 |
4057
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
19 try: |
4647
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
20 set = set |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
21 frozenset = frozenset |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
22 except NameError: |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
23 from sets import Set as set, ImmutableSet as frozenset |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
24 |
7c80e3e6f030
Provide a version independent way to use the set datatype.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
25 try: |
4540
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
26 _encoding = os.environ.get("HGENCODING") |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
27 if sys.platform == 'darwin' and not _encoding: |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
28 # On darwin, getpreferredencoding ignores the locale environment and |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
29 # always returns mac-roman. We override this if the environment is |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
30 # not C (has been customized by the user). |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
31 locale.setlocale(locale.LC_CTYPE, '') |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
32 _encoding = locale.getlocale()[1] |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
33 if not _encoding: |
133a52d70958
Respect locale environment variables on darwin.
Brendan Cully <brendan@kublai.com>
parents:
4533
diff
changeset
|
34 _encoding = locale.getpreferredencoding() or 'ascii' |
4057
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
35 except locale.Error: |
3600b84656d3
Fallback to ascii if getpreferredencoding raises an exception
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4055
diff
changeset
|
36 _encoding = 'ascii' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
37 _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
|
38 _fallbackencoding = 'ISO-8859-1' |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
39 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
40 def tolocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
41 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
42 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
|
43 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
44 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
|
45 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
|
46 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
|
47 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
|
48 replace unknown characters. |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
49 """ |
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
|
50 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
|
51 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
52 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
|
53 return u.encode(_encoding, "replace") |
3843
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
54 except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
55 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
|
56 except UnicodeDecodeError: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
57 pass |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
58 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
|
59 return u.encode(_encoding, "replace") |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
60 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
61 def fromlocal(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
62 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
63 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
|
64 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
65 We attempt to decode strings using the encoding mode set by |
4876 | 66 HGENCODINGMODE, which defaults to 'strict'. In this mode, unknown |
3770
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
67 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
|
68 '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
|
69 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
|
70 """ |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
71 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
72 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
|
73 except UnicodeDecodeError, inst: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
74 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
|
75 raise Abort("decoding near '%s': %s!" % (sub, inst)) |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
76 except LookupError, k: |
abaa2cd00d2b
make transcoding more robust
Matt Mackall <mpm@selenic.com>
parents:
3835
diff
changeset
|
77 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
|
78 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
79 def locallen(s): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
80 """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
|
81 return len(s.decode(_encoding, "replace")) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
82 |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
83 def localsub(s, a, b=None): |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
84 try: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
85 u = s.decode(_encoding, _encodingmode) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
86 if b is not None: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
87 u = u[a:b] |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
88 else: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
89 u = u[:a] |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
90 return u.encode(_encoding, _encodingmode) |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
91 except UnicodeDecodeError, inst: |
f96c158ea3a3
Add functions for transcoding and manipulating multibyte strings
Matt Mackall <mpm@selenic.com>
parents:
3769
diff
changeset
|
92 sub = s[max(0, inst.start-10), inst.start+10] |
4533
36abb07c79d4
Removed trailing \n in calls to util.Abort()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4516
diff
changeset
|
93 raise Abort(_("decoding near '%s': %s!") % (sub, inst)) |
1258 | 94 |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
95 # used by parsedate |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
96 defaultdateformats = ( |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
97 '%Y-%m-%d %H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
98 '%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
|
99 '%Y-%m-%d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
100 '%Y-%m-%d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
101 '%Y-%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
102 '%m-%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
103 '%m/%d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
104 '%m/%d/%y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
105 '%m/%d/%Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
106 '%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
|
107 '%a %b %d %I:%M:%S%p %Y', |
4708
01f9ee4de1ad
Add support for RFC2822 to util.parsedate().
Markus F.X.J. Oberhumer <markus@oberhumer.com>
parents:
4686
diff
changeset
|
108 '%a, %d %b %Y %H:%M:%S', # GNU coreutils "/bin/date --rfc-2822" |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
109 '%b %d %H:%M:%S %Y', |
3812 | 110 '%b %d %I:%M:%S%p %Y', |
111 '%b %d %H:%M:%S', | |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
112 '%b %d %I:%M:%S%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
113 '%b %d %H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
114 '%b %d %I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
115 '%b %d %Y', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
116 '%b %d', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
117 '%H:%M:%S', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
118 '%I:%M:%SP', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
119 '%H:%M', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
120 '%I:%M%p', |
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
121 ) |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
122 |
3812 | 123 extendeddateformats = defaultdateformats + ( |
124 "%Y", | |
125 "%Y-%m", | |
126 "%b", | |
127 "%b %Y", | |
128 ) | |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
129 |
2153
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
130 class SignalInterrupt(Exception): |
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
131 """Exception raised on SIGTERM and SIGHUP.""" |
635653cd73ab
move SignalInterrupt class into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
132 |
4069
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
133 # differences from SafeConfigParser: |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
134 # - case-sensitive keys |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
135 # - allows values that are not strings (this means that you may not |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
136 # be able to save the configuration to a file) |
3425
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
137 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
|
138 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
|
139 return optionstr |
ec6f400cff4d
Use a case-sensitive version of SafeConfigParser everywhere
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3257
diff
changeset
|
140 |
4069
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
141 def set(self, section, option, value): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
142 return ConfigParser.ConfigParser.set(self, section, option, value) |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
143 |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
144 def _interpolate(self, section, option, rawval, vars): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
145 if not isinstance(rawval, basestring): |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
146 return rawval |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
147 return ConfigParser.SafeConfigParser._interpolate(self, section, |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
148 option, rawval, vars) |
3fef134832d8
allow values that aren't strings in util.configparser
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4068
diff
changeset
|
149 |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
150 def cachefunc(func): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
151 '''cache the result of function calls''' |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
152 # XXX doesn't handle keywords args |
3145
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
153 cache = {} |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
154 if func.func_code.co_argcount == 1: |
3147
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
155 # we gain a small amount of time because |
97420a49188d
add comments in cachefunc
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3145
diff
changeset
|
156 # 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
|
157 def f(arg): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
158 if arg not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
159 cache[arg] = func(arg) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
160 return cache[arg] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
161 else: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
162 def f(*args): |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
163 if args not in cache: |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
164 cache[args] = func(*args) |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
165 return cache[args] |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
166 |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
167 return f |
e4ea47c21480
Add cachefunc to abstract function call cache
Brendan Cully <brendan@kublai.com>
parents:
3131
diff
changeset
|
168 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
169 def pipefilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
170 '''filter string S through command CMD, returning its output''' |
4625
eaf87cd19337
Work around heisenbug in Popen3.__del__
Brendan Cully <brendan@kublai.com>
parents:
4540
diff
changeset
|
171 (pin, pout) = os.popen2(cmd, 'b') |
1258 | 172 def writer(): |
2096
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
173 try: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
174 pin.write(s) |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
175 pin.close() |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
176 except IOError, inst: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
177 if inst.errno != errno.EPIPE: |
f5ebe964c6be
Ignore EPIPE in pipefilter
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2090
diff
changeset
|
178 raise |
1258 | 179 |
180 # we should use select instead on UNIX, but this will work on most | |
181 # systems, including Windows | |
182 w = threading.Thread(target=writer) | |
183 w.start() | |
184 f = pout.read() | |
185 pout.close() | |
186 w.join() | |
187 return f | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
188 |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
189 def tempfilter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
190 '''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
|
191 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
|
192 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
|
193 the temporary files generated.''' |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
194 inname, outname = None, None |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
195 try: |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
196 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
|
197 fp = os.fdopen(infd, 'wb') |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
198 fp.write(s) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
199 fp.close() |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2153
diff
changeset
|
200 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
|
201 os.close(outfd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
202 cmd = cmd.replace('INFILE', inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
203 cmd = cmd.replace('OUTFILE', outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
204 code = os.system(cmd) |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
205 if sys.platform == 'OpenVMS' and code & 1: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
206 code = 0 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
207 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
|
208 (cmd, explain_exit(code))) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
209 return open(outname, 'rb').read() |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
210 finally: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
211 try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
212 if inname: os.unlink(inname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
213 except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
214 try: |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
215 if outname: os.unlink(outname) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
216 except: pass |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
217 |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
218 filtertable = { |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
219 'tempfile:': tempfilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
220 'pipe:': pipefilter, |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
221 } |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
222 |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
223 def filter(s, cmd): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
224 "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
|
225 for name, fn in filtertable.iteritems(): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
226 if cmd.startswith(name): |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
227 return fn(s, cmd[len(name):].lstrip()) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
228 return pipefilter(s, cmd) |
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
229 |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
230 def binary(s): |
1082 | 231 """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
|
232 if s and '\0' in s[:4096]: |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
233 return True |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
234 return False |
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
235 |
556 | 236 def unique(g): |
1082 | 237 """return the uniq elements of iterable g""" |
556 | 238 seen = {} |
3535
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
239 l = [] |
556 | 240 for f in g: |
241 if f not in seen: | |
242 seen[f] = 1 | |
3535
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
243 l.append(f) |
4d97184a06ad
Make util.unique return a list
Matt Mackall <mpm@selenic.com>
parents:
3533
diff
changeset
|
244 return l |
556 | 245 |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
246 class Abort(Exception): |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
247 """Raised if a command needs to print an error and exit.""" |
508 | 248 |
3564
eda9e7c9300d
New UnexpectedOutput exception to catch server errors in localrepo.stream_in
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3551
diff
changeset
|
249 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
|
250 """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
|
251 |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
252 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
|
253 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
|
254 |
4054
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
255 def expand_glob(pats): |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
256 '''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
|
257 if os.name != 'nt': |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
258 return list(pats) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
259 ret = [] |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
260 for p in pats: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
261 kind, name = patkind(p, None) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
262 if kind is None: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
263 globbed = glob.glob(name) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
264 if globbed: |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
265 ret.extend(globbed) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
266 continue |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
267 # 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
|
268 ret.append(p) |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
269 return ret |
e6d54283c090
Explicitly expand globs on Windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3905
diff
changeset
|
270 |
1563
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
271 def patkind(name, dflt_pat='glob'): |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
272 """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
|
273 actual pattern.""" |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
274 for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre': |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
275 if name.startswith(prefix + ':'): return name.split(':', 1) |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
276 return dflt_pat, name |
cc2a2e12f4ad
export patkind() from util
Robin Farine <robin.farine@terminus.org>
parents:
1546
diff
changeset
|
277 |
1062 | 278 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
|
279 "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
|
280 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
|
281 res = '' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
282 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
|
283 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
|
284 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
|
285 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
|
286 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
|
287 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
|
288 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
|
289 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
|
290 res += '.*' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
291 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
292 res += '[^/]*' |
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 c == '?': |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
294 res += '.' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
295 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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 res += '\\[' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
303 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 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
|
313 res += '(?:' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
314 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
|
315 res += ')' |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
316 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
|
317 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
|
318 res += '|' |
1990
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
319 elif c == '\\': |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
320 p = peek() |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
321 if p: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
322 i += 1 |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
323 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
|
324 else: |
4b0535c678d6
make it possible to escape characters in a glob expression
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1976
diff
changeset
|
325 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
|
326 else: |
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
705
diff
changeset
|
327 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
|
328 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
|
329 |
812
b65af904d6d7
Reduce the amount of stat traffic generated by a walk.
Bryan O'Sullivan <bos@serpentine.com>
parents:
782
diff
changeset
|
330 _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
|
331 |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
332 def pathto(root, n1, n2): |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
333 '''return the relative path from one place to another. |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
334 root should use os.sep to separate directories |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
335 n1 should use os.sep to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
336 n2 should use "/" to separate directories |
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
337 returns an os.sep-separated path. |
4229
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
338 |
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
339 If n1 is a relative path, it's assumed it's |
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
340 relative to root. |
24c22a3f2ef8
pass repo.root to util.pathto() in preparation for the next patch
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
341 n2 should always be relative to root. |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
342 ''' |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
343 if not n1: return localpath(n2) |
4230
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
344 if os.path.isabs(n1): |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
345 if os.path.splitdrive(root)[0] != os.path.splitdrive(n1)[0]: |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
346 return os.path.join(root, localpath(n2)) |
c93562fb12cc
Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4229
diff
changeset
|
347 n2 = '/'.join((pconvert(root), n2)) |
3669
48768b1ab23c
fix util.pathto
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3629
diff
changeset
|
348 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
|
349 a.reverse() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
350 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
|
351 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
|
352 a.pop() |
bf4e7ef08741
fixed some stuff pychecker shows, marked unclear/wrong stuff with XXX
twaldmann@thinkmo.de
parents:
1528
diff
changeset
|
353 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
|
354 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
|
355 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
|
356 |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
357 def canonpath(root, cwd, myname): |
1082 | 358 """return the canonical path of myname, given cwd and root""" |
1566 | 359 if root == os.sep: |
360 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
|
361 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
|
362 rootsep = root |
1566 | 363 else: |
1810
7596611ab3d5
Whitespace, tab and formatting cleanups, mainly in mq.py
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1635
diff
changeset
|
364 rootsep = root + os.sep |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
365 name = myname |
2090
eb40db373717
fix util.canonpath on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2085
diff
changeset
|
366 if not os.path.isabs(name): |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
367 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
|
368 name = os.path.normpath(name) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
369 audit_path = path_auditor(root) |
2278
3711e23ab10a
Make hg status work for repositories in root directory on windows (issue 228)
Manpreet Singh <junkblocker@yahoo.com>
parents:
2271
diff
changeset
|
370 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
|
371 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
|
372 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
|
373 return pconvert(name) |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
374 elif name == root: |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
375 return '' |
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
869
diff
changeset
|
376 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
|
377 # 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
|
378 # 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
|
379 # 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
|
380 # `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
|
381 # 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
|
382 # 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
|
383 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
|
384 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
|
385 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
|
386 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
|
387 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
|
388 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
|
389 break |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
390 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
|
391 if not rel: |
cc8a52229620
Fix accessing the repo through a symlink.
Jun Inoue <jun.lambda@gmail.com>
parents:
4067
diff
changeset
|
392 # 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
|
393 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
|
394 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
|
395 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
|
396 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
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 |
1081
8b7d63489db3
Change canonpath to not know about repo objects
mpm@selenic.com
parents:
1075
diff
changeset
|
404 raise Abort('%s not under root' % myname) |
897 | 405 |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
406 def matcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None): |
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
407 return _matcher(canonroot, cwd, names, inc, exc, '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
|
408 |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
409 def cmdmatcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None, |
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
410 globbed=False, default=None): |
4195
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
411 default = default or 'relpath' |
e8ee8fdeddb1
change locate to use relglobs by default
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4193
diff
changeset
|
412 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
|
413 names = expand_glob(names) |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
414 return _matcher(canonroot, cwd, names, inc, exc, 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
|
415 |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
416 def _matcher(canonroot, cwd, names, inc, exc, dflt_pat, src): |
1082 | 417 """build a function to match a set of file patterns |
418 | |
419 arguments: | |
420 canonroot - the canonical root of the tree you're matching against | |
421 cwd - the current working directory, if relevant | |
422 names - patterns to find | |
423 inc - patterns to include | |
424 exc - patterns to exclude | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
425 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
|
426 src - where these patterns came from (e.g. .hgignore) |
1082 | 427 |
428 a pattern is one of: | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
429 'glob:<glob>' - a glob relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
430 're:<regexp>' - a regular expression |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
431 'path:<path>' - a path relative to canonroot |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
432 '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
|
433 'relpath:<path>' - a path relative to cwd |
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
434 '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
|
435 '<something>' - one of the cases above, selected by the dflt_pat argument |
1082 | 436 |
437 returns: | |
438 a 3-tuple containing | |
4185
51ee2868a571
util._matcher: update comments
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4183
diff
changeset
|
439 - 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
|
440 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
|
441 includes the initial part of glob: patterns that has no glob characters |
1082 | 442 - a bool match(filename) function |
443 - a bool indicating if any patterns were passed in | |
444 """ | |
445 | |
4198
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
446 # a common case: no patterns at all |
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
447 if not names and not inc and not exc: |
9e3121017fb2
Optimize return value of util._matcher for common command line case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4197
diff
changeset
|
448 return [], always, False |
1082 | 449 |
1413
1c64c628d15f
Do not use 'glob' expansion by default on OS != 'nt'
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
450 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
|
451 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
|
452 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
|
453 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
|
454 |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
455 def regex(kind, name, tail): |
742 | 456 '''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
|
457 if not name: |
769bc4af561d
util.*matcher: change default "names" argument
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4189
diff
changeset
|
458 return '' |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
459 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
|
460 return name |
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
461 elif kind == 'path': |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
462 return '^' + re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
463 elif kind == 'relglob': |
4307
702f48570eb3
change relglob: patterns to be consistent with glob: patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4306
diff
changeset
|
464 return globre(name, '(?:|.*/)', tail) |
888
e7a943e8c52b
Fix up handling of regexp paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
886
diff
changeset
|
465 elif kind == 'relpath': |
4197
492d0d5b6976
remove unused "head" hack from util._matcher
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4195
diff
changeset
|
466 return re.escape(name) + '(?:/|$)' |
1270
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
467 elif kind == 'relre': |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
468 if name.startswith('^'): |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
469 return name |
fc3b41570082
Switch to new syntax for .hgignore files.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1258
diff
changeset
|
470 return '.*' + name |
4306
6cecaec07cc9
Revert changeset ef1f1a4b2efb; add another test for glob: patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4255
diff
changeset
|
471 return globre(name, '', tail) |
742 | 472 |
473 def matchfn(pats, tail): | |
474 """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
|
475 if not pats: |
f4250806dbeb
further fix traceback on invalid .hgignore patterns
Benoit Boissinot <mercurial-bugs@selenic.com>
parents:
1446
diff
changeset
|
476 return |
4371
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
477 try: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
478 pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats]) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
479 return re.compile(pat).match |
5201
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
480 except OverflowError: |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
481 # We're using a Python with a tiny regex engine and we |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
482 # made it explode, so we'll divide the pattern list in two |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
483 # until it works |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
484 l = len(pats) |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
485 if l < 2: |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
486 raise |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
487 a, b = matchfn(pats[:l/2], tail), matchfn(pats[l/2:], tail) |
0f6a1bdf89fb
match: handle large regexes
Matt Mackall <mpm@selenic.com>
parents:
5077
diff
changeset
|
488 return lambda s: a(s) or b(s) |
4371
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
489 except re.error: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
490 for k, p in pats: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
491 try: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
492 re.compile('(?:%s)' % regex(k, p, tail)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
493 except re.error: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
494 if src: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
495 raise Abort("%s: invalid pattern (%s): %s" % |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
496 (src, k, p)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
497 else: |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
498 raise Abort("invalid pattern (%s): %s" % (k, p)) |
d7ad1e42a368
util._matcher: speed up regexp matching.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4338
diff
changeset
|
499 raise Abort("invalid pattern") |
742 | 500 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
501 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
|
502 '''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
|
503 root = [] |
4183
6f9474044736
small globprefix fix
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4129
diff
changeset
|
504 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
|
505 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
|
506 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
|
507 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
|
508 |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
509 def normalizepats(names, default): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
510 pats = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
511 roots = [] |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
512 anypats = False |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
513 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
|
514 if kind in ('glob', 'relpath'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
515 name = canonpath(canonroot, cwd, name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
516 elif kind in ('relglob', 'path'): |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
517 name = normpath(name) |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
518 |
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
519 pats.append((kind, name)) |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
520 |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
521 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
|
522 anypats = True |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
523 |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
524 if kind == 'glob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
525 root = globprefix(name) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
526 roots.append(root) |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
527 elif kind in ('relpath', 'path'): |
4233
03a665f9f913
util._matcher: use "." as the root of empty {rel,}path patterns
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4199
diff
changeset
|
528 roots.append(name or '.') |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
529 elif kind == 'relglob': |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
530 roots.append('.') |
4236
34c4540c04c5
util._matcher: remove superfluous variable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4233
diff
changeset
|
531 return roots, pats, anypats |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
532 |
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
533 roots, pats, anypats = normalizepats(names, dflt_pat) |
897 | 534 |
820
89985a1b3427
Clean up walk and changes code to use normalised names properly.
Bryan O'Sullivan <bos@serpentine.com>
parents:
814
diff
changeset
|
535 patmatch = matchfn(pats, '$') or always |
897 | 536 incmatch = always |
537 if inc: | |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
538 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
|
539 incmatch = matchfn(inckinds, '(?:/|$)') |
897 | 540 excmatch = lambda fn: False |
541 if exc: | |
4192
9814d600011e
util._matcher: unify pattern normalization
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4190
diff
changeset
|
542 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
|
543 excmatch = matchfn(exckinds, '(?:/|$)') |
742 | 544 |
4199
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
545 if not names and inc and not exc: |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
546 # common case: hgignore patterns |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
547 match = incmatch |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
548 else: |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
549 match = lambda fn: incmatch(fn) and not excmatch(fn) and patmatch(fn) |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
550 |
ec932167c3a7
Optimize return value of util._matcher for hgignore case
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4198
diff
changeset
|
551 return (roots, match, (inc or exc or anypats) and True) |
742 | 552 |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
553 _hgexecutable = None |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
554 |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
555 def hgexecutable(): |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
556 """return location of the 'hg' executable. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
557 |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
558 Defaults to $HG or 'hg' in the search path. |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
559 """ |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
560 if _hgexecutable is None: |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
561 set_hgexecutable(os.environ.get('HG') or find_exe('hg', 'hg')) |
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
562 return _hgexecutable |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
563 |
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
564 def set_hgexecutable(path): |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
565 """set location of the 'hg' executable""" |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
566 global _hgexecutable |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
567 _hgexecutable = path |
4686
849f011dbf79
Remember path to 'hg' executable and pass to external tools and hooks as $HG.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4673
diff
changeset
|
568 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
569 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
|
570 '''enhanced shell command execution. |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
571 run with environment maybe modified, maybe in different dir. |
508 | 572 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
573 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
|
574 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
|
575 exception.''' |
2601
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
576 def py2shell(val): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
577 '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
|
578 if val in (None, False): |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
579 return '0' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
580 if val == True: |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
581 return '1' |
00fc88b0b256
move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2579
diff
changeset
|
582 return str(val) |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
583 oldenv = {} |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
584 for k in environ: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
585 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
|
586 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
|
587 oldcwd = os.getcwd() |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
588 origcmd = cmd |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
589 if os.name == 'nt': |
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
590 cmd = '"%s"' % cmd |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
591 try: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
592 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
|
593 os.environ[k] = py2shell(v) |
5062
3d35c8cb5eb4
Simplify/correct finding the hg executable (fixes issue644)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4832
diff
changeset
|
594 os.environ['HG'] = hgexecutable() |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
595 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
|
596 os.chdir(cwd) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
597 rc = os.system(cmd) |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
598 if sys.platform == 'OpenVMS' and rc & 1: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
599 rc = 0 |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
600 if rc and onerr: |
3905
a8c0365b2ace
util.system: fix quoting on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3860
diff
changeset
|
601 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
|
602 explain_exit(rc)[0]) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
603 if errprefix: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
604 errmsg = '%s: %s' % (errprefix, errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
605 try: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
606 onerr.warn(errmsg + '\n') |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
607 except AttributeError: |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
608 raise onerr(errmsg) |
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
609 return rc |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
610 finally: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
611 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
|
612 if v is None: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
613 del os.environ[k] |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
614 else: |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
615 os.environ[k] = v |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
616 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
|
617 os.chdir(oldcwd) |
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1877
diff
changeset
|
618 |
4281
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
619 # os.path.lexists is not available on python2.3 |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
620 def lexists(filename): |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
621 "test whether a file with this name exists. does not follow symlinks" |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
622 try: |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
623 os.lstat(filename) |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
624 except: |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
625 return False |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
626 return True |
384672d8080f
add util.lexists
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4275
diff
changeset
|
627 |
421 | 628 def rename(src, dst): |
1082 | 629 """forcibly rename a file""" |
421 | 630 try: |
631 os.rename(src, dst) | |
4956
02b127749dc0
fix unused variables reported by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4948
diff
changeset
|
632 except OSError, err: # FIXME: check err (EEXIST ?) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
633 # 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
|
634 # 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
|
635 # 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
|
636 # 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
|
637 # 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
|
638 # 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
|
639 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
|
640 os.close(fd) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
641 os.unlink(temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
642 os.rename(dst, temp) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
643 os.unlink(temp) |
421 | 644 os.rename(src, dst) |
645 | |
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
|
646 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
|
647 """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
|
648 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
|
649 # 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
|
650 try: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
651 os.removedirs(os.path.dirname(f)) |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
652 except OSError: |
547ede0123a2
util.unlink should only catch OSError.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2054
diff
changeset
|
653 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
|
654 |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
655 def copyfile(src, dest): |
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
656 "copy a file, preserving mode" |
4271
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
657 if os.path.islink(src): |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
658 try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
659 os.unlink(dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
660 except: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
661 pass |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
662 os.symlink(os.readlink(src), dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
663 else: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
664 try: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
665 shutil.copyfile(src, dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
666 shutil.copymode(src, dest) |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
667 except shutil.Error, inst: |
1eaa8d90c689
fix util.copyfile to deal with symlinks
Eric St-Jean <esj@wwd.ca>
parents:
4256
diff
changeset
|
668 raise Abort(str(inst)) |
3629
4cfb72bcb978
util: add copyfile function
Matt Mackall <mpm@selenic.com>
parents:
3568
diff
changeset
|
669 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
670 def copyfiles(src, dst, hardlink=None): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
671 """Copy a directory tree using hardlinks if possible""" |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
672 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
673 if hardlink is None: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
674 hardlink = (os.stat(src).st_dev == |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
675 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
|
676 |
1207 | 677 if os.path.isdir(src): |
678 os.mkdir(dst) | |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
679 for name, kind in osutil.listdir(src): |
1207 | 680 srcname = os.path.join(src, name) |
681 dstname = os.path.join(dst, name) | |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
682 copyfiles(srcname, dstname, hardlink) |
1207 | 683 else: |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
684 if hardlink: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
685 try: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
686 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
|
687 except (IOError, OSError): |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
688 hardlink = False |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
689 shutil.copy(src, dst) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
690 else: |
1591
5a3229cf1492
do not copy atime and mtime in util.copyfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
691 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
|
692 |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
693 class path_auditor(object): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
694 '''ensure that a filesystem path contains no banned components. |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
695 the following properties of a path are checked: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
696 |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
697 - under top-level .hg |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
698 - starts at the root of a windows drive |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
699 - contains ".." |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
700 - traverses a symlink (e.g. a/symlink_here/b) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
701 - inside a nested repository''' |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
702 |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
703 def __init__(self, root): |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
704 self.audited = set() |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
705 self.auditeddir = set() |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
706 self.root = root |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
707 |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
708 def __call__(self, path): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
709 if path in self.audited: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
710 return |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
711 normpath = os.path.normcase(path) |
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
712 parts = normpath.split(os.sep) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
713 if (os.path.splitdrive(path)[0] or parts[0] in ('.hg', '') |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
714 or os.pardir in parts): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
715 raise Abort(_("path contains illegal component: %s") % path) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
716 def check(prefix): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
717 curpath = os.path.join(self.root, prefix) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
718 try: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
719 st = os.lstat(curpath) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
720 except OSError, err: |
5162
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
721 # EINVAL can be raised as invalid path syntax under win32. |
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
722 # They must be ignored for patterns can be checked too. |
9374373fb727
util: ignore invalid path errors in path_auditor.
Patrick Mezard <pmezard@gmail.com>
parents:
5159
diff
changeset
|
723 if err.errno not in (errno.ENOENT, errno.EINVAL): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
724 raise |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
725 else: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
726 if stat.S_ISLNK(st.st_mode): |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
727 raise Abort(_('path %r traverses symbolic link %r') % |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
728 (path, prefix)) |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
729 elif (stat.S_ISDIR(st.st_mode) and |
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
730 os.path.isdir(os.path.join(curpath, '.hg'))): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
731 raise Abort(_('path %r is inside repo %r') % |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
732 (path, prefix)) |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
733 |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
734 prefixes = [] |
5159
d84329a11fdd
Make a few portability improvements to path auditing code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5158
diff
changeset
|
735 for c in strutil.rfindall(normpath, os.sep): |
5200
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
736 prefix = normpath[:c] |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
737 if prefix in self.auditeddir: |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
738 break |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
739 check(prefix) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
740 prefixes.append(prefix) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
741 |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
742 self.audited.add(path) |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
743 # only add prefixes to the cache after checking everything: we don't |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
744 # want to add "foo/bar/baz" before checking if there's a "foo/.hg" |
c7e8fe11f34a
path_auditor: cache names of audited directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5162
diff
changeset
|
745 self.auditeddir.update(prefixes) |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1830
diff
changeset
|
746 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
747 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
|
748 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
|
749 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
|
750 os.close(ld) |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
751 |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
752 def _readlock_file(pathname): |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
753 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
|
754 |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
755 def nlinks(pathname): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
756 """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
|
757 return os.lstat(pathname).st_nlink |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
758 |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
759 if hasattr(os, 'link'): |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
760 os_link = os.link |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
761 else: |
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
762 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
|
763 raise OSError(0, _("Hardlinks not supported")) |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
764 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
765 def fstat(fp): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
766 '''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
|
767 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
768 return os.fstat(fp.fileno()) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
769 except AttributeError: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
770 return os.stat(fp.name) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
771 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
772 posixfile = file |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
773 |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
774 def is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
775 '''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
|
776 try: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
777 return sys.getwindowsversion()[3] == 1 |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
778 except AttributeError: |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
779 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
|
780 |
3721
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
781 getuser_fallback = None |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
782 |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
783 def getuser(): |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
784 '''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
|
785 try: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
786 return getpass.getuser() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
787 except ImportError: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
788 # 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
|
789 if getuser_fallback: |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
790 return getuser_fallback() |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
791 # 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
|
792 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
|
793 'environment variable')) |
98f2507c5551
only print a warning when no username is specified
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3677
diff
changeset
|
794 |
3551
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
795 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
|
796 """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
|
797 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
798 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
|
799 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
800 import pwd |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
801 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
|
802 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
|
803 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
804 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
|
805 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
806 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
|
807 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
808 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
809 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
810 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
|
811 """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
|
812 |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
813 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
|
814 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
815 import grp |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
816 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
|
817 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
|
818 try: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
819 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
|
820 except KeyError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
821 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
|
822 except ImportError: |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
823 return None |
3b07e223534b
Only read .hg/hgrc files from trusted users/groups
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3466
diff
changeset
|
824 |
3784 | 825 # File system features |
826 | |
827 def checkfolding(path): | |
828 """ | |
829 Check whether the given path is on a case-sensitive filesystem | |
830 | |
831 Requires a path (like /foo/.hg) ending with a foldable final | |
832 directory component. | |
833 """ | |
834 s1 = os.stat(path) | |
835 d, b = os.path.split(path) | |
836 p2 = os.path.join(d, b.upper()) | |
837 if path == p2: | |
838 p2 = os.path.join(d, b.lower()) | |
839 try: | |
840 s2 = os.stat(p2) | |
841 if s2 == s1: | |
842 return False | |
843 return True | |
844 except: | |
845 return True | |
846 | |
3994
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
847 def checkexec(path): |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
848 """ |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
849 Check whether the given path is on a filesystem with UNIX-like exec flags |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
850 |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
851 Requires a directory (like /foo/.hg) |
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
852 """ |
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
853 try: |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
854 EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
855 fh, fn = tempfile.mkstemp("", "", path) |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
856 os.close(fh) |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
857 m = os.stat(fn).st_mode |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
858 # VFAT on Linux can flip mode but it doesn't persist a FS remount. |
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
859 # frequently we can detect it if files are created with exec bit on. |
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
860 new_file_has_exec = m & EXECFLAGS |
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
861 os.chmod(fn, m ^ EXECFLAGS) |
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
862 exec_flags_cannot_flip = (os.stat(fn).st_mode == m) |
5212
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
863 os.unlink(fn) |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
864 except (IOError,OSError): |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
865 # we don't care, the user probably won't be able to commit anyway |
316ce5e85b3e
check exec: return fallback in case of error during the check
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
5077
diff
changeset
|
866 return False |
5420
6d1bd20ae14d
Execution bit detection fixes for VFAT on Linux
Rafael Villar Burke <pachi@rvburke.com>
parents:
5396
diff
changeset
|
867 return not (new_file_has_exec or exec_flags_cannot_flip) |
3994
1cc60eebc71f
exec: checkexec checks whether filesystem supports exec flags
Matt Mackall <mpm@selenic.com>
parents:
3906
diff
changeset
|
868 |
3996
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3995
diff
changeset
|
869 def execfunc(path, fallback): |
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3995
diff
changeset
|
870 '''return an is_exec() function with default to fallback''' |
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3995
diff
changeset
|
871 if checkexec(path): |
3997
3f0ba82c103f
exec: remove last flag from is_exec
Matt Mackall <mpm@selenic.com>
parents:
3996
diff
changeset
|
872 return lambda x: is_exec(os.path.join(path, x)) |
3996
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3995
diff
changeset
|
873 return fallback |
c190df14338c
exec: add execfunc to simplify exec flag support on non-exec filesystems
Matt Mackall <mpm@selenic.com>
parents:
3995
diff
changeset
|
874 |
4002
d7b9ec589546
symlinks: use is_link wherever is_exec is used
Matt Mackall <mpm@selenic.com>
parents:
4000
diff
changeset
|
875 def checklink(path): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
876 """check whether the given path is on a symlink-capable filesystem""" |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
877 # mktemp is not racy because symlink creation will fail if the |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
878 # file already exists |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
879 name = tempfile.mktemp(dir=path) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
880 try: |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
881 os.symlink(".", name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
882 os.unlink(name) |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
883 return True |
4017
ea6174c96ae1
catch AttributeError in util.checklink
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4002
diff
changeset
|
884 except (OSError, AttributeError): |
3998
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
885 return False |
315d47991fd4
symlinks: check whether a filesystem supports symlinks
Matt Mackall <mpm@selenic.com>
parents:
3997
diff
changeset
|
886 |
4000 | 887 def linkfunc(path, fallback): |
888 '''return an is_link() function with default to fallback''' | |
889 if checklink(path): | |
4275
81402b2b294d
use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4271
diff
changeset
|
890 return lambda x: os.path.islink(os.path.join(path, x)) |
4000 | 891 return fallback |
892 | |
4327
aba90193f4e4
cache os.umask even on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4326
diff
changeset
|
893 _umask = os.umask(0) |
aba90193f4e4
cache os.umask even on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4326
diff
changeset
|
894 os.umask(_umask) |
aba90193f4e4
cache os.umask even on windows
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4326
diff
changeset
|
895 |
4434
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
896 def needbinarypatch(): |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
897 """return True if patches should be applied in binary mode by default.""" |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
898 return os.name == 'nt' |
439b1c35348a
Fix issue483 - mq does not work under windows with gnu-win32 patch.
Patrick Mezard <pmezard@gmail.com>
parents:
4407
diff
changeset
|
899 |
1082 | 900 # Platform specific variants |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
901 if os.name == 'nt': |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3860
diff
changeset
|
902 import msvcrt |
461 | 903 nulldev = 'NUL:' |
1609
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
904 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
905 class winstdout: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
906 '''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
|
907 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
908 def __init__(self, fp): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
909 self.fp = fp |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
910 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
911 def __getattr__(self, key): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
912 return getattr(self.fp, key) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
913 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
914 def close(self): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
915 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
916 self.fp.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
917 except: pass |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
918 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
919 def write(self, s): |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
920 try: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
921 return self.fp.write(s) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
922 except IOError, inst: |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
923 if inst.errno != 0: raise |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
924 self.close() |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
925 raise IOError(errno.EPIPE, 'Broken pipe') |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
926 |
4129
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
927 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
|
928 try: |
e817c68edfed
stdout raises EINVAL when flush() is called on a closed pipe under win32.
Patrick Mezard <pmezard@gmail.com>
parents:
4087
diff
changeset
|
929 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
|
930 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
|
931 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
|
932 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
|
933 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
|
934 |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
935 sys.stdout = winstdout(sys.stdout) |
c50bddfbc812
eliminate backtrace when piping output on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1594
diff
changeset
|
936 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
937 def system_rcpath(): |
2117 | 938 try: |
939 return system_rcpath_win32() | |
940 except: | |
941 return [r'c:\mercurial\mercurial.ini'] | |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
942 |
4083
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
943 def user_rcpath(): |
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
944 '''return os-specific hgrc search path to the user dir''' |
4098
c08b6af023bc
util_win32.py: fix user_rcpath
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4097
diff
changeset
|
945 try: |
c08b6af023bc
util_win32.py: fix user_rcpath
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4097
diff
changeset
|
946 userrc = user_rcpath_win32() |
c08b6af023bc
util_win32.py: fix user_rcpath
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4097
diff
changeset
|
947 except: |
c08b6af023bc
util_win32.py: fix user_rcpath
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4097
diff
changeset
|
948 userrc = os.path.join(os.path.expanduser('~'), 'mercurial.ini') |
c08b6af023bc
util_win32.py: fix user_rcpath
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4097
diff
changeset
|
949 path = [userrc] |
2280
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
950 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
|
951 if userprofile: |
09ed44225571
On Windows look for mercurial.ini in $USERPROFILE, too, if available
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2278
diff
changeset
|
952 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
|
953 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
954 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
955 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
956 """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
|
957 pf = output_line[14:] |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
958 if pf[0] == '`': |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
959 pf = pf[1:-1] # Remove the quotes |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
960 return pf |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
961 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
962 def testpid(pid): |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
963 '''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
|
964 return True |
1241
3b4f05ff3130
Add support for cloning with hardlinks on windows.
Stephen Darnell
parents:
1207
diff
changeset
|
965 |
441 | 966 def set_exec(f, mode): |
967 pass | |
968 | |
3999
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
969 def set_link(f, mode): |
441 | 970 pass |
515 | 971 |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
972 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
973 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
|
974 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
975 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
976 return path.replace("\\", "/") |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
977 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
978 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
979 return path.replace('/', '\\') |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
980 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
981 def normpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
982 return pconvert(os.path.normpath(path)) |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
983 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
984 makelock = _makelock_file |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
985 readlock = _readlock_file |
461 | 986 |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
987 def samestat(s1, s2): |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
988 return False |
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
989 |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
990 # 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
|
991 # - 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
|
992 # 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
|
993 # - 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
|
994 # - 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
|
995 # backslash |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
996 # (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
|
997 # 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
|
998 # 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
|
999 # 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
|
1000 # 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
|
1001 _quotere = None |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
1002 def shellquote(s): |
4087
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
1003 global _quotere |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
1004 if _quotere is None: |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
1005 _quotere = re.compile(r'(\\*)("|\\$)') |
587c6c652f82
Fix util.shellquote on windows.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4086
diff
changeset
|
1006 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
|
1007 |
5292
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1008 def quotecommand(cmd): |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1009 """Build a command string suitable for os.popen* calls.""" |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1010 # The extra quotes are needed because popen* runs the command |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1011 # through the current COMSPEC. cmd.exe suppress enclosing quotes. |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1012 return '"' + cmd + '"' |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1013 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1014 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
|
1015 return _("exited with status %d") % code, code |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1016 |
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
|
1017 # 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
|
1018 # 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
|
1019 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
|
1020 return True |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1021 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1022 def find_in_path(name, path, default=None): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1023 '''find name in search path. path can be string (will be split |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1024 with os.pathsep), or iterable thing that returns strings. if name |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1025 found, return path to name. else return default. name is looked up |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1026 using cmd.exe rules, using PATHEXT.''' |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1027 if isinstance(path, str): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1028 path = path.split(os.pathsep) |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1029 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1030 pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD') |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1031 pathext = pathext.lower().split(os.pathsep) |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1032 isexec = os.path.splitext(name)[1].lower() in pathext |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1033 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1034 for p in path: |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1035 p_name = os.path.join(p, name) |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1036 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1037 if isexec and os.path.exists(p_name): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1038 return p_name |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1039 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1040 for ext in pathext: |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1041 p_name_ext = p_name + ext |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1042 if os.path.exists(p_name_ext): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1043 return p_name_ext |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1044 return default |
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
|
1045 |
4803
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1046 def set_signal_handler(): |
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1047 try: |
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1048 set_signal_handler_win32() |
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1049 except NameError: |
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1050 pass |
7549cd526b7f
Fix serve on Windows without win32* modules.
Nathan Jones <nathanj@insightbb.com>
parents:
4720
diff
changeset
|
1051 |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1052 try: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1053 # override functions with win32 versions if possible |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1054 from util_win32 import * |
2250
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
1055 if not is_win_9x(): |
45aef5ddcdbe
windows: revlog.lazyparser not always safe to use.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2237
diff
changeset
|
1056 posixfile = posixfile_nt |
2054
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1057 except ImportError: |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1058 pass |
e18beba54a7e
fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2050
diff
changeset
|
1059 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
1060 else: |
461 | 1061 nulldev = '/dev/null' |
1062 | |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
1063 def rcfiles(path): |
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
1064 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
|
1065 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
|
1066 try: |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
1067 rcs.extend([os.path.join(rcdir, f) |
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
1068 for f, kind in osutil.listdir(rcdir) |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
1069 if f.endswith(".rc")]) |
3131
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
1070 except OSError: |
cff3c58a5766
fix warnings spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3098
diff
changeset
|
1071 pass |
1583
32a4e6802864
make mercurial look in more places for config files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1482
diff
changeset
|
1072 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
|
1073 |
4083
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
1074 def system_rcpath(): |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1075 path = [] |
2263
2f64cbaa1e92
make reason for sys.argv change obvious in code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2262
diff
changeset
|
1076 # 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
|
1077 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
|
1078 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
|
1079 '/../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
|
1080 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
|
1081 return path |
1292
141951276ba1
Use platform-appropriate rc file names.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1285
diff
changeset
|
1082 |
4083
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
1083 def user_rcpath(): |
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
1084 return [os.path.expanduser('~/.hgrc')] |
33c369afec94
Unified *_rcpath so the interface is similar across operating systems
Shane Holloway <shane.holloway@ieee.org>
parents:
4069
diff
changeset
|
1085 |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
1086 def parse_patch_output(output_line): |
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
1087 """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
|
1088 pf = output_line[14:] |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1089 if os.sys.platform == 'OpenVMS': |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1090 if pf[0] == '`': |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1091 pf = pf[1:-1] # Remove the quotes |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1092 else: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1093 if pf.startswith("'") and pf.endswith("'") and " " in pf: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1094 pf = pf[1:-1] # Remove the quotes |
1593
6bb3463b124b
if a filename contains spaces, patch adds quote around it
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1585
diff
changeset
|
1095 return pf |
1285
1546c2aa6b30
Make 'hg import' platform independent.
Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
parents:
1270
diff
changeset
|
1096 |
3997
3f0ba82c103f
exec: remove last flag from is_exec
Matt Mackall <mpm@selenic.com>
parents:
3996
diff
changeset
|
1097 def is_exec(f): |
1082 | 1098 """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
|
1099 return (os.lstat(f).st_mode & 0100 != 0) |
441 | 1100 |
1101 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
|
1102 s = os.lstat(f).st_mode |
5347
1df76921aab3
set_exec: do not chmod a symlink
Steve Borho <steve@ageia.com>
parents:
5292
diff
changeset
|
1103 if stat.S_ISLNK(s) or (s & 0100 != 0) == mode: |
441 | 1104 return |
1105 if mode: | |
1106 # Turn on +x for every +r bit when making a file executable | |
1107 # and obey umask. | |
4326 | 1108 os.chmod(f, s | (s & 0444) >> 2 & ~_umask) |
441 | 1109 else: |
1110 os.chmod(f, s & 0666) | |
1111 | |
3999
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1112 def set_link(f, mode): |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1113 """make a file a symbolic link/regular file |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1114 |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1115 if a file is changed to a link, its contents become the link data |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1116 if a link is changed to a file, its link data become its contents |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1117 """ |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1118 |
4275
81402b2b294d
use os.path.islink instead of util.is_link; remove util.is_link
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4271
diff
changeset
|
1119 m = os.path.islink(f) |
3999
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1120 if m == bool(mode): |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1121 return |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1122 |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1123 if mode: # switch file to link |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1124 data = file(f).read() |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1125 os.unlink(f) |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1126 os.symlink(data, f) |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1127 else: |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1128 data = os.readlink(f) |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1129 os.unlink(f) |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1130 file(f, "w").write(data) |
0b740dcf0cf1
symlinks: add basic symlink functions to util.py
Matt Mackall <mpm@selenic.com>
parents:
3998
diff
changeset
|
1131 |
1420
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
1132 def set_binary(fd): |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
1133 pass |
b32b3509c7ab
Avoid insertion/deletion of CRs on stdio during hg serve
olivier.maquelin@intel.com
parents:
1415
diff
changeset
|
1134 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
1135 def pconvert(path): |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
1136 return path |
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
diff
changeset
|
1137 |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
1138 def localpath(path): |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
1139 return path |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
1140 |
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
1141 normpath = os.path.normpath |
2193
fb28ce04b349
add util.samestat function for windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2177
diff
changeset
|
1142 samestat = os.path.samestat |
886
509de8ab6f31
Fix walk path handling on Windows
Bryan O'Sullivan <bos@serpentine.com>
parents:
884
diff
changeset
|
1143 |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
1144 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
|
1145 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1146 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
|
1147 except OSError, why: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1148 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
|
1149 raise |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1150 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1151 _makelock_file(info, pathname) |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
1152 |
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
421
diff
changeset
|
1153 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
|
1154 try: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1155 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
|
1156 except OSError, why: |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1157 if why.errno in (errno.EINVAL, errno.ENOSYS): |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1158 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
|
1159 else: |
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
698
diff
changeset
|
1160 raise |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1161 |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
1162 def shellquote(s): |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1163 if os.sys.platform == 'OpenVMS': |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1164 return '"%s"' % s |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1165 else: |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1166 return "'%s'" % s.replace("'", "'\\''") |
2791
f4d916351366
Add portable shell-quoting function; teach mq to use it.
Brendan Cully <brendan@kublai.com>
parents:
2760
diff
changeset
|
1167 |
5292
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1168 def quotecommand(cmd): |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1169 return cmd |
5a65d870871d
sshrepo: fix Windows command quoting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5291
diff
changeset
|
1170 |
1877
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
1171 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
|
1172 '''return False if pid dead, True if running or not sure''' |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1173 if os.sys.platform == 'OpenVMS': |
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1174 return True |
1877
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
1175 try: |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
1176 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
|
1177 return True |
d314a89fa4f1
change lock format to let us detect and break stale locks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1835
diff
changeset
|
1178 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
|
1179 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
|
1180 |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1181 def explain_exit(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1182 """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
|
1183 if os.WIFEXITED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1184 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
|
1185 return _("exited with status %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1186 elif os.WIFSIGNALED(code): |
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1187 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
|
1188 return _("killed by signal %d") % val, val |
782
cdb9e95b2fab
Provided platform dependent implementations for explain_exit
thananck@yahoo.com
parents:
742
diff
changeset
|
1189 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
|
1190 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
|
1191 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
|
1192 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
|
1193 |
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
|
1194 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
|
1195 """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
|
1196 |
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
|
1197 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
|
1198 """ |
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
|
1199 if st is None: |
3859
8c24b6fd5866
fix errors spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3854
diff
changeset
|
1200 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
|
1201 return st.st_uid == os.getuid() |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4508
diff
changeset
|
1202 |
4407
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1203 def find_in_path(name, path, default=None): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1204 '''find name in search path. path can be string (will be split |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1205 with os.pathsep), or iterable thing that returns strings. if name |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1206 found, return path to name. else return default.''' |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1207 if isinstance(path, str): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1208 path = path.split(os.pathsep) |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1209 for p in path: |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1210 p_name = os.path.join(p, name) |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1211 if os.path.exists(p_name): |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1212 return p_name |
f97b89314fb3
Move win32 find_in_files from util_win32 to util.
Patrick Mezard <pmezard@gmail.com>
parents:
4388
diff
changeset
|
1213 return default |
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
|
1214 |
4672
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4647
diff
changeset
|
1215 def set_signal_handler(): |
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4647
diff
changeset
|
1216 pass |
272c0a09b203
Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents:
4647
diff
changeset
|
1217 |
4488
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1218 def find_exe(name, default=None): |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1219 '''find path of an executable. |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1220 if name contains a path component, return it as is. otherwise, |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1221 use normal executable search path.''' |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1222 |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1223 if os.sep in name or sys.platform == 'OpenVMS': |
4488
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1224 # don't check the executable bit. if the file isn't |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1225 # executable, whoever tries to actually run it will give a |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1226 # much more useful error message. |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1227 return name |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1228 return find_in_path(name, os.environ.get('PATH', ''), default=default) |
62019c4427e3
Introduce find_exe. Use instead of find_in_path for programs.
Bryan O'Sullivan <bos@serpentine.com>
parents:
4434
diff
changeset
|
1229 |
3852
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1230 def _buildencodefun(): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1231 e = '_' |
3860
8e907b86126b
fix reserved char on windows, '[]+' are allowed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3859
diff
changeset
|
1232 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
|
1233 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
|
1234 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
|
1235 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
|
1236 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
|
1237 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
|
1238 dmap = {} |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1239 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
|
1240 dmap[v] = k |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1241 def decode(s): |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1242 i = 0 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1243 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
|
1244 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
|
1245 try: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1246 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
|
1247 i += l |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1248 break |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1249 except KeyError: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1250 pass |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1251 else: |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1252 raise KeyError |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1253 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
|
1254 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
|
1255 |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1256 encodefilename, decodefilename = _buildencodefun() |
8a9a1a7e1698
create the encode and decode functions for the store
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3784
diff
changeset
|
1257 |
3853
c0b449154a90
switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3852
diff
changeset
|
1258 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
|
1259 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
|
1260 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
|
1261 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
|
1262 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1263 def mktempcopy(name, emptyok=False): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1264 """Create a temporary file with the same contents from name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1265 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1266 The permission bits are copied from the original file. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1267 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1268 If the temporary file is going to be truncated immediately, you |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1269 can use emptyok=True as an optimization. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1270 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1271 Returns the name of the temporary file. |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1272 """ |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1273 d, fn = os.path.split(name) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1274 fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1275 os.close(fd) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1276 # Temporary files are created with mode 0600, which is usually not |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1277 # what we want. If the original file already exists, just copy |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1278 # its mode. Otherwise, manually obey umask. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1279 try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1280 st_mode = os.lstat(name).st_mode |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1281 except OSError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1282 if inst.errno != errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1283 raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1284 st_mode = 0666 & ~_umask |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1285 os.chmod(temp, st_mode) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1286 if emptyok: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1287 return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1288 try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1289 try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1290 ifp = posixfile(name, "rb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1291 except IOError, inst: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1292 if inst.errno == errno.ENOENT: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1293 return temp |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1294 if not getattr(inst, 'filename', None): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1295 inst.filename = name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1296 raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1297 ofp = posixfile(temp, "wb") |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1298 for chunk in filechunkiter(ifp): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1299 ofp.write(chunk) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1300 ifp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1301 ofp.close() |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1302 except: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1303 try: os.unlink(temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1304 except: pass |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1305 raise |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1306 return temp |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1307 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1308 class atomictempfile(posixfile): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1309 """file-like object that atomically updates a file |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1310 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1311 All writes will be redirected to a temporary copy of the original |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1312 file. When rename is called, the copy is renamed to the original |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1313 name, making the changes visible. |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1314 """ |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1315 def __init__(self, name, mode): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1316 self.__name = name |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1317 self.temp = mktempcopy(name, emptyok=('w' in mode)) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1318 posixfile.__init__(self, self.temp, mode) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1319 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1320 def rename(self): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1321 if not self.closed: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1322 posixfile.close(self) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1323 rename(self.temp, localpath(self.__name)) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1324 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1325 def __del__(self): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1326 if not self.closed: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1327 try: |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1328 os.unlink(self.temp) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1329 except: pass |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1330 posixfile.close(self) |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1331 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1332 class opener(object): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1333 """Open files relative to a base directory |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1334 |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1335 This class is used to hide the details of COW semantics and |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1336 remote file access from higher level code. |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1337 """ |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1338 def __init__(self, base, audit=True): |
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1339 self.base = base |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1340 if audit: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1341 self.audit_path = path_auditor(base) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1342 else: |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1343 self.audit_path = always |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1344 |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1345 def __getattr__(self, name): |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1346 if name == '_can_symlink': |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1347 self._can_symlink = checklink(self.base) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1348 return self._can_symlink |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1349 raise AttributeError(name) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1350 |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1351 def __call__(self, path, mode="r", text=False, atomictemp=False): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1352 self.audit_path(path) |
4827
89defeae88f3
turn util.opener into a class
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4803
diff
changeset
|
1353 f = os.path.join(self.base, path) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1354 |
4720
72fb6f10fac1
OpenVMS patches
Jean-Francois PIERONNE <jf.pieronne@laposte.net>
parents:
4708
diff
changeset
|
1355 if not text and "b" not in mode: |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1356 mode += "b" # for that other OS |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1357 |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1358 if mode[0] != "r": |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1359 try: |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1360 nlink = nlinks(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1361 except OSError: |
4328
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1362 nlink = 0 |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1363 d = os.path.dirname(f) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1364 if not os.path.isdir(d): |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1365 os.makedirs(d) |
4508
0026ccc2bf23
Remove atomicfile class.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4488
diff
changeset
|
1366 if atomictemp: |
4328
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1367 return atomictempfile(f, mode) |
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1368 if nlink > 1: |
1083ae4b5f0e
util.opener: if requested, use atomicfile even if the file doesn't exist
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4327
diff
changeset
|
1369 rename(mktempcopy(f), f) |
2176
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1370 return posixfile(f, mode) |
9b42304d9896
fix file handling bugs on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2117
diff
changeset
|
1371 |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1372 def symlink(self, src, dst): |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5124
diff
changeset
|
1373 self.audit_path(dst) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1374 linkname = os.path.join(self.base, dst) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1375 try: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1376 os.unlink(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1377 except OSError: |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1378 pass |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1379 |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1380 dirname = os.path.dirname(linkname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1381 if not os.path.exists(dirname): |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1382 os.makedirs(dirname) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1383 |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1384 if self._can_symlink: |
4948
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1385 try: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1386 os.symlink(src, linkname) |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1387 except OSError, err: |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1388 raise OSError(err.errno, _('could not symlink to %r: %s') % |
c8d1aa1822d5
Print meaningful error message if os.symlink fails
Bryan O'Sullivan <bos@serpentine.com>
parents:
4876
diff
changeset
|
1389 (src, err.strerror), linkname) |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1390 else: |
5077
84b10dc3dccc
Fix issue 653: symlinks checkout failure on non-supporting platforms
Patrick Mezard <pmezard@gmail.com>
parents:
5062
diff
changeset
|
1391 f = self(dst, "w") |
4828
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1392 f.write(src) |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1393 f.close() |
41ad4105dde9
Add symlink method to util.opener.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4827
diff
changeset
|
1394 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1395 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
|
1396 """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
|
1397 iterator over chunks of arbitrary size.""" |
1200 | 1398 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1399 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
|
1400 """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
|
1401 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
|
1402 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
|
1403 self.buf = '' |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1404 self.targetsize = int(targetsize) |
1200 | 1405 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
|
1406 raise ValueError(_("targetsize must be greater than 0, was %d") % |
1200 | 1407 targetsize) |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1408 self.iterempty = False |
1200 | 1409 |
1199
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1410 def fillbuf(self): |
1200 | 1411 """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
|
1412 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
|
1413 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
|
1414 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
|
1415 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
|
1416 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
|
1417 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
|
1418 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
|
1419 |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1420 def read(self, l): |
1200 | 1421 """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
|
1422 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
|
1423 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
|
1424 # 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
|
1425 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
|
1426 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
|
1427 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
|
1428 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
|
1429 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
|
1430 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
|
1431 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
|
1432 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
|
1433 break |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1434 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
|
1435 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
|
1436 self.buf = collector.getvalue() |
1200 | 1437 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
|
1438 return s |
78ceaf83f28f
Created a class in util called chunkbuffer that buffers reads from an
Eric Hopper <hopper@omnifarious.org>
parents:
1169
diff
changeset
|
1439 |
2462
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1440 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
|
1441 """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
|
1442 (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
|
1443 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
|
1444 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
|
1445 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
|
1446 requested.""" |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1447 assert size >= 0 |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1448 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
|
1449 while True: |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1450 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
|
1451 else: nbytes = min(limit, size) |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1452 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
|
1453 if not s: break |
d610bcfd66a8
util: add limit to amount filechunkiter will read
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1454 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
|
1455 yield s |
1320
5f277e73778f
Fix up representation of dates in hgweb.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1312
diff
changeset
|
1456 |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1457 def makedate(): |
1482
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1458 lt = time.localtime() |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1459 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
|
1460 tz = time.altzone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1461 else: |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1462 tz = time.timezone |
4d38b85e60aa
fix handling of daylight saving time
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1479
diff
changeset
|
1463 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
|
1464 |
5269
46c5e1ee8aaa
Added support for the Atom syndication format
Robert Bachmann <rbach@rbach.priv.at>
parents:
5236
diff
changeset
|
1465 def datestr(date=None, format='%a %b %d %H:%M:%S %Y', timezone=True, timezone_format=" %+03d%02d"): |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1466 """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
|
1467 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
|
1468 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
|
1469 append time zone to string.""" |
1321
b47f96a178a3
Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1320
diff
changeset
|
1470 t, tz = date or makedate() |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1471 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
|
1472 if timezone: |
5269
46c5e1ee8aaa
Added support for the Atom syndication format
Robert Bachmann <rbach@rbach.priv.at>
parents:
5236
diff
changeset
|
1473 s += timezone_format % (-tz / 3600, ((-tz % 3600) / 60)) |
1987
04c17fc39c84
add changelog style to command line template.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1976
diff
changeset
|
1474 return s |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1475 |
5357
c6adf2be6069
util: add default argument to strdate
Bryan O'Sullivan <bos@serpentine.com>
parents:
5293
diff
changeset
|
1476 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
|
1477 """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
|
1478 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
|
1479 def timezone(string): |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1480 tz = string.split()[-1] |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1481 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
|
1482 tz = int(tz) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1483 offset = - 3600 * (tz / 100) - 60 * (tz % 100) |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1484 return offset |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1485 if tz == "GMT" or tz == "UTC": |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1486 return 0 |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1487 return None |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1488 |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1489 # NOTE: unixtime = localunixtime + offset |
3809
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1490 offset, date = timezone(string), string |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1491 if offset != None: |
4d93b37b5963
parsedate: add UTC and GMT timezones
Matt Mackall <mpm@selenic.com>
parents:
3808
diff
changeset
|
1492 date = " ".join(string.split()[:-1]) |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1493 |
3812 | 1494 # add missing elements from defaults |
1495 for part in defaults: | |
1496 found = [True for p in part if ("%"+p) in format] | |
1497 if not found: | |
1498 date += "@" + defaults[part] | |
1499 format += "@%" + part[0] | |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1500 |
3256
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1501 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
|
1502 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
|
1503 if offset is None: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1504 # local timezone |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1505 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
|
1506 offset = unixtime - localunixtime |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1507 else: |
e5c9a084ffe3
util.strdate: assume local time when no timezone specified
Jose M. Prieto <jmprieto@gmx.net>
parents:
3255
diff
changeset
|
1508 unixtime = localunixtime + offset |
3255
e96d2956eb4a
util.strdate: compute timestamp using UTC, not local timezone
Jose M. Prieto <jmprieto@gmx.net>
parents:
3176
diff
changeset
|
1509 return unixtime, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1510 |
3812 | 1511 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
|
1512 """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
|
1513 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
|
1514 formats.""" |
3807
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1515 if not string: |
e43b48f0f718
parsedate: allow '' for epoch
Matt Mackall <mpm@selenic.com>
parents:
3806
diff
changeset
|
1516 return 0, 0 |
2609
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1517 if not formats: |
6c5b1b5cc160
util.parsedate should understand dates from hg export
Chris Mason <mason@suse.com>
parents:
2601
diff
changeset
|
1518 formats = defaultdateformats |
3808
d6529582942a
improve date parsing for numerous new date formats
Matt Mackall <mpm@selenic.com>
parents:
3807
diff
changeset
|
1519 string = string.strip() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1520 try: |
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1521 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
|
1522 except ValueError: |
3812 | 1523 # fill out defaults |
1524 if not defaults: | |
1525 defaults = {} | |
1526 now = makedate() | |
1527 for part in "d mb yY HI M S".split(): | |
1528 if part not in defaults: | |
1529 if part[0] in "HMS": | |
1530 defaults[part] = "00" | |
1531 elif part[0] in "dm": | |
1532 defaults[part] = "1" | |
1533 else: | |
1534 defaults[part] = datestr(now, "%" + part[0], False) | |
1535 | |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1536 for format in formats: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1537 try: |
3812 | 1538 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
|
1539 except ValueError: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1540 pass |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1541 else: |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1542 break |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1543 else: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1544 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
|
1545 # 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
|
1546 # 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
|
1547 # 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
|
1548 # to UTC+14 |
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
1549 if abs(when) > 0x7fffffff: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1550 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
|
1551 if offset < -50400 or offset > 43200: |
3806
92a3532a01d9
parsedate: use Abort rather than ValueError
Matt Mackall <mpm@selenic.com>
parents:
3784
diff
changeset
|
1552 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
|
1553 return when, offset |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2480
diff
changeset
|
1554 |
3812 | 1555 def matchdate(date): |
1556 """Return a function that matches a given date match specifier | |
1557 | |
1558 Formats include: | |
1559 | |
1560 '{date}' match a given date to the accuracy provided | |
1561 | |
1562 '<{date}' on or before a given date | |
1563 | |
1564 '>{date}' on or after a given date | |
1565 | |
1566 """ | |
1567 | |
1568 def lower(date): | |
1569 return parsedate(date, extendeddateformats)[0] | |
1570 | |
1571 def upper(date): | |
1572 d = dict(mb="12", HI="23", M="59", S="59") | |
1573 for days in "31 30 29".split(): | |
1574 try: | |
1575 d["d"] = days | |
1576 return parsedate(date, extendeddateformats, d)[0] | |
1577 except: | |
1578 pass | |
1579 d["d"] = "28" | |
1580 return parsedate(date, extendeddateformats, d)[0] | |
1581 | |
1582 if date[0] == "<": | |
1583 when = upper(date[1:]) | |
1584 return lambda x: x <= when | |
1585 elif date[0] == ">": | |
1586 when = lower(date[1:]) | |
1587 return lambda x: x >= when | |
1588 elif date[0] == "-": | |
1589 try: | |
1590 days = int(date[1:]) | |
1591 except ValueError: | |
1592 raise Abort(_("invalid day spec: %s") % date[1:]) | |
1593 when = makedate()[0] - days * 3600 * 24 | |
3813 | 1594 return lambda x: x >= when |
3812 | 1595 elif " to " in date: |
1596 a, b = date.split(" to ") | |
1597 start, stop = lower(a), upper(b) | |
1598 return lambda x: x >= start and x <= stop | |
1599 else: | |
1600 start, stop = lower(date), upper(date) | |
1601 return lambda x: x >= start and x <= stop | |
1602 | |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1603 def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1604 """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
|
1605 f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1606 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1607 user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1608 f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1609 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1610 user = user[f+1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1611 f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1612 if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
1613 user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1614 f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1615 if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
1616 user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1617 return user |
1920 | 1618 |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1619 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
|
1620 """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
|
1621 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
|
1622 return text |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1623 else: |
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
1624 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
|
1625 |
1829
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1626 def walkrepos(path): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1627 '''yield every hg repository under path, recursively.''' |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1628 def errhandler(err): |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1629 if err.filename == path: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1630 raise err |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1631 |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1632 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
|
1633 for d in dirs: |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1634 if d == '.hg': |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1635 yield root |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1636 dirs[:] = [] |
b0f6af327fd4
hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
1637 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
|
1638 |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1639 _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
|
1640 |
4097
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1641 def os_rcpath(): |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1642 '''return default os-specific hgrc search path''' |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1643 path = system_rcpath() |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1644 path.extend(user_rcpath()) |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1645 path = [os.path.normpath(f) for f in path] |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1646 return path |
403c4ddd74bb
Combined the two os_rcpath methods into a single one near rcpath in mercurial/util.py
Shane Holloway <shane.holloway@ieee.org>
parents:
4096
diff
changeset
|
1647 |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1648 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
|
1649 '''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
|
1650 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
|
1651 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
|
1652 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
|
1653 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
|
1654 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
|
1655 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
|
1656 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
|
1657 _rcpath = [] |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1658 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
|
1659 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
|
1660 if os.path.isdir(p): |
5396
5105b119edd2
Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5360
diff
changeset
|
1661 for f, kind in osutil.listdir(p): |
1951
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1662 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
|
1663 _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
|
1664 else: |
16750010813d
use a proper test instead of catching every exception
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1951
diff
changeset
|
1665 _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
|
1666 else: |
696230e52e4d
add HGRCPATH env var, list of places to look for hgrc files.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1920
diff
changeset
|
1667 _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
|
1668 return _rcpath |
2612
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1669 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1670 def bytecount(nbytes): |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1671 '''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
|
1672 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1673 units = ( |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1674 (100, 1<<30, _('%.0f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1675 (10, 1<<30, _('%.1f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1676 (1, 1<<30, _('%.2f GB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1677 (100, 1<<20, _('%.0f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1678 (10, 1<<20, _('%.1f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1679 (1, 1<<20, _('%.2f MB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1680 (100, 1<<10, _('%.0f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1681 (10, 1<<10, _('%.1f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1682 (1, 1<<10, _('%.2f KB')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1683 (1, 1, _('%.0f bytes')), |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1684 ) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1685 |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1686 for multiplier, divisor, format in units: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1687 if nbytes >= divisor * multiplier: |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1688 return format % (nbytes / float(divisor)) |
ffb895f16925
add support for streaming clone.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2609
diff
changeset
|
1689 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
|
1690 |
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2655
diff
changeset
|
1691 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
|
1692 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
|
1693 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
|
1694 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
|
1695 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
|
1696 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
|
1697 return path |
5291
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1698 |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1699 def uirepr(s): |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1700 # Avoid double backslash in Windows path repr() |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
1701 return repr(s).replace('\\\\', '\\') |