We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[suggestion] Search custom sub-settings
To help us debug your issue please explain:

From slack discussion: https://cpplang.slack.com/archives/C41CWV9HA/p1560980070212900

For now `conan search` is only able to look regular settings, as `os`, `arch`, `build_type` and `compiler`, but it's limited in terms of customized settings, for example:

```
$ conan search openssl/1.0.2s@ennor/stable -q "os=iOS"
Existing packages for recipe openssl/1.0.2s@ennor/stable:
    Package_ID: 08859e5949c46fd78bb8b4d045f854329c141a56
        [settings]
            build_type: Release
            compiler: apple-clang
            compiler.version: 10.0
            os: iOS
            os.version: 10.0
        Outdated from recipe: False
    Package_ID: 5d2c60a906ecd568347527895bc32e4890264eea
        [settings]
            build_type: Debug
            compiler: apple-clang
            compiler.version: 10.0
            os: iOS
            os.version: 10.0
        Outdated from recipe: False

$ conan search openssl/1.0.2s@ennor/stable -q "os.version=10.0"
Existing packages for recipe openssl/1.0.2s@ennor/stable:

There are no packages for reference 'openssl/1.0.2s@ennor/stable' matching the query 'os.version=10.0'

conan search openssl/1.0.2s@ennor/stable -q "os=iOS AND os.version=10.0"
Existing packages for recipe openssl/1.0.2s@ennor/stable:

There are no packages for reference 'openssl/1.0.2s@ennor/stable' matching the query 'os=iOS AND os.version=10.0'
```

The command `search` is limited because the rule:

https://github.com/conan-io/conan/blob/df8fd41b63ee3054fe1160ded5e52e19c0a933c3/conans/search/search.py#L85

The suggestion is supporting custom settings, or sub-settings at least.

Regards!

/cc @Minimonium @Paultergeist

