Tristan Van Berkom pushed to branch tristan/error-message-regression at BuildStream / buildstream
Commits:
-
19adc9e5
by Tristan Van Berkom at 2019-01-16T20:48:10Z
-
5e9598c5
by Tristan Van Berkom at 2019-01-16T21:17:26Z
-
0fffea91
by Tristan Van Berkom at 2019-01-16T23:26:26Z
5 changed files:
- buildstream/_exceptions.py
- buildstream/element.py
- buildstream/sandbox/sandbox.py
- buildstream/utils.py
- tests/integration/sandbox-bwrap.py
Changes:
... | ... | @@ -262,8 +262,8 @@ class PlatformError(BstError): |
262 | 262 |
# Raised when errors are encountered by the sandbox implementation
|
263 | 263 |
#
|
264 | 264 |
class SandboxError(BstError):
|
265 |
- def __init__(self, message, reason=None):
|
|
266 |
- super().__init__(message, domain=ErrorDomain.SANDBOX, reason=reason)
|
|
265 |
+ def __init__(self, message, detail=None, reason=None):
|
|
266 |
+ super().__init__(message, detail=detail, domain=ErrorDomain.SANDBOX, reason=reason)
|
|
267 | 267 |
|
268 | 268 |
|
269 | 269 |
# ArtifactError
|
... | ... | @@ -1398,43 +1398,40 @@ class Element(Plugin): |
1398 | 1398 |
# usebuildtree (bool): use a the elements build tree as its source.
|
1399 | 1399 |
#
|
1400 | 1400 |
def _stage_sources_at(self, vdirectory, mount_workspaces=True, usebuildtree=False):
|
1401 |
- with self.timed_activity("Staging sources", silent_nested=True):
|
|
1401 |
+ context = self._get_context()
|
|
1402 |
+ |
|
1403 |
+ # It's advantageous to have this temporary directory on
|
|
1404 |
+ # the same file system as the rest of our cache.
|
|
1405 |
+ with self.timed_activity("Staging sources", silent_nested=True), \
|
|
1406 |
+ utils._tempdir(dir=context.artifactdir, prefix='staging-temp') as temp_staging_directory:
|
|
1407 |
+ |
|
1408 |
+ import_dir = temp_staging_directory
|
|
1409 |
+ |
|
1402 | 1410 |
if not isinstance(vdirectory, Directory):
|
1403 | 1411 |
vdirectory = FileBasedDirectory(vdirectory)
|
1404 | 1412 |
if not vdirectory.is_empty():
|
1405 | 1413 |
raise ElementError("Staging directory '{}' is not empty".format(vdirectory))
|
1406 | 1414 |
|
1407 |
- # It's advantageous to have this temporary directory on
|
|
1408 |
- # the same filing system as the rest of our cache.
|
|
1409 |
- temp_staging_location = os.path.join(self._get_context().artifactdir, "staging_temp")
|
|
1410 |
- temp_staging_directory = tempfile.mkdtemp(prefix=temp_staging_location)
|
|
1411 |
- import_dir = temp_staging_directory
|
|
1412 |
- |
|
1413 |
- try:
|
|
1414 |
- workspace = self._get_workspace()
|
|
1415 |
- if workspace:
|
|
1416 |
- # If mount_workspaces is set and we're doing incremental builds,
|
|
1417 |
- # the workspace is already mounted into the sandbox.
|
|
1418 |
- if not (mount_workspaces and self.__can_build_incrementally()):
|
|
1419 |
- with self.timed_activity("Staging local files at {}"
|
|
1420 |
- .format(workspace.get_absolute_path())):
|
|
1421 |
- workspace.stage(temp_staging_directory)
|
|
1422 |
- # Check if we have a cached buildtree to use
|
|
1423 |
- elif usebuildtree:
|
|
1424 |
- artifact_base, _ = self.__extract()
|
|
1425 |
- import_dir = os.path.join(artifact_base, 'buildtree')
|
|
1426 |
- else:
|
|
1427 |
- # No workspace or cached buildtree, stage source directly
|
|
1428 |
- for source in self.sources():
|
|
1429 |
- source._stage(temp_staging_directory)
|
|
1415 |
+ workspace = self._get_workspace()
|
|
1416 |
+ if workspace:
|
|
1417 |
+ # If mount_workspaces is set and we're doing incremental builds,
|
|
1418 |
+ # the workspace is already mounted into the sandbox.
|
|
1419 |
+ if not (mount_workspaces and self.__can_build_incrementally()):
|
|
1420 |
+ with self.timed_activity("Staging local files at {}"
|
|
1421 |
+ .format(workspace.get_absolute_path())):
|
|
1422 |
+ workspace.stage(temp_staging_directory)
|
|
1423 |
+ |
|
1424 |
+ # Check if we have a cached buildtree to use
|
|
1425 |
+ elif usebuildtree:
|
|
1426 |
+ artifact_base, _ = self.__extract()
|
|
1427 |
+ import_dir = os.path.join(artifact_base, 'buildtree')
|
|
1428 |
+ else:
|
|
1429 |
+ # No workspace or cached buildtree, stage source directly
|
|
1430 |
+ for source in self.sources():
|
|
1431 |
+ source._stage(temp_staging_directory)
|
|
1430 | 1432 |
|
1431 |
- vdirectory.import_files(import_dir)
|
|
1433 |
+ vdirectory.import_files(import_dir)
|
|
1432 | 1434 |
|
1433 |
- finally:
|
|
1434 |
- # Staging may produce directories with less than 'rwx' permissions
|
|
1435 |
- # for the owner, which breaks tempfile. _force_rmtree will deal
|
|
1436 |
- # with these.
|
|
1437 |
- utils._force_rmtree(temp_staging_directory)
|
|
1438 | 1435 |
# Ensure deterministic mtime of sources at build time
|
1439 | 1436 |
vdirectory.set_deterministic_mtime()
|
1440 | 1437 |
# Ensure deterministic owners of sources at build time
|
... | ... | @@ -86,10 +86,11 @@ class SandboxCommandError(SandboxError): |
86 | 86 |
|
87 | 87 |
Args:
|
88 | 88 |
message (str): The error message to report to the user
|
89 |
+ detail (str): The detailed error string
|
|
89 | 90 |
collect (str): An optional directory containing partial install contents
|
90 | 91 |
"""
|
91 |
- def __init__(self, message, *, collect=None):
|
|
92 |
- super().__init__(message, reason='command-failed')
|
|
92 |
+ def __init__(self, message, *, detail=None, collect=None):
|
|
93 |
+ super().__init__(message, detail=detail, reason='command-failed')
|
|
93 | 94 |
|
94 | 95 |
self.collect = collect
|
95 | 96 |
|
... | ... | @@ -599,8 +600,8 @@ class _SandboxBatch(): |
599 | 600 |
if exitcode != 0:
|
600 | 601 |
cmdline = ' '.join(shlex.quote(cmd) for cmd in command.command)
|
601 | 602 |
label = command.label or cmdline
|
602 |
- raise SandboxCommandError("Command '{}' failed with exitcode {}".format(label, exitcode),
|
|
603 |
- collect=self.collect)
|
|
603 |
+ raise SandboxCommandError("Command failed with exitcode {}".format(exitcode),
|
|
604 |
+ detail=label, collect=self.collect)
|
|
604 | 605 |
|
605 | 606 |
def execute_call(self, call):
|
606 | 607 |
call.callback()
|
... | ... | @@ -1023,7 +1023,7 @@ def _tempdir(suffix="", prefix="tmp", dir=None): # pylint: disable=redefined-bu |
1023 | 1023 |
|
1024 | 1024 |
def cleanup_tempdir():
|
1025 | 1025 |
if os.path.isdir(tempdir):
|
1026 |
- shutil.rmtree(tempdir)
|
|
1026 |
+ _force_rmtree(tempdir)
|
|
1027 | 1027 |
|
1028 | 1028 |
try:
|
1029 | 1029 |
with _signals.terminator(cleanup_tempdir):
|
... | ... | @@ -59,4 +59,4 @@ def test_sandbox_bwrap_return_subprocess(cli, tmpdir, datafiles): |
59 | 59 |
|
60 | 60 |
result = cli.run(project=project, args=['build', element_name])
|
61 | 61 |
result.assert_task_error(error_domain=ErrorDomain.SANDBOX, error_reason="command-failed")
|
62 |
- assert "sandbox-bwrap/command-exit-42.bst|Command 'exit 42' failed with exitcode 42" in result.stderr
|
|
62 |
+ assert "sandbox-bwrap/command-exit-42.bst|Command failed with exitcode 42" in result.stderr
|