Plain is headed towards 1.0! Subscribe for development updates →

  1import subprocess
  2import sys
  3from pathlib import Path
  4
  5import click
  6import tomllib
  7
  8
  9@click.command("contribute")
 10@click.option("--repo", default="../plain", help="Path to the plain repo")
 11@click.argument("package")
 12def cli(package, repo):
 13    """Contribute to plain by linking a package locally."""
 14
 15    if package == "reset":
 16        click.secho("Undoing any changes to pyproject.toml and poetry.lock", bold=True)
 17        result = subprocess.run(["git", "checkout", "pyproject.toml", "poetry.lock"])
 18        if result.returncode:
 19            click.secho("Failed to checkout pyproject.toml and poetry.lock", fg="red")
 20            sys.exit(result.returncode)
 21
 22        click.secho("Removing current .venv", bold=True)
 23        result = subprocess.run(["rm", "-rf", ".venv"])
 24        if result.returncode:
 25            click.secho("Failed to remove .venv", fg="red")
 26            sys.exit(result.returncode)
 27
 28        click.secho("Running poetry install", bold=True)
 29        result = subprocess.run(["poetry", "install"])
 30        if result.returncode:
 31            click.secho("Failed to install", fg="red")
 32            sys.exit(result.returncode)
 33
 34        return
 35
 36    repo = Path(repo)
 37    if not repo.exists():
 38        click.secho(f"Repo not found at {repo}", fg="red")
 39        return
 40
 41    repo_branch = (
 42        subprocess.check_output(
 43            [
 44                "git",
 45                "rev-parse",
 46                "--abbrev-ref",
 47                "HEAD",
 48            ],
 49            cwd=repo,
 50        )
 51        .decode()
 52        .strip()
 53    )
 54    click.secho(f"Using repo at {repo} ({repo_branch} branch)", bold=True)
 55
 56    pyproject = Path("pyproject.toml")
 57    if not pyproject.exists():
 58        click.secho("pyproject.toml not found", fg="red")
 59        return
 60
 61    poetry_group = "main"
 62
 63    with pyproject.open("rb") as f:
 64        pyproject_data = tomllib.load(f)
 65        poetry_dependencies = (
 66            pyproject_data.get("tool", {}).get("poetry", {}).get("dependencies", {})
 67        )
 68
 69        for group_name, group_data in (
 70            pyproject_data.get("tool", {}).get("poetry", {}).get("group", {}).items()
 71        ):
 72            if package in group_data.get("dependencies", {}).keys():
 73                poetry_group = group_name
 74                break
 75
 76        if not poetry_group and package not in poetry_dependencies.keys():
 77            click.secho(
 78                f"{package} not found in pyproject.toml (only poetry is supported)",
 79                fg="red",
 80            )
 81            return
 82
 83    click.secho(f"Linking {package} to {repo}", bold=True)
 84    if package == "plain" or package.startswith("plain-"):
 85        result = subprocess.run(
 86            [
 87                "poetry",
 88                "add",
 89                "--editable",
 90                "--group",
 91                poetry_group,
 92                str(repo / package),  # Link a subdirectory
 93            ]
 94        )
 95        if result.returncode:
 96            click.secho("Failed to link the package", fg="red")
 97            sys.exit(result.returncode)
 98    elif package.startswith("plainx-"):
 99        result = subprocess.run(
100            [
101                "poetry",
102                "add",
103                "--editable",
104                "--group",
105                poetry_group,
106                str(repo),
107            ]
108        )
109        if result.returncode:
110            click.secho("Failed to link the package", fg="red")
111            sys.exit(result.returncode)
112    else:
113        click.secho(f"Unknown package {package}", fg="red")
114        sys.exit(2)