76 строки
1.9 KiB
Python
76 строки
1.9 KiB
Python
from pathlib import Path
|
|
import json
|
|
import os
|
|
|
|
DATA_DIR = Path(os.getenv('DEVCONSOLE_DATA_DIR', '/var/lib/devconsole'))
|
|
REGISTRY_FILE = DATA_DIR / 'projects_registry.json'
|
|
|
|
|
|
def load_projects():
|
|
if not REGISTRY_FILE.exists():
|
|
return []
|
|
|
|
try:
|
|
return json.loads(REGISTRY_FILE.read_text(encoding='utf-8'))
|
|
except Exception:
|
|
return []
|
|
|
|
|
|
def save_projects(projects: list[dict]) -> list[dict]:
|
|
REGISTRY_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
REGISTRY_FILE.write_text(
|
|
json.dumps(projects, ensure_ascii=False, indent=2),
|
|
encoding='utf-8'
|
|
)
|
|
return projects
|
|
|
|
|
|
def save_project(project: dict):
|
|
projects = load_projects()
|
|
existing_project = None
|
|
|
|
for item in projects:
|
|
if item.get('repo_url') == project.get('repo_url') or item.get('workspace') == project.get('workspace'):
|
|
existing_project = item
|
|
break
|
|
|
|
if existing_project:
|
|
merged = {**existing_project, **project}
|
|
projects = [merged if p is existing_project else p for p in projects]
|
|
else:
|
|
projects.append(project)
|
|
|
|
return save_projects(projects)
|
|
|
|
|
|
def find_project_by_workspace(workspace: str) -> dict | None:
|
|
for project in load_projects():
|
|
if project.get('workspace') == workspace:
|
|
return project
|
|
return None
|
|
|
|
|
|
def find_project_by_repo(repo_url: str) -> dict | None:
|
|
for project in load_projects():
|
|
if project.get('repo_url') == repo_url:
|
|
return project
|
|
return None
|
|
|
|
|
|
def update_project_settings(workspace: str, settings: dict) -> dict | None:
|
|
projects = load_projects()
|
|
updated = None
|
|
|
|
for index, project in enumerate(projects):
|
|
if project.get('workspace') == workspace:
|
|
merged = {**project, **settings}
|
|
projects[index] = merged
|
|
updated = merged
|
|
break
|
|
|
|
if updated is None:
|
|
return None
|
|
|
|
save_projects(projects)
|
|
return updated
|