Skip to content

Commit 603d992

Browse files
committed
Add support for version 1 and 2 of Package.resolved
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent a213ae8 commit 603d992

13 files changed

+273
-423
lines changed

docs/source/reference/available_package_parsers.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -748,14 +748,15 @@ parsers in scancode-toolkit during documentation builds.
748748
- ``squashfs_disk_image``
749749
- None
750750
- https://en.wikipedia.org/wiki/SquashFS
751-
* - json dump of swift manifest
751+
* - JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json``
752752
- ``*/Package.swift.json``
753753
- ``swift``
754754
- ``swift_package_manifest_json``
755-
- swift
755+
- Swift
756756
- https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html
757-
* - resolved dependency for swift package
757+
* - Resolved full dependency lockfile for Package.swift created with ``swift package resolve``
758758
- ``*/Package.resolved``
759+
``*/.package.resolved``
759760
- ``swift``
760761
- ``swift_package_resolved``
761762
- swift

src/packagedcode/swift.py

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def assemble(
166166

167167
class SwiftPackageResolvedHandler(models.DatafileHandler):
168168
datasource_id = "swift_package_resolved"
169-
path_patterns = ("*/Package.resolved",)
169+
path_patterns = ("*/Package.resolved", "*/.package.resolved")
170170
default_package_type = "swift"
171171
default_primary_language = "swift"
172172
description = "Resolved full dependency lockfile for Package.swift created with ``swift package resolve``"
@@ -179,35 +179,18 @@ class SwiftPackageResolvedHandler(models.DatafileHandler):
179179
def parse(cls, location, package_only=False):
180180
with io.open(location, encoding="utf-8") as loc:
181181
package_resolved = json.load(loc)
182+
183+
resolved_doc_version = package_resolved.get("version")
182184

183-
pinned = package_resolved.get("pins", [])
185+
if resolved_doc_version in [2, 3]:
186+
yield from packages_from_resolved_v2_and_v3(package_resolved)
187+
188+
if resolved_doc_version == 1:
189+
yield from packages_from_resolved_v1(package_resolved)
184190

185-
for dependency in pinned:
186-
name = dependency.get("identity")
187-
kind = dependency.get("kind")
188-
location = dependency.get("location")
189-
state = dependency.get("state", {})
190-
version = None
191-
namespace = None
192191

193-
if location and kind == "remoteSourceControl":
194-
namespace, name = get_namespace_and_name(location)
195-
196-
version = state.get("version")
197-
198-
if not version:
199-
version = state.get("revision")
200-
201-
package_data = dict(
202-
datasource_id=cls.datasource_id,
203-
type=cls.default_package_type,
204-
primary_language=cls.default_primary_language,
205-
namespace=namespace,
206-
name=name,
207-
version=version,
208-
)
209-
yield models.PackageData.from_data(package_data, package_only)
210192

193+
211194
@classmethod
212195
def assemble(
213196
cls, package_data, resource, codebase, package_adder=models.add_to_package
@@ -229,6 +212,66 @@ def assemble(
229212
codebase=codebase,
230213
package_adder=package_adder,
231214
)
215+
216+
def packages_from_resolved_v2_and_v3(package_resolved):
217+
pinned = package_resolved.get("pins", [])
218+
219+
for dependency in pinned:
220+
name = dependency.get("identity")
221+
kind = dependency.get("kind")
222+
location = dependency.get("location")
223+
state = dependency.get("state", {})
224+
version = None
225+
namespace = None
226+
227+
if location and kind == "remoteSourceControl":
228+
namespace, name = get_namespace_and_name(location)
229+
230+
version = state.get("version")
231+
232+
if not version:
233+
version = state.get("revision")
234+
235+
package_data = dict(
236+
datasource_id=SwiftPackageResolvedHandler.datasource_id,
237+
type=SwiftPackageResolvedHandler.default_package_type,
238+
primary_language=SwiftPackageResolvedHandler.default_primary_language,
239+
namespace=namespace,
240+
name=name,
241+
version=version,
242+
)
243+
yield models.PackageData.from_data(package_data, False)
244+
245+
def packages_from_resolved_v1(package_resolved):
246+
object = package_resolved.get("object", {})
247+
pinned = object.get("pins", [])
248+
249+
for dependency in pinned:
250+
name = dependency.get("package")
251+
252+
repository_url = dependency.get("repositoryURL")
253+
state = dependency.get("state", {})
254+
version = None
255+
namespace = None
256+
257+
if repository_url:
258+
namespace, name = get_namespace_and_name(repository_url)
259+
260+
version = state.get("version")
261+
262+
if not version:
263+
version = state.get("revision")
264+
265+
package_data = dict(
266+
datasource_id=SwiftPackageResolvedHandler.datasource_id,
267+
type=SwiftPackageResolvedHandler.default_package_type,
268+
primary_language=SwiftPackageResolvedHandler.default_primary_language,
269+
namespace=namespace,
270+
name=name,
271+
version=version,
272+
)
273+
yield models.PackageData.from_data(package_data, False)
274+
232275

233276

234277
def get_dependencies(dependencies):

tests/packagedcode/data/plugin/help.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,16 +807,16 @@ Package type: squashfs
807807
Package type: swift
808808
datasource_id: swift_package_manifest_json
809809
documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html
810-
primary language: swift
811-
description: json dump of swift manifest
810+
primary language: Swift
811+
description: JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json``
812812
path_patterns: '*/Package.swift.json'
813813
--------------------------------------------
814814
Package type: swift
815815
datasource_id: swift_package_resolved
816816
documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency
817817
primary language: swift
818-
description: resolved dependency for swift package
819-
path_patterns: '*/Package.resolved'
818+
description: Resolved full dependency lockfile for Package.swift created with ``swift package resolve``
819+
path_patterns: '*/Package.resolved', '*/.package.resolved'
820820
--------------------------------------------
821821
Package type: war
822822
datasource_id: java_war_archive

tests/packagedcode/data/swift/packages/fastlane_resolved_v1/Package.resolved

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/packagedcode/data/swift/packages/mapboxmaps_resolved/Package.resolved

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
{
2+
"packages": [
3+
{
4+
"type": "swift",
5+
"namespace": "github.com/kareman",
6+
"name": "SwiftShell",
7+
"version": "5.1.0",
8+
"qualifiers": {},
9+
"subpath": null,
10+
"primary_language": "swift",
11+
"description": null,
12+
"release_date": null,
13+
"parties": [],
14+
"keywords": [],
15+
"homepage_url": null,
16+
"download_url": null,
17+
"size": null,
18+
"sha1": null,
19+
"md5": null,
20+
"sha256": null,
21+
"sha512": null,
22+
"bug_tracking_url": null,
23+
"code_view_url": null,
24+
"vcs_url": null,
25+
"copyright": null,
26+
"holder": null,
27+
"declared_license_expression": null,
28+
"declared_license_expression_spdx": null,
29+
"license_detections": [],
30+
"other_license_expression": null,
31+
"other_license_expression_spdx": null,
32+
"other_license_detections": [],
33+
"extracted_license_statement": null,
34+
"notice_text": null,
35+
"source_packages": [],
36+
"extra_data": {},
37+
"repository_homepage_url": null,
38+
"repository_download_url": null,
39+
"api_data_url": null,
40+
"package_uid": "pkg:swift/github.com/kareman/SwiftShell@5.1.0?uuid=fixed-uid-done-for-testing-5642512d1758",
41+
"datafile_paths": [
42+
"Package.resolved"
43+
],
44+
"datasource_ids": [
45+
"swift_package_resolved"
46+
],
47+
"purl": "pkg:swift/github.com/kareman/SwiftShell@5.1.0"
48+
}
49+
],
50+
"dependencies": [],
51+
"files": [
52+
{
53+
"path": "Package.resolved",
54+
"type": "file",
55+
"package_data": [
56+
{
57+
"type": "swift",
58+
"namespace": "github.com/kareman",
59+
"name": "SwiftShell",
60+
"version": "5.1.0",
61+
"qualifiers": {},
62+
"subpath": null,
63+
"primary_language": "swift",
64+
"description": null,
65+
"release_date": null,
66+
"parties": [],
67+
"keywords": [],
68+
"homepage_url": null,
69+
"download_url": null,
70+
"size": null,
71+
"sha1": null,
72+
"md5": null,
73+
"sha256": null,
74+
"sha512": null,
75+
"bug_tracking_url": null,
76+
"code_view_url": null,
77+
"vcs_url": null,
78+
"copyright": null,
79+
"holder": null,
80+
"declared_license_expression": null,
81+
"declared_license_expression_spdx": null,
82+
"license_detections": [],
83+
"other_license_expression": null,
84+
"other_license_expression_spdx": null,
85+
"other_license_detections": [],
86+
"extracted_license_statement": null,
87+
"notice_text": null,
88+
"source_packages": [],
89+
"file_references": [],
90+
"extra_data": {},
91+
"dependencies": [],
92+
"repository_homepage_url": null,
93+
"repository_download_url": null,
94+
"api_data_url": null,
95+
"datasource_id": "swift_package_resolved",
96+
"purl": "pkg:swift/github.com/kareman/SwiftShell@5.1.0"
97+
}
98+
],
99+
"for_packages": [
100+
"pkg:swift/github.com/kareman/SwiftShell@5.1.0?uuid=fixed-uid-done-for-testing-5642512d1758"
101+
],
102+
"scan_errors": []
103+
},
104+
{
105+
"path": "src",
106+
"type": "directory",
107+
"package_data": [],
108+
"for_packages": [],
109+
"scan_errors": []
110+
},
111+
{
112+
"path": "src/mapbox.swift",
113+
"type": "file",
114+
"package_data": [],
115+
"for_packages": [],
116+
"scan_errors": []
117+
}
118+
]
119+
}

tests/packagedcode/data/swift/swift-maboxmaps-manifest-parse-expected.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"version": null,
77
"qualifiers": {},
88
"subpath": null,
9-
"primary_language": "swift",
9+
"primary_language": "Swift",
1010
"description": null,
1111
"release_date": null,
1212
"parties": [],
@@ -36,29 +36,29 @@
3636
"extra_data": {},
3737
"dependencies": [
3838
{
39-
"purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift",
39+
"purl": "pkg:swift/github.com/mapbox/turf-swift",
4040
"extracted_requirement": "vers:swift/>=2.8.0|<3.0.0",
41-
"scope": "install",
41+
"scope": "dependencies",
4242
"is_runtime": true,
4343
"is_optional": false,
4444
"is_resolved": false,
4545
"resolved_package": {},
4646
"extra_data": {}
4747
},
4848
{
49-
"purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-core-maps-ios@11.4.0-rc.2",
49+
"purl": "pkg:swift/github.com/mapbox/mapbox-core-maps-ios@11.4.0-rc.2",
5050
"extracted_requirement": "11.4.0-rc.2",
51-
"scope": "install",
51+
"scope": "dependencies",
5252
"is_runtime": true,
5353
"is_optional": false,
5454
"is_resolved": true,
5555
"resolved_package": {},
5656
"extra_data": {}
5757
},
5858
{
59-
"purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox-common-ios@24.4.0-rc.2",
59+
"purl": "pkg:swift/github.com/mapbox/mapbox-common-ios@24.4.0-rc.2",
6060
"extracted_requirement": "24.4.0-rc.2",
61-
"scope": "install",
61+
"scope": "dependencies",
6262
"is_runtime": true,
6363
"is_optional": false,
6464
"is_resolved": true,

0 commit comments

Comments
 (0)