|
# retoor <retoor@molodetz.nl>
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
import xmlrpc.client
|
|
from pathlib import Path
|
|
|
|
from client import DevPlace
|
|
|
|
URL = os.environ.get("DEVPLACE_URL", "https://devplace.net")
|
|
API_KEY = os.environ.get("DEVPLACE_API_KEY", "YOUR_API_KEY")
|
|
SOURCE = Path(os.environ.get("DEVPLACE_SOURCE") or (sys.argv[1] if len(sys.argv) > 1 else "."))
|
|
TITLE = os.environ.get("DEVPLACE_PROJECT_TITLE") or (sys.argv[2] if len(sys.argv) > 2 else SOURCE.resolve().name)
|
|
|
|
SKIP_DIRS = {".git", "__pycache__", "node_modules", ".venv", "venv"}
|
|
MAX_BYTES = 512 * 1024
|
|
|
|
|
|
def text_files(root: Path):
|
|
for path in sorted(root.rglob("*")):
|
|
if not path.is_file():
|
|
continue
|
|
if any(part in SKIP_DIRS for part in path.relative_to(root).parts):
|
|
continue
|
|
if path.stat().st_size > MAX_BYTES:
|
|
print("skip (too big):", path)
|
|
continue
|
|
try:
|
|
content = path.read_text(encoding="utf-8")
|
|
except UnicodeDecodeError:
|
|
print("skip (binary):", path)
|
|
continue
|
|
yield path.relative_to(root).as_posix(), content
|
|
|
|
|
|
def main() -> None:
|
|
dp = DevPlace(URL, api_key=API_KEY)
|
|
created = dp.call(
|
|
"projects.create",
|
|
title=TITLE,
|
|
description=f"Deployed from {SOURCE} via the XML-RPC bridge.",
|
|
project_type="software",
|
|
)
|
|
slug = created["data"]["slug"]
|
|
print("created project:", slug)
|
|
count = 0
|
|
for rel_path, content in text_files(SOURCE):
|
|
try:
|
|
dp.call("project.files.write", project_slug=slug, path=rel_path, content=content)
|
|
count += 1
|
|
print("wrote", rel_path)
|
|
except xmlrpc.client.Fault as fault:
|
|
print("failed", rel_path, "-", fault.faultCode, fault.faultString)
|
|
print(f"deployed {count} files to {URL}/projects/{slug}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|