summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildstream/_loader/loader.py13
-rw-r--r--src/buildstream/_project.py2
-rw-r--r--tests/internals/loader.py15
-rw-r--r--tests/testutils/context.py9
4 files changed, 27 insertions, 12 deletions
diff --git a/src/buildstream/_loader/loader.py b/src/buildstream/_loader/loader.py
index 5eaed9337..a9e686f1c 100644
--- a/src/buildstream/_loader/loader.py
+++ b/src/buildstream/_loader/loader.py
@@ -37,6 +37,11 @@ from ..types import CoreWarnings
from .._message import Message, MessageType
+# This should be used to deliberately disable progress reporting when
+# collecting an element
+_NO_PROGRESS = object()
+
+
# Loader():
#
# The Loader class does the heavy lifting of parsing target
@@ -94,7 +99,7 @@ class Loader():
# Raises: LoadError
#
# Returns: The toplevel LoadElement
- def load(self, targets, rewritable=False, ticker=None, task=None):
+ def load(self, targets, task, rewritable=False, ticker=None):
for filename in targets:
if os.path.isabs(filename):
@@ -148,7 +153,7 @@ class Loader():
self._clean_caches()
# Cache how many Elements have just been loaded
- if task:
+ if task is not _NO_PROGRESS:
# Workaround for task potentially being None (because no State object)
self.loaded = task.current_progress
@@ -483,7 +488,7 @@ class Loader():
# Cache it now, make sure it's already there before recursing
self._meta_elements[element.name] = meta_element
- if task:
+ if task is not _NO_PROGRESS:
task.add_current_progress()
return meta_element
@@ -593,7 +598,7 @@ class Loader():
# meta junction element
# XXX: This is a likely point for progress reporting to end up
# missing some elements, but it currently doesn't appear to be the case.
- meta_element = self._collect_element_no_deps(self._elements[filename], None)
+ meta_element = self._collect_element_no_deps(self._elements[filename], _NO_PROGRESS)
if meta_element.kind != 'junction':
raise LoadError("{}{}: Expected junction but element kind is {}"
.format(provenance_str, filename, meta_element.kind),
diff --git a/src/buildstream/_project.py b/src/buildstream/_project.py
index 6ae8aa9db..7ba93bba4 100644
--- a/src/buildstream/_project.py
+++ b/src/buildstream/_project.py
@@ -433,7 +433,7 @@ class Project():
#
def load_elements(self, targets, *, rewritable=False):
with self._context.messenger.simple_task("Loading elements", silent_nested=True) as task:
- meta_elements = self.loader.load(targets, rewritable=rewritable, ticker=None, task=task)
+ meta_elements = self.loader.load(targets, task, rewritable=rewritable, ticker=None)
with self._context.messenger.simple_task("Resolving elements") as task:
if task:
diff --git a/tests/internals/loader.py b/tests/internals/loader.py
index 9af2bf161..39ef8ac99 100644
--- a/tests/internals/loader.py
+++ b/tests/internals/loader.py
@@ -5,6 +5,7 @@ import pytest
from buildstream._exceptions import LoadError, LoadErrorReason
from buildstream._project import Project
from buildstream._loader import MetaElement
+from buildstream._loader.loader import _NO_PROGRESS
from tests.testutils import dummy_context
@@ -30,7 +31,7 @@ def test_one_file(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader:
- element = loader.load(['elements/onefile.bst'])[0]
+ element = loader.load(['elements/onefile.bst'], _NO_PROGRESS)[0]
assert isinstance(element, MetaElement)
assert element.kind == 'pony'
@@ -41,7 +42,7 @@ def test_missing_file(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load(['elements/missing.bst'])
+ loader.load(['elements/missing.bst'], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.MISSING_FILE
@@ -51,7 +52,7 @@ def test_invalid_reference(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load(['elements/badreference.bst'])
+ loader.load(['elements/badreference.bst'], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.INVALID_YAML
@@ -61,7 +62,7 @@ def test_invalid_yaml(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load(['elements/badfile.bst'])
+ loader.load(['elements/badfile.bst'], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.INVALID_YAML
@@ -73,7 +74,7 @@ def test_fail_fullpath_target(datafiles):
fullpath = os.path.join(basedir, 'elements', 'onefile.bst')
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load([fullpath])
+ loader.load([fullpath], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.INVALID_DATA
@@ -83,7 +84,7 @@ def test_invalid_key(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load(['elements/invalidkey.bst'])
+ loader.load(['elements/invalidkey.bst'], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.INVALID_DATA
@@ -93,6 +94,6 @@ def test_invalid_directory_load(datafiles):
basedir = str(datafiles)
with make_loader(basedir) as loader, pytest.raises(LoadError) as exc:
- loader.load(['elements/'])
+ loader.load(['elements/'], _NO_PROGRESS)
assert exc.value.reason == LoadErrorReason.LOADING_DIRECTORY
diff --git a/tests/testutils/context.py b/tests/testutils/context.py
index 899bad247..849895e92 100644
--- a/tests/testutils/context.py
+++ b/tests/testutils/context.py
@@ -15,10 +15,13 @@
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
import os
+from unittest.mock import MagicMock
+from types import MethodType
from contextlib import contextmanager
from buildstream._context import Context
+from buildstream._state import _Task
# Handle messages from the pipeline
@@ -26,6 +29,11 @@ def _dummy_message_handler(message, is_silenced):
pass
+@contextmanager
+def _get_dummy_task(self, activity_name, *, element_name=None, full_name=None, silent_nested=False):
+ yield MagicMock(spec=_Task("state", activity_name, full_name, 0))
+
+
# dummy_context()
#
# Context manager to create minimal context for tests.
@@ -42,5 +50,6 @@ def dummy_context(*, config=None):
context.load(config=config)
context.messenger.set_message_handler(_dummy_message_handler)
+ context.messenger.simple_task = MethodType(_get_dummy_task, context.messenger)
yield context