Added simple downloading of dependencies.
This commit is contained in:
		
							parent
							
								
									e8beacf559
								
							
						
					
					
						commit
						c5f66d6c9b
					
				
					 5 changed files with 82 additions and 2 deletions
				
			
		
							
								
								
									
										16
									
								
								osdk/cmds.py
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								osdk/cmds.py
									
										
									
									
									
								
							| 
						 | 
					@ -166,6 +166,22 @@ def graphCmd(args: Args):
 | 
				
			||||||
cmds += [Cmd("g", "graph", "Show dependency graph", graphCmd)]
 | 
					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():
 | 
					def usage():
 | 
				
			||||||
    print(f"Usage: {const.ARGV0} <command> [args...]")
 | 
					    print(f"Usage: {const.ARGV0} <command> [args...]")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ ARGV0 = os.path.basename(sys.argv[0])
 | 
				
			||||||
OSDK_DIR = ".osdk"
 | 
					OSDK_DIR = ".osdk"
 | 
				
			||||||
BUILD_DIR = f"{OSDK_DIR}/build"
 | 
					BUILD_DIR = f"{OSDK_DIR}/build"
 | 
				
			||||||
CACHE_DIR = f"{OSDK_DIR}/cache"
 | 
					CACHE_DIR = f"{OSDK_DIR}/cache"
 | 
				
			||||||
 | 
					EXTERN_DIR = f"{OSDK_DIR}/extern"
 | 
				
			||||||
SRC_DIR = "src/"
 | 
					SRC_DIR = "src/"
 | 
				
			||||||
META_DIR = f"meta"
 | 
					META_DIR = f"meta"
 | 
				
			||||||
TARGETS_DIR = f"{META_DIR}/targets"
 | 
					TARGETS_DIR = f"{META_DIR}/targets"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,9 @@
 | 
				
			||||||
from typing import cast, Protocol, Iterable
 | 
					from typing import cast, Protocol, Iterable
 | 
				
			||||||
from pathlib import Path
 | 
					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.logger import Logger
 | 
				
			||||||
from osdk import const, shell, jexpr, utils, rules, mixins
 | 
					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))
 | 
					        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:
 | 
					def loadTarget(id: str) -> TargetManifest:
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        return next(filter(lambda t: t.id == id, loadAllTargets()))
 | 
					        return next(filter(lambda t: t.id == id, loadAllTargets()))
 | 
				
			||||||
| 
						 | 
					@ -115,6 +121,8 @@ def loadTarget(id: str) -> TargetManifest:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def loadAllComponents() -> list[ComponentManifest]:
 | 
					def loadAllComponents() -> list[ComponentManifest]:
 | 
				
			||||||
    files = shell.find(const.SRC_DIR, ["manifest.json"])
 | 
					    files = shell.find(const.SRC_DIR, ["manifest.json"])
 | 
				
			||||||
 | 
					    files += shell.find(const.EXTERN_DIR, ["manifest.json"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return list(
 | 
					    return list(
 | 
				
			||||||
        map(
 | 
					        map(
 | 
				
			||||||
            lambda path: ComponentManifest(jexpr.evalRead(path), path),
 | 
					            lambda path: ComponentManifest(jexpr.evalRead(path), path),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ Props = dict[str, Any]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Type(Enum):
 | 
					class Type(Enum):
 | 
				
			||||||
    UNKNOWN = "unknown"
 | 
					    UNKNOWN = "unknown"
 | 
				
			||||||
 | 
					    PROJECT = "project"
 | 
				
			||||||
    TARGET = "target"
 | 
					    TARGET = "target"
 | 
				
			||||||
    LIB = "lib"
 | 
					    LIB = "lib"
 | 
				
			||||||
    EXE = "exe"
 | 
					    EXE = "exe"
 | 
				
			||||||
| 
						 | 
					@ -54,6 +55,59 @@ class Manifest:
 | 
				
			||||||
        return os.path.dirname(self.path)
 | 
					        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:
 | 
					class Tool:
 | 
				
			||||||
    cmd: str = ""
 | 
					    cmd: str = ""
 | 
				
			||||||
    args: list[str] = []
 | 
					    args: list[str] = []
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
import hashlib
 | 
					import hashlib
 | 
				
			||||||
import errno
 | 
					import errno
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
| 
						 | 
					@ -140,7 +141,7 @@ def popen(*args: str) -> str:
 | 
				
			||||||
    logger.log(f"Executing {args}")
 | 
					    logger.log(f"Executing {args}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        proc = subprocess.run(args, stdout=subprocess.PIPE)
 | 
					        proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=sys.stderr)
 | 
				
			||||||
    except FileNotFoundError:
 | 
					    except FileNotFoundError:
 | 
				
			||||||
        raise Exception(f"Command not found")
 | 
					        raise Exception(f"Command not found")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue