Skip to content

Commit e632556

Browse files
Merge pull request #3661 from nexB/fix-debian-source-purl
Fix debian source purl parsing in status
2 parents 79aae34 + 74be391 commit e632556

File tree

4 files changed

+95
-1
lines changed

4 files changed

+95
-1
lines changed

src/packagedcode/debian.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,19 @@ def build_package_data(debian_data, datasource_id, package_type='deb', distro=No
673673
source_packages = []
674674
source = debian_data.get('source')
675675
if source:
676+
# source package strings often have version in them like:
677+
# Source: util-linux (2.36.1-8+deb11u1)
678+
if " (" in source and ")" in source:
679+
source_name, source_version = source.split(" (")
680+
source_version, _ = source_version.split(")")
681+
else:
682+
source_name = source
683+
source_version = None
684+
676685
source_pkg_purl = PackageURL(
677686
type=package_type,
678-
name=source,
687+
name=source_name,
688+
version=source_version,
679689
namespace=distro,
680690
).to_string()
681691

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Package: bsdutils
2+
Essential: yes
3+
Status: install ok installed
4+
Priority: required
5+
Section: utils
6+
Installed-Size: 394
7+
Maintainer: util-linux packagers <util-linux@packages.debian.org>
8+
Architecture: amd64
9+
Multi-Arch: foreign
10+
Source: util-linux (2.36.1-8+deb11u1)
11+
Version: 1:2.36.1-8+deb11u1
12+
Pre-Depends: libc6 (>= 2.17), libsystemd0
13+
Recommends: bsdextrautils
14+
Description: basic utilities from 4.4BSD-Lite
15+
This package contains the bare minimum of BSD utilities needed for a Debian
16+
system: logger, renice, script, scriptlive, scriptreplay and wall. The
17+
remaining standard BSD utilities are provided by bsdextrautils.
18+
Homepage: http://www.kernel.org/pub/linux/utils/util-linux/
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
[
2+
{
3+
"type": "deb",
4+
"namespace": "debian",
5+
"name": "bsdutils",
6+
"version": "1:2.36.1-8+deb11u1",
7+
"qualifiers": {
8+
"arch": "amd64"
9+
},
10+
"subpath": null,
11+
"primary_language": null,
12+
"description": "basic utilities from 4.4BSD-Lite\n This package contains the bare minimum of BSD utilities needed for a Debian\n system: logger, renice, script, scriptlive, scriptreplay and wall. The\n remaining standard BSD utilities are provided by bsdextrautils.",
13+
"release_date": null,
14+
"parties": [
15+
{
16+
"type": null,
17+
"role": "maintainer",
18+
"name": "util-linux packagers <util-linux@packages.debian.org>",
19+
"email": null,
20+
"url": null
21+
}
22+
],
23+
"keywords": [
24+
"utils"
25+
],
26+
"homepage_url": "http://www.kernel.org/pub/linux/utils/util-linux/",
27+
"download_url": null,
28+
"size": null,
29+
"sha1": null,
30+
"md5": null,
31+
"sha256": null,
32+
"sha512": null,
33+
"bug_tracking_url": null,
34+
"code_view_url": null,
35+
"vcs_url": null,
36+
"copyright": null,
37+
"holder": null,
38+
"declared_license_expression": null,
39+
"declared_license_expression_spdx": null,
40+
"license_detections": [],
41+
"other_license_expression": null,
42+
"other_license_expression_spdx": null,
43+
"other_license_detections": [],
44+
"extracted_license_statement": null,
45+
"notice_text": null,
46+
"source_packages": [
47+
"pkg:deb/debian/util-linux@2.36.1-8%2Bdeb11u1"
48+
],
49+
"file_references": [],
50+
"extra_data": {
51+
"multi_arch": "foreign"
52+
},
53+
"dependencies": [],
54+
"repository_homepage_url": null,
55+
"repository_download_url": null,
56+
"api_data_url": null,
57+
"datasource_id": "debian_installed_status_db",
58+
"purl": "pkg:deb/debian/bsdutils@1:2.36.1-8%2Bdeb11u1?arch=amd64"
59+
}
60+
]

tests/packagedcode/test_debian.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ def test_parse_status_file_basic(self):
8484
packages = list(debian.DebianInstalledStatusDatabaseHandler.parse(test_file))
8585
self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES)
8686

87+
def test_parse_status_file_with_source_packages(self):
88+
test_file = self.get_test_loc('debian/status-with-source/status')
89+
expected_loc = self.get_test_loc('debian/status-with-source/status.expected')
90+
packages = list(debian.DebianInstalledStatusDatabaseHandler.parse(test_file))
91+
self.check_packages_data(packages, expected_loc, regen=REGEN_TEST_FIXTURES)
92+
8793
def test_parse_status_file_perl_error(self):
8894
test_file = self.get_test_loc('debian/mini-status/status')
8995
expected_loc = self.get_test_loc('debian/mini-status/status.expected')

0 commit comments

Comments
 (0)