summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2018-04-08 21:42:27 +0900
committerTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2018-04-08 21:57:01 +0900
commit96af6dd5ae9743c7405cbfd99c929701c023f3e5 (patch)
treeaef3a4e56a52196576502cfa04e87a31216d74f2
parent337b7a31c244241f722a5ff709d23df75a021eb9 (diff)
downloadbuildstream-96af6dd5ae9743c7405cbfd99c929701c023f3e5.tar.gz
More specific exceptions when a project.conf is missing.
Since we want to react and start an interactive session when the project.conf is missing, we need a more specific error to catch.
-rw-r--r--buildstream/_exceptions.py12
-rw-r--r--buildstream/_loader.py4
-rw-r--r--buildstream/_project.py7
-rw-r--r--tests/format/project.py2
4 files changed, 18 insertions, 7 deletions
diff --git a/buildstream/_exceptions.py b/buildstream/_exceptions.py
index fc44f4989..d8687104f 100644
--- a/buildstream/_exceptions.py
+++ b/buildstream/_exceptions.py
@@ -182,14 +182,20 @@ class LoadErrorReason(Enum):
# Conflicting junctions in subprojects
CONFLICTING_JUNCTION = 12
+ # Failure to load a project from a specified junction
+ INVALID_JUNCTION = 13
+
# Subproject needs to be fetched
- SUBPROJECT_FETCH_NEEDED = 13
+ SUBPROJECT_FETCH_NEEDED = 14
# Subproject has no ref
- SUBPROJECT_INCONSISTENT = 14
+ SUBPROJECT_INCONSISTENT = 15
# An invalid symbol name was encountered
- INVALID_SYMBOL_NAME = 15
+ INVALID_SYMBOL_NAME = 16
+
+ # A project.conf file was missing
+ MISSING_PROJECT_CONF = 17
# LoadError
diff --git a/buildstream/_loader.py b/buildstream/_loader.py
index 44f38e3f1..2fc7d8f0c 100644
--- a/buildstream/_loader.py
+++ b/buildstream/_loader.py
@@ -384,8 +384,8 @@ class Loader():
try:
project = Project(project_dir, self.context, junction=element)
except LoadError as e:
- if e.reason == LoadErrorReason.MISSING_FILE:
- raise LoadError(reason=e.reason,
+ if e.reason == LoadErrorReason.MISSING_PROJECT_CONF:
+ raise LoadError(reason=LoadErrorReason.INVALID_JUNCTION,
message="Could not find the project.conf file for {}. "
"Expecting a project at path '{}' within {}"
.format(element, element.path or '.', source)) from e
diff --git a/buildstream/_project.py b/buildstream/_project.py
index c7f535e23..e71bdf0f1 100644
--- a/buildstream/_project.py
+++ b/buildstream/_project.py
@@ -214,7 +214,12 @@ class Project():
config = _yaml.load(_site.default_project_config)
# Load project local config and override the builtin
- project_conf = _yaml.load(projectfile)
+ try:
+ project_conf = _yaml.load(projectfile)
+ except LoadError as e:
+ # Raise a more specific error here
+ raise LoadError(LoadErrorReason.MISSING_PROJECT_CONF, str(e))
+
_yaml.composite(config, project_conf)
# Element and Source type configurations will be composited later onto
diff --git a/tests/format/project.py b/tests/format/project.py
index cfa02bd52..b8e411351 100644
--- a/tests/format/project.py
+++ b/tests/format/project.py
@@ -16,7 +16,7 @@ DATA_DIR = os.path.join(
def test_missing_project_conf(cli, datafiles):
project = os.path.join(datafiles.dirname, datafiles.basename)
result = cli.run(project=project, args=['workspace', 'list'])
- result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_FILE)
+ result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_PROJECT_CONF)
@pytest.mark.datafiles(os.path.join(DATA_DIR))