Skip to content

Commit bf640c6

Browse files
committed
Pick the source package when multiple purldb_entries returned
Signed-off-by: tdruez <[email protected]>
1 parent 4ac11c2 commit bf640c6

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

component_catalog/models.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
from dejacode_toolkit.download import collect_package_data
6060
from dejacode_toolkit.purldb import PurlDB
6161
from dejacode_toolkit.purldb import pick_purldb_entry
62+
from dejacode_toolkit.purldb import pick_source_package
6263
from dejacode_toolkit.scancodeio import ScanCodeIO
6364
from dje import urn
6465
from dje.copier import post_copy
@@ -2535,7 +2536,7 @@ def create_from_url(cls, url, user):
25352536
package_for_match = cls(download_url=download_url)
25362537
package_for_match.set_package_url(package_url)
25372538
purldb_entries = package_for_match.get_purldb_entries(user)
2538-
# Look for one ith the same exact purl in that case
2539+
# Look for one with the same exact purl in that case
25392540
if purldb_data := pick_purldb_entry(purldb_entries, purl=url):
25402541
# The format from PurlDB is "2019-11-18T00:00:00Z" from DateTimeField
25412542
if release_date := purldb_data.get("release_date"):
@@ -2597,7 +2598,7 @@ def get_purldb_entries(self, user, max_request_call=0, timeout=10):
25972598
if self.download_url:
25982599
payloads.append({"download_url": self.download_url})
25992600
if package_url:
2600-
payloads.append({"purl": package_url, "sort": "package_content"})
2601+
payloads.append({"purl": package_url})
26012602

26022603
purldb = PurlDB(user.dataspace)
26032604
for index, payload in enumerate(payloads):
@@ -2628,6 +2629,8 @@ def update_from_purldb(self, user):
26282629
26292630
- Retrieves matching entries from PurlDB using the given user.
26302631
- If exactly one match is found, its data is used directly.
2632+
- If multiple entries are found, leverage the package_content value when
2633+
available to select a "source" package.
26312634
- If multiple entries are found, only values that are non-empty and
26322635
common across all entries are merged and used to update the Package.
26332636
"""
@@ -2638,6 +2641,11 @@ def update_from_purldb(self, user):
26382641
purldb_entries_count = len(purldb_entries)
26392642
if purldb_entries_count == 1:
26402643
package_data = purldb_entries[0]
2644+
elif source_package := pick_source_package(purldb_entries):
2645+
package_data = source_package
2646+
package_data["package_content"] = Package.get_package_content_value_from_label(
2647+
package_data["package_content"]
2648+
)
26412649
else:
26422650
package_data = merge_common_non_empty_values(purldb_entries)
26432651

@@ -2678,6 +2686,12 @@ def update_from_purldb(self, user):
26782686
override=False,
26792687
override_unknown=True,
26802688
)
2689+
2690+
if updated_fields:
2691+
msg = f"Automatically updated {', '.join(updated_fields)} from PurlDB."
2692+
logger.debug(f"PurlDB: {msg}")
2693+
History.log_change(user, self, message=msg)
2694+
26812695
return updated_fields
26822696

26832697
def update_from_scan(self, user, update_products=False):

dejacode_toolkit/purldb.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,17 @@ def pick_purldb_entry(purldb_entries, purl=None):
9090
matches = [entry for entry in purldb_entries if entry.get("purl") == purl]
9191
if len(matches) == 1:
9292
return matches[0]
93+
94+
95+
def pick_source_package(purldb_entries):
96+
"""Pick a source package from a list of PurlDB entries."""
97+
if not purldb_entries:
98+
return
99+
100+
if len(purldb_entries) == 1:
101+
return purldb_entries[0]
102+
103+
for entry in purldb_entries:
104+
package_content = entry.get("package_content")
105+
if package_content and package_content.lower() == "source_archive":
106+
return entry

0 commit comments

Comments
 (0)