mv
This commit is contained in:
parent
a6d4cfc52c
commit
e240fad832
6 changed files with 0 additions and 0 deletions
111
spcd/__init__.py
Normal file
111
spcd/__init__.py
Normal file
|
@ -0,0 +1,111 @@
|
|||
"""Python Integration, Delivery & Deployment."""
|
||||
|
||||
__version__ = "0.0.1"
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import env
|
||||
from rwx import fs
|
||||
from rwx.log import stream as log
|
||||
|
||||
import pidd
|
||||
from pidd import cmd
|
||||
from pidd.project import Project
|
||||
from pidd.projects import Projects
|
||||
|
||||
COMMANDS_PREFIX = "pidd-"
|
||||
|
||||
projects = Projects()
|
||||
project = Project(projects)
|
||||
|
||||
|
||||
def browse(root: str) -> None:
|
||||
paths = []
|
||||
for directory, _, files in os.walk(root):
|
||||
for file in files:
|
||||
absolute_path = Path(directory) / file
|
||||
relative_path = os.path.relpath(absolute_path, start=root)
|
||||
paths.append(relative_path)
|
||||
frame(root)
|
||||
for path in sorted(paths):
|
||||
log.info(path)
|
||||
shut(root)
|
||||
|
||||
|
||||
def cat(file: str) -> None:
|
||||
frame(file)
|
||||
log.info(fs.read_file_text(file).rstrip())
|
||||
shut(file)
|
||||
|
||||
|
||||
def install_commands(path: str) -> None:
|
||||
step("Install commands")
|
||||
user = Path("/usr/local/bin")
|
||||
for command in [
|
||||
"browse-workspace",
|
||||
"build-project",
|
||||
"clone-branch",
|
||||
"list-environment",
|
||||
"synchronize",
|
||||
]:
|
||||
log.info(command)
|
||||
(user / f"{COMMANDS_PREFIX}{command}").symlink_to(path)
|
||||
|
||||
|
||||
def main(main: str) -> None:
|
||||
path, *arguments = sys.argv
|
||||
name = Path(path).name
|
||||
if name == "__main__.py":
|
||||
pidd.set_ssh(*arguments)
|
||||
pidd.install_commands(main)
|
||||
else:
|
||||
function = getattr(cmd, name.replace("-", "_"))
|
||||
function(*arguments)
|
||||
|
||||
|
||||
def set_ssh(*arguments: list[str]) -> None:
|
||||
step("Set SSH")
|
||||
#
|
||||
ssh_key, ssh_hosts = arguments
|
||||
#
|
||||
ssh_type = "ed25519"
|
||||
#
|
||||
home = Path("~").expanduser()
|
||||
#
|
||||
ssh = home / ".ssh"
|
||||
ssh.mkdir(exist_ok=True, parents=True)
|
||||
ssh.chmod(0o700)
|
||||
#
|
||||
key = ssh / f"id_{ssh_type}"
|
||||
if ssh_key:
|
||||
fs.write(key, ssh_key)
|
||||
key.chmod(0o400)
|
||||
#
|
||||
known = ssh / "known_hosts"
|
||||
if ssh_hosts:
|
||||
fs.write(known, ssh_hosts)
|
||||
known.chmod(0o400)
|
||||
#
|
||||
browse(ssh)
|
||||
cat(known)
|
||||
|
||||
|
||||
def frame(text: str) -> None:
|
||||
log.info(f"{env.PIDD_OPEN}{text}")
|
||||
|
||||
|
||||
def shut(text: str) -> None:
|
||||
log.info(f"{env.PIDD_SHUT}{text}")
|
||||
|
||||
|
||||
def split() -> None:
|
||||
log.info(env.PIDD_SPLT)
|
||||
|
||||
|
||||
def step(text: str) -> None:
|
||||
env.PIDD_STEP += 1
|
||||
log.info(env.PIDD_DOWN)
|
||||
log.info(f"{env.PIDD_VERT} {env.PIDD_STEP} {text}")
|
||||
log.info(env.PIDD___UP)
|
8
spcd/__main__.py
Executable file
8
spcd/__main__.py
Executable file
|
@ -0,0 +1,8 @@
|
|||
#! /usr/bin/env python3
|
||||
|
||||
"""Entry point."""
|
||||
|
||||
import pidd
|
||||
|
||||
if __name__ == "__main__":
|
||||
pidd.main(__file__)
|
65
spcd/cmd.py
Normal file
65
spcd/cmd.py
Normal file
|
@ -0,0 +1,65 @@
|
|||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from rwx import ps, split
|
||||
from rwx.log import log
|
||||
|
||||
from pidd import browse, project, projects
|
||||
|
||||
|
||||
def pidd_browse_workspace() -> None:
|
||||
browse(project.root)
|
||||
|
||||
|
||||
def pidd_build_project() -> None:
|
||||
for extension in ["py", "sh"]:
|
||||
path = Path(project.root) / f"build.{extension}"
|
||||
if path.exists():
|
||||
ps.run(path)
|
||||
break
|
||||
else:
|
||||
pass
|
||||
|
||||
|
||||
def pidd_clone_branch() -> None:
|
||||
log.info(projects)
|
||||
split()
|
||||
log.info(project)
|
||||
split()
|
||||
log.info(f"""\
|
||||
{project.url}
|
||||
↓
|
||||
""")
|
||||
ps.run(
|
||||
"git",
|
||||
"clone",
|
||||
"--branch",
|
||||
project.branch,
|
||||
"--",
|
||||
project.url,
|
||||
project.root,
|
||||
)
|
||||
|
||||
|
||||
def pidd_list_environment() -> None:
|
||||
for variable, value in sorted(projects.environment.items()):
|
||||
log.info(f"{variable} = {value}")
|
||||
|
||||
|
||||
def pidd_synchronize() -> None:
|
||||
host = "rwx.work"
|
||||
source = "out"
|
||||
user = "cd"
|
||||
#
|
||||
root = Path(os.sep) / user / project.branch / projects.group / project.name
|
||||
#
|
||||
target = f"{user}@{host}:{root}"
|
||||
ps.run(
|
||||
"rsync",
|
||||
"--archive",
|
||||
"--delete-before",
|
||||
"--verbose",
|
||||
f"{source}/",
|
||||
f"{target}/",
|
||||
"--dry-run",
|
||||
)
|
50
spcd/project.py
Normal file
50
spcd/project.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
"""CI project."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING
|
||||
from urllib.parse import urljoin
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from pidd.projects import Projects
|
||||
|
||||
BRANCH = [
|
||||
"GITHUB_REF_NAME",
|
||||
"CI_COMMIT_BRANCH",
|
||||
]
|
||||
NAME = [
|
||||
"GITHUB_REPOSITORY",
|
||||
"CI_PROJECT_PATH",
|
||||
]
|
||||
ROOT = [
|
||||
"GITHUB_WORKSPACE",
|
||||
"CI_PROJECT_DIR",
|
||||
]
|
||||
|
||||
|
||||
class Project:
|
||||
def __init__(self: Project, projects: Projects) -> None:
|
||||
self.projects = projects
|
||||
# branch
|
||||
for variable in BRANCH:
|
||||
if value := projects.environment.get(variable, None):
|
||||
self.branch = value
|
||||
# name
|
||||
for variable in NAME:
|
||||
if value := projects.environment.get(variable, None):
|
||||
self.name = Path(value).name
|
||||
# root
|
||||
for variable in ROOT:
|
||||
if value := projects.environment.get(variable, None):
|
||||
self.root = value
|
||||
# url
|
||||
self.url = urljoin(projects.url, self.name)
|
||||
|
||||
def __str__(self: Project) -> str:
|
||||
return f"""\
|
||||
branch = {self.branch}
|
||||
name = {self.name}
|
||||
root = {self.root}
|
||||
url = {self.url}
|
||||
"""
|
38
spcd/projects.py
Normal file
38
spcd/projects.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
"""CI projects."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from urllib.parse import urljoin
|
||||
|
||||
GROUP_AND_NAME = [
|
||||
"GITHUB_REPOSITORY",
|
||||
"CI_PROJECT_PATH",
|
||||
]
|
||||
SERVER_URL = [
|
||||
"GITHUB_SERVER_URL",
|
||||
"CI_SERVER_URL",
|
||||
]
|
||||
|
||||
|
||||
class Projects:
|
||||
def __init__(self: Projects) -> None:
|
||||
self.environment = os.environ
|
||||
# group, name
|
||||
for variable in GROUP_AND_NAME:
|
||||
if value := self.environment.get(variable, None):
|
||||
path = Path(value)
|
||||
self.group = str(path.parent)
|
||||
self.name = path.name
|
||||
# url
|
||||
for variable in SERVER_URL:
|
||||
if value := self.environment.get(variable, None):
|
||||
self.url = urljoin(value, self.group)
|
||||
|
||||
def __str__(self: Projects) -> str:
|
||||
return f"""\
|
||||
group = {self.group}
|
||||
name = {self.name}
|
||||
url = {self.url}
|
||||
"""
|
Loading…
Add table
Add a link
Reference in a new issue