From ac6e76ec81c26754be8993a9f9d2d4948f0d3f3c Mon Sep 17 00:00:00 2001 From: 24_ChernovaSS <24_ChernovaSS@iux.local> Date: Fri, 8 May 2026 00:51:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20dry-run=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=20install?= =?UTF-8?q?=20=D0=B8=20remove?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mypkg/cli/main.py | 12 ++++++++---- mypkg/core/package_manager.py | 36 +++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/mypkg/cli/main.py b/mypkg/cli/main.py index 872e568..dcc5676 100644 --- a/mypkg/cli/main.py +++ b/mypkg/cli/main.py @@ -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}'") diff --git a/mypkg/core/package_manager.py b/mypkg/core/package_manager.py index e01c884..72e8115 100644 --- a/mypkg/core/package_manager.py +++ b/mypkg/core/package_manager.py @@ -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: