(Arne Babenhauserheide)
2011-10-20: also add source files and manifest infos. also add source files and manifest infos.
diff --git a/static.py b/static.py --- a/static.py +++ b/static.py @@ -26,6 +26,7 @@ without the interactivity). - fork-/clone-info for each entry in [paths] with its incoming data (if it has some): clone/<pathname>/ → incoming log (commits) + possibly an associated issue in b. - More complex Readme parsing. + - Treat branch heads specially: link on the main page. * Usage: - hg static [--name] [-r] [folder] → parse the static folder for the current revision. @@ -39,7 +40,7 @@ without the interactivity). """ import os -from os.path import join, isdir, isfile, basename +from os.path import join, isdir, isfile, basename, dirname import shutil import re import mercurial @@ -62,7 +63,11 @@ templates = { """, "foot": "</body></html>", "screenstyle": """ """, - "printstyle": """ """ + "printstyle": """ """, + "manifesthead": """<h2>Commit: {hex} </h2> +<p>{desc}</p><p>{user}</p> + <h2>Files changed</h2>""" + } _indexregexp = re.compile("^\\.*index.html$") @@ -178,15 +183,80 @@ def escapename(filename): """escape index.html as .index.html and .ind… as ..ind… and so fort.""" if _indexregexp.match(filename) is not None: return "." + filename + else: return filename -def writesourcetree(ui, repo, target, name): +def parsesrcdata(data): + """Parse a src file into a html file.""" + return "<pre>"+data.replace("<", "<")+"</pre>" + +def srcpath(target, ctx, filename): + """Get the relative path to the static sourcefile for an already escaped filename.""" + return join(target,"src",ctx.hex(),filename+".html") + +def createindex(target, ctx): + """Create an index page for the changecontext: the commit message + the user + all files in the changecontext.""" + # first the head + index = templates["manifesthead"].replace( + "{hex}", ctx.hex()).replace( + "{desc}", ctx.description()).replace( + "{user}", ctx.user()) + # then the files + index += "<ul>" + for filename in ctx: + filectx = ctx[filename] + lasteditctx = filectx.filectx(filectx.filerev()) + index += "<li><a href='../../../"+ srcpath(target, lasteditctx, escapename(filename)) + "'>" + filename + "</a></li>" + index += "</ul>" + return index + + +def writesourcetree(ui, repo, target, name, force): """Write manifests for all commits and websites for all files. * For each file, write sites for all revisions where the file was changed: under src/<hex>/path as html site (with linenumbers and maybe colored source), under raw/<hex>/<path> as plain files. If there is an index.html file, write it as .index.html. If there also is .index.html, turn it to ..index.html, … * For each commit write an index with links to the included files at their latest revisions before/at the commit. """ - pass + # first write all files in all commits. + for c in range(len(repo.changelog)): + ctx = repo.changectx(str(c)) + for filename in ctx.files(): + filectx = ctx[filename] + # first write the raw data + filepath = join(target,"raw",ctx.hex(),filectx.path()) + # skip already existing files + if not force and isfile(filepath): + continue + try: + os.makedirs(dirname(filepath)) + except OSError: pass # exists + with open(filepath, "w") as f: + f.write(filectx.data()) + # then write it as html + _filenameescaped = escapename(filectx.path()) + filepath = srcpath(target,ctx,_filenameescaped) + try: + os.makedirs(dirname(filepath)) + except OSError: pass # exists + with open(filepath, "w") as f: + f.write(templates["head"].replace("{reponame}", name)) + f.write(parsesrcdata(filectx.data())) + f.write(templates["foot"].replace("{reponame}", name)) + # then write manifests for all commits + for c in range(len(repo.changelog)): + ctx = repo.changectx(str(c)) + filepath = join(target,"src",ctx.hex(),"index.html") + # skip already existing files + if not force and isfile(filepath): + continue + try: + os.makedirs(dirname(filepath)) + except OSError: pass # exists + with open(filepath, "w") as f: + f.write(templates["head"].replace("{reponame}", name)) + f.write(createindex(target, ctx)) + f.write(templates["foot"].replace("{reponame}", name)) + def parsesite(ui, repo, target, **opts): """Create the static folder.""" @@ -229,6 +299,9 @@ def parsesite(ui, repo, target, **opts): # and all commit files writecommits(ui, repo, target, name, force=opts["force"]) + # and all file data + writesourcetree(ui, repo, target, name, force=opts["force"]) + def addrepo(ui, repo, target): """Add the repo to the target and make sure it is up to date."""