Example #1
0
    def test_update_from_same_revision_test(self):
        """ If I specify conan install ref#revision --update it has to update to the latest binary
        of the same recipe.
        """
        conanfile = """
import time
import os
from conans import ConanFile, tools
class ConanFileToolsTest(ConanFile):
        
        def package(self):
            tools.save(os.path.join(self.package_folder, "file.txt"), str(time.time()))
"""
        ref = ConanFileReference.loads("Hello/0.1@lasote/stable")

        # Generate recipe rev 1 + package rev1 to remote0
        self.client.save({"conanfile.py": conanfile})
        self.client.run("create . %s" % str(ref))
        self.client.run("upload %s -r=remote0 --all" % str(ref))
        rev1 = self.client.get_revision(ref)
        package_ref = PackageReference(ref.copy_with_rev(rev1),
                                       NO_SETTINGS_PACKAGE_ID)
        prev1 = self.client.servers[
            "remote0"].server_store.get_last_package_revision(
                package_ref).revision

        # Use another client to install the only binary revision for ref
        client2 = TestClient(servers=self.servers, users=self.users)
        client2.run("install %s" % str(ref))

        # Generate recipe rev1 + package rev2 to remote0
        time.sleep(1)
        self.client.run("remove %s -f" % str(ref))
        self.client.run("create . %s" % str(ref))
        self.client.run("upload %s -r=remote0 --all" % str(ref))
        rev1_ = self.client.get_revision(ref)
        self.assertEquals(rev1, rev1_)
        package_ref = PackageReference(ref.copy_with_rev(rev1),
                                       NO_SETTINGS_PACKAGE_ID)
        prev2 = self.client.servers[
            "remote0"].server_store.get_last_package_revision(
                package_ref).revision
        self.assertNotEqual(prev1,
                            prev2)  # Verify a new package revision is uploaded

        # Generate another recipe revision (and also bin revision)
        self.client.save({"conanfile.py": conanfile + "\n"})
        self.client.run("create . %s" % str(ref))
        self.client.run("upload %s -r=remote0 --all" % str(ref))

        # So, from client2 I install --update pinning the first recipe revision,
        # I don't want the recipe to be updated but the binary
        client2.run("install %s#%s --update" % (str(ref), rev1))
        self.assertNotIn("Hello/0.1@lasote/stable from 'remote0' - Updated",
                         client2.out)
        self.assertIn(
            "Hello/0.1@lasote/stable:"
            "5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9 - Update", client2.out)
        prev_ = client2.get_package_revision(package_ref)
        self.assertEquals(prev_, prev2)
    def upload_dirty_test(self):
        test_server = TestServer([], users={"lasote": "mypass"})
        client = TestClient(servers={"default": test_server},
                            users={"default": [("lasote", "mypass")]})
        client.save({"conanfile.py": str(TestConanFile())})
        client.run("export . lasote/testing")
        ref = ConanFileReference.loads("Hello/0.1@lasote/testing")
        pkg_ref = PackageReference(ref, "12345")
        package_folder = client.client_cache.package(pkg_ref)
        recipe_rev = client.get_revision(ref)
        p_rev = client.get_package_revision(pkg_ref)
        with client.client_cache.update_metadata(pkg_ref.conan) as metadata:
            metadata.packages[pkg_ref.package_id].revision = p_rev
            metadata.packages[pkg_ref.package_id].recipe_revision = recipe_rev
        save(os.path.join(package_folder, "conanmanifest.txt"), "888")
        set_dirty(package_folder)

        client.run("upload * --all --confirm", assert_error=True)
        self.assertIn(
            "ERROR: Package Hello/0.1@lasote/testing:12345 is corrupted, aborting upload",
            client.out)
        self.assertIn(
            "Remove it with 'conan remove Hello/0.1@lasote/testing -p=12345'",
            client.out)

        client.run("remove Hello/0.1@lasote/testing -p=12345 -f")
        client.run("upload * --all --confirm")