|
|
@ -2,9 +2,25 @@ |
|
|
|
|
|
|
|
|
import urllib.request |
|
|
import urllib.request |
|
|
import re |
|
|
import re |
|
|
|
|
|
import xml |
|
|
|
|
|
from datetime import datetime |
|
|
from enum import Enum |
|
|
from enum import Enum |
|
|
from xml.dom import minidom |
|
|
from xml.dom import minidom |
|
|
import requests |
|
|
import requests |
|
|
|
|
|
from sourcehut.client import ( |
|
|
|
|
|
SRHT_SERVICE, |
|
|
|
|
|
APIVersion, |
|
|
|
|
|
SrhtClient, |
|
|
|
|
|
_FileUpload, |
|
|
|
|
|
_get_upload_data, |
|
|
|
|
|
) |
|
|
|
|
|
from sourcehut.services.builds import BuildsSrhtClient |
|
|
|
|
|
from sourcehut.services.git import GitSrhtClient |
|
|
|
|
|
from sourcehut.services.lists import ListsSrhtClient |
|
|
|
|
|
from sourcehut.services.meta import MetaSrhtClient |
|
|
|
|
|
from sourcehut.services.pages import PagesSrhtClient |
|
|
|
|
|
from sourcehut.services.paste import PasteSrhtClient |
|
|
|
|
|
from sourcehut.services.todo import TodoSrhtClient |
|
|
from github import GithubException, Github as GithubApi |
|
|
from github import GithubException, Github as GithubApi |
|
|
from .version import rex_semantic |
|
|
from .version import rex_semantic |
|
|
from .settings import get_gh_rss_get |
|
|
from .settings import get_gh_rss_get |
|
|
@ -115,29 +131,25 @@ class Remote: |
|
|
@classmethod |
|
|
@classmethod |
|
|
def support_latest_release(cls): |
|
|
def support_latest_release(cls): |
|
|
"""Check if remote has latest release implemented""" |
|
|
"""Check if remote has latest release implemented""" |
|
|
if cls.get_latest_release == Remote.get_latest_release: |
|
|
|
|
|
print(f"Error: {cls.NAME} semantic version check not implemented!") |
|
|
|
|
|
return False |
|
|
|
|
|
return True |
|
|
|
|
|
|
|
|
return cls.get_latest_release != Remote.get_latest_release |
|
|
|
|
|
|
|
|
@classmethod |
|
|
@classmethod |
|
|
def support_latest_commit(cls): |
|
|
def support_latest_commit(cls): |
|
|
"""Check if remote has latest commit implemented""" |
|
|
"""Check if remote has latest commit implemented""" |
|
|
if cls.get_latest_commit == Remote.get_latest_commit: |
|
|
|
|
|
print(f"Error: {cls.NAME} date version check not implemented!") |
|
|
|
|
|
return False |
|
|
|
|
|
return True |
|
|
|
|
|
|
|
|
return cls.get_latest_commit != Remote.get_latest_commit |
|
|
|
|
|
|
|
|
@classmethod |
|
|
@classmethod |
|
|
def get_latest_release(cls, pkg_repo): # pylint: disable=unused-argument |
|
|
|
|
|
|
|
|
def get_latest_release(cls, pkg_repo): |
|
|
"""Get latest release - mostly for Semantic versioning""" |
|
|
"""Get latest release - mostly for Semantic versioning""" |
|
|
print(f"Error: {cls.NAME} semantic version check not implemented!") |
|
|
|
|
|
|
|
|
print(f"{pkg_repo}: Error: {cls.NAME} " |
|
|
|
|
|
"semantic version check not implemented!") |
|
|
return "" |
|
|
return "" |
|
|
|
|
|
|
|
|
@classmethod |
|
|
@classmethod |
|
|
def get_latest_commit(cls, pkg_repo): # pylint: disable=unused-argument |
|
|
|
|
|
|
|
|
def get_latest_commit(cls, pkg_repo): |
|
|
"""Get latest commit - mostly for date versioning""" |
|
|
"""Get latest commit - mostly for date versioning""" |
|
|
print(f"Error: {cls.NAME} date version check not implemented!") |
|
|
|
|
|
|
|
|
print(f"{pkg_repo}: Error: {cls.NAME} " |
|
|
|
|
|
"date version check not implemented!") |
|
|
return "" |
|
|
return "" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -153,8 +165,8 @@ class Bitbucket(Remote): |
|
|
"""Download releases""" |
|
|
"""Download releases""" |
|
|
|
|
|
|
|
|
version = "" |
|
|
version = "" |
|
|
url = "https://api.bitbucket.org/2.0/repositories/" + pkg_repo |
|
|
|
|
|
url += "/refs/tags?sort=-target.date" |
|
|
|
|
|
|
|
|
url = ((f"https://api.bitbucket.org/2.0/repositories/{pkg_repo}" |
|
|
|
|
|
"/refs/tags?sort=-target.date")) |
|
|
|
|
|
|
|
|
response = requests.get(url, timeout=5) |
|
|
response = requests.get(url, timeout=5) |
|
|
|
|
|
|
|
|
@ -338,7 +350,7 @@ class Github(Remote): |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
if get_gh_rss_get(): |
|
|
if get_gh_rss_get(): |
|
|
url = "https://github.com/" + pkg_repo + "/commits.atom" |
|
|
|
|
|
|
|
|
url = f"https://github.com/{pkg_repo}/commits.atom" |
|
|
try: |
|
|
try: |
|
|
with urllib.request.urlopen(url) as req: |
|
|
with urllib.request.urlopen(url) as req: |
|
|
feed = req.read() |
|
|
feed = req.read() |
|
|
@ -367,7 +379,7 @@ class Github(Remote): |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
if get_gh_rss_get(): |
|
|
if get_gh_rss_get(): |
|
|
url = "https://github.com/" + pkg_repo + "/tags.atom" |
|
|
|
|
|
|
|
|
url = f"https://github.com/{pkg_repo}/tags.atom" |
|
|
try: |
|
|
try: |
|
|
with urllib.request.urlopen(url) as req: |
|
|
with urllib.request.urlopen(url) as req: |
|
|
feed = req.read() |
|
|
feed = req.read() |
|
|
@ -414,7 +426,7 @@ class Gitlab(Remote): |
|
|
@classmethod |
|
|
@classmethod |
|
|
def get_latest_release(cls, pkg_repo): |
|
|
def get_latest_release(cls, pkg_repo): |
|
|
ident = pkg_repo.replace("/", "%2F") |
|
|
ident = pkg_repo.replace("/", "%2F") |
|
|
url = cls.URL + "/projects/" + ident + "/repository/tags" |
|
|
|
|
|
|
|
|
url = f"{cls.URL}/projects/{ident}/repository/tags" |
|
|
version = "" |
|
|
version = "" |
|
|
try: |
|
|
try: |
|
|
with requests.get(url, timeout=5) as resp: |
|
|
with requests.get(url, timeout=5) as resp: |
|
|
@ -428,7 +440,7 @@ class Gitlab(Remote): |
|
|
@classmethod |
|
|
@classmethod |
|
|
def get_latest_commit(cls, pkg_repo): |
|
|
def get_latest_commit(cls, pkg_repo): |
|
|
ident = pkg_repo.replace("/", "%2F") |
|
|
ident = pkg_repo.replace("/", "%2F") |
|
|
url = cls.URL + "/projects/" + ident + "/repository/commits" |
|
|
|
|
|
|
|
|
url = f"{cls.URL}/projects/{ident}/repository/commits" |
|
|
version = "" |
|
|
version = "" |
|
|
try: |
|
|
try: |
|
|
with requests.get(url, timeout=5) as resp: |
|
|
with requests.get(url, timeout=5) as resp: |
|
|
@ -558,7 +570,6 @@ class Pecl(Remote): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: get_latest_commit |
|
|
# TODO: get_latest_commit |
|
|
# TODO: get_latest_release |
|
|
|
|
|
class Pypi(Remote): |
|
|
class Pypi(Remote): |
|
|
"""Remote for pypi.org hosted Python projects |
|
|
"""Remote for pypi.org hosted Python projects |
|
|
|
|
|
|
|
|
@ -567,6 +578,48 @@ class Pypi(Remote): |
|
|
TYPE = ERemote.PYPI |
|
|
TYPE = ERemote.PYPI |
|
|
NAME = "pypi" |
|
|
NAME = "pypi" |
|
|
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
|
def get_latest_release(cls, pkg_repo): |
|
|
|
|
|
"""Download releases |
|
|
|
|
|
|
|
|
|
|
|
Downloads the releases from the RSS feed. |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
if get_gh_rss_get(): |
|
|
|
|
|
url = f"https://pypi.org/rss/project/{pkg_repo}/releases.xml" |
|
|
|
|
|
try: |
|
|
|
|
|
with urllib.request.urlopen(url) as req: |
|
|
|
|
|
feed = req.read() |
|
|
|
|
|
except urllib.request.HTTPError: |
|
|
|
|
|
return "" |
|
|
|
|
|
dom = minidom.parseString(feed) |
|
|
|
|
|
nodelist = dom.getElementsByTagName("rss") |
|
|
|
|
|
nodes = ["channel", "item", "title"] |
|
|
|
|
|
for node in nodes: |
|
|
|
|
|
if len(nodelist) < 1: |
|
|
|
|
|
return "" |
|
|
|
|
|
nodelist = nodelist[0].getElementsByTagName(node) |
|
|
|
|
|
if len(nodelist) < 1: |
|
|
|
|
|
return "" |
|
|
|
|
|
version = nodelist[0].firstChild.nodeValue |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
version = "" |
|
|
|
|
|
url = f"https://pypi.org/simple/{pkg_repo}/" |
|
|
|
|
|
response = requests.get( |
|
|
|
|
|
url, |
|
|
|
|
|
timeout=5, |
|
|
|
|
|
headers={"Accept": "application/vnd.pypi.simple.v1+json"}, |
|
|
|
|
|
) |
|
|
|
|
|
if response.status_code == 200: |
|
|
|
|
|
data = response.json() |
|
|
|
|
|
versions = data["versions"] |
|
|
|
|
|
if len(versions) > 1: |
|
|
|
|
|
version = versions[-1] |
|
|
|
|
|
else: |
|
|
|
|
|
print(f"Error: {response.status_code}") |
|
|
|
|
|
return version |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: get_latest_commit |
|
|
# TODO: get_latest_commit |
|
|
# TODO: get_latest_release |
|
|
# TODO: get_latest_release |
|
|
@ -636,8 +689,33 @@ class Sourcehut(Remote): |
|
|
TYPE = ERemote.SOURCEHUT |
|
|
TYPE = ERemote.SOURCEHUT |
|
|
NAME = "sourcehut" |
|
|
NAME = "sourcehut" |
|
|
|
|
|
|
|
|
# @classmethod |
|
|
|
|
|
# def get_latest_commit(cls, pkg_repo): |
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
|
def get_latest_commit(cls, pkg_repo): |
|
|
|
|
|
url = f"https://git.sr.ht/{pkg_repo}/log/rss.xml" |
|
|
|
|
|
try: |
|
|
|
|
|
with urllib.request.urlopen(url) as req: |
|
|
|
|
|
feed = req.read() |
|
|
|
|
|
except urllib.request.HTTPError: |
|
|
|
|
|
return "" |
|
|
|
|
|
dom = minidom.parseString(feed) |
|
|
|
|
|
date = "" |
|
|
|
|
|
try: |
|
|
|
|
|
node = dom.getElementsByTagName("rss") |
|
|
|
|
|
node = node[0].getElementsByTagName("channel") |
|
|
|
|
|
node = node[0].getElementsByTagName("item") |
|
|
|
|
|
node = node[0].getElementsByTagName("pubDate") |
|
|
|
|
|
date = node[0].firstChild.nodeValue |
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
print(e) |
|
|
|
|
|
return "" |
|
|
|
|
|
date = datetime.strptime(date, "%a, %d %b %Y %H:%M:%S %z") |
|
|
|
|
|
version = date.isoformat() |
|
|
|
|
|
|
|
|
|
|
|
return version |
|
|
|
|
|
# user, reponame = cls.split_user_repo(pkg_repo) |
|
|
|
|
|
# repo = GitSrhtClient.get_repository(GitSrhtClient, user, reponame) |
|
|
|
|
|
# repo.cr_await() |
|
|
|
|
|
# print(repo) |
|
|
# url = "https://git.sr.ht/api/" |
|
|
# url = "https://git.sr.ht/api/" |
|
|
# body = """ |
|
|
# body = """ |
|
|
# query repositoryByDiskPath { |
|
|
# query repositoryByDiskPath { |
|
|
|