Status: | Merged |
---|---|
Approved by: | Jelmer Vernooij |
Approved revision: | no longer in the source branch. |
Merge reported by: | The Breezy Bot |
Merged at revision: | not available |
Proposed branch: | lp:~jelmer/brz/objects |
Merge into: | lp:brz |
Diff against target: |
369 lines (+133/-82) 5 files modified
breezy/bzr/_dirstate_helpers_pyx.pyx (+6/-4) breezy/bzr/dirstate.py (+57/-52) breezy/bzr/inventorytree.py (+10/-8) breezy/git/tree.py (+5/-4) breezy/tree.py (+55/-14) |
To merge this branch: | bzr merge lp:~jelmer/brz/objects |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Martin Packman | Approve | ||
Review via email: mp+368856@code.launchpad.net |
Commit message
Add a TreeChange object that can serve as alternative to a tuple returned by Tree.iter_changes.
Description of the change
Add a TreeChange object that can serve as alternative to a tuple returned by Tree.iter_changes.
This allows addition of extra fields in the future, and not relying on indexing
but attribute names when accessing iter_changes results.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'breezy/bzr/_dirstate_helpers_pyx.pyx' | |||
2 | --- breezy/bzr/_dirstate_helpers_pyx.pyx 2019-01-27 18:53:46 +0000 | |||
3 | +++ breezy/bzr/_dirstate_helpers_pyx.pyx 2019-06-15 12:02:54 +0000 | |||
4 | @@ -31,6 +31,7 @@ | |||
5 | 31 | from .. import cache_utf8, errors, osutils | 31 | from .. import cache_utf8, errors, osutils |
6 | 32 | from .dirstate import DirState, DirstateCorrupt | 32 | from .dirstate import DirState, DirstateCorrupt |
7 | 33 | from ..osutils import parent_directories, pathjoin, splitpath, is_inside_any, is_inside | 33 | from ..osutils import parent_directories, pathjoin, splitpath, is_inside_any, is_inside |
8 | 34 | from ..tree import TreeChange | ||
9 | 34 | 35 | ||
10 | 35 | 36 | ||
11 | 36 | # This is the Windows equivalent of ENOTDIR | 37 | # This is the Windows equivalent of ENOTDIR |
12 | @@ -1293,7 +1294,7 @@ | |||
13 | 1293 | else: | 1294 | else: |
14 | 1294 | path_u = self.utf8_decode(path)[0] | 1295 | path_u = self.utf8_decode(path)[0] |
15 | 1295 | source_kind = _minikind_to_kind(source_minikind) | 1296 | source_kind = _minikind_to_kind(source_minikind) |
17 | 1296 | return (entry[0][2], | 1297 | return TreeChange(entry[0][2], |
18 | 1297 | (old_path_u, path_u), | 1298 | (old_path_u, path_u), |
19 | 1298 | content_change, | 1299 | content_change, |
20 | 1299 | (True, True), | 1300 | (True, True), |
21 | @@ -1326,7 +1327,7 @@ | |||
22 | 1326 | and S_IXUSR & path_info[3].st_mode) | 1327 | and S_IXUSR & path_info[3].st_mode) |
23 | 1327 | else: | 1328 | else: |
24 | 1328 | target_exec = target_details[3] | 1329 | target_exec = target_details[3] |
26 | 1329 | return (entry[0][2], | 1330 | return TreeChange(entry[0][2], |
27 | 1330 | (None, self.utf8_decode(path)[0]), | 1331 | (None, self.utf8_decode(path)[0]), |
28 | 1331 | True, | 1332 | True, |
29 | 1332 | (False, True), | 1333 | (False, True), |
30 | @@ -1336,7 +1337,7 @@ | |||
31 | 1336 | (None, target_exec)), True | 1337 | (None, target_exec)), True |
32 | 1337 | else: | 1338 | else: |
33 | 1338 | # Its a missing file, report it as such. | 1339 | # Its a missing file, report it as such. |
35 | 1339 | return (entry[0][2], | 1340 | return TreeChange(entry[0][2], |
36 | 1340 | (None, self.utf8_decode(path)[0]), | 1341 | (None, self.utf8_decode(path)[0]), |
37 | 1341 | False, | 1342 | False, |
38 | 1342 | (False, True), | 1343 | (False, True), |
39 | @@ -1354,7 +1355,8 @@ | |||
40 | 1354 | parent_id = self.state._get_entry(self.source_index, path_utf8=entry[0][0])[0][2] | 1355 | parent_id = self.state._get_entry(self.source_index, path_utf8=entry[0][0])[0][2] |
41 | 1355 | if parent_id == entry[0][2]: | 1356 | if parent_id == entry[0][2]: |
42 | 1356 | parent_id = None | 1357 | parent_id = None |
44 | 1357 | return (entry[0][2], | 1358 | return TreeChange( |
45 | 1359 | entry[0][2], | ||
46 | 1358 | (self.utf8_decode(old_path)[0], None), | 1360 | (self.utf8_decode(old_path)[0], None), |
47 | 1359 | True, | 1361 | True, |
48 | 1360 | (True, False), | 1362 | (True, False), |
49 | 1361 | 1363 | ||
50 | === modified file 'breezy/bzr/dirstate.py' | |||
51 | --- breezy/bzr/dirstate.py 2019-03-04 00:16:27 +0000 | |||
52 | +++ breezy/bzr/dirstate.py 2019-06-15 12:02:54 +0000 | |||
53 | @@ -250,6 +250,7 @@ | |||
54 | 250 | viewitems, | 250 | viewitems, |
55 | 251 | viewvalues, | 251 | viewvalues, |
56 | 252 | ) | 252 | ) |
57 | 253 | from ..tree import TreeChange | ||
58 | 253 | 254 | ||
59 | 254 | 255 | ||
60 | 255 | # This is the Windows equivalent of ENOTDIR | 256 | # This is the Windows equivalent of ENOTDIR |
61 | @@ -3768,15 +3769,16 @@ | |||
62 | 3768 | else: | 3769 | else: |
63 | 3769 | path_u = self.utf8_decode(path)[0] | 3770 | path_u = self.utf8_decode(path)[0] |
64 | 3770 | source_kind = DirState._minikind_to_kind[source_minikind] | 3771 | source_kind = DirState._minikind_to_kind[source_minikind] |
74 | 3771 | return (entry[0][2], | 3772 | return TreeChange( |
75 | 3772 | (old_path_u, path_u), | 3773 | entry[0][2], |
76 | 3773 | content_change, | 3774 | (old_path_u, path_u), |
77 | 3774 | (True, True), | 3775 | content_change, |
78 | 3775 | (source_parent_id, target_parent_id), | 3776 | (True, True), |
79 | 3776 | (self.utf8_decode(old_basename)[ | 3777 | (source_parent_id, target_parent_id), |
80 | 3777 | 0], self.utf8_decode(entry[0][1])[0]), | 3778 | (self.utf8_decode(old_basename)[ |
81 | 3778 | (source_kind, target_kind), | 3779 | 0], self.utf8_decode(entry[0][1])[0]), |
82 | 3779 | (source_exec, target_exec)), changed | 3780 | (source_kind, target_kind), |
83 | 3781 | (source_exec, target_exec)), changed | ||
84 | 3780 | elif source_minikind in b'a' and target_minikind in _fdlt: | 3782 | elif source_minikind in b'a' and target_minikind in _fdlt: |
85 | 3781 | # looks like a new file | 3783 | # looks like a new file |
86 | 3782 | path = pathjoin(entry[0][0], entry[0][1]) | 3784 | path = pathjoin(entry[0][0], entry[0][1]) |
87 | @@ -3796,24 +3798,26 @@ | |||
88 | 3796 | and stat.S_IEXEC & path_info[3].st_mode) | 3798 | and stat.S_IEXEC & path_info[3].st_mode) |
89 | 3797 | else: | 3799 | else: |
90 | 3798 | target_exec = target_details[3] | 3800 | target_exec = target_details[3] |
99 | 3799 | return (entry[0][2], | 3801 | return TreeChange( |
100 | 3800 | (None, self.utf8_decode(path)[0]), | 3802 | entry[0][2], |
101 | 3801 | True, | 3803 | (None, self.utf8_decode(path)[0]), |
102 | 3802 | (False, True), | 3804 | True, |
103 | 3803 | (None, parent_id), | 3805 | (False, True), |
104 | 3804 | (None, self.utf8_decode(entry[0][1])[0]), | 3806 | (None, parent_id), |
105 | 3805 | (None, path_info[2]), | 3807 | (None, self.utf8_decode(entry[0][1])[0]), |
106 | 3806 | (None, target_exec)), True | 3808 | (None, path_info[2]), |
107 | 3809 | (None, target_exec)), True | ||
108 | 3807 | else: | 3810 | else: |
109 | 3808 | # Its a missing file, report it as such. | 3811 | # Its a missing file, report it as such. |
118 | 3809 | return (entry[0][2], | 3812 | return TreeChange( |
119 | 3810 | (None, self.utf8_decode(path)[0]), | 3813 | entry[0][2], |
120 | 3811 | False, | 3814 | (None, self.utf8_decode(path)[0]), |
121 | 3812 | (False, True), | 3815 | False, |
122 | 3813 | (None, parent_id), | 3816 | (False, True), |
123 | 3814 | (None, self.utf8_decode(entry[0][1])[0]), | 3817 | (None, parent_id), |
124 | 3815 | (None, None), | 3818 | (None, self.utf8_decode(entry[0][1])[0]), |
125 | 3816 | (None, False)), True | 3819 | (None, None), |
126 | 3820 | (None, False)), True | ||
127 | 3817 | elif source_minikind in _fdlt and target_minikind in b'a': | 3821 | elif source_minikind in _fdlt and target_minikind in b'a': |
128 | 3818 | # unversioned, possibly, or possibly not deleted: we dont care. | 3822 | # unversioned, possibly, or possibly not deleted: we dont care. |
129 | 3819 | # if its still on disk, *and* theres no other entry at this | 3823 | # if its still on disk, *and* theres no other entry at this |
130 | @@ -3825,14 +3829,15 @@ | |||
131 | 3825 | self.source_index, path_utf8=entry[0][0])[0][2] | 3829 | self.source_index, path_utf8=entry[0][0])[0][2] |
132 | 3826 | if parent_id == entry[0][2]: | 3830 | if parent_id == entry[0][2]: |
133 | 3827 | parent_id = None | 3831 | parent_id = None |
142 | 3828 | return (entry[0][2], | 3832 | return TreeChange( |
143 | 3829 | (self.utf8_decode(old_path)[0], None), | 3833 | entry[0][2], |
144 | 3830 | True, | 3834 | (self.utf8_decode(old_path)[0], None), |
145 | 3831 | (True, False), | 3835 | True, |
146 | 3832 | (parent_id, None), | 3836 | (True, False), |
147 | 3833 | (self.utf8_decode(entry[0][1])[0], None), | 3837 | (parent_id, None), |
148 | 3834 | (DirState._minikind_to_kind[source_minikind], None), | 3838 | (self.utf8_decode(entry[0][1])[0], None), |
149 | 3835 | (source_details[3], None)), True | 3839 | (DirState._minikind_to_kind[source_minikind], None), |
150 | 3840 | (source_details[3], None)), True | ||
151 | 3836 | elif source_minikind in _fdlt and target_minikind in b'r': | 3841 | elif source_minikind in _fdlt and target_minikind in b'r': |
152 | 3837 | # a rename; could be a true rename, or a rename inherited from | 3842 | # a rename; could be a true rename, or a rename inherited from |
153 | 3838 | # a renamed parent. TODO: handle this efficiently. Its not | 3843 | # a renamed parent. TODO: handle this efficiently. Its not |
154 | @@ -3966,15 +3971,16 @@ | |||
155 | 3966 | new_executable = bool( | 3971 | new_executable = bool( |
156 | 3967 | stat.S_ISREG(root_dir_info[3].st_mode) | 3972 | stat.S_ISREG(root_dir_info[3].st_mode) |
157 | 3968 | and stat.S_IEXEC & root_dir_info[3].st_mode) | 3973 | and stat.S_IEXEC & root_dir_info[3].st_mode) |
167 | 3969 | yield (None, | 3974 | yield TreeChange( |
168 | 3970 | (None, current_root_unicode), | 3975 | None, |
169 | 3971 | True, | 3976 | (None, current_root_unicode), |
170 | 3972 | (False, False), | 3977 | True, |
171 | 3973 | (None, None), | 3978 | (False, False), |
172 | 3974 | (None, splitpath(current_root_unicode)[-1]), | 3979 | (None, None), |
173 | 3975 | (None, root_dir_info[2]), | 3980 | (None, splitpath(current_root_unicode)[-1]), |
174 | 3976 | (None, new_executable) | 3981 | (None, root_dir_info[2]), |
175 | 3977 | ) | 3982 | (None, new_executable) |
176 | 3983 | ) | ||
177 | 3978 | initial_key = (current_root, b'', b'') | 3984 | initial_key = (current_root, b'', b'') |
178 | 3979 | block_index, _ = self.state._find_block_index_from_key(initial_key) | 3985 | block_index, _ = self.state._find_block_index_from_key(initial_key) |
179 | 3980 | if block_index == 0: | 3986 | if block_index == 0: |
180 | @@ -4048,16 +4054,15 @@ | |||
181 | 4048 | new_executable = bool( | 4054 | new_executable = bool( |
182 | 4049 | stat.S_ISREG(current_path_info[3].st_mode) | 4055 | stat.S_ISREG(current_path_info[3].st_mode) |
183 | 4050 | and stat.S_IEXEC & current_path_info[3].st_mode) | 4056 | and stat.S_IEXEC & current_path_info[3].st_mode) |
194 | 4051 | yield (None, | 4057 | yield TreeChange( |
195 | 4052 | (None, utf8_decode( | 4058 | None, |
196 | 4053 | current_path_info[0])[0]), | 4059 | (None, utf8_decode(current_path_info[0])[0]), |
197 | 4054 | True, | 4060 | True, |
198 | 4055 | (False, False), | 4061 | (False, False), |
199 | 4056 | (None, None), | 4062 | (None, None), |
200 | 4057 | (None, utf8_decode( | 4063 | (None, utf8_decode(current_path_info[1])[0]), |
201 | 4058 | current_path_info[1])[0]), | 4064 | (None, current_path_info[2]), |
202 | 4059 | (None, current_path_info[2]), | 4065 | (None, new_executable)) |
193 | 4060 | (None, new_executable)) | ||
203 | 4061 | # dont descend into this unversioned path if it is | 4066 | # dont descend into this unversioned path if it is |
204 | 4062 | # a dir | 4067 | # a dir |
205 | 4063 | if current_path_info[2] in ('directory', | 4068 | if current_path_info[2] in ('directory', |
206 | 4064 | 4069 | ||
207 | === modified file 'breezy/bzr/inventorytree.py' | |||
208 | --- breezy/bzr/inventorytree.py 2019-03-04 00:16:27 +0000 | |||
209 | +++ breezy/bzr/inventorytree.py 2019-06-15 12:02:54 +0000 | |||
210 | @@ -52,6 +52,7 @@ | |||
211 | 52 | FileTimestampUnavailable, | 52 | FileTimestampUnavailable, |
212 | 53 | InterTree, | 53 | InterTree, |
213 | 54 | Tree, | 54 | Tree, |
214 | 55 | TreeChange, | ||
215 | 55 | ) | 56 | ) |
216 | 56 | 57 | ||
217 | 57 | 58 | ||
218 | @@ -920,14 +921,15 @@ | |||
219 | 920 | entry.file_id not in specific_file_ids): | 921 | entry.file_id not in specific_file_ids): |
220 | 921 | continue | 922 | continue |
221 | 922 | if entry.file_id not in changed_file_ids: | 923 | if entry.file_id not in changed_file_ids: |
230 | 923 | yield (entry.file_id, | 924 | yield TreeChange( |
231 | 924 | (relpath, relpath), # Not renamed | 925 | entry.file_id, |
232 | 925 | False, # Not modified | 926 | (relpath, relpath), # Not renamed |
233 | 926 | (True, True), # Still versioned | 927 | False, # Not modified |
234 | 927 | (entry.parent_id, entry.parent_id), | 928 | (True, True), # Still versioned |
235 | 928 | (entry.name, entry.name), | 929 | (entry.parent_id, entry.parent_id), |
236 | 929 | (entry.kind, entry.kind), | 930 | (entry.name, entry.name), |
237 | 930 | (entry.executable, entry.executable)) | 931 | (entry.kind, entry.kind), |
238 | 932 | (entry.executable, entry.executable)) | ||
239 | 931 | 933 | ||
240 | 932 | 934 | ||
241 | 933 | InterTree.register_optimiser(InterCHKRevisionTree) | 935 | InterTree.register_optimiser(InterCHKRevisionTree) |
242 | 934 | 936 | ||
243 | === modified file 'breezy/git/tree.py' | |||
244 | --- breezy/git/tree.py 2019-06-03 03:10:29 +0000 | |||
245 | +++ breezy/git/tree.py 2019-06-15 12:02:54 +0000 | |||
246 | @@ -828,10 +828,11 @@ | |||
247 | 828 | oldkind == 'directory' and newkind == 'directory' and | 828 | oldkind == 'directory' and newkind == 'directory' and |
248 | 829 | oldpath_decoded == newpath_decoded): | 829 | oldpath_decoded == newpath_decoded): |
249 | 830 | continue | 830 | continue |
254 | 831 | yield (fileid, (oldpath_decoded, newpath_decoded), (oldsha != newsha), | 831 | yield _mod_tree.TreeChange( |
255 | 832 | (oldversioned, newversioned), | 832 | fileid, (oldpath_decoded, newpath_decoded), (oldsha != newsha), |
256 | 833 | (oldparent, newparent), (oldname, newname), | 833 | (oldversioned, newversioned), |
257 | 834 | (oldkind, newkind), (oldexe, newexe)) | 834 | (oldparent, newparent), (oldname, newname), |
258 | 835 | (oldkind, newkind), (oldexe, newexe)) | ||
259 | 835 | 836 | ||
260 | 836 | 837 | ||
261 | 837 | class InterGitTrees(_mod_tree.InterTree): | 838 | class InterGitTrees(_mod_tree.InterTree): |
262 | 838 | 839 | ||
263 | === modified file 'breezy/tree.py' | |||
264 | --- breezy/tree.py 2019-06-04 00:08:59 +0000 | |||
265 | +++ breezy/tree.py 2019-06-15 12:02:54 +0000 | |||
266 | @@ -112,6 +112,43 @@ | |||
267 | 112 | return '+' | 112 | return '+' |
268 | 113 | 113 | ||
269 | 114 | 114 | ||
270 | 115 | class TreeChange(object): | ||
271 | 116 | """Describes the changes between the same item in two different trees.""" | ||
272 | 117 | |||
273 | 118 | __slots__ = ['file_id', 'path', 'changed_content', 'versioned', 'parent_id', | ||
274 | 119 | 'name', 'kind', 'executable'] | ||
275 | 120 | |||
276 | 121 | def __init__(self, file_id, path, changed_content, versioned, parent_id, | ||
277 | 122 | name, kind, executable): | ||
278 | 123 | self.file_id = file_id | ||
279 | 124 | self.path = path | ||
280 | 125 | self.changed_content = changed_content | ||
281 | 126 | self.versioned = versioned | ||
282 | 127 | self.parent_id = parent_id | ||
283 | 128 | self.name = name | ||
284 | 129 | self.kind = kind | ||
285 | 130 | self.executable = executable | ||
286 | 131 | |||
287 | 132 | def __len__(self): | ||
288 | 133 | return len(self.__slots__) | ||
289 | 134 | |||
290 | 135 | def __tuple__(self): | ||
291 | 136 | return (self.file_id, self.path, self.changed_content, self.versioned, | ||
292 | 137 | self.parent_id, self.name, self.kind, self.executable) | ||
293 | 138 | |||
294 | 139 | def __eq__(self, other): | ||
295 | 140 | if isinstance(other, TreeChange): | ||
296 | 141 | return tuple(self) == tuple(other) | ||
297 | 142 | if isinstance(other, tuple): | ||
298 | 143 | return tuple(self) == other | ||
299 | 144 | return False | ||
300 | 145 | |||
301 | 146 | def __getitem__(self, i): | ||
302 | 147 | if isinstance(i, slice): | ||
303 | 148 | return tuple(self).__getitem__(i) | ||
304 | 149 | return getattr(self, self.__slots__[i]) | ||
305 | 150 | |||
306 | 151 | |||
307 | 115 | class Tree(object): | 152 | class Tree(object): |
308 | 116 | """Abstract file tree. | 153 | """Abstract file tree. |
309 | 117 | 154 | ||
310 | @@ -762,8 +799,9 @@ | |||
311 | 762 | changes = True | 799 | changes = True |
312 | 763 | else: | 800 | else: |
313 | 764 | changes = False | 801 | changes = False |
316 | 765 | return (file_id, (source_path, target_path), changed_content, | 802 | return TreeChange( |
317 | 766 | versioned, parent, name, kind, executable), changes | 803 | file_id, (source_path, target_path), changed_content, |
318 | 804 | versioned, parent, name, kind, executable), changes | ||
319 | 767 | 805 | ||
320 | 768 | def compare(self, want_unchanged=False, specific_files=None, | 806 | def compare(self, want_unchanged=False, specific_files=None, |
321 | 769 | extra_trees=None, require_versioned=False, include_root=False, | 807 | extra_trees=None, require_versioned=False, include_root=False, |
322 | @@ -882,11 +920,12 @@ | |||
323 | 882 | target_kind, target_executable, target_stat = \ | 920 | target_kind, target_executable, target_stat = \ |
324 | 883 | self.target._comparison_data( | 921 | self.target._comparison_data( |
325 | 884 | fake_entry, unversioned_path[1]) | 922 | fake_entry, unversioned_path[1]) |
331 | 885 | yield (None, (None, unversioned_path[1]), True, (False, False), | 923 | yield TreeChange( |
332 | 886 | (None, None), | 924 | None, (None, unversioned_path[1]), True, (False, False), |
333 | 887 | (None, unversioned_path[0][-1]), | 925 | (None, None), |
334 | 888 | (None, target_kind), | 926 | (None, unversioned_path[0][-1]), |
335 | 889 | (None, target_executable)) | 927 | (None, target_kind), |
336 | 928 | (None, target_executable)) | ||
337 | 890 | source_path, source_entry = from_data.get(target_entry.file_id, | 929 | source_path, source_entry = from_data.get(target_entry.file_id, |
338 | 891 | (None, None)) | 930 | (None, None)) |
339 | 892 | result, changes = self._changes_from_entries(source_entry, | 931 | result, changes = self._changes_from_entries(source_entry, |
340 | @@ -918,11 +957,12 @@ | |||
341 | 918 | unversioned_path = all_unversioned.popleft() | 957 | unversioned_path = all_unversioned.popleft() |
342 | 919 | to_kind, to_executable, to_stat = \ | 958 | to_kind, to_executable, to_stat = \ |
343 | 920 | self.target._comparison_data(fake_entry, unversioned_path[1]) | 959 | self.target._comparison_data(fake_entry, unversioned_path[1]) |
349 | 921 | yield (None, (None, unversioned_path[1]), True, (False, False), | 960 | yield TreeChange( |
350 | 922 | (None, None), | 961 | None, (None, unversioned_path[1]), True, (False, False), |
351 | 923 | (None, unversioned_path[0][-1]), | 962 | (None, None), |
352 | 924 | (None, to_kind), | 963 | (None, unversioned_path[0][-1]), |
353 | 925 | (None, to_executable)) | 964 | (None, to_kind), |
354 | 965 | (None, to_executable)) | ||
355 | 926 | # Yield all remaining source paths | 966 | # Yield all remaining source paths |
356 | 927 | for path, from_entry in from_entries_by_dir: | 967 | for path, from_entry in from_entries_by_dir: |
357 | 928 | file_id = from_entry.file_id | 968 | file_id = from_entry.file_id |
358 | @@ -943,8 +983,9 @@ | |||
359 | 943 | changed_content = from_kind is not None | 983 | changed_content = from_kind is not None |
360 | 944 | # the parent's path is necessarily known at this point. | 984 | # the parent's path is necessarily known at this point. |
361 | 945 | changed_file_ids.append(file_id) | 985 | changed_file_ids.append(file_id) |
364 | 946 | yield(file_id, (path, to_path), changed_content, versioned, parent, | 986 | yield TreeChange( |
365 | 947 | name, kind, executable) | 987 | file_id, (path, to_path), changed_content, versioned, parent, |
366 | 988 | name, kind, executable) | ||
367 | 948 | changed_file_ids = set(changed_file_ids) | 989 | changed_file_ids = set(changed_file_ids) |
368 | 949 | if specific_files is not None: | 990 | if specific_files is not None: |
369 | 950 | for result in self._handle_precise_ids(precise_file_ids, | 991 | for result in self._handle_precise_ids(precise_file_ids, |
Looks sensible, see one inline comment about slice still.