добавила режим dry-run для команд install и remove
This commit is contained in:
@@ -21,12 +21,16 @@ def main():
|
||||
# install
|
||||
install_parser = subparsers.add_parser('install', help='Установить пакет')
|
||||
install_parser.add_argument('package', help='Имя пакета')
|
||||
install_parser.add_argument('--dry-run', action='store_true',
|
||||
help='Режим примерки: показать, что будет установлено, но не устанавливать')
|
||||
|
||||
# remove
|
||||
remove_parser = subparsers.add_parser('remove', help='Удалить пакет')
|
||||
remove_parser.add_argument('package', help='Имя пакета')
|
||||
remove_parser.add_argument('--force', action='store_true',
|
||||
help='Принудительное удаление')
|
||||
remove_parser.add_argument('--dry-run', action='store_true',
|
||||
help='Режим примерки: показать, что будет удалено, но не удалять')
|
||||
|
||||
# list
|
||||
list_parser = subparsers.add_parser('list', help='Список установленных пакетов')
|
||||
@@ -35,7 +39,7 @@ def main():
|
||||
info_parser = subparsers.add_parser('info', help='Информация о пакете')
|
||||
info_parser.add_argument('package', help='Имя пакета')
|
||||
|
||||
# search (НОВАЯ КОМАНДА)
|
||||
# search
|
||||
search_parser = subparsers.add_parser('search', help='Поиск пакетов в репозитории')
|
||||
search_parser.add_argument('keyword', help='Ключевое слово для поиска')
|
||||
|
||||
@@ -48,10 +52,10 @@ def main():
|
||||
pm = PackageManager(repo_path=args.repo, sandbox=args.sandbox)
|
||||
|
||||
if args.command == 'install':
|
||||
pm.install(args.package)
|
||||
pm.install(args.package, dry_run=args.dry_run)
|
||||
|
||||
elif args.command == 'remove':
|
||||
pm.remove(args.package, force=args.force)
|
||||
pm.remove(args.package, force=args.force, dry_run=args.dry_run)
|
||||
|
||||
elif args.command == 'list':
|
||||
packages = pm.list_installed()
|
||||
@@ -81,7 +85,7 @@ def main():
|
||||
else:
|
||||
print(f" ❌ Не установлен")
|
||||
|
||||
elif args.command == 'search': # НОВАЯ КОМАНДА
|
||||
elif args.command == 'search':
|
||||
results = pm.search(args.keyword)
|
||||
if not results:
|
||||
print_info(f"Ничего не найдено по запросу '{args.keyword}'")
|
||||
|
||||
@@ -25,7 +25,7 @@ class PackageManager:
|
||||
|
||||
self.db = DatabaseManager(self.root)
|
||||
|
||||
def install(self, package_name: str) -> bool:
|
||||
def install(self, package_name: str, dry_run: bool = False) -> bool:
|
||||
print_step(f"Поиск пакета {package_name}...")
|
||||
|
||||
meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json")
|
||||
@@ -43,6 +43,23 @@ class PackageManager:
|
||||
print_warning(f"Пакет {package_name} уже установлен")
|
||||
return True
|
||||
|
||||
# DRY-RUN: только показываем, ничего не делаем
|
||||
if dry_run:
|
||||
print("🔍 РЕЖИМ DRY-RUN (ничего не устанавливается)")
|
||||
print(f"\n📦 Будет установлен: {pkg.full_name()}")
|
||||
if pkg.depends:
|
||||
print(f" Зависимости: {', '.join(pkg.depends)}")
|
||||
else:
|
||||
print(f" Зависимости: нет")
|
||||
print(f" Файлы ({len(pkg.files)}):")
|
||||
for f in pkg.files:
|
||||
print(f" {f['destination']}")
|
||||
if self.sandbox_mode:
|
||||
print(f"\n🏖️ Установка будет выполнена в песочницу: {self.root}")
|
||||
print(f"\n✅ Установка не произведена (dry-run)")
|
||||
return True
|
||||
|
||||
# РЕАЛЬНАЯ УСТАНОВКА
|
||||
print_package(f"Установка {pkg.full_name()}...")
|
||||
|
||||
source_dir = os.path.join(self.repo_path, "packages", package_name, "files")
|
||||
@@ -65,7 +82,7 @@ class PackageManager:
|
||||
|
||||
return True
|
||||
|
||||
def remove(self, package_name: str, force: bool = False) -> bool:
|
||||
def remove(self, package_name: str, force: bool = False, dry_run: bool = False) -> bool:
|
||||
print_step(f"Поиск пакета {package_name}...")
|
||||
|
||||
if not self.db.is_installed(package_name):
|
||||
@@ -74,6 +91,21 @@ class PackageManager:
|
||||
|
||||
pkg = self.db.get_package(package_name)
|
||||
|
||||
# DRY-RUN: только показываем, ничего не делаем
|
||||
if dry_run:
|
||||
print("🔍 РЕЖИМ DRY-RUN (ничего не удаляется)")
|
||||
print(f"\n🗑️ Будет удалён: {pkg.full_name()}")
|
||||
print(f" Файлы ({len(pkg.files)}):")
|
||||
for f in pkg.files:
|
||||
dst = os.path.join(self.root, f["destination"].lstrip("/"))
|
||||
if os.path.exists(dst):
|
||||
print(f" {dst} (существует)")
|
||||
else:
|
||||
print(f" {dst} (не найден)")
|
||||
print(f"\n✅ Удаление не произведено (dry-run)")
|
||||
return True
|
||||
|
||||
# РЕАЛЬНОЕ УДАЛЕНИЕ
|
||||
print_step(f"Удаление {pkg.full_name()}...")
|
||||
|
||||
for file_info in pkg.files:
|
||||
|
||||
Reference in New Issue
Block a user