From dcd8d7a620ad247daf0da771ea22859f9e651ca6 Mon Sep 17 00:00:00 2001
From: "Adam J. Stewart" <ajstewart426@gmail.com>
Date: Fri, 24 Jan 2020 19:28:20 -0600
Subject: [PATCH] Add spack config list command for tab completion (#14474)

* Add spack config list command for tab completion
* Update tab completion scripts
---
 lib/spack/spack/cmd/config.py        | 21 ++++++++++++++++-----
 lib/spack/spack/test/cmd/config.py   |  6 ++++++
 share/spack/bash/spack-completion.in |  2 +-
 share/spack/spack-completion.bash    |  8 ++++++--
 4 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py
index b6055a7f6b..b1a6454555 100644
--- a/lib/spack/spack/cmd/config.py
+++ b/lib/spack/spack/cmd/config.py
@@ -56,6 +56,8 @@ def setup_parser(subparser):
         '--print-file', action='store_true',
         help="print the file name that would be edited")
 
+    sp.add_parser('list', help='list configuration sections')
+
 
 def _get_scope_and_section(args):
     """Extract config scope and section from arguments."""
@@ -83,7 +85,6 @@ def config_get(args):
 
     With no arguments and an active environment, print the contents of
     the environment's manifest file (spack.yaml).
-
     """
     scope, section = _get_scope_and_section(args)
 
@@ -113,7 +114,6 @@ def config_edit(args):
 
     With no arguments and an active environment, edit the spack.yaml for
     the active environment.
-
     """
     scope, section = _get_scope_and_section(args)
     if not scope and not section:
@@ -127,8 +127,19 @@ def config_edit(args):
         editor(config_file)
 
 
+def config_list(args):
+    """List the possible configuration sections.
+
+    Used primarily for shell tab completion scripts.
+    """
+    print(' '.join(list(spack.config.section_schemas)))
+
+
 def config(parser, args):
-    action = {'get': config_get,
-              'blame': config_blame,
-              'edit': config_edit}
+    action = {
+        'get': config_get,
+        'blame': config_blame,
+        'edit': config_edit,
+        'list': config_list,
+    }
     action[args.config_command](args)
diff --git a/lib/spack/spack/test/cmd/config.py b/lib/spack/spack/test/cmd/config.py
index 34982d46b3..82a9d814ea 100644
--- a/lib/spack/spack/test/cmd/config.py
+++ b/lib/spack/spack/test/cmd/config.py
@@ -91,3 +91,9 @@ def test_config_edit_fails_correctly_with_no_env(mutable_mock_env_path):
 def test_config_get_fails_correctly_with_no_env(mutable_mock_env_path):
     output = config('get', fail_on_error=False)
     assert "requires a section argument or an active environment" in output
+
+
+def test_config_list():
+    output = config('list')
+    assert 'compilers' in output
+    assert 'packages' in output
diff --git a/share/spack/bash/spack-completion.in b/share/spack/bash/spack-completion.in
index 2ab39a57a3..ca15b8dfb2 100755
--- a/share/spack/bash/spack-completion.in
+++ b/share/spack/bash/spack-completion.in
@@ -218,7 +218,7 @@ _keys() {
 _config_sections() {
     if [[ -z "${SPACK_CONFIG_SECTIONS:-}" ]]
     then
-        SPACK_CONFIG_SECTIONS="compilers mirrors repos packages modules config upstreams"
+        SPACK_CONFIG_SECTIONS="$(spack config list)"
     fi
     SPACK_COMPREPLY="$SPACK_CONFIG_SECTIONS"
 }
diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash
index 9550137bff..20a5d936ea 100755
--- a/share/spack/spack-completion.bash
+++ b/share/spack/spack-completion.bash
@@ -218,7 +218,7 @@ _keys() {
 _config_sections() {
     if [[ -z "${SPACK_CONFIG_SECTIONS:-}" ]]
     then
-        SPACK_CONFIG_SECTIONS="compilers mirrors repos packages modules config upstreams"
+        SPACK_CONFIG_SECTIONS="$(spack config list)"
     fi
     SPACK_COMPREPLY="$SPACK_CONFIG_SECTIONS"
 }
@@ -584,7 +584,7 @@ _spack_config() {
     then
         SPACK_COMPREPLY="-h --help --scope"
     else
-        SPACK_COMPREPLY="get blame edit"
+        SPACK_COMPREPLY="get blame edit list"
     fi
 }
 
@@ -615,6 +615,10 @@ _spack_config_edit() {
     fi
 }
 
+_spack_config_list() {
+    SPACK_COMPREPLY="-h --help"
+}
+
 _spack_configure() {
     if $list_options
     then
-- 
GitLab