示例#1
0
def test_PackageInstance_export_package():
    conanfile_text = '''
from conans import ConanFile, CMake
import os, glob

class ConanPackage(ConanFile):
    name = "Name Here"
    version = "master"
    checkout = "master"
    generators = "virtualenv"
    requires = "boost/1.69.0@conan/stable"
    build_requires = "cmake_installer/3.13.0@conan/stable"
    git_url_basename = "Missing"
    repo_name = None

    def source(self):
      pass

    def build(self):
      pass

    def package(self):
      pass

    def package_info(self):
      pass
'''

    with util.in_temporary_directory() as d:

        p = util.PackageInstance()
        p.load({
            "setting_overrides": {
                "name": "MyPackage",
                "version": "2.0",
            },
            "conanfile": "./conanfile.py"
        })

        with open("conanfile.py", 'w') as f:
            f.write(conanfile_text)

        res = subprocess.run("conan remove -f MyPackage/*",
                             shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)
        with open("export.out", 'w') as f:
            p.export(stdout=f, owner="initech", channel="unstable")
        res = subprocess.run("conan search ",
                             shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)
        assert re.match(".*MyPackage/2.0@initech/unstable", str(res.stdout))
示例#2
0
def test_get_latest_version_tag_and_get_latest_release():
    with util.in_temporary_directory() as d:
        print(d)
        repo = Path("MyProject").resolve()

        repo.mkdir()
        with util.working_directory(str(repo)):
            file = Path("file.txt")
            file.touch()
            util.run('git init')
            util.run('git add .')
            util.run('git commit -m "initial import"')

            def edit_commit_tag(version, num=1):
                for i in range(num):
                    file.write_text(f"{version} commit {i}")
                    util.run(f'git add .')
                    util.run(f'git commit -m "pre-{version} edit {i}"')
                util.run(f'git tag {version}')

            edit_commit_tag("v1.0", 1)
            edit_commit_tag("v1.1", 2)
            edit_commit_tag("v1.1.1", 2)
            edit_commit_tag("v1.1.2", 1)
            edit_commit_tag("v2.0", 5)
            edit_commit_tag("v2.1", 2)
            edit_commit_tag("v2.1.1", 2)
            edit_commit_tag("v2.1.2", 1)
            edit_commit_tag("v2.2", 1)
            edit_commit_tag("v2.3", 2)
            util.run("git checkout -b devel")
            edit_commit_tag("v2.3.1", 2)
            edit_commit_tag("v3", 2)
            edit_commit_tag("v3.1", 3)
            edit_commit_tag("v3.1.1", 3)
            edit_commit_tag("v3.1.2", 3)
            edit_commit_tag("v3.2.0", 3)

            assert util.get_latest_version_tag() == "v3.2.0"
            assert util.get_latest_version_tag("HEAD^") == "v3.1.2"
            assert util.get_latest_version_tag("HEAD^^") == "v3.1.2"
            assert util.get_latest_version_tag("v3.2.0^") == "v3.1.2"
            assert util.get_latest_version_tag("v3.1.2^") == "v3.1.1"
            assert util.get_latest_version_tag("v3.1.1^") == "v3.1"
            assert util.get_latest_version_tag("v3.1^") == "v3"
            assert util.get_latest_version_tag("v3^") == "v2.3.1"

            assert util.get_latest_release(repo) == "v2.3"
            assert util.get_latest_release(repo, major_series='1') == "v1.1.2"
            assert util.get_latest_release(repo, "devel") == "v3.2.0"
            assert util.get_latest_release(repo, "devel",
                                           major_series='2') == "v2.3.1"