- [x] I've read the [CONTRIBUTING guide](https://github.com/conan-io/conan/blob/develop/.github/CONTRIBUTING.md).
- [ ] I've specified the Conan version, operating system version and any tool that can be relevant.
- [x] I've explained the steps to reproduce the error or the motivation/use case of the question/suggestion.



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `conans/search/search.py`
Content:
```
1 import os
2 import re
3 from collections import OrderedDict
4 from fnmatch import translate
5 
6 from conans.errors import ConanException, RecipeNotFoundException
7 from conans.model.info import ConanInfo
8 from conans.model.ref import ConanFileReference, PackageReference
9 from conans.paths import CONANINFO
10 from conans.search.query_parse import evaluate_postfix, infix_to_postfix
11 from conans.util.files import list_folder_subdirs, load
12 from conans.util.log import logger
13 
14 
15 def filter_outdated(packages_infos, recipe_hash):
16     if not recipe_hash:
17         return packages_infos
18     result = OrderedDict()
19     for package_id, info in packages_infos.items():
20         try:  # Existing package_info of old package might not have recipe_hash
21             if info["recipe_hash"] != recipe_hash:
22                 result[package_id] = info
23         except KeyError:
24             pass
25     return result
26 
27 
28 def filter_by_revision(metadata, packages_infos):
29     ok = OrderedDict()
30     recipe_revision = metadata.recipe.revision
31     for package_id, info in packages_infos.items():
32         try:
33             rec_rev = metadata.packages[package_id].recipe_revision
34             if rec_rev == recipe_revision:
35                 ok[package_id] = info
36         except KeyError:
37             pass
38     return ok
39 
40 
41 def filter_packages(query, package_infos):
42     if query is None:
43         return package_infos
44     try:
45         if "!" in query:
46             raise ConanException("'!' character is not allowed")
47         if " not " in query or query.startswith("not "):
48             raise ConanException("'not' operator is not allowed")
49         postfix = infix_to_postfix(query) if query else []
50         result = OrderedDict()
51         for package_id, info in package_infos.items():
52             if evaluate_postfix_with_info(postfix, info):
53                 result[package_id] = info
54         return result
55     except Exception as exc:
56         raise ConanException("Invalid package query: %s. %s" % (query, exc))
57 
58 
59 def evaluate_postfix_with_info(postfix, conan_vars_info):
60 
61     # Evaluate conaninfo with the expression
62 
63     def evaluate_info(expression):
64         """Receives an expression like compiler.version="12"
65         Uses conan_vars_info in the closure to evaluate it"""
66         name, value = expression.split("=", 1)
67         value = value.replace("\"", "")
68         return evaluate(name, value, conan_vars_info)
69 
70     return evaluate_postfix(postfix, evaluate_info)
71 
72 
73 def evaluate(prop_name, prop_value, conan_vars_info):
74     """
75     Evaluates a single prop_name, prop_value like "os", "Windows" against
76     conan_vars_info.serialize_min()
77     """
78 
79     def compatible_prop(setting_value, prop_value):
80         return (prop_value == setting_value) or (prop_value == "None" and setting_value is None)
81 
82     info_settings = conan_vars_info.get("settings", [])
83     info_options = conan_vars_info.get("options", [])
84 
85     if (prop_name in ["os", "os_build", "compiler", "arch", "arch_build", "build_type"] or
86             prop_name.startswith("compiler.")):
87         return compatible_prop(info_settings.get(prop_name, None), prop_value)
88     else:
89         return compatible_prop(info_options.get(prop_name, None), prop_value)
90 
91 
92 def search_recipes(cache, pattern=None, ignorecase=True):
93     # Conan references in main storage
94     if pattern:
95         if isinstance(pattern, ConanFileReference):
96             pattern = str(pattern)
97         pattern = translate(pattern)
98         pattern = re.compile(pattern, re.IGNORECASE) if ignorecase else re.compile(pattern)
99 
100     subdirs = list_folder_subdirs(basedir=cache.store, level=4)
101     refs = [ConanFileReference(*folder.split("/")) for folder in subdirs]
102     refs.extend(cache.editable_packages.edited_refs.keys())
103     if pattern:
104         refs = [r for r in refs if _partial_match(pattern, r)]
105     refs = sorted(refs)
106     return refs
107 
108 
109 def _partial_match(pattern, ref):
110     """
111     Finds if pattern matches any of partial sums of tokens of conan reference
112     """
113     tokens = str(ref).replace('/', ' / ').replace('@', ' @ ').replace('#', ' # ').split()
114 
115     def partial_sums(iterable):
116         partial = ''
117         for i in iterable:
118             partial += i
119             yield partial
120 
121     return any(map(pattern.match, list(partial_sums(tokens))))
122 
123 
124 def search_packages(package_layout, query):
125     """ Return a dict like this:
126 
127             {package_ID: {name: "OpenCV",
128                            version: "2.14",
129                            settings: {os: Windows}}}
130     param package_layout: Layout for the given reference
131     """
132     if not os.path.exists(package_layout.base_folder()) or (
133             package_layout.ref.revision and
134             package_layout.recipe_revision() != package_layout.ref.revision):
135         raise RecipeNotFoundException(package_layout.ref, print_rev=True)
136     infos = _get_local_infos_min(package_layout)
137     return filter_packages(query, infos)
138 
139 
140 def _get_local_infos_min(package_layout):
141     result = OrderedDict()
142 
143     packages_path = package_layout.packages()
144     subdirs = list_folder_subdirs(packages_path, level=1)
145     for package_id in subdirs:
146         # Read conaninfo
147         pref = PackageReference(package_layout.ref, package_id)
148         info_path = os.path.join(package_layout.package(pref), CONANINFO)
149         if not os.path.exists(info_path):
150             logger.error("There is no ConanInfo: %s" % str(info_path))
151             continue
152         conan_info_content = load(info_path)
153 
154         info = ConanInfo.loads(conan_info_content)
155         if package_layout.ref.revision:
156             metadata = package_layout.load_metadata()
157             recipe_revision = metadata.packages[package_id].recipe_revision
158             if recipe_revision and recipe_revision != package_layout.ref.revision:
159                 continue
160         conan_vars_info = info.serialize_min()
161         result[package_id] = conan_vars_info
162 
163     return result
164
```
--- 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/conans/search/search.py b/conans/search/search.py
--- a/conans/search/search.py
+++ b/conans/search/search.py
@@ -81,9 +81,16 @@
 
     info_settings = conan_vars_info.get("settings", [])
     info_options = conan_vars_info.get("options", [])
