// Forks: a repository can be a copy of another one (`fork_of`), and pull requests can come from a // fork's branch. Such a pull request lives in the repository it proposes changes to; its head commit // is fetched there as refs/pull//head (like on GitHub), so its changes stay readable even // after the fork is deleted. `head_repo_name` keeps the fork's name for that case. migrate( (app) => { const repos = app.findCollectionByNameOrId("repos"); repos.fields.add(new RelationField({ name: "fork_of", collectionId: repos.id, maxSelect: 1, cascadeDelete: false })); repos.indexes.push("CREATE INDEX idx_repos_fork_of ON repos (fork_of)"); app.save(repos); const pulls = app.findCollectionByNameOrId("pull_requests"); pulls.fields.add(new RelationField({ name: "head_repo", collectionId: repos.id, maxSelect: 1, cascadeDelete: false })); pulls.fields.add(new TextField({ name: "head_repo_name", max: 200 })); pulls.indexes.push("CREATE INDEX idx_pull_requests_head_repo ON pull_requests (head_repo, head, state)"); app.save(pulls); }, (app) => { const pulls = app.findCollectionByNameOrId("pull_requests"); pulls.indexes = pulls.indexes.filter((i) => !i.includes("idx_pull_requests_head_repo")); pulls.fields.removeByName("head_repo"); pulls.fields.removeByName("head_repo_name"); app.save(pulls); const repos = app.findCollectionByNameOrId("repos"); repos.indexes = repos.indexes.filter((i) => !i.includes("idx_repos_fork_of")); repos.fields.removeByName("fork_of"); app.save(repos); }, );