annotate mercurial/hgweb.py @ 535:fba26990604a

Deal with failed clone/transaction interaction -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Deal with failed clone/transaction interaction > What is happening is that something in the transaction machinery is > causing the directory to be completely recreated. The transaction gets rolled back by its destructor. This is critical so it happens whenever an exception occurs that unwinds the stack. Unfortunately, what's happening with clone is we're trying to delete the directory during exception propagation. And a reference to the transaction is held in the exception backtrace stack frames so it still exists until the exception is completely resolved. So there's no way to do the directory delete inside the exception handling cleanly. But we can handle it similarly to the transaction itself: use an object with a destructor. manifest hash: fc38550a20d64d08333f256bbedc312493c1390b -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCxDT2ywK+sNU5EO8RAjikAJ0Tej56rAutxQDfYzVbFGtT1sEC5ACgmVds /fwdQyHn+FwshugqXLemUaM= =3f78 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Thu, 30 Jun 2005 10:07:50 -0800
parents ab0d1bfeee7c
children c15b4bc0a11c eda4c32c167a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
238
3b92f8fe47ae hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents: 222
diff changeset
1 # hgweb.py - web interface to a mercurial repository
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
2 #
238
3b92f8fe47ae hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents: 222
diff changeset
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3b92f8fe47ae hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents: 222
diff changeset
4 # Copyright 2005 Matt Mackall <mpm@selenic.com>
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
5 #
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
6 # This software may be used and distributed according to the terms
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
7 # of the GNU General Public License, incorporated herein by reference.
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
8
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
9 import os, cgi, time, re, difflib, sys, zlib
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
10 from mercurial.hg import *
215
9ff5a78d0c45 hgweb: import ui
mpm@selenic.com
parents: 201
diff changeset
11 from mercurial.ui import *
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
12
157
2653740d8118 Install the templates where they can be found by hgweb.py
mpm@selenic.com
parents: 156
diff changeset
13 def templatepath():
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
14 for f in "templates", "../templates":
157
2653740d8118 Install the templates where they can be found by hgweb.py
mpm@selenic.com
parents: 156
diff changeset
15 p = os.path.join(os.path.dirname(__file__), f)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
16 if os.path.isdir(p): return p
157
2653740d8118 Install the templates where they can be found by hgweb.py
mpm@selenic.com
parents: 156
diff changeset
17
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
18 def age(t):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
19 def plural(t, c):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
20 if c == 1: return t
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
21 return t + "s"
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
22 def fmt(t, c):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
23 return "%d %s" % (c, plural(t, c))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
24
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
25 now = time.time()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
26 delta = max(1, int(now - t))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
27
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
28 scales = [["second", 1],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
29 ["minute", 60],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
30 ["hour", 3600],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
31 ["day", 3600 * 24],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
32 ["week", 3600 * 24 * 7],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
33 ["month", 3600 * 24 * 30],
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
34 ["year", 3600 * 24 * 365]]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
35
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
36 scales.reverse()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
37
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
38 for t, s in scales:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
39 n = delta / s
195
b98bcf66dd9d hgweb: make age() smarter
mpm@selenic.com
parents: 183
diff changeset
40 if n >= 2 or s == 1: return fmt(t, n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
41
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
42 def nl2br(text):
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
43 return text.replace('\n', '<br/>\n')
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
44
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
45 def obfuscate(text):
533
b8404005d6d5 [PATCH] Generate correctly XML entities for obfuscated user
mpm@selenic.com
parents: 515
diff changeset
46 return ''.join([ '&#%d;' % ord(c) for c in text ])
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
47
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
48 def up(p):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
49 if p[0] != "/": p = "/" + p
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
50 if p[-1] == "/": p = p[:-1]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
51 up = os.path.dirname(p)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
52 if up == "/":
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
53 return "/"
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
54 return up + "/"
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
55
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
56 def httphdr(type):
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
57 print 'Content-type: %s\n' % type
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
58
135
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
59 def write(*things):
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
60 for thing in things:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
61 if hasattr(thing, "__iter__"):
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
62 for part in thing:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
63 write(part)
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
64 else:
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
65 sys.stdout.write(str(thing))
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
66
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
67 def template(tmpl, filters = {}, **map):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
68 while tmpl:
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
69 m = re.search(r"#([a-zA-Z0-9]+)((\|[a-zA-Z0-9]+)*)#", tmpl)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
70 if m:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
71 yield tmpl[:m.start(0)]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
72 v = map.get(m.group(1), "")
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
73 v = callable(v) and v() or v
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
74
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
75 fl = m.group(2)
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
76 if fl:
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
77 for f in fl.split("|")[1:]:
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
78 v = filters[f](v)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
79
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
80 yield v
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
81 tmpl = tmpl[m.end(0):]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
82 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
83 yield tmpl
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
84 return
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
85
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
86 class templater:
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
87 def __init__(self, mapfile, filters = {}):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
88 self.cache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
89 self.map = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
90 self.base = os.path.dirname(mapfile)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
91 self.filters = filters
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
92
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
93 for l in file(mapfile):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
94 m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
95 if m:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
96 self.cache[m.group(1)] = m.group(2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
97 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
98 m = re.match(r'(\S+)\s*=\s*(\S+)', l)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
99 if m:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
100 self.map[m.group(1)] = os.path.join(self.base, m.group(2))
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
101 else:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
102 raise "unknown map entry '%s'" % l
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
103
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
104 def __call__(self, t, **map):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
105 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
106 tmpl = self.cache[t]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
107 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
108 tmpl = self.cache[t] = file(self.map[t]).read()
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
109 return template(tmpl, self.filters, **map)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
110
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
111 class hgweb:
269
24e9e140485f hgweb: shrink the default changelog list to 10
mpm@selenic.com
parents: 265
diff changeset
112 maxchanges = 10
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
113 maxfiles = 10
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
114
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
115 def __init__(self, path, name, templates = ""):
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
116 self.templates = templates or templatepath()
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
117 self.reponame = name
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
118 self.path = path
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
119 self.mtime = -1
197
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
120 self.viewonly = 0
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
121
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
122 self.filters = {
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
123 "escape": cgi.escape,
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
124 "age": age,
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
125 "date": (lambda x: time.asctime(time.gmtime(x))),
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
126 "addbreaks": nl2br,
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
127 "obfuscate": obfuscate,
375
b29219389b00 Show nice short hashes in hgweb
mpm@selenic.com
parents: 369
diff changeset
128 "short": (lambda x: x[:12]),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
129 "firstline": (lambda x: x.splitlines(1)[0]),
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
130 "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--")
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
131 }
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
132
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
133 def refresh(self):
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
134 s = os.stat(os.path.join(self.path, ".hg", "00changelog.i"))
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
135 if s.st_mtime != self.mtime:
322
a0acae914e95 hgweb: Fix reloading of index
mpm@selenic.com
parents: 271
diff changeset
136 self.mtime = s.st_mtime
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
137 self.repo = repository(ui(), self.path)
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
138
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
139 def date(self, cs):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
140 return time.asctime(time.gmtime(float(cs[2].split(' ')[0])))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
141
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
142 def listfiles(self, files, mf):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
143 for f in files[:self.maxfiles]:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
144 yield self.t("filenodelink", node = hex(mf[f]), file = f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
145 if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
146 yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
147
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
148 def listfilediffs(self, files, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
149 for f in files[:self.maxfiles]:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
150 yield self.t("filedifflink", node = hex(changeset), file = f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
151 if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
152 yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
153
156
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
154 def parent(self, t1, node=nullid, rev=-1, **args):
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
155 if node != hex(nullid):
156
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
156 yield self.t(t1, node = node, rev = rev, **args)
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
157
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
158 def diff(self, node1, node2, files):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
159 def filterfiles(list, files):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
160 l = [ x for x in list if x in files ]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
161
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
162 for f in files:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
163 if f[-1] != os.sep: f += os.sep
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
164 l += [ x for x in list if x.startswith(f) ]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
165 return l
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
166
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
167 parity = [0]
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
168 def diffblock(diff, f, fn):
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
169 yield self.t("diffblock",
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
170 lines = prettyprintlines(diff),
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
171 parity = parity[0],
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
172 file = f,
369
09f24af48b82 hgweb: fix deleted file in changeset key error
mpm@selenic.com
parents: 366
diff changeset
173 filenode = hex(fn or nullid))
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
174 parity[0] = 1 - parity[0]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
175
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
176 def prettyprintlines(diff):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
177 for l in diff.splitlines(1):
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
178 if l.startswith('+'):
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
179 yield self.t("difflineplus", line = l)
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
180 elif l.startswith('-'):
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
181 yield self.t("difflineminus", line = l)
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
182 elif l.startswith('@'):
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
183 yield self.t("difflineat", line = l)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
184 else:
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
185 yield self.t("diffline", line = l)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
186
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
187 r = self.repo
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
188 cl = r.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
189 mf = r.manifest
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
190 change1 = cl.read(node1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
191 change2 = cl.read(node2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
192 mmap1 = mf.read(change1[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
193 mmap2 = mf.read(change2[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
194 date1 = self.date(change1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
195 date2 = self.date(change2)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
196
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
197 c, a, d = r.diffrevs(node1, node2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
198 c, a, d = map(lambda x: filterfiles(x, files), (c, a, d))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
199
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
200 for f in c:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
201 to = r.file(f).read(mmap1[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
202 tn = r.file(f).read(mmap2[f])
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
203 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f), f, tn)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
204 for f in a:
265
7ca05593bd30 hgweb: fix non-existent source or destination for diff
mpm@selenic.com
parents: 258
diff changeset
205 to = None
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
206 tn = r.file(f).read(mmap2[f])
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
207 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f), f, tn)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
208 for f in d:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
209 to = r.file(f).read(mmap1[f])
265
7ca05593bd30 hgweb: fix non-existent source or destination for diff
mpm@selenic.com
parents: 258
diff changeset
210 tn = None
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
211 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f), f, tn)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
212
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
213 def header(self):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
214 yield self.t("header", repo = self.reponame)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
215
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
216 def footer(self):
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
217 yield self.t("footer", repo = self.reponame)
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
218
180
f25944662097 hgweb: Fix navigate to 0 bug
mpm@selenic.com
parents: 173
diff changeset
219 def changelog(self, pos):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
220 def changenav():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
221 def seq(factor = 1):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
222 yield 1 * factor
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
223 yield 3 * factor
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
224 #yield 5 * factor
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
225 for f in seq(factor * 10):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
226 yield f
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
227
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
228 l = []
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
229 for f in seq():
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
230 if f < self.maxchanges / 2: continue
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
231 if f > count: break
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
232 r = "%d" % f
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
233 if pos + f < count: l.append(("+" + r, pos + f))
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
234 if pos - f >= 0: l.insert(0, ("-" + r, pos - f))
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
235
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
236 yield self.t("naventry", rev = 0, label="(0)")
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
237
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
238 for label, rev in l:
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
239 yield self.t("naventry", label = label, rev = rev)
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
240
198
c88ef31fb5c0 hgweb: fix tip so that it doesn't need refreshing
mpm@selenic.com
parents: 197
diff changeset
241 yield self.t("naventry", label="tip")
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
242
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
243 def changelist():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
244 parity = (start - end) & 1
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
245 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
246 l = [] # build a list in forward order for efficiency
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
247 for i in range(start, end):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
248 n = cl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
249 changes = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
250 hn = hex(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
251 p1, p2 = cl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
252 t = float(changes[2].split(' ')[0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
253
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
254 l.insert(0, self.t(
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
255 'changelogentry',
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
256 parity = parity,
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
257 author = changes[1],
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
258 parent1 = self.parent("changelogparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
259 hex(p1), cl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
260 parent2 = self.parent("changelogparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
261 hex(p2), cl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
262 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
263 p1rev = cl.rev(p1), p2rev = cl.rev(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
264 manifest = hex(changes[0]),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
265 desc = changes[4],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
266 date = t,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
267 files = self.listfilediffs(changes[3], n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
268 rev = i,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
269 node = hn))
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
270 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
271
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
272 yield l
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
273
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
274 cl = self.repo.changelog
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
275 mf = cl.read(cl.tip())[0]
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
276 count = cl.count()
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
277 start = max(0, pos - self.maxchanges + 1)
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
278 end = min(count, start + self.maxchanges)
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
279 pos = end - 1
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
280
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
281 yield self.t('changelog',
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
282 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
283 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
284 repo = self.reponame,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
285 changenav = changenav,
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
286 manifest = hex(mf),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
287 rev = pos, changesets = count, entries = changelist)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
288
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
289 def changeset(self, nodeid):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
290 n = bin(nodeid)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
291 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
292 changes = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
293 p1, p2 = cl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
294 p1rev, p2rev = cl.rev(p1), cl.rev(p2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
295 t = float(changes[2].split(' ')[0])
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
296
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
297 files = []
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
298 mf = self.repo.manifest.read(changes[0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
299 for f in changes[3]:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
300 files.append(self.t("filenodelink",
369
09f24af48b82 hgweb: fix deleted file in changeset key error
mpm@selenic.com
parents: 366
diff changeset
301 filenode = hex(mf.get(f, nullid)), file = f))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
302
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
303 def diff():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
304 yield self.diff(p1, n, changes[3])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
305
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
306 yield self.t('changeset',
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
307 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
308 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
309 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
310 diff = diff,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
311 rev = cl.rev(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
312 node = nodeid,
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
313 parent1 = self.parent("changesetparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
314 hex(p1), cl.rev(p1)),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
315 parent2 = self.parent("changesetparent",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
316 hex(p2), cl.rev(p2)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
317 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
318 p1rev = cl.rev(p1), p2rev = cl.rev(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
319 manifest = hex(changes[0]),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
320 author = changes[1],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
321 desc = changes[4],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
322 date = t,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
323 files = files)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
324
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
325 def filelog(self, f, filenode):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
326 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
327 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
328 count = fl.count()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
329
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
330 def entries():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
331 l = []
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
332 parity = (count - 1) & 1
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
333
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
334 for i in range(count):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
335
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
336 n = fl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
337 lr = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
338 cn = cl.node(lr)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
339 cs = cl.read(cl.node(lr))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
340 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
341 t = float(cs[2].split(' ')[0])
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
342
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
343 l.insert(0, self.t("filelogentry",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
344 parity = parity,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
345 filenode = hex(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
346 filerev = i,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
347 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
348 node = hex(cn),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
349 author = cs[1],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
350 date = t,
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
351 desc = cs[4],
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
352 p1 = hex(p1), p2 = hex(p2),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
353 p1rev = fl.rev(p1), p2rev = fl.rev(p2)))
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
354 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
355
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
356 yield l
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
357
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
358 yield self.t("filelog",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
359 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
360 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
361 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
362 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
363 filenode = filenode,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
364 entries = entries)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
365
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
366 def filerevision(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
367 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
368 n = bin(node)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
369 text = fl.read(n)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
370 changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
371 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
372 cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
373 cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
374 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
375 t = float(cs[2].split(' ')[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
376 mfn = cs[0]
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
377
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
378 def lines():
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
379 for l, t in enumerate(text.splitlines(1)):
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
380 yield self.t("fileline", line = t,
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
381 linenumber = "% 6d" % (l + 1),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
382 parity = l & 1)
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
383
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
384 yield self.t("filerevision", file = f,
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
385 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
386 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
387 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
388 filenode = node,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
389 path = up(f),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
390 text = lines(),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
391 rev = changerev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
392 node = hex(cn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
393 manifest = hex(mfn),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
394 author = cs[1],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
395 date = t,
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
396 parent1 = self.parent("filerevparent",
156
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
397 hex(p1), fl.rev(p1), file=f),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
398 parent2 = self.parent("filerevparent",
156
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
399 hex(p2), fl.rev(p2), file=f),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
400 p1 = hex(p1), p2 = hex(p2),
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
401 permissions = self.repo.manifest.readflags(mfn)[f],
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
402 p1rev = fl.rev(p1), p2rev = fl.rev(p2))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
403
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
404 def fileannotate(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
405 bcache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
406 ncache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
407 fl = self.repo.file(f)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
408 n = bin(node)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
409 changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
410
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
411 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
412 cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
413 cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
414 p1, p2 = fl.parents(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
415 t = float(cs[2].split(' ')[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
416 mfn = cs[0]
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
417
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
418 def annotate():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
419 parity = 1
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
420 last = None
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
421 for r, l in fl.annotate(n):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
422 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
423 cnode = ncache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
424 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
425 cnode = ncache[r] = self.repo.changelog.node(r)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
426
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
427 try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
428 name = bcache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
429 except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
430 cl = self.repo.changelog.read(cnode)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
431 name = cl[1]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
432 f = name.find('@')
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
433 if f >= 0:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
434 name = name[:f]
534
ab0d1bfeee7c [PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents: 533
diff changeset
435 f = name.find('<')
ab0d1bfeee7c [PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents: 533
diff changeset
436 if f >= 0:
ab0d1bfeee7c [PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents: 533
diff changeset
437 name = name[f+1:]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
438 bcache[r] = name
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
439
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
440 if last != cnode:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
441 parity = 1 - parity
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
442 last = cnode
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
443
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
444 yield self.t("annotateline",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
445 parity = parity,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
446 node = hex(cnode),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
447 rev = r,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
448 author = name,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
449 file = f,
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
450 line = l)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
451
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
452 yield self.t("fileannotate",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
453 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
454 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
455 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
456 file = f,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
457 filenode = node,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
458 annotate = annotate,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
459 path = up(f),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
460 rev = changerev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
461 node = hex(cn),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
462 manifest = hex(mfn),
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
463 author = cs[1],
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
464 date = t,
156
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
465 parent1 = self.parent("fileannotateparent",
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
466 hex(p1), fl.rev(p1), file=f),
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
467 parent2 = self.parent("fileannotateparent",
32ce2c5d4d25 Fix some broken parent links in hgweb
mpm@selenic.com
parents: 155
diff changeset
468 hex(p2), fl.rev(p2), file=f),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
469 p1 = hex(p1), p2 = hex(p2),
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
470 permissions = self.repo.manifest.readflags(mfn)[f],
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
471 p1rev = fl.rev(p1), p2rev = fl.rev(p2))
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
472
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
473 def manifest(self, mnode, path):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
474 mf = self.repo.manifest.read(bin(mnode))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
475 rev = self.repo.manifest.rev(bin(mnode))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
476 node = self.repo.changelog.node(rev)
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
477 mff=self.repo.manifest.readflags(bin(mnode))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
478
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
479 files = {}
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
480
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
481 p = path[1:]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
482 l = len(p)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
483
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
484 for f,n in mf.items():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
485 if f[:l] != p:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
486 continue
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
487 remain = f[l:]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
488 if "/" in remain:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
489 short = remain[:remain.find("/") + 1] # bleah
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
490 files[short] = (f, None)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
491 else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
492 short = os.path.basename(remain)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
493 files[short] = (f, n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
494
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
495 def filelist():
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
496 parity = 0
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
497 fl = files.keys()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
498 fl.sort()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
499 for f in fl:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
500 full, fnode = files[f]
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
501 if fnode:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
502 yield self.t("manifestfileentry",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
503 file = full,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
504 manifest = mnode,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
505 filenode = hex(fnode),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
506 parity = parity,
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
507 basename = f,
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
508 permissions = mff[full])
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
509 else:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
510 yield self.t("manifestdirentry",
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
511 parity = parity,
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
512 path = os.path.join(path, f),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
513 manifest = mnode, basename = f[:-1])
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
514 parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
515
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
516 yield self.t("manifest",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
517 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
518 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
519 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
520 manifest = mnode,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
521 rev = rev,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
522 node = hex(node),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
523 path = path,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
524 up = up(path),
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
525 entries = filelist)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
526
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
527 def tags(self):
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
528 cl = self.repo.changelog
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
529 mf = cl.read(cl.tip())[0]
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
530
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 330
diff changeset
531 i = self.repo.tagslist()
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 330
diff changeset
532 i.reverse()
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
533
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
534 def entries():
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
535 parity = 0
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
536 for k,n in i:
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
537 yield self.t("tagentry",
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
538 parity = parity,
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
539 tag = k,
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
540 node = hex(n))
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
541 parity = 1 - parity
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
542
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
543 yield self.t("tags",
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
544 header = self.header(),
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
545 footer = self.footer(),
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
546 repo = self.reponame,
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
547 manifest = hex(mf),
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
548 entries = entries)
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
549
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
550 def filediff(self, file, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
551 n = bin(changeset)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
552 cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
553 p1 = cl.parents(n)[0]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
554 cs = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
555 mf = self.repo.manifest.read(cs[0])
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
556
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
557 def diff():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
558 yield self.diff(p1, n, file)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
559
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
560 yield self.t("filediff",
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
561 header = self.header(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
562 footer = self.footer(),
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
563 repo = self.reponame,
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
564 file = file,
376
fadc9e126369 hgweb: fix deleted file in filediff key error
Thomas Arendsen Hein <thomas@intevation.de>
parents: 369
diff changeset
565 filenode = hex(mf.get(file, nullid)),
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
566 node = changeset,
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
567 rev = self.repo.changelog.rev(n),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
568 p1 = hex(p1),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
569 p1rev = self.repo.changelog.rev(p1),
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
570 diff = diff)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
571
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
572 # add tags to things
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
573 # tags -> list of changesets corresponding to tags
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
574 # find tag, changeset, file
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
575
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
576 def run(self):
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
577 self.refresh()
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
578 args = cgi.parse()
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
579
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
580 m = os.path.join(self.templates, "map")
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
581 if args.has_key('style'):
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
582 b = os.path.basename("map-" + args['style'][0])
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
583 p = os.path.join(self.templates, b)
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
584 if os.path.isfile(p): m = p
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
585
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
586 self.t = templater(m, self.filters)
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
587
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
588 if not args.has_key('cmd') or args['cmd'][0] == 'changelog':
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
589 hi = self.repo.changelog.count() - 1
153
e8a360cd5a9f changed pos to rev for changelog cmd, changed & to ;
jake@edge2.net
parents: 142
diff changeset
590 if args.has_key('rev'):
165
7fc8385df514 Add tag/rev/node search to hgweb
mpm@selenic.com
parents: 158
diff changeset
591 hi = args['rev'][0]
166
39624c47060f hgweb: don't blow up on search for unknown keys
mpm@selenic.com
parents: 165
diff changeset
592 try:
39624c47060f hgweb: don't blow up on search for unknown keys
mpm@selenic.com
parents: 165
diff changeset
593 hi = self.repo.changelog.rev(self.repo.lookup(hi))
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
594 except KeyError: pass
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
595
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
596 write(self.changelog(hi))
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
597
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
598 elif args['cmd'][0] == 'changeset':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
599 write(self.changeset(args['node'][0]))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
600
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
601 elif args['cmd'][0] == 'manifest':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
602 write(self.manifest(args['manifest'][0], args['path'][0]))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
603
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
604 elif args['cmd'][0] == 'tags':
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
605 write(self.tags())
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
606
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
607 elif args['cmd'][0] == 'filediff':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
608 write(self.filediff(args['file'][0], args['node'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
609
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
610 elif args['cmd'][0] == 'file':
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
611 write(self.filerevision(args['file'][0], args['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
612
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
613 elif args['cmd'][0] == 'annotate':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
614 write(self.fileannotate(args['file'][0], args['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
615
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
616 elif args['cmd'][0] == 'filelog':
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
617 write(self.filelog(args['file'][0], args['filenode'][0]))
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
618
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
619 elif args['cmd'][0] == 'heads':
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
620 httphdr("text/plain")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
621 h = self.repo.heads()
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
622 sys.stdout.write(" ".join(map(hex, h)) + "\n")
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
623
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
624 elif args['cmd'][0] == 'branches':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
625 httphdr("text/plain")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
626 nodes = []
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
627 if args.has_key('nodes'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
628 nodes = map(bin, args['nodes'][0].split(" "))
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
629 for b in self.repo.branches(nodes):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
630 sys.stdout.write(" ".join(map(hex, b)) + "\n")
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
631
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
632 elif args['cmd'][0] == 'between':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
633 httphdr("text/plain")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
634 nodes = []
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
635 if args.has_key('pairs'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
636 pairs = [ map(bin, p.split("-"))
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
637 for p in args['pairs'][0].split(" ") ]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
638 for b in self.repo.between(pairs):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
639 sys.stdout.write(" ".join(map(hex, b)) + "\n")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
640
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
641 elif args['cmd'][0] == 'changegroup':
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
642 httphdr("application/hg-changegroup")
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
643 nodes = []
197
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
644 if self.viewonly:
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
645 return
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
646
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
647 if args.has_key('roots'):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
648 nodes = map(bin, args['roots'][0].split(" "))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
649
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
650 z = zlib.compressobj()
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
651 for chunk in self.repo.changegroup(nodes):
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
652 sys.stdout.write(z.compress(chunk))
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
653
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
654 sys.stdout.write(z.flush())
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
655
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
656 else:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
657 write(self.t("error"))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
658
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
659 def server(path, name, templates, address, port):
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
660
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
661 import BaseHTTPServer
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
662 import sys, os
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
663
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
664 class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
665 def do_POST(self):
271
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
666 try:
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
667 self.do_hgweb()
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
668 except socket.error, inst:
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
669 if inst.args[0] != 32: raise
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
670
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
671 def do_GET(self):
271
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
672 self.do_POST()
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
673
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
674 def do_hgweb(self):
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
675 query = ""
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
676 p = self.path.find("?")
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
677 if p:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
678 query = self.path[p + 1:]
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
679 query = query.replace('+', ' ')
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
680
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
681 env = {}
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
682 env['GATEWAY_INTERFACE'] = 'CGI/1.1'
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
683 env['REQUEST_METHOD'] = self.command
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
684 if query:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
685 env['QUERY_STRING'] = query
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
686 host = self.address_string()
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
687 if host != self.client_address[0]:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
688 env['REMOTE_HOST'] = host
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
689 env['REMOTE_ADDR'] = self.client_address[0]
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
690
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
691 if self.headers.typeheader is None:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
692 env['CONTENT_TYPE'] = self.headers.type
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
693 else:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
694 env['CONTENT_TYPE'] = self.headers.typeheader
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
695 length = self.headers.getheader('content-length')
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
696 if length:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
697 env['CONTENT_LENGTH'] = length
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
698 accept = []
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
699 for line in self.headers.getallmatchingheaders('accept'):
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
700 if line[:1] in "\t\n\r ":
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
701 accept.append(line.strip())
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
702 else:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
703 accept = accept + line[7:].split(',')
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
704 env['HTTP_ACCEPT'] = ','.join(accept)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
705
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
706 os.environ.update(env)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
707
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
708 save = sys.argv, sys.stdin, sys.stdout, sys.stderr
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
709 try:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
710 sys.stdin = self.rfile
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
711 sys.stdout = self.wfile
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
712 sys.argv = ["hgweb.py"]
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
713 if '=' not in query:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
714 sys.argv.append(query)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
715 self.send_response(200, "Script output follows")
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
716 hg.run()
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
717 finally:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
718 sys.argv, sys.stdin, sys.stdout, sys.stderr = save
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
719
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
720 hg = hgweb(path, name, templates)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
721 httpd = BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
722 httpd.serve_forever()