Added simple downloading of dependencies.
This commit is contained in:
parent
e8beacf559
commit
c5f66d6c9b
16
osdk/cmds.py
16
osdk/cmds.py
|
@ -166,6 +166,22 @@ def graphCmd(args: Args):
|
|||
cmds += [Cmd("g", "graph", "Show dependency graph", graphCmd)]
|
||||
|
||||
|
||||
def installCmd(args: Args):
|
||||
project = context.loadProject(".")
|
||||
|
||||
for extSpec in project.extern:
|
||||
ext = project.extern[extSpec]
|
||||
|
||||
extPath = f"{const.EXTERN_DIR}/{extSpec}"
|
||||
|
||||
print(f"Installing {extSpec}-{ext.tag} from {ext.git}...")
|
||||
shell.popen("git", "clone", "--depth", "1", "--branch",
|
||||
ext.tag, ext.git, extPath)
|
||||
|
||||
|
||||
cmds += [Cmd("i", "install", "Install all the external packages", installCmd)]
|
||||
|
||||
|
||||
def usage():
|
||||
print(f"Usage: {const.ARGV0} <command> [args...]")
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ ARGV0 = os.path.basename(sys.argv[0])
|
|||
OSDK_DIR = ".osdk"
|
||||
BUILD_DIR = f"{OSDK_DIR}/build"
|
||||
CACHE_DIR = f"{OSDK_DIR}/cache"
|
||||
EXTERN_DIR = f"{OSDK_DIR}/extern"
|
||||
SRC_DIR = "src/"
|
||||
META_DIR = f"meta"
|
||||
TARGETS_DIR = f"{META_DIR}/targets"
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
from typing import cast, Protocol, Iterable
|
||||
from pathlib import Path
|
||||
import os
|
||||
|
||||
|
||||
from osdk.model import TargetManifest, ComponentManifest, Props, Type, Tool, Tools
|
||||
from osdk.model import ProjectManifest, TargetManifest, ComponentManifest, Props, Type, Tool, Tools
|
||||
from osdk.logger import Logger
|
||||
from osdk import const, shell, jexpr, utils, rules, mixins
|
||||
|
||||
|
@ -106,6 +107,11 @@ def loadAllTargets() -> list[TargetManifest]:
|
|||
map(lambda path: TargetManifest(jexpr.evalRead(path), path), files))
|
||||
|
||||
|
||||
def loadProject(path: str) -> ProjectManifest:
|
||||
path = os.path.join(path, "project.json")
|
||||
return ProjectManifest(jexpr.evalRead(path), path)
|
||||
|
||||
|
||||
def loadTarget(id: str) -> TargetManifest:
|
||||
try:
|
||||
return next(filter(lambda t: t.id == id, loadAllTargets()))
|
||||
|
@ -115,6 +121,8 @@ def loadTarget(id: str) -> TargetManifest:
|
|||
|
||||
def loadAllComponents() -> list[ComponentManifest]:
|
||||
files = shell.find(const.SRC_DIR, ["manifest.json"])
|
||||
files += shell.find(const.EXTERN_DIR, ["manifest.json"])
|
||||
|
||||
return list(
|
||||
map(
|
||||
lambda path: ComponentManifest(jexpr.evalRead(path), path),
|
||||
|
|
|
@ -15,6 +15,7 @@ Props = dict[str, Any]
|
|||
|
||||
class Type(Enum):
|
||||
UNKNOWN = "unknown"
|
||||
PROJECT = "project"
|
||||
TARGET = "target"
|
||||
LIB = "lib"
|
||||
EXE = "exe"
|
||||
|
@ -54,6 +55,59 @@ class Manifest:
|
|||
return os.path.dirname(self.path)
|
||||
|
||||
|
||||
class Extern:
|
||||
git: str = ""
|
||||
tag: str = ""
|
||||
|
||||
def __init__(self, json: Json = None, strict=True, **kwargs):
|
||||
if json is not None:
|
||||
if not "git" in json and strict:
|
||||
raise ValueError("Missing git")
|
||||
|
||||
self.git = json["git"]
|
||||
|
||||
if not "tag" in json and strict:
|
||||
raise ValueError("Missing tag")
|
||||
|
||||
self.tag = json["tag"]
|
||||
elif strict:
|
||||
raise ValueError("Missing json")
|
||||
|
||||
for key in kwargs:
|
||||
setattr(self, key, kwargs[key])
|
||||
|
||||
def __str__(self):
|
||||
return f"Extern(git={self.git}, tag={self.tag})"
|
||||
|
||||
def __repr__(self):
|
||||
return f"Extern({self.git})"
|
||||
|
||||
|
||||
class ProjectManifest(Manifest):
|
||||
description: str = ""
|
||||
extern: dict[str, Extern] = {}
|
||||
|
||||
def __init__(self, json: Json = None, path: str = "", strict=True, **kwargs):
|
||||
if json is not None:
|
||||
if not "description" in json and strict:
|
||||
raise ValueError("Missing description")
|
||||
|
||||
self.description = json["description"]
|
||||
|
||||
self.extern = {k: Extern(v)
|
||||
for k, v in json.get("extern", {}).items()}
|
||||
elif strict:
|
||||
raise ValueError("Missing json")
|
||||
|
||||
super().__init__(json, path, strict, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
return f"ProjectManifest(id={self.id}, type={self.type}, path={self.path}, description={self.description}, extern={self.extern})"
|
||||
|
||||
def __repr__(self):
|
||||
return f"ProjectManifest({self.id})"
|
||||
|
||||
|
||||
class Tool:
|
||||
cmd: str = ""
|
||||
args: list[str] = []
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import os
|
||||
import sys
|
||||
import hashlib
|
||||
import errno
|
||||
import subprocess
|
||||
|
@ -140,7 +141,7 @@ def popen(*args: str) -> str:
|
|||
logger.log(f"Executing {args}")
|
||||
|
||||
try:
|
||||
proc = subprocess.run(args, stdout=subprocess.PIPE)
|
||||
proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=sys.stderr)
|
||||
except FileNotFoundError:
|
||||
raise Exception(f"Command not found")
|
||||
|
||||
|
|
Loading…
Reference in a new issue