almost working impl

This commit is contained in:
2023-03-11 00:15:06 +01:00
parent ee25e5dd62
commit e7b2bb4828
5 changed files with 109 additions and 21 deletions

View File

@@ -27,6 +27,7 @@ Options:
"""
import logging
from collections import namedtuple
import sys, os, shutil
from docopt import docopt
from yaml import load, SafeLoader
@@ -37,6 +38,15 @@ from fuzzywuzzy import fuzz
import requests
class DotDict(dict):
def __getattr__(self, name):
return self[name] if name in self else None
Tool = namedtuple('Tool','cli,props,lver,rver')
Tool.__annotations__ = {'cli':str, 'props':DotDict, 'lver':VersionInfo,'rver':VersionInfo}
def trace(*mess):
if "TRACE" in os.environ:
print("TRACE", mess)
@@ -50,11 +60,6 @@ def warn(*mess):
print("WARNING:", *mess)
class DotDict(dict):
def __getattr__(self, name):
return self[name] if name in self else None
def _load_catalog(options) -> dict:
catalog = options.get(
"__catalog", "https://codeberg.org/setop/cliget/raw/branch/main/catalog.yaml"
@@ -70,6 +75,7 @@ def _load_catalog(options) -> dict:
def _find_semver(s: str) -> VersionInfo:
trace(s)
ver = VersionInfo(0, 0, 0)
try:
ver = VersionInfo.parse(s)
@@ -164,14 +170,19 @@ def dolistupdate(options):
def _gh_versions(repo: str) -> [VersionInfo | None]:
[owner, repo] = repo.split("/")
url = f"https://api.github.com/repos/{owner}/{repo}/releases"
# GH API raise 403 when too many requests are sent
# TODO implement retry with threshold
response = requests.get(url)
trace(response)
return [_find_semver(o.get("tag_name")) for o in response.json()]
def _gh_version(repo: str) -> [VersionInfo | None]:
[owner, repo] = repo.split("/")
url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest"
trace(url)
response = requests.get(url)
trace(response)
return _find_semver(response.json().get("tag_name"))
@@ -226,11 +237,15 @@ def doinstall(options):
def _match_arch_machine(name: str) -> bool:
sysname = os.uname().sysname.lower() # os
machine = os.uname().machine.lower() # arch
return name.lower().find(sysname) > 0 and name.lower().find(machine) > 0
# we don't consider libc - glic or musl - as musl is usually statically embed
lname = name.lower()
return (lname.find(sysname) > 0
and (lname.find(machine) > 0
or (machine == "x86_64" and lname.find("amd64") > 0)) # x86_64 and "amd64" are synonym
)
def _perform_gh_install(cli, repo, version=None):
# get asset list
def _get_gh_matching_release(repo):
# get asset list from last release
url = f"https://api.github.com/repos/{repo}/releases/latest"
r = requests.get(url)
assets = r.json()["assets"]
@@ -238,6 +253,10 @@ def _perform_gh_install(cli, repo, version=None):
# select right asset
asset = DotDict(next(filter(lambda x: _match_arch_machine(x["name"]), assets)))
trace(asset.name, asset.url)
return asset
def _perform_gh_install(cli, repo, version=None):
asset = _get_gh_matching_release(repo)
# mkdirs
p = os.path
home = os.environ["HOME"]
@@ -259,6 +278,7 @@ def _perform_gh_install(cli, repo, version=None):
trace("process tgz")
os.makedirs(progloc, exist_ok=True)
run(["tar", "xfz", location, "-C", progloc])
# TODO look for exe : ./cli, ./<tar root folder>/cli, exe propertie
# symlink
# TODO remove existing symlink
os.symlink(p.join('../programs', cli, cli), p.join(home, ".local/bin", cli))