Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: recipe_engine/autoroll_impl/commit_list.py

Issue 2829203002: [autoroller] All commits in updates(), only roll interesting ones. (Closed)
Patch Set: windows fix Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « recipe_engine/autoroll_impl/candidate_algorithm.py ('k') | recipe_engine/fetch.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2017 The LUCI Authors. All rights reserved. 1 # Copyright 2017 The LUCI Authors. All rights reserved.
2 # Use of this source code is governed under the Apache License, Version 2.0 2 # Use of this source code is governed under the Apache License, Version 2.0
3 # that can be found in the LICENSE file. 3 # that can be found in the LICENSE file.
4 4
5 from recipe_engine.fetch import CommitMetadata 5 from recipe_engine.fetch import CommitMetadata
6 6
7 class UnknownCommit(KeyError): 7 class UnknownCommit(KeyError):
8 pass 8 pass
9 9
10 class CommitList(object): 10 class CommitList(object):
11 """A seekable list of CommitMetadata objects for a single repo. 11 """A seekable list of CommitMetadata objects for a single repo.
12 12
13 This can also be used to obtain the list of commits 'rolled so far' for the 13 This can also be used to obtain the list of commits 'rolled so far' for the
14 purposes of generating a changelist. 14 purposes of generating a changelist.
15 """ 15 """
16 16
17 def __init__(self, commit_list): 17 def __init__(self, commit_list):
18 """ 18 """
19 Args: 19 Args:
20 commit_list (list(CommitMetadata)) - The list of CommitMetadata objects to 20 commit_list (list(CommitMetadata)) - The list of CommitMetadata objects to
21 use. 21 use.
22 """ 22 """
23 assert commit_list, 'commit_list is empty' 23 assert commit_list, 'commit_list is empty'
24 assert all(isinstance(c, CommitMetadata) for c in commit_list) 24 assert all(isinstance(c, CommitMetadata) for c in commit_list)
25 self._commits = list(commit_list) 25 self._commits = list(commit_list)
26 self._cur_idx = 0 26 self._cur_idx = 0
27 self._next_roll_candidate_idx = None
27 28
28 # This maps from commit hash -> index in _commits. 29 # This maps from commit hash -> index in _commits.
29 self._rev_idx = {} 30 self._rev_idx = {}
30 31
31 # This maps dep_project_id -> dep_commit -> set(idxs) 32 # This maps dep_project_id -> dep_commit -> set(idxs)
32 self._dep_idx = {} 33 self._dep_idx = {}
33 for i, c in enumerate(commit_list): 34 for i, c in enumerate(commit_list):
34 self._rev_idx[c.revision] = i 35 self._rev_idx[c.revision] = i
35 36
36 for dep_project_id, dep in c.spec.deps.iteritems(): 37 for dep_project_id, dep in c.spec.deps.iteritems():
(...skipping 25 matching lines...) Expand all
62 def next(self): 63 def next(self):
63 """Gets the next CommitMetadata without advancing the current index. 64 """Gets the next CommitMetadata without advancing the current index.
64 65
65 Returns the next CommitMetadata or None, if there is no next CommitMetadata. 66 Returns the next CommitMetadata or None, if there is no next CommitMetadata.
66 """ 67 """
67 nxt_idx = self._cur_idx+1 68 nxt_idx = self._cur_idx+1
68 if nxt_idx >= len(self._commits): 69 if nxt_idx >= len(self._commits):
69 return None 70 return None
70 return self._commits[nxt_idx] 71 return self._commits[nxt_idx]
71 72
73 @property
74 def next_roll_candidate(self):
75 """Gets the next CommitMetadata and distance with roll_candidate==True
76 without advancing the current index.
77
78 Returns (CommitMetadata, <distance>), or (None, None) if there is no next
79 roll_candidate.
80 """
81 # Compute and cache the next roll candidate index.
82 nxt_idx = self._next_roll_candidate_idx
83 if nxt_idx is None or nxt_idx <= self._cur_idx:
84 nxt_idx = None
85 for i, commit in enumerate(self._commits[self._cur_idx+1:]):
86 if commit.roll_candidate:
87 nxt_idx = self._cur_idx + i + 1
88 break
89 self._next_roll_candidate_idx = nxt_idx
90
91 if nxt_idx is not None:
92 return self._commits[nxt_idx], nxt_idx - self._cur_idx
93 return (None, None)
94
72 def advance(self): 95 def advance(self):
73 """Advances the current CommitMetadata by one. 96 """Advances the current CommitMetadata by one.
74 97
75 That is: CommitList.next becomes CommitList.current. 98 That is: CommitList.next becomes CommitList.current.
76 99
77 Returns the now-current CommitMetadata (or None, if there was no next 100 Returns the now-current CommitMetadata (or None, if there was no next
78 CommitMetadata). 101 CommitMetadata).
79 """ 102 """
80 ret = self.next 103 ret = self.next
81 if ret: 104 if ret:
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 Args: 195 Args:
173 target_commit (str) - the commit to obtain the changelist for. 196 target_commit (str) - the commit to obtain the changelist for.
174 197
175 Returns list(CommitMetadata) - The CommitMetadata objects corresponding to 198 Returns list(CommitMetadata) - The CommitMetadata objects corresponding to
176 the provided target_commit. 199 the provided target_commit.
177 200
178 Raises: 201 Raises:
179 UnknownCommit if target_commit is not found. 202 UnknownCommit if target_commit is not found.
180 """ 203 """
181 return list(self._commits[:self._idx_of(target_commit)+1]) 204 return list(self._commits[:self._idx_of(target_commit)+1])
OLDNEW
« no previous file with comments | « recipe_engine/autoroll_impl/candidate_algorithm.py ('k') | recipe_engine/fetch.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698