Skip to content

Commit

Permalink
[upload] Ignore metadata when passing empty string (#15007)
Browse files Browse the repository at this point in the history
* Validate upload when ignoring metadata

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* ignore metadata upload in case passing empty string

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Do not accept mixed metadata pattern

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Move validation to upload sub api

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Revert gather metadata

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Improve metadata upload test

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Update test description

Signed-off-by: Uilian Ries <uilianries@gmail.com>

* Simplify test for mixed metadata args

Signed-off-by: Uilian Ries <uilianries@gmail.com>

---------

Signed-off-by: Uilian Ries <uilianries@gmail.com>
  • Loading branch information
uilianries authored Oct 25, 2023
1 parent 6326947 commit c84550c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 58 deletions.
8 changes: 6 additions & 2 deletions conan/api/subapi/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,15 @@ def prepare(self, package_list, enabled_remotes, metadata=None):
:param package_list:
:param enabled_remotes:
:param metadata: A list of patterns of metadata that should be uploaded. Default None
means all metadata will be uploaded together with the pkg artifacts"""
means all metadata will be uploaded together with the pkg artifacts. If metadata is empty
string (""), it means that no metadata files should be uploaded."""
if metadata and metadata != [''] and '' in metadata:
raise ConanException("Empty string and patterns can not be mixed for metadata.")
app = ConanApp(self.conan_api.cache_folder)
preparator = PackagePreparator(app)
preparator.prepare(package_list, enabled_remotes)
gather_metadata(package_list, app.cache, metadata)
if metadata != ['']:
gather_metadata(package_list, app.cache, metadata)
signer = PkgSignaturesPlugin(app.cache)
# This might add files entries to package_list with signatures
signer.sign(package_list)
Expand Down
115 changes: 59 additions & 56 deletions conans/test/integration/metadata/test_metadata_commands.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import pytest

from conans.test.assets.genconanfile import GenConanfile
from conans.test.utils.test_files import temp_folder
Expand All @@ -8,33 +9,36 @@

class TestMetadataCommands:

def test_upload(self):
c = TestClient(default_server_user=True)
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
c.run("create .")
pid = c.created_package_id("pkg/0.1")
@pytest.fixture
def create_conan_pkg(self):
client = TestClient(default_server_user=True)
client.save({"conanfile.py": GenConanfile("pkg", "0.1")})
client.run("create .")
pid = client.created_package_id("pkg/0.1")
return client, pid

# Add some metadata
c.run("cache path pkg/0.1 --folder=metadata")
metadata_path = str(c.stdout).strip()
myfile = os.path.join(metadata_path, "logs", "mylogs.txt")
save(myfile, "mylogs!!!!")
def save_metadata_file(self, client, pkg_ref, filename="somefile.log"):
client.run(f"cache path {pkg_ref} --folder=metadata")
metadata_path = str(client.stdout).strip()
myfile = os.path.join(metadata_path, "logs", filename)
save(myfile, f"{pkg_ref}!!!!")
return metadata_path, myfile

c.run(f"cache path pkg/0.1:{pid} --folder=metadata")
pkg_metadata_path = str(c.stdout).strip()
myfile = os.path.join(pkg_metadata_path, "logs", "mybuildlogs.txt")
save(myfile, "mybuildlogs!!!!")
def test_upload(self, create_conan_pkg):
c, pid = create_conan_pkg

# Add some metadata
self.save_metadata_file(c, "pkg/0.1", "mylogs.txt")
self.save_metadata_file(c, f"pkg/0.1:{pid}", "mybuildlogs.txt")

# Now upload everything
c.run("upload * -c -r=default")
assert "pkg/0.1: Recipe metadata: 1 files" in c.out
assert "pkg/0.1:da39a3ee5e6b4b0d3255bfef95601890afd80709: Package metadata: 1 files" in c.out

# Add new files to the metadata
myfile = os.path.join(metadata_path, "logs", "mylogs2.txt")
save(myfile, "mylogs2!!!!")
myfile = os.path.join(pkg_metadata_path, "logs", "mybuildlogs2.txt")
save(myfile, "mybuildlogs2!!!!")
self.save_metadata_file(c, "pkg/0.1", "mylogs2.txt")
self.save_metadata_file(c, f"pkg/0.1:{pid}", "mybuildlogs2.txt")
# Upload the metadata, even if the revisions exist in the server
# adding the new metadata logs files
c.run("upload * -c -r=default --metadata=*")
Expand Down Expand Up @@ -63,10 +67,7 @@ def test_update_contents(self):
c.run("export .")

# Add some metadata
c.run("cache path pkg/0.1 --folder=metadata")
metadata_path = str(c.stdout).strip()
myfile = os.path.join(metadata_path, "logs", "mylogs.txt")
save(myfile, "mylogs!!!!")
_, myfile = self.save_metadata_file(c, "pkg/0.1", "mylogs.txt")

# Now upload everything
c.run("upload * -c -r=default")
Expand All @@ -87,41 +88,29 @@ def test_update_contents(self):
content = load(os.path.join(metadata_path, "logs", "mylogs.txt"))
assert "mylogs2!!!!" in content

def test_folder_exist(self):
def test_folder_exist(self, create_conan_pkg):
""" so we can cp -R to the metadata folder, having to create the folder in the cache
is weird
"""
c = TestClient(default_server_user=True)
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
c.run("create .")
c, _ = create_conan_pkg
c.run("cache path pkg/0.1 --folder=metadata")
metadata_path = str(c.stdout).strip()
assert os.path.isdir(metadata_path)
c.run(f"cache path pkg/0.1:{NO_SETTINGS_PACKAGE_ID} --folder=metadata")
pkg_metadata_path = str(c.stdout).strip()
assert os.path.isdir(pkg_metadata_path)

def test_direct_download_redownload(self):
def test_direct_download_redownload(self, create_conan_pkg):
""" When we directly download things, without "conan install" first, it is also able
to fetch the requested metadata
Also, re-downloading same thing shouldn't fail
"""
c = TestClient(default_server_user=True)
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
c.run("create .")
pid = c.created_package_id("pkg/0.1")
c, pid = create_conan_pkg

# Add some metadata
c.run("cache path pkg/0.1 --folder=metadata")
metadata_path = str(c.stdout).strip()
myfile = os.path.join(metadata_path, "logs", "mylogs.txt")
save(myfile, "mylogs!!!!")

c.run(f"cache path pkg/0.1:{pid} --folder=metadata")
pkg_metadata_path = str(c.stdout).strip()
myfile = os.path.join(pkg_metadata_path, "logs", "mybuildlogs.txt")
save(myfile, "mybuildlogs!!!!")
metadata_path, _ = self.save_metadata_file(c, "pkg/0.1", "mylogs.txt")
self.save_metadata_file(c, f"pkg/0.1:{pid}", "mybuildlogs.txt")

# Now upload everything
c.run("upload * -c -r=default")
Expand All @@ -144,24 +133,14 @@ def test_direct_download_redownload(self):
pkg_metadata_path = str(c.stdout).strip()
assert os.path.isfile(os.path.join(pkg_metadata_path, "logs", "mybuildlogs.txt"))

def test_no_download_cached(self):
def test_no_download_cached(self, create_conan_pkg):
""" as the metadata can change, no checksum, no revision, cannot be cached
"""
c = TestClient(default_server_user=True)
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
c.run("create .")
pid = c.created_package_id("pkg/0.1")
c, pid = create_conan_pkg

# Add some metadata
c.run("cache path pkg/0.1 --folder=metadata")
metadata_path = str(c.stdout).strip()
myrecipefile = os.path.join(metadata_path, "logs", "mylogs.txt")
save(myrecipefile, "mylogs!!!!")

c.run(f"cache path pkg/0.1:{pid} --folder=metadata")
pkg_metadata_path = str(c.stdout).strip()
mypkgfile = os.path.join(pkg_metadata_path, "logs", "mybuildlogs.txt")
save(mypkgfile, "mybuildlogs!!!!")
_, myrecipefile = self.save_metadata_file(c, "pkg/0.1", "mylogs.txt")
_, mypkgfile = self.save_metadata_file(c, f"pkg/0.1:{pid}", "mybuildlogs.txt")

# Now upload everything
c.run("upload * -c -r=default")
Expand All @@ -178,11 +157,11 @@ def test_no_download_cached(self):
c2.run("cache path pkg/0.1 --folder=metadata")
c2_metadata_path = str(c2.stdout).strip()
mylogs = load(os.path.join(c2_metadata_path, "logs", "mylogs.txt"))
assert "mylogs!!!!" in mylogs
assert "pkg/0.1!!!!" in mylogs
c2.run(f"cache path pkg/0.1:{pid} --folder=metadata")
c2_pkg_metadata_path = str(c2.stdout).strip()
mybuildlogs = load(os.path.join(c2_pkg_metadata_path, "logs", "mybuildlogs.txt"))
assert "mybuildlogs!!!!" in mybuildlogs
assert f"pkg/0.1:{pid}!!!!" in mybuildlogs

# Now the other client will update the metadata
save(myrecipefile, "mylogs2!!!!")
Expand All @@ -198,3 +177,27 @@ def test_no_download_cached(self):
assert "mylogs2!!!!" in mylogs
mybuildlogs = load(os.path.join(c2_pkg_metadata_path, "logs", "mybuildlogs.txt"))
assert "mybuildlogs2!!!!" in mybuildlogs

def test_upload_ignored_metadata(self, create_conan_pkg):
"""
Upload command should ignore metadata files when passing --metadata=""
"""
client, pid = create_conan_pkg

self.save_metadata_file(client, "pkg/0.1")
self.save_metadata_file(client, f"pkg/0.1:{pid}")

client.run('upload * --confirm --remote=default --metadata=""')
assert "Recipe metadata" not in client.out
assert "Package metadata" not in client.out

def test_upload_ignored_metadata_with_pattern(self, create_conan_pkg):
"""
Upload command should fail when passing --metadata="" and a pattern
"""
client = TestClient(default_server_user=True)
client.save({"conanfile.py": GenConanfile("pkg", "0.1")})
client.run("export .")

client.run('upload * --confirm --remote=default --metadata="" --metadata="logs/*"', assert_error=True)
assert "ERROR: Empty string and patterns can not be mixed for metadata." in client.out

0 comments on commit c84550c

Please sign in to comment.