~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/diff_ui.py

  • Committer: Robert Collins
  • Date: 2012-02-02 05:07:53 UTC
  • mfrom: (464.1.1 mod-wsgi)
  • Revision ID: robertc@robertcollins.net-20120202050753-2d8f8r6m24lglbz5
    - Add a script and documentation for running under mod_wsgi.
      (Stuart Colville, Toshio Kuratomi)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008  Canonical Ltd.
 
1
# Copyright (C) 2008-2011 Canonical Ltd.
2
2
#                     (Authored by Martin Albisetti <argentina@gmail.com>)
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
17
17
#
18
18
 
19
19
from cStringIO import StringIO
20
 
import logging
21
20
import time
22
 
import sys
23
21
 
24
 
from paste import httpexceptions
25
22
from paste.request import path_info_pop
26
23
 
27
 
from loggerhead import history
28
 
from loggerhead import util
29
 
from loggerhead.templatefunctions import templatefunctions
30
 
 
31
 
import bzrlib
32
 
from bzrlib import branch
33
24
from bzrlib.diff import show_diff_trees
34
 
 
35
 
 
36
 
log = logging.getLogger("loggerhead.controllers")
37
 
 
38
 
class DiffUI(object):
39
 
    """
40
 
 
41
 
    Class to output a diff for a single file or revisions.
42
 
    """
43
 
    
44
 
    def __init__(self, branch, history):
45
 
        self._branch = branch
46
 
        self._history = history
47
 
        self.log = history.log
48
 
 
49
 
    
 
25
from bzrlib.revision import NULL_REVISION
 
26
 
 
27
from loggerhead.controllers import TemplatedBranchView
 
28
 
 
29
 
 
30
class DiffUI(TemplatedBranchView):
 
31
    """Class to output a diff for a single file or revisions."""
 
32
 
50
33
    def __call__(self, environ, start_response):
51
34
        # /diff/<rev_id>/<rev_id>
52
 
        """
53
 
        Default method called from /diff URL.
54
 
        """
55
 
 
 
35
        """Default method called from /diff URL."""
56
36
        z = time.time()
57
 
        
 
37
 
58
38
        args = []
59
 
        while 1:
 
39
        while True:
60
40
            arg = path_info_pop(environ)
61
41
            if arg is None:
62
42
                break
67
47
        revid_from = self._history.fix_revid(revid_from)
68
48
        change = self._history.get_changes([revid_from])[0]
69
49
 
70
 
        if len(args) is 2:
 
50
        if len(args) == 2:
71
51
            revid_to = self._history.fix_revid(args[1])
 
52
        elif len(change.parents) == 0:
 
53
            revid_to = NULL_REVISION
72
54
        else:
73
 
            revid_to = change.parents[0].revid 
74
 
 
 
55
            revid_to = change.parents[0].revid
75
56
 
76
57
        repo = self._branch.branch.repository
77
 
        revtree1 = repo.revision_tree(revid_from)
78
 
        revtree2 = repo.revision_tree(revid_to)
79
 
        
 
58
        revtree1 = repo.revision_tree(revid_to)
 
59
        revtree2 = repo.revision_tree(revid_from)
 
60
 
80
61
        diff_content_stream = StringIO()
81
 
        show_diff_trees(revtree1, revtree2, diff_content_stream, 
 
62
        show_diff_trees(revtree1, revtree2, diff_content_stream,
82
63
                        old_label='', new_label='')
83
64
 
84
65
        content = diff_content_stream.getvalue()
85
66
 
86
 
        self.log.info('/diff %r:%r in %r secs' % (revid_from, revid_to, 
 
67
        self.log.info('/diff %r:%r in %r secs' % (revid_from, revid_to,
87
68
                                                  time.time() - z))
88
69
 
89
70
        revno1 = self._history.get_revno(revid_from)
91
72
        filename = '%s_%s.diff' % (revno1, revno2)
92
73
        headers = [
93
74
            ('Content-Type', 'application/octet-stream'),
94
 
            ('Content-Length', len(content)),
95
 
            ('Content-Disposition', 'attachment; filename=%s'%(filename,)),
 
75
            ('Content-Length', str(len(content))),
 
76
            ('Content-Disposition', 'attachment; filename=%s' % (filename,)),
96
77
            ]
97
78
        start_response('200 OK', headers)
98
79
        return [content]
99