/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: Aaron Bentley
  • Date: 2007-01-17 06:42:55 UTC
  • mto: This revision was merged to the branch mainline in revision 129.
  • Revision ID: aaron.bentley@utoronto.ca-20070117064255-x4gznz5e0lyjq3gk
Remove usused span selector

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
25
26
from bzrlib.errors import NoSuchRevision
26
 
from bzrlib.revision import NULL_REVISION
 
27
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
27
28
 
28
29
from colormap import AnnotateColorMap, AnnotateColorSaturation
29
30
from logview import LogView
54
55
 
55
56
        self._create()
56
57
 
57
 
        if self.plain:
58
 
            self.span_selector.hide()
59
 
 
60
 
    def annotate(self, branch, file_id):
 
58
    def annotate(self, tree, branch, file_id):
61
59
        self.revisions = {}
62
60
        self.annotations = []
63
61
        self.branch = branch
 
62
        self.tree = tree
64
63
        self.file_id = file_id
 
64
        self.revision_id = getattr(tree, 'get_revision_id', 
 
65
                                   lambda: CURRENT_REVISION)()
65
66
        
66
67
        # [revision id, line number, committer, revno, highlight color, line]
67
68
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
76
77
            branch.lock_read()
77
78
            branch.repository.lock_read()
78
79
            for line_no, (revision, revno, line)\
79
 
                    in enumerate(self._annotate(branch, file_id)):
 
80
                    in enumerate(self._annotate(tree, file_id)):
80
81
                if revision.revision_id == last_seen and not self.all:
81
82
                    revno = committer = ""
82
83
                else:
97
98
 
98
99
            if not self.plain:
99
100
                self._set_oldest_newest()
100
 
                # Recall that calling activate_default will emit "span-changed",
101
 
                # so self._span_changed_cb will take care of initial highlighting
102
 
                self.span_selector.activate_default()
 
101
                now = time.time()
 
102
                self.annomodel.foreach(self._highlight_annotation, now)
103
103
        finally:
104
104
            branch.repository.unlock()
105
105
            branch.unlock()
121
121
        self.annoview.set_cursor(row)
122
122
        self.annoview.scroll_to_cell(row, use_align=True)
123
123
 
124
 
    def _annotate(self, branch, file_id):
125
 
        rev_hist = branch.revision_history()
126
 
        repository = branch.repository
127
 
        rev_tree = repository.revision_tree(branch.last_revision())
128
 
        rev_id = rev_tree.inventory[file_id].revision
129
 
        weave = repository.weave_store.get_weave(file_id,
130
 
                                                 branch.get_transaction())
 
124
    def _dotted_revnos(self, repository, revision_id):
 
125
        """Return a dict of revision_id -> dotted revno
131
126
        
 
127
        :param repository: The repository to get the graph from
 
128
        :param revision_id: The last revision for which this info is needed
 
129
        """
 
130
        graph = repository.get_revision_graph(revision_id)
 
131
        dotted = {}
 
132
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
 
133
            revision_id, generate_revno=True):
 
134
            dotted[revision_id] = '.'.join(str(num) for num in revno)
 
135
        return dotted
 
136
 
 
137
    def _annotate(self, tree, file_id):
 
138
        current_revision = FakeRevision(CURRENT_REVISION)
 
139
        current_revision.committer = self.branch.get_config().username()
 
140
        current_revision.timestamp = time.time()
 
141
        current_revision.message = '[Not yet committed]'
 
142
        current_revno = '%d?' % (self.branch.revno() + 1)
 
143
        repository = self.branch.repository
 
144
        if self.revision_id == CURRENT_REVISION:
 
145
            revision_id = self.branch.last_revision()
 
146
        else:
 
147
            revision_id = self.revision_id
 
148
        dotted = self._dotted_revnos(repository, revision_id)
132
149
        revision_cache = RevisionCache(repository)
133
 
        for origin, text in weave.annotate_iter(rev_id):
 
150
        for origin, text in tree.annotate_iter(file_id):
134
151
            rev_id = origin
135
152
            try:
136
153
                revision = revision_cache.get_revision(rev_id)
137
 
                if rev_id in rev_hist:
138
 
                    revno = branch.revision_id_to_revno(rev_id)
139
 
                else:
