diff mercurial/hgweb.py @ 142:529bf610092e

Prettify the web interface Add header, footer templates Add null parent handling Combine files and directories Add parity flag for alternating line colors Add line numbers to filerevision
author mpm@selenic.com
date Mon, 23 May 2005 20:57:48 -0800
parents c77a679e9cfa
children e8a360cd5a9f 083c38bdfa64
line wrap: on
line diff
--- a/mercurial/hgweb.py
+++ b/mercurial/hgweb.py
@@ -122,6 +122,10 @@ class hgweb:
         if len(files) > self.maxfiles:
             yield self.t("fileellipses")
 
+    def parent(self, t1, node, rev):
+        if node != hex(nullid):
+            yield self.t(t1, node = node, rev = rev)
+
     def diff(self, node1, node2, files):
         def filterfiles(list, files):
             l = [ x for x in list if x in files ]
@@ -169,6 +173,12 @@ class hgweb:
             tn = ""
             yield prettyprint(mdiff.unidiff(to, date1, tn, date2, f))
 
+    def header(self):
+        yield self.t("header", repo = self.reponame)
+
+    def footer(self):
+        yield self.t("footer", repo = self.reponame)
+
     def changelog(self, pos=None):
         def changenav():
             def seq(factor = 1):
@@ -191,6 +201,7 @@ class hgweb:
             yield self.t("naventry", rev = count - 1)
 
         def changelist():
+            parity = (start - end) & 1
             cl = self.repo.changelog
             l = [] # build a list in forward order for efficiency
             for i in range(start, end + 1):
@@ -202,9 +213,14 @@ class hgweb:
 
                 l.insert(0, self.t(
                     'changelogentry',
+                    parity = parity,
                     author = obfuscate(changes[1]),
                     shortdesc = cgi.escape(changes[4].splitlines()[0]),
                     age = age(t),
+                    parent1 = self.parent("changelogparent",
+                                          hex(p1), cl.rev(p1)),
+                    parent2 = self.parent("changelogparent",
+                                          hex(p2), cl.rev(p2)),
                     p1 = hex(p1), p2 = hex(p2),
                     p1rev = cl.rev(p1), p2rev = cl.rev(p2),
                     manifest = hex(changes[0]),
@@ -213,6 +229,7 @@ class hgweb:
                     files = self.listfilediffs(changes[3], n),
                     rev = i,
                     node = hn))
+                parity = 1 - parity
 
             yield l
 
@@ -222,8 +239,12 @@ class hgweb:
         start = max(0, pos - self.maxchanges)
         end = min(count - 1, start + self.maxchanges)
 
-        yield self.t('changelog', repo = self.reponame, changenav = changenav,
-                     rev = pos, changesets = count, changelist = changelist)
+        yield self.t('changelog',
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
+                     changenav = changenav,
+                     rev = pos, changesets = count, entries = changelist)
 
     def changeset(self, nodeid):
         n = bin(nodeid)
