##// END OF EJS Templates
Merge with stable
Patrick Mezard -
r11893:aa50d072 merge default
parent child Browse files
Show More
@@ -1,77 +1,97
1 1 # encoding.py - character transcoding support for Mercurial
2 2 #
3 3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 import error
9 9 import sys, unicodedata, locale, os
10 10
11 _encodingfixup = {'646': 'ascii', 'ANSI_X3.4-1968': 'ascii'}
11 def _getpreferredencoding():
12 '''
13 On darwin, getpreferredencoding ignores the locale environment and
14 always returns mac-roman. http://bugs.python.org/issue6202 fixes this
15 for Python 2.7 and up. This is the same corrected code for earlier
16 Python versions.
17
18 However, we can't use a version check for this method, as some distributions
19 patch Python to fix this. Instead, we use it as a 'fixer' for the mac-roman
20 encoding, as it is unlikely that this encoding is the actually expected.
21 '''
22 try:
23 locale.CODESET
24 except AttributeError:
25 # Fall back to parsing environment variables :-(
26 return locale.getdefaultlocale()[1]
27
28 oldloc = locale.setlocale(locale.LC_CTYPE)
29 locale.setlocale(locale.LC_CTYPE, "")
30 result = locale.nl_langinfo(locale.CODESET)
31 locale.setlocale(locale.LC_CTYPE, oldloc)
32
33 return result
34
35 _encodingfixers = {
36 '646': lambda: 'ascii',
37 'ANSI_X3.4-1968': lambda: 'ascii',
38 'mac-roman': _getpreferredencoding
39 }
12 40
13 41 try:
14 42 encoding = os.environ.get("HGENCODING")
15 if sys.platform == 'darwin' and not encoding:
16 # On darwin, getpreferredencoding ignores the locale environment and
17 # always returns mac-roman. We override this if the environment is
18 # not C (has been customized by the user).
19 lc = locale.setlocale(locale.LC_CTYPE, '')
20 if lc == 'UTF-8':
21 locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8')
22 encoding = locale.getlocale()[1]
23 43 if not encoding:
24 44 encoding = locale.getpreferredencoding() or 'ascii'
25 encoding = _encodingfixup.get(encoding, encoding)
45 encoding = _encodingfixers.get(encoding, lambda: encoding)()
26 46 except locale.Error:
27 47 encoding = 'ascii'
28 48 encodingmode = os.environ.get("HGENCODINGMODE", "strict")
29 49 fallbackencoding = 'ISO-8859-1'
30 50
31 51 def tolocal(s):
32 52 """
33 53 Convert a string from internal UTF-8 to local encoding
34 54
35 55 All internal strings should be UTF-8 but some repos before the
36 56 implementation of locale support may contain latin1 or possibly
37 57 other character sets. We attempt to decode everything strictly
38 58 using UTF-8, then Latin-1, and failing that, we use UTF-8 and
39 59 replace unknown characters.
40 60 """
41 61 for e in ('UTF-8', fallbackencoding):
42 62 try:
43 63 u = s.decode(e) # attempt strict decoding
44 64 return u.encode(encoding, "replace")
45 65 except LookupError, k:
46 66 raise error.Abort("%s, please check your locale settings" % k)
47 67 except UnicodeDecodeError:
48 68 pass
49 69 u = s.decode("utf-8", "replace") # last ditch
50 70 return u.encode(encoding, "replace")
51 71
52 72 def fromlocal(s):
53 73 """
54 74 Convert a string from the local character encoding to UTF-8
55 75
56 76 We attempt to decode strings using the encoding mode set by
57 77 HGENCODINGMODE, which defaults to 'strict'. In this mode, unknown
58 78 characters will cause an error message. Other modes include
59 79 'replace', which replaces unknown characters with a special
60 80 Unicode character, and 'ignore', which drops the character.
61 81 """
62 82 try:
63 83 return s.decode(encoding, encodingmode).encode("utf-8")
64 84 except UnicodeDecodeError, inst:
65 85 sub = s[max(0, inst.start - 10):inst.start + 10]
66 86 raise error.Abort("decoding near '%s': %s!" % (sub, inst))
67 87 except LookupError, k:
68 88 raise error.Abort("%s, please check your locale settings" % k)
69 89
70 90 def colwidth(s):
71 91 "Find the column width of a UTF-8 string for display"
72 92 d = s.decode(encoding, 'replace')
73 93 if hasattr(unicodedata, 'east_asian_width'):
74 94 w = unicodedata.east_asian_width
75 95 return sum([w(c) in 'WFA' and 2 or 1 for c in d])
76 96 return len(d)
77 97
@@ -1,221 +1,227
1 1 # template-filters.py - common template expansion filters
2 2 #
3 3 # Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 import cgi, re, os, time, urllib
9 9 import util, encoding
10 10
11 11 def stringify(thing):
12 12 '''turn nested template iterator into string.'''
13 13 if hasattr(thing, '__iter__') and not isinstance(thing, str):
14 14 return "".join([stringify(t) for t in thing if t is not None])
15 15 return str(thing)
16 16
17 17 agescales = [("year", 3600 * 24 * 365),
18 18 ("month", 3600 * 24 * 30),
19 19 ("week", 3600 * 24 * 7),
20 20 ("day", 3600 * 24),
21 21 ("hour", 3600),
22 22 ("minute", 60),
23 23 ("second", 1)]
24 24
25 25 def age(date):
26 26 '''turn a (timestamp, tzoff) tuple into an age string.'''
27 27
28 28 def plural(t, c):
29 29 if c == 1:
30 30 return t
31 31 return t + "s"
32 32 def fmt(t, c):
33 33 return "%d %s" % (c, plural(t, c))
34 34
35 35 now = time.time()
36 36 then = date[0]
37 37 if then > now:
38 38 return 'in the future'
39 39
40 40 delta = max(1, int(now - then))
41 41 if delta > agescales[0][1] * 2:
42 42 return util.shortdate(date)
43 43
44 44 for t, s in agescales:
45 45 n = delta // s
46 46 if n >= 2 or s == 1:
47 47 return '%s ago' % fmt(t, n)
48 48
49 49 para_re = None
50 50 space_re = None
51 51
52 52 def fill(text, width):
53 53 '''fill many paragraphs.'''
54 54 global para_re, space_re
55 55 if para_re is None:
56 56 para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M)
57 57 space_re = re.compile(r' +')
58 58
59 59 def findparas():
60 60 start = 0
61 61 while True:
62 62 m = para_re.search(text, start)
63 63 if not m:
64 64 uctext = unicode(text[start:], encoding.encoding)
65 65 w = len(uctext)
66 66 while 0 < w and uctext[w - 1].isspace():
67 67 w -= 1
68 68 yield (uctext[:w].encode(encoding.encoding),
69 69 uctext[w:].encode(encoding.encoding))
70 70 break
71 71 yield text[start:m.start(0)], m.group(1)
72 72 start = m.end(1)
73 73
74 74 return "".join([space_re.sub(' ', util.wrap(para, width=width)) + rest
75 75 for para, rest in findparas()])
76 76
77 77 def firstline(text):
78 78 '''return the first line of text'''
79 79 try:
80 80 return text.splitlines(True)[0].rstrip('\r\n')
81 81 except IndexError:
82 82 return ''
83 83
84 84 def nl2br(text):
85 85 '''replace raw newlines with xhtml line breaks.'''
86 86 return text.replace('\n', '<br/>\n')
87 87
88 88 def obfuscate(text):
89 89 text = unicode(text, encoding.encoding, 'replace')
90 90 return ''.join(['&#%d;' % ord(c) for c in text])
91 91
92 92 def domain(author):
93 93 '''get domain of author, or empty string if none.'''
94 94 f = author.find('@')
95 95 if f == -1:
96 96 return ''
97 97 author = author[f + 1:]
98 98 f = author.find('>')
99 99 if f >= 0:
100 100 author = author[:f]
101 101 return author
102 102
103 103 def person(author):
104 104 '''get name of author, or else username.'''
105 105 if not '@' in author:
106 106 return author
107 107 f = author.find('<')
108 108 if f == -1:
109 109 return util.shortuser(author)
110 110 return author[:f].rstrip()
111 111
112 112 def indent(text, prefix):
113 113 '''indent each non-empty line of text after first with prefix.'''
114 114 lines = text.splitlines()
115 115 num_lines = len(lines)
116 116 endswithnewline = text[-1:] == '\n'
117 117 def indenter():
118 118 for i in xrange(num_lines):
119 119 l = lines[i]
120 120 if i and l.strip():
121 121 yield prefix
122 122 yield l
123 123 if i < num_lines - 1 or endswithnewline:
124 124 yield '\n'
125 125 return "".join(indenter())
126 126
127 127 def permissions(flags):
128 128 if "l" in flags:
129 129 return "lrwxrwxrwx"
130 130 if "x" in flags:
131 131 return "-rwxr-xr-x"
132 132 return "-rw-r--r--"
133 133
134 134 def xmlescape(text):
135 135 text = (text
136 136 .replace('&', '&amp;')
137 137 .replace('<', '&lt;')
138 138 .replace('>', '&gt;')
139 139 .replace('"', '&quot;')
140 140 .replace("'", '&#39;')) # &apos; invalid in HTML
141 141 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
142 142
143 def uescape(c):
144 if ord(c) < 0x80:
145 return c
146 else:
147 return '\\u%04x' % ord(c)
148
143 149 _escapes = [
144 150 ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'),
145 151 ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'),
146 152 ]
147 153
148 154 def jsonescape(s):
149 155 for k, v in _escapes:
150 156 s = s.replace(k, v)
151 return s
157 return ''.join(uescape(c) for c in s)
152 158
153 159 def json(obj):
154 160 if obj is None or obj is False or obj is True:
155 161 return {None: 'null', False: 'false', True: 'true'}[obj]
156 162 elif isinstance(obj, int) or isinstance(obj, float):
157 163 return str(obj)
158 164 elif isinstance(obj, str):
159 165 u = unicode(obj, encoding.encoding, 'replace')
160 return '"%s"' % jsonescape(u).encode('utf-8')
166 return '"%s"' % jsonescape(u)
161 167 elif isinstance(obj, unicode):
162 return '"%s"' % jsonescape(obj).encode('utf-8')
168 return '"%s"' % jsonescape(obj)
163 169 elif hasattr(obj, 'keys'):
164 170 out = []
165 171 for k, v in obj.iteritems():
166 172 s = '%s: %s' % (json(k), json(v))
167 173 out.append(s)
168 174 return '{' + ', '.join(out) + '}'
169 175 elif hasattr(obj, '__iter__'):
170 176 out = []
171 177 for i in obj:
172 178 out.append(json(i))
173 179 return '[' + ', '.join(out) + ']'
174 180 else:
175 181 raise TypeError('cannot encode type %s' % obj.__class__.__name__)
176 182
177 183 def stripdir(text):
178 184 '''Treat the text as path and strip a directory level, if possible.'''
179 185 dir = os.path.dirname(text)
180 186 if dir == "":
181 187 return os.path.basename(text)
182 188 else:
183 189 return dir
184 190
185 191 def nonempty(str):
186 192 return str or "(none)"
187 193
188 194 filters = {
189 195 "addbreaks": nl2br,
190 196 "basename": os.path.basename,
191 197 "stripdir": stripdir,
192 198 "age": age,
193 199 "date": lambda x: util.datestr(x),
194 200 "domain": domain,
195 201 "email": util.email,
196 202 "escape": lambda x: cgi.escape(x, True),
197 203 "fill68": lambda x: fill(x, width=68),
198 204 "fill76": lambda x: fill(x, width=76),
199 205 "firstline": firstline,
200 206 "tabindent": lambda x: indent(x, '\t'),
201 207 "hgdate": lambda x: "%d %d" % x,
202 208 "isodate": lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2'),
203 209 "isodatesec": lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2'),
204 210 "json": json,
205 211 "jsonescape": jsonescape,
206 212 "localdate": lambda x: (x[0], util.makedate()[1]),
207 213 "nonempty": nonempty,
208 214 "obfuscate": obfuscate,
209 215 "permissions": permissions,
210 216 "person": person,
211 217 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2"),
212 218 "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2"),
213 219 "short": lambda x: x[:12],
214 220 "shortdate": util.shortdate,
215 221 "stringify": stringify,
216 222 "strip": lambda x: x.strip(),
217 223 "urlescape": lambda x: urllib.quote(x),
218 224 "user": lambda x: util.shortuser(x),
219 225 "stringescape": lambda x: x.encode('string_escape'),
220 226 "xmlescape": xmlescape,
221 227 }
@@ -1,988 +1,988
1 1 % Set up the repo
2 2 adding da/foo
3 3 adding foo
4 4 marked working directory as branch stable
5 5 % Logs and changes
6 6 200 Script output follows
7 7
8 8 <?xml version="1.0" encoding="ascii"?>
9 9 <feed xmlns="http://127.0.0.1/2005/Atom">
10 10 <!-- Changelog -->
11 11 <id>http://127.0.0.1/</id>
12 12 <link rel="self" href="http://127.0.0.1/atom-log"/>
13 13 <link rel="alternate" href="http://127.0.0.1/"/>
14 14 <title>test Changelog</title>
15 15 <updated>1970-01-01T00:00:00+00:00</updated>
16 16
17 17 <entry>
18 18 <title>branch</title>
19 19 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
20 20 <link href="http://127.0.0.1/rev/1d22e65f027e"/>
21 21 <author>
22 22 <name>test</name>
23 23 <email>&#116;&#101;&#115;&#116;</email>
24 24 </author>
25 25 <updated>1970-01-01T00:00:00+00:00</updated>
26 26 <published>1970-01-01T00:00:00+00:00</published>
27 27 <content type="xhtml">
28 28 <div xmlns="http://127.0.0.1/1999/xhtml">
29 29 <pre xml:space="preserve">branch</pre>
30 30 </div>
31 31 </content>
32 32 </entry>
33 33 <entry>
34 34 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
35 35 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
36 36 <link href="http://127.0.0.1/rev/a4f92ed23982"/>
37 37 <author>
38 38 <name>test</name>
39 39 <email>&#116;&#101;&#115;&#116;</email>
40 40 </author>
41 41 <updated>1970-01-01T00:00:00+00:00</updated>
42 42 <published>1970-01-01T00:00:00+00:00</published>
43 43 <content type="xhtml">
44 44 <div xmlns="http://127.0.0.1/1999/xhtml">
45 45 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
46 46 </div>
47 47 </content>
48 48 </entry>
49 49 <entry>
50 50 <title>base</title>
51 51 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
52 52 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
53 53 <author>
54 54 <name>test</name>
55 55 <email>&#116;&#101;&#115;&#116;</email>
56 56 </author>
57 57 <updated>1970-01-01T00:00:00+00:00</updated>
58 58 <published>1970-01-01T00:00:00+00:00</published>
59 59 <content type="xhtml">
60 60 <div xmlns="http://127.0.0.1/1999/xhtml">
61 61 <pre xml:space="preserve">base</pre>
62 62 </div>
63 63 </content>
64 64 </entry>
65 65
66 66 </feed>
67 67 200 Script output follows
68 68
69 69 <?xml version="1.0" encoding="ascii"?>
70 70 <feed xmlns="http://127.0.0.1/2005/Atom">
71 71 <!-- Changelog -->
72 72 <id>http://127.0.0.1/</id>
73 73 <link rel="self" href="http://127.0.0.1/atom-log"/>
74 74 <link rel="alternate" href="http://127.0.0.1/"/>
75 75 <title>test Changelog</title>
76 76 <updated>1970-01-01T00:00:00+00:00</updated>
77 77
78 78 <entry>
79 79 <title>branch</title>
80 80 <id>http://127.0.0.1/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id>
81 81 <link href="http://127.0.0.1/rev/1d22e65f027e"/>
82 82 <author>
83 83 <name>test</name>
84 84 <email>&#116;&#101;&#115;&#116;</email>
85 85 </author>
86 86 <updated>1970-01-01T00:00:00+00:00</updated>
87 87 <published>1970-01-01T00:00:00+00:00</published>
88 88 <content type="xhtml">
89 89 <div xmlns="http://127.0.0.1/1999/xhtml">
90 90 <pre xml:space="preserve">branch</pre>
91 91 </div>
92 92 </content>
93 93 </entry>
94 94 <entry>
95 95 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
96 96 <id>http://127.0.0.1/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id>
97 97 <link href="http://127.0.0.1/rev/a4f92ed23982"/>
98 98 <author>
99 99 <name>test</name>
100 100 <email>&#116;&#101;&#115;&#116;</email>
101 101 </author>
102 102 <updated>1970-01-01T00:00:00+00:00</updated>
103 103 <published>1970-01-01T00:00:00+00:00</published>
104 104 <content type="xhtml">
105 105 <div xmlns="http://127.0.0.1/1999/xhtml">
106 106 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
107 107 </div>
108 108 </content>
109 109 </entry>
110 110 <entry>
111 111 <title>base</title>
112 112 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
113 113 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
114 114 <author>
115 115 <name>test</name>
116 116 <email>&#116;&#101;&#115;&#116;</email>
117 117 </author>
118 118 <updated>1970-01-01T00:00:00+00:00</updated>
119 119 <published>1970-01-01T00:00:00+00:00</published>
120 120 <content type="xhtml">
121 121 <div xmlns="http://127.0.0.1/1999/xhtml">
122 122 <pre xml:space="preserve">base</pre>
123 123 </div>
124 124 </content>
125 125 </entry>
126 126
127 127 </feed>
128 128 200 Script output follows
129 129
130 130 <?xml version="1.0" encoding="ascii"?>
131 131 <feed xmlns="http://127.0.0.1/2005/Atom">
132 132 <id>http://127.0.0.1/atom-log/tip/foo</id>
133 133 <link rel="self" href="http://127.0.0.1/atom-log/tip/foo"/>
134 134 <title>test: foo history</title>
135 135 <updated>1970-01-01T00:00:00+00:00</updated>
136 136
137 137 <entry>
138 138 <title>base</title>
139 139 <id>http://127.0.0.1/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id>
140 140 <link href="http://127.0.0.1/rev/2ef0ac749a14"/>
141 141 <author>
142 142 <name>test</name>
143 143 <email>&#116;&#101;&#115;&#116;</email>
144 144 </author>
145 145 <updated>1970-01-01T00:00:00+00:00</updated>
146 146 <published>1970-01-01T00:00:00+00:00</published>
147 147 <content type="xhtml">
148 148 <div xmlns="http://127.0.0.1/1999/xhtml">
149 149 <pre xml:space="preserve">base</pre>
150 150 </div>
151 151 </content>
152 152 </entry>
153 153
154 154 </feed>
155 155 200 Script output follows
156 156
157 157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
158 158 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
159 159 <head>
160 160 <link rel="icon" href="/static/hgicon.png" type="image/png" />
161 161 <meta name="robots" content="index, nofollow" />
162 162 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
163 163
164 164 <title>test: log</title>
165 165 <link rel="alternate" type="application/atom+xml"
166 166 href="/atom-log" title="Atom feed for test" />
167 167 <link rel="alternate" type="application/rss+xml"
168 168 href="/rss-log" title="RSS feed for test" />
169 169 </head>
170 170 <body>
171 171
172 172 <div class="container">
173 173 <div class="menu">
174 174 <div class="logo">
175 175 <a href="http://mercurial.selenic.com/">
176 176 <img src="/static/hglogo.png" alt="mercurial" /></a>
177 177 </div>
178 178 <ul>
179 179 <li class="active">log</li>
180 180 <li><a href="/graph/1d22e65f027e">graph</a></li>
181 181 <li><a href="/tags">tags</a></li>
182 182 <li><a href="/branches">branches</a></li>
183 183 </ul>
184 184 <ul>
185 185 <li><a href="/rev/1d22e65f027e">changeset</a></li>
186 186 <li><a href="/file/1d22e65f027e">browse</a></li>
187 187 </ul>
188 188 <ul>
189 189
190 190 </ul>
191 191 </div>
192 192
193 193 <div class="main">
194 194 <h2><a href="/">test</a></h2>
195 195 <h3>log</h3>
196 196
197 197 <form class="search" action="/log">
198 198
199 199 <p><input name="rev" id="search1" type="text" size="30" /></p>
200 200 <div id="hint">find changesets by author, revision,
201 201 files, or words in the commit message</div>
202 202 </form>
203 203
204 204 <div class="navigate">
205 205 <a href="/shortlog/2?revcount=30">less</a>
206 206 <a href="/shortlog/2?revcount=120">more</a>
207 207 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
208 208 </div>
209 209
210 210 <table class="bigtable">
211 211 <tr>
212 212 <th class="age">age</th>
213 213 <th class="author">author</th>
214 214 <th class="description">description</th>
215 215 </tr>
216 216 <tr class="parity0">
217 217 <td class="age">1970-01-01</td>
218 218 <td class="author">test</td>
219 219 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> </td>
220 220 </tr>
221 221 <tr class="parity1">
222 222 <td class="age">1970-01-01</td>
223 223 <td class="author">test</td>
224 224 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
225 225 </tr>
226 226 <tr class="parity0">
227 227 <td class="age">1970-01-01</td>
228 228 <td class="author">test</td>
229 229 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
230 230 </tr>
231 231
232 232 </table>
233 233
234 234 <div class="navigate">
235 235 <a href="/shortlog/2?revcount=30">less</a>
236 236 <a href="/shortlog/2?revcount=120">more</a>
237 237 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
238 238 </div>
239 239
240 240 </div>
241 241 </div>
242 242
243 243
244 244
245 245 </body>
246 246 </html>
247 247
248 248 200 Script output follows
249 249
250 250 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
251 251 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
252 252 <head>
253 253 <link rel="icon" href="/static/hgicon.png" type="image/png" />
254 254 <meta name="robots" content="index, nofollow" />
255 255 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
256 256
257 257 <title>test: 2ef0ac749a14</title>
258 258 </head>
259 259 <body>
260 260 <div class="container">
261 261 <div class="menu">
262 262 <div class="logo">
263 263 <a href="http://mercurial.selenic.com/">
264 264 <img src="/static/hglogo.png" alt="mercurial" /></a>
265 265 </div>
266 266 <ul>
267 267 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
268 268 <li><a href="/graph/2ef0ac749a14">graph</a></li>
269 269 <li><a href="/tags">tags</a></li>
270 270 <li><a href="/branches">branches</a></li>
271 271 </ul>
272 272 <ul>
273 273 <li class="active">changeset</li>
274 274 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
275 275 <li><a href="/file/2ef0ac749a14">browse</a></li>
276 276 </ul>
277 277 <ul>
278 278
279 279 </ul>
280 280 </div>
281 281
282 282 <div class="main">
283 283
284 284 <h2><a href="/">test</a></h2>
285 285 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> </h3>
286 286
287 287 <form class="search" action="/log">
288 288
289 289 <p><input name="rev" id="search1" type="text" size="30" /></p>
290 290 <div id="hint">find changesets by author, revision,
291 291 files, or words in the commit message</div>
292 292 </form>
293 293
294 294 <div class="description">base</div>
295 295
296 296 <table id="changesetEntry">
297 297 <tr>
298 298 <th class="author">author</th>
299 299 <td class="author">&#116;&#101;&#115;&#116;</td>
300 300 </tr>
301 301 <tr>
302 302 <th class="date">date</th>
303 303 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
304 304 <tr>
305 305 <th class="author">parents</th>
306 306 <td class="author"></td>
307 307 </tr>
308 308 <tr>
309 309 <th class="author">children</th>
310 310 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
311 311 </tr>
312 312 <tr>
313 313 <th class="files">files</th>
314 314 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
315 315 </tr>
316 316 </table>
317 317
318 318 <div class="overflow">
319 319 <div class="sourcefirst"> line diff</div>
320 320
321 321 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
322 322 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
323 323 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
324 324 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
325 325 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
326 326 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
327 327 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
328 328 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
329 329 </span></pre></div>
330 330 </div>
331 331
332 332 </div>
333 333 </div>
334 334
335 335
336 336 </body>
337 337 </html>
338 338
339 339 200 Script output follows
340 340
341 341
342 342 # HG changeset patch
343 343 # User test
344 344 # Date 0 0
345 345 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
346 346 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
347 347 Added tag 1.0 for changeset 2ef0ac749a14
348 348
349 349 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
350 350 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
351 351 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
352 352 @@ -0,0 +1,1 @@
353 353 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
354 354
355 355 200 Script output follows
356 356
357 357 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
358 358 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
359 359 <head>
360 360 <link rel="icon" href="/static/hgicon.png" type="image/png" />
361 361 <meta name="robots" content="index, nofollow" />
362 362 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
363 363
364 364 <title>test: searching for base</title>
365 365 </head>
366 366 <body>
367 367
368 368 <div class="container">
369 369 <div class="menu">
370 370 <div class="logo">
371 371 <a href="http://mercurial.selenic.com/">
372 372 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
373 373 </div>
374 374 <ul>
375 375 <li><a href="/shortlog">log</a></li>
376 376 <li><a href="/graph">graph</a></li>
377 377 <li><a href="/tags">tags</a></li>
378 378 <li><a href="/branches">branches</a></li>
379 379 </ul>
380 380 </div>
381 381
382 382 <div class="main">
383 383 <h2><a href="/">test</a></h2>
384 384 <h3>searching for 'base'</h3>
385 385
386 386 <form class="search" action="/log">
387 387
388 388 <p><input name="rev" id="search1" type="text" size="30"></p>
389 389 <div id="hint">find changesets by author, revision,
390 390 files, or words in the commit message</div>
391 391 </form>
392 392
393 393 <div class="navigate">
394 394 <a href="/search/?rev=base&revcount=5">less</a>
395 395 <a href="/search/?rev=base&revcount=20">more</a>
396 396 </div>
397 397
398 398 <table class="bigtable">
399 399 <tr>
400 400 <th class="age">age</th>
401 401 <th class="author">author</th>
402 402 <th class="description">description</th>
403 403 </tr>
404 404 <tr class="parity0">
405 405 <td class="age">1970-01-01</td>
406 406 <td class="author">test</td>
407 407 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> </td>
408 408 </tr>
409 409
410 410 </table>
411 411
412 412 <div class="navigate">
413 413 <a href="/search/?rev=base&revcount=5">less</a>
414 414 <a href="/search/?rev=base&revcount=20">more</a>
415 415 </div>
416 416
417 417 </div>
418 418 </div>
419 419
420 420
421 421
422 422 </body>
423 423 </html>
424 424
425 425 % File-related
426 426 200 Script output follows
427 427
428 428 foo
429 429 200 Script output follows
430 430
431 431
432 432 test@0: foo
433 433
434 434
435 435
436 436
437 437 200 Script output follows
438 438
439 439
440 440 drwxr-xr-x da
441 441 -rw-r--r-- 45 .hgtags
442 442 -rw-r--r-- 4 foo
443 443
444 444
445 445 200 Script output follows
446 446
447 447 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
448 448 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
449 449 <head>
450 450 <link rel="icon" href="/static/hgicon.png" type="image/png" />
451 451 <meta name="robots" content="index, nofollow" />
452 452 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
453 453
454 454 <title>test: a4f92ed23982 foo</title>
455 455 </head>
456 456 <body>
457 457
458 458 <div class="container">
459 459 <div class="menu">
460 460 <div class="logo">
461 461 <a href="http://mercurial.selenic.com/">
462 462 <img src="/static/hglogo.png" alt="mercurial" /></a>
463 463 </div>
464 464 <ul>
465 465 <li><a href="/shortlog/a4f92ed23982">log</a></li>
466 466 <li><a href="/graph/a4f92ed23982">graph</a></li>
467 467 <li><a href="/tags">tags</a></li>
468 468 <li><a href="/branches">branches</a></li>
469 469 </ul>
470 470 <ul>
471 471 <li><a href="/rev/a4f92ed23982">changeset</a></li>
472 472 <li><a href="/file/a4f92ed23982/">browse</a></li>
473 473 </ul>
474 474 <ul>
475 475 <li class="active">file</li>
476 476 <li><a href="/file/tip/foo">latest</a></li>
477 477 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
478 478 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
479 479 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
480 480 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
481 481 </ul>
482 482 </div>
483 483
484 484 <div class="main">
485 485 <h2><a href="/">test</a></h2>
486 486 <h3>view foo @ 1:a4f92ed23982</h3>
487 487
488 488 <form class="search" action="/log">
489 489
490 490 <p><input name="rev" id="search1" type="text" size="30" /></p>
491 491 <div id="hint">find changesets by author, revision,
492 492 files, or words in the commit message</div>
493 493 </form>
494 494
495 495 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
496 496
497 497 <table id="changesetEntry">
498 498 <tr>
499 499 <th class="author">author</th>
500 500 <td class="author">&#116;&#101;&#115;&#116;</td>
501 501 </tr>
502 502 <tr>
503 503 <th class="date">date</th>
504 504 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
505 505 </tr>
506 506 <tr>
507 507 <th class="author">parents</th>
508 508 <td class="author"></td>
509 509 </tr>
510 510 <tr>
511 511 <th class="author">children</th>
512 512 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
513 513 </tr>
514 514
515 515 </table>
516 516
517 517 <div class="overflow">
518 518 <div class="sourcefirst"> line source</div>
519 519
520 520 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
521 521 </div>
522 522 <div class="sourcelast"></div>
523 523 </div>
524 524 </div>
525 525 </div>
526 526
527 527
528 528
529 529 </body>
530 530 </html>
531 531
532 532 200 Script output follows
533 533
534 534
535 535 diff -r 000000000000 -r a4f92ed23982 foo
536 536 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
537 537 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
538 538 @@ -0,0 +1,1 @@
539 539 +foo
540 540
541 541
542 542
543 543
544 544 % Overviews
545 545 200 Script output follows
546 546
547 547 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
548 548 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
549 549 200 Script output follows
550 550
551 551 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
552 552 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
553 553 200 Script output follows
554 554
555 555 <?xml version="1.0" encoding="ascii"?>
556 556 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
557 557 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
558 558 <head>
559 559 <link rel="icon" href="/static/hgicon.png" type="image/png" />
560 560 <meta name="robots" content="index, nofollow"/>
561 561 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
562 562
563 563
564 564 <title>test: Summary</title>
565 565 <link rel="alternate" type="application/atom+xml"
566 566 href="/atom-log" title="Atom feed for test"/>
567 567 <link rel="alternate" type="application/rss+xml"
568 568 href="/rss-log" title="RSS feed for test"/>
569 569 </head>
570 570 <body>
571 571
572 572 <div class="page_header">
573 573 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
574 574
575 575 <form action="/log">
576 576 <input type="hidden" name="style" value="gitweb" />
577 577 <div class="search">
578 578 <input type="text" name="rev" />
579 579 </div>
580 580 </form>
581 581 </div>
582 582
583 583 <div class="page_nav">
584 584 summary |
585 585 <a href="/shortlog?style=gitweb">shortlog</a> |
586 586 <a href="/log?style=gitweb">changelog</a> |
587 587 <a href="/graph?style=gitweb">graph</a> |
588 588 <a href="/tags?style=gitweb">tags</a> |
589 589 <a href="/branches?style=gitweb">branches</a> |
590 590 <a href="/file/1d22e65f027e?style=gitweb">files</a>
591 591 <br/>
592 592 </div>
593 593
594 594 <div class="title">&nbsp;</div>
595 595 <table cellspacing="0">
596 596 <tr><td>description</td><td>unknown</td></tr>
597 597 <tr><td>owner</td><td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td></tr>
598 598 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
599 599 </table>
600 600
601 601 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
602 602 <table cellspacing="0">
603 603
604 604 <tr class="parity0">
605 605 <td class="age"><i>1970-01-01</i></td>
606 606 <td><i>test</i></td>
607 607 <td>
608 608 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
609 609 <b>branch</b>
610 610 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> </span>
611 611 </a>
612 612 </td>
613 613 <td class="link" nowrap>
614 614 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
615 615 <a href="/file/1d22e65f027e?style=gitweb">files</a>
616 616 </td>
617 617 </tr>
618 618 <tr class="parity1">
619 619 <td class="age"><i>1970-01-01</i></td>
620 620 <td><i>test</i></td>
621 621 <td>
622 622 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
623 623 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
624 624 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
625 625 </a>
626 626 </td>
627 627 <td class="link" nowrap>
628 628 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
629 629 <a href="/file/a4f92ed23982?style=gitweb">files</a>
630 630 </td>
631 631 </tr>
632 632 <tr class="parity0">
633 633 <td class="age"><i>1970-01-01</i></td>
634 634 <td><i>test</i></td>
635 635 <td>
636 636 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
637 637 <b>base</b>
638 638 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> </span>
639 639 </a>
640 640 </td>
641 641 <td class="link" nowrap>
642 642 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
643 643 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
644 644 </td>
645 645 </tr>
646 646 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
647 647 </table>
648 648
649 649 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
650 650 <table cellspacing="0">
651 651
652 652 <tr class="parity0">
653 653 <td class="age"><i>1970-01-01</i></td>
654 654 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
655 655 <td class="link">
656 656 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
657 657 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
658 658 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
659 659 </td>
660 660 </tr>
661 661 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
662 662 </table>
663 663
664 664 <div><a class="title" href="#">branches</a></div>
665 665 <table cellspacing="0">
666 666
667 667 <tr class="parity0">
668 668 <td class="age"><i>1970-01-01</i></td>
669 669 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
670 670 <td class="">stable</td>
671 671 <td class="link">
672 672 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
673 673 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
674 674 <a href="/file/1d22e65f027e?style=gitweb">files</a>
675 675 </td>
676 676 </tr>
677 677 <tr class="parity1">
678 678 <td class="age"><i>1970-01-01</i></td>
679 679 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
680 680 <td class="">default</td>
681 681 <td class="link">
682 682 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
683 683 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
684 684 <a href="/file/a4f92ed23982?style=gitweb">files</a>
685 685 </td>
686 686 </tr>
687 687 <tr class="light">
688 688 <td colspan="4"><a class="list" href="#">...</a></td>
689 689 </tr>
690 690 </table>
691 691 <div class="page_footer">
692 692 <div class="page_footer_text">test</div>
693 693 <div class="rss_logo">
694 694 <a href="/rss-log">RSS</a>
695 695 <a href="/atom-log">Atom</a>
696 696 </div>
697 697 <br />
698 698
699 699 </div>
700 700 </body>
701 701 </html>
702 702
703 703 200 Script output follows
704 704
705 705 <?xml version="1.0" encoding="ascii"?>
706 706 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
707 707 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
708 708 <head>
709 709 <link rel="icon" href="/static/hgicon.png" type="image/png" />
710 710 <meta name="robots" content="index, nofollow"/>
711 711 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
712 712
713 713
714 714 <title>test: Graph</title>
715 715 <link rel="alternate" type="application/atom+xml"
716 716 href="/atom-log" title="Atom feed for test"/>
717 717 <link rel="alternate" type="application/rss+xml"
718 718 href="/rss-log" title="RSS feed for test"/>
719 719 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
720 720 </head>
721 721 <body>
722 722
723 723 <div class="page_header">
724 724 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
725 725 </div>
726 726
727 727 <form action="/log">
728 728 <input type="hidden" name="style" value="gitweb" />
729 729 <div class="search">
730 730 <input type="text" name="rev" />
731 731 </div>
732 732 </form>
733 733 <div class="page_nav">
734 734 <a href="/summary?style=gitweb">summary</a> |
735 735 <a href="/shortlog?style=gitweb">shortlog</a> |
736 736 <a href="/log/2?style=gitweb">changelog</a> |
737 737 graph |
738 738 <a href="/tags?style=gitweb">tags</a> |
739 739 <a href="/branches?style=gitweb">branches</a> |
740 740 <a href="/file/1d22e65f027e?style=gitweb">files</a>
741 741 <br/>
742 742 <a href="/graph/2?style=gitweb&revcount=30">less</a>
743 743 <a href="/graph/2?style=gitweb&revcount=120">more</a>
744 744 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
745 745 </div>
746 746
747 747 <div class="title">&nbsp;</div>
748 748
749 749 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
750 750
751 751 <div id="wrapper">
752 752 <ul id="nodebgs"></ul>
753 753 <canvas id="graph" width="224" height="129"></canvas>
754 754 <ul id="graphnodes"></ul>
755 755 </div>
756 756
757 757 <script type="text/javascript" src="/static/graph.js"></script>
758 758 <script>
759 759 <!-- hide script content
760 760
761 761 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
762 762 var graph = new Graph();
763 763 graph.scale(39);
764 764
765 765 graph.edge = function(x0, y0, x1, y1, color) {
766 766
767 767 this.setColor(color, 0.0, 0.65);
768 768 this.ctx.beginPath();
769 769 this.ctx.moveTo(x0, y0);
770 770 this.ctx.lineTo(x1, y1);
771 771 this.ctx.stroke();
772 772
773 773 }
774 774
775 775 var revlink = '<li style="_STYLE"><span class="desc">';
776 776 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
777 777 revlink += '</span> _TAGS';
778 778 revlink += '<span class="info">_DATE, by _USER</span></li>';
779 779
780 780 graph.vertex = function(x, y, color, parity, cur) {
781 781
782 782 this.ctx.beginPath();
783 783 color = this.setColor(color, 0.25, 0.75);
784 784 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
785 785 this.ctx.fill();
786 786
787 787 var bg = '<li class="bg parity' + parity + '"></li>';
788 788 var left = (this.columns + 1) * this.bg_height;
789 789 var nstyle = 'padding-left: ' + left + 'px;';
790 790 var item = revlink.replace(/_STYLE/, nstyle);
791 791 item = item.replace(/_PARITY/, 'parity' + parity);
792 792 item = item.replace(/_NODEID/, cur[0]);
793 793 item = item.replace(/_NODEID/, cur[0]);
794 794 item = item.replace(/_DESC/, cur[3]);
795 795 item = item.replace(/_USER/, cur[4]);
796 796 item = item.replace(/_DATE/, cur[5]);
797 797
798 798 var tagspan = '';
799 799 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) {
800 800 tagspan = '<span class="logtags">';
801 801 if (cur[6][1]) {
802 802 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
803 803 tagspan += cur[6][0] + '</span> ';
804 804 } else if (!cur[6][1] && cur[6][0] != 'default') {
805 805 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
806 806 tagspan += cur[6][0] + '</span> ';
807 807 }
808 808 if (cur[7].length) {
809 809 for (var t in cur[7]) {
810 810 var tag = cur[7][t];
811 811 tagspan += '<span class="tagtag">' + tag + '</span> ';
812 812 }
813 813 }
814 814 tagspan += '</span>';
815 815 }
816 816
817 817 item = item.replace(/_TAGS/, tagspan);
818 818 return [bg, item];
819 819
820 820 }
821 821
822 822 graph.render(data);
823 823
824 824 // stop hiding script -->
825 825 </script>
826 826
827 827 <div class="page_nav">
828 828 <a href="/graph/2?style=gitweb&revcount=30">less</a>
829 829 <a href="/graph/2?style=gitweb&revcount=120">more</a>
830 830 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
831 831 </div>
832 832
833 833 <div class="page_footer">
834 834 <div class="page_footer_text">test</div>
835 835 <div class="rss_logo">
836 836 <a href="/rss-log">RSS</a>
837 837 <a href="/atom-log">Atom</a>
838 838 </div>
839 839 <br />
840 840
841 841 </div>
842 842 </body>
843 843 </html>
844 844
845 845 % capabilities
846 846 200 Script output follows
847 847
848 848 lookup changegroupsubset branchmap pushkey unbundle=HG10GZ,HG10BZ,HG10UN% heads
849 849 200 Script output follows
850 850
851 851 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
852 852 % lookup
853 853 200 Script output follows
854 854
855 855 1 a4f92ed23982be056b9852de5dfe873eaac7f0de
856 856 % branches
857 857 200 Script output follows
858 858
859 859 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
860 860 % changegroup
861 861 200 Script output follows
862 862
863 863 x\x9c\xbdTMHUA\x14\xbe\xa8\xf9\xec\xda&\x10\x11*\xb8\x88\x81\x99\xbef\xe6\xce\xbdw\xc6\xf2a\x16E\x1b\x11[%\x98\xcc\xaf\x8f\x8c\xf7\xc0\xf7\x82
864 864 4\x11KP2m\x95\xad*\xabE\x05AP\xd0\xc22Z\x14\xf9\x03\xb9j\xa3\x9b$\xa4MJ\xb4\x90\xc0\x9a\x9bO0\x10\xdf\x13\xa2\x81\x0f\x869g\xe6|\xe7\x9c\xef\x8ceY\xf7\xa2KO\xd2\xb7K\x16~\
865 865 \xe9\xad\x90w\x86\xab\x93W\x8e\xdf\xb0r\\Y\xee6(\xa2)\xf6\x95\xc6\x01\xe4\x1az\x80R\xe8kN\x98\xe7R\xa4\xa9K@\xe0!A\xb4k\xa7U*m\x03\x07\xd8\x92\x1d\xd2\xc9\xa4\x1d\xc2\xe6,\xa5\xcc+\x1f\xef\xafDgi\xef\xab\x1d\x1d\xb7\x9a\xe7[W\xfbc\x8f\xde-\xcd\xe7\xcaz\xb3\xbb\x19\xd3\x81\x10>c>\x08\x00"X\x11\xc2\x84@\xd2\xe7B*L\x00\x01P\x04R\xc3@\xbaB0\xdb8#\x83:\x83\xa2h\xbc=\xcd\xdaS\xe1Y,L\xd3\xa0\xf2\xa8\x94J:\xe6\xd8\x81Q\xe0\xe8d\xa7#\xe2,\xd1\xaeR*\xed \xa5\x01\x13\x01\xa6\x0cb\xe3;\xbe\xaf\xfcK[^wK\xe1N\xaf\xbbk\xe8B\xd1\xf4\xc1\x07\xb3\xab[\x10\xfdkmvwcB\xa6\xa4\xd4G\xc4D\xc2\x141\xad\x91\x10\x00\x08J\x81\xcb}\xee\t\xee+W\xba\x8a\x80\x90|\xd4\xa0\xd6\xa0\xd4T\xde\xe1\x9d,!\xe2\xb5\xa94\xe3\xe7\xd5\x9f\x06\x18\xcba\x03aP\xb8f\xcd\x04\x1a_\\9\xf1\xed\xe4\x9e\xe5\xa6\xd1\xd2\x9f\x03\xa7o\xae\x90H\xf3\xfb\xef\xffH3\xadk
866 866 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3\'\x859
867 867 \xa8\x80\x84S \xa5\xbd-g\x13`\xe4\xdc\xc3H^\xdf\xe2\xc0TM\xc7\xf4BO\xcf\xde\xae\xe5\xae#\x1frM(K\x97`F\x19\x16s\x05GD\xb9\x01\xc1\x00+\x8c|\x9fp\xc11\xf0\x14\x00\x9cJ\x82<\xe0\x12\x9f\xc1\x90\xd0\xf5\xc8\x19>Pr\xaa\xeaW\xf5\xc4\xae\xd1\xfc\x17\xcf\'\x13u\xb1\x9e\xcdHnC\x0e\xcc`\xc8\xa0&\xac\x0e\xf1|\x8c\x10$\xc4\x8c\xa2p\x05`\xdc\x08 \x80\xc4\xd7Rr-\x94\x10\x102\xedi;\xf3f\xf1z\x16\x86\xdb\xd8d\xe5\xe7\x8b\xf5\x8d\rzp\xb2\xfe\xac\xf5\xf2\xd3\xfe\xfckws\xedt\x96b\xd5l\x1c\x0b\x85\xb5\x170\x8f\x11\x84\xb0\x8f\x19\xa0\x00\t_\x07\x1ac\xa2\xc3\x89Z\xe7\x96\xf9 \xccNFg\xc7F\xaa\x8a+\x9a\x9cc_\x17\x1b\x17\x9e]z38<\x97+\xb5,",\xc8\xc8?\\\x91\xff\x17.~U\x96\x97\xf5%\xdeN<\x8e\xf5\x97%\xe7^\xcfL\xed~\xda\x96k\xdc->\x86\x02\x83"\x96H\xa6\xe3\xaas=-\xeb7\xe5\xda\x8f\xbc
868 868 % stream_out
869 869 200 Script output follows
870 870
871 871 1
872 872 % failing unbundle, requires POST request
873 873 405 push requires POST request
874 874
875 875 0
876 876 push requires POST request
877 877 % Static files
878 878 200 Script output follows
879 879
880 880 a { text-decoration:none; }
881 881 .age { white-space:nowrap; }
882 882 .date { white-space:nowrap; }
883 883 .indexlinks { white-space:nowrap; }
884 884 .parity0 { background-color: #ddd; }
885 885 .parity1 { background-color: #eee; }
886 886 .lineno { width: 60px; color: #aaa; font-size: smaller;
887 887 text-align: right; }
888 888 .plusline { color: green; }
889 889 .minusline { color: red; }
890 890 .atline { color: purple; }
891 891 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
892 892 .buttons a {
893 893 background-color: #666;
894 894 padding: 2pt;
895 895 color: white;
896 896 font-family: sans;
897 897 font-weight: bold;
898 898 }
899 899 .navigate a {
900 900 background-color: #ccc;
901 901 padding: 2pt;
902 902 font-family: sans;
903 903 color: black;
904 904 }
905 905
906 906 .metatag {
907 907 background-color: #888;
908 908 color: white;
909 909 text-align: right;
910 910 }
911 911
912 912 /* Common */
913 913 pre { margin: 0; }
914 914
915 915 .logo {
916 916 float: right;
917 917 clear: right;
918 918 }
919 919
920 920 /* Changelog/Filelog entries */
921 921 .logEntry { width: 100%; }
922 922 .logEntry .age { width: 15%; }
923 923 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
924 924 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
925 925 .logEntry th.firstline { text-align: left; width: inherit; }
926 926
927 927 /* Shortlog entries */
928 928 .slogEntry { width: 100%; }
929 929 .slogEntry .age { width: 8em; }
930 930 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
931 931 .slogEntry td.author { width: 15em; }
932 932
933 933 /* Tag entries */
934 934 #tagEntries { list-style: none; margin: 0; padding: 0; }
935 935 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
936 936
937 937 /* Changeset entry */
938 938 #changesetEntry { }
939 939 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
940 940 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
941 941
942 942 /* File diff view */
943 943 #filediffEntry { }
944 944 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
945 945
946 946 /* Graph */
947 947 div#wrapper {
948 948 position: relative;
949 949 margin: 0;
950 950 padding: 0;
951 951 }
952 952
953 953 canvas {
954 954 position: absolute;
955 955 z-index: 5;
956 956 top: -0.6em;
957 957 margin: 0;
958 958 }
959 959
960 960 ul#nodebgs {
961 961 list-style: none inside none;
962 962 padding: 0;
963 963 margin: 0;
964 964 top: -0.7em;
965 965 }
966 966
967 967 ul#graphnodes li, ul#nodebgs li {
968 968 height: 39px;
969 969 }
970 970
971 971 ul#graphnodes {
972 972 position: absolute;
973 973 z-index: 10;
974 974 top: -0.85em;
975 975 list-style: none inside none;
976 976 padding: 0;
977 977 }
978 978
979 979 ul#graphnodes li .info {
980 980 display: block;
981 981 font-size: 70%;
982 982 position: relative;
983 983 top: -1px;
984 984 }
985 985 % Stop and restart with HGENCODING=cp932
986 986 % Graph json escape of multibyte character
987 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "能", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
987 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
988 988 % ERRORS ENCOUNTERED
@@ -1,100 +1,100
1 1 #!/bin/sh
2 2
3 3 cat <<EOF >> $HGRCPATH
4 4 [extensions]
5 5 notify=
6 6
7 7 [hooks]
8 8 incoming.notify = python:hgext.notify.hook
9 9
10 10 [notify]
11 11 sources = pull
12 12 diffstat = False
13 13
14 14 [usersubs]
15 15 foo@bar = *
16 16
17 17 [reposubs]
18 18 * = baz
19 19 EOF
20 20
21 21 hg help notify
22 22 hg init a
23 23 echo a > a/a
24 24 echo % commit
25 25 hg --traceback --cwd a commit -Ama -d '0 0'
26 26
27 27 echo % clone
28 28 hg --traceback clone a b
29 29
30 30 echo a >> a/a
31 31 echo % commit
32 32 hg --traceback --cwd a commit -Amb -d '1 0'
33 33
34 34 # on Mac OS X 10.5 the tmp path is very long so would get stripped in the subject line
35 35 cat <<EOF >> $HGRCPATH
36 36 [notify]
37 37 maxsubject = 200
38 38 EOF
39 39
40 40 # the python call below wraps continuation lines, which appear on Mac OS X 10.5 because
41 41 # of the very long subject line
42 42 echo '% pull (minimal config)'
43 43 hg --traceback --cwd b pull ../a 2>&1 |
44 python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' |
44 python -c 'import sys,re; print re.sub("([n:])\\n[\\t ]", "\\1 ", sys.stdin.read()),' |
45 45 sed -e 's/\(Message-Id:\).*/\1/' \
46 46 -e 's/changeset \([0-9a-f]* *\)in .*test-notif/changeset \1in test-notif/' \
47 47 -e 's/^details: .*test-notify/details: test-notify/' \
48 48 -e 's/^Date:.*/Date:/'
49 49
50 50 cat <<EOF >> $HGRCPATH
51 51 [notify]
52 52 config = $HGTMP/.notify.conf
53 53 domain = test.com
54 54 strip = 3
55 55 template = Subject: {desc|firstline|strip}\nFrom: {author}\nX-Test: foo\n\nchangeset {node|short} in {webroot}\ndescription:\n\t{desc|tabindent|strip}
56 56
57 57 [web]
58 58 baseurl = http://test/
59 59 EOF
60 60
61 61 echo % fail for config file is missing
62 62 hg --cwd b rollback
63 63 hg --cwd b pull ../a 2>&1 | grep 'error.*\.notify\.conf' > /dev/null && echo pull failed
64 64
65 65 touch "$HGTMP/.notify.conf"
66 66
67 67 echo % pull
68 68 hg --cwd b rollback
69 69 hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
70 70 -e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
71 71 -e 's/^Date:.*/Date:/'
72 72
73 73 cat << EOF >> $HGRCPATH
74 74 [hooks]
75 75 incoming.notify = python:hgext.notify.hook
76 76
77 77 [notify]
78 78 sources = pull
79 79 diffstat = True
80 80 EOF
81 81
82 82 echo % pull
83 83 hg --cwd b rollback
84 84 hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
85 85 -e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
86 86 -e 's/^Date:.*/Date:/'
87 87
88 88 echo % test merge
89 89 cd a
90 90 hg up -C 0
91 91 echo a >> a
92 92 hg ci -Am adda2 -d '2 0'
93 93 hg merge
94 94 hg ci -m merge -d '3 0'
95 95 cd ..
96 96
97 97 hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
98 98 -e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
99 99 -e 's/^Date:.*/Date:/'
100 100
General Comments 0
You need to be logged in to leave comments. Login now