@trebired/git-host 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +12 -6
- package/dist/api/forge/handler.d.ts +6 -0
- package/dist/api/forge/handler.d.ts.map +1 -0
- package/dist/api/forge/handler.js +260 -0
- package/dist/api/forge/handler.js.map +1 -0
- package/dist/api/forge/route.d.ts +34 -0
- package/dist/api/forge/route.d.ts.map +1 -0
- package/dist/api/forge/route.js +94 -0
- package/dist/api/forge/route.js.map +1 -0
- package/dist/api/handler/response.d.ts +6 -2
- package/dist/api/handler/response.d.ts.map +1 -1
- package/dist/api/handler/response.js +5 -0
- package/dist/api/handler/response.js.map +1 -1
- package/dist/browser/index.d.ts +44 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +767 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/styles.css +242 -0
- package/dist/core/create_git_forge.d.ts +4 -0
- package/dist/core/create_git_forge.d.ts.map +1 -0
- package/dist/core/create_git_forge.js +481 -0
- package/dist/core/create_git_forge.js.map +1 -0
- package/dist/core/git_forge/storage_memory.d.ts +4 -0
- package/dist/core/git_forge/storage_memory.d.ts.map +1 -0
- package/dist/core/git_forge/storage_memory.js +140 -0
- package/dist/core/git_forge/storage_memory.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/react/client/types.d.ts +45 -1
- package/dist/react/client/types.d.ts.map +1 -1
- package/dist/react/client.d.ts.map +1 -1
- package/dist/react/client.js +135 -2
- package/dist/react/client.js.map +1 -1
- package/dist/react/hooks/query.d.ts +6 -2
- package/dist/react/hooks/query.d.ts.map +1 -1
- package/dist/react/hooks/query.js +41 -1
- package/dist/react/hooks/query.js.map +1 -1
- package/dist/react/hooks/resources.d.ts +50 -3
- package/dist/react/hooks/resources.d.ts.map +1 -1
- package/dist/react/hooks/resources.js +209 -2
- package/dist/react/hooks/resources.js.map +1 -1
- package/dist/react/hooks/types.d.ts +15 -2
- package/dist/react/hooks/types.d.ts.map +1 -1
- package/dist/react/hooks.d.ts +3 -3
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/hooks.js +2 -2
- package/dist/react/hooks.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/types/forge.d.ts +220 -0
- package/dist/types/forge.d.ts.map +1 -0
- package/dist/types/forge.js +2 -0
- package/dist/types/forge.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/transports.d.ts +1 -1
- package/dist/types/transports.d.ts.map +1 -1
- package/package.json +11 -4
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { logPackageInitialized } from "@trebired/logger-adapter";
|
|
5
|
+
import { GitHostError } from "../errors.js";
|
|
6
|
+
import { resolveLogger } from "../logging.js";
|
|
7
|
+
import { text } from "../utils/text.js";
|
|
8
|
+
import { fetchRepository } from "./remote.js";
|
|
9
|
+
import { buildGitEnv, cloneRepository, ensureHostedRepositoryConfig, repositoryExists, runGit } from "./run_git.js";
|
|
10
|
+
function repositoryHandleFromSummary(summary) {
|
|
11
|
+
return {
|
|
12
|
+
id: summary.repository.id,
|
|
13
|
+
path: summary.repository.path,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function assertActor(actor) {
|
|
17
|
+
if (!actor || !text(actor.id)) {
|
|
18
|
+
throw new GitHostError("forge_invalid_actor", "A stable actor id is required for forge mutations.");
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...actor,
|
|
22
|
+
id: text(actor.id),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function nowIso() {
|
|
26
|
+
return new Date().toISOString();
|
|
27
|
+
}
|
|
28
|
+
async function countDistinct(values) {
|
|
29
|
+
return new Set((values || []).map((value) => text(value)).filter(Boolean)).size;
|
|
30
|
+
}
|
|
31
|
+
async function readForkStatus(forkRepository, upstreamRepository, upstreamBranch) {
|
|
32
|
+
const hasFork = await repositoryExists(forkRepository.path);
|
|
33
|
+
if (!hasFork) {
|
|
34
|
+
throw new GitHostError("repository_not_initialized", `Repository "${forkRepository.id}" is not initialized.`, {
|
|
35
|
+
path: forkRepository.path,
|
|
36
|
+
repositoryId: forkRepository.id,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
await ensureUpstreamRemote(forkRepository, upstreamRepository.path);
|
|
40
|
+
await fetchRepository(forkRepository, { remote: "upstream" });
|
|
41
|
+
const branchRes = await runGit(["rev-parse", "--abbrev-ref", "HEAD"], { cwd: forkRepository.path });
|
|
42
|
+
if (!branchRes.ok) {
|
|
43
|
+
throw new GitHostError("git_command_failed", text(branchRes.stderr, "Failed to resolve the fork branch."), {
|
|
44
|
+
repositoryId: forkRepository.id,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const forkBranch = text(branchRes.stdout);
|
|
48
|
+
const compareRes = await runGit(["rev-list", "--left-right", "--count", `${forkBranch}...upstream/${upstreamBranch}`], {
|
|
49
|
+
cwd: forkRepository.path,
|
|
50
|
+
});
|
|
51
|
+
if (!compareRes.ok) {
|
|
52
|
+
throw new GitHostError("git_command_failed", text(compareRes.stderr, "Failed to compare fork progress."), {
|
|
53
|
+
forkBranch,
|
|
54
|
+
repositoryId: forkRepository.id,
|
|
55
|
+
upstreamBranch,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const [aheadText, behindText] = text(compareRes.stdout).split(/\s+/);
|
|
59
|
+
return {
|
|
60
|
+
ahead: Number(aheadText) || 0,
|
|
61
|
+
behind: Number(behindText) || 0,
|
|
62
|
+
fork_branch: forkBranch,
|
|
63
|
+
upstream_branch: upstreamBranch,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function ensureUpstreamRemote(repository, upstreamPath) {
|
|
67
|
+
const listRes = await runGit(["remote"], { cwd: repository.path });
|
|
68
|
+
if (!listRes.ok) {
|
|
69
|
+
throw new GitHostError("git_command_failed", text(listRes.stderr, "Failed to list repository remotes."), {
|
|
70
|
+
repositoryId: repository.id,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const remotes = new Set(text(listRes.stdout).split(/\r?\n/).map((entry) => text(entry)).filter(Boolean));
|
|
74
|
+
const command = remotes.has("upstream")
|
|
75
|
+
? ["remote", "set-url", "upstream", upstreamPath]
|
|
76
|
+
: ["remote", "add", "upstream", upstreamPath];
|
|
77
|
+
const remoteRes = await runGit(command, { cwd: repository.path });
|
|
78
|
+
if (!remoteRes.ok) {
|
|
79
|
+
throw new GitHostError("git_command_failed", text(remoteRes.stderr, "Failed to configure the upstream remote."), {
|
|
80
|
+
repositoryId: repository.id,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function buildActivitySummary(kind, repositoryId, metadata) {
|
|
85
|
+
switch (kind) {
|
|
86
|
+
case "release.create":
|
|
87
|
+
return `Published release ${text(metadata.tag_name)} in ${repositoryId}.`;
|
|
88
|
+
case "release.update":
|
|
89
|
+
return `Updated release ${text(metadata.release_id)} in ${repositoryId}.`;
|
|
90
|
+
case "release.delete":
|
|
91
|
+
return `Deleted release ${text(metadata.release_id)} in ${repositoryId}.`;
|
|
92
|
+
case "fork.create":
|
|
93
|
+
return `Created fork ${text(metadata.fork_repository_id)} from ${repositoryId}.`;
|
|
94
|
+
case "fork.sync":
|
|
95
|
+
return `Synced fork ${text(metadata.fork_repository_id)} with ${repositoryId}.`;
|
|
96
|
+
case "star":
|
|
97
|
+
return `Starred ${repositoryId}.`;
|
|
98
|
+
case "unstar":
|
|
99
|
+
return `Unstarred ${repositoryId}.`;
|
|
100
|
+
case "watch":
|
|
101
|
+
return `Started watching ${repositoryId}.`;
|
|
102
|
+
case "unwatch":
|
|
103
|
+
return `Stopped watching ${repositoryId}.`;
|
|
104
|
+
default:
|
|
105
|
+
return `Updated ${repositoryId}.`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function createGitForge(options) {
|
|
109
|
+
if (!options || typeof options.gitHost !== "object") {
|
|
110
|
+
throw new TypeError("createGitForge() requires a gitHost instance.");
|
|
111
|
+
}
|
|
112
|
+
if (!options.storage || typeof options.storage !== "object") {
|
|
113
|
+
throw new TypeError("createGitForge() requires a storage adapter.");
|
|
114
|
+
}
|
|
115
|
+
if (typeof options.createForkRepository !== "function") {
|
|
116
|
+
throw new TypeError("createGitForge() requires createForkRepository().");
|
|
117
|
+
}
|
|
118
|
+
const logger = resolveLogger(options.logger, options.loggerAdapter);
|
|
119
|
+
const logGroup = "git-host.forge";
|
|
120
|
+
const verbose = options.verbose === true;
|
|
121
|
+
logPackageInitialized({
|
|
122
|
+
adapter: options.loggerAdapter,
|
|
123
|
+
fallback: "console",
|
|
124
|
+
group: logGroup,
|
|
125
|
+
logger: options.logger,
|
|
126
|
+
source: "@trebired/git-host",
|
|
127
|
+
});
|
|
128
|
+
async function recordActivity(repositoryId, actor, kind, metadata = {}) {
|
|
129
|
+
const entry = {
|
|
130
|
+
actor_id: actor.id,
|
|
131
|
+
created_at: nowIso(),
|
|
132
|
+
id: randomUUID(),
|
|
133
|
+
kind,
|
|
134
|
+
metadata,
|
|
135
|
+
repository_id: repositoryId,
|
|
136
|
+
summary: buildActivitySummary(kind, repositoryId, metadata),
|
|
137
|
+
};
|
|
138
|
+
return await options.storage.activity.createActivity(entry);
|
|
139
|
+
}
|
|
140
|
+
async function readSocialState(repositoryId, actorId) {
|
|
141
|
+
const [stars, watchers, viewerHasStarred, viewerIsWatching] = await Promise.all([
|
|
142
|
+
options.storage.social.listStars ? options.storage.social.listStars(repositoryId) : Promise.resolve([]),
|
|
143
|
+
options.storage.social.listWatchers ? options.storage.social.listWatchers(repositoryId) : Promise.resolve([]),
|
|
144
|
+
actorId ? options.storage.social.viewerHasStarred(repositoryId, actorId) : Promise.resolve(false),
|
|
145
|
+
actorId ? options.storage.social.viewerIsWatching(repositoryId, actorId) : Promise.resolve(false),
|
|
146
|
+
]);
|
|
147
|
+
return {
|
|
148
|
+
repository_id: repositoryId,
|
|
149
|
+
star_count: await countDistinct(stars),
|
|
150
|
+
viewer_has_starred: viewerHasStarred,
|
|
151
|
+
viewer_is_watching: viewerIsWatching,
|
|
152
|
+
watcher_count: await countDistinct(watchers),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function readOverview(repositoryId, actorId) {
|
|
156
|
+
const [repository, releases, forks, activity, social] = await Promise.all([
|
|
157
|
+
options.gitHost.readSummary(repositoryId),
|
|
158
|
+
options.storage.releases.listReleases(repositoryId),
|
|
159
|
+
options.storage.forks.listForks(repositoryId),
|
|
160
|
+
options.storage.activity.listActivity(repositoryId),
|
|
161
|
+
readSocialState(repositoryId, actorId),
|
|
162
|
+
]);
|
|
163
|
+
const sortedReleases = Array.from(releases).sort((left, right) => text(right.published_at || right.created_at).localeCompare(text(left.published_at || left.created_at)));
|
|
164
|
+
return {
|
|
165
|
+
activity_count: activity.length,
|
|
166
|
+
fork_count: forks.length,
|
|
167
|
+
latest_release: sortedReleases[0] || null,
|
|
168
|
+
release_count: sortedReleases.length,
|
|
169
|
+
repository,
|
|
170
|
+
social,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async function readRequiredRelease(repositoryId, releaseId) {
|
|
174
|
+
const release = await options.storage.releases.readRelease(repositoryId, releaseId);
|
|
175
|
+
if (!release) {
|
|
176
|
+
throw new GitHostError("forge_resource_not_found", `Release "${releaseId}" was not found.`, {
|
|
177
|
+
releaseId,
|
|
178
|
+
repositoryId,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return release;
|
|
182
|
+
}
|
|
183
|
+
async function readRequiredFork(forkRepositoryId) {
|
|
184
|
+
const fork = await options.storage.forks.readFork(forkRepositoryId);
|
|
185
|
+
if (!fork) {
|
|
186
|
+
throw new GitHostError("forge_resource_not_found", `Fork "${forkRepositoryId}" was not found.`, {
|
|
187
|
+
forkRepositoryId,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return fork;
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
async readOverview(repositoryId, input = {}) {
|
|
194
|
+
return await readOverview(repositoryId, text(input.actorId));
|
|
195
|
+
},
|
|
196
|
+
async readSocialState(repositoryId, input = {}) {
|
|
197
|
+
return await readSocialState(repositoryId, text(input.actorId));
|
|
198
|
+
},
|
|
199
|
+
async starRepository(repositoryId, input) {
|
|
200
|
+
const actor = assertActor(input.actor);
|
|
201
|
+
await options.storage.social.setStar(repositoryId, actor.id, true);
|
|
202
|
+
await recordActivity(repositoryId, actor, "star", {});
|
|
203
|
+
return await readSocialState(repositoryId, actor.id);
|
|
204
|
+
},
|
|
205
|
+
async unstarRepository(repositoryId, input) {
|
|
206
|
+
const actor = assertActor(input.actor);
|
|
207
|
+
await options.storage.social.setStar(repositoryId, actor.id, false);
|
|
208
|
+
await recordActivity(repositoryId, actor, "unstar", {});
|
|
209
|
+
return await readSocialState(repositoryId, actor.id);
|
|
210
|
+
},
|
|
211
|
+
async watchRepository(repositoryId, input) {
|
|
212
|
+
const actor = assertActor(input.actor);
|
|
213
|
+
await options.storage.social.setWatching(repositoryId, actor.id, true);
|
|
214
|
+
await recordActivity(repositoryId, actor, "watch", {});
|
|
215
|
+
return await readSocialState(repositoryId, actor.id);
|
|
216
|
+
},
|
|
217
|
+
async unwatchRepository(repositoryId, input) {
|
|
218
|
+
const actor = assertActor(input.actor);
|
|
219
|
+
await options.storage.social.setWatching(repositoryId, actor.id, false);
|
|
220
|
+
await recordActivity(repositoryId, actor, "unwatch", {});
|
|
221
|
+
return await readSocialState(repositoryId, actor.id);
|
|
222
|
+
},
|
|
223
|
+
async listReleases(repositoryId) {
|
|
224
|
+
const releases = await options.storage.releases.listReleases(repositoryId);
|
|
225
|
+
return Array.from(releases).sort((left, right) => text(right.published_at || right.created_at).localeCompare(text(left.published_at || left.created_at)));
|
|
226
|
+
},
|
|
227
|
+
async readRelease(repositoryId, releaseId) {
|
|
228
|
+
return await readRequiredRelease(repositoryId, releaseId);
|
|
229
|
+
},
|
|
230
|
+
async createRelease(repositoryId, input) {
|
|
231
|
+
const actor = assertActor(input.actor);
|
|
232
|
+
const existingTagName = text(input.existingTagName);
|
|
233
|
+
const createTag = input.createTag;
|
|
234
|
+
if (!existingTagName && !createTag) {
|
|
235
|
+
throw new GitHostError("forge_invalid_input", "A release requires either existingTagName or createTag.", {
|
|
236
|
+
repositoryId,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
let tagName = existingTagName;
|
|
240
|
+
let targetRef = "";
|
|
241
|
+
if (createTag) {
|
|
242
|
+
tagName = text(createTag.name);
|
|
243
|
+
targetRef = text(createTag.targetRef, "HEAD");
|
|
244
|
+
await options.gitHost.createTag(repositoryId, {
|
|
245
|
+
actor: {
|
|
246
|
+
email: actor.email,
|
|
247
|
+
id: actor.id,
|
|
248
|
+
name: actor.name,
|
|
249
|
+
},
|
|
250
|
+
message: text(createTag.annotatedMessage),
|
|
251
|
+
name: tagName,
|
|
252
|
+
ref: targetRef,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const tagDetail = await options.gitHost.readTag(repositoryId, tagName);
|
|
256
|
+
const createdAt = nowIso();
|
|
257
|
+
const release = {
|
|
258
|
+
assets: options.releaseAssetStore?.normalizeAssets
|
|
259
|
+
? await options.releaseAssetStore.normalizeAssets(repositoryId, Array.isArray(input.assets) ? input.assets : [])
|
|
260
|
+
: Array.isArray(input.assets) ? input.assets : [],
|
|
261
|
+
author_id: actor.id,
|
|
262
|
+
created_at: createdAt,
|
|
263
|
+
draft: input.draft === true,
|
|
264
|
+
id: randomUUID(),
|
|
265
|
+
notes: text(input.notes),
|
|
266
|
+
prerelease: input.prerelease === true,
|
|
267
|
+
published_at: input.draft === true ? null : (input.publishedAt === null ? null : text(input.publishedAt, createdAt)),
|
|
268
|
+
repository_id: repositoryId,
|
|
269
|
+
tag_name: tagName,
|
|
270
|
+
target_ref: targetRef || text(tagDetail.target_hash),
|
|
271
|
+
title: text(input.title, tagName),
|
|
272
|
+
updated_at: createdAt,
|
|
273
|
+
};
|
|
274
|
+
const created = await options.storage.releases.createRelease(release);
|
|
275
|
+
await recordActivity(repositoryId, actor, "release.create", {
|
|
276
|
+
release_id: created.id,
|
|
277
|
+
tag_name: created.tag_name,
|
|
278
|
+
});
|
|
279
|
+
return created;
|
|
280
|
+
},
|
|
281
|
+
async updateRelease(repositoryId, releaseId, input) {
|
|
282
|
+
const actor = assertActor(input.actor);
|
|
283
|
+
await readRequiredRelease(repositoryId, releaseId);
|
|
284
|
+
const assets = options.releaseAssetStore?.normalizeAssets
|
|
285
|
+
? await options.releaseAssetStore.normalizeAssets(repositoryId, Array.isArray(input.assets) ? input.assets : [])
|
|
286
|
+
: input.assets;
|
|
287
|
+
const updated = await options.storage.releases.updateRelease(repositoryId, releaseId, {
|
|
288
|
+
...(Array.isArray(assets) ? { assets } : {}),
|
|
289
|
+
...(input.draft != null ? { draft: input.draft === true } : {}),
|
|
290
|
+
...(input.notes != null ? { notes: text(input.notes) } : {}),
|
|
291
|
+
...(input.prerelease != null ? { prerelease: input.prerelease === true } : {}),
|
|
292
|
+
...(input.publishedAt !== undefined ? { published_at: input.publishedAt === null ? null : text(input.publishedAt) } : {}),
|
|
293
|
+
...(input.title != null ? { title: text(input.title) } : {}),
|
|
294
|
+
updated_at: nowIso(),
|
|
295
|
+
});
|
|
296
|
+
if (!updated) {
|
|
297
|
+
throw new GitHostError("forge_resource_not_found", `Release "${releaseId}" was not found.`, {
|
|
298
|
+
releaseId,
|
|
299
|
+
repositoryId,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
await recordActivity(repositoryId, actor, "release.update", {
|
|
303
|
+
release_id: releaseId,
|
|
304
|
+
});
|
|
305
|
+
return updated;
|
|
306
|
+
},
|
|
307
|
+
async deleteRelease(repositoryId, releaseId, input) {
|
|
308
|
+
const actor = assertActor(input.actor);
|
|
309
|
+
const existing = await readRequiredRelease(repositoryId, releaseId);
|
|
310
|
+
const deleted = await options.storage.releases.deleteRelease(repositoryId, releaseId);
|
|
311
|
+
if (!deleted) {
|
|
312
|
+
throw new GitHostError("forge_resource_not_found", `Release "${releaseId}" was not found.`, {
|
|
313
|
+
releaseId,
|
|
314
|
+
repositoryId,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
if (input.deleteTag === true) {
|
|
318
|
+
await options.gitHost.deleteTag(repositoryId, {
|
|
319
|
+
name: existing.tag_name,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
await recordActivity(repositoryId, actor, "release.delete", {
|
|
323
|
+
release_id: releaseId,
|
|
324
|
+
tag_name: existing.tag_name,
|
|
325
|
+
});
|
|
326
|
+
},
|
|
327
|
+
async listActivity(repositoryId) {
|
|
328
|
+
const entries = await options.storage.activity.listActivity(repositoryId);
|
|
329
|
+
return Array.from(entries).sort((left, right) => text(right.created_at).localeCompare(text(left.created_at)));
|
|
330
|
+
},
|
|
331
|
+
async listForks(repositoryId) {
|
|
332
|
+
const upstreamSummary = await readOverview(repositoryId);
|
|
333
|
+
const upstreamRepository = repositoryHandleFromSummary(upstreamSummary.repository);
|
|
334
|
+
const upstreamBranch = text(upstreamSummary.repository.repository.default_branch, "main");
|
|
335
|
+
const forks = await options.storage.forks.listForks(repositoryId);
|
|
336
|
+
return await Promise.all(forks.map(async (fork) => {
|
|
337
|
+
const forkSummary = await readOverview(fork.fork_repository_id);
|
|
338
|
+
const forkRepository = repositoryHandleFromSummary(forkSummary.repository);
|
|
339
|
+
return {
|
|
340
|
+
created_at: fork.created_at,
|
|
341
|
+
created_by: fork.created_by,
|
|
342
|
+
fork_repository_id: fork.fork_repository_id,
|
|
343
|
+
fork_status: await readForkStatus(forkRepository, upstreamRepository, upstreamBranch),
|
|
344
|
+
upstream_repository_id: fork.upstream_repository_id,
|
|
345
|
+
};
|
|
346
|
+
}));
|
|
347
|
+
},
|
|
348
|
+
async createFork(repositoryId, input) {
|
|
349
|
+
const actor = assertActor(input.actor);
|
|
350
|
+
const upstreamSummary = await readOverview(repositoryId);
|
|
351
|
+
const upstreamRepository = repositoryHandleFromSummary(upstreamSummary.repository);
|
|
352
|
+
const upstreamBranch = text(upstreamSummary.repository.repository.default_branch, "main");
|
|
353
|
+
const forkRepository = await options.createForkRepository({
|
|
354
|
+
actor,
|
|
355
|
+
upstreamRepository,
|
|
356
|
+
upstreamRepositoryId: repositoryId,
|
|
357
|
+
});
|
|
358
|
+
if (!forkRepository || !text(forkRepository.id) || !text(forkRepository.path)) {
|
|
359
|
+
throw new GitHostError("forge_invalid_input", "createForkRepository() must return a repository id and absolute path.", {
|
|
360
|
+
repositoryId,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
fs.mkdirSync(path.dirname(forkRepository.path), { recursive: true });
|
|
364
|
+
const cloneRes = await cloneRepository({
|
|
365
|
+
cloneUrl: upstreamRepository.path,
|
|
366
|
+
workspaceRoot: forkRepository.path,
|
|
367
|
+
});
|
|
368
|
+
if (!cloneRes.ok) {
|
|
369
|
+
throw new GitHostError("git_command_failed", text(cloneRes.stderr, "Failed to clone the fork repository."), {
|
|
370
|
+
forkRepositoryId: forkRepository.id,
|
|
371
|
+
repositoryId,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
const hostedRes = await ensureHostedRepositoryConfig(forkRepository.path);
|
|
375
|
+
if (!hostedRes.ok) {
|
|
376
|
+
throw new GitHostError("git_command_failed", text(hostedRes.stderr, "Failed to configure the fork repository."), {
|
|
377
|
+
forkRepositoryId: forkRepository.id,
|
|
378
|
+
repositoryId,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
await ensureUpstreamRemote(forkRepository, upstreamRepository.path);
|
|
382
|
+
await fetchRepository(forkRepository, { remote: "upstream" });
|
|
383
|
+
const createdAt = nowIso();
|
|
384
|
+
await options.storage.forks.createFork({
|
|
385
|
+
created_at: createdAt,
|
|
386
|
+
created_by: actor.id,
|
|
387
|
+
fork_repository_id: forkRepository.id,
|
|
388
|
+
upstream_repository_id: repositoryId,
|
|
389
|
+
});
|
|
390
|
+
await recordActivity(repositoryId, actor, "fork.create", {
|
|
391
|
+
fork_repository_id: forkRepository.id,
|
|
392
|
+
});
|
|
393
|
+
if (verbose) {
|
|
394
|
+
logger.info(logGroup, "created forge fork", {
|
|
395
|
+
forkRepositoryId: forkRepository.id,
|
|
396
|
+
repositoryId,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
return {
|
|
400
|
+
created_at: createdAt,
|
|
401
|
+
created_by: actor.id,
|
|
402
|
+
fork_repository_id: forkRepository.id,
|
|
403
|
+
fork_status: await readForkStatus(forkRepository, upstreamRepository, upstreamBranch),
|
|
404
|
+
upstream_repository_id: repositoryId,
|
|
405
|
+
};
|
|
406
|
+
},
|
|
407
|
+
async syncFork(forkRepositoryId, input) {
|
|
408
|
+
const actor = assertActor(input.actor);
|
|
409
|
+
const fork = await readRequiredFork(forkRepositoryId);
|
|
410
|
+
const upstreamSummary = await readOverview(fork.upstream_repository_id);
|
|
411
|
+
const forkSummary = await readOverview(fork.fork_repository_id);
|
|
412
|
+
const upstreamRepository = repositoryHandleFromSummary(upstreamSummary.repository);
|
|
413
|
+
const forkRepository = repositoryHandleFromSummary(forkSummary.repository);
|
|
414
|
+
const upstreamBranch = text(upstreamSummary.repository.repository.default_branch, "main");
|
|
415
|
+
const forkBranch = text(forkSummary.repository.repository.current_branch || forkSummary.repository.repository.default_branch, "main");
|
|
416
|
+
const strategy = input.strategy || "ff-only";
|
|
417
|
+
await ensureUpstreamRemote(forkRepository, upstreamRepository.path);
|
|
418
|
+
await fetchRepository(forkRepository, { remote: "upstream" });
|
|
419
|
+
if (forkBranch !== forkSummary.repository.repository.current_branch) {
|
|
420
|
+
await options.gitHost.checkoutBranch(forkRepository.id, { name: forkBranch });
|
|
421
|
+
}
|
|
422
|
+
const upstreamRef = `upstream/${upstreamBranch}`;
|
|
423
|
+
if (strategy === "ff-only") {
|
|
424
|
+
const ffCheck = await runGit(["merge-base", "--is-ancestor", forkBranch, upstreamRef], { cwd: forkRepository.path });
|
|
425
|
+
if (!ffCheck.ok) {
|
|
426
|
+
throw new GitHostError("forge_sync_conflict", "The fork cannot be fast-forwarded from upstream.", {
|
|
427
|
+
forkRepositoryId,
|
|
428
|
+
upstreamBranch,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
const mergeRes = await runGit(["merge", "--ff-only", upstreamRef], {
|
|
432
|
+
cwd: forkRepository.path,
|
|
433
|
+
env: buildGitEnv({
|
|
434
|
+
actor: {
|
|
435
|
+
email: actor.email,
|
|
436
|
+
id: actor.id,
|
|
437
|
+
name: actor.name,
|
|
438
|
+
},
|
|
439
|
+
}),
|
|
440
|
+
});
|
|
441
|
+
if (!mergeRes.ok) {
|
|
442
|
+
throw new GitHostError("forge_sync_conflict", text(mergeRes.stderr, "The fork cannot be fast-forwarded from upstream."), {
|
|
443
|
+
forkRepositoryId,
|
|
444
|
+
upstreamBranch,
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
const mergeRes = await runGit(["merge", "--no-edit", upstreamRef], {
|
|
450
|
+
cwd: forkRepository.path,
|
|
451
|
+
env: buildGitEnv({
|
|
452
|
+
actor: {
|
|
453
|
+
email: actor.email,
|
|
454
|
+
id: actor.id,
|
|
455
|
+
name: actor.name,
|
|
456
|
+
},
|
|
457
|
+
}),
|
|
458
|
+
});
|
|
459
|
+
if (!mergeRes.ok) {
|
|
460
|
+
throw new GitHostError("forge_sync_conflict", text(mergeRes.stderr, "Failed to merge upstream changes into the fork."), {
|
|
461
|
+
forkRepositoryId,
|
|
462
|
+
upstreamBranch,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
await recordActivity(fork.upstream_repository_id, actor, "fork.sync", {
|
|
467
|
+
fork_repository_id: forkRepositoryId,
|
|
468
|
+
strategy,
|
|
469
|
+
});
|
|
470
|
+
return {
|
|
471
|
+
created_at: fork.created_at,
|
|
472
|
+
created_by: fork.created_by,
|
|
473
|
+
fork_repository_id: fork.fork_repository_id,
|
|
474
|
+
fork_status: await readForkStatus(forkRepository, upstreamRepository, upstreamBranch),
|
|
475
|
+
upstream_repository_id: fork.upstream_repository_id,
|
|
476
|
+
};
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
export { createGitForge };
|
|
481
|
+
//# sourceMappingURL=create_git_forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_git_forge.js","sourceRoot":"","sources":["../../src/core/create_git_forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage_memory.d.ts","sourceRoot":"","sources":["../../../src/core/git_forge/storage_memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAGxB,iBAAS,oCAAoC,IAAI,sBAAsB,CAsItE;AAED,OAAO,EAAE,oCAAoC,EAAE,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { text } from "../../utils/text.js";
|
|
3
|
+
function createInMemoryGitForgeStorageAdapter() {
|
|
4
|
+
const releases = new Map();
|
|
5
|
+
const stars = new Map();
|
|
6
|
+
const watchers = new Map();
|
|
7
|
+
const forks = new Map();
|
|
8
|
+
const forksByUpstream = new Map();
|
|
9
|
+
const activity = new Map();
|
|
10
|
+
function releaseMap(repositoryId) {
|
|
11
|
+
const key = text(repositoryId);
|
|
12
|
+
let current = releases.get(key);
|
|
13
|
+
if (!current) {
|
|
14
|
+
current = new Map();
|
|
15
|
+
releases.set(key, current);
|
|
16
|
+
}
|
|
17
|
+
return current;
|
|
18
|
+
}
|
|
19
|
+
function relationSet(repositoryId) {
|
|
20
|
+
const key = text(repositoryId);
|
|
21
|
+
let current = forksByUpstream.get(key);
|
|
22
|
+
if (!current) {
|
|
23
|
+
current = new Set();
|
|
24
|
+
forksByUpstream.set(key, current);
|
|
25
|
+
}
|
|
26
|
+
return current;
|
|
27
|
+
}
|
|
28
|
+
function stringSet(store, repositoryId) {
|
|
29
|
+
const key = text(repositoryId);
|
|
30
|
+
let current = store.get(key);
|
|
31
|
+
if (!current) {
|
|
32
|
+
current = new Set();
|
|
33
|
+
store.set(key, current);
|
|
34
|
+
}
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
releases: {
|
|
39
|
+
async listReleases(repositoryId) {
|
|
40
|
+
return Array.from(releaseMap(repositoryId).values());
|
|
41
|
+
},
|
|
42
|
+
async readRelease(repositoryId, releaseId) {
|
|
43
|
+
return releaseMap(repositoryId).get(text(releaseId)) || null;
|
|
44
|
+
},
|
|
45
|
+
async createRelease(input) {
|
|
46
|
+
const release = {
|
|
47
|
+
...input,
|
|
48
|
+
id: text(input.id) || randomUUID(),
|
|
49
|
+
};
|
|
50
|
+
releaseMap(release.repository_id).set(release.id, release);
|
|
51
|
+
return release;
|
|
52
|
+
},
|
|
53
|
+
async updateRelease(repositoryId, releaseId, input) {
|
|
54
|
+
const current = releaseMap(repositoryId).get(text(releaseId));
|
|
55
|
+
if (!current)
|
|
56
|
+
return null;
|
|
57
|
+
const next = {
|
|
58
|
+
...current,
|
|
59
|
+
...input,
|
|
60
|
+
};
|
|
61
|
+
releaseMap(repositoryId).set(text(releaseId), next);
|
|
62
|
+
return next;
|
|
63
|
+
},
|
|
64
|
+
async deleteRelease(repositoryId, releaseId) {
|
|
65
|
+
const map = releaseMap(repositoryId);
|
|
66
|
+
const current = map.get(text(releaseId)) || null;
|
|
67
|
+
map.delete(text(releaseId));
|
|
68
|
+
return current;
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
social: {
|
|
72
|
+
async listStars(repositoryId) {
|
|
73
|
+
return Array.from(stringSet(stars, repositoryId));
|
|
74
|
+
},
|
|
75
|
+
async listWatchers(repositoryId) {
|
|
76
|
+
return Array.from(stringSet(watchers, repositoryId));
|
|
77
|
+
},
|
|
78
|
+
async setStar(repositoryId, actorId, starred) {
|
|
79
|
+
const set = stringSet(stars, repositoryId);
|
|
80
|
+
if (starred)
|
|
81
|
+
set.add(text(actorId));
|
|
82
|
+
else
|
|
83
|
+
set.delete(text(actorId));
|
|
84
|
+
},
|
|
85
|
+
async setWatching(repositoryId, actorId, watching) {
|
|
86
|
+
const set = stringSet(watchers, repositoryId);
|
|
87
|
+
if (watching)
|
|
88
|
+
set.add(text(actorId));
|
|
89
|
+
else
|
|
90
|
+
set.delete(text(actorId));
|
|
91
|
+
},
|
|
92
|
+
async viewerHasStarred(repositoryId, actorId) {
|
|
93
|
+
return stringSet(stars, repositoryId).has(text(actorId));
|
|
94
|
+
},
|
|
95
|
+
async viewerIsWatching(repositoryId, actorId) {
|
|
96
|
+
return stringSet(watchers, repositoryId).has(text(actorId));
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
forks: {
|
|
100
|
+
async createFork(input) {
|
|
101
|
+
const record = {
|
|
102
|
+
...input,
|
|
103
|
+
created_at: text(input.created_at),
|
|
104
|
+
created_by: text(input.created_by),
|
|
105
|
+
fork_repository_id: text(input.fork_repository_id),
|
|
106
|
+
upstream_repository_id: text(input.upstream_repository_id),
|
|
107
|
+
};
|
|
108
|
+
forks.set(record.fork_repository_id, record);
|
|
109
|
+
relationSet(record.upstream_repository_id).add(record.fork_repository_id);
|
|
110
|
+
return record;
|
|
111
|
+
},
|
|
112
|
+
async listForks(repositoryId) {
|
|
113
|
+
return Array.from(relationSet(repositoryId))
|
|
114
|
+
.map((forkRepositoryId) => forks.get(forkRepositoryId) || null)
|
|
115
|
+
.filter(Boolean);
|
|
116
|
+
},
|
|
117
|
+
async readFork(forkRepositoryId) {
|
|
118
|
+
return forks.get(text(forkRepositoryId)) || null;
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
activity: {
|
|
122
|
+
async createActivity(input) {
|
|
123
|
+
const entry = {
|
|
124
|
+
...input,
|
|
125
|
+
id: text(input.id) || randomUUID(),
|
|
126
|
+
};
|
|
127
|
+
const key = text(entry.repository_id);
|
|
128
|
+
const rows = activity.get(key) || [];
|
|
129
|
+
rows.push(entry);
|
|
130
|
+
activity.set(key, rows);
|
|
131
|
+
return entry;
|
|
132
|
+
},
|
|
133
|
+
async listActivity(repositoryId) {
|
|
134
|
+
return Array.from(activity.get(text(repositoryId)) || []);
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export { createInMemoryGitForgeStorageAdapter };
|
|
140
|
+
//# sourceMappingURL=storage_memory.js.map
|