We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
query_config --component not working for E3SM
output from scripts_regression_tests:
```
======================================================================
ERROR: test_query_components (__main__.X_TestQueryConfig)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./scripts_regression_tests.py", line 1452, in test_query_components
    run_cmd_no_fail("{}/query_config --components".format(SCRIPT_DIR))
  File "/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests/../lib/CIME/utils.py", line 424, in run_cmd_no_fail
    expect(False, "Command: '{}' failed with error '{}' from dir '{}'".format(cmd, errput.encode('utf-8'), os.getcwd() if from_dir is None else from_dir))
  File "/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests/../lib/CIME/utils.py", line 112, in expect
    raise exc_type(msg)
SystemExit: ERROR: Command: '/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/query_config --components' failed with error 'ERROR: Expected one child' from dir '/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests'
```



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `scripts/lib/CIME/XML/files.py`
Content:
```
1 """
2 Interface to the config_files.xml file.  This class inherits from EntryID.py
3 """
4 import re
5 from CIME.XML.standard_module_setup import *
6 
7 from CIME.XML.entry_id import EntryID
8 from CIME.utils import expect, get_cime_root, get_model
9 
10 logger = logging.getLogger(__name__)
11 
12 class Files(EntryID):
13 
14     def __init__(self):
15         """
16         initialize an object
17 
18         >>> files = Files()
19         >>> files.get_value('CASEFILE_HEADERS',resolved=False)
20         '$CIMEROOT/config/config_headers.xml'
21         """
22         cimeroot = get_cime_root()
23         infile = os.path.join(cimeroot, "config", get_model(), "config_files.xml")
24         expect(os.path.isfile(infile), "Could not find or open file {}".format(infile))
25         schema = os.path.join(cimeroot, "config", "xml_schemas", "entry_id.xsd")
26         EntryID.__init__(self, infile, schema=schema)
27         config_files_override = os.path.join(os.path.dirname(cimeroot),".config_files.xml")
28         # variables COMP_ROOT_DIR_{} are mutable, all other variables are read only
29         self.COMP_ROOT_DIR = {}
30 
31         # .config_file.xml at the top level may overwrite COMP_ROOT_DIR_ nodes in config_files
32 
33         if os.path.isfile(config_files_override):
34             self.read(config_files_override)
35             self.overwrite_existing_entries()
36 
37     def get_value(self, vid, attribute=None, resolved=True, subgroup=None):
38         if "COMP_ROOT_DIR" in vid:
39             if vid in self.COMP_ROOT_DIR:
40                 if attribute is not None:
41                     if vid+attribute["component"] in self.COMP_ROOT_DIR:
42                         return self.COMP_ROOT_DIR[vid+attribute["component"]]
43                 else:
44                     return self.COMP_ROOT_DIR[vid]
45 
46         value = super(Files, self).get_value(vid, attribute=attribute, resolved=False, subgroup=subgroup)
47         if value is None and attribute is not None:
48             value = super(Files, self).get_value(vid, attribute=None, resolved=False, subgroup=subgroup)
49 
50         if "COMP_ROOT_DIR" not in vid and value is not None and "COMP_ROOT_DIR" in value:
51             m = re.search("(COMP_ROOT_DIR_[^/]+)/", value)
52             comp_root_dir_var_name = m.group(1)
53             comp_root_dir = self.get_value(comp_root_dir_var_name, attribute=attribute, resolved=False, subgroup=subgroup)
54             self.set_value(comp_root_dir_var_name, comp_root_dir,subgroup=attribute)
55             if resolved:
56                 value = value.replace("$"+comp_root_dir_var_name, comp_root_dir)
57 
58 
59         if resolved and value is not None:
60             value = self.get_resolved_value(value)
61 
62         return value
63 
64     def set_value(self, vid, value,subgroup=None,ignore_type=False):
65         if "COMP_ROOT_DIR" in vid:
66             if subgroup is not None:
67                 self.COMP_ROOT_DIR[vid+subgroup["component"]] = value
68             else:
69                 self.COMP_ROOT_DIR[vid] = value
70                 
71         else:
72             expect(False, "Attempt to set a nonmutable variable {}".format(vid))
73         return value
74 
75 
76     def get_schema(self, nodename, attributes=None):
77         node = self.get_optional_child("entry", {"id":nodename})
78         schemanode = self.get_optional_child("schema", root=node, attributes=attributes)
79         if schemanode is not None:
80             logger.debug("Found schema for {}".format(nodename))
81             return self.get_resolved_value(self.text(schemanode))
82         return None
83 
84     def get_components(self, nodename):
85         node = self.get_child("entry", {"id":nodename})
86         valnodes = self.get_children("value", root=self.get_child("values", root=node))
87         values = []
88         for valnode in valnodes:
89             value = self.get(valnode, "component")
90             values.append(value)
91         return values
92
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/scripts/lib/CIME/XML/files.py b/scripts/lib/CIME/XML/files.py
--- a/scripts/lib/CIME/XML/files.py
+++ b/scripts/lib/CIME/XML/files.py
@@ -67,7 +67,7 @@
                 self.COMP_ROOT_DIR[vid+subgroup["component"]] = value
             else:
                 self.COMP_ROOT_DIR[vid] = value
-                
+
         else:
             expect(False, "Attempt to set a nonmutable variable {}".format(vid))
         return value
@@ -82,10 +82,13 @@
         return None
 
     def get_components(self, nodename):
-        node = self.get_child("entry", {"id":nodename})
-        valnodes = self.get_children("value", root=self.get_child("values", root=node))
-        values = []
-        for valnode in valnodes:
-            value = self.get(valnode, "component")
-            values.append(value)
-        return values
+        node = self.get_optional_child("entry", {"id":nodename})
+        if node is not None:
+            valnodes = self.get_children("value", root=self.get_child("values", root=node))
+            values = []
+            for valnode in valnodes:
+                value = self.get(valnode, "component")
+                values.append(value)
+            return values
+
+        return None

{"golden_diff": "diff --git a/scripts/lib/CIME/XML/files.py b/scripts/lib/CIME/XML/files.py\n--- a/scripts/lib/CIME/XML/files.py\n+++ b/scripts/lib/CIME/XML/files.py\n@@ -67,7 +67,7 @@\n                 self.COMP_ROOT_DIR[vid+subgroup[\"component\"]] = value\n             else:\n                 self.COMP_ROOT_DIR[vid] = value\n-                \n+\n         else:\n             expect(False, \"Attempt to set a nonmutable variable {}\".format(vid))\n         return value\n@@ -82,10 +82,13 @@\n         return None\n \n     def get_components(self, nodename):\n-        node = self.get_child(\"entry\", {\"id\":nodename})\n-        valnodes = self.get_children(\"value\", root=self.get_child(\"values\", root=node))\n-        values = []\n-        for valnode in valnodes:\n-            value = self.get(valnode, \"component\")\n-            values.append(value)\n-        return values\n+        node = self.get_optional_child(\"entry\", {\"id\":nodename})\n+        if node is not None:\n+            valnodes = self.get_children(\"value\", root=self.get_child(\"values\", root=node))\n+            values = []\n+            for valnode in valnodes:\n+                value = self.get(valnode, \"component\")\n+                values.append(value)\n+            return values\n+\n+        return None\n", "issue": "query_config --component not working for E3SM\noutput from scripts_regression_tests:\r\n```\r\n======================================================================\r\nERROR: test_query_components (__main__.X_TestQueryConfig)\r\n----------------------------------------------------------------------\r\nTraceback (most recent call last):\r\n  File \"./scripts_regression_tests.py\", line 1452, in test_query_components\r\n    run_cmd_no_fail(\"{}/query_config --components\".format(SCRIPT_DIR))\r\n  File \"/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests/../lib/CIME/utils.py\", line 424, in run_cmd_no_fail\r\n    expect(False, \"Command: '{}' failed with error '{}' from dir '{}'\".format(cmd, errput.encode('utf-8'), os.getcwd() if from_dir is None else from_dir))\r\n  File \"/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests/../lib/CIME/utils.py\", line 112, in expect\r\n    raise exc_type(msg)\r\nSystemExit: ERROR: Command: '/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/query_config --components' failed with error 'ERROR: Expected one child' from dir '/lcrc/group/earthscience/jacob/cimeESMCI2/scripts/tests'\r\n```\r\n\r\n\n", "before_files": [{"content": "\"\"\"\nInterface to the config_files.xml file.  This class inherits from EntryID.py\n\"\"\"\nimport re\nfrom CIME.XML.standard_module_setup import *\n\nfrom CIME.XML.entry_id import EntryID\nfrom CIME.utils import expect, get_cime_root, get_model\n\nlogger = logging.getLogger(__name__)\n\nclass Files(EntryID):\n\n    def __init__(self):\n        \"\"\"\n        initialize an object\n\n        >>> files = Files()\n        >>> files.get_value('CASEFILE_HEADERS',resolved=False)\n        '$CIMEROOT/config/config_headers.xml'\n        \"\"\"\n        cimeroot = get_cime_root()\n        infile = os.path.join(cimeroot, \"config\", get_model(), \"config_files.xml\")\n        expect(os.path.isfile(infile), \"Could not find or open file {}\".format(infile))\n        schema = os.path.join(cimeroot, \"config\", \"xml_schemas\", \"entry_id.xsd\")\n        EntryID.__init__(self, infile, schema=schema)\n        config_files_override = os.path.join(os.path.dirname(cimeroot),\".config_files.xml\")\n        # variables COMP_ROOT_DIR_{} are mutable, all other variables are read only\n        self.COMP_ROOT_DIR = {}\n\n        # .config_file.xml at the top level may overwrite COMP_ROOT_DIR_ nodes in config_files\n\n        if os.path.isfile(config_files_override):\n            self.read(config_files_override)\n            self.overwrite_existing_entries()\n\n    def get_value(self, vid, attribute=None, resolved=True, subgroup=None):\n        if \"COMP_ROOT_DIR\" in vid:\n            if vid in self.COMP_ROOT_DIR:\n                if attribute is not None:\n                    if vid+attribute[\"component\"] in self.COMP_ROOT_DIR:\n                        return self.COMP_ROOT_DIR[vid+attribute[\"component\"]]\n                else:\n                    return self.COMP_ROOT_DIR[vid]\n\n        value = super(Files, self).get_value(vid, attribute=attribute, resolved=False, subgroup=subgroup)\n        if value is None and attribute is not None:\n            value = super(Files, self).get_value(vid, attribute=None, resolved=False, subgroup=subgroup)\n\n        if \"COMP_ROOT_DIR\" not in vid and value is not None and \"COMP_ROOT_DIR\" in value:\n            m = re.search(\"(COMP_ROOT_DIR_[^/]+)/\", value)\n            comp_root_dir_var_name = m.group(1)\n            comp_root_dir = self.get_value(comp_root_dir_var_name, attribute=attribute, resolved=False, subgroup=subgroup)\n            self.set_value(comp_root_dir_var_name, comp_root_dir,subgroup=attribute)\n            if resolved:\n                value = value.replace(\"$\"+comp_root_dir_var_name, comp_root_dir)\n\n\n        if resolved and value is not None:\n            value = self.get_resolved_value(value)\n\n        return value\n\n    def set_value(self, vid, value,subgroup=None,ignore_type=False):\n        if \"COMP_ROOT_DIR\" in vid:\n            if subgroup is not None:\n                self.COMP_ROOT_DIR[vid+subgroup[\"component\"]] = value\n            else:\n                self.COMP_ROOT_DIR[vid] = value\n                \n        else:\n            expect(False, \"Attempt to set a nonmutable variable {}\".format(vid))\n        return value\n\n\n    def get_schema(self, nodename, attributes=None):\n        node = self.get_optional_child(\"entry\", {\"id\":nodename})\n        schemanode = self.get_optional_child(\"schema\", root=node, attributes=attributes)\n        if schemanode is not None:\n            logger.debug(\"Found schema for {}\".format(nodename))\n            return self.get_resolved_value(self.text(schemanode))\n        return None\n\n    def get_components(self, nodename):\n        node = self.get_child(\"entry\", {\"id\":nodename})\n        valnodes = self.get_children(\"value\", root=self.get_child(\"values\", root=node))\n        values = []\n        for valnode in valnodes:\n            value = self.get(valnode, \"component\")\n            values.append(value)\n        return values\n", "path": "scripts/lib/CIME/XML/files.py"}], "after_files": [{"content": "\"\"\"\nInterface to the config_files.xml file.  This class inherits from EntryID.py\n\"\"\"\nimport re\nfrom CIME.XML.standard_module_setup import *\n\nfrom CIME.XML.entry_id import EntryID\nfrom CIME.utils import expect, get_cime_root, get_model\n\nlogger = logging.getLogger(__name__)\n\nclass Files(EntryID):\n\n    def __init__(self):\n        \"\"\"\n        initialize an object\n\n        >>> files = Files()\n        >>> files.get_value('CASEFILE_HEADERS',resolved=False)\n        '$CIMEROOT/config/config_headers.xml'\n        \"\"\"\n        cimeroot = get_cime_root()\n        infile = os.path.join(cimeroot, \"config\", get_model(), \"config_files.xml\")\n        expect(os.path.isfile(infile), \"Could not find or open file {}\".format(infile))\n        schema = os.path.join(cimeroot, \"config\", \"xml_schemas\", \"entry_id.xsd\")\n        EntryID.__init__(self, infile, schema=schema)\n        config_files_override = os.path.join(os.path.dirname(cimeroot),\".config_files.xml\")\n        # variables COMP_ROOT_DIR_{} are mutable, all other variables are read only\n        self.COMP_ROOT_DIR = {}\n\n        # .config_file.xml at the top level may overwrite COMP_ROOT_DIR_ nodes in config_files\n\n        if os.path.isfile(config_files_override):\n            self.read(config_files_override)\n            self.overwrite_existing_entries()\n\n    def get_value(self, vid, attribute=None, resolved=True, subgroup=None):\n        if \"COMP_ROOT_DIR\" in vid:\n            if vid in self.COMP_ROOT_DIR:\n                if attribute is not None:\n                    if vid+attribute[\"component\"] in self.COMP_ROOT_DIR:\n                        return self.COMP_ROOT_DIR[vid+attribute[\"component\"]]\n                else:\n                    return self.COMP_ROOT_DIR[vid]\n\n        value = super(Files, self).get_value(vid, attribute=attribute, resolved=False, subgroup=subgroup)\n        if value is None and attribute is not None:\n            value = super(Files, self).get_value(vid, attribute=None, resolved=False, subgroup=subgroup)\n\n        if \"COMP_ROOT_DIR\" not in vid and value is not None and \"COMP_ROOT_DIR\" in value:\n            m = re.search(\"(COMP_ROOT_DIR_[^/]+)/\", value)\n            comp_root_dir_var_name = m.group(1)\n            comp_root_dir = self.get_value(comp_root_dir_var_name, attribute=attribute, resolved=False, subgroup=subgroup)\n            self.set_value(comp_root_dir_var_name, comp_root_dir,subgroup=attribute)\n            if resolved:\n                value = value.replace(\"$\"+comp_root_dir_var_name, comp_root_dir)\n\n\n        if resolved and value is not None:\n            value = self.get_resolved_value(value)\n\n        return value\n\n    def set_value(self, vid, value,subgroup=None,ignore_type=False):\n        if \"COMP_ROOT_DIR\" in vid:\n            if subgroup is not None:\n                self.COMP_ROOT_DIR[vid+subgroup[\"component\"]] = value\n            else:\n                self.COMP_ROOT_DIR[vid] = value\n\n        else:\n            expect(False, \"Attempt to set a nonmutable variable {}\".format(vid))\n        return value\n\n\n    def get_schema(self, nodename, attributes=None):\n        node = self.get_optional_child(\"entry\", {\"id\":nodename})\n        schemanode = self.get_optional_child(\"schema\", root=node, attributes=attributes)\n        if schemanode is not None:\n            logger.debug(\"Found schema for {}\".format(nodename))\n            return self.get_resolved_value(self.text(schemanode))\n        return None\n\n    def get_components(self, nodename):\n        node = self.get_optional_child(\"entry\", {\"id\":nodename})\n        if node is not None:\n            valnodes = self.get_children(\"value\", root=self.get_child(\"values\", root=node))\n            values = []\n            for valnode in valnodes:\n                value = self.get(valnode, \"component\")\n                values.append(value)\n            return values\n\n        return None\n", "path": "scripts/lib/CIME/XML/files.py"}]}