Show More
@@ -30,20 +30,6 b' def relpath(repo, args):' | |||||
30 | return [util.normpath(os.path.join(cwd, x)) for x in args] |
|
30 | return [util.normpath(os.path.join(cwd, x)) for x in args] | |
31 | return args |
|
31 | return args | |
32 |
|
32 | |||
33 | def datestr(change=None): |
|
|||
34 | if change is None: |
|
|||
35 | t = time.time() |
|
|||
36 | if time.daylight: tz = time.altzone |
|
|||
37 | else: tz = time.timezone |
|
|||
38 | else: |
|
|||
39 | t, tz = change[2].split(' ') |
|
|||
40 | try: |
|
|||
41 | # a conversion tool was sticking non-integer offsets into repos |
|
|||
42 | tz = int(tz) |
|
|||
43 | except ValueError: |
|
|||
44 | tz = 0 |
|
|||
45 | return time.asctime(time.gmtime(float(t) - tz)) + " %+05d" % (int(tz)/-36) |
|
|||
46 |
|
||||
47 | def matchpats(repo, cwd, pats=[], opts={}, head=''): |
|
33 | def matchpats(repo, cwd, pats=[], opts={}, head=''): | |
48 | return util.matcher(repo.root, cwd, pats or ['.'], opts.get('include'), |
|
34 | return util.matcher(repo.root, cwd, pats or ['.'], opts.get('include'), | |
49 | opts.get('exclude'), head) |
|
35 | opts.get('exclude'), head) | |
@@ -278,11 +264,11 b' def dodiff(fp, ui, repo, node1, node2, f' | |||||
278 | if node2: |
|
264 | if node2: | |
279 | change = repo.changelog.read(node2) |
|
265 | change = repo.changelog.read(node2) | |
280 | mmap2 = repo.manifest.read(change[0]) |
|
266 | mmap2 = repo.manifest.read(change[0]) | |
281 | date2 = datestr(change) |
|
267 | date2 = util.datestr(change) | |
282 | def read(f): |
|
268 | def read(f): | |
283 | return repo.file(f).read(mmap2[f]) |
|
269 | return repo.file(f).read(mmap2[f]) | |
284 | else: |
|
270 | else: | |
285 | date2 = datestr() |
|
271 | date2 = util.datestr() | |
286 | if not node1: |
|
272 | if not node1: | |
287 | node1 = repo.dirstate.parents()[0] |
|
273 | node1 = repo.dirstate.parents()[0] | |
288 | def read(f): |
|
274 | def read(f): | |
@@ -296,7 +282,7 b' def dodiff(fp, ui, repo, node1, node2, f' | |||||
296 |
|
282 | |||
297 | change = repo.changelog.read(node1) |
|
283 | change = repo.changelog.read(node1) | |
298 | mmap = repo.manifest.read(change[0]) |
|
284 | mmap = repo.manifest.read(change[0]) | |
299 | date1 = datestr(change) |
|
285 | date1 = util.datestr(change) | |
300 |
|
286 | |||
301 | for f in c: |
|
287 | for f in c: | |
302 | to = None |
|
288 | to = None | |
@@ -333,7 +319,7 b' def show_changeset(ui, repo, rev=0, chan' | |||||
333 | return |
|
319 | return | |
334 |
|
320 | |||
335 | changes = log.read(changenode) |
|
321 | changes = log.read(changenode) | |
336 | date = datestr(changes) |
|
322 | date = util.datestr(changes) | |
337 |
|
323 | |||
338 | parents = [(log.rev(p), ui.verbose and hex(p) or short(p)) |
|
324 | parents = [(log.rev(p), ui.verbose and hex(p) or short(p)) | |
339 | for p in log.parents(changenode) |
|
325 | for p in log.parents(changenode) |
@@ -9,7 +9,7 b'' | |||||
9 | import os, cgi, sys |
|
9 | import os, cgi, sys | |
10 | from demandload import demandload |
|
10 | from demandload import demandload | |
11 | demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") |
|
11 | demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") | |
12 | demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer") |
|
12 | demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer util") | |
13 | from node import * |
|
13 | from node import * | |
14 |
|
14 | |||
15 | def templatepath(): |
|
15 | def templatepath(): | |
@@ -18,7 +18,7 b' def templatepath():' | |||||
18 | if os.path.isdir(p): |
|
18 | if os.path.isdir(p): | |
19 | return p |
|
19 | return p | |
20 |
|
20 | |||
21 |
def age( |
|
21 | def age(x): | |
22 | def plural(t, c): |
|
22 | def plural(t, c): | |
23 | if c == 1: |
|
23 | if c == 1: | |
24 | return t |
|
24 | return t | |
@@ -27,7 +27,8 b' def age(t):' | |||||
27 | return "%d %s" % (c, plural(t, c)) |
|
27 | return "%d %s" % (c, plural(t, c)) | |
28 |
|
28 | |||
29 | now = time.time() |
|
29 | now = time.time() | |
30 | delta = max(1, int(now - t)) |
|
30 | then = int(x[2].split(' ')[0]) | |
|
31 | delta = max(1, int(now - then)) | |||
31 |
|
32 | |||
32 | scales = [["second", 1], |
|
33 | scales = [["second", 1], | |
33 | ["minute", 60], |
|
34 | ["minute", 60], | |
@@ -151,23 +152,18 b' class templater:' | |||||
151 | yield tmpl |
|
152 | yield tmpl | |
152 | return |
|
153 | return | |
153 |
|
154 | |||
154 | def rfc822date(x): |
|
|||
155 | return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(x)) |
|
|||
156 |
|
||||
157 | common_filters = { |
|
155 | common_filters = { | |
158 | "escape": cgi.escape, |
|
156 | "escape": cgi.escape, | |
159 | "age": age, |
|
157 | "age": age, | |
160 | "date": (lambda x: time.asctime(time.gmtime(x))), |
|
158 | "date": util.datestr, | |
161 | "addbreaks": nl2br, |
|
159 | "addbreaks": nl2br, | |
162 | "obfuscate": obfuscate, |
|
160 | "obfuscate": obfuscate, | |
163 | "short": (lambda x: x[:12]), |
|
161 | "short": (lambda x: x[:12]), | |
164 | "firstline": (lambda x: x.splitlines(1)[0]), |
|
162 | "firstline": (lambda x: x.splitlines(1)[0]), | |
165 | "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), |
|
163 | "permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"), | |
166 | "rfc822date": rfc822date, |
|
164 | "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), | |
167 | } |
|
165 | } | |
168 |
|
166 | |||
169 |
|
||||
170 |
|
||||
171 | class hgweb: |
|
167 | class hgweb: | |
172 | def __init__(self, repo, name=None): |
|
168 | def __init__(self, repo, name=None): | |
173 | if type(repo) == type(""): |
|
169 | if type(repo) == type(""): | |
@@ -189,7 +185,7 b' class hgweb:' | |||||
189 | self.allowpull = self.repo.ui.configbool("web", "allowpull", True) |
|
185 | self.allowpull = self.repo.ui.configbool("web", "allowpull", True) | |
190 |
|
186 | |||
191 | def date(self, cs): |
|
187 | def date(self, cs): | |
192 | return time.asctime(time.gmtime(float(cs[2].split(' ')[0]))) |
|
188 | return util.datestr(cs) | |
193 |
|
189 | |||
194 | def listfiles(self, files, mf): |
|
190 | def listfiles(self, files, mf): | |
195 | for f in files[:self.maxfiles]: |
|
191 | for f in files[:self.maxfiles]: | |
@@ -307,7 +303,6 b' class hgweb:' | |||||
307 | n = cl.node(i) |
|
303 | n = cl.node(i) | |
308 | changes = cl.read(n) |
|
304 | changes = cl.read(n) | |
309 | hn = hex(n) |
|
305 | hn = hex(n) | |
310 | t = float(changes[2].split(' ')[0]) |
|
|||
311 |
|
306 | |||
312 | l.insert(0, {"parity": parity, |
|
307 | l.insert(0, {"parity": parity, | |
313 | "author": changes[1], |
|
308 | "author": changes[1], | |
@@ -316,7 +311,7 b' class hgweb:' | |||||
316 | "changelogtag": self.showtag("changelogtag",n), |
|
311 | "changelogtag": self.showtag("changelogtag",n), | |
317 | "manifest": hex(changes[0]), |
|
312 | "manifest": hex(changes[0]), | |
318 | "desc": changes[4], |
|
313 | "desc": changes[4], | |
319 |
"date": |
|
314 | "date": changes, | |
320 | "files": self.listfilediffs(changes[3], n), |
|
315 | "files": self.listfilediffs(changes[3], n), | |
321 | "rev": i, |
|
316 | "rev": i, | |
322 | "node": hn}) |
|
317 | "node": hn}) | |
@@ -368,7 +363,6 b' class hgweb:' | |||||
368 |
|
363 | |||
369 | count += 1 |
|
364 | count += 1 | |
370 | hn = hex(n) |
|
365 | hn = hex(n) | |
371 | t = float(changes[2].split(' ')[0]) |
|
|||
372 |
|
366 | |||
373 | yield self.t('searchentry', |
|
367 | yield self.t('searchentry', | |
374 | parity=count & 1, |
|
368 | parity=count & 1, | |
@@ -378,7 +372,7 b' class hgweb:' | |||||
378 | changelogtag=self.showtag("changelogtag",n), |
|
372 | changelogtag=self.showtag("changelogtag",n), | |
379 | manifest=hex(changes[0]), |
|
373 | manifest=hex(changes[0]), | |
380 | desc=changes[4], |
|
374 | desc=changes[4], | |
381 |
date= |
|
375 | date=changes, | |
382 | files=self.listfilediffs(changes[3], n), |
|
376 | files=self.listfilediffs(changes[3], n), | |
383 | rev=i, |
|
377 | rev=i, | |
384 | node=hn) |
|
378 | node=hn) | |
@@ -399,7 +393,6 b' class hgweb:' | |||||
399 | cl = self.repo.changelog |
|
393 | cl = self.repo.changelog | |
400 | changes = cl.read(n) |
|
394 | changes = cl.read(n) | |
401 | p1 = cl.parents(n)[0] |
|
395 | p1 = cl.parents(n)[0] | |
402 | t = float(changes[2].split(' ')[0]) |
|
|||
403 |
|
396 | |||
404 | files = [] |
|
397 | files = [] | |
405 | mf = self.repo.manifest.read(changes[0]) |
|
398 | mf = self.repo.manifest.read(changes[0]) | |
@@ -425,7 +418,7 b' class hgweb:' | |||||
425 | manifest=hex(changes[0]), |
|
418 | manifest=hex(changes[0]), | |
426 | author=changes[1], |
|
419 | author=changes[1], | |
427 | desc=changes[4], |
|
420 | desc=changes[4], | |
428 |
date= |
|
421 | date=changes, | |
429 | files=files, |
|
422 | files=files, | |
430 | archives=archivelist()) |
|
423 | archives=archivelist()) | |
431 |
|
424 | |||
@@ -443,7 +436,6 b' class hgweb:' | |||||
443 | lr = fl.linkrev(n) |
|
436 | lr = fl.linkrev(n) | |
444 | cn = cl.node(lr) |
|
437 | cn = cl.node(lr) | |
445 | cs = cl.read(cl.node(lr)) |
|
438 | cs = cl.read(cl.node(lr)) | |
446 | t = float(cs[2].split(' ')[0]) |
|
|||
447 |
|
439 | |||
448 | l.insert(0, {"parity": parity, |
|
440 | l.insert(0, {"parity": parity, | |
449 | "filenode": hex(n), |
|
441 | "filenode": hex(n), | |
@@ -451,7 +443,7 b' class hgweb:' | |||||
451 | "file": f, |
|
443 | "file": f, | |
452 | "node": hex(cn), |
|
444 | "node": hex(cn), | |
453 | "author": cs[1], |
|
445 | "author": cs[1], | |
454 |
"date": |
|
446 | "date": cs, | |
455 | "parent": self.parents("filelogparent", |
|
447 | "parent": self.parents("filelogparent", | |
456 | fl.parents(n), |
|
448 | fl.parents(n), | |
457 | fl.rev, file=f), |
|
449 | fl.rev, file=f), | |
@@ -471,7 +463,6 b' class hgweb:' | |||||
471 | cl = self.repo.changelog |
|
463 | cl = self.repo.changelog | |
472 | cn = cl.node(changerev) |
|
464 | cn = cl.node(changerev) | |
473 | cs = cl.read(cn) |
|
465 | cs = cl.read(cn) | |
474 | t = float(cs[2].split(' ')[0]) |
|
|||
475 | mfn = cs[0] |
|
466 | mfn = cs[0] | |
476 |
|
467 | |||
477 | def lines(): |
|
468 | def lines(): | |
@@ -489,7 +480,7 b' class hgweb:' | |||||
489 | node=hex(cn), |
|
480 | node=hex(cn), | |
490 | manifest=hex(mfn), |
|
481 | manifest=hex(mfn), | |
491 | author=cs[1], |
|
482 | author=cs[1], | |
492 |
date= |
|
483 | date=cs, | |
493 | parent=self.parents("filerevparent", |
|
484 | parent=self.parents("filerevparent", | |
494 | fl.parents(n), fl.rev, file=f), |
|
485 | fl.parents(n), fl.rev, file=f), | |
495 | permissions=self.repo.manifest.readflags(mfn)[f]) |
|
486 | permissions=self.repo.manifest.readflags(mfn)[f]) | |
@@ -504,7 +495,6 b' class hgweb:' | |||||
504 | cl = self.repo.changelog |
|
495 | cl = self.repo.changelog | |
505 | cn = cl.node(changerev) |
|
496 | cn = cl.node(changerev) | |
506 | cs = cl.read(cn) |
|
497 | cs = cl.read(cn) | |
507 | t = float(cs[2].split(' ')[0]) |
|
|||
508 | mfn = cs[0] |
|
498 | mfn = cs[0] | |
509 |
|
499 | |||
510 | def annotate(**map): |
|
500 | def annotate(**map): | |
@@ -542,7 +532,7 b' class hgweb:' | |||||
542 | node=hex(cn), |
|
532 | node=hex(cn), | |
543 | manifest=hex(mfn), |
|
533 | manifest=hex(mfn), | |
544 | author=cs[1], |
|
534 | author=cs[1], | |
545 |
date= |
|
535 | date=cs, | |
546 | parent=self.parents("fileannotateparent", |
|
536 | parent=self.parents("fileannotateparent", | |
547 | fl.parents(n), fl.rev, file=f), |
|
537 | fl.parents(n), fl.rev, file=f), | |
548 | permissions=self.repo.manifest.readflags(mfn)[f]) |
|
538 | permissions=self.repo.manifest.readflags(mfn)[f]) |
@@ -12,7 +12,7 b' platform-specific details from the core.' | |||||
12 |
|
12 | |||
13 | import os, errno |
|
13 | import os, errno | |
14 | from demandload import * |
|
14 | from demandload import * | |
15 | demandload(globals(), "re cStringIO shutil popen2 tempfile threading") |
|
15 | demandload(globals(), "re cStringIO shutil popen2 tempfile threading time") | |
16 |
|
16 | |||
17 | def pipefilter(s, cmd): |
|
17 | def pipefilter(s, cmd): | |
18 | '''filter string S through command CMD, returning its output''' |
|
18 | '''filter string S through command CMD, returning its output''' | |
@@ -543,3 +543,23 b' def filechunkiter(f, size = 65536):' | |||||
543 | while len(s) >= 0: |
|
543 | while len(s) >= 0: | |
544 | yield s |
|
544 | yield s | |
545 | s = f.read(size) |
|
545 | s = f.read(size) | |
|
546 | ||||
|
547 | def datestr(change=None, format='%c'): | |||
|
548 | """represent a change date as a localized time. | |||
|
549 | a change date is a 'unixtime offset' string, where unixtime is | |||
|
550 | seconds since the epoch, and offset is seconds away from UTC.""" | |||
|
551 | if change is None: | |||
|
552 | t = time.time() | |||
|
553 | if time.daylight: tz = time.altzone | |||
|
554 | else: tz = time.timezone | |||
|
555 | else: | |||
|
556 | t, tz = change[2].split(' ') | |||
|
557 | try: | |||
|
558 | # a conversion tool was sticking non-integer offsets into repos | |||
|
559 | tz = int(tz) | |||
|
560 | except ValueError: | |||
|
561 | tz = 0 | |||
|
562 | return ("%s %+03d%02d" % | |||
|
563 | (time.strftime(format, time.gmtime(float(t) - tz)), | |||
|
564 | -tz / 3600, | |||
|
565 | ((-tz % 3600) / 60))) |
General Comments 0
You need to be logged in to leave comments.
Login now