~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/revision_ui.py

[rs=mwhudson][release-critical=Rinchen] update to loggerhead trunk,
        mainly to get the code to not hold branches open the whole time but
        also getting some other improvements

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 simplejson
21
 
import urllib
22
 
 
23
20
from paste.httpexceptions import HTTPServerError
24
21
 
25
22
from loggerhead import util
26
23
from loggerhead.controllers import TemplatedBranchView
27
 
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
28
24
 
29
25
 
30
26
DEFAULT_LINE_COUNT_LIMIT = 3000
31
27
 
32
 
def dq(p):
33
 
    return urllib.quote(urllib.quote(p, safe=''))
34
 
 
35
28
 
36
29
class RevisionUI(TemplatedBranchView):
37
30
 
38
31
    template_path = 'loggerhead.templates.revision'
39
 
    supports_json = True
40
 
 
41
 
    def get_values(self, path, kwargs, headers):
42
 
        h = self._history
43
 
        revid = self.get_revid()
44
 
 
45
 
        filter_file_id = kwargs.get('filter_file_id', None)
46
 
        start_revid = h.fix_revid(kwargs.get('start_revid', None))
47
 
        query = kwargs.get('q', None)
48
 
        compare_revid = h.fix_revid(kwargs.get('compare_revid', None))
49
 
 
50
 
        # TODO: This try/except looks to date before real exception handling
51
 
        # and should be removed
 
32
 
 
33
    def get_values(self, h, args, kw, headers):
 
34
 
 
35
        if len(args) > 0:
 
36
            revid = h.fix_revid(args[0])
 
37
        else:
 
38
            revid = None
 
39
 
 
40
        filter_file_id = kw.get('filter_file_id', None)
 
41
        start_revid = h.fix_revid(kw.get('start_revid', None))
 
42
        query = kw.get('q', None)
 
43
        remember = h.fix_revid(kw.get('remember', None))
 
44
        compare_revid = h.fix_revid(kw.get('compare_revid', None))
 
45
 
52
46
        try:
53
 
            revid, start_revid, revid_list = h.get_view(revid,
54
 
                                                        start_revid,
55
 
                                                        filter_file_id,
56
 
                                                        query)
 
47
            revid, start_revid, revid_list = h.get_view(revid, start_revid, filter_file_id, query)
57
48
        except:
58
49
            self.log.exception('Exception fetching changes')
59
50
            raise HTTPServerError('Could not fetch changes')
60
 
        # XXX: Some concern about namespace collisions. These are only stored
61
 
        # here so they can be expanded into the template later. Should probably
62
 
        # be stored in a specific dict/etc.
63
 
        self.revid_list = revid_list
64
 
        self.compare_revid = compare_revid
65
 
        self.path = path
66
 
        kwargs['start_revid'] = start_revid
67
 
 
68
 
        change = h.get_changes([revid])[0]
69
 
 
70
 
        if compare_revid is None:
71
 
            file_changes = h.get_file_changes(change)
72
 
        else:
73
 
            file_changes = h.file_changes_for_revision_ids(
74
 
                compare_revid, change.revid)
75
 
 
76
 
        h.add_branch_nicks(change)
77
 
 
78
 
        if '.' in change.revno:
79
 
            # Walk "up" though the merge-sorted graph until we find a
80
 
            # revision with merge depth 0: this is the revision that merged
81
 
            # this one to mainline.
82
 
            ri = self._history._rev_info
83
 
            i = self._history._rev_indices[change.revid]
84
 
            while ri[i][0][2] > 0:
85
 
                i -= 1
86
 
            merged_in = ri[i][0][3]
87
 
        else:
88
 
            merged_in = None
89
 
 
90
 
        return {
91
 
            'revid': revid,
92
 
            'change': change,
93
 
            'file_changes': file_changes,
94
 
            'merged_in': merged_in,
95
 
        }
96
 
 
97
 
    def add_template_values(self, values):
98
 
        super(RevisionUI, self).add_template_values(values)
99
 
        remember = self._history.fix_revid(self.kwargs.get('remember', None))
