Skip to content

.NET Package Management

Unified entry point for .NET SDK setup, registry config, and package updates

Metadata

  • Author: ropean, Claude Sonnet (Anthropic)
  • Version: 1.0.0
  • Dependencies: dotnet-setup.py, dotnet-registry.py, dotnet-update-packages.py

Code

python
#!/usr/bin/env python3
"""
@title .NET Package Management
@description Unified entry point for .NET SDK setup, registry config, and package updates
@author ropean, Claude Sonnet (Anthropic)
@version 1.0.0

Provides an interactive menu to run individual tools or execute all steps
sequentially:
    1. Check / Install .NET SDK
    2. Check / Configure GitHub Package Registry
    3. Update NuGet Packages

Each step delegates to a dedicated script in the same directory.

@example
Usage example:
    python dotnet-package-manage.py

@requires dotnet-setup.py, dotnet-registry.py, dotnet-update-packages.py
"""

import os
import subprocess
import sys

# ── Constants ──────────────────────────────────────────────────────────────────

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))

STEPS = [
    {
        "label": "Check / Install .NET SDK",
        "script": "dotnet-setup.py",
        "run_all_args": ["--install"],
    },
    {
        "label": "Check / Config GitHub Package Registry",
        "script": "dotnet-registry.py",
        "run_all_args": [],
    },
    {
        "label": "Update NuGet Packages",
        "script": "dotnet-update-packages.py",
        "run_all_args": [],
    },
]

# ── Colored output helpers ─────────────────────────────────────────────────────

_NO_COLOR = not sys.stdout.isatty()


def _colored(text: str, code: str) -> str:
    if _NO_COLOR:
        return text
    return f"\033[{code}m{text}\033[0m"


def green(text: str) -> str:
    return _colored(text, "32")


def yellow(text: str) -> str:
    return _colored(text, "33")


def red(text: str) -> str:
    return _colored(text, "31")


def cyan(text: str) -> str:
    return _colored(text, "36")


def dim(text: str) -> str:
    return _colored(text, "2")


# ── Execution ──────────────────────────────────────────────────────────────────


def run_step(step: dict, extra_args: list[str] | None = None) -> int:
    """Run a script and return its exit code."""
    script_path = os.path.join(SCRIPT_DIR, step["script"])
    cmd = [sys.executable, script_path] + (extra_args or [])
    print()
    print(cyan(f"{'─' * 60}"))
    print(cyan(f"  Step: {step['label']}"))
    print(cyan(f"  Script: {step['script']}"))
    print(cyan(f"{'─' * 60}"))
    result = subprocess.run(cmd)
    return result.returncode


def ask_continue() -> bool:
    """Ask user whether to continue after a failed step."""
    try:
        answer = input(yellow("  Continue to next step? (Y/n): ")).strip().lower()
    except (EOFError, KeyboardInterrupt):
        print()
        return False
    return answer != "n"


# ── Menu ───────────────────────────────────────────────────────────────────────


def show_menu() -> str | None:
    """Show interactive menu. Return '0'-'N' or None to exit."""
    print()
    print(f"  {green('[0]')} Run all steps (setup -> registry -> update)")
    for i, step in enumerate(STEPS):
        print(f"  {cyan(f'[{i + 1}]')} {step['label']}")
    print()

    max_idx = len(STEPS)
    while True:
        try:
            raw = input(f"  Enter your choice (0-{max_idx}, or X to exit): ").strip()
        except (EOFError, KeyboardInterrupt):
            print()
            return None
        if raw.upper() == "X":
            return None
        try:
            num = int(raw)
        except ValueError:
            print(red(f"  Invalid input. Enter 0-{max_idx}, or X."))
            continue
        if 0 <= num <= max_idx:
            return str(num)
        print(red(f"  Invalid input. Enter 0-{max_idx}, or X."))


# ── Main ───────────────────────────────────────────────────────────────────────


def main() -> int:
    print()
    print(cyan("=== .NET Package Management ==="))

    choice = show_menu()
    if choice is None:
        print(yellow("  Exiting."))
        return 0

    if choice == "0":
        for step in STEPS:
            rc = run_step(step, step["run_all_args"])
            if rc != 0:
                print()
                print(red(f"  Step '{step['label']}' exited with code {rc}."))
                if not ask_continue():
                    return rc
        print()
        print(green("All steps completed."))
        return 0

    idx = int(choice) - 1
    rc = run_step(STEPS[idx])
    return rc


if __name__ == "__main__":
    sys.exit(main())

File Information

  • Filename: dotnet-package-manage.py
  • Category: python
  • Language: PYTHON

View on GitHub