mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 17:25:39 +01:00
Issues model and branch/commit helpers
cgen-5978319a6b2d4949aeabd9574097ced7
This commit is contained in:
parent
d4db0aa942
commit
b6bc602f37
1 changed files with 71 additions and 0 deletions
71
website/src/website/switch/logic.ts
Normal file
71
website/src/website/switch/logic.ts
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
import { get, getAllByIndex, put, del, getSetting, setSetting, type RepoRecord, type BranchRecord, type CommitRecord, type IssueRecord } from "./db";
|
||||
import { nanoid } from "./uid";
|
||||
|
||||
const curBranchKey = (repoId: string) => `repo:${repoId}:currentBranchId`;
|
||||
|
||||
export async function getCurrentBranchId(repoId: string): Promise<string | undefined> {
|
||||
return getSetting<string>(curBranchKey(repoId));
|
||||
}
|
||||
|
||||
export async function setCurrentBranchId(repoId: string, branchId: string): Promise<void> {
|
||||
await setSetting(curBranchKey(repoId), branchId);
|
||||
}
|
||||
|
||||
export async function getBranch(repoId: string, name: string): Promise<BranchRecord | undefined> {
|
||||
const branches = await getAllByIndex<BranchRecord>("branches", "by_repo", repoId);
|
||||
return branches.find(b => b.name === name);
|
||||
}
|
||||
|
||||
export async function listCommitsReachable(repoId: string, headCommitId?: string): Promise<CommitRecord[]> {
|
||||
const all = await getAllByIndex<CommitRecord>("commits", "by_repo", repoId);
|
||||
if (!headCommitId) return [];
|
||||
const map = new Map(all.map(c => [c.id, c] as const));
|
||||
const visited = new Set<string>();
|
||||
const ordered: CommitRecord[] = [];
|
||||
const stack = [headCommitId];
|
||||
while (stack.length) {
|
||||
const id = stack.pop()!;
|
||||
if (visited.has(id)) continue;
|
||||
visited.add(id);
|
||||
const c = map.get(id);
|
||||
if (!c) continue;
|
||||
ordered.push(c);
|
||||
for (const p of c.parentIds) stack.push(p);
|
||||
}
|
||||
ordered.sort((a,b)=>b.timestamp - a.timestamp);
|
||||
return ordered;
|
||||
}
|
||||
|
||||
export async function commitOnBranch(repoId: string, branchId: string, message: string): Promise<CommitRecord> {
|
||||
const branch = await get<BranchRecord>("branches", branchId);
|
||||
if (!branch) throw new Error("Branch not found");
|
||||
const parent = branch.headCommitId ? [branch.headCommitId] : [];
|
||||
const commit: CommitRecord = { id: nanoid(), repoId, message, parentIds: parent, timestamp: Date.now() };
|
||||
await put("commits", commit);
|
||||
branch.headCommitId = commit.id;
|
||||
await put("branches", branch);
|
||||
return commit;
|
||||
}
|
||||
|
||||
export async function createIssue(repoId: string, data: { title: string; body?: string; labels?: string[]; branchId?: string; filePath?: string }): Promise<IssueRecord> {
|
||||
const issue: IssueRecord = {
|
||||
id: nanoid(), repoId,
|
||||
title: data.title, body: data.body || "",
|
||||
labels: data.labels || [], status: "open",
|
||||
createdAt: Date.now(), updatedAt: Date.now(),
|
||||
branchId: data.branchId, filePath: data.filePath
|
||||
};
|
||||
await put("issues", issue);
|
||||
return issue;
|
||||
}
|
||||
|
||||
export async function listIssues(repoId: string): Promise<IssueRecord[]> {
|
||||
return getAllByIndex<IssueRecord>("issues", "by_repo", repoId);
|
||||
}
|
||||
|
||||
export async function updateIssue(issue: IssueRecord): Promise<void> {
|
||||
issue.updatedAt = Date.now();
|
||||
await put("issues", issue);
|
||||
}
|
||||
|
||||
export async function deleteIssue(id: string): Promise<void> { await del("issues", id); }
|
||||
Loading…
Add table
Add a link
Reference in a new issue