/
hackage.py
65 lines (53 loc) · 2.32 KB
/
hackage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# -*- coding: utf-8 -*-
#
# This tool helps you rebase your package to the latest version
# Copyright (C) 2013-2019 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Authors: Petr Hráček <phracek@redhat.com>
# Tomáš Hozza <thozza@redhat.com>
# Nikola Forró <nforro@redhat.com>
# František Nečas <fifinecas@seznam.cz>
import logging
from typing import cast
from rebasehelper.logger import CustomLogger
from rebasehelper.plugins.versioneers import BaseVersioneer
from rebasehelper.types import PackageCategories
from rebasehelper.specfile import PackageCategory
from rebasehelper.helpers.download_helper import DownloadHelper
logger: CustomLogger = cast(CustomLogger, logging.getLogger(__name__))
class Hackage(BaseVersioneer):
CATEGORIES: PackageCategories = [PackageCategory.haskell]
BASE_URL: str = 'https://haskell.org'
API_URL: str = 'https://hackage.haskell.org'
@classmethod
def _get_version(cls, package_name):
if package_name.startswith('ghc-'):
package_name = package_name.replace('ghc-', '', 1)
r = DownloadHelper.request('{}/package/{}/preferred'.format(cls.API_URL, package_name),
headers={'Accept': 'application/json'})
if r is None or not r.ok:
return None
data = r.json()
return data.get('normal-version')[0]
@classmethod
def run(cls, package_name):
version = cls._get_version(package_name)
if version:
return version
logger.error("Failed to determine latest upstream version!\n"
"Check that the package exists on %s.", cls.BASE_URL)
return None