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