bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 1 | # Copyright (C) 2004, 2005 by Canonical Ltd
 | 
| 2 | ||
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | ||
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | ||
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 17 | """File annotate based on weave storage"""
 | |
| 18 | ||
| 1185.16.8
by Martin Pool doc | 19 | # TODO: Choice of more or less verbose formats:
 | 
| 20 | # 
 | |
| 21 | # interposed: show more details between blocks of modified lines
 | |
| 22 | ||
| 23 | # TODO: Show which revision caused a line to merge into the parent
 | |
| 24 | ||
| 1185.16.57
by Martin Pool [merge] from aaron | 25 | # TODO: With --long, show entire email address, not just the first bit
 | 
| 26 | ||
| 27 | # TODO: perhaps abbreviate timescales depending on how recent they are
 | |
| 28 | # e.g. "3:12 Tue", "13 Oct", "Oct 2005", etc.  
 | |
| 29 | ||
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 30 | import sys | 
| 31 | import os | |
| 1185.16.1
by Martin Pool - update annotate for new branch api | 32 | import time | 
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 33 | |
| 34 | import bzrlib.weave | |
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 35 | from bzrlib.config import extract_email_address | 
| 36 | ||
| 37 | ||
| 38 | def annotate_file(branch, rev_id, file_id, verbose=False, full=False, | |
| 39 | to_file=None): | |
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 40 | if to_file is None: | 
| 41 | to_file = sys.stdout | |
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 42 | |
| 43 | prevanno='' | |
| 44 | for (revno_str, author, date_str, line_rev_id, text ) in \ | |
| 45 | _annotate_file(branch, rev_id, file_id ): | |
| 46 | ||
| 47 | if verbose: | |
| 48 | anno = '%5s %-12s %8s ' % (revno_str, author[:12], date_str) | |
| 49 | else: | |
| 50 | anno = "%5s %-7s " % ( revno_str, author[:7] ) | |
| 51 | ||
| 52 | if anno.lstrip() == "" and full: anno = prevanno | |
| 53 | print >>to_file, '%s| %s' % (anno, text) | |
| 54 | prevanno=anno | |
| 55 | ||
| 56 | def _annotate_file(branch, rev_id, file_id ): | |
| 57 | ||
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 58 | rh = branch.revision_history() | 
| 1185.16.1
by Martin Pool - update annotate for new branch api | 59 | w = branch.weave_store.get_weave(file_id, branch.get_transaction()) | 
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 60 | last_origin = None | 
| 61 | for origin, text in w.annotate_iter(rev_id): | |
| 62 | text = text.rstrip('\r\n') | |
| 63 | if origin == last_origin: | |
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 64 | (revno_str, author, date_str) = ('','','') | 
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 65 | else: | 
| 66 | last_origin = origin | |
| 67 | line_rev_id = w.idx_to_name(origin) | |
| 1185.16.32
by Martin Pool - add a basic annotate built-in command | 68 | if not branch.has_revision(line_rev_id): | 
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 69 | (revno_str, author, date_str) = ('?','?','?') | 
| 1185.16.1
by Martin Pool - update annotate for new branch api | 70 | else: | 
| 1185.16.32
by Martin Pool - add a basic annotate built-in command | 71 | if line_rev_id in rh: | 
| 72 | revno_str = str(rh.index(line_rev_id) + 1) | |
| 73 | else: | |
| 74 | revno_str = 'merge' | |
| 75 | rev = branch.get_revision(line_rev_id) | |
| 76 | tz = rev.timezone or 0 | |
| 77 | date_str = time.strftime('%Y%m%d', | |
| 78 | time.gmtime(rev.timestamp + tz)) | |
| 79 |             # a lazy way to get something like the email address
 | |
| 80 |             # TODO: Get real email address
 | |
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 81 | author = rev.committer | 
| 82 | try: | |
| 83 | author = extract_email_address(author) | |
| 84 | except BzrError: | |
| 85 | pass # use the whole name | |
| 86 | yield (revno_str, author, date_str, line_rev_id, text) | |
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 87 | |
| 88 | ||
| 89 | if __name__ == '__main__': | |
| 1185.16.1
by Martin Pool - update annotate for new branch api | 90 | from bzrlib.branch import Branch | 
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 91 | from bzrlib.trace import enable_default_logging | 
| 1457.1.4
by Robert Collins Branch.relpath has been moved to WorkingTree.relpath. | 92 | from bzrlib.workingtree import WorkingTree | 
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 93 | |
| 94 | enable_default_logging() | |
| 1442.1.64
by Robert Collins Branch.open_containing now returns a tuple (Branch, relative-path). | 95 | b = Branch.open_containing(sys.argv[1])[0] | 
| 1457.1.4
by Robert Collins Branch.relpath has been moved to WorkingTree.relpath. | 96 | tree = WorkingTree(b.base, b) | 
| 97 | rp = tree.relpath(sys.argv[1]) | |
| 1385
by Martin Pool - simple weave-based annotate code (not complete) | 98 | tree = b.revision_tree(b.last_revision()) | 
| 99 | file_id = tree.inventory.path2id(rp) | |
| 1092.2.22
by Robert Collins text_version and name_version unification looking reasonable | 100 | file_version = tree.inventory[file_id].revision | 
| 1185.16.53
by Martin Pool - annotate improvements from Goffreddo, with extra bug fixes and tests | 101 | annotate_file(b, file_version, file_id, to_file = sys.stdout) |