/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
1
# -*- coding: UTF-8 -*-
734.1.43 by Curtis Hovey
Removed unused code.
2
"""BranchTreeModel."""
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
3
4
__copyright__ = "Copyright © 2005 Canonical Ltd."
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
5
__author__ = "Gary van der Merwe <garyvdm@gmail.com>"
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
6
7
734.1.21 by Curtis Hovey
Replaced the missing GenericCellRenderer with CellRenderer.
8
from gi.repository import Gtk
9
from gi.repository import GObject
413 by Daniel Schierbeck
Made the treeview escape XML in the revision messages.
10
from xml.sax.saxutils import escape
713.1.1 by Jelmer Vernooij
'bzr viz' now shows authors instead of committers.
11
12
from bzrlib.config import parse_username
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
13
from bzrlib.revision import NULL_REVISION
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
14
724 by Jelmer Vernooij
Fix formatting, imports.
15
from time import (
16
    strftime,
17
    localtime,
18
    )
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
19
734.1.43 by Curtis Hovey
Removed unused code.
20
423.4.6 by Daniel Schierbeck
Removed unnecessary spaces.
21
REVID = 0
22
NODE = 1
23
LINES = 2
24
LAST_LINES = 3
25
REVNO = 4
26
SUMMARY = 5
27
MESSAGE = 6
28
COMMITTER = 7
29
TIMESTAMP = 8
30
REVISION = 9
423.4.5 by Daniel Schierbeck
Fixed indendation issues.
31
PARENTS = 10
32
CHILDREN = 11
423.5.10 by Daniel Schierbeck
Merged with trunk.
33
TAGS = 12
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
34
AUTHORS = 13
256.2.29 by Gary van der Merwe
Implement a TreeModel that loads revisions incrementaly.
35
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
36
734.1.43 by Curtis Hovey
Removed unused code.
37
class BranchTreeModel(Gtk.ListStore):
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
38
    """A model of branch's merge history."""
39
40
    def __init__(self, branch, line_graph_data):
734.1.42 by Curtis Hovey
Small performance improvement.
41
        super(BranchTreeModel, self).__init__(
42
            GObject.TYPE_STRING,
43
            GObject.TYPE_PYOBJECT,
44
            GObject.TYPE_PYOBJECT,
45
            GObject.TYPE_PYOBJECT,
46
            GObject.TYPE_STRING,
47
            GObject.TYPE_STRING,
48
            GObject.TYPE_STRING,
49
            GObject.TYPE_STRING,
50
            GObject.TYPE_STRING,
51
            GObject.TYPE_PYOBJECT,
52
            GObject.TYPE_PYOBJECT,
53
            GObject.TYPE_PYOBJECT,
54
            GObject.TYPE_PYOBJECT,
55
            GObject.TYPE_STRING)
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
56
        self.revisions = {}
57
        self.branch = branch
58
        self.repository = branch.repository
59
        if self.branch.supports_tags():
60
            self.tags = self.branch.tags.get_reverse_tag_dict()
61
        else:
62
            self.tags = {}
734.1.42 by Curtis Hovey
Small performance improvement.
63
        self.set_line_graph_data(line_graph_data)
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
64
65
    def add_tag(self, tag, revid):
66
        self.branch.tags.set_tag(tag, revid)
67
        try:
68
            self.tags[revid].append(tag)
69
        except KeyError:
70
            self.tags[revid] = [tag]
71
734.1.50 by Curtis Hovey
Added missing tests for BranchTreeModel and CellRendererGraph.
72
    def _line_graph_item_to_model_row(self, rowref, data):
73
        revid, node, lines, parents, children, revno_sequence = data
74
        if rowref > 0:
75
            last_lines = self.line_graph_data[rowref - 1][2]
76
        else:
77
            last_lines = []
78
        revno = ".".join(["%d" % (revno) for revno in revno_sequence])
79
        tags = self.tags.get(revid, [])
80
        if not revid or revid == NULL_REVISION:
81
            revision = None
82
        elif revid not in self.revisions:
83
            revision = self.repository.get_revisions([revid])[0]
84
            self.revisions[revid] = revision
85
        else:
86
            revision = self.revisions[revid]
87
        if revision is None:
88
            summary = message = committer = timestamp = authors = None
89
        else:
90
            summary = escape(revision.get_summary())
91
            message = escape(revision.message)
92
            committer = parse_username(revision.committer)[0]
93
            timestamp = strftime(
94
                "%Y-%m-%d %H:%M", localtime(revision.timestamp))
95
            authors = ", ".join([
96
                parse_username(author)[0]
97
                for author in revision.get_apparent_authors()])
98
        return (revid, node, lines, last_lines, revno, summary, message,
99
                committer, timestamp, revision, parents, children, tags,
100
                authors)
101
734.1.39 by Curtis Hovey
A quick spike to verify that subclassing TreeStore is easier than
102
    def set_line_graph_data(self, line_graph_data):
103
        self.clear()
104
        self.line_graph_data = line_graph_data
105
        for rowref, data in enumerate(self.line_graph_data):
734.1.50 by Curtis Hovey
Added missing tests for BranchTreeModel and CellRendererGraph.
106
            row = self._line_graph_item_to_model_row(rowref, data)
107
            self.append(row)