/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to annotate/gannotate.py

  • Committer: Jelmer Vernooij
  • Date: 2006-05-19 16:56:46 UTC
  • mfrom: (0.1.25 gannotate)
  • Revision ID: jelmer@samba.org-20060519165646-0d867938fdbc9097
Merge in Dan Loda's gannotate plugin and put it in annotate/

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import gtk
23
23
import pango
24
24
 
25
 
from bzrlib import tsort
26
25
from bzrlib.errors import NoSuchRevision
27
 
from bzrlib.revision import NULL_REVISION
28
26
 
29
27
from colormap import AnnotateColorMap, AnnotateColorSaturation
30
28
from logview import LogView
58
56
        if self.plain:
59
57
            self.span_selector.hide()
60
58
 
61
 
    def annotate(self, branch, file_id, revision_id=None):
 
59
    def annotate(self, branch, file_id):
62
60
        self.revisions = {}
63
 
        self.annotations = []
64
 
        self.branch = branch
65
 
        self.file_id = file_id
66
 
        self.revision_id = revision_id
67
61
        
68
62
        # [revision id, line number, committer, revno, highlight color, line]
69
63
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
78
72
            branch.lock_read()
79
73
            branch.repository.lock_read()
80
74
            for line_no, (revision, revno, line)\
81
 
                    in enumerate(self._annotate(branch, file_id, revision_id)):
 
75
                    in enumerate(self._annotate(branch, file_id)):
82
76
                if revision.revision_id == last_seen and not self.all:
83
77
                    revno = committer = ""
84
78
                else:
95
89
                                       None,
96
90
                                       line.rstrip("\r\n")
97
91
                                      ])
98
 
                self.annotations.append(revision)
99
92
 
100
93
            if not self.plain:
101
94
                self._set_oldest_newest()
116
109
            # bar?
117
110
            print("gannotate: Line number %d does't exist. Defaulting to "
118
111
                  "line 1." % lineno)
119
 
            return
120
112
        else:
121
113
            row = lineno - 1
122
114
 
123
115
        self.annoview.set_cursor(row)
124
 
        self.annoview.scroll_to_cell(row, use_align=True)
125
 
 
126
 
    def _dotted_revnos(self, repository, revision_id):
127
 
        """Return a dict of revision_id -> dotted revno
128
 
        
129
 
        :param repository: The repository to get the graph from
130
 
        :param revision_id: The last revision for which this info is needed
131
 
        """
132
 
        graph = repository.get_revision_graph(revision_id)
133
 
        dotted = {}
134
 
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
135
 
            revision_id, generate_revno=True):
136
 
            dotted[revision_id] = '.'.join(str(num) for num in revno)
137
 
        return dotted
138
 
 
139
 
    def _annotate(self, branch, file_id, revision_id):
 
116
 
 
117
    def _annotate(self, branch, file_id):
 
118
        rev_hist = branch.revision_history()
140
119
        repository = branch.repository
141
 
        if revision_id is None:
142
 
            revision_id = branch.last_revision()
143
 
        dotted = self._dotted_revnos(repository, revision_id)
144
 
        rev_tree = repository.revision_tree(revision_id)
145
 
        revision_id = rev_tree.inventory[file_id].revision
 
120
        rev_tree = repository.revision_tree(branch.last_revision())
 
121
        rev_id = rev_tree.inventory[file_id].revision
146
122
        weave = repository.weave_store.get_weave(file_id,
147
123
                                                 branch.get_transaction())
148
124
        
149
125
        revision_cache = RevisionCache(repository)
150
 
        for origin, text in weave.annotate_iter(revision_id):
 
126
        for origin, text in weave.annotate_iter(rev_id):
151
127
            rev_id = origin
152
128
            try:
153
129
                revision = revision_cache.get_revision(rev_id)
154
 
                revno = dotted.get(rev_id, 'merge')
155
 
                if len(revno) > 15:
156
 
                    revno = 'merge'
 
130
                if rev_id in rev_hist:
 
131
                    revno = branch.revision_id_to_revno(rev_id)
 
132
                else:
 
133
                    revno = "merge"
157
134
            except NoSuchRevision:
158
135
                revision = NoneRevision(rev_id)
159
136
                revno = "?"
162
139
 
163
140
    def _set_oldest_newest(self):
164
141
        rev_dates = map(lambda i: self.revisions[i].timestamp, self.revisions)
165
 
        if len(rev_dates) == 0:
166
 
            return
167
142
        oldest = min(rev_dates)
168
143
        newest = max(rev_dates)
169
144
 
189
164
 
190
165
    def _show_log(self, w):
191
166
        (path, col) = self.annoview.get_cursor()
192
 
        if path is None:
193
 
            return
194
167
        rev_id = self.annomodel[path][REVISION_ID_COL]
195
168
        self.logview.set_revision(self.revisions[rev_id])
196
169
 
207
180
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
208
181
        sw.set_shadow_type(gtk.SHADOW_IN)
209
182
        sw.add(self.annoview)
210
 
        self.annoview.gwindow = self
211
183
        sw.show()
212
184
        
213
185
        self.pane = pane = gtk.VPaned()
224
196
 
225
197
        self.add(vbox)
226
198
 
227
 
    def row_diff(self, tv, path, tvc):
228
 
        row = path[0]
229
 
        revision = self.annotations[row]
230
 
        repository = self.branch.repository
231
 
        tree1 = repository.revision_tree(revision.revision_id)
232
 
        if len(revision.parent_ids) > 0:
233
 
            tree2 = repository.revision_tree(revision.parent_ids[0])
234
 
        else:
235
 
            tree2 = repository.revision_tree(NULL_REVISION)
236
 
        from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
237
 
        window = DiffWindow()
238
 
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
239
 
        window.set_file(tree1.id2path(self.file_id))
240
 
        window.show()
241
 
 
242
 
 
243
199
    def _create_annotate_view(self):
244
200
        tv = gtk.TreeView()
245
201
        tv.set_rules_hint(False)
246
202
        tv.connect("cursor-changed", self._show_log)
247
203
        tv.show()
248
 
        tv.connect("row-activated", self.row_diff)
249
204
 
250
205
        cell = gtk.CellRendererText()
251
206
        cell.set_property("xalign", 1.0)