@@ -243,10 +264,17 @@ class hgweb:
             yield self.diff(p1, n, changes[3])
 
         yield self.t('changeset',
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      diff = diff,
                      rev = cl.rev(n),
                      node = nodeid,
                      shortdesc = cgi.escape(changes[4].splitlines()[0]),
+                     parent1 = self.parent("changesetparent",
+                                           hex(p1), cl.rev(p1)),
+                     parent2 = self.parent("changesetparent",
+                                           hex(p2), cl.rev(p2)),
                      p1 = hex(p1), p2 = hex(p2),
                      p1rev = cl.rev(p1), p2rev = cl.rev(p2),
                      manifest = hex(changes[0]),
@@ -262,6 +290,8 @@ class hgweb:
 
         def entries():
             l = []
+            parity = (count - 1) & 1
+            
             for i in range(count):
 
                 n = fl.node(i)
@@ -272,6 +302,7 @@ class hgweb:
                 t = float(cs[2].split(' ')[0])
 
                 l.insert(0, self.t("filelogentry",
+                                   parity = parity,
                                    filenode = hex(n),
                                    filerev = i,
                                    file = f,
@@ -282,10 +313,14 @@ class hgweb:
                                    shortdesc = cgi.escape(cs[4].splitlines()[0]),
                                    p1 = hex(p1), p2 = hex(p2),
                                    p1rev = fl.rev(p1), p2rev = fl.rev(p2)))
+                parity = 1 - parity
 
             yield l
 
         yield self.t("filelog",
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      file = f,
                      filenode = filenode,
                      entries = entries)
@@ -301,11 +336,21 @@ class hgweb:
         p1, p2 = fl.parents(n)
         t = float(cs[2].split(' ')[0])
         mfn = cs[0]
+
+        def lines():
+            for l, t in enumerate(text.splitlines(1)):
+                yield self.t("fileline",
+                             line = t,
+                             linenumber = "% 6d" % (l + 1),
+                             parity = l & 1)
         
         yield self.t("filerevision", file = f,
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      filenode = node,
                      path = up(f),
-                     text = text,
+                     text = lines(),
                      rev = changerev,
                      node = hex(cn),
                      manifest = hex(mfn),
@@ -313,6 +358,10 @@ class hgweb:
                      age = age(t),
                      date = time.asctime(time.gmtime(t)),
                      shortdesc = cgi.escape(cs[4].splitlines()[0]),
+                     parent1 = self.parent("filerevparent",
+                                           hex(p1), fl.rev(p1)),
+                     parent2 = self.parent("filerevparent",
+                                           hex(p2), fl.rev(p2)),
                      p1 = hex(p1), p2 = hex(p2),
                      p1rev = fl.rev(p1), p2rev = fl.rev(p2))
 
@@ -332,6 +381,8 @@ class hgweb:
         mfn = cs[0]
 
         def annotate():
+            parity = 1
+            last = None
             for r, l in fl.annotate(n):
                 try:
                     cnode = ncache[r]
@@ -348,7 +399,12 @@ class hgweb:
                         name = name[:f]
                     bcache[r] = name
 
+                if last != cnode:
+                    parity = 1 - parity
+                    last = cnode
+
                 yield self.t("annotateline",
+                             parity = parity,
                              node = hex(cnode),
                              rev = r,
                              author = name,
@@ -356,6 +412,9 @@ class hgweb:
                              line = cgi.escape(l))
 
         yield self.t("fileannotate",
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      file = f,
                      filenode = node,
                      annotate = annotate,
@@ -367,6 +426,10 @@ class hgweb:
                      age = age(t),
                      date = time.asctime(time.gmtime(t)),
                      shortdesc = cgi.escape(cs[4].splitlines()[0]),
+                     parent1 = self.parent("filerevparent",
+                                           hex(p1), fl.rev(p1)),
+                     parent2 = self.parent("filerevparent",
+                                           hex(p2), fl.rev(p2)),
                      p1 = hex(p1), p2 = hex(p2),
                      p1rev = fl.rev(p1), p2rev = fl.rev(p2))
 
@@ -375,10 +438,8 @@ class hgweb:
         rev = self.repo.manifest.rev(bin(mnode))
         node = self.repo.changelog.node(rev)
 
-        dirs = {}
         files = {}
-        short = {}
-
+ 
         p = path[1:]
         l = len(p)
 
@@ -388,37 +449,41 @@ class hgweb:
             remain = f[l:]
             if "/" in remain:
                 short = remain[:remain.find("/") + 1] # bleah
-                dirs[short] = 1
+                files[short] = (f, None)
             else:
                 short = os.path.basename(remain)
                 files[short] = (f, n)
 
-        def dirlist():
-            dl = dirs.keys()
-            dl.sort()
-            
-            for d in dl:
-                yield self.t("manifestdirentry",
-                             path = os.path.join(path, d),
-                             manifest = mnode, basename = d[:-1])
-
         def filelist():
+            parity = 0
             fl = files.keys()
             fl.sort()
             for f in fl:
                 full, fnode = files[f]
-                yield self.t("manifestfileentry",
-                             file = full, manifest = mnode, filenode = hex(fnode),
-                             basename = f)
+                if fnode:
+                    yield self.t("manifestfileentry",
+                                 file = full,
+                                 manifest = mnode,
+                                 filenode = hex(fnode),
+                                 parity = parity,
+                                 basename = f)
+                else:
+                    yield self.t("manifestdirentry",
+                                 parity = parity,
+                                 path = os.path.join(path, f),
+                                 manifest = mnode, basename = f[:-1])
+                parity = 1 - parity
 
         yield self.t("manifest",
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      manifest = mnode,
                      rev = rev,
                      node = hex(node),
                      path = path,
                      up = up(path),
-                     dirs = dirlist,
-                     files = filelist)
+                     entries = filelist)
 
     def filediff(self, file, changeset):
         n = bin(changeset)
@@ -431,6 +496,9 @@ class hgweb:
             yield self.diff(p1, n, file)
 
         yield self.t("filediff",
+                     header = self.header(),
+                     footer = self.footer(),
+                     repo = self.reponame,
                      file = file,
                      filenode = hex(mf[file]),
                      node = changeset,
@@ -439,12 +507,7 @@ class hgweb:
                      p1rev = self.repo.changelog.rev(p1),
                      diff = diff)
                      
-    # header and footer, css
     # add tags to things
-    # show parents
-    # diff between rev and parent in changeset and file
-    # manifest links
-    # browse at top
     # tags -> list of changesets corresponding to tags
     # find tag, changeset, file