Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#5378 Search custom settings #5521

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 9 additions & 2 deletions conans/search/search.py
Expand Up @@ -81,9 +81,16 @@ def compatible_prop(setting_value, prop_value):

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)
Expand Down
80 changes: 70 additions & 10 deletions conans/test/functional/command/search_test.py
Expand Up @@ -61,6 +61,22 @@
d41d8cd98f00b204e9800998ecf8427e
''' # The recipe_hash correspond to the faked conanmanifests in export

conan_vars1d = '''
[settings]
arch=x86
arch.vendor=intel
os=Linux
os.distro=Ubuntu
os.distro.version=19.04
compiler=gcc
compiler.version=4.3
compiler.libcxx=libstdc++
libc=glibc
libc.version=2.29
[options]
use_Qt=True
'''

conan_vars2 = '''
[options]
use_OpenGL=True
Expand Down Expand Up @@ -131,6 +147,7 @@ def setUp(self):
root_folder3 = 'Bye/0.14/myuser/testing'
root_folder4 = 'NodeInfo/1.0.2/myuser/stable'
root_folder5 = 'MissFile/1.0.2/myuser/stable'
root_folder6 = 'Hello/1.5.10/myuser/testing'
root_folder11 = 'Hello/1.4.11/myuser/testing'
root_folder12 = 'Hello/1.4.12/myuser/testing'
root_folder_tool = 'Tool/1.0.0/myuser/testing'
Expand All @@ -151,6 +168,9 @@ def setUp(self):
"%s/%s/LinuxPackageSHA/%s" % (root_folder1,
PACKAGES_FOLDER,
CONANINFO): conan_vars1c,
"%s/%s/LinuxPackageCustom/%s" % (root_folder6,
PACKAGES_FOLDER,
CONANINFO): conan_vars1d,
"%s/%s/a44f541cd44w57/%s" % (root_folder2,
PACKAGES_FOLDER,
CONANINFO): conan_vars2,
Expand Down Expand Up @@ -193,6 +213,7 @@ def create_metadata(folder, pids):
create_metadata(root_folder3, ["e4f7vdwcv4w55d"])
create_metadata(root_folder4, ["e4f7vdwcv4w55d"])
create_metadata(root_folder5, ["e4f7vdwcv4w55d"])
create_metadata(root_folder6, ["LinuxPackageCustom"])
create_metadata(root_folder_tool, ["winx86", "winx64", "linx86", "linx64"])