140
 
                    revno = "merge"
 
154
                revno = dotted.get(rev_id, 'merge')
 
155
                if len(revno) > 15:
 
156
                    revno = 'merge'
141
157
            except NoSuchRevision:
142
 
                revision = NoneRevision(rev_id)
143
 
                revno = "?"
 
158
                committer = "?"
 
159
                if rev_id == CURRENT_REVISION:
 
160
                    revision = current_revision
 
161
                    revno = current_revno
 
162
                else:
 
163
                    revision = FakeRevision(rev_id)
 
164
                    revno = "?"
144
165
 
145
166
            yield revision, revno, text
146
167
 
151
172
        oldest = min(rev_dates)
152
173
        newest = max(rev_dates)
153
174
 
154
 
        span = self._span_from_seconds(time.time() - oldest)
155
 
        self.span_selector.set_to_oldest_span(span)
156
 
        
157
 
        span = self._span_from_seconds(newest - oldest)
158
 
        self.span_selector.set_newest_to_oldest_span(span)
159
 
 
160
 
    def _span_from_seconds(self, seconds):
161
 
        return (seconds / (24 * 60 * 60))
162
 
    
163
 
    def _span_changed_cb(self, w, span):
164
 
        self.annotate_colormap.set_span(span)
165
 
        now = time.time()
166
 
        self.annomodel.foreach(self._highlight_annotation, now)
167
 
 
168
175
    def _highlight_annotation(self, model, path, iter, now):
169
176
        revision_id, = model.get(iter, REVISION_ID_COL)
170
177
        revision = self.revisions[revision_id]
181
188
    def _create(self):
182
189
        self.logview = self._create_log_view()
183
190
        self.annoview = self._create_annotate_view()
184
 
        self.span_selector = self._create_span_selector()
185
191
 
186
192
        vbox = gtk.VBox(False, 12)
187
193
        vbox.set_border_width(12)
201
207
        vbox.pack_start(pane, expand=True, fill=True)
202
208
        
203
209
        hbox = gtk.HBox(True, 6)
204
 
        hbox.pack_start(self.span_selector, expand=False, fill=True)
205
210
        hbox.pack_start(self._create_button_box(), expand=False, fill=True)
206
211
        hbox.show()
207
212
        vbox.pack_start(hbox, expand=False, fill=True)
212
217
        row = path[0]
213
218
        revision = self.annotations[row]
214
219
        repository = self.branch.repository
215
 
        tree1 = repository.revision_tree(revision.revision_id)
216
 
        if len(revision.parent_ids) > 0:
217
 
            tree2 = repository.revision_tree(revision.parent_ids[0])
 
220
        if revision.revision_id == CURRENT_REVISION:
 
221
            tree1 = self.tree
 
222
            tree2 = self.tree.basis_tree()
218
223
        else:
219
 
            tree2 = repository.revision_tree(NULL_REVISION)
 
224
            tree1 = repository.revision_tree(revision.revision_id)
 
225
            if len(revision.parent_ids) > 0:
 
226
                tree2 = repository.revision_tree(revision.parent_ids[0])
 
227
            else:
 
228
                tree2 = repository.revision_tree(NULL_REVISION)
220
229
        from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
221
230
        window = DiffWindow()
222
231
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
280
289
        
281
290
        return tv
282
291
 
283
 
    def _create_span_selector(self):
284
 
        ss = SpanSelector()
285
 
        ss.connect("span-changed", self._span_changed_cb)
286
 
        ss.show()
287
 
 
288
 
        return ss
289
 
 
290
292
    def _create_log_view(self):
291
293
        lv = LogView()
292
294
        lv.show()
309
311
        return box
310
312
 
311
313
 
312
 
class NoneRevision:
 
314
class FakeRevision:
313
315
    """ A fake revision.
314
316
 
315
317
    For when a revision is referenced but not present.
316
318
    """
317
319
 
318
 
    def __init__(self, revision_id):
 
320
    def __init__(self, revision_id, committer='?'):
319
321
        self.revision_id = revision_id
320
322
        self.parent_ids = []
321
 
        self.committer = "?"
 
323
        self.committer = committer
322
324
        self.message = "?"
323
325
        self.timestamp = 0.0
324
326
        self.timezone = 0