Skip to content

Commit 4193794

Browse files
Mehnerthannesm
authored andcommitted
Add OPAM to osv.dev
1 parent 2d38aed commit 4193794

3 files changed

Lines changed: 53 additions & 0 deletions

File tree

osv/ecosystems/_ecosystems.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from .hex import Hex
2525
from .maven import Maven
2626
from .nuget import NuGet
27+
from .opam import Opam
2728
from .packagist import Packagist
2829
from .pub import Pub
2930
from .pypi import PyPI
@@ -55,6 +56,7 @@
5556
'MinimOS': APK,
5657
'npm': SemverEcosystem,
5758
'NuGet': NuGet,
59+
'opam': Opam,
5860
'openEuler': RPM,
5961
'openSUSE': RPM,
6062
'Packagist': Packagist,

osv/ecosystems/opam.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""OPAM ecosystem helper."""
2+
import requests
3+
import json
4+
5+
from ..third_party.univers.debian import Version as DebianVersion
6+
from . import config
7+
8+
class Opam(EnumerableEcosystem):
9+
"""OPAM packages ecosystem"""
10+
def _sort_key(self, version):
11+
# OPAM uses debian versioning
12+
if not DebianVersion.is_valid(version):
13+
# If debian version is not valid, it is most likely an invalid fixed
14+
# version then sort it to the last/largest element
15+
return DebianVersion(9999999999, '9999999999')
16+
return DebianVersion.from_string(version)
17+
18+
_REPO = 'https://api.github.com/repos/ocaml/opam-repository/contents/packages/'
19+
_REPO_ARCHIVE = 'https://api.github.com/repos/ocaml/opam-repository-archive/contents/packages/'
20+
21+
def enumerate_versions(self,
22+
package,
23+
introduced,
24+
fixed=None,
25+
last_affected=None,
26+
limits=None):
27+
"""Enumerate versions."""
28+
response = requests.get(
29+
self._REPO + package, timeout=config.timeout)
30+
archive_response = requests.get(
31+
self._REPO_ARCHIVE + package, timeout=config.timeout)
32+
if response.status_code == 404 && archive_response.status_code == 404:
33+
raise EnumerateError(f'Package {package} not found')
34+
if response.status_code != 200 && archive_response.status_code != 200:
35+
raise RuntimeError(
36+
f'Failed to get OPAM versions for {package} with: {response.text}')
37+
38+
responses = {}
39+
40+
if response.status_code == 200:
41+
responses.extend(response.json())
42+
if archive_response.status_code == 200:
43+
responses.extend(archive_response.json())
44+
45+
versions = [x["name"] for x in responses]
46+
47+
self.sort_versions(versions)
48+
return self._get_affected_versions(versions, introduced, fixed,
49+
last_affected, limits)

osv/purl_helpers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
EcosystemPURL('npm', None),
7171
'NuGet':
7272
EcosystemPURL('nuget', None),
73+
'opam':
74+
EcosystemPURL('opam', None),
7375
'openEuler':
7476
EcosystemPURL('rpm', 'openeuler'),
7577
'openSUSE':

0 commit comments

Comments
 (0)