aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/MANIFEST.json4
-rw-r--r--tests/wpt/update.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py92
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py7
4 files changed, 65 insertions, 39 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 8e152dc2989..b6936e8f370 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -683466,7 +683466,7 @@
"support"
],
"tools/wptrunner/wptrunner/update/state.py": [
- "3a97618effdbf13c22ac422a6f5e4bbae65643bd",
+ "83fece632c68b62cf35ce154cbcd724e0af98d81",
"support"
],
"tools/wptrunner/wptrunner/update/sync.py": [
@@ -683478,7 +683478,7 @@
"support"
],
"tools/wptrunner/wptrunner/update/update.py": [
- "e5678be4f5467be2c542af5160b512a574fd7a36",
+ "ceeae2a83c9613c1452f00244cd86f9a38c876ed",
"support"
],
"tools/wptrunner/wptrunner/vcs.py": [
diff --git a/tests/wpt/update.py b/tests/wpt/update.py
index 29783513947..2091b1fed66 100644
--- a/tests/wpt/update.py
+++ b/tests/wpt/update.py
@@ -31,6 +31,7 @@ def set_defaults(kwargs):
kwargs["product"] = "servo"
if kwargs["config"] is None:
kwargs["config"] = wpt_path('config.ini')
+ kwargs["store_state"] = False
updatecommandline.check_args(kwargs)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
index 3a97618effd..83fece632c6 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
@@ -3,9 +3,7 @@ import cPickle as pickle
here = os.path.abspath(os.path.split(__file__)[0])
-class State(object):
- filename = os.path.join(here, ".wpt-update.lock")
-
+class BaseState(object):
def __new__(cls, logger):
rv = cls.load(logger)
if rv is not None:
@@ -18,11 +16,6 @@ class State(object):
def __init__(self, logger):
"""Object containing state variables created when running Steps.
- On write the state is serialized to disk, such that it can be restored in
- the event that the program is interrupted before all steps are complete.
- Note that this only works well if the values are immutable; mutating an
- existing value will not cause the data to be serialized.
-
Variables are set and get as attributes e.g. state_obj.spam = "eggs".
:param parent: Parent State object or None if this is the root object.
@@ -40,23 +33,6 @@ class State(object):
del rv["_logger"]
return rv
- @classmethod
- def load(cls, logger):
- """Load saved state from a file"""
- try:
- if not os.path.isfile(cls.filename):
- return None
- with open(cls.filename) as f:
- try:
- rv = pickle.load(f)
- logger.debug("Loading data %r" % (rv._data,))
- rv._logger = logger
- rv._index = 0
- return rv
- except EOFError:
- logger.warning("Found empty state file")
- except IOError:
- logger.debug("IOError loading stored state")
def push(self, init_values):
"""Push a new clean state dictionary
@@ -66,23 +42,13 @@ class State(object):
return StateContext(self, init_values)
- def save(self):
- """Write the state to disk"""
- with open(self.filename, "w") as f:
- pickle.dump(self, f, 2)
-
def is_empty(self):
return len(self._data) == 1 and self._data[0] == {}
def clear(self):
"""Remove all state and delete the stored copy."""
- try:
- os.unlink(self.filename)
- except OSError:
- pass
self._data = [{}]
-
def __setattr__(self, key, value):
if key.startswith("_"):
object.__setattr__(self, key, value)
@@ -109,6 +75,62 @@ class State(object):
def keys(self):
return self._data[self._index].keys()
+
+ @classmethod
+ def load(self):
+ raise NotImplementedError
+
+ def save(self):
+ raise NotImplementedError
+
+
+class SavedState(BaseState):
+ """On write the state is serialized to disk, such that it can be restored in
+ the event that the program is interrupted before all steps are complete.
+ Note that this only works well if the values are immutable; mutating an
+ existing value will not cause the data to be serialized."""
+ filename = os.path.join(here, ".wpt-update.lock")
+
+ @classmethod
+ def load(cls, logger):
+ """Load saved state from a file"""
+ try:
+ if not os.path.isfile(cls.filename):
+ return None
+ with open(cls.filename) as f:
+ try:
+ rv = pickle.load(f)
+ logger.debug("Loading data %r" % (rv._data,))
+ rv._logger = logger
+ rv._index = 0
+ return rv
+ except EOFError:
+ logger.warning("Found empty state file")
+ except IOError:
+ logger.debug("IOError loading stored state")
+
+ def save(self):
+ """Write the state to disk"""
+ with open(self.filename, "w") as f:
+ pickle.dump(self, f)
+
+ def clear(self):
+ super(SavedState, self).clear()
+ try:
+ os.unlink(self.filename)
+ except OSError:
+ pass
+
+
+class UnsavedState(BaseState):
+ @classmethod
+ def load(cls, logger):
+ return None
+
+ def save(self):
+ return
+
+
class StateContext(object):
def __init__(self, state, init_values):
self.state = state
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
index e5678be4f54..ceeae2a83c9 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
@@ -6,7 +6,7 @@ from sync import SyncFromUpstreamRunner
from tree import GitTree, HgTree, NoVCSTree
from base import Step, StepRunner, exit_clean, exit_unclean
-from state import State
+from state import SavedState, UnsavedState
def setup_paths(sync_path):
sys.path.insert(0, os.path.abspath(sync_path))
@@ -149,7 +149,10 @@ class WPTUpdate(object):
# If the sync path doesn't exist we defer this until it does
setup_paths(kwargs["sync_path"])
- self.state = State(logger)
+ if kwargs["store_state"]:
+ self.state = SavedState(logger)
+ else:
+ self.state = UnsavedState(logger)
self.kwargs = kwargs
self.logger = logger