Skip to content

Commit 8e7a5ef

Browse files
authored
Add URL Preview for Package Uploads (#18166)
Changelog: Feature: Add URL Preview for Package Uploads json output format Docs: conan-io/docs#4088 Close: #4935
2 parents 8305466 + 710cd26 commit 8e7a5ef

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

conan/api/subapi/upload.py

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from multiprocessing.pool import ThreadPool
44

55
from conan.api.output import ConanOutput
6+
from conan.internal.api.upload import add_urls
67
from conan.internal.conan_app import ConanApp
78
from conan.internal.api.uploader import PackagePreparator, UploadExecutor, UploadUpstreamChecker, \
89
gather_metadata
@@ -99,6 +100,7 @@ def _upload_pkglist(pkglist, subtitle=lambda _: None):
99100
thread_pool.join()
100101
elapsed = time.time() - t
101102
ConanOutput().success(f"Upload completed in {int(elapsed)}s\n")
103+
add_urls(package_list, remote)
102104

103105
def upload_backup_sources(self, files):
104106
config = self.conan_api.config.global_conf

conan/internal/api/upload.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from conan.internal.rest.client_routes import ClientV2Router
2+
from conan.internal.util.files import sha1sum
3+
4+
5+
def add_urls(package_list, remote):
6+
router = ClientV2Router(remote.url.rstrip("/"))
7+
for ref, bundle in package_list.refs().items():
8+
for f, fp in bundle.get("files", {}).items():
9+
bundle.setdefault("upload-urls", {})[f] = {
10+
'url': router.recipe_file(ref, f), 'checksum': sha1sum(fp)
11+
}
12+
for pref, prev_bundle in package_list.prefs(ref, bundle).items():
13+
for f, fp in prev_bundle.get("files", {}).items():
14+
prev_bundle.setdefault("upload-urls", {})[f] = {
15+
'url': router.package_file(pref, f), 'checksum': sha1sum(fp)
16+
}

test/integration/command/upload/upload_test.py

+63-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from conan.internal.paths import EXPORT_SOURCES_TGZ_NAME, PACKAGE_TGZ_NAME
1717
from conan.test.utils.tools import NO_SETTINGS_PACKAGE_ID, TestClient, TestServer, \
1818
GenConanfile, TestRequester, TestingResponse
19-
from conan.internal.util.files import gzopen_without_timestamps, is_dirty, save, set_dirty
19+
from conan.internal.util.files import gzopen_without_timestamps, is_dirty, save, set_dirty, sha1sum
2020

2121
conanfile = """from conan import ConanFile
2222
from conan.tools.files import copy
@@ -542,4 +542,66 @@ def test_upload_json_output():
542542
list_pkgs = json.loads(c.stdout)
543543
revs = list_pkgs["default"]["liba/0.1"]["revisions"]["a565bd5defd3a99e157698fcc6e23b25"]
544544
pkg = revs["packages"]["9e0f8140f0fe6b967392f8d5da9881e232e05ff8"]
545+
prev = pkg["revisions"]["f50f552c6e04b1f241e5f7864bc3957f"]
545546
assert pkg["info"] == {"settings": {"os": "Linux"}, "options": {"shared": "False"}}
547+
assert revs["upload-urls"] == {
548+
"conanfile.py": {
549+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/files/conanfile.py",
550+
"checksum": sha1sum(revs["files"]["conanfile.py"])
551+
},
552+
"conanmanifest.txt": {
553+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/files/conanmanifest.txt",
554+
"checksum": sha1sum(revs["files"]["conanmanifest.txt"])
555+
}
556+
}
557+
assert prev["upload-urls"] == {
558+
"conan_package.tgz": {
559+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conan_package.tgz",
560+
"checksum": sha1sum(prev["files"]["conan_package.tgz"])
561+
},
562+
"conaninfo.txt": {
563+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conaninfo.txt",
564+
"checksum": sha1sum(prev["files"]["conaninfo.txt"])
565+
},
566+
"conanmanifest.txt": {
567+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conanmanifest.txt",
568+
"checksum": sha1sum(prev["files"]["conanmanifest.txt"])
569+
}
570+
}
571+
572+
573+
def test_upload_dry_run_json_output():
574+
c = TestClient(default_server_user=True)
575+
c.save({"conanfile.py": GenConanfile("liba", "0.1").with_settings("os")
576+
.with_shared_option(False)})
577+
c.run("create . -s os=Linux")
578+
c.run("upload * -r=default -c --dry-run --format=json")
579+
list_pkgs = json.loads(c.stdout)
580+
revs = list_pkgs["default"]["liba/0.1"]["revisions"]["a565bd5defd3a99e157698fcc6e23b25"]
581+
pkg = revs["packages"]["9e0f8140f0fe6b967392f8d5da9881e232e05ff8"]
582+
prev = pkg["revisions"]["f50f552c6e04b1f241e5f7864bc3957f"]
583+
assert pkg["info"] == {"settings": {"os": "Linux"}, "options": {"shared": "False"}}
584+
assert revs["upload-urls"] == {
585+
"conanfile.py": {
586+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/files/conanfile.py",
587+
"checksum": sha1sum(revs["files"]["conanfile.py"])
588+
},
589+
"conanmanifest.txt": {
590+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/files/conanmanifest.txt",
591+
"checksum": sha1sum(revs["files"]["conanmanifest.txt"])
592+
}
593+
}
594+
assert prev["upload-urls"] == {
595+
"conan_package.tgz": {
596+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conan_package.tgz",
597+
"checksum": sha1sum(prev["files"]["conan_package.tgz"])
598+
},
599+
"conaninfo.txt": {
600+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conaninfo.txt",
601+
"checksum": sha1sum(prev["files"]["conaninfo.txt"])
602+
},
603+
"conanmanifest.txt": {
604+
"url": f"{c.servers['default']}/v2/conans/liba/0.1/_/_/revisions/a565bd5defd3a99e157698fcc6e23b25/packages/9e0f8140f0fe6b967392f8d5da9881e232e05ff8/revisions/f50f552c6e04b1f241e5f7864bc3957f/files/conanmanifest.txt",
605+
"checksum": sha1sum(prev["files"]["conanmanifest.txt"])
606+
}
607+
}

0 commit comments

Comments
 (0)