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)