mirror of
https://github.com/servo/servo.git
synced 2025-07-12 18:03:49 +01:00
Auto merge of #22968 - jdm:wptsyncfix, r=jgraham
Do not store state when syncing WPT. This eliminates unnecessary state saving during the syncing process which was broken by recent changes upstream. This also incorporates the changes from https://hg.mozilla.org/mozilla-central/rev/bc1c54e5dcea which were never synced, causing the command line argument to be useless until the divergence is resolved. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22968) <!-- Reviewable:end -->
This commit is contained in:
commit
cc131be2e0
4 changed files with 65 additions and 39 deletions
|
@ -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": [
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue