|
| 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) |
0 commit comments