#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File: src/scitex_writer/_cli/update.py
"""CLI: update engine files in a scitex-writer project."""
import argparse
import sys
from pathlib import Path
def cmd_update(args: argparse.Namespace) -> int:
"""Update engine files while preserving user content."""
from .. import update
project = Path(args.project).resolve()
if not project.exists():
print(f"Error: Project not found: {project}", file=sys.stderr)
return 1
result = update.project(
str(project),
branch=args.branch,
tag=args.tag,
dry_run=args.dry_run,
force=args.force,
)
if not result["success"]:
print(f"Error: {result['error']}", file=sys.stderr)
return 1
# Warnings (e.g. not a git repo)
for w in result.get("warnings", []):
print(f"Warning: {w}", file=sys.stderr)
# Report
if args.dry_run:
print("Dry run — no files modified.\n")
if result["updated_paths"]:
verb = "Would update" if args.dry_run else "Updated"
print(f"{verb}:")
for p in result["updated_paths"]:
print(f" {p}")
if result.get("missing_paths"):
print("\nNot found in source (skipped):")
for p in result["missing_paths"]:
print(f" {p}")
print(f"\n{result['message']}")
return 0
def register_parser(subparsers) -> argparse.ArgumentParser:
"""Register update subcommand."""
parser = subparsers.add_parser(
"update",
help="Update engine files of a scitex-writer project",
description=(
"Update build scripts, LaTeX styles, and base templates to the latest "
"version while preserving all user content (manuscript text, bibliography, "
"figures, tables, and metadata)."
),
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=(
"Examples:\n"
" scitex-writer update # update current directory\n"
" scitex-writer update ~/proj/my-paper # update specific project\n"
" scitex-writer update --dry-run # preview changes only\n"
" scitex-writer update --tag v2.8.0 # update to specific version\n"
),
)
parser.add_argument(
"project",
nargs="?",
default=".",
help="Project directory to update (default: current directory)",
)
parser.add_argument(
"--branch",
default=None,
metavar="BRANCH",
help="Pull from a specific template branch (requires internet)",
)
parser.add_argument(
"--tag",
default=None,
metavar="TAG",
help="Pull from a specific template tag/version (requires internet)",
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Show what would be updated without modifying any files",
)
parser.add_argument(
"--force",
action="store_true",
help="Skip git safety check (allow update with uncommitted changes)",
)
parser.set_defaults(func=cmd_update)
return parser
# EOF