100
 
        query = self.kwargs.get('q', None)
101
 
        filter_file_id = self.kwargs.get('filter_file_id', None)
102
 
        start_revid = self.kwargs['start_revid']
 
51
 
103
52
        navigation = util.Container(
104
 
            revid_list=self.revid_list, revid=values['revid'],
105
 
            start_revid=start_revid,
 
53
            revid_list=revid_list, revid=revid, start_revid=start_revid,
106
54
            filter_file_id=filter_file_id, pagesize=1,
107
 
            scan_url='/revision', branch=self._branch, feed=True,
108
 
            history=self._history)
 
55
            scan_url='/revision', branch=self._branch, feed=True, history=h)
109
56
        if query is not None:
110
57
            navigation.query = query
111
58
        util.fill_in_navigation(navigation)
112
 
        path = self.path
113
 
        if path in ('', '/'):
114
 
            path = None
115
 
 
116
 
 
117
 
        file_changes = values['file_changes']
118
 
        link_data = {}
119
 
        path_to_id = {}
120
 
        if path:
121
 
            items = [x for x in file_changes.text_changes if x.filename == path]
122
 
            if len(items) > 0:
123
 
                item = items[0]
124
 
                diff_chunks = diff_chunks_for_file(
125
 
                    self._history._branch.repository, item.file_id,
126
 
                    item.old_revision, item.new_revision)
127
 
            else:
128
 
                diff_chunks = None
129
 
        else:
130
 
            diff_chunks = None
131
 
            for i, item in enumerate(file_changes.text_changes):
132
 
                item.index = i
133
 
                link_data['diff-' + str(i)] = '%s/%s/%s' % (
134
 
                    dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
135
 
                path_to_id[item.filename] = 'diff-' + str(i)
136
 
 
137
 
        # Directory Breadcrumbs
138
 
        directory_breadcrumbs = (
139
 
            util.directory_breadcrumbs(
140
 
                self._branch.friendly_name,
141
 
                self._branch.is_root,
142
 
                'changes'))
143
 
 
144
 
        values.update({
145
 
            'history': self._history,
146
 
            'link_data': simplejson.dumps(link_data),
147
 
            'json_specific_path': simplejson.dumps(path),
148
 
            'path_to_id': simplejson.dumps(path_to_id),
149
 
            'directory_breadcrumbs': directory_breadcrumbs,
 
59
 
 
60
        change = h.get_change_with_diff(revid, compare_revid)
 
61
        # add parent & merge-point branch-nick info, in case it's useful
 
62
        h.get_branch_nicks([ change ])
 
63
 
 
64
        line_count_limit = DEFAULT_LINE_COUNT_LIMIT
 
65
        line_count = 0
 
66
        for file in change.changes.modified:
 
67
            for chunk in file.chunks:
 
68
                line_count += len(chunk.diff)
 
69
 
 
70
        # let's make side-by-side diff be the default
 
71
        side_by_side = not kw.get('unified', False)
 
72
        if side_by_side:
 
73
            h.add_side_by_side([ change ])
 
74
 
 
75
        return {
 
76
            'branch': self._branch,
 
77
            'revid': revid,
 
78
            'change': change,
 
79
            'start_revid': start_revid,
 
80
            'filter_file_id': filter_file_id,
 
81
            'util': util,
 
82
            'history': h,
150
83
            'navigation': navigation,
 
84
            'query': query,
151
85
            'remember': remember,
152
 
            'compare_revid': self.compare_revid,
153
 
            'filter_file_id': filter_file_id,
154
 
            'diff_chunks': diff_chunks,
155
 
            'query': query,
156
 
            'specific_path': path,
157
 
            'start_revid': start_revid,
158
 
        })
 
86
            'compare_revid': compare_revid,
 
87
            'side_by_side': side_by_side,
 
88
            'url': self._branch.context_url,
 
89
            'line_count': line_count,
 
90
            'line_count_limit': line_count_limit,
 
91
            'show_plain_diffs': line_count > line_count_limit,
 
92
        }