| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| |
| class RevisionState(object): |
| """Contains bisect state for a given revision. |
| |
| Properties: |
| depot: The depot that this revision is from (e.g. WebKit). |
| revision: Revision number (Git hash or SVN number). |
| index: Position of the state in the list of all revisions. |
| value: Value(s) returned from the test. |
| perf_time: Time that a test took. |
| build_time: Time that a build took. |
| passed: Represents whether the performance test was successful at that |
| revision. Possible values include: 1 (passed), 0 (failed), |
| '?' (skipped), 'F' (build failed). |
| external: If the revision is a 'src' revision, 'external' contains the |
| revisions of each of the external libraries. |
| """ |
| |
| def __init__(self, depot, revision, index): |
| self.depot = depot |
| self.revision = revision |
| self.index = index |
| self.value = None |
| self.perf_time = 0 |
| self.build_time = 0 |
| self.passed = '?' |
| self.external = None |
| |
| # TODO(sergiyb): Update() to parse run_results from the RunTest. |
| |
| |
| class BisectState(object): |
| """Represents a state of the bisect as a collection of revision states.""" |
| |
| def __init__(self, depot, revisions): |
| """Initializes a new BisectState object with a set of revision states. |
| |
| Args: |
| depot: Name of the depot used for initial set of revision states. |
| revisions: List of revisions used for initial set of revision states. |
| """ |
| self.revision_states = [] |
| self.revision_index = {} |
| |
| index = 0 |
| for revision in revisions: |
| new_state = self._InitRevisionState(depot, revision, index) |
| self.revision_states.append(new_state) |
| index += 1 |
| |
| @staticmethod |
| def _RevisionKey(depot, revision): |
| return "%s:%s" % (depot, revision) |
| |
| def _InitRevisionState(self, depot, revision, index): |
| key = self._RevisionKey(depot, revision) |
| self.revision_index[key] = index |
| return RevisionState(depot, revision, index) |
| |
| def GetRevisionState(self, depot, revision): |
| """Returns a mutable revision state.""" |
| key = self._RevisionKey(depot, revision) |
| index = self.revision_index.get(key) |
| return self.revision_states[index] if index else None |
| |
| def CreateRevisionStatesAfter(self, depot, revisions, reference_depot, |
| reference_revision): |
| """Creates a set of new revision states after a specified reference state. |
| |
| Args: |
| depot: Name of the depot for the new revision states. |
| revisions: List of revisions for the new revision states. |
| reference_depot: Name of the depot for the reference revision state. |
| reference_revision: Revision for the reference revision state. |
| |
| Returns: |
| A list containing all created revision states in order as they were added. |
| """ |
| ref_key = self._RevisionKey(reference_depot, reference_revision) |
| ref_index = self.revision_index[ref_key] |
| num_new_revisions = len(revisions) |
| for entry in self.revision_states: |
| if entry.index > ref_index: |
| entry.index += num_new_revisions |
| |
| first_index = ref_index + 1 |
| for index, revision in enumerate(revisions, start=first_index): |
| new_state = self._InitRevisionState(depot, revision, index) |
| self.revision_states.insert(index, new_state) |
| |
| return self.revision_states[first_index:first_index + num_new_revisions] |
| |
| def GetRevisionStates(self): |
| """Returns a copy of the list of the revision states.""" |
| return list(self.revision_states) |