Discover projects from metadata globs.
(repo_root: Path, metadata: dict | None = None)
| 60 | |
| 61 | |
| 62 | def discover_projects(repo_root: Path, metadata: dict | None = None) -> list[Project]: |
| 63 | """Discover projects from metadata globs.""" |
| 64 | |
| 65 | metadata = metadata or load_metadata(repo_root) |
| 66 | projects: dict[str, Project] = {} |
| 67 | for root in metadata.get("project_roots", []): |
| 68 | pattern = root["glob"] |
| 69 | source = root.get("name", pattern) |
| 70 | for match in repo_root.glob(pattern): |
| 71 | if not match.is_dir(): |
| 72 | continue |
| 73 | relative_path = match.relative_to(repo_root).as_posix() |
| 74 | project_id = relative_path.replace("/", "__") |
| 75 | projects[relative_path] = Project( |
| 76 | id=project_id, |
| 77 | path=relative_path, |
| 78 | name=match.name, |
| 79 | source=source, |
| 80 | ) |
| 81 | return sorted(projects.values(), key=lambda project: project.path) |
| 82 | |
| 83 | |
| 84 | def validate_metadata(repo_root: Path, metadata: dict | None = None) -> list[str]: |