Changeset 4024
- Timestamp:
- 07/16/08 18:45:50 (4 months ago)
- Files:
-
- revtreeplugin/0.11/enhancers/logenhancer/logenhancer/enhancer.py (modified) (7 diffs)
- revtreeplugin/0.11/enhancers/logenhancer/setup.py (modified) (2 diffs)
- revtreeplugin/0.11/enhancers/mergeenhancer/mergeenhancer/enhancer.py (modified) (2 diffs)
- revtreeplugin/0.11/enhancers/mergeenhancer/setup.py (modified) (2 diffs)
- revtreeplugin/0.11/enhancers/mergeinfoenhancer/mergeinfoenhancer/enhancer.py (modified) (6 diffs)
- revtreeplugin/0.11/enhancers/mergeinfoenhancer/setup.py (modified) (2 diffs)
- revtreeplugin/0.11/hooks/trac-commit-hook (modified) (1 diff)
- revtreeplugin/0.11/revtree/api.py (modified) (1 diff)
- revtreeplugin/0.11/revtree/enhancer.py (modified) (4 diffs)
- revtreeplugin/0.11/revtree/model.py (modified) (14 diffs)
- revtreeplugin/0.11/revtree/svgview.py (modified) (20 diffs)
- revtreeplugin/0.11/revtree/web_ui.py (modified) (1 diff)
- revtreeplugin/0.11/setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
revtreeplugin/0.11/enhancers/logenhancer/logenhancer/enhancer.py
r3578 r4024 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006-200 7Emmanuel Blot <emmanuel.blot@free.fr>3 # Copyright (C) 2006-2008 Emmanuel Blot <emmanuel.blot@free.fr> 4 4 # All rights reserved. 5 5 # … … 13 13 # 14 14 15 from revtree import IRevtreeEnhancer 15 from revtree import IRevtreeEnhancer, RevtreeEnhancer 16 16 from revtree.svgview import SvgOperation, SvgGroup 17 17 from trac.core import * 18 18 19 __all__ = ['LogEnhancer'] 20 21 class SimpleContainer(object): 22 """Simple container for enhancer parameters""" 23 24 def __init__(self): 25 pass 19 __all__ = ['LogEnhancerModule'] 26 20 27 21 28 class LogEnhancer( Component):22 class LogEnhancer(RevtreeEnhancer): 29 23 """Revtree enhancer based on specific log messages and custom properties 30 24 This class is provided as-is, as an example … … 34 28 """ 35 29 36 implements(IRevtreeEnhancer) 37 38 def create(self, env, req, repos, svgrevtree): 30 def __init__(self, env, req, repos, svgrevtree): 39 31 """Creates the internal data from the repository""" 40 enhancer = SimpleContainer()41 enhancer._repos = repos42 enhancer._creations = []43 enhancer._deliveries = []44 enhancer._brings = []45 enhancer._groups = []46 enhancer._svgrevtree = svgrevtree47 # z-depth indexed widgets : back=1, fore=248 enhancer._widgets = ([], [], [])49 for branch in enhancer._repos.branches().values():50 svgbranch = enhancer._svgrevtree.svgbranch(branch=branch)32 self.env = env 33 self._repos = repos 34 self._creations = [] 35 self._deliveries = [] 36 self._brings = [] 37 self._groups = [] 38 self._svgrevtree = svgrevtree 39 # z-depth indexed widgets 40 self._widgets = [[] for l in IRevtreeEnhancer.ZLEVELS] 41 for branch in self._repos.branches().values(): 42 svgbranch = self._svgrevtree.svgbranch(branch=branch) 51 43 if not svgbranch: 52 44 continue … … 58 50 if branch.source(): 59 51 (rev, path) = branch.source() 60 srcchg = enhancer._repos.changeset(rev)52 srcchg = self._repos.changeset(rev) 61 53 if srcchg is None: 62 54 continue 63 enhancer._creations.append((srcchg, firstchgset))55 self._creations.append((srcchg, firstchgset)) 64 56 lastchgset = branch.youngest() 65 57 if lastchgset: … … 68 60 svgbranch.svgchangeset(lastchgset).mark_last() 69 61 70 for branch in enhancer._repos.branches().values():71 svgbranch = enhancer._svgrevtree.svgbranch(branch=branch)62 for branch in self._repos.branches().values(): 63 svgbranch = self._svgrevtree.svgbranch(branch=branch) 72 64 if not svgbranch: 73 65 continue … … 84 76 revisions = [int(c) for c in deliver.split(',')] 85 77 revisions.sort() 86 ychg = enhancer._repos.changeset(revisions[-1])78 ychg = self._repos.changeset(revisions[-1]) 87 79 if not ychg: 88 80 continue 89 81 brname = ychg.branchname 90 srcbranch = enhancer._repos.branch(brname)82 srcbranch = self._repos.branch(brname) 91 83 if not srcbranch: 92 84 continue 93 85 brrevs = [c.rev for c in srcbranch.changesets()] 94 86 valrevs = [r for r in revisions if r in brrevs] 95 fchg = enhancer._repos.changeset(valrevs[0])96 lchg = enhancer._repos.changeset(valrevs[-1])97 enhancer._groups.append((fchg,lchg))98 enhancer._deliveries.append((lchg,chgset))87 fchg = self._repos.changeset(valrevs[0]) 88 lchg = self._repos.changeset(valrevs[-1]) 89 self._groups.append((fchg,lchg)) 90 self._deliveries.append((lchg,chgset)) 99 91 except ValueError: 100 92 pass … … 111 103 revisions = [int(c) for c in bring.split(',')] 112 104 revisions.sort() 113 ychg = enhancer._repos.changeset(revisions[-1])105 ychg = self._repos.changeset(revisions[-1]) 114 106 if not ychg: 115 107 continue 116 108 brname = ychg.branchname 117 srcbranch = enhancer._repos.branch(brname)109 srcbranch = self._repos.branch(brname) 118 110 if not srcbranch: 119 111 continue 120 112 brrevs = [c.rev for c in srcbranch.changesets()] 121 113 valrevs = [r for r in revisions if r in brrevs] 122 fchg = enhancer._repos.changeset(valrevs[0])123 lchg = enhancer._repos.changeset(valrevs[-1])124 enhancer._groups.append((fchg,lchg))125 enhancer._brings.append((lchg,chgset))114 fchg = self._repos.changeset(valrevs[0]) 115 lchg = self._repos.changeset(valrevs[-1]) 116 self._groups.append((fchg,lchg)) 117 self._brings.append((lchg,chgset)) 126 118 except ValueError: 127 119 pass 128 120 except IndexError: 129 121 pass 130 131 return enhancer 132 133 def build(self, enhancer): 122 123 def build(self): 134 124 """Build the enhanced widgets""" 135 for (srcchg, dstchg) in enhancer._creations:125 for (srcchg, dstchg) in self._creations: 136 126 svgsrcbr = \ 137 enhancer._svgrevtree.svgbranch(branchname=srcchg.branchname)127 self._svgrevtree.svgbranch(branchname=srcchg.branchname) 138 128 svgdstbr = \ 139 enhancer._svgrevtree.svgbranch(branchname=dstchg.branchname)129 self._svgrevtree.svgbranch(branchname=dstchg.branchname) 140 130 if not svgsrcbr or not svgdstbr: 141 131 continue 142 132 svgsrcchg = svgsrcbr.svgchangeset(srcchg) 143 133 svgdstchg = svgdstbr.svgchangeset(dstchg) 144 op = SvgOperation( enhancer._svgrevtree, svgsrcchg, svgdstchg,134 op = SvgOperation(self._svgrevtree, svgsrcchg, svgdstchg, 145 135 '#5faf5f') 146 enhancer._widgets[2].append(op)136 self._widgets[IRevtreeEnhancer.ZMID].append(op) 147 137 148 for (first, last) in enhancer._groups:138 for (first, last) in self._groups: 149 139 svgbranch = \ 150 enhancer._svgrevtree.svgbranch(branchname=first.branchname)140 self._svgrevtree.svgbranch(branchname=first.branchname) 151 141 if not svgbranch: 152 142 continue 153 143 fsvg = svgbranch.svgchangeset(first) 154 144 lsvg = svgbranch.svgchangeset(last) 155 group = SvgGroup( enhancer._svgrevtree, fsvg, lsvg)156 enhancer._widgets[1].append(group)145 group = SvgGroup(self._svgrevtree, fsvg, lsvg) 146 self._widgets[IRevtreeEnhancer.ZBACK].append(group) 157 147 158 for (srcchg, dstchg) in enhancer._deliveries:148 for (srcchg, dstchg) in self._deliveries: 159 149 svgsrcbr = \ 160 enhancer._svgrevtree.svgbranch(branchname=srcchg.branchname)150 self._svgrevtree.svgbranch(branchname=srcchg.branchname) 161 151 svgdstbr = \ 162 enhancer._svgrevtree.svgbranch(branchname=dstchg.branchname)152 self._svgrevtree.svgbranch(branchname=dstchg.branchname) 163 153 if not svgsrcbr or not svgdstbr: 164 154 continue 165 155 svgsrcchg = svgsrcbr.svgchangeset(srcchg) 166 156 svgdstchg = svgdstbr.svgchangeset(dstchg) 167 op = SvgOperation( enhancer._svgrevtree, svgsrcchg, svgdstchg,157 op = SvgOperation(self._svgrevtree, svgsrcchg, svgdstchg, 168 158 'blue') 169 enhancer._widgets[2].append(op)159 self._widgets[IRevtreeEnhancer.ZMID].append(op) 170 160 171 for (srcchg, dstchg) in enhancer._brings:161 for (srcchg, dstchg) in self._brings: 172 162 svgsrcbr = \ 173 enhancer._svgrevtree.svgbranch(branchname=srcchg.branchname)163 self._svgrevtree.svgbranch(branchname=srcchg.branchname) 174 164 svgdstbr = \ 175 enhancer._svgrevtree.svgbranch(branchname=dstchg.branchname)165 self._svgrevtree.svgbranch(branchname=dstchg.branchname) 176 166 if not svgsrcbr or not svgdstbr: 177 167 continue 178 168 svgsrcchg = svgsrcbr.svgchangeset(srcchg) 179 169 svgdstchg = svgdstbr.svgchangeset(dstchg) 180 op = SvgOperation(enhancer._svgrevtree, svgsrcchg, svgdstchg, 181 'orange') 182 enhancer._widgets[2].append(op) 170 op = SvgOperation(self._svgrevtree, svgsrcchg, svgdstchg, 'orange') 171 self._widgets[IRevtreeEnhancer.ZMID].append(op) 183 172 184 for wl in enhancer._widgets:173 for wl in self._widgets: 185 174 map(lambda w: w.build(), wl) 186 175 187 def render(self, enhancer,level):176 def render(self, level): 188 177 """Renders the widgets, from background plane to foreground plane""" 189 if level < len(enhancer._widgets): 190 map(lambda w: w.render(), enhancer._widgets[level]) 178 if level < len(IRevtreeEnhancer.ZLEVELS): 179 map(lambda w: w.render(), self._widgets[level]) 180 181 182 class LogEnhancerModule(Component): 183 """Revtree enhancer based on specific log messages and custom properties 184 """ 185 186 implements(IRevtreeEnhancer) 187 188 def create(self, env, req, repos, svgrevtree): 189 return LogEnhancer(env, req, repos, svgrevtree) 190 revtreeplugin/0.11/enhancers/logenhancer/setup.py
r3578 r4024 16 16 17 17 PACKAGE = 'TracRevtreeLogEnhancer' 18 VERSION = '0. 1.4'18 VERSION = '0.2.0' 19 19 20 20 setup ( … … 27 27 url='http://trac-hacks.org/wiki/RevtreePlugin/LogEnhancer', 28 28 keywords = "trac revision svg graphical tree browser log", 29 install_requires = [ 'TracRevtreePlugin >= 0. 5dev',30 'TracRevtreePlugin < 0. 6'],29 install_requires = [ 'TracRevtreePlugin >= 0.6dev', 30 'TracRevtreePlugin < 0.7 '], 31 31 packages = find_packages(exclude=['ez_setup', '*.tests*']), 32 32 entry_points = { revtreeplugin/0.11/enhancers/mergeenhancer/mergeenhancer/enhancer.py
r3578 r4024 120 120 color = svgdstbr.fillcolor().lighten() 121 121 group = SvgGroup(svgrt, fsvg, lsvg, color, 40) 122 enhancer._widgets[ 1].append(group)122 enhancer._widgets[IRevtreeEnhancer.ZBACK].append(group) 123 123 124 124 # create inter-branch operations … … 132 132 op = SvgOperation(svgrt, svgsrcchg, svgdstchg, 133 133 svgdstbr.strokecolor()) 134 enhancer._widgets[ 2].append(op)134 enhancer._widgets[IRevtreeEnhancer.ZMID].append(op) 135 135 136 136 # build widgets revtreeplugin/0.11/enhancers/mergeenhancer/setup.py
r3578 r4024 16 16 17 17 PACKAGE = 'TracRevtreeMergeEnhancer' 18 VERSION = '0. 1.1'18 VERSION = '0.2.0' 19 19 20 20 setup ( … … 27 27 url='http://trac-hacks.org/wiki/RevtreePlugin/MergeEnhancer', 28 28 keywords = "trac revision svg graphical tree browser log", 29 install_requires = [ 'TracRevtreePlugin >= 0. 5.7',30 'TracRevtreePlugin < 0. 6'],29 install_requires = [ 'TracRevtreePlugin >= 0.6dev', 30 'TracRevtreePlugin < 0.7 '], 31 31 packages = find_packages(exclude=['ez_setup', '*.tests*']), 32 32 entry_points = { revtreeplugin/0.11/enhancers/mergeinfoenhancer/mergeinfoenhancer/enhancer.py
r3579 r4024 13 13 # 14 14 15 from revtree import IRevtreeEnhancer 15 from revtree import IRevtreeEnhancer, RevtreeEnhancer 16 16 from revtree.svgview import SvgOperation, SvgGroup 17 17 from trac.core import * 18 18 from trac.util.text import to_unicode 19 19 20 # debug 21 import sys 22 23 __all__ = ['MergeInfoEnhancer'] 24 25 class SimpleContainer(object): 26 """Simple container for enhancer parameters""" 27 28 def __init__(self): 29 pass 20 __all__ = ['MergeInfoEnhancerModule'] 30 21 31 22 … … 37 28 38 29 39 class MergeInfoEnhancer( Component):30 class MergeInfoEnhancer(RevtreeEnhancer): 40 31 """Enhancer to show merge operation, based on svn:mergeinfo properties. 41 42 This enhancer requires a SVN >= 1.5 repository. Previous releases of43 SVN do not manage the required information. This enhancer cannnot be44 used with repositories managed with the svnmerge.py tool45 32 """ 46 33 47 implements(IRevtreeEnhancer) 48 49 def create(self, env, req, repos, svgrevtree): 34 def __init__(self, env, req, repos, svgrevtree): 50 35 """Creates the internal data from the repository""" 51 36 enhancer = SimpleContainer() 52 enhancer._repos = repos53 enhancer._svgrevtree = svgrevtree54 enhancer._widgets = ([], [], [])55 enhancer._merges = []56 enhancer._groups = []37 self._repos = repos 38 self._svgrevtree = svgrevtree 39 self._widgets = [[] for l in IRevtreeEnhancer.ZLEVELS] 40 self._merges = [] 41 self._groups = [] 57 42 58 43 for branch in repos.branches().values(): … … 113 98 lchg = repos.changeset(srcrevs[-1]) 114 99 cchg = repos.changeset(rev) 115 enhancer._groups.append((branch, fchg, lchg))116 enhancer._merges.append((lchg, cchg))100 self._groups.append((branch, fchg, lchg)) 101 self._merges.append((lchg, cchg)) 117 102 118 103 # update the list of non-merged source changesets … … 123 108 return enhancer 124 109 125 def build(self , enhancer):110 def build(self): 126 111 """Build the enhanced widgets""" 127 svgrt = enhancer._svgrevtree112 svgrt = self._svgrevtree 128 113 # create groups of changesets 129 for (dstbranch, first, last) in enhancer._groups:114 for (dstbranch, first, last) in self._groups: 130 115 svgsrcbr = svgrt.svgbranch(branchname=first.branchname) 131 116 svgdstbr = svgrt.svgbranch(branch=dstbranch) … … 136 121 color = svgdstbr.fillcolor().lighten() 137 122 group = SvgGroup(svgrt, fsvg, lsvg, color, 40) 138 enhancer._widgets[1].append(group)123 self._widgets[IRevtreeEnhancer.ZBACK].append(group) 139 124 140 125 # create inter-branch operations 141 for (srcchg, dstchg) in enhancer._merges:126 for (srcchg, dstchg) in self._merges: 142 127 svgsrcbr = svgrt.svgbranch(branchname=srcchg.branchname) 143 128 svgdstbr = svgrt.svgbranch(branchname=dstchg.branchname) … … 148 133 op = SvgOperation(svgrt, svgsrcchg, svgdstchg, 149 134 svgdstbr.strokecolor()) 150 enhancer._widgets[2].append(op)135 self._widgets[IRevtreeEnhancer.ZMID].append(op) 151 136 152 137 # build widgets 153 for wl in enhancer._widgets:138 for wl in self._widgets: 154 139 map(lambda w: w.build(), wl) 155 140 156 def render(self, enhancer,level):141 def render(self, level): 157 142 """Renders the widgets, from background plane to foreground plane""" 158 if level < len(enhancer._widgets): 159 map(lambda w: w.render(), enhancer._widgets[level]) 143 if level < len(IRevtreeEnhancer.ZLEVELS): 144 map(lambda w: w.render(), self._widgets[level]) 145 146 147 class MergeInfoEnhancerModule(Component): 148 """Enhancer to show merge operation, based on svn:mergeinfo properties. 149 150 This enhancer requires a SVN >= 1.5 repository. Previous releases of 151 SVN do not manage the required information. This enhancer cannnot be 152 used with repositories managed with the svnmerge.py tool 153 """ 154 155 implements(IRevtreeEnhancer) 156 157 def create(self, env, req, repos, svgrevtree): 158 return MergeInfoEnhancer(env, req, repos, svgrevtree) revtreeplugin/0.11/enhancers/mergeinfoenhancer/setup.py
r3579 r4024 16 16 17 17 PACKAGE = 'TracRevtreeMergeInfoEnhancer' 18 VERSION = '0. 1.0'18 VERSION = '0.2.0' 19 19 20 20 setup ( … … 27 27 url='http://trac-hacks.org/wiki/RevtreePlugin/MergeInfoEnhancer', 28 28 keywords = "trac revision svg graphical tree browser log", 29 install_requires = [ 'TracRevtreePlugin >= 0. 5.7',30 'TracRevtreePlugin < 0. 6'],29 install_requires = [ 'TracRevtreePlugin >= 0.6dev', 30 'TracRevtreePlugin < 0.7 '], 31 31 packages = find_packages(exclude=['ez_setup', '*.tests*']), 32 32 entry_points = { revtreeplugin/0.11/hooks/trac-commit-hook
r3581 r4024 237 237 238 238 @param revisions a list of revisions 239 @return a diction nary of tickets: the key is the ticket number, the value is239 @return a dictionary of tickets: the key is the ticket number, the value is 240 240 the list of revisions related to this ticket. Each revision is 241 241 itself a list [author, log] revtreeplugin/0.11/revtree/api.py
r2841 r4024 16 16 from trac.core import * 17 17 18 __all__ = ['IRevtreeEnhancer', 'IRevtreeOptimizer', 18 __all__ = ['IRevtreeEnhancer', 'IRevtreeOptimizer', 'RevtreeEnhancer', 19 19 'EmptyRangeError', 'BranchPathError', 'RevtreeSystem'] 20 21 22 class RevtreeEnhancer(object): 23 """Enhancer interface""" 24 25 def build(self): 26 """Build the widgets""" 27 raise NotImplementedError 28 29 def render(self, level): 30 """Render the widgets""" 31 raise NotImplementedError 20 32 21 33 22 34 class IRevtreeEnhancer(Interface): 23 35 """Provide graphical enhancements to a revision tree""" 36 37 # Rendering Z levels 38 (ZBACK, ZMID, ZFORE) = ZLEVELS = range(3) 24 39 25 40 def create(env, req, repos, svgrevtree): 26 """Create the internal data from the repository""" 27 28 def build(enhancer): 29 """Build the widgets""" 30 31 def render(enhancer, level): 32 """Render the widgets""" 41 """Create the internal data from the repository 42 Return a RevtreeEnhancer instance 43 """ 33 44 34 45 revtreeplugin/0.11/revtree/enhancer.py
r3580 r4024 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006-200 7Emmanuel Blot <emmanuel.blot@free.fr>3 # Copyright (C) 2006-2008 Emmanuel Blot <emmanuel.blot@free.fr> 4 4 # All rights reserved. 5 5 # … … 13 13 # 14 14 15 from revtree.api import IRevtreeEnhancer 15 from revtree.api import IRevtreeEnhancer, RevtreeEnhancer 16 16 from revtree.svgview import SvgOperation, SvgGroup 17 17 from trac.core import * 18 18 19 __all__ = ['SimpleEnhancer ']19 __all__ = ['SimpleEnhancerModule'] 20 20 21 class SimpleContainer(object): 22 """Simple container for enhancer parameters""" 23 24 def __init__(self):25 pass21 22 class SimpleEnhancer(RevtreeEnhancer): 23 """This class is a very basic skeleton that needs to customized, to 24 provide SvgOperation, SvgGroup and other widgets in the RevTree graphic 25 """ 26 26 27 28 class SimpleEnhancer(Component): 29 """Enhance the appearance of the RevTree with site-specific properties. 30 31 Create branch clone operation (on branch/tag operations) 32 33 This class is a very basic skeleton that needs to customized, to provide 34 SvgOperation, SvgGroup and other widgets in the RevTree graphic 35 """ 36 37 implements(IRevtreeEnhancer) 38 39 def create(self, env, req, repos, svgrevtree): 27 def __init__(self, env, req, repos, svgrevtree): 40 28 """Creates the internal data from the repository""" 41 enhancer = SimpleContainer() 42 enhancer.repos = repos 43 enhancer.creations = [] 44 enhancer.svgrevtree = svgrevtree 45 # z-depth indexed widgets: back=1, fore=2 46 enhancer.widgets = ([], [], []) 29 self.repos = repos 30 self.creations = [] 31 self.svgrevtree = svgrevtree 32 # z-depth indexed widgets 33 self._widgets = [[] for l in IRevtreeEnhancer.ZLEVELS] 47 34 48 for branch in enhancer.repos.branches().values():49 svgbranch = enhancer.svgrevtree.svgbranch(branch=branch)35 for branch in self.repos.branches().values(): 36 svgbranch = self.svgrevtree.svgbranch(branch=branch) 50 37 if not svgbranch: 51 38 # branch has probably been filtered out … … 58 45 svgbranch.svgchangeset(firstchgset).mark_first() 59 46 (rev, path) = branch.source() 60 srcchg = enhancer.repos.changeset(rev)47 srcchg = self.repos.changeset(rev) 61 48 if srcchg is None: 62 49 continue 63 50 # .. and create an operation between both changesets 64 enhancer.creations.append((srcchg, firstchgset))51 self.creations.append((srcchg, firstchgset)) 65 52 lastchgset = branch.youngest() 66 53 if lastchgset: … … 71 58 return enhancer 72 59 73 def build(self , enhancer):60 def build(self): 74 61 """Build the enhanced widgets""" 75 for (srcchg, dstchg) in enhancer.creations:76 svgsrcbr = enhancer.svgrevtree.svgbranch(branchname=srcchg.branchname)62 for (srcchg, dstchg) in self.creations: 63 svgsrcbr = self.svgrevtree.svgbranch(branchname=srcchg.branchname) 77 64 if svgsrcbr is None: 78 65 continue 79 66 svgsrcchg = svgsrcbr.svgchangeset(srcchg) 80 svgdstbr = enhancer.svgrevtree.svgbranch(branchname=dstchg.branchname)67 svgdstbr = self.svgrevtree.svgbranch(branchname=dstchg.branchname) 81 68 if svgdstbr is None: 82 69 continue 83 70 svgdstchg = svgdstbr.svgchangeset(dstchg) 84 op = SvgOperation(enhancer.svgrevtree, svgsrcchg, svgdstchg, \ 85 '#3f3f3f') 86 enhancer.widgets[2].append(op) 71 op = SvgOperation(self.svgrevtree, svgsrcchg, svgdstchg, '#3f3f3f') 72 self.widgets[IRevtreeEnhancer.ZFORE].append(op) 87 73 88 for wl in enhancer.widgets:74 for wl in self.widgets: 89 75 map(lambda w: w.build(), wl) 90 76 91 def render(self, enhancer,level):77 def render(self, level): 92 78 """Renders the widgets, from background plane to foreground plane""" 93 if level < len(enhancer.widgets): 94 map(lambda w: w.render(), enhancer.widgets[level]) 95 79 if level < len(IRevtreeEnhancer.ZLEVELS): 80 map(lambda w: w.render(), self._widgets[level]) 96 81 97 82 98 83 class SimpleEnhancerModule(Component): 84 """Enhance the appearance of the RevTree with site-specific properties. 85 86 Create branch clone operation (on branch/tag operations) 87 88 This class is a very basic skeleton that needs to customized, to provide 89 SvgOperation, SvgGroup and other widgets in the RevTree graphic 90 """ 91 92 implements(IRevtreeEnhancer) 93 94 def create(self, env, req, repos, svgrevtree): 95 return SimpleEnhancer(env, req, repos, svgrevtree) revtreeplugin/0.11/revtree/model.py
r2497 r4024 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006-2007 Emmanuel Blot <emmanuel.blot@free.fr> 3 # Copyright (C) 2006-2007 Emmanuel Blot <emmanuel.blot@free.fr>x 4 4 # All rights reserved. 5 5 # … … 21 21 from trac.util.datefmt import utc 22 22 from trac.util.text import to_unicode 23 from trac.versioncontrol import Node, Changeset 23 from trac.versioncontrol import NoSuchNode, Node as TracNode, \ 24 Changeset as TracChangeset 24 25 25 26 __all__ = ['Repository'] 26 27 27 class BranchChangeset(object): 28 29 class Changeset(object): 28 30 """Represents a Subversion revision with additionnal properties""" 29 31 … … 37 39 # revision number 38 40 self.rev = self.changeset.rev 39 # branch name40 self.branchname = None41 41 # clone information (if any) 42 42 self.clone = None … … 46 46 self.properties = None 47 47 48 @staticmethod 49 def get_chgset_info(tracchgset): 50 chgit = tracchgset.get_changes() 51 item = chgit.next() 52 info = {} 53 try: 54 chgit.next() 55 except StopIteration: 56 info['unique'] = True 57 else: 58 # more changes are available, i.e. this is not a simple changeset 59 info['unique'] = False 60 enum = ('path', 'kind', 'change', 'base_path', 'base_rev') 61 for (pos, name) in enumerate(enum): 62 info[name] = item[pos] 63 return info 64 48 65 def __cmp__(self, other): 49 66 """Compares to another changeset, based on the revision number""" 50 67 return cmp(self.rev, other.rev) 51 68 52 def build(self, bcre):53 """Loads a changeset from a SVN repository54 bcre should define two named groups 'branch' and 'path'55 """56 try:57 if not self._find_simple_branch(bcre):58 self._find_plain_branch(bcre)59 except BranchPathError, e:60 self.env.log.warn("%s @ rev %s" % (e, self.rev or 0))61 self.branchname = None62 63 69 def _load_properties(self): 64 70 if not isinstance(self.properties, dict): … … 81 87 props[items[1]] = v 82 88 return props 83 89 90 91 class BranchChangeset(Changeset): 92 """Represents a Subversion revision with lies in a regular branch""" 93 94 def __init__(self, repos, changeset): 95 Changeset.__init__(self, repos, changeset) 96 # branch name 97 self.branchname = None 98 self.prettyname = None 99 84 100 def _find_simple_branch(self, bcre): 101 """A 'simple' changeset is described with a changeset whose only 102 change is a (branch) directory creation or deletion. Neither a file 103 nor a subdirectory should be altered in any way 104 """ 85 105 change_gen = self.changeset.get_changes() 86 106 item = change_gen.next() … … 92 112 return False 93 113 (path, kind, change, base_path, base_rev) = item 94 if kind is not Node.DIRECTORY:95 return False 96 if change is Changeset.COPY:114 if kind is not TracNode.DIRECTORY: 115 return False 116 if change is TracChangeset.COPY: 97 117 path_mo = bcre.match(path) 98 118 src_mo = bcre.match(base_path) 99 elif change is Changeset.DELETE:119 elif change is TracChangeset.DELETE: 100 120 path_mo = bcre.match(base_path) 101 121 if path_mo and not path_mo.group('path'): … … 108 128 if path_mo.group('path'): 109 129 return False 110 self.branchname = path_mo.group('branch')111 130 if src_mo: 112 131 self.clone = (int(base_rev), src_mo.group('branch')) 132 self.branchname = path_mo.group('branch') 133 self.prettyname = path_mo.group('branchname') or self.branchname 113 134 return True 114 135 115 136 def _find_plain_branch(self, bcre): 137 """A 'plain' changeset is a regular changeset, with file addition, 138 deletion or modification 139 """ 116 140 branch = None 117 141 for item in self.changeset.get_changes(): … … 130 154 raise BranchPathError, "'%s' != '%s'" % (br, branch) 131 155 self.branchname = branch 156 self.prettyname = mo.group('branchname') or self.branchname 132 157 return True 158 159 def build(self, bcre): 160 """Loads a changeset from a SVN repository 161 bcre should define two named groups 'branch' and 'path' 162 """ 163 try: 164 if self._find_simple_branch(bcre): 165 return True 166 if self._find_plain_branch(bcre): 167 return True 168 except BranchPathError, e: 169 self.env.log.warn("%s @ rev %s" % (e, self.rev or 0)) 170 return True 171 172 173 class TagChangeset(Changeset): 174 """Represent a Subversion 'tags' which is barely not more than a regular 175 changeset tied to a specific directory 176 """ 177 178 def __init__(self, repos, changeset): 179 Changeset.__init__(self, repos, changeset) 180 self.repos = repos 181 self.name = None 182 self.prettyname = None 183 184 def _find_tagged_changeset(self, bcre): 185 info = self.get_chgset_info(self.changeset) 186 if not info: 187 return False 188 if not info['unique']: 189 self.env.log.warn('Tag: too complex') 190 return False 191 if info['kind'] is not TracNode.DIRECTORY: 192 self.env.log.warn('Tag: not a dir: %s: %s' % \ 193 (info['kind'], info['path'])) 194 return False 195 if info['change'] is not TracChangeset.COPY: 196 self.env.log.warn('Tag: not a copy: %s: %s' % \ 197 (info['change'], info['path'])) 198 return False 199 path_mo = bcre.match(info['path']) 200 if not path_mo: # or not src_mo: 201 self.env.log.warn('Tag: with path: %s <- %s' % \ 202 (info['path'], info['base_path'])) 203 return False 204 if path_mo.group('path'): 205 self.env.log.warn('Tag: cannot have path') 206 return False 207 try: 208 node = self.repos.get_node(info['path'], self.changeset.rev) 209 except NoSuchNode: 210 return False 211 (prev_path, prev_rev, prev_chg) = node.get_previous() 212 self.env.log.info("PREV: %s %s %s" % (prev_path, prev_rev, prev_chg)) 213 self.clone = (int(prev_rev), prev_path) 214 self.name = path_mo.group('tag') 215 self.prettyname = path_mo.group('tagname') or self.name 216 return True 217 218 def build(self, bcre): 219 return self._find_tagged_changeset(bcre) 220 221 def source(self): 222 return self.clone and self.repos.changeset(self.clone[0]) 223 133 224 134 225 class Branch(object): … … 136 227 changesets""" 137 228 138 def __init__(self, name ):229 def __init__(self, name, prettyname): 139 230 # Name (path) 140 231 self.name = name 232 self.prettyname = prettyname 141 233 # Source 142 234 self._source = None … … 209 301 node = repos.find_node(clone[1], clone[0]) 210 302 self._source = (int(node[1]), node[0]) 211 303 304 212 305 class Repository(object): 213 306 """Represents a Subversion repositories as a set of branches and a set … … 221 314 # Trac version control 222 315 self._crepos = self.env.get_repository(authname) 223 # Diction nary of changesets316 # Dictionary of changesets 224 317 self._changesets = {} 225 # Diction nary of branches318 # Dictionary of branches 226 319 self._branches = {} 227 228 def _build_branches(self): 229 """Constructs the branch dictionnary from the changeset dictionnary""" 320 # Dictionary of tags 321 self._tags = {} 322 323 def _dispatch(self): 324 """Constructs the branch and tag dictionaries from the changeset 325 dictionary""" 230 326 for chgset in self._changesets.values(): 231 br = chgset.branchname 232 if not self._branches.has_key(br): 233 self._branches[br] = Branch(br) 234 self._branches[br].add_changeset(chgset) 327 if isinstance(chgset, BranchChangeset): 328 br = chgset.branchname 329 if not self._branches.has_key(br): 330 self._branches[br] = Branch(br, chgset.prettyname) 331 self._branches[br].add_changeset(chgset) 332 elif isinstance(chgset, TagChangeset): 333 if self._tags.has_key(chgset.name): &nbs
