Added fork info for every clone in path.
diff --git a/site.py b/site.py
--- a/site.py
+++ b/site.py
@@ -25,7 +25,7 @@ import mercurial
import ftplib
import socket
import datetime
-from mercurial import cmdutil
+from mercurial import cmdutil, util
from mercurial import commands
from mercurial.i18n import _
from mercurial import hg, discovery
@@ -54,6 +54,17 @@ templates = {
</head>
<body>
""",
+ "forkhead": """<!DOCTYPE html>
+<html><head>
+ <meta charset="utf-8" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!--duplicate for older browsers-->
+ <link rel="stylesheet" href="style.css" type="text/css" media="screen" />
+ <link rel="stylesheet" href="print.css" type="text/css" media="print" />
+ <title>{forkname}</title>
+</head>
+<body>
+<h1>{forkname} <small>(fork of <a href="../../">{reponame}</a>, found at {forkuri})</small></h1>
+""",
"foot": "</body></html>\n",
"screenstyle": """ """,
"printstyle": """ """,
@@ -120,7 +131,20 @@ def writeoverview(ui, repo, target, name
overview += "</div>"
break
# now the links to the log and the files.
- overview += "\n<p id='nav'><a href='commits'>changelog</a> | <a href='src/" + repo["tip"].hex() + "/'>files</a></p>"
+ overview += "\n<p id='nav'><a href='commits'>changelog</a> | <a href='src/" + repo["tip"].hex() + "/'>files</a>"
+ # and the forks
+ forks = getforkinfo(ui, target)
+ if forks:
+ overview += " | " + _("forks: ")
+ for forkname, forkuri in forks.items():
+ overview += "<a href='" + getforkdir(target, forkname) + "'>" + forkname + "</a> "
+ incoming, fn = getincoming(ui, repo, forkuri)
+ overview += "<small>(" + str(len(incoming))
+ outgoing, fn = getoutgoing(ui, repo, forkuri)
+ overview += "<small>↓↑</small>" + str(len(outgoing)) + ")</small> "
+
+ overview += "</p>"
+
# now add the 5 most recent log entries
# divert all following ui output to a string, so we can just use standard functions
overview += "\n<div id='shortlog'><h2>Changes (<a href='commits'>full changelog</a>)</h2>\n"
@@ -231,6 +255,105 @@ def writelog(ui, repo, target, name):
with open(filepath, "w") as f:
f.write(data)
+def getincoming(ui, repo, otheruri, other=None):
+ if not other:
+ other = hg.peer(repo, {}, otheruri)
+ ui.pushbuffer() # ignore ui events
+ source, branches = hg.parseurl(otheruri, None)
+ revs, checkout = hg.addbranchrevs(repo, other, branches, None)
+ if revs:
+ revs = [other.lookup(rev) for rev in revs]
+ other, chlist, cleanupfn = hg.bundlerepo.getremotechanges(ui, repo, other,
+ revs, False, False)
+ ui.popbuffer()
+ return chlist, cleanupfn
+
+def getoutgoing(ui, repo, otheruri, other=None):
+ if not other:
+ other = hg.peer(repo, {}, otheruri)
+ other.ui.pushbuffer() # ignore ui events
+ source, branches = hg.parseurl(repo.root, None)
+ revs, checkout = hg.addbranchrevs(other, repo, branches, None)
+ if revs:
+ revs = [repo.lookup(rev) for rev in revs]
+ other, chlist, cleanupfn = hg.bundlerepo.getremotechanges(ui, other, repo,
+ revs, False, False)
+ return chlist, cleanupfn
+
+
+def getforkinfo(ui, target):
+ """Name and Uri of all forks."""
+ forks = dict(ui.configitems("paths"))
+ forkinfo = {}
+ for forkname, forkuri in forks.items():
+ # ignore the static repo
+ if os.path.abspath(forkuri) == os.path.abspath(target):
+ continue
+ forkinfo[forkname] = forkuri
+ return forkinfo
+
+def getforkdata(ui, repo, target, name, forkname, forkuri):
+ """Write the site for a single fork."""
+ # make sure the forkdir exists.
+ other = hg.peer(repo, {}, forkuri)
+
+ # incrementally build the html
+ html = templates["forkhead"].replace(
+ "{forkname}", forkname).replace(
+ "{reponame}", name).replace(
+ "{forkuri}", util.hidepassword(forkuri))
+
+ # prepare the log templater
+ t = cmdutil.changeset_templater(ui, repo, patch=False, diffopts=None, mapfile=None, buffered=False)
+ t.use_template(templates["commitlog"].replace(
+ "{relativepath}", "../"))
+
+ # Add incoming commits
+ html += "<div id='incoming'><h2>Incoming commits</h2>"
+ chlist, cleanupfn = getincoming(ui, repo, forkuri, other=other)
+
+ ui.pushbuffer()
+ for ch in chlist:
+ ctx = other.changectx(ch)
+ t.show(ctx)
+ html += ui.popbuffer()
+ cleanupfn()
+
+ # add outgoing commits
+ html += "<div id='outgoing'><h2>Outgoing commits</h2>"
+ chlist, cleanupfn = getoutgoing(ui, repo, forkuri, other=other)
+
+ ui.pushbuffer()
+ for ch in chlist:
+ ctx = repo.changectx(ch)
+ t.show(ctx)
+ html += ui.popbuffer()
+ cleanupfn()
+
+ html += "</div>"
+ html += templates["foot"]
+ return html
+
+def getforkdir(target, forkname):
+ return join("forks", forkname)
+
+def writeforks(ui, repo, target, name):
+ """Write an info-page for each fork, defined in hg paths.
+
+ relevant data: incoming commits, outgoing commits, branches and bookmarks not in fork or not in repo. Short: incoming (commits, branches, bookmarks), outgoing (incoming first means, we consider this repo to be the main repo).
+ """
+ forkinfo = getforkinfo(ui, target)
+ for forkname, forkuri in forkinfo.items():
+ # ignore the static repo itself
+ if os.path.abspath(forkuri) == os.path.abspath(target):
+ continue
+ forkdir = getforkdir(target, forkname)
+ if not isdir(join(target, forkdir)):
+ os.makedirs(join(target, forkdir))
+ with open(join(target, forkdir, "index.html"), "w") as f:
+ f.write(
+ getforkdata(ui, repo, target, name, forkname, forkuri))
+
def writecommits(ui, repo, target, name, force=False):
"""Write all not yet existing commit files."""
@@ -391,6 +514,9 @@ def parsesite(ui, repo, target, **opts):
# and all file data
writesourcetree(ui, repo, target, name, force=opts["force"])
+ # and all forks
+ writeforks(ui, repo, target, name)
+
def addrepo(ui, repo, target, bookmarks):
"""Add the repo to the target and make sure it is up to date."""
@@ -527,7 +653,6 @@ def staticsite(ui, repo, target=None, **
upload(ui, repo, target, opts["upload"], opts["force"])
-
cmdtable = {
# "command-name": (function-call, options-list, help-string)
"site": (staticsite,