# # # patch "templates/branch.html" # from [e37668c02c96b419b0985a799550677b90737ae5] # to [5a004d85304a8fd67730ad84d9e7bdea0e5bfb38] # # patch "templates/branchchanges.html" # from [bab70162c2dd25a6eb276b7dc09933527b4131fd] # to [802a6ef3b009623630d03aceb3f7dde6b406a056] # # patch "viewmtn.py" # from [a2ea5c28701ff9a4d9f2ff0e9023640dc667fc8a] # to [f795413ad19745dfaa9b80661c08e17bc179fa0b] # ============================================================ --- templates/branch.html e37668c02c96b419b0985a799550677b90737ae5 +++ templates/branch.html 5a004d85304a8fd67730ad84d9e7bdea0e5bfb38 @@ -1,7 +1,7 @@ #extends base #def extramenu Branch $branch.name: -Changes | -Head revision +Changes | +Head revision #end def ============================================================ --- templates/branchchanges.html bab70162c2dd25a6eb276b7dc09933527b4131fd +++ templates/branchchanges.html 802a6ef3b009623630d03aceb3f7dde6b406a056 @@ -1,9 +1,9 @@ #extends branch #def body

-Displaying topologically sorted log of changes (estimated as being changes 1 - 10)
+Changes $from_change to $to_change on this branch are displayed below, sorted in descending chronological order.

