hg site extension
 
(Arne Babenhauserheide)
2012-10-30: merge bug list creation.

merge bug list creation.

diff --git a/staticsite.py b/staticsite.py
--- a/staticsite.py
+++ b/staticsite.py
@@ -122,11 +122,11 @@ def splitbugline(line):
     description = "".join(line.split("-")[1:]).lstrip()
     return bugid, description
 
-def getbugdetails(ui, bugid):
+def getbugdetails(ui, repo, bugid):
     """Get the details for a bug."""
     # first get the details
     ui.pushbuffer()
-    req = dispatch.request(["b", "details", bugid], ui=ui)
+    req = dispatch.request(["b", "details", bugid], ui=ui, repo=repo)
     dispatch.dispatch(req)
     return ui.popbuffer()
 
@@ -141,15 +141,15 @@ def getbugfullid(details, bugid):
 
 class BBug(object):
     """A b-extension bug."""
-    def __init__(self, bugid, description, state, details=""):
-        self.bugid, self.description, self.state, self.details = bugid, description, state, details
+    def __init__(self, shortid, fullid, description, state, details=""):
+        self.shortid, self.fullid, self.description, self.state, self.details = shortid, fullid, description, state, details
 
-def getbuginfo(ui, bugline):
+def getbuginfo(ui, repo, bugline):
     """Get information about a bug from its bugline."""
-    bugid, description = splitbugline(bugline)
-    details = getbugdetails(ui, bugid)
-    bugid = getbugfullid(details, bugid)
-    return bugid, description, details
+    shortid, description = splitbugline(bugline)
+    details = getbugdetails(ui, repo, shortid)
+    fullid = getbugfullid(details, shortid)
+    return shortid, fullid, description, details
 
 def getbugs(ui, repo):
     """Get all bugs."""
@@ -168,12 +168,12 @@ def getbugs(ui, repo):
     # now turn them into a list of bugs
     openbugs = []
     for bugline in openbuglines:
-        bugid, description, details = getbuginfo(ui, bugline)
-        openbugs.append(BBug(bugid, description, "open", details))
+        bugid, fullid, description, details = getbuginfo(ui, repo, bugline)
+        openbugs.append(BBug(bugid, fullid, description, "open", details))
     resolvedbugs = []
     for bugline in resolvedbuglines:
-        bugid, description, details = getbuginfo(ui, bugline)
-        resolvedbugs.append(BBug(bugid, description, "resolved", details))
+        bugid, fullid, description, details = getbuginfo(ui, repo, bugline)
+        resolvedbugs.append(BBug(bugid, fullid, description, "resolved", details))
     return openbugs, resolvedbugs
 
 def parsereadme(filepath, truncated=False):
@@ -216,7 +216,7 @@ def writeoverview(ui, repo, target, name
     # and the bugs
     openbugs, resolvedbugs = getbugs(ui, repo)
     if openbugs or resolvedbugs:
-        overview += " | " + _("bugs")
+        overview += " | <a href=\"bugs\">" + _("bugs") + "</a>"
         if openbugs:
             overview += " <span class=\"bugnumbers\">(<span class=\"openbugnumber\">" + str(len(openbugs)) + "!</span> "
         else:
@@ -551,6 +551,55 @@ def writecommits(ui, repo, target, name,
             cf.write("<pre>"+ui.popbuffer().replace("<", "<")+"</pre>")
             cf.write(templates["foot"].replace("{reponame}", "<a href='../'>"+name+"</a>"))
 
+#: html escape codes thanks to http://wiki.python.org/moin/EscapingHtml
+htmlescapetable = {
+    "&": "&",
+    '"': """,
+    "'": "'",
+    ">": ">",
+    "<": "<",
+    }
+
+def htmlescape(text):
+    """Produce entities within text."""
+    return "".join(htmlescapetable.get(c,c) for c in text)
+
+def writebugs(ui, repo, target, name):
+    """Write bug information, a listing and the details for each bug."""
+    bugdir = os.path.join(target, "bugs")
+    
+    # create the bugs folder
+    if not os.path.isdir(bugdir):
+        os.makedirs(bugdir)
+        
+    # get all bugs
+    openbugs, resolvedbugs = getbugs(ui, repo)
+    # write the bugs list
+    bugslist = os.path.join(bugdir, "index.html")
+    content = "<h2 id=\"open\">Open Bugs</h2>\n<ul>"
+    for bug in openbugs:
+        content += "<li><a href=\"" + bug.fullid + ".html\">" + bug.shortid + "</a> - " + htmlescape(bug.description) + "</li>\n"
+    content += "</ul>\n"
+    content += "<h2 id=\"resolved\">Resolved Bugs</h2>\n<ul>"
+    for bug in resolvedbugs:
+        content += "<li><a href=\"" + bug.fullid + ".html\">" + bug.shortid + "</a> - " + htmlescape(bug.description) + "</li>\n"
+    content += "</ul>\n"
+    with open(bugslist, "w") as f:
+        f.write(templates["head"].replace("{reponame}", "<a href='../'>"+name+"</a>").replace("{title}", name))
+        f.write(content)
+        f.write(templates["foot"].replace("{reponame}", "<a href='../'>"+name+"</a>"))
+    # write all bug details
+    for bug in openbugs + resolvedbugs:
+        bugsfile = bugslist = os.path.join(bugdir, bug.fullid + ".html")
+        content = "<h2>" + bug.description + "</h2>\n"
+        content += "<pre>" + bug.details + "</pre>\n"
+        content += "<hr>"
+        content += "- <a href=\"index.html\">" + _("all bugs") + "</a> -"
+        with open(bugsfile, "w") as bf:
+            bf.write(templates["head"].replace("{reponame}", "<a href='../'>"+name+"</a>").replace("{title}", name))
+            bf.write(content)
+            bf.write(templates["foot"].replace("{reponame}", "<a href='../'>"+name+"</a>"))
+
 def escapename(filename):
     """escape index.html as .index.html and .ind… as ..ind… and so fort."""
     if _indexregexp.match(filename) is not None:
@@ -704,6 +753,9 @@ def parsesite(ui, repo, target, **opts):
     
     # and all forks
     writeforks(ui, repo, target, name)
+    
+    # and all bugs
+    writebugs(ui, repo, target, name)
 
 def addrepo(ui, repo, target, bookmarks, force):
     """Add the repo to the target and make sure it is up to date."""