示例#3
0
def test_a_deps_on_b():
    conanfile_text = '''
from conans import ConanFile, CMake
import os, glob

class ConanPackage(ConanFile):
    name = "MyPackage"
    version = "master"
    checkout = "master"
    generators = "virtualenv"
    requires = "boost/1.69.0@conan/stable"
    build_requires = "cmake_installer/3.13.0@conan/stable"
    git_url_basename = "Missing"
    repo_name = None

    def source(self):
      pass

    def build(self):
      pass

    def package(self):
      pass

    def package_info(self):
      pass
'''

    with util.in_temporary_directory() as d:
        path = Path('MyPackage')
        conan = path / 'conanfile.py'

        path.mkdir()
        conan.touch()

        with open(conan, 'w') as f:
            f.write(conanfile_text)

        p = util.PackageInstance()
        p.load({
            'conanfile': str(conan),
            'setting_overrides': {
                'name': 'MyPackage',
                'version': '2.0',
            }
        })
        p.export(owner='me', channel='devel')

    assert util.a_deps_on_b("MyPackage/2.0@me/devel",
                            "boost/1.69.0@conan/stable")
    assert not util.a_deps_on_b("MyPackage/2.0@me/devel",
                                "MyOtherPackage/2.0@initech/devel")
示例#4
0
def test_PackageInstance_write_conanfile():

    conanfile_text = '''
from conans import ConanFile, CMake
import os, glob

class ConanPackage(ConanFile):
    name = "Name Here"
    version = "master"
    checkout = "master"
    generators = "virtualenv"
    requires = "boost/1.69.0@conan/stable"
    build_requires = "cmake_installer/3.13.0@conan/stable"
    git_url_basename = "Missing"
    repo_name = None
    

    def source(self):
      pass

    def build(self):
      pass

    def package(self):
      pass

    def package_info(self):
      pass
'''

    def setting_regex(setting, value):
        # helper function that builds a regex to check that
        # a setting was written by the Package
        return re.compile(rf'''^\s*{setting}\s*=\s*['"]{value}['"]\s*.*$''',
                          re.MULTILINE)

    with util.in_temporary_directory() as d:

        p = util.PackageInstance()
        p.load({
            "conanfile": "./conanfile.py",
            "setting_overrides": {
                "version": "2.0",
                "requires": "boost/1.70@conan/stable"
            },
        })

        with open("conanfile.py", 'w') as f:
            f.write(conanfile_text)

        assert not p.instance_conanfile_path.is_file()
        p.write_instance_conanfile()
        assert p.instance_conanfile_path.is_file()
        text = p.instance_conanfile_path.read_text()

        assert setting_regex("name", "Name Here").search(text)
        assert setting_regex("version", "2.0").search(text)
        assert setting_regex("checkout", "master").search(text)
        assert re.search("boost/1.70@conan/stable", text)

    with util.in_temporary_directory() as d:

        p = util.PackageInstance()
        p.load({
            "conanfile": "./conanfile.py",
            "setting_overrides": {
                "name": "my_project",
                "version": "2.0",
                "group": "Initech",
                "channel": "unstable",
                "checkout": "v2.0",
                "git_url_basename": "git://example.com",
                "repo_name": "MyProject",
            }
        })

        with open("conanfile.py", 'w') as f:
            f.write(conanfile_text)

        assert not p.instance_conanfile_path.is_file()
        p.write_instance_conanfile()
        assert p.instance_conanfile_path.is_file()
        text = p.instance_conanfile_path.read_text()

        assert setting_regex("name", "Name Here").search(text)
        assert setting_regex("name", "my_project").search(text)
        assert setting_regex("version", "2.0").search(text)
        assert setting_regex("checkout", "v2.0").search(text)
        assert setting_regex("git_url_basename",
                             "git://example.com").search(text)
        assert setting_regex("repo_name", "MyProject").search(text)

        assert re.search("boost/1.69.0@conan/stable", text)
