Changeset 2971
- Timestamp:
- 01/02/08 14:55:56 (11 months ago)
- Files:
-
- perforceplugin/trunk/p4trac/api.py (modified) (22 diffs)
- perforceplugin/trunk/p4trac/repos.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
perforceplugin/trunk/p4trac/api.py
r2947 r2971 7 7 from datetime import datetime 8 8 9 from genshi.builder import tag10 11 9 from trac.config import ListOption, Option 12 10 from trac.core import Component, implements, TracError 13 11 from trac.versioncontrol import Changeset, Node, Repository, \ 14 IRepositoryConnector, \12 Authorizer, IRepositoryConnector, \ 15 13 NoSuchChangeset, NoSuchNode 16 14 from trac.versioncontrol.cache import CachedRepository 17 from trac.versioncontrol import Authorizer18 15 from trac.versioncontrol.web_ui.browser import IPropertyRenderer 19 16 from trac.util import sorted, embedded_numbers 17 from trac.util.text import to_unicode 20 18 from trac.util.datefmt import utc 21 19 … … 163 161 164 162 class PerforcePropertyRenderer(Component): 165 166 163 implements(IPropertyRenderer) 167 164 168 def __init__(self):169 self._externals_map = {}170 171 165 def match_property(self, name, mode): 172 return 0173 166 return name in ('Tickets') and 4 or 0 167 174 168 def render_property(self, name, mode, context, props): 175 pass 169 import string 170 from genshi.builder import tag 171 fragments = [] 172 vals = string.split(props[name], ' ') 173 for val in vals[1:]: 174 title = "ticket %s" % (val) 175 fragments.append(tag.a("#%s" % val, class_="ticket", 176 title=title, 177 href=context.href.ticket(val))) 178 return tag([tag(f, ', ') for f in fragments[:-1]], fragments[-1]) 176 179 177 180 … … 290 293 def get_oldest_rev(self): 291 294 return self.next_rev(0) 292 oldest_rev = property(fget=get_oldest_rev)293 295 294 296 def get_youngest_rev(self): 295 297 return self._repos.getLatestChange() 296 youngest_rev = property(fget=get_youngest_rev)297 298 298 299 def previous_rev(self, rev): … … 306 307 output = _P4ChangesOutputConsumer(self._repos) 307 308 self._connection.run('changes', '-l', '-s', 'submitted', 308 '-m', '1', 309 '@<%i' % rev, 310 output=output) 309 '-m', '1', '@<%i' % rev, output=output) 311 310 if output.errors: 312 311 from p4trac.repos import PerforcError … … 345 344 346 345 queryPath = self._repos.fromUnicode(queryPath) 347 348 self._log.debug(u'Looking for next_rev after change %i for %s' % (rev, path)) 346 self.log.debug(u'Looking for next_rev after change %i for %s' % (rev, path)) 349 347 350 348 # Perform a binary-search of sorts for the next revision … … 362 360 else: 363 361 batchUpperBound = middle 364 self. _log.debug(362 self.log.debug( 365 363 'Looking for changes in range [%i, %i]' % (lowerBound, 366 364 batchUpperBound)) … … 368 366 from p4trac.repos import _P4ChangesOutputConsumer 369 367 output = _P4ChangesOutputConsumer(self._repos) 370 depot_path = '%s%s@>=%i,@<=%i' % ( self.rootPath(self._connection),371 queryPath, lowerBound, batchUpperBound)368 depot_path = '%s%s@>=%i,@<=%i' % (rootPath(self._connection), 369 queryPath, lowerBound, batchUpperBound) 372 370 self._connection.run('changes', '-l', '-s', 'submitted', 373 371 '-m', str(batchSize), … … 385 383 if lowerBound + batchSize >= batchUpperBound: 386 384 # There are no earlier changes 387 self. _log.debug('next_rev is %i' % lowest)385 self.log.debug('next_rev is %i' % lowest) 388 386 return lowest 389 387 else: … … 462 460 from p4trac.repos import NodePath 463 461 nodePath = NodePath(NodePath.normalisePath(path), rev) 464 node = PerforceNode(nodePath, self._repos, self. _log)462 node = PerforceNode(nodePath, self._repos, self.log) 465 463 return node.get_history(limit) 466 464 … … 482 480 483 481 def get_changes(self, old_path, old_rev, new_path, new_rev, ignore_ancestry=0): 484 485 482 self.log.debug('PerforceRepository.get_changes(%r,%r,%r,%r)' % ( 486 483 old_path, old_rev, new_path, new_rev)) … … 573 570 else: 574 571 raise NoSuchNode(self._nodePath.path, self._nodePath.rev) 575 572 576 573 def get_content(self): 577 574 self._log.debug('PerforceNode.get_content()') … … 642 639 643 640 nextNode = None 644 645 641 if currentNode.integrations: 646 642 nodePath, how = currentNode.integrations[0] … … 685 681 686 682 elif self._node.isDirectory: 687 683 688 684 # List all changelists that have affected this directory 689 685 from p4trac.repos import _P4ChangesOutputConsumer … … 693 689 queryPath = '%s%s' % (rootPath(self._repos._connection), self._nodePath.rev) 694 690 else: 695 queryPath = '%s/...%s' % (self._nodePath.path, 696 self._nodePath.rev) 691 queryPath = '%s/...%s' % (self._nodePath.path, self._nodePath.rev) 697 692 698 693 if limit is None: 699 self._repos._connection.run( 700 'changes', 701 '-l', '-s', 'submitted', 702 self._repos.fromUnicode(queryPath), 703 output=output) 704 else: 705 self._repos._connection.run( 706 'changes', 707 '-l', '-s', 'submitted', 708 '-m', str(limit), 709 self._repos.fromUnicode(queryPath), 710 output=output) 711 694 self._repos._connection.run('changes', '-l', '-s', 'submitted', 695 self._repos.fromUnicode(queryPath), 696 output=output) 697 else: 698 self._repos._connection.run('changes', '-l', '-s', 'submitted', 699 '-m', str(limit), 700 self._repos.fromUnicode(queryPath), 701 output=output) 712 702 if output.errors: 713 703 raise PerforceError(output.errors) 714 704 715 705 changes = output.changes 716 706 … … 727 717 change = changes[i] 728 718 nodePath = NodePath(self._nodePath.path, change) 729 719 730 720 if i < len(changes)-1: 731 721 prevChange = changes[i+1] … … 734 724 735 725 prevNodePath = NodePath(self._nodePath.path, prevChange) 736 737 726 node = self._repos.getNode(nodePath) 738 727 prevNode = self._repos.getNode(prevNodePath) … … 754 743 else: 755 744 raise NoSuchNode(self._nodePath.path, self._nodePath.rev) 756 745 757 746 def get_annotations(self): 758 747 annotations = [] … … 771 760 self._log.debug('PerforceNode.get_properties') 772 761 if self.kind is Node.FILE: 773 props = { 774 'type' : self._node.type 775 } 762 props = { 'type' : self._node.type } 776 763 props.update(self._node.attributes) 777 764 return props … … 800 787 801 788 802 class PerforceChangeset( object):789 class PerforceChangeset(Changeset): 803 790 """A Perforce repository changelist""" 804 791 … … 811 798 self._log = log 812 799 self._changelist = self._repos.getChangelist(self._change) 813 814 def _get_message(self): 815 import p4trac.repos 816 try: 817 return self._changelist.description 818 except p4trac.repos.NoSuchChangelist, e: 819 raise NoSuchChangeset(e.change) 820 message = property(fget=_get_message) 821 822 def _get_date(self): 823 import p4trac.repos 824 try: 825 return datetime.fromtimestamp(self._changelist.time, utc) 826 except p4trac.repos.NoSuchChangelist, e: 827 raise NoSuchChangeset(e.change) 828 date = property(fget=_get_date) 829 830 def _get_author(self): 831 import p4trac.repos 832 try: 833 return self._changelist.user 834 except p4trac.repos.NoSuchChangelist, e: 835 raise NoSuchChangeset(e.change) 836 author = property(fget=_get_author) 837 838 def _get_rev(self): 839 import p4trac.repos 840 try: 841 return self._change 842 except p4trac.repos.NoSuchChangelist, e: 843 raise NoSuchChangeset(e.change) 844 rev = property(_get_rev) 800 Changeset.__init__(self, self._change, self._changelist.description, 801 self._changelist.user, datetime.fromtimestamp(self._changelist.time, utc)) 845 802 846 803 def get_properties(self): … … 853 810 props = {} 854 811 fixes = '' 855 print results.records856 812 for record in results.records: 857 813 tktid = int(record['Job'][self._job_prefix_length:]) 858 fixes += '#%d ' % tktid 814 self._log.debug("get_properties %d " % tktid) 815 fixes += ' %d' % tktid 859 816 860 817 if fixes != '': … … 867 824 # Force population of the file history for the files modified in this 868 825 # changelist. 869 870 826 self._log.debug("PerforceChangeset(%i).get_changes()" % self._change) 871 827 self._repos.precacheFileInformationForChanges([self._change]) perforceplugin/trunk/p4trac/repos.py
r2947 r2971 361 361 def __ne__(self, other): 362 362 return not (self == other) 363 363 364 364 365 class Changelist(object): 365 366 """A proxy object that gives access to details about a particular … … 1647 1648 nodePathRepo], 1648 1649 create=True) 1650 1649 1651 if fileInfo.rev is None: 1650 1652 fileInfo.rev = rev
