Update control move

This commit is contained in:
Даниил Грабарь
2026-09-16 09:59:58 +10:00
parent d51c3737b9
commit 392036caf8
19 changed files with 603 additions and 130 deletions
+25 -23
View File
@@ -4,7 +4,7 @@ import argparse
import subprocess
from pathlib import Path
from cobot import process, ui
from cobot import process
from cobot.ui import done
from cobot.process import StepProgress
@@ -18,7 +18,7 @@ def _git(*args: str) -> str:
return subprocess.check_output(["git", *args], cwd=_PROJECT_DIR, text=True).strip()
def _update() -> None:
def _update() -> int:
"""Fetch the current branch, show incoming commits, pull, and reinstall the cobot CLI.
Progress: fetch (0-30 %), pull (30-80 %), reinstall (80-100 %).
Получает текущую ветку, показывает входящие коммиты, делает pull и переустанавливает CLI.
@@ -32,42 +32,44 @@ def _update() -> None:
p.set(0, "Получение с удалённого репозитория...")
rc = process.stream(["git", "fetch", "origin"], cwd=str(_PROJECT_DIR), on_line=p.log)
if rc not in (0, -9, -15):
done(False, "git fetch завершился с ошибкой")
return
if rc != 0:
done(False, f"git fetch завершился с кодом {rc}")
return 1
p.set(30)
behind = _git("rev-list", f"HEAD..origin/{branch}", "--count")
if behind == "0":
p.set(100, "Уже актуально")
done(True, "Уже актуальная версия")
return
p.log("Исходники уже актуальны; проверка установки CLI...")
else:
p.raw(f"\n[bold]{behind} новых коммит(ов):[/bold]")
for line in _git("log", f"HEAD..origin/{branch}", "--oneline").splitlines():
p.log(line)
p.raw(f"\n[bold]{behind} новых коммит(ов):[/bold]")
for line in _git("log", f"HEAD..origin/{branch}", "--oneline").splitlines():
p.log(line)
p.set(30, "Применение изменений...")
rc = process.stream(["git", "pull", "origin", branch],
cwd=str(_PROJECT_DIR), on_line=p.log)
if rc not in (0, -9, -15):
done(False, "git pull завершился с ошибкой")
return
p.set(30, "Применение изменений...")
rc = process.stream(["git", "pull", "origin", branch],
cwd=str(_PROJECT_DIR), on_line=p.log)
if rc != 0:
done(False, f"git pull завершился с кодом {rc}")
return 1
p.set(80)
p.set(80, "Переустановка cobot CLI...")
p.raw("\n[cyan]▸[/cyan] Переустановка cobot CLI...")
rc = process.stream(["uv", "tool", "install", "--editable", str(_PROJECT_DIR)],
on_line=p.log)
if rc in (0, -9, -15):
if rc == 0:
p.raw("[green]✓[/green] cobot переустановлен")
p.set(100, "Готово")
else:
p.raw("[yellow]Предупреждение:[/yellow] переустановка не удалась")
p.set(100, "Готово")
except subprocess.CalledProcessError as exc:
ok = False
fail_msg = (f"Установка CLI завершилась с кодом {rc}. "
"Исходники обновлены, но установка не завершена. "
"Сохраните вывод ошибки выше и повторите cobot update.")
except (subprocess.CalledProcessError, OSError) as exc:
ok, fail_msg = False, str(exc)
done(ok, "Проект обновлён" if ok else fail_msg)
return 0 if ok else 1
def register(subparsers: argparse._SubParsersAction) -> None:
@@ -76,4 +78,4 @@ def register(subparsers: argparse._SubParsersAction) -> None:
def run(args: argparse.Namespace) -> None:
_update()
raise SystemExit(_update())