summaryrefslogtreecommitdiff
path: root/buildstream/_project.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildstream/_project.py')
-rw-r--r--buildstream/_project.py37
1 files changed, 29 insertions, 8 deletions
diff --git a/buildstream/_project.py b/buildstream/_project.py
index 87f14ee0d..54ec9ee34 100644
--- a/buildstream/_project.py
+++ b/buildstream/_project.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python3
#
# Copyright (C) 2016-2018 Codethink Limited
#
@@ -34,12 +33,14 @@ from ._elementfactory import ElementFactory
from ._sourcefactory import SourceFactory
from ._projectrefs import ProjectRefs, ProjectRefStorage
from ._versions import BST_FORMAT_VERSION
-from ._workspaces import Workspaces
# The separator we use for user specified aliases
_ALIAS_SEPARATOR = ':'
+# Project Configuration file
+_PROJECT_CONF_FILE = 'project.conf'
+
# HostMount()
#
@@ -75,7 +76,7 @@ class Project():
self.name = None
# The project directory
- self.directory = os.path.abspath(directory)
+ self.directory = self._ensure_project_dir(directory)
# Absolute path to where elements are loaded from within the project
self.element_path = None
@@ -84,7 +85,6 @@ class Project():
self.refs = ProjectRefs(self.directory, 'project.refs')
self.junction_refs = ProjectRefs(self.directory, 'junction.refs')
- self.workspaces = None # Workspaces
self.options = None # OptionPool
self.junction = junction # The junction Element object, if this is a subproject
self.fail_on_overlap = False # Whether overlaps are treated as errors
@@ -211,7 +211,7 @@ class Project():
def _load(self):
# Load builtin default
- projectfile = os.path.join(self.directory, "project.conf")
+ projectfile = os.path.join(self.directory, _PROJECT_CONF_FILE)
config = _yaml.load(_site.default_project_config)
# Load project local config and override the builtin
@@ -298,9 +298,6 @@ class Project():
# Load artifacts pull/push configuration for this project
self.artifact_cache_specs = ArtifactCache.specs_from_config_node(config, self.directory)
- # Workspace configurations
- self.workspaces = Workspaces(self)
-
# Plugin origins and versions
origins = _yaml.node_get(config, list, 'plugins', default_value=[])
for origin in origins:
@@ -458,3 +455,27 @@ class Project():
# paths are passed in relative to the project, but must be absolute
origin_dict['path'] = os.path.join(self.directory, origin_dict['path'])
destination.append(origin_dict)
+
+ # _ensure_project_dir()
+ #
+ # Returns path of the project directory, if a configuration file is found
+ # in given directory or any of its parent directories.
+ #
+ # Args:
+ # directory (str) - directory from where the command was invoked
+ #
+ # Raises:
+ # LoadError if project.conf is not found
+ #
+ def _ensure_project_dir(self, directory):
+ directory = os.path.abspath(directory)
+ while not os.path.isfile(os.path.join(directory, _PROJECT_CONF_FILE)):
+ parent_dir = os.path.dirname(directory)
+ if directory == parent_dir:
+ raise LoadError(
+ LoadErrorReason.MISSING_PROJECT_CONF,
+ '{} not found in current directory or any of its parent directories'
+ .format(_PROJECT_CONF_FILE))
+ directory = parent_dir
+
+ return directory