# # # patch "mtn.py" # from [56f9a515d67b8516d43b1b65cadd2183166b04ad] # to [d4b93790e5303b620758728ca041e30484950fdf] # # patch "viewmtn.py" # from [312363bf7024ccb33effbe7ae724a82eb7fa1a48] # to [6f5bf7815c4b795ab7dc6f766050b00d46adcbed] # ============================================================ --- mtn.py 56f9a515d67b8516d43b1b65cadd2183166b04ad +++ mtn.py d4b93790e5303b620758728ca041e30484950fdf @@ -26,6 +26,7 @@ class Revision(str): class Revision(str): def __init__(self, v): str.__init__(v) + self.obj_type = "revision" if not revision_re_c.match(self): raise MonotoneException("Not a valid revision ID") def abbrev(self): @@ -160,6 +161,7 @@ class Standalone(Runner): # to help(os.popen3) debug(("standalone is running:", command, args)) to_run = self.base_command + [command] + args + debug(to_run) process = popen2.Popen3(to_run, capturestderr=True) for line in process.fromchild: yield line @@ -307,3 +309,9 @@ class Operations: def certs(self, revision): for stanza in basic_io_from_stream(self.automate.run('certs', [revision])): yield stanza + + def diff(self, revision_from, revision_to, files=[]): + args = ['-r', revision_from, '-r', revision_to] + files + for line in self.standalone.run('diff', args): + yield line + ============================================================ --- viewmtn.py 312363bf7024ccb33effbe7ae724a82eb7fa1a48 +++ viewmtn.py 6f5bf7815c4b795ab7dc6f766050b00d46adcbed @@ -150,10 +150,11 @@ type_to_link_class = { yield grouping, stanzas type_to_link_class = { - 'tag' : TagLink, 'branch' : BranchLink, 'diff' : DiffLink, 'file' : FileLink, + 'revision' : RevisionLink, + 'tag' : TagLink, } def link(obj): @@ -222,15 +223,21 @@ class RevisionDiff: revisions=revisions_for_template(revision, revisions)) class RevisionDiff: - def GET(self, revision_from, revision_to): - debug("I'm here...") + def GET(self, revision_from, revision_to, filename=None): revision_from = mtn.Revision(revision_from) revision_to = mtn.Revision(revision_to) + if filename != None: + files = [filename] + else: + files = [] + diff = ops.diff(revision_from, revision_to, files) renderer.render('revisiondiff.html', page_title="Diff from %s to %s" % (revision_from.abbrev(), revision_to.abbrev()), revision=revision_from, revision_from=revision_from, - revision_to=revision_to) + revision_to=revision_to, + diff=diff, + files=files) class RevisionFile: def GET(self, revision, file): @@ -263,7 +270,7 @@ urls = ( '/revision/browse/('+mtn.revision_re+')/(.*)', 'RevisionBrowse', '/revision/diff/('+mtn.revision_re+')/with/('+mtn.revision_re+')', 'RevisionDiff', - '/revision/diff/('+mtn.revision_re+')/with/('+mtn.revision_re+')'+'/(.*)', 'RevisionDiffWithFile', + '/revision/diff/('+mtn.revision_re+')/with/('+mtn.revision_re+')'+'/(.*)', 'RevisionDiff', '/revision/file/('+mtn.revision_re+')/(.*)', 'RevisionFile', '/revision/info/('+mtn.revision_re+')', 'RevisionInfo', '/revision/tar/('+mtn.revision_re+')', 'RevisionTar',