Skip to content

Commit 74be391

Browse files
Fix debian source purl parsing in status
Debian status files have source package information, and these are mostly always just source package name, but sometimes there are versions also. Handle the case where we have both source package name and version for a package. Signed-off-by: Ayan Sinha Mahapatra <ayansmahapatra@gmail.com>
1 parent 79aae34 commit 74be391

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)