list installed rocks
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
from .console import print_error_message, console
|
from .console import print_error_message, console
|
||||||
from .util import ensure_libs_env, comet_dir, get_package_index
|
from .util import libs_dir, comet_dir, get_package_index
|
||||||
|
|
||||||
import tempfile
|
import tempfile
|
||||||
import subprocess
|
import subprocess
|
||||||
@@ -11,7 +11,7 @@ import glob
|
|||||||
|
|
||||||
|
|
||||||
def install(args):
|
def install(args):
|
||||||
ensure_libs_env()
|
comet_libs_dir = libs_dir()
|
||||||
|
|
||||||
# install each package in given list
|
# install each package in given list
|
||||||
for name in args.names:
|
for name in args.names:
|
||||||
@@ -37,12 +37,13 @@ def install(args):
|
|||||||
|
|
||||||
status.update(f"Downloading [b]{name}[/]...", spinner="moon")
|
status.update(f"Downloading [b]{name}[/]...", spinner="moon")
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
os.chdir(temp_dir)
|
||||||
result = subprocess.run(["git", "clone", package["repository"], temp_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.DEVNULL)
|
result = subprocess.run(["git", "clone", package["repository"], temp_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.DEVNULL)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print_error_message(f"Failed to download \"{name}\": \"{result.stderr.decode()}\"")
|
print_error_message(f"Failed to download \"{name}\": \"{result.stderr.decode()}\"")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
console.print(f"[b][:white_check_mark:] Downloaded [green]{name}[/green].[/]")
|
console.log(f"[d][:white_check_mark:] Downloaded {name}.[/]")
|
||||||
|
|
||||||
status.update(f"Installing [b]{name}[/]...")
|
status.update(f"Installing [b]{name}[/]...")
|
||||||
rock_file = os.path.join(temp_dir, "rock.json")
|
rock_file = os.path.join(temp_dir, "rock.json")
|
||||||
@@ -60,20 +61,12 @@ def install(args):
|
|||||||
# build source code
|
# build source code
|
||||||
rock_info = data.get("rock", {})
|
rock_info = data.get("rock", {})
|
||||||
|
|
||||||
libs_path = os.getenv("COMET_LIBS")
|
out_path = os.path.join(comet_libs_dir, f"{name}.cometlib")
|
||||||
out_path = os.path.join(libs_path, f"{name}.cometlib")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
status.stop()
|
|
||||||
console.print("You may need to type your admin password: ")
|
|
||||||
try:
|
try:
|
||||||
if not os.path.isdir(libs_path):
|
|
||||||
subprocess.run(["sudo", "mkdir", libs_path], check=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
||||||
|
|
||||||
os.chdir(temp_dir)
|
os.chdir(temp_dir)
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
["sudo", "gcc"] + glob.glob("src/*.c", recursive=True) + ["-fPIC", "-shared", "-Wl,-undefined,symbol_lookup", "-o", out_path] + rock_info.get("gccArgs", []),
|
["gcc"] + glob.glob("src/*.c", recursive=True) + ["-fPIC", "-shared", "-Wl,-undefined,symbol_lookup", "-o", out_path] + rock_info.get("gccArgs", []),
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
stdin=subprocess.PIPE,
|
stdin=subprocess.PIPE,
|
||||||
@@ -85,17 +78,21 @@ def install(args):
|
|||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
print_error_message(f"Failed to install [b]{name}[/]: build failed: \"{e.stderr.decode()}\"")
|
print_error_message(f"Failed to install [b]{name}[/]: build failed: \"{e.stderr.decode()}\"")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
console.log(f"[d][:white_check_mark:] Built {name}.[/]")
|
||||||
|
|
||||||
data_path = os.path.join(libs_path, "lib_data")
|
data_path = os.path.join(comet_libs_dir, "lib_data")
|
||||||
|
|
||||||
|
# this feels really fragile but who caresssss....
|
||||||
lib_data_path = os.path.join(data_path, name)
|
lib_data_path = os.path.join(data_path, name)
|
||||||
if not os.path.isdir(lib_data_path):
|
if not os.path.isdir(lib_data_path):
|
||||||
subprocess.run(["sudo", "mkdir", "-p", lib_data_path], check=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
|
subprocess.run(["mkdir", "-p", lib_data_path], check=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
|
||||||
subprocess.run(["sudo", "cp", os.path.join(temp_dir, "rock.json"), os.path.join(lib_data_path, "rock.json")], check=True)
|
subprocess.run(["cp", os.path.join(temp_dir, "rock.json"), os.path.join(lib_data_path, "rock.json")], check=True)
|
||||||
|
|
||||||
docs_path = os.path.join(temp_dir, "docs/")
|
docs_path = os.path.join(temp_dir, "docs/")
|
||||||
if os.path.isdir(docs_path):
|
if os.path.isdir(docs_path):
|
||||||
subprocess.run(["sudo", "cp", "-R", docs_path, os.path.join(lib_data_path, "docs/")], check=True)
|
subprocess.run(["cp", "-R", docs_path, os.path.join(lib_data_path, "docs/")], check=True)
|
||||||
|
console.log(f"[d][:white_check_mark:] Copied data for {name}.[/]")
|
||||||
|
|
||||||
console.print(f"[b][:white_check_mark:] Installed [green]{name}[/green]![/b]")
|
|
||||||
|
console.log(f"[b][:white_check_mark:] Installed [green]{name}[/green]![/b]")
|
||||||
30
neb/src/list.py
Normal file
30
neb/src/list.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
from .console import console
|
||||||
|
from .util import libs_dir
|
||||||
|
|
||||||
|
from rich.box import ROUNDED
|
||||||
|
from rich.table import Table
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def list_packages(args) -> None:
|
||||||
|
packages_table = Table("Name", "Version", "Description", "Author", box=ROUNDED, header_style="bold blue", )
|
||||||
|
|
||||||
|
data_dir = os.path.join(libs_dir(), "lib_data/")
|
||||||
|
libs = os.listdir(data_dir)
|
||||||
|
|
||||||
|
for name in libs:
|
||||||
|
lib_data_dir = os.path.join(data_dir, name)
|
||||||
|
rock_file = os.path.join(lib_data_dir, "rock.json")
|
||||||
|
|
||||||
|
json_data = {}
|
||||||
|
try:
|
||||||
|
with open(rock_file, "r") as f:
|
||||||
|
json_data = json.load(f)["rock"]
|
||||||
|
|
||||||
|
packages_table.add_row(json_data["name"], json_data["version"], json_data.get("description", "<empty>"), json_data.get("author", "<empty>"))
|
||||||
|
except (json.JSONDecodeError, FileNotFoundError, KeyError) as e:
|
||||||
|
continue
|
||||||
|
|
||||||
|
console.print(packages_table)
|
||||||
@@ -4,6 +4,7 @@ import os
|
|||||||
|
|
||||||
from .install import install
|
from .install import install
|
||||||
from .pull import pull
|
from .pull import pull
|
||||||
|
from .list import list_packages
|
||||||
|
|
||||||
__VERSION__ = "1.0.0"
|
__VERSION__ = "1.0.0"
|
||||||
|
|
||||||
@@ -25,6 +26,9 @@ def main() -> int:
|
|||||||
# pull command
|
# pull command
|
||||||
pull_cmd = sub_parsers.add_parser(name="pull", description="pull rock index")
|
pull_cmd = sub_parsers.add_parser(name="pull", description="pull rock index")
|
||||||
|
|
||||||
|
# list command
|
||||||
|
list_cmd = sub_parsers.add_parser(name="list", description="list installed rocks")
|
||||||
|
|
||||||
args = arg_parser.parse_args()
|
args = arg_parser.parse_args()
|
||||||
|
|
||||||
# do different things based on args
|
# do different things based on args
|
||||||
@@ -37,6 +41,8 @@ def main() -> int:
|
|||||||
install(args)
|
install(args)
|
||||||
case "pull":
|
case "pull":
|
||||||
pull(args)
|
pull(args)
|
||||||
|
case "list":
|
||||||
|
list_packages(args)
|
||||||
|
|
||||||
# really feeling like a C programmer lmao
|
# really feeling like a C programmer lmao
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -19,14 +19,14 @@ def get_needed_headers() -> bool:
|
|||||||
if not should_continue:
|
if not should_continue:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
with console.status("Cloning git repo...", spinner="moon") as status:
|
with console.status("Cloning Comet repo...", spinner="moon") as status:
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
repo_url = "https://chookspace.com/Comet/Comet"
|
repo_url = "https://chookspace.com/Comet/Comet"
|
||||||
result = subprocess.run(["git", "clone", repo_url, temp_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
result = subprocess.run(["git", "clone", repo_url, temp_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print_error_message(f"failed to get the Comet repository: {result.stderr.decode()}")
|
print_error_message(f"failed to get the Comet repository: {result.stderr.decode()}")
|
||||||
|
|
||||||
console.print("[d][:white_check_mark:] Cloned repo.[/]")
|
console.log("[d][:white_check_mark:] Cloned Comet repo.[/]")
|
||||||
|
|
||||||
os.chdir(temp_dir)
|
os.chdir(temp_dir)
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ def get_needed_headers() -> bool:
|
|||||||
result = subprocess.run(["make"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
result = subprocess.run(["make"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print_error_message(f"failed to build Comet: {result.stderr.decode()}")
|
print_error_message(f"failed to build Comet: {result.stderr.decode()}")
|
||||||
console.print("[d][:white_check_mark:] Built Comet.[/]")
|
console.log("[d][:white_check_mark:] Built Comet.[/]")
|
||||||
|
|
||||||
status.update("Installing...")
|
status.update("Installing...")
|
||||||
status.stop()
|
status.stop()
|
||||||
@@ -43,8 +43,10 @@ def get_needed_headers() -> bool:
|
|||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print_error_message(f"failed to install: {result.stderr.decode()}")
|
print_error_message(f"failed to install: {result.stderr.decode()}")
|
||||||
|
|
||||||
console.print("[d][:white_check_mark:] Installed headers.[/]")
|
console.log("[d][:white_check_mark:] Installed headers.[/]")
|
||||||
console.print("[b][green]Comet headers are installed![/green] [:white_check_mark:][/b]\n")
|
console.log("[b][:white_check_mark:] Comet headers are installed![/b]\n")
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def update_package_index() -> dict:
|
def update_package_index() -> dict:
|
||||||
with console.status("Downloading package index...", spinner="moon") as status:
|
with console.status("Downloading package index...", spinner="moon") as status:
|
||||||
@@ -53,7 +55,7 @@ def update_package_index() -> dict:
|
|||||||
print_error_message(f"Failed to download package index: {package_data.reason}")
|
print_error_message(f"Failed to download package index: {package_data.reason}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
console.print("[d][:white_check_mark:] Downloaded package index.[/]")
|
console.log("[d][:white_check_mark:] Downloaded package index.[/]")
|
||||||
|
|
||||||
status.update("Saving package index...")
|
status.update("Saving package index...")
|
||||||
data = package_data.json()
|
data = package_data.json()
|
||||||
@@ -61,7 +63,7 @@ def update_package_index() -> dict:
|
|||||||
with open(os.path.join(comet_dir(), "package_index.json"), "w") as f:
|
with open(os.path.join(comet_dir(), "package_index.json"), "w") as f:
|
||||||
json.dump(data, f)
|
json.dump(data, f)
|
||||||
|
|
||||||
console.print("[b][:white_check_mark:] [green]Done pulling package index![/green][/b]")
|
console.log("[b][:white_check_mark:] Done pulling package index![/b]")
|
||||||
|
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@@ -105,11 +107,13 @@ def ensure_includes_exist() -> list[str]:
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def ensure_libs_env() -> None:
|
def libs_dir() -> str:
|
||||||
if not os.getenv("COMET_LIBS"):
|
|
||||||
default_loc = "/usr/lib/comet"
|
|
||||||
os.environ["COMET_LIBS"] = default_loc
|
|
||||||
console.print(f"[b cyan]note:[/] Using default install location ({default_loc}). Set the $COMET_LIBS variable to silence this.")
|
|
||||||
|
|
||||||
if not ensure_includes_exist():
|
if not ensure_includes_exist():
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
comet_libs_dir = os.path.join(comet_dir(), "libs/")
|
||||||
|
if not os.path.isdir(comet_libs_dir):
|
||||||
|
os.mkdir(comet_libs_dir)
|
||||||
|
|
||||||
|
return comet_libs_dir
|
||||||
Reference in New Issue
Block a user