Merge lp:~mwhudson/loggerhead/sorry-rob into lp:~mwhudson/loggerhead/iter_changes-forevar

Proposed by Michael Hudson-Doyle
Status: Merged
Merge reported by: Michael Hudson-Doyle
Merged at revision: not available
Proposed branch: lp:~mwhudson/loggerhead/sorry-rob
Merge into: lp:~mwhudson/loggerhead/iter_changes-forevar
Diff against target: None lines
To merge this branch: bzr merge lp:~mwhudson/loggerhead/sorry-rob
Reviewer Review Type Date Requested Status
Martin Albisetti (community) Approve
Michael Hudson-Doyle Pending
Review via email: mp+4648@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Michael Hudson-Doyle (mwhudson) wrote :

Hi gentle reviewer,

This branch, which depends on the iter_changes-forevar branch, contorts
slightly to avoid loading inventories on the +filediff page fragments,
which and then contorts some more so that all the inventory information
needed to render a revision page comparing against its parent is stored
in the filechange cache. On a wide tree like launchpad this means
revision and +filediff pages load about 10x faster once the cache is
populated.

Cheers,
mwh

lp:~mwhudson/loggerhead/sorry-rob updated
314. By Michael Hudson-Doyle

remove debugging print

315. By Michael Hudson-Doyle

work for the initial revision

316. By Michael Hudson-Doyle

merge trunk

Revision history for this message
Martin Albisetti (beuno) wrote :

