From f03ed2d6158b4753b3e7293fd9c782c209b6277e Mon Sep 17 00:00:00 2001
From: Chandan Singh <csingh43@bloomberg.net>
Date: Wed, 26 Sep 2018 00:30:17 +0100
Subject: [PATCH] Ensure `--deps=none` option works for `bst checkout`

Currently, `bst checkout --deps none` command always produces empty
output. Fix this issue and add regression test for the same.

- element_enums.py: Add Scope.NONE.

- element.py: Ensure Scope.NONE works correctly in addition to
  Scope.RUN/Scope.ALL in Element.dependencies() and Element.search().

- tests/frontend/buildcheckout.py: Fix tests for `--deps none`.

Fixes #670.
---
 buildstream/element.py                        | 26 +++++++++++--------
 buildstream/types.py                          |  6 +++++
 tests/frontend/buildcheckout.py               | 20 ++++++--------
 .../project/elements/checkout-deps.bst        | 10 +++++++
 .../files/etc-files/etc/buildstream/config    |  1 +
 5 files changed, 40 insertions(+), 23 deletions(-)
 create mode 100644 tests/frontend/project/elements/checkout-deps.bst
 create mode 100644 tests/frontend/project/files/etc-files/etc/buildstream/config

diff --git a/buildstream/element.py b/buildstream/element.py
index 31ca5d3070..91ce177c6b 100644
--- a/buildstream/element.py
+++ b/buildstream/element.py
@@ -432,7 +432,7 @@ class Element(Plugin):
                                                 visited=visited, recursed=True)
 
         # Yeild self only at the end, after anything needed has been traversed
-        if should_yield and (recurse or recursed) and (scope in (Scope.ALL, Scope.RUN)):
+        if should_yield and (recurse or recursed) and scope != Scope.BUILD:
             yield self
 
     def search(self, scope, name):
@@ -1329,17 +1329,21 @@ class Element(Plugin):
                 if scope == Scope.BUILD:
                     self.stage(sandbox)
                 elif scope == Scope.RUN:
-                    # Stage deps in the sandbox root
                     if deps == 'run':
-                        with self.timed_activity("Staging dependencies", silent_nested=True):
-                            self.stage_dependency_artifacts(sandbox, scope)
-
-                        # Run any integration commands provided by the dependencies
-                        # once they are all staged and ready
-                        if integrate:
-                            with self.timed_activity("Integrating sandbox"):
-                                for dep in self.dependencies(scope):
-                                    dep.integrate(sandbox)
+                        dependency_scope = Scope.RUN
+                    else:
+                        dependency_scope = Scope.NONE
+
+                    # Stage deps in the sandbox root
+                    with self.timed_activity("Staging dependencies", silent_nested=True):
+                        self.stage_dependency_artifacts(sandbox, dependency_scope)
+
+                    # Run any integration commands provided by the dependencies
+                    # once they are all staged and ready
+                    if integrate:
+                        with self.timed_activity("Integrating sandbox"):
+                            for dep in self.dependencies(dependency_scope):
+                                dep.integrate(sandbox)
 
             yield sandbox
 
diff --git a/buildstream/types.py b/buildstream/types.py
index 7bc7a16641..3eb4a91105 100644
--- a/buildstream/types.py
+++ b/buildstream/types.py
@@ -48,6 +48,12 @@ class Scope(Enum):
     itself.
     """
 
+    NONE = 4
+    """Just the element itself, no dependencies.
+
+    *Since: 1.4*
+    """
+
 
 class Consistency():
     """Defines the various consistency states of a :class:`.Source`.
diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py
index a0b4617624..480eeadf92 100644
--- a/tests/frontend/buildcheckout.py
+++ b/tests/frontend/buildcheckout.py
@@ -65,9 +65,10 @@ def test_build_checkout(datafiles, cli, strict, hardlinks):
 def test_build_checkout_deps(datafiles, cli, deps):
     project = os.path.join(datafiles.dirname, datafiles.basename)
     checkout = os.path.join(cli.directory, 'checkout')
+    element_name = "checkout-deps.bst"
 
     # First build it
-    result = cli.run(project=project, args=['build', 'target.bst'])
+    result = cli.run(project=project, args=['build', element_name])
     result.assert_success()
 
     # Assert that after a successful build, the builddir is empty
@@ -76,20 +77,15 @@ def test_build_checkout_deps(datafiles, cli, deps):
     assert not os.listdir(builddir)
 
     # Now check it out
-    result = cli.run(project=project, args=['checkout', 'target.bst', '--deps', deps, checkout])
+    result = cli.run(project=project, args=['checkout', element_name, '--deps', deps, checkout])
     result.assert_success()
 
-    # Check that the executable hello file is found in the checkout
-    filename = os.path.join(checkout, 'usr', 'bin', 'hello')
-
-    if deps == "run":
-        assert os.path.exists(filename)
-    else:
-        assert not os.path.exists(filename)
-
-    # Check that the executable hello file is found in the checkout
-    filename = os.path.join(checkout, 'usr', 'include', 'pony.h')
+    # Verify output of this element
+    filename = os.path.join(checkout, 'etc', 'buildstream', 'config')
+    assert os.path.exists(filename)
 
+    # Verify output of this element's runtime dependencies
+    filename = os.path.join(checkout, 'usr', 'bin', 'hello')
     if deps == "run":
         assert os.path.exists(filename)
     else:
diff --git a/tests/frontend/project/elements/checkout-deps.bst b/tests/frontend/project/elements/checkout-deps.bst
new file mode 100644
index 0000000000..a2c1d93cc4
--- /dev/null
+++ b/tests/frontend/project/elements/checkout-deps.bst
@@ -0,0 +1,10 @@
+kind: import
+description: It is important for this element to have both build and runtime dependencies
+sources:
+- kind: local
+  path: files/etc-files
+depends:
+- filename: import-dev.bst
+  type: build
+- filename: import-bin.bst
+  type: runtime
diff --git a/tests/frontend/project/files/etc-files/etc/buildstream/config b/tests/frontend/project/files/etc-files/etc/buildstream/config
new file mode 100644
index 0000000000..04204c7c9d
--- /dev/null
+++ b/tests/frontend/project/files/etc-files/etc/buildstream/config
@@ -0,0 +1 @@
+config
-- 
GitLab