добавила цветной вывод (ANSI-коды)
This commit is contained in:
@@ -2,27 +2,23 @@
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
from typing import List, Optional
|
||||
from typing import List
|
||||
from ..models.package import Package
|
||||
from ..database.db_manager import DatabaseManager
|
||||
from ..utils.colors import (
|
||||
print_success, print_error, print_warning,
|
||||
print_info, print_package, print_step, print_sandbox_mode
|
||||
)
|
||||
|
||||
|
||||
class PackageManager:
|
||||
"""Главный класс менеджера пакетов"""
|
||||
|
||||
def __init__(self, repo_path: str = "repo", sandbox: str = None):
|
||||
"""
|
||||
Args:
|
||||
repo_path: путь к репозиторию (папка с пакетами)
|
||||
sandbox: путь к песочнице (если указан, все установки идут туда)
|
||||
"""
|
||||
self.repo_path = repo_path
|
||||
|
||||
# Если указана песочница, используем её как корень
|
||||
if sandbox:
|
||||
self.root = sandbox
|
||||
self.sandbox_mode = True
|
||||
print(f"🏖️ РЕЖИМ ПЕСОЧНИЦЫ: {sandbox}")
|
||||
print_sandbox_mode(self.root)
|
||||
else:
|
||||
self.root = "/"
|
||||
self.sandbox_mode = False
|
||||
@@ -30,14 +26,12 @@ class PackageManager:
|
||||
self.db = DatabaseManager(self.root)
|
||||
|
||||
def install(self, package_name: str) -> bool:
|
||||
"""Устанавливает пакет"""
|
||||
print(f"🔧 Поиск пакета {package_name}...")
|
||||
print_step(f"Поиск пакета {package_name}...")
|
||||
|
||||
# Ищем meta.json пакета
|
||||
meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json")
|
||||
|
||||
if not os.path.exists(meta_path):
|
||||
print(f"❌ Пакет {package_name} не найден в репозитории")
|
||||
print_error(f"Пакет {package_name} не найден")
|
||||
return False
|
||||
|
||||
with open(meta_path, 'r') as f:
|
||||
@@ -45,40 +39,31 @@ class PackageManager:
|
||||
|
||||
pkg = Package(**pkg_data)
|
||||
|
||||
# Проверяем, не установлен ли уже
|
||||
if self.db.is_installed(package_name):
|
||||
print(f"ℹ️ Пакет {package_name} уже установлен")
|
||||
print_warning(f"Пакет {package_name} уже установлен")
|
||||
return True
|
||||
|
||||
print(f"📦 Установка {pkg.full_name()}...")
|
||||
print_package(f"Установка {pkg.full_name()}...")
|
||||
|
||||
# Копируем файлы
|
||||
source_dir = os.path.join(self.repo_path, "packages", package_name, "files")
|
||||
|
||||
for file_info in pkg.files:
|
||||
src = os.path.join(source_dir, file_info["source"])
|
||||
dst = os.path.join(self.root, file_info["destination"].lstrip("/"))
|
||||
|
||||
# Создаем папку назначения, если ее нет
|
||||
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
||||
|
||||
# Копируем файл
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
# Устанавливаем права доступа, если указаны
|
||||
if "permissions" in file_info:
|
||||
os.chmod(dst, file_info["permissions"])
|
||||
|
||||
# Сохраняем в базу
|
||||
self.db.add_package(pkg)
|
||||
|
||||
print(f"✅ Пакет {package_name} успешно установлен")
|
||||
print_success(f"Пакет {package_name} установлен")
|
||||
|
||||
if self.sandbox_mode:
|
||||
print(f"📁 Файлы установлены в: {self.root}")
|
||||
print_info(f"Файлы в: {self.root}")
|
||||
|
||||
return True
|
||||
|
||||
def list_installed(self) -> List[Package]:
|
||||
"""Возвращает список установленных пакетов"""
|
||||
return list(self.db.installed.values())
|
||||
Reference in New Issue
Block a user