782 if rev < web.maxshortchanges: |
782 if rev < web.maxshortchanges: |
783 startrev = uprev |
783 startrev = uprev |
784 |
784 |
785 dag = graphmod.dagwalker(web.repo, range(startrev, downrev - 1, -1)) |
785 dag = graphmod.dagwalker(web.repo, range(startrev, downrev - 1, -1)) |
786 tree = list(graphmod.colored(dag, web.repo)) |
786 tree = list(graphmod.colored(dag, web.repo)) |
787 canvasheight = (len(tree) + 1) * bg_height - 27 |
787 |
788 data = [] |
788 def getcolumns(tree): |
789 for (id, type, ctx, vtx, edges) in tree: |
789 cols = 0 |
790 if type != graphmod.CHANGESET: |
790 for (id, type, ctx, vtx, edges) in tree: |
791 continue |
791 if type != graphmod.CHANGESET: |
792 node = str(ctx) |
792 continue |
793 age = templatefilters.age(ctx.date()) |
793 cols = max(cols, max([edge[0] for edge in edges] or [0]), |
794 desc = templatefilters.firstline(ctx.description()) |
794 max([edge[1] for edge in edges] or [0])) |
795 desc = cgi.escape(templatefilters.nonempty(desc)) |
795 return cols |
796 user = cgi.escape(templatefilters.person(ctx.user())) |
796 |
797 branch = ctx.branch() |
797 def graphdata(usetuples, **map): |
798 try: |
798 data = [] |
799 branchnode = web.repo.branchtip(branch) |
799 |
800 except error.RepoLookupError: |
800 row = 0 |
801 branchnode = None |
801 for (id, type, ctx, vtx, edges) in tree: |
802 branch = branch, branchnode == ctx.node() |
802 if type != graphmod.CHANGESET: |
803 data.append((node, vtx, edges, desc, user, age, branch, ctx.tags(), |
803 continue |
804 ctx.bookmarks())) |
804 node = str(ctx) |
|
805 age = templatefilters.age(ctx.date()) |
|
806 desc = templatefilters.firstline(ctx.description()) |
|
807 desc = cgi.escape(templatefilters.nonempty(desc)) |
|
808 user = cgi.escape(templatefilters.person(ctx.user())) |
|
809 branch = ctx.branch() |
|
810 try: |
|
811 branchnode = web.repo.branchtip(branch) |
|
812 except error.RepoLookupError: |
|
813 branchnode = None |
|
814 branch = branch, branchnode == ctx.node() |
|
815 |
|
816 if usetuples: |
|
817 data.append((node, vtx, edges, desc, user, age, branch, |
|
818 ctx.tags(), ctx.bookmarks())) |
|
819 else: |
|
820 edgedata = [dict(col=edge[0], nextcol=edge[1], |
|
821 color=(edge[2] - 1) % 6 + 1, |
|
822 width=edge[3], bcolor=edge[4]) |
|
823 for edge in edges] |
|
824 |
|
825 data.append( |
|
826 dict(node=node, |
|
827 col=vtx[0], |
|
828 color=(vtx[1] - 1) % 6 + 1, |
|
829 edges=edgedata, |
|
830 row=row, |
|
831 nextrow=row + 1, |
|
832 desc=desc, |
|
833 user=user, |
|
834 age=age, |
|
835 bookmarks=webutil.nodebookmarksdict( |
|
836 web.repo, ctx.node()), |
|
837 branches=webutil.nodebranchdict(web.repo, ctx), |
|
838 inbranch=webutil.nodeinbranch(web.repo, ctx), |
|
839 tags=webutil.nodetagsdict(web.repo, ctx.node()))) |
|
840 |
|
841 row += 1 |
|
842 |
|
843 return data |
|
844 |
|
845 cols = getcolumns(tree) |
|
846 rows = len(tree) |
|
847 canvasheight = (rows + 1) * bg_height - 27 |
805 |
848 |
806 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev, |
849 return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev, |
807 lessvars=lessvars, morevars=morevars, downrev=downrev, |
850 lessvars=lessvars, morevars=morevars, downrev=downrev, |
808 canvasheight=canvasheight, jsdata=data, bg_height=bg_height, |
851 cols=cols, rows=rows, |
|
852 canvaswidth=(cols + 1) * bg_height, |
|
853 truecanvasheight=rows * bg_height, |
|
854 canvasheight=canvasheight, bg_height=bg_height, |
|
855 jsdata=lambda **x: graphdata(True, **x), |
|
856 nodes=lambda **x: graphdata(False, **x), |
809 node=revnode_hex, changenav=changenav) |
857 node=revnode_hex, changenav=changenav) |
810 |
858 |
811 def _getdoc(e): |
859 def _getdoc(e): |
812 doc = e[0].__doc__ |
860 doc = e[0].__doc__ |
813 if doc: |
861 if doc: |