~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/diff_ui.py

  • Committer: Robey Pointer
  • Date: 2007-01-21 00:05:52 UTC
  • Revision ID: robey@lag.net-20070121000552-laswr1ffqh030uge
big checkpoint commit.  added some functions to util for tracking browsing
context (those key=value params to urls) since there are already a few and
now i'm adding some more: 'remember' and 'compare_revid'.

'remember' is a remembered revision_id that gets carried around if you click
on a "compare this revision to another revision" link on the revision page.
afterwards, whenever you're on a revision page, you can click "compare to
revision [x]" and it will switch 'remember' to 'compare_revid' and show the
revision page with a diff as compared to the remembered revision.  this is
to allow arbitrary diffs.  i'm not sure the ui is great, though.

bundle is also hooked up this way, so you can download an arbitrary bundle.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008  Canonical Ltd.
2
 
#                     (Authored by Martin Albisetti <argentina@gmail.com>)
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
#
18
 
 
19
 
from cStringIO import StringIO
20
 
import logging
21
 
import time
22
 
 
23
 
from paste.request import path_info_pop
24
 
 
25
 
from bzrlib.diff import show_diff_trees
26
 
 
27
 
from loggerhead.controllers import TemplatedBranchView
28
 
 
29
 
log = logging.getLogger("loggerhead.controllers")
30
 
 
31
 
 
32
 
class DiffUI(TemplatedBranchView):
33
 
    """Class to output a diff for a single file or revisions."""
34
 
 
35
 
    def __call__(self, environ, start_response):
36
 
        # /diff/<rev_id>/<rev_id>
37
 
        """Default method called from /diff URL."""
38
 
        z = time.time()
39
 
 
40
 
        args = []
41
 
        while True:
42
 
            arg = path_info_pop(environ)
43
 
            if arg is None:
44
 
                break
45
 
            args.append(arg)
46
 
 
47
 
        revid_from = args[0]
48
 
        # Convert a revno to a revid if we get a revno
49
 
        revid_from = self._history.fix_revid(revid_from)
50
 
        change = self._history.get_changes([revid_from])[0]
51
 
 
52
 
        if len(args) is 2:
53
 
            revid_to = self._history.fix_revid(args[1])
54
 
        else:
55
 
            revid_to = change.parents[0].revid
56
 
 
57
 
        repo = self._branch.branch.repository
58
 
        revtree1 = repo.revision_tree(revid_to)
59
 
        revtree2 = repo.revision_tree(revid_from)
60
 
 
61
 
        diff_content_stream = StringIO()
62
 
        show_diff_trees(revtree1, revtree2, diff_content_stream,
63
 
                        old_label='', new_label='')
64
 
 
65
 
        content = diff_content_stream.getvalue()
66
 
 
67
 
        self.log.info('/diff %r:%r in %r secs' % (revid_from, revid_to,
68
 
                                                  time.time() - z))
69
 
 
70
 
        revno1 = self._history.get_revno(revid_from)
71
 
        revno2 = self._history.get_revno(revid_to)
72
 
        filename = '%s_%s.diff' % (revno1, revno2)
73
 
        headers = [
74
 
            ('Content-Type', 'application/octet-stream'),
75
 
            ('Content-Length', str(len(content))),
76
 
            ('Content-Disposition', 'attachment; filename=%s' % (filename,)),
77
 
            ]
78
 
        start_response('200 OK', headers)
79
 
        return [content]