Looks good, just kill the extra import for bzrlib.errors, and you're set to merge!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'loggerhead/controllers/filediff_ui.py'
2--- loggerhead/controllers/filediff_ui.py 2009-03-17 06:43:34 +0000
3+++ loggerhead/controllers/filediff_ui.py 2009-03-19 02:39:59 +0000
4@@ -3,6 +3,7 @@
5
6 from bzrlib import diff
7 from bzrlib import errors
8+from bzrlib import osutils
9
10 from loggerhead import util
11 from loggerhead.controllers import TemplatedBranchView
12@@ -52,25 +53,24 @@
13 return chunks
14
15
16-def diff_chunks_for_file(file_id, old_tree, new_tree):
17- try:
18- old_lines = old_tree.get_file_lines(file_id)
19- except errors.NoSuchId:
20- old_lines = []
21- try:
22- new_lines = new_tree.get_file_lines(file_id)
23- except errors.NoSuchId:
24- new_lines = []
25+def diff_chunks_for_file(repository, file_id, compare_revid, revid):
26+ lines = {}
27+ args = []
28+ for r in (compare_revid, revid):
29+ if r == 'null:':
30+ lines[r] = []
31+ else:
32+ args.append((file_id, r, r))
33+ for r, bytes_iter in repository.iter_files_bytes(args):
34+ lines[r] = osutils.split_lines(bytes_iter)
35+ print lines.keys()
36 buffer = StringIO()
37- if old_lines != new_lines:
38- try:
39- diff.internal_diff('', old_lines, '', new_lines, buffer)
40- except errors.BinaryFile:
41- difftext = ''
42- else:
43- difftext = buffer.getvalue()
44+ try:
45+ diff.internal_diff('', lines[compare_revid], '', lines[revid], buffer)
46+ except errors.BinaryFile:
47+ difftext = ''
48 else:
49- difftext = ''
50+ difftext = buffer.getvalue()
51
52 return _process_diff(difftext)
53
54@@ -87,9 +87,8 @@
55 file_id = urllib.unquote(self.args[2])
56
57 repository = self._history._branch.repository
58- old_tree, new_tree = repository.revision_trees([compare_revid, revid])
59-
60- chunks = diff_chunks_for_file(file_id, old_tree, new_tree)
61+ chunks = diff_chunks_for_file(
62+ self._history._branch.repository, file_id, compare_revid, revid)
63
64 return {
65 'util': util,
66
67=== modified file 'loggerhead/controllers/revision_ui.py'
68--- loggerhead/controllers/revision_ui.py 2009-03-19 00:44:05 +0000
69+++ loggerhead/controllers/revision_ui.py 2009-03-19 03:06:42 +0000
70@@ -23,6 +23,8 @@
71 import json as simplejson
72 import urllib
73
74+from bzrlib import errors
75+
76 from paste.httpexceptions import HTTPServerError
77
78 from loggerhead import util
79@@ -70,32 +72,27 @@
80 change = h.get_changes([revid])[0]
81
82 if compare_revid is None:
83- if change.parents:
84- cr = change.parents[0].revid
85- else:
86- cr = 'null:'
87+ file_changes = h.get_file_changes(change)
88 else:
89- cr = compare_revid
90+ file_changes = h.file_changes_for_revision_ids(
91+ compare_revid, change.revid)
92
93 if path in ('', '/'):
94 path = None
95
96- old_tree = h._branch.repository.revision_tree(cr)
97- new_tree = h._branch.repository.revision_tree(change.revid)
98- file_changes = h.file_changes_from_revision_trees(
99- old_tree, new_tree)
100-
101 link_data = {}
102 path_to_id = {}
103 if path:
104+ item = [x for x in file_changes.text_changes if x.filename == path][0]
105 diff_chunks = diff_chunks_for_file(
106- new_tree.path2id(path), old_tree, new_tree)
107+ self._history._branch.repository, item.file_id,
108+ item.old_revision, item.new_revision)
109 else:
110 diff_chunks = None
111 for i, item in enumerate(file_changes.text_changes):
112 item.index = i
113 link_data['diff-' + str(i)] = '%s/%s/%s' % (
114- dq(revid), dq(cr), dq(item.file_id))
115+ dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
116 path_to_id[item.filename] = 'diff-' + str(i)
117
118 h.add_branch_nicks(change)
119
120=== modified file 'loggerhead/history.py'
121--- loggerhead/history.py 2009-03-19 03:12:58 +0000
122+++ loggerhead/history.py 2009-03-19 03:13:32 +0000
123@@ -131,18 +131,29 @@
124 return len(self.revid_list)
125
126 class FileChangeReporter(object):
127- def __init__(self):
128+ def __init__(self, old_inv, new_inv):
129 self.added = []
130 self.modified = []
131 self.renamed = []
132 self.removed = []
133 self.text_changes = []
134+ self.old_inv = old_inv
135+ self.new_inv = new_inv
136+
137+ def revid(self, inv, file_id):
138+ try:
139+ return inv[file_id].revision
140+ except bzrlib.errors.NoSuchId:
141+ return 'null:'
142+
143 def report(self, file_id, paths, versioned, renamed, modified,
144 exe_change, kind):
145 if modified not in ('unchanged', 'kind changed'):
146 self.text_changes.append(util.Container(
147 filename=rich_filename(paths[1], kind[0]),
148- file_id=file_id))
149+ file_id=file_id,
150+ old_revision=self.revid(self.old_inv, file_id),
151+ new_revision=self.revid(self.new_inv, file_id)))
152 if versioned == 'added':
153 self.added.append(util.Container(
154 filename=rich_filename(paths[1], kind),
155@@ -588,11 +599,10 @@
156 def get_file_changes_uncached(self, entry):
157 repo = self._branch.repository
158 if entry.parents:
159- old_tree = repo.revision_tree(entry.parents[0].revid)
160+ old_revid = entry.parents[0].revid
161 else:
162- old_tree = repo.revision_tree(bzrlib.revision.NULL_REVISION)
163- new_tree = repo.revision_tree(entry.revid)
164- return self.file_changes_from_revision_trees(old_tree, new_tree)
165+ old_revid = bzrlib.revision.NULL_REVISION
166+ return self.file_changes_for_revision_ids(old_revid, entry.revid)
167
168 def get_file_changes(self, entry):
169 if self._file_change_cache is None:
170@@ -614,7 +624,7 @@
171 path = '/' + path
172 return path, inv_entry.name, rev_tree.get_file_text(file_id)
173
174- def file_changes_from_revision_trees(self, old_tree, new_tree):
175+ def file_changes_for_revision_ids(self, old_revid, new_revid):
176 """
177 Return a nested data structure containing the changes in a delta::
178
179@@ -627,7 +637,10 @@
180 ),
181 text_changes: list((filename, file_id)),
182 """
183- reporter = FileChangeReporter()
184+ old_tree, new_tree = self._branch.repository.revision_trees(
185+ [old_revid, new_revid])
186+
187+ reporter = FileChangeReporter(old_tree.inventory, new_tree.inventory)
188
189 bzrlib.delta.report_changes(new_tree.iter_changes(old_tree), reporter)
190

Subscribers

People subscribed via source and target branches

to all changes: