| Index: tools/auto_bisect/bisect_state.py
|
| diff --git a/tools/auto_bisect/bisect_state.py b/tools/auto_bisect/bisect_state.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5d745115dc56c52e4a9e8423b286dd6e2c3a9e1
|
| --- /dev/null
|
| +++ b/tools/auto_bisect/bisect_state.py
|
| @@ -0,0 +1,99 @@
|
| +# 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)
|
|
|