@@ -35,7 +35,36 @@ Displaying topologically sorted log of c #end for +
$when
+ + + + + + + +
+#if $next_from and $next_to +#filter Filter +$link($branch, from_change=$next_from, to_change=$next_to).html("earlier changes") +#filter WebSafe +#else +(no earlier changes) +#end if + +#filter Filter +$link($branch).html("recent changes") +#filter WebSafe + +#if $previous_from and $previous_to +#filter Filter +$link($branch, from_change=$previous_from, to_change=$previous_to).html("later changes") +#filter WebSafe +#else +(no later changes) +#end if +
#end def ============================================================ --- viewmtn.py a2ea5c28701ff9a4d9f2ff0e9023640dc667fc8a +++ viewmtn.py f795413ad19745dfaa9b80661c08e17bc179fa0b @@ -40,7 +40,7 @@ class Link: static_join = lambda path: urlparse.urljoin(config.static_uri_path, path) class Link: - def __init__(self, description=None, link_type=None): + def __init__(self, description=None, link_type=None, **kwargs): self.relative_uri = None self.description = description def html(self, override_description=None): @@ -71,7 +71,11 @@ class BranchLink(Link): class BranchLink(Link): def __init__(self, branch, **kwargs): Link.__init__(*(self, ), **kwargs) - self.relative_uri = 'branch/changes/' + urllib.quote(branch.name) + from_change, to_change = kwargs.get('from_change'), kwargs.get('to_change') + if from_change and to_change: + self.relative_uri = 'branch/changes/%s/from/%d/to/%d' % (urllib.quote(branch.name), from_change, to_change) + else: + self.relative_uri = 'branch/changes/' + urllib.quote(branch.name) self.description = hq(branch.name) class DiffLink(Link): @@ -179,11 +183,11 @@ type_to_link_class = { 'tag' : TagLink, } -def link(obj, link_type=None): +def link(obj, link_type=None, **kwargs): link_class = type_to_link_class.get(obj.obj_type) if not link_class: raise LinkException("Unable to link to objects of type: '%s'" % (obj.obj_type)) - return link_class(obj, link_type=link_type) + return link_class(obj, **kwargs) class Renderer: def __init__(self): @@ -243,14 +247,12 @@ class BranchChanges: renderer.render('help.html', page_title="Help") class BranchChanges: - def get_last_changes(self, branch, start_at, count): - if len(start_at) == 0: - revs = map(None, ops.heads(branch.name)) - else: - revs = start_at + def get_last_changes(self, branch, from_change, to_change): + revs = map(None, ops.heads(branch.name)) if len(revs) == 0: - raise Exception("get_last_changes() unable to find somewhere to start!") + raise Exception("get_last_changes() unable to find somewhere to start - probably a non-existent branch?") to_parent = revs+[] # copy + count = to_change while len(revs) < count: new_to_parent = [] for rev in to_parent: @@ -271,9 +273,9 @@ class BranchChanges: return common.parse_timecert(cert[7]) return None certs_for_revs.sort(lambda b, a: cmp(cd(a[1]), cd(b[1]))) - return certs_for_revs[:count], new_to_parent + return certs_for_revs[from_change:to_change], new_to_parent - def GET(self, branch, start_at=[], old_start_at=[]): + def GET(self, branch, from_change, to_change): def quicklog(changelog): rv = changelog[0].strip() if rv.startswith('*'): @@ -314,10 +316,37 @@ class BranchChanges: rv.append((revision, diffs, ago, author, '\n'.join(changelog), shortlog, when)) return rv branch = mtn.Branch(branch) - changed, new_starting_point = self.get_last_changes(branch, start_at, 10) + per_page = 10 + if from_change: + from_change = int(from_change) + else: + from_change = 0 + if to_change: + to_change = int(to_change) + else: + to_change = per_page + changed, new_starting_point = self.get_last_changes(branch, from_change, to_change) + # next and previous 'from' and 'to' indexes + if len(changed) == to_change - from_change: + next_from, next_to = to_change, to_change + per_page + else: + next_from, next_to = None, None + if from_change > 0: + previous_from = from_change - per_page + if previous_from < 0: previous_from = 0 + previous_to = previous_from + per_page + else: + previous_from, previous_to = None, None + renderer.render('branchchanges.html', page_title="Branch %s" % branch.name, branch=branch, + from_change=from_change, + to_change=to_change, + previous_from=previous_from, + previous_to=previous_to, + next_from=next_from, + next_to=next_to, display_revs=for_template(changed)) class RevisionInfo: @@ -389,23 +418,25 @@ urls = ( branch_re = r'' urls = ( - '/', 'Index', #done - '/about', 'About', #done - '/tags', 'Tags', #done - '/help', 'Help', #done - '/json/(A-Za-z)/(.*)', 'Json', + r'/', 'Index', #done + r'/about', 'About', #done + r'/tags', 'Tags', #done + r'/help', 'Help', #done + r'/json/(A-Za-z)/(.*)', 'Json', - '/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+')'+'/(.*)', 'RevisionDiff', - '/revision/file/('+mtn.revision_re+')/(.*)', 'RevisionFile', - '/revision/info/('+mtn.revision_re+')', 'RevisionInfo', - '/revision/tar/('+mtn.revision_re+')', 'RevisionTar', + r'/revision/browse/('+mtn.revision_re+')/(.*)', 'RevisionBrowse', + r'/revision/diff/('+mtn.revision_re+')/with/('+mtn.revision_re+')', 'RevisionDiff', + r'/revision/diff/('+mtn.revision_re+')/with/('+mtn.revision_re+')'+'/(.*)', 'RevisionDiff', + r'/revision/file/('+mtn.revision_re+')/(.*)', 'RevisionFile', + r'/revision/info/('+mtn.revision_re+')', 'RevisionInfo', + r'/revision/tar/('+mtn.revision_re+')', 'RevisionTar', - '/branch/changes/(.*)()()', 'BranchChanges', - '/branch/head/(.*)', 'BranchHead', - '/branch/tar/(.*)', 'BranchTar', - '/static/(.*)', 'Static' + r'/branch/changes/(.*)/from/(\d+)/to/(\d+)', 'BranchChanges', + r'/branch/changes/([^/]+)()()', 'BranchChanges', + r'/branch/head/([^/]+)', 'BranchHead', + r'/branch/tar/([^/]+)', 'BranchTar', + + r'/static/(.*)', 'Static' ) if __name__ == '__main__':