+    properties = ["os", "os_build", "compiler", "arch", "arch_build", "build_type"]
 
-    if (prop_name in ["os", "os_build", "compiler", "arch", "arch_build", "build_type"] or
-            prop_name.startswith("compiler.")):
+    def starts_with_common_settings(prop_name):
+        for setting in properties:
+            if prop_name.startswith(setting + '.'):
+                return True
+        return False
+
+    if (prop_name in properties or
+            starts_with_common_settings(prop_name)):
         return compatible_prop(info_settings.get(prop_name, None), prop_value)
     else:
         return compatible_prop(info_options.get(prop_name, None), prop_value)

{"golden_diff": "diff --git a/conans/search/search.py b/conans/search/search.py\n--- a/conans/search/search.py\n+++ b/conans/search/search.py\n@@ -81,9 +81,16 @@\n \n     info_settings = conan_vars_info.get(\"settings\", [])\n     info_options = conan_vars_info.get(\"options\", [])\n+    properties = [\"os\", \"os_build\", \"compiler\", \"arch\", \"arch_build\", \"build_type\"]\n \n-    if (prop_name in [\"os\", \"os_build\", \"compiler\", \"arch\", \"arch_build\", \"build_type\"] or\n-            prop_name.startswith(\"compiler.\")):\n+    def starts_with_common_settings(prop_name):\n+        for setting in properties:\n+            if prop_name.startswith(setting + '.'):\n+                return True\n+        return False\n+\n+    if (prop_name in properties or\n+            starts_with_common_settings(prop_name)):\n         return compatible_prop(info_settings.get(prop_name, None), prop_value)\n     else:\n         return compatible_prop(info_options.get(prop_name, None), prop_value)\n", "issue": "[suggestion] Search custom sub-settings\nTo help us debug your issue please explain:\r\n\r\nFrom slack discussion: https://cpplang.slack.com/archives/C41CWV9HA/p1560980070212900\r\n\r\nFor now `conan search` is only able to look regular settings, as `os`, `arch`, `build_type` and `compiler`, but it's limited in terms of customized settings, for example:\r\n\r\n```\r\n$ conan search openssl/1.0.2s@ennor/stable -q \"os=iOS\"\r\nExisting packages for recipe openssl/1.0.2s@ennor/stable:\r\n    Package_ID: 08859e5949c46fd78bb8b4d045f854329c141a56\r\n        [settings]\r\n            build_type: Release\r\n            compiler: apple-clang\r\n            compiler.version: 10.0\r\n            os: iOS\r\n            os.version: 10.0\r\n        Outdated from recipe: False\r\n    Package_ID: 5d2c60a906ecd568347527895bc32e4890264eea\r\n        [settings]\r\n            build_type: Debug\r\n            compiler: apple-clang\r\n            compiler.version: 10.0\r\n            os: iOS\r\n            os.version: 10.0\r\n        Outdated from recipe: False\r\n\r\n$ conan search openssl/1.0.2s@ennor/stable -q \"os.version=10.0\"\r\nExisting packages for recipe openssl/1.0.2s@ennor/stable:\r\n\r\nThere are no packages for reference 'openssl/1.0.2s@ennor/stable' matching the query 'os.version=10.0'\r\n\r\nconan search openssl/1.0.2s@ennor/stable -q \"os=iOS AND os.version=10.0\"\r\nExisting packages for recipe openssl/1.0.2s@ennor/stable:\r\n\r\nThere are no packages for reference 'openssl/1.0.2s@ennor/stable' matching the query 'os=iOS AND os.version=10.0'\r\n```\r\n\r\nThe command `search` is limited because the rule:\r\n\r\nhttps://github.com/conan-io/conan/blob/df8fd41b63ee3054fe1160ded5e52e19c0a933c3/conans/search/search.py#L85\r\n\r\nThe suggestion is supporting custom settings, or sub-settings at least.\r\n\r\nRegards!\r\n\r\n/cc @Minimonium @Paultergeist\r\n\r\n- [x] I've read the [CONTRIBUTING guide](https://github.com/conan-io/conan/blob/develop/.github/CONTRIBUTING.md).\r\n- [ ] I've specified the Conan version, operating system version and any tool that can be relevant.\r\n- [x] I've explained the steps to reproduce the error or the motivation/use case of the question/suggestion.\r\n\r\n\n", "before_files": [{"content": "import os\nimport re\nfrom collections import OrderedDict\nfrom fnmatch import translate\n\nfrom conans.errors import ConanException, RecipeNotFoundException\nfrom conans.model.info import ConanInfo\nfrom conans.model.ref import ConanFileReference, PackageReference\nfrom conans.paths import CONANINFO\nfrom conans.search.query_parse import evaluate_postfix, infix_to_postfix\nfrom conans.util.files import list_folder_subdirs, load\nfrom conans.util.log import logger\n\n\ndef filter_outdated(packages_infos, recipe_hash):\n    if not recipe_hash:\n        return packages_infos\n    result = OrderedDict()\n    for package_id, info in packages_infos.items():\n        try:  # Existing package_info of old package might not have recipe_hash\n            if info[\"recipe_hash\"] != recipe_hash:\n                result[package_id] = info\n        except KeyError:\n            pass\n    return result\n\n\ndef filter_by_revision(metadata, packages_infos):\n    ok = OrderedDict()\n    recipe_revision = metadata.recipe.revision\n    for package_id, info in packages_infos.items():\n        try:\n            rec_rev = metadata.packages[package_id].recipe_revision\n            if rec_rev == recipe_revision:\n                ok[package_id] = info\n        except KeyError:\n            pass\n    return ok\n\n\ndef filter_packages(query, package_infos):\n    if query is None:\n        return package_infos\n    try:\n        if \"!\" in query:\n            raise ConanException(\"'!' character is not allowed\")\n        if \" not \" in query or query.startswith(\"not \"):\n            raise ConanException(\"'not' operator is not allowed\")\n        postfix = infix_to_postfix(query) if query else []\n        result = OrderedDict()\n        for package_id, info in package_infos.items():\n            if evaluate_postfix_with_info(postfix, info):\n                result[package_id] = info\n        return result\n    except Exception as exc:\n        raise ConanException(\"Invalid package query: %s. %s\" % (query, exc))\n\n\ndef evaluate_postfix_with_info(postfix, conan_vars_info):\n\n    # Evaluate conaninfo with the expression\n\n    def evaluate_info(expression):\n        \"\"\"Receives an expression like compiler.version=\"12\"\n        Uses conan_vars_info in the closure to evaluate it\"\"\"\n        name, value = expression.split(\"=\", 1)\n        value = value.replace(\"\\\"\", \"\")\n        return evaluate(name, value, conan_vars_info)\n\n    return evaluate_postfix(postfix, evaluate_info)\n\n\ndef evaluate(prop_name, prop_value, conan_vars_info):\n    \"\"\"\n    Evaluates a single prop_name, prop_value like \"os\", \"Windows\" against\n    conan_vars_info.serialize_min()\n    \"\"\"\n\n    def compatible_prop(setting_value, prop_value):\n        return (prop_value == setting_value) or (prop_value == \"None\" and setting_value is None)\n\n    info_settings = conan_vars_info.get(\"settings\", [])\n    info_options = conan_vars_info.get(\"options\", [])\n\n    if (prop_name in [\"os\", \"os_build\", \"compiler\", \"arch\", \"arch_build\", \"build_type\"] or\n            prop_name.startswith(\"compiler.\")):\n        return compatible_prop(info_settings.get(prop_name, None), prop_value)\n    else:\n        return compatible_prop(info_options.get(prop_name, None), prop_value)\n\n\ndef search_recipes(cache, pattern=None, ignorecase=True):\n    # Conan references in main storage\n    if pattern:\n        if isinstance(pattern, ConanFileReference):\n            pattern = str(pattern)\n        pattern = translate(pattern)\n        pattern = re.compile(pattern, re.IGNORECASE) if ignorecase else re.compile(pattern)\n\n    subdirs = list_folder_subdirs(basedir=cache.store, level=4)\n    refs = [ConanFileReference(*folder.split(\"/\")) for folder in subdirs]\n    refs.extend(cache.editable_packages.edited_refs.keys())\n    if pattern:\n        refs = [r for r in refs if _partial_match(pattern, r)]\n    refs = sorted(refs)\n    return refs\n\n\ndef _partial_match(pattern, ref):\n    \"\"\"\n    Finds if pattern matches any of partial sums of tokens of conan reference\n    \"\"\"\n    tokens = str(ref).replace('/', ' / ').replace('@', ' @ ').replace('#', ' # ').split()\n\n    def partial_sums(iterable):\n        partial = ''\n        for i in iterable:\n            partial += i\n            yield partial\n\n    return any(map(pattern.match, list(partial_sums(tokens))))\n\n\ndef search_packages(package_layout, query):\n    \"\"\" Return a dict like this:\n\n            {package_ID: {name: \"OpenCV\",\n                           version: \"2.14\",\n                           settings: {os: Windows}}}\n    param package_layout: Layout for the given reference\n    \"\"\"\n    if not os.path.exists(package_layout.base_folder()) or (\n            package_layout.ref.revision and\n            package_layout.recipe_revision() != package_layout.ref.revision):\n        raise RecipeNotFoundException(package_layout.ref, print_rev=True)\n    infos = _get_local_infos_min(package_layout)\n    return filter_packages(query, infos)\n\n\ndef _get_local_infos_min(package_layout):\n    result = OrderedDict()\n\n    packages_path = package_layout.packages()\n    subdirs = list_folder_subdirs(packages_path, level=1)\n    for package_id in subdirs:\n        # Read conaninfo\n        pref = PackageReference(package_layout.ref, package_id)\n        info_path = os.path.join(package_layout.package(pref), CONANINFO)\n        if not os.path.exists(info_path):\n            logger.error(\"There is no ConanInfo: %s\" % str(info_path))\n            continue\n        conan_info_content = load(info_path)\n\n        info = ConanInfo.loads(conan_info_content)\n        if package_layout.ref.revision:\n            metadata = package_layout.load_metadata()\n            recipe_revision = metadata.packages[package_id].recipe_revision\n            if recipe_revision and recipe_revision != package_layout.ref.revision:\n                continue\n        conan_vars_info = info.serialize_min()\n        result[package_id] = conan_vars_info\n\n    return result\n", "path": "conans/search/search.py"}], "after_files": [{"content": "import os\nimport re\nfrom collections import OrderedDict\nfrom fnmatch import translate\n\nfrom conans.errors import ConanException, RecipeNotFoundException\nfrom conans.model.info import ConanInfo\nfrom conans.model.ref import ConanFileReference, PackageReference\nfrom conans.paths import CONANINFO\nfrom conans.search.query_parse import evaluate_postfix, infix_to_postfix\nfrom conans.util.files import list_folder_subdirs, load\nfrom conans.util.log import logger\n\n\ndef filter_outdated(packages_infos, recipe_hash):\n    if not recipe_hash:\n        return packages_infos\n    result = OrderedDict()\n    for package_id, info in packages_infos.items():\n        try:  # Existing package_info of old package might not have recipe_hash\n            if info[\"recipe_hash\"] != recipe_hash:\n                result[package_id] = info\n        except KeyError:\n            pass\n    return result\n\n\ndef filter_by_revision(metadata, packages_infos):\n    ok = OrderedDict()\n    recipe_revision = metadata.recipe.revision\n    for package_id, info in packages_infos.items():\n        try:\n            rec_rev = metadata.packages[package_id].recipe_revision\n            if rec_rev == recipe_revision:\n                ok[package_id] = info\n        except KeyError:\n            pass\n    return ok\n\n\ndef filter_packages(query, package_infos):\n    if query is None:\n        return package_infos\n    try:\n        if \"!\" in query:\n            raise ConanException(\"'!' character is not allowed\")\n        if \" not \" in query or query.startswith(\"not \"):\n            raise ConanException(\"'not' operator is not allowed\")\n        postfix = infix_to_postfix(query) if query else []\n        result = OrderedDict()\n        for package_id, info in package_infos.items():\n            if evaluate_postfix_with_info(postfix, info):\n                result[package_id] = info\n        return result\n    except Exception as exc:\n        raise ConanException(\"Invalid package query: %s. %s\" % (query, exc))\n\n\ndef evaluate_postfix_with_info(postfix, conan_vars_info):\n\n    # Evaluate conaninfo with the expression\n\n    def evaluate_info(expression):\n        \"\"\"Receives an expression like compiler.version=\"12\"\n        Uses conan_vars_info in the closure to evaluate it\"\"\"\n        name, value = expression.split(\"=\", 1)\n        value = value.replace(\"\\\"\", \"\")\n        return evaluate(name, value, conan_vars_info)\n\n    return evaluate_postfix(postfix, evaluate_info)\n\n\ndef evaluate(prop_name, prop_value, conan_vars_info):\n    \"\"\"\n    Evaluates a single prop_name, prop_value like \"os\", \"Windows\" against\n    conan_vars_info.serialize_min()\n    \"\"\"\n\n    def compatible_prop(setting_value, prop_value):\n        return (prop_value == setting_value) or (prop_value == \"None\" and setting_value is None)\n\n    info_settings = conan_vars_info.get(\"settings\", [])\n    info_options = conan_vars_info.get(\"options\", [])\n    properties = [\"os\", \"os_build\", \"compiler\", \"arch\", \"arch_build\", \"build_type\"]\n\n    def starts_with_common_settings(prop_name):\n        for setting in properties:\n            if prop_name.startswith(setting + '.'):\n                return True\n        return False\n\n    if (prop_name in properties or\n            starts_with_common_settings(prop_name)):\n        return compatible_prop(info_settings.get(prop_name, None), prop_value)\n    else:\n        return compatible_prop(info_options.get(prop_name, None), prop_value)\n\n\ndef search_recipes(cache, pattern=None, ignorecase=True):\n    # Conan references in main storage\n    if pattern:\n        if isinstance(pattern, ConanFileReference):\n            pattern = str(pattern)\n        pattern = translate(pattern)\n        pattern = re.compile(pattern, re.IGNORECASE) if ignorecase else re.compile(pattern)\n\n    subdirs = list_folder_subdirs(basedir=cache.store, level=4)\n    refs = [ConanFileReference(*folder.split(\"/\")) for folder in subdirs]\n    refs.extend(cache.editable_packages.edited_refs.keys())\n    if pattern:\n        refs = [r for r in refs if _partial_match(pattern, r)]\n    refs = sorted(refs)\n    return refs\n\n\ndef _partial_match(pattern, ref):\n    \"\"\"\n    Finds if pattern matches any of partial sums of tokens of conan reference\n    \"\"\"\n    tokens = str(ref).replace('/', ' / ').replace('@', ' @ ').replace('#', ' # ').split()\n\n    def partial_sums(iterable):\n        partial = ''\n        for i in iterable:\n            partial += i\n            yield partial\n\n    return any(map(pattern.match, list(partial_sums(tokens))))\n\n\ndef search_packages(package_layout, query):\n    \"\"\" Return a dict like this:\n\n            {package_ID: {name: \"OpenCV\",\n                           version: \"2.14\",\n                           settings: {os: Windows}}}\n    param package_layout: Layout for the given reference\n    \"\"\"\n    if not os.path.exists(package_layout.base_folder()) or (\n            package_layout.ref.revision and\n            package_layout.recipe_revision() != package_layout.ref.revision):\n        raise RecipeNotFoundException(package_layout.ref, print_rev=True)\n    infos = _get_local_infos_min(package_layout)\n    return filter_packages(query, infos)\n\n\ndef _get_local_infos_min(package_layout):\n    result = OrderedDict()\n\n    packages_path = package_layout.packages()\n    subdirs = list_folder_subdirs(packages_path, level=1)\n    for package_id in subdirs:\n        # Read conaninfo\n        pref = PackageReference(package_layout.ref, package_id)\n        info_path = os.path.join(package_layout.package(pref), CONANINFO)\n        if not os.path.exists(info_path):\n            logger.error(\"There is no ConanInfo: %s\" % str(info_path))\n            continue\n        conan_info_content = load(info_path)\n\n        info = ConanInfo.loads(conan_info_content)\n        if package_layout.ref.revision:\n            metadata = package_layout.load_metadata()\n            recipe_revision = metadata.packages[package_id].recipe_revision\n            if recipe_revision and recipe_revision != package_layout.ref.revision:\n                continue\n        conan_vars_info = info.serialize_min()\n        result[package_id] = conan_vars_info\n\n    return result\n", "path": "conans/search/search.py"}]}