almost working impl
This commit is contained in:
38
cliget.py
38
cliget.py
@@ -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))
|
||||
|
Reference in New Issue
Block a user