Skip to content

Commit

Permalink
Add support for version 1 and 2 of Package.resolved
Browse files Browse the repository at this point in the history
Signed-off-by: Keshav Priyadarshi <[email protected]>
  • Loading branch information
keshav-space committed May 31, 2024
1 parent a213ae8 commit 603d992
Show file tree
Hide file tree
Showing 13 changed files with 273 additions and 423 deletions.
7 changes: 4 additions & 3 deletions docs/source/reference/available_package_parsers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -748,14 +748,15 @@ parsers in scancode-toolkit during documentation builds.
- ``squashfs_disk_image``
- None
- https://en.wikipedia.org/wiki/SquashFS
* - json dump of swift manifest
* - JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json``
- ``*/Package.swift.json``
- ``swift``
- ``swift_package_manifest_json``
- swift
- Swift
- https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html
* - resolved dependency for swift package
* - Resolved full dependency lockfile for Package.swift created with ``swift package resolve``
- ``*/Package.resolved``
``*/.package.resolved``
- ``swift``
- ``swift_package_resolved``
- swift
Expand Down
95 changes: 69 additions & 26 deletions src/packagedcode/swift.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ def assemble(

class SwiftPackageResolvedHandler(models.DatafileHandler):
datasource_id = "swift_package_resolved"
path_patterns = ("*/Package.resolved",)
path_patterns = ("*/Package.resolved", "*/.package.resolved")
default_package_type = "swift"
default_primary_language = "swift"
description = "Resolved full dependency lockfile for Package.swift created with ``swift package resolve``"
Expand All @@ -179,35 +179,18 @@ class SwiftPackageResolvedHandler(models.DatafileHandler):
def parse(cls, location, package_only=False):
with io.open(location, encoding="utf-8") as loc:
package_resolved = json.load(loc)

resolved_doc_version = package_resolved.get("version")

pinned = package_resolved.get("pins", [])
if resolved_doc_version in [2, 3]:
yield from packages_from_resolved_v2_and_v3(package_resolved)

if resolved_doc_version == 1:
yield from packages_from_resolved_v1(package_resolved)

for dependency in pinned:
name = dependency.get("identity")
kind = dependency.get("kind")
location = dependency.get("location")
state = dependency.get("state", {})
version = None
namespace = None

if location and kind == "remoteSourceControl":
namespace, name = get_namespace_and_name(location)

version = state.get("version")

if not version:
version = state.get("revision")

package_data = dict(
datasource_id=cls.datasource_id,
type=cls.default_package_type,
primary_language=cls.default_primary_language,
namespace=namespace,
name=name,
version=version,
)
yield models.PackageData.from_data(package_data, package_only)


@classmethod
def assemble(
cls, package_data, resource, codebase, package_adder=models.add_to_package
Expand All @@ -229,6 +212,66 @@ def assemble(
codebase=codebase,
package_adder=package_adder,
)

def packages_from_resolved_v2_and_v3(package_resolved):
pinned = package_resolved.get("pins", [])

for dependency in pinned:
name = dependency.get("identity")
kind = dependency.get("kind")
location = dependency.get("location")
state = dependency.get("state", {})
version = None
namespace = None

if location and kind == "remoteSourceControl":
namespace, name = get_namespace_and_name(location)

version = state.get("version")

if not version:
version = state.get("revision")

package_data = dict(
datasource_id=SwiftPackageResolvedHandler.datasource_id,
type=SwiftPackageResolvedHandler.default_package_type,
primary_language=SwiftPackageResolvedHandler.default_primary_language,
namespace=namespace,
name=name,
version=version,
)
yield models.PackageData.from_data(package_data, False)

def packages_from_resolved_v1(package_resolved):
object = package_resolved.get("object", {})
pinned = object.get("pins", [])

for dependency in pinned:
name = dependency.get("package")

repository_url = dependency.get("repositoryURL")
state = dependency.get("state", {})
version = None
namespace = None

if repository_url:
namespace, name = get_namespace_and_name(repository_url)

version = state.get("version")

if not version:
version = state.get("revision")

package_data = dict(
datasource_id=SwiftPackageResolvedHandler.datasource_id,
type=SwiftPackageResolvedHandler.default_package_type,
primary_language=SwiftPackageResolvedHandler.default_primary_language,
namespace=namespace,
name=name,
version=version,
)
yield models.PackageData.from_data(package_data, False)



def get_dependencies(dependencies):
Expand Down
8 changes: 4 additions & 4 deletions tests/packagedcode/data/plugin/help.txt
Original file line number Diff line number Diff line change
Expand Up @@ -807,16 +807,16 @@ Package type: squashfs
Package type: swift
datasource_id: swift_package_manifest_json
documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html
primary language: swift
description: json dump of swift manifest
primary language: Swift
description: JSON dump of Package.swift created with ``swift package dump-package > Package.swift.json``
path_patterns: '*/Package.swift.json'
--------------------------------------------
Package type: swift
datasource_id: swift_package_resolved
documentation URL: https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#package-dependency
primary language: swift
description: resolved dependency for swift package
path_patterns: '*/Package.resolved'
description: Resolved full dependency lockfile for Package.swift created with ``swift package resolve``
path_patterns: '*/Package.resolved', '*/.package.resolved'
--------------------------------------------
Package type: war
datasource_id: java_war_archive
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"object": {
"pins": [
{
"package": "SwiftShell",
"repositoryURL": "https://github.com/kareman/SwiftShell",
"state": {
"branch": null,
"revision": "99680b2efc7c7dbcace1da0b3979d266f02e213c",
"version": "5.1.0"
}
}
]
},
"version": 1
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
{
"packages": [
{
"type": "swift",
"namespace": "github.com/kareman",
"name": "SwiftShell",
"version": "5.1.0",
"qualifiers": {},
"subpath": null,
"primary_language": "swift",
"description": null,
"release_date": null,
"parties": [],
"keywords": [],
"homepage_url": null,
"download_url": null,
"size": null,
"sha1": null,
"md5": null,
"sha256": null,
"sha512": null,
"bug_tracking_url": null,
"code_view_url": null,
"vcs_url": null,
"copyright": null,
"holder": null,
"declared_license_expression": null,
"declared_license_expression_spdx": null,
"license_detections": [],
"other_license_expression": null,
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
"notice_text": null,
"source_packages": [],
"extra_data": {},
"repository_homepage_url": null,
"repository_download_url": null,
"api_data_url": null,
"package_uid": "pkg:swift/github.com/kareman/[email protected]?uuid=fixed-uid-done-for-testing-5642512d1758",
"datafile_paths": [
"Package.resolved"
],
"datasource_ids": [
"swift_package_resolved"
],
"purl": "pkg:swift/github.com/kareman/[email protected]"
}
],
"dependencies": [],
"files": [
{
"path": "Package.resolved",
"type": "file",
"package_data": [
{
"type": "swift",
"namespace": "github.com/kareman",
"name": "SwiftShell",
"version": "5.1.0",
"qualifiers": {},
"subpath": null,
"primary_language": "swift",
"description": null,
"release_date": null,
"parties": [],
"keywords": [],
"homepage_url": null,
"download_url": null,
"size": null,
"sha1": null,
"md5": null,
"sha256": null,
"sha512": null,
"bug_tracking_url": null,
"code_view_url": null,
"vcs_url": null,
"copyright": null,
"holder": null,
"declared_license_expression": null,
"declared_license_expression_spdx": null,
"license_detections": [],
"other_license_expression": null,
"other_license_expression_spdx": null,
"other_license_detections": [],
"extracted_license_statement": null,
"notice_text": null,
"source_packages": [],
"file_references": [],
"extra_data": {},
"dependencies": [],
"repository_homepage_url": null,
"repository_download_url": null,
"api_data_url": null,
"datasource_id": "swift_package_resolved",
"purl": "pkg:swift/github.com/kareman/[email protected]"
}
],
"for_packages": [
"pkg:swift/github.com/kareman/[email protected]?uuid=fixed-uid-done-for-testing-5642512d1758"
],
"scan_errors": []
},
{
"path": "src",
"type": "directory",
"package_data": [],
"for_packages": [],
"scan_errors": []
},
{
"path": "src/mapbox.swift",
"type": "file",
"package_data": [],
"for_packages": [],
"scan_errors": []
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"version": null,
"qualifiers": {},
"subpath": null,
"primary_language": "swift",
"primary_language": "Swift",
"description": null,
"release_date": null,
"parties": [],
Expand Down Expand Up @@ -36,29 +36,29 @@
"extra_data": {},
"dependencies": [
{
"purl": "pkg:swift/github.com%252Fmapbox%252Fturf-swift",
"purl": "pkg:swift/github.com/mapbox/turf-swift",
"extracted_requirement": "vers:swift/>=2.8.0|<3.0.0",
"scope": "install",
"scope": "dependencies",
"is_runtime": true,
"is_optional": false,
"is_resolved": false,
"resolved_package": {},
"extra_data": {}
},
{
"purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox[email protected]",
"purl": "pkg:swift/github.com/mapbox/mapbox[email protected]",
"extracted_requirement": "11.4.0-rc.2",
"scope": "install",
"scope": "dependencies",
"is_runtime": true,
"is_optional": false,
"is_resolved": true,
"resolved_package": {},
"extra_data": {}
},
{
"purl": "pkg:swift/github.com%252Fmapbox%252Fmapbox[email protected]",
"purl": "pkg:swift/github.com/mapbox/mapbox[email protected]",
"extracted_requirement": "24.4.0-rc.2",
"scope": "install",
"scope": "dependencies",
"is_runtime": true,
"is_optional": false,
"is_resolved": true,
Expand Down
Loading

0 comments on commit 603d992

Please sign in to comment.