示例#5
0
def test_filter_packages():

    config = yaml.load('''
global:
  export:
    owner : initech
    channel : devel
  setting_overrides:
    version : devel
    checkout : master
  ''',
                       Loader=yaml.SafeLoader)

    pc = util.PackageCollection()
    pc.load(config)

    res = subprocess.run("conan remove -f MyPackage",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    res = subprocess.run("conan remove -f PackA",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    res = subprocess.run("conan remove -f PackB",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    res = subprocess.run("conan remove -f PackC",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)

    conanfile_text = '''
from conans import ConanFile, CMake
import os, glob

class ConanPackage(ConanFile):
    name = "Name"
    version = "master"
    checkout = "master"
    generators = "virtualenv"
    requires = "boost/1.69.0@conan/stable"
    build_requires = "cmake_installer/3.13.0@conan/stable"
    git_url_basename = "Missing"
    repo_name = None

    def source(self):
      pass

    def build(self):
      pass

    def package(self):
      pass

    def package_info(self):
      pass
'''

    with util.in_temporary_directory() as d:
        path = Path('PackA')
        conan = path / 'conanfile.py'
        path.mkdir()
        conan.touch()
        with open(conan, 'w') as f:
            f.write(conanfile_text.replace("Name", "PackA"))

        path = Path('PackB')
        conan = path / 'conanfile.py'
        path.mkdir()
        conan.touch()
        conanfile_text = conanfile_text.replace("boost/1.69.0@conan/stable",
                                                "PackA/devel@initech/devel")
        with open(conan, 'w') as f:
            f.write(conanfile_text.replace("Name", "PackB"))

        path = Path('PackC')
        conan = path / 'conanfile.py'
        path.mkdir()
        conan.touch()
        conanfile_text = conanfile_text.replace("PackA/devel@initech/devel",
                                                "PackB/devel@initech/devel")
        with open(conan, 'w') as f:
            f.write(conanfile_text.replace("Name", "PackC"))

        pc.add_from_conan_recipe_collection('.')
        pc.export_packages()

    assert len(util.filter_packages('all', pc.package_instances)) == 3
    assert len(util.filter_packages('none', pc.package_instances)) == 0
    assert len(util.filter_packages(['PackA', 'PackB'],
                                    pc.package_instances)) == 2
    assert len(
        util.filter_packages(['PackA', 'PackB', 'PackD'],
                             pc.package_instances)) == 2
    assert len(util.filter_packages({'include': 'Pack'},
                                    pc.package_instances)) == 3
    assert len(
        util.filter_packages({'include': 'Pack.*'}, pc.package_instances)) == 3
    assert len(util.filter_packages({'include': '.*A'},
                                    pc.package_instances)) == 1
    assert len(util.filter_packages({'exclude': 'None'},
                                    pc.package_instances)) == 0
    assert len(
        util.filter_packages({
            'include': '.*',
            'exclude': 'None'
        }, pc.package_instances)) == 3
    assert len(
        util.filter_packages({
            'include': '.*',
            'exclude': '.*A$'
        }, pc.package_instances)) == 2

    assert util.a_deps_on_b("PackA/devel@initech/devel",
                            "boost/1.69.0@conan/stable")
    assert not util.a_deps_on_b("PackA/devel@initech/devel",
                                "PackB/devel@initech/devel")
    assert not util.a_deps_on_b("PackA/devel@initech/devel",
                                "PackC/devel@initech/devel")
    assert util.a_deps_on_b("PackB/devel@initech/devel",
                            "PackA/devel@initech/devel")
    assert util.a_deps_on_b("PackB/devel@initech/devel",
                            "boost/1.69.0@conan/stable"
                            )  # PackA depends on boost, so PackB will too
    assert util.a_deps_on_b("PackC/devel@initech/devel",
                            "PackB/devel@initech/devel")
    assert util.a_deps_on_b("PackC/devel@initech/devel",
                            "PackA/devel@initech/devel")
    assert util.a_deps_on_b("PackC/devel@initech/devel",
                            "boost/1.69.0@conan/stable")
示例#6
0
def test_PackageCollection_export_packages():
    conanfile_text = '''
from conans import ConanFile, CMake
import os, glob

class ConanPackage(ConanFile):
    name = "Name Here"
    version = "Unknown"
    checkout = "Unknown"
    generators = "virtualenv"
    requires = "boost/1.69.0@conan/stable"
    build_requires = "cmake_installer/3.13.0@conan/stable"
    git_url_basename = "Missing"
    repo_name = None

    def source(self):
      pass

    def build(self):
      pass

    def package(self):
      pass

    def package_info(self):
      pass
'''

    res = subprocess.run("conan remove PackA -f",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    res = subprocess.run("conan remove PackB -f",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    res = subprocess.run("conan remove PackC -f",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    with util.in_temporary_directory() as d:
        path_a = Path('PackA')
        path_b = Path('PackB')
        path_c = Path('PackC')

        conan_a = path_a / 'conanfile.py'
        conan_b = path_b / 'conanfile.py'
        conan_c = path_c / 'conanfile.py'

        path_a.mkdir()
        conan_a.touch()
        path_b.mkdir()
        conan_b.touch()
        path_c.mkdir()
        conan_c.touch()

        with open(conan_a, 'w') as f:
            f.write(conanfile_text.replace("Name Here", "PackA"))
        with open(conan_b, 'w') as f:
            f.write(conanfile_text.replace("Name Here", "PackB"))
        with open(conan_c, 'w') as f:
            f.write(conanfile_text.replace("Name Here", "PackC"))

        config = yaml.load('''
global:
  export:
    owner : initech
    channel : devel
  setting_overrides:
    version : master 
    checkout : master
  ''',
                           Loader=yaml.SafeLoader)

        pc = util.PackageCollection()
        pc.load(config)
        pc.add_from_conan_recipe_collection('.')
        pc.export_packages()

    res = subprocess.run("conan search PackA",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    assert re.match(".*PackA/master@initech/devel", str(res.stdout))
    res = subprocess.run("conan search PackB",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    assert re.match(".*PackB/master@initech/devel", str(res.stdout))
    res = subprocess.run("conan search PackC",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    assert re.match(".*PackC/master@initech/devel", str(res.stdout))
示例#7
0
def test_PackageCollection_build():
    config = yaml.load('''
global:
  export:
    owner : initech
    channel : devel
  setting_overrides:
    version : devel
    checkout : master
''',
                       Loader=yaml.SafeLoader)

    pc = util.PackageCollection()
    pc.load(config)

    with util.in_temporary_directory() as d:
        path_a = Path('PackA')
        path_b = Path('PackB')
        path_c = Path('PackC')

        conan_a = path_a / 'conanfile.py'
        conan_b = path_b / 'conan-recipe.py'  # should NOT get picked up
        conan_c = path_c / 'conanfile.py'

        path_a.mkdir()
        conan_a.touch()
        path_b.mkdir()
        conan_b.touch()
        path_c.mkdir()
        conan_c.touch()

        with pytest.raises(Exception):
            pc.add_from_conan_recipe_collection('/missing')

        names = [p.parent.name for p in Path('.').glob('*/conanfile.py')]

        pc.add_from_conan_recipe_collection('.')

        assert len(pc.package_instances) == 2

        idx = names.index('PackA')
        assert pc.package_instances[idx].conanfile == str(
            Path('PackA/conanfile.py').resolve())
        assert pc.package_instances[idx].setting_overrides[
            'version'] == 'devel'
        assert pc.package_instances[idx].setting_overrides[
            'checkout'] == 'master'

        idx = names.index('PackC')
        assert pc.package_instances[idx].conanfile == str(
            Path('PackC/conanfile.py').resolve())
        assert pc.package_instances[idx].setting_overrides[
            'version'] == 'devel'
        assert pc.package_instances[idx].setting_overrides[
            'checkout'] == 'master'

        pc.add_from_conan_recipe_collection('.')

        assert len(pc.package_instances) == 4
        idx = names.index('PackA')
        assert pc.package_instances[idx].conanfile == str(
            Path('PackA/conanfile.py').resolve())
        assert pc.package_instances[idx - 2].conanfile == str(
            Path('PackA/conanfile.py').resolve())
        idx = names.index('PackC')
        assert pc.package_instances[idx].conanfile == str(
            Path('PackC/conanfile.py').resolve())
        assert pc.package_instances[idx - 2].conanfile == str(
            Path('PackC/conanfile.py').resolve())