~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/revision_ui.py

  • Committer: Matt Nordhoff
  • Date: 2010-05-05 19:03:40 UTC
  • Revision ID: mnordhoff@mattnordhoff.com-20100505190340-szon1h02xlwn6dzl
Fix bad redirect when visiting "/download" or "/download/". (#247992)

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
18
#
19
19
 
20
 
import datetime
21
 
import logging
22
 
import os
23
 
import textwrap
24
 
import time
 
20
try:
 
21
    import simplejson
 
22
except ImportError:
 
23
    import json as simplejson
 
24
import urllib
25
25
 
26
 
import turbogears
27
 
from cherrypy import HTTPRedirect, session
 
26
from paste.httpexceptions import HTTPServerError
28
27
 
29
28
from loggerhead import util
30
 
 
31
 
 
32
 
class RevisionUI (object):
33
 
 
34
 
    def __init__(self, branch):
35
 
        # BranchView object
36
 
        self._branch = branch
37
 
        self.log = branch.log
38
 
 
39
 
    @turbogears.expose(html='loggerhead.templates.revision')
40
 
    def default(self, *args, **kw):
41
 
        z = time.time()
42
 
        h = self._branch.get_history()
43
 
        
44
 
        if len(args) > 0:
45
 
            revid = h.fix_revid(args[0])
46
 
        else:
47
 
            revid = None
48
 
        
49
 
        file_id = kw.get('file_id', None)
50
 
        start_revid = h.fix_revid(kw.get('start_revid', None))
51
 
        query = kw.get('q', None)
52
 
        
 
29
from loggerhead.controllers import TemplatedBranchView
 
30
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
 
31
 
 
32
 
 
33
DEFAULT_LINE_COUNT_LIMIT = 3000
 
34
 
 
35
def dq(p):
 
36
    return urllib.quote(urllib.quote(p, safe=''))
 
37
 
 
38
 
 
39
class RevisionUI(TemplatedBranchView):
 
40
 
 
41
    template_path = 'loggerhead.templates.revision'
 
42
 
 
43
    def get_values(self, path, kwargs, headers):
 
44
        h = self._history
 
45
        revid = self.get_revid()
 
46
 
 
47
        filter_file_id = kwargs.get('filter_file_id', None)
 
48
        start_revid = h.fix_revid(kwargs.get('start_revid', None))
 
49
        query = kwargs.get('q', None)
 
50
        remember = h.fix_revid(kwargs.get('remember', None))
 
51
        compare_revid = h.fix_revid(kwargs.get('compare_revid', None))
 
52
 
53
53
        try:
54
 
            revid, start_revid, revid_list = h.get_view(revid, start_revid, file_id, query)
55
 
        except Exception, x:
56
 
            self.log.error('Exception fetching changes: %s' % (x,))
57
 
            util.log_exception(self.log)
58
 
            raise HTTPRedirect(self._branch.url('/changes'))
59
 
        
60
 
        navigation = util.Container(revid_list=revid_list, revid=revid, start_revid=start_revid, file_id=file_id,
61
 
                                    pagesize=1, scan_url='/revision', feed=True)
 
54
            revid, start_revid, revid_list = h.get_view(revid,
 
55
                                                        start_revid,
 
56
                                                        filter_file_id,
 
57
                                                        query)
 
58
        except:
 
59
            self.log.exception('Exception fetching changes')
 
60
            raise HTTPServerError('Could not fetch changes')
 
61
 
 
62
        navigation = util.Container(
 
63
            revid_list=revid_list, revid=revid, start_revid=start_revid,
 
64
            filter_file_id=filter_file_id, pagesize=1,
 
65
            scan_url='/revision', branch=self._branch, feed=True, history=h)
62
66
        if query is not None:
63
67
            navigation.query = query
64
 
        util.fill_in_navigation(h, navigation)
65
 
 
66
 
        change = h.get_changes([ revid ], get_diffs=True)[0]
67
 
        # add parent & merge-point branch-nick info, in case it's useful
68
 
        h.get_branch_nicks([ change ])
69
 
        
70
 
        vals = {
 
68
        util.fill_in_navigation(navigation)
 
69
 
 
70
        change = h.get_changes([revid])[0]
 
71
 
 
72
        if compare_revid is None:
 
73
            file_changes = h.get_file_changes(change)
 
74
        else:
 
75
            file_changes = h.file_changes_for_revision_ids(
 
76
                compare_revid, change.revid)
 
77
 
 
78
        if path in ('', '/'):
 
79
            path = None
 
80
 
 
81
        link_data = {}
 
82
        path_to_id = {}
 
83
        if path:
 
84
            item = [x for x in file_changes.text_changes if x.filename == path][0]
 
85
            diff_chunks = diff_chunks_for_file(
 
86
                self._history._branch.repository, item.file_id,
 
87
                item.old_revision, item.new_revision)
 
88
        else:
 
89
            diff_chunks = None
 
90
            for i, item in enumerate(file_changes.text_changes):
 
91
                item.index = i
 
92
                link_data['diff-' + str(i)] = '%s/%s/%s' % (
 
93
                    dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
 
94
                path_to_id[item.filename] = 'diff-' + str(i)
 
95
 
 
96
        h.add_branch_nicks(change)
 
97
 
 
98
        if '.' in change.revno:
 
99
            # Walk "up" though the merge-sorted graph until we find a
 
100
            # revision with merge depth 0: this is the revision that merged
 
101
            # this one to mainline.
 
102
            ri = self._history._rev_info
 
103
            i = self._history._rev_indices[change.revid]
 
104
            while ri[i][0][2] > 0:
 
105
                i -= 1
 
106
            merged_in = ri[i][0][3]
 
107
        else:
 
108
            merged_in = None
 
109
 
 
110
        # Directory Breadcrumbs
 
111
        directory_breadcrumbs = (
 
112
            util.directory_breadcrumbs(
 
113
                self._branch.friendly_name,
 
114
                self._branch.is_root,
 
115
                'changes'))
 
116
 
 
117
        return {
71
118
            'branch': self._branch,
72
119
            'revid': revid,
73
120
            'change': change,
 
121
            'file_changes': file_changes,
 
122
            'diff_chunks': diff_chunks,
 
123
            'link_data': simplejson.dumps(link_data),
 
124
            'specific_path': path,
 
125
            'json_specific_path': simplejson.dumps(path),
 
126
            'path_to_id': simplejson.dumps(path_to_id),
74
127
            'start_revid': start_revid,
75
 
            'file_id': file_id,
 
128
            'filter_file_id': filter_file_id,
76
129
            'util': util,
77
130
            'history': h,
 
131
            'merged_in': merged_in,
78
132
            'navigation': navigation,
79
133
            'query': query,
 
134
            'remember': remember,
 
135
            'compare_revid': compare_revid,
 
136
            'url': self._branch.context_url,
 
137
            'directory_breadcrumbs': directory_breadcrumbs,
80
138
        }
81
 
        h.flush_cache()
82
 
        self.log.info('/revision: %r seconds' % (time.time() - z,))
83
 
        return vals