# Fake some manifests to be able to calculate recipe hash
Expand All @@ -202,6 +223,7 @@ def create_metadata(folder, pids):
fake_manifest.save(os.path.join(self.client.cache.store, root_folder3, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder4, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder5, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder6, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder11, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder12, EXPORT_FOLDER))
fake_manifest.save(os.path.join(self.client.cache.store, root_folder_tool, EXPORT_FOLDER))
Expand All @@ -218,6 +240,7 @@ def check():
Hello/1.4.10@myuser/testing
Hello/1.4.11@myuser/testing
Hello/1.4.12@myuser/testing
Hello/1.5.10@myuser/testing
helloTest/1.4.10@myuser/stable""".format(remote)
self.assertIn(expected, self.client.out)

Expand All @@ -233,20 +256,23 @@ def recipe_search_test(self):
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n"
"helloTest/1.4.10@myuser/stable\n", self.client.out)

self.client.run("search Hello* --case-sensitive")
self.assertEqual("Existing package recipes:\n\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

self.client.run("search *myuser* --case-sensitive")
self.assertEqual("Existing package recipes:\n\n"
"Bye/0.14@myuser/testing\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n"
"MissFile/1.0.2@myuser/stable\n"
"NodeInfo/1.0.2@myuser/stable\n"
"Tool/1.0.0@myuser/testing\n"
Expand All @@ -255,26 +281,30 @@ def recipe_search_test(self):
self.client.run("search Hello/*@myuser/testing")
self.assertIn("Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

def search_partial_match_test(self):
self.client.run("search Hello")
self.assertEqual("Existing package recipes:\n\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

self.client.run("search hello")
self.assertEqual("Existing package recipes:\n\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

self.client.run("search Hello --case-sensitive")
self.assertEqual("Existing package recipes:\n\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

self.client.run("search Hel")
self.assertEqual("There are no packages matching the 'Hel' pattern\n", self.client.out)
Expand All @@ -283,7 +313,8 @@ def search_partial_match_test(self):
self.assertEqual("Existing package recipes:\n\n"
"Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n", self.client.out)
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n", self.client.out)

self.client.run("search Hello/1.4.10")
self.assertEqual("Existing package recipes:\n\n"
Expand Down Expand Up @@ -317,6 +348,7 @@ def search_raw_test(self):
self.assertEqual("Hello/1.4.10@myuser/testing\n"
"Hello/1.4.11@myuser/testing\n"
"Hello/1.4.12@myuser/testing\n"
"Hello/1.5.10@myuser/testing\n"
"helloTest/1.4.10@myuser/stable\n", self.client.out)

def search_html_table_test(self):
Expand Down Expand Up @@ -404,16 +436,17 @@ def package_search_nonescaped_characters_test(self):
self.assertEqual(str(self.client.out).count("PlatformIndependantSHA"), 2)
self.assertNotIn("WindowsPackageSHA", self.client.out)

def _assert_pkg_q(self, query, packages_found, remote):
def _assert_pkg_q(self, query, packages_found, remote, ref="Hello/1.4.10@myuser/testing"):

command = 'search Hello/1.4.10@myuser/testing -q \'%s\'' % query
command = 'search %s -q \'%s\'' % (ref, query)
if remote:
command += " -r %s" % remote
self.client.run(command)

for pack_name in ["LinuxPackageSHA", "PlatformIndependantSHA", "WindowsPackageSHA"]:
for pack_name in ["LinuxPackageSHA", "PlatformIndependantSHA", "WindowsPackageSHA",
"LinuxPackageCustom"]:
self.assertEqual(pack_name in self.client.out,
pack_name in packages_found, "%s fail" % pack_name)
pack_name in packages_found, "%s fail" % pack_name)

def _assert_pkg_query_tool(self, query, packages_found, remote):
command = 'search Tool/1.0.0@myuser/testing -q \'%s\'' % query
Expand Down Expand Up @@ -483,6 +516,11 @@ def test_cases(remote=None):
q = '(os="Linux" OR os=Windows) AND use_Qt=True OR nonexistant_option=3'
self._assert_pkg_q(q, ["WindowsPackageSHA", "LinuxPackageSHA"], remote)

q = 'compiler="gcc" AND compiler.libcxx="libstdc++" AND ' \
'arch="x86" AND arch.vendor="intel" AND os.distro="Ubuntu" AND ' \
'os.distro.version="19.04" AND compiler.version="4.3" AND os="Linux"'
self._assert_pkg_q(q, ["LinuxPackageCustom"], remote, ref="Hello/1.5.10@myuser/testing")

q = 'os_build="Windows"'
self._assert_pkg_query_tool(q, ["winx86", "winx64"], remote)

Expand Down Expand Up @@ -606,6 +644,10 @@ def package_search_properties_filter_test(self):
self.assertIn("There are no packages for reference 'Hello/1.4.10@myuser/testing' "
"matching the query 'compiler.version=1.0'", self.client.out)

self.client.run("search Hello/1.5.10@myuser/testing -q 'glib=glibc AND glib.version=2.29'")
self.assertIn("There are no packages for reference 'Hello/1.5.10@myuser/testing' matching "
"the query 'glib=glibc AND glib.version=2.29'", self.client.out)

self.client.run('search Hello/1.4.10@myuser/testing '
'-q "compiler=gcc AND compiler.version=4.5"')
self.assertNotIn("WindowsPackageSHA", self.client.out)
Expand Down Expand Up @@ -710,6 +752,10 @@ def search_json_test(self):
'recipe': {
'id': 'Hello/1.4.12@myuser/testing'}
},
{
'recipe': {
'id': 'Hello/1.5.10@myuser/testing'}
},
{
'recipe': {
'id': 'helloTest/1.4.10@myuser/stable'}
Expand Down Expand Up @@ -748,6 +794,10 @@ def search_json_test(self):
'recipe': {
'id': 'Hello/1.4.12@myuser/testing'}
},
{
'recipe': {
'id': 'Hello/1.5.10@myuser/testing'}
},
{
'recipe': {
'id': 'helloTest/1.4.10@myuser/stable'}
Expand All @@ -769,6 +819,10 @@ def search_json_test(self):
'recipe': {
'id': 'Hello/1.4.12@myuser/testing'}
},
{
'recipe': {
'id': 'Hello/1.5.10@myuser/testing'}
},
{
'recipe': {
'id': 'helloTest/1.4.10@myuser/stable'}
Expand Down Expand Up @@ -802,6 +856,10 @@ def search_json_test(self):
'recipe': {
'id': 'Hello/1.4.12@myuser/testing'}
},
{
'recipe': {
'id': 'Hello/1.5.10@myuser/testing'}
},
{
'recipe': {
'id': 'helloTest/1.4.10@myuser/stable'}
Expand Down Expand Up @@ -1064,6 +1122,8 @@ def search_json_test(self):
}
self.assertEqual(expected_output, output)



def search_packages_with_reference_not_exported_test(self):
self.client.run("search my_pkg/1.0@conan/stable", assert_error=True)
self.assertIn("ERROR: Recipe not found: 'my_pkg/1.0@conan/stable'", self.client.out)
Expand Down