Skip to content

Commit

Permalink
#5378 Search custom settings (#5521)
Browse files Browse the repository at this point in the history
Signed-off-by: Uilian Ries <uilianries@gmail.com>
  • Loading branch information
uilianries authored and memsharded committed Jul 26, 2019
1 parent 72a3173 commit fafd061
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 12 deletions.
11 changes: 9 additions & 2 deletions conans/search/search.py
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 Down Expand Up @@ -237,6 +259,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 @@ -252,20 +275,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 @@ -274,26 +300,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 @@ -302,7 +332,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 @@ -332,6 +363,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 @@ -419,16 +451,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 @@ -498,6 +531,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 @@ -621,6 +659,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 @@ -725,6 +767,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 @@ -763,6 +809,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 @@ -784,6 +834,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 @@ -817,6 +871,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 @@ -1079,6 +1137,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

0 comments on commit fafd061

Please sign in to comment.