Skip to content

Commit bead42a

Browse files
memshardedczoidoAbrilRBSErniGH
authored
support metadata appending files without download (#19185)
* support metadata appending files without download * Update test/integration/metadata/test_metadata_commands.py Co-authored-by: Carlos Zoido <[email protected]> * fix cmakeconfigdeps new cmake_extra_interface_libs property (#19187) * Add rename info for files in `conan report diff` (#19171) * Add rename info for files --------- Co-authored-by: Ernesto de Gracia Herranz <[email protected]> * Show moved file in new location * Cleanup code --------- Co-authored-by: Ernesto de Gracia Herranz <[email protected]> * Test/improvements (#19182) * new test for important options * new test * wip * fix test * new test for overwrite * Update test/integration/metadata/test_metadata_commands.py Co-authored-by: Carlos Zoido <[email protected]> --------- Co-authored-by: Carlos Zoido <[email protected]> Co-authored-by: Abril Rincón Blanco <[email protected]> Co-authored-by: Ernesto de Gracia Herranz <[email protected]>
1 parent 4484410 commit bead42a

File tree

3 files changed

+82
-11
lines changed

3 files changed

+82
-11
lines changed

conan/internal/rest/remote_manager.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def get_recipe(self, ref, remote, metadata=None):
6161
local_folder_remote = self._local_folder_remote(remote)
6262
if local_folder_remote is not None:
6363
local_folder_remote.get_recipe(ref, export_folder)
64+
mkdir(layout.metadata())
6465
return layout
6566

6667
download_export = layout.download_export()
@@ -95,6 +96,7 @@ def get_recipe(self, ref, remote, metadata=None):
9596

9697
# Make sure that the source dir is deleted
9798
rmdir(layout.source())
99+
mkdir(layout.metadata())
98100
return layout
99101

100102
def get_recipe_metadata(self, ref, remote, metadata):
@@ -141,6 +143,7 @@ def get_package(self, pref, remote, metadata=None):
141143

142144
pkg_layout = self._cache.create_pkg_layout(pref)
143145
with pkg_layout.set_dirty_context_manager():
146+
mkdir(pkg_layout.metadata())
144147
self._get_package(pkg_layout, pref, remote, output, metadata)
145148

146149
def get_package_metadata(self, pref, remote, metadata):

test/integration/metadata/test_metadata_commands.py

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ class TestMetadataCommands:
1111

1212
@pytest.fixture
1313
def create_conan_pkg(self):
14-
client = TestClient(default_server_user=True)
14+
client = TestClient(default_server_user=True, light=True)
1515
client.save({"conanfile.py": GenConanfile("pkg", "0.1")})
1616
client.run("create .")
1717
pid = client.created_package_id("pkg/0.1")
1818
return client, pid
1919

2020
@staticmethod
21-
def save_metadata_file(client, pkg_ref, filename="somefile.log"):
21+
def save_metadata_file(client, pkg_ref, filename="somefile.log", content=None):
2222
client.run(f"cache path {pkg_ref} --folder=metadata")
2323
metadata_path = str(client.stdout).strip()
2424
myfile = os.path.join(metadata_path, "logs", filename)
25-
save(myfile, f"{pkg_ref}!!!!")
25+
save(myfile, f"{content or str(pkg_ref)}!!!!")
2626
return metadata_path, myfile
2727

2828
def test_upload(self, create_conan_pkg):
@@ -47,10 +47,12 @@ def test_upload(self, create_conan_pkg):
4747

4848
c.run("remove * -c")
4949
c.run("install --requires=pkg/0.1") # wont install metadata by default
50-
c.run("cache path pkg/0.1 --folder=metadata", assert_error=True)
51-
assert "'metadata' folder does not exist for the reference pkg/0.1" in c.out
52-
c.run(f"cache path pkg/0.1:{pid} --folder=metadata", assert_error=True)
53-
assert f"'metadata' folder does not exist for the reference pkg/0.1:{pid}" in c.out
50+
c.run("cache path pkg/0.1 --folder=metadata")
51+
metadata_path = str(c.stdout).strip()
52+
assert os.listdir(metadata_path) == []
53+
c.run(f"cache path pkg/0.1:{pid} --folder=metadata")
54+
metadata_path = str(c.stdout).strip()
55+
assert os.listdir(metadata_path) == []
5456

5557
# Forcing the download of the metadata of cache-existing things with the "download" command
5658
c.run("download pkg/0.1 -r=default --metadata=*")
@@ -64,7 +66,7 @@ def test_upload(self, create_conan_pkg):
6466
assert os.path.isfile(os.path.join(pkg_metadata_path, f))
6567

6668
def test_update_contents(self):
67-
c = TestClient(default_server_user=True)
69+
c = TestClient(default_server_user=True, light=True)
6870
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
6971
c.run("export .")
7072

@@ -90,6 +92,72 @@ def test_update_contents(self):
9092
content = load(os.path.join(metadata_path, "logs", "mylogs.txt"))
9193
assert "mylogs2!!!!" in content
9294

95+
def test_append_contents(self):
96+
# I can add extra files to metadata without necessarily downloading it first
97+
c = TestClient(default_server_user=True, light=True)
98+
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
99+
c.run("create .")
100+
pkgid = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
101+
# Add some metadata
102+
self.save_metadata_file(c, "pkg/0.1", "mylogs.txt", content="mylogs")
103+
self.save_metadata_file(c, f"pkg/0.1:{pkgid}", "mybin.txt", content="mybin")
104+
105+
# Now upload everything
106+
c.run("upload * -c -r=default")
107+
assert "pkg/0.1: Recipe metadata: 1 files" in c.out
108+
109+
c2 = TestClient(servers=c.servers, light=True, inputs=["admin", "password"])
110+
c2.run("install --requires=pkg/0.1")
111+
self.save_metadata_file(c2, "pkg/0.1", "mylogs2.txt", content="mylogs2")
112+
self.save_metadata_file(c2, f"pkg/0.1:{pkgid}", "mybin2.txt", content="mybin2")
113+
c2.run("upload * -c -r=default --metadata=*")
114+
assert "pkg/0.1: Recipe metadata: 1 files" in c2.out
115+
116+
c.run("remove * -c")
117+
c.run("download pkg/0.1 -r=default --metadata=*")
118+
119+
c.run("cache path pkg/0.1 --folder=metadata")
120+
metadata_path = str(c.stdout).strip()
121+
assert "mylogs!!!!" in load(os.path.join(metadata_path, "logs", "mylogs.txt"))
122+
assert "mylogs2!!!!" in load(os.path.join(metadata_path, "logs", "mylogs2.txt"))
123+
124+
c.run(f"cache path pkg/0.1:{pkgid} --folder=metadata")
125+
metadata_path = str(c.stdout).strip()
126+
assert "mybin!!!!" in load(os.path.join(metadata_path, "logs", "mybin.txt"))
127+
assert "mybin2!!!!" in load(os.path.join(metadata_path, "logs", "mybin2.txt"))
128+
129+
def test_overwrite_server_contents(self):
130+
# I can overwrite server contents
131+
c = TestClient(default_server_user=True, light=True)
132+
c.save({"conanfile.py": GenConanfile("pkg", "0.1")})
133+
c.run("create .")
134+
pkgid = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
135+
# Add some metadata
136+
self.save_metadata_file(c, "pkg/0.1", "mylogs.txt", content="mylogs")
137+
self.save_metadata_file(c, f"pkg/0.1:{pkgid}", "mybin.txt", content="mybin")
138+
139+
# Now upload everything
140+
c.run("upload * -c -r=default")
141+
assert "pkg/0.1: Recipe metadata: 1 files" in c.out
142+
143+
c2 = TestClient(servers=c.servers, light=True, inputs=["admin", "password"])
144+
c2.run("install --requires=pkg/0.1")
145+
self.save_metadata_file(c2, "pkg/0.1", "mylogs.txt", content="mylogs2")
146+
self.save_metadata_file(c2, f"pkg/0.1:{pkgid}", "mybin.txt", content="mybin2")
147+
c2.run("upload * -c -r=default --metadata=*")
148+
assert "pkg/0.1: Recipe metadata: 1 files" in c2.out
149+
150+
c.run("remove * -c")
151+
c.run("download pkg/0.1 -r=default --metadata=*")
152+
153+
c.run("cache path pkg/0.1 --folder=metadata")
154+
metadata_path = str(c.stdout).strip()
155+
assert "mylogs2!!!!" in load(os.path.join(metadata_path, "logs", "mylogs.txt"))
156+
157+
c.run(f"cache path pkg/0.1:{pkgid} --folder=metadata")
158+
metadata_path = str(c.stdout).strip()
159+
assert "mybin2!!!!" in load(os.path.join(metadata_path, "logs", "mybin.txt"))
160+
93161
def test_folder_exist(self, create_conan_pkg):
94162
""" so we can cp -R to the metadata folder, having to create the folder in the cache
95163
is weird
@@ -149,7 +217,7 @@ def test_no_download_cached(self, create_conan_pkg):
149217
assert "pkg/0.1: Recipe metadata: 1 files" in c.out
150218
assert "pkg/0.1:da39a3ee5e6b4b0d3255bfef95601890afd80709: Package metadata: 1 files" in c.out
151219

152-
c2 = TestClient(servers=c.servers)
220+
c2 = TestClient(servers=c.servers, light=True)
153221
tmp_folder = temp_folder()
154222
# MOST important part: activate cache
155223
c2.save_home({"global.conf": f"core.download:download_cache={tmp_folder}\n"})
@@ -197,7 +265,7 @@ def test_upload_ignored_metadata_with_pattern(self, create_conan_pkg):
197265
"""
198266
Upload command should fail when passing --metadata="" and a pattern
199267
"""
200-
client = TestClient(default_server_user=True)
268+
client = TestClient(default_server_user=True, light=True)
201269
client.save({"conanfile.py": GenConanfile("pkg", "0.1")})
202270
client.run("export .")
203271

test/integration/metadata/test_metadata_deploy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def build(self):
3535
def deploy(graph, output_folder, **kwargs):
3636
conanfile = graph.root.conanfile
3737
for r, d in conanfile.dependencies.items():
38-
if not os.path.exists(d.package_metadata_folder):
38+
if not os.listdir(d.package_metadata_folder):
3939
continue
4040
shutil.copytree(d.package_metadata_folder, os.path.join(output_folder, "pkgs",
4141
d.ref.name))

0 commit comments

Comments
 (0)