@ozyman42/ozy-cli 0.4.8-windows-x64.0 → 0.4.8
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/bin/ozy +191 -0
- package/bin/ozy-signing-agent +191 -0
- package/bin/ozy-ssh-keygen +191 -0
- package/bin/ozy-virtual-security-key +191 -0
- package/dist/commands/git/hosts.js +18 -0
- package/dist/commands/git/hosts.js.map +1 -0
- package/dist/commands/git/index.js +8 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/setup.js +145 -0
- package/dist/commands/git/setup.js.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/npm/index.js +7 -0
- package/dist/commands/npm/index.js.map +1 -0
- package/dist/commands/npm/setup/git-remote.js +66 -0
- package/dist/commands/npm/setup/git-remote.js.map +1 -0
- package/dist/commands/npm/setup/index.js +168 -0
- package/dist/commands/npm/setup/index.js.map +1 -0
- package/dist/commands/npm/setup/npm-auth.js +62 -0
- package/dist/commands/npm/setup/npm-auth.js.map +1 -0
- package/dist/commands/npm/setup/package-json-validate.js +47 -0
- package/dist/commands/npm/setup/package-json-validate.js.map +1 -0
- package/dist/commands/npm/setup/package-registry.js +20 -0
- package/dist/commands/npm/setup/package-registry.js.map +1 -0
- package/dist/commands/npm/setup/setup.test.js +95 -0
- package/dist/commands/npm/setup/setup.test.js.map +1 -0
- package/dist/commands/npm/setup/trusted-publishing.js +84 -0
- package/dist/commands/npm/setup/trusted-publishing.js.map +1 -0
- package/dist/commands/npm/setup/workflow.js +19 -0
- package/dist/commands/npm/setup/workflow.js.map +1 -0
- package/dist/commands/ssh/get-sk-credential.js +104 -0
- package/dist/commands/ssh/get-sk-credential.js.map +1 -0
- package/dist/commands/ssh/index.js +7 -0
- package/dist/commands/ssh/index.js.map +1 -0
- package/dist/commands/upgrade.js +199 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/common/command.js +15 -0
- package/dist/common/command.js.map +1 -0
- package/dist/common/constants.js +25 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/effective-modules-extensions.js +13 -0
- package/dist/common/effective-modules-extensions.js.map +1 -0
- package/dist/common/log.js +4 -0
- package/dist/common/log.js.map +1 -0
- package/dist/common/render-caller-tree.js +20 -0
- package/dist/common/render-caller-tree.js.map +1 -0
- package/dist/entrypoints/ozy-signing-agent.js +48 -0
- package/dist/entrypoints/ozy-signing-agent.js.map +1 -0
- package/dist/entrypoints/ozy-ssh-keygen.js +9 -0
- package/dist/entrypoints/ozy-ssh-keygen.js.map +1 -0
- package/dist/entrypoints/ozy-virtual-security-key.js +18 -0
- package/dist/entrypoints/ozy-virtual-security-key.js.map +1 -0
- package/dist/entrypoints/ozy.js +3 -0
- package/dist/entrypoints/ozy.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/thing.js +4 -0
- package/dist/internal/thing.js.map +1 -0
- package/dist/modules/cli/agent-client/impl.js +109 -0
- package/dist/modules/cli/agent-client/impl.js.map +1 -0
- package/dist/modules/cli/agent-client/interface.js +11 -0
- package/dist/modules/cli/agent-client/interface.js.map +1 -0
- package/dist/modules/cli/git/impl.js +124 -0
- package/dist/modules/cli/git/impl.js.map +1 -0
- package/dist/modules/cli/git/interface.js +3 -0
- package/dist/modules/cli/git/interface.js.map +1 -0
- package/dist/modules/cli/git/submodule/fix.js +257 -0
- package/dist/modules/cli/git/submodule/fix.js.map +1 -0
- package/dist/modules/cli/git/submodule/git-state.js +154 -0
- package/dist/modules/cli/git/submodule/git-state.js.map +1 -0
- package/dist/modules/cli/git/submodule/gitmodules.js +113 -0
- package/dist/modules/cli/git/submodule/gitmodules.js.map +1 -0
- package/dist/modules/cli/git/submodule/printer.js +232 -0
- package/dist/modules/cli/git/submodule/printer.js.map +1 -0
- package/dist/modules/cli/git/submodule/resolve-git-dir.js +16 -0
- package/dist/modules/cli/git/submodule/resolve-git-dir.js.map +1 -0
- package/dist/modules/cli/github/impl.js +137 -0
- package/dist/modules/cli/github/impl.js.map +1 -0
- package/dist/modules/cli/github/interface.js +2 -0
- package/dist/modules/cli/github/interface.js.map +1 -0
- package/dist/modules/cli/index.js +9 -0
- package/dist/modules/cli/index.js.map +1 -0
- package/dist/modules/common/crypto/impl.js +133 -0
- package/dist/modules/common/crypto/impl.js.map +1 -0
- package/dist/modules/common/crypto/interface.js +2 -0
- package/dist/modules/common/crypto/interface.js.map +1 -0
- package/dist/modules/common/index.js +10 -0
- package/dist/modules/common/index.js.map +1 -0
- package/dist/modules/common/kep-map-store/impl.js +42 -0
- package/dist/modules/common/kep-map-store/impl.js.map +1 -0
- package/dist/modules/common/kep-map-store/interface.js +2 -0
- package/dist/modules/common/kep-map-store/interface.js.map +1 -0
- package/dist/modules/common/os-platform/caller-info.js +132 -0
- package/dist/modules/common/os-platform/caller-info.js.map +1 -0
- package/dist/modules/common/os-platform/impl.js +95 -0
- package/dist/modules/common/os-platform/impl.js.map +1 -0
- package/dist/modules/common/os-platform/interface.js +2 -0
- package/dist/modules/common/os-platform/interface.js.map +1 -0
- package/dist/modules/common/os-platform/virtual-hid/index.js +12 -0
- package/dist/modules/common/os-platform/virtual-hid/index.js.map +1 -0
- package/dist/modules/common/os-platform/virtual-hid/linux.js +5 -0
- package/dist/modules/common/os-platform/virtual-hid/linux.js.map +1 -0
- package/dist/modules/common/os-platform/virtual-hid/mac.js +119 -0
- package/dist/modules/common/os-platform/virtual-hid/mac.js.map +1 -0
- package/dist/modules/common/os-platform/virtual-hid/windows.js +5 -0
- package/dist/modules/common/os-platform/virtual-hid/windows.js.map +1 -0
- package/dist/modules/common/ssh-config/impl.js +116 -0
- package/dist/modules/common/ssh-config/impl.js.map +1 -0
- package/dist/modules/common/ssh-config/interface.js +10 -0
- package/dist/modules/common/ssh-config/interface.js.map +1 -0
- package/dist/modules/ssh-agent/index.js +8 -0
- package/dist/modules/ssh-agent/index.js.map +1 -0
- package/dist/modules/ssh-agent/session/impl.js +265 -0
- package/dist/modules/ssh-agent/session/impl.js.map +1 -0
- package/dist/modules/ssh-agent/session/interface-rpc.js +20 -0
- package/dist/modules/ssh-agent/session/interface-rpc.js.map +1 -0
- package/dist/modules/ssh-agent/session/interface.js +32 -0
- package/dist/modules/ssh-agent/session/interface.js.map +1 -0
- package/dist/modules/ssh-agent/session/passkey-prf-page.js +204 -0
- package/dist/modules/ssh-agent/session/passkey-prf-page.js.map +1 -0
- package/dist/modules/ssh-agent/session/prf-flow.js +103 -0
- package/dist/modules/ssh-agent/session/prf-flow.js.map +1 -0
- package/dist/modules/ssh-agent/ssh-agent/impl.js +117 -0
- package/dist/modules/ssh-agent/ssh-agent/impl.js.map +1 -0
- package/dist/modules/ssh-agent/ssh-agent/interface.js +2 -0
- package/dist/modules/ssh-agent/ssh-agent/interface.js.map +1 -0
- package/dist/scripts/build.js +410 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/check-npm-version.js +8 -0
- package/dist/scripts/check-npm-version.js.map +1 -0
- package/dist/scripts/kill-existing-agent.js +21 -0
- package/dist/scripts/kill-existing-agent.js.map +1 -0
- package/dist/scripts/publish.js +46 -0
- package/dist/scripts/publish.js.map +1 -0
- package/package.json +52 -11
- package/src/commands/git/hosts.ts +20 -0
- package/src/commands/git/index.ts +9 -0
- package/src/commands/git/setup.ts +182 -0
- package/src/commands/index.ts +15 -0
- package/src/commands/npm/index.ts +8 -0
- package/src/commands/npm/setup/git-remote.ts +78 -0
- package/src/commands/npm/setup/index.ts +189 -0
- package/src/commands/npm/setup/npm-auth.ts +58 -0
- package/src/commands/npm/setup/package-json-validate.ts +68 -0
- package/src/commands/npm/setup/package-registry.ts +24 -0
- package/src/commands/npm/setup/publish-workflow.yml +35 -0
- package/src/commands/npm/setup/setup.test.ts +117 -0
- package/src/commands/npm/setup/trusted-publishing.ts +106 -0
- package/src/commands/npm/setup/workflow.ts +20 -0
- package/src/commands/ssh/get-sk-credential.ts +110 -0
- package/src/commands/ssh/index.ts +8 -0
- package/src/commands/upgrade.ts +220 -0
- package/src/common/command.ts +16 -0
- package/src/common/constants.ts +26 -0
- package/src/common/effective-modules-extensions.ts +24 -0
- package/src/common/log.ts +3 -0
- package/src/common/render-caller-tree.ts +22 -0
- package/src/entrypoints/ozy-signing-agent.ts +48 -0
- package/src/entrypoints/ozy-ssh-keygen.ts +10 -0
- package/src/entrypoints/ozy-virtual-security-key.ts +21 -0
- package/src/entrypoints/ozy.ts +2 -0
- package/src/index.ts +1 -0
- package/src/internal/thing.ts +3 -0
- package/src/modules/cli/agent-client/impl.ts +152 -0
- package/src/modules/cli/agent-client/interface.ts +17 -0
- package/src/modules/cli/git/impl.ts +133 -0
- package/src/modules/cli/git/interface.ts +23 -0
- package/src/modules/cli/git/submodule/fix.ts +298 -0
- package/src/modules/cli/git/submodule/git-state.ts +217 -0
- package/src/modules/cli/git/submodule/gitmodules.ts +126 -0
- package/src/modules/cli/git/submodule/printer.ts +256 -0
- package/src/modules/cli/git/submodule/resolve-git-dir.ts +14 -0
- package/src/modules/cli/github/impl.ts +169 -0
- package/src/modules/cli/github/interface.ts +29 -0
- package/src/modules/cli/index.ts +16 -0
- package/src/modules/common/crypto/impl.ts +173 -0
- package/src/modules/common/crypto/interface.ts +20 -0
- package/src/modules/common/index.ts +19 -0
- package/src/modules/common/kep-map-store/impl.ts +47 -0
- package/src/modules/common/kep-map-store/interface.ts +9 -0
- package/src/modules/common/os-platform/caller-info.ts +152 -0
- package/src/modules/common/os-platform/impl.ts +91 -0
- package/src/modules/common/os-platform/interface.ts +16 -0
- package/src/modules/common/os-platform/virtual-hid/index.ts +12 -0
- package/src/modules/common/os-platform/virtual-hid/linux.ts +7 -0
- package/src/modules/common/os-platform/virtual-hid/mac.ts +150 -0
- package/src/modules/common/os-platform/virtual-hid/windows.ts +7 -0
- package/src/modules/common/ssh-config/impl.ts +130 -0
- package/src/modules/common/ssh-config/interface.ts +33 -0
- package/src/modules/ssh-agent/index.ts +13 -0
- package/src/modules/ssh-agent/session/agent-notes.md +210 -0
- package/src/modules/ssh-agent/session/design.md +2 -0
- package/src/modules/ssh-agent/session/html-refactor.md +23 -0
- package/src/modules/ssh-agent/session/impl.ts +328 -0
- package/src/modules/ssh-agent/session/interface-rpc.ts +24 -0
- package/src/modules/ssh-agent/session/interface.ts +62 -0
- package/src/modules/ssh-agent/session/passkey-prf-page.ts +224 -0
- package/src/modules/ssh-agent/session/prf-flow.ts +152 -0
- package/src/modules/ssh-agent/ssh-agent/impl.ts +136 -0
- package/src/modules/ssh-agent/ssh-agent/interface.ts +9 -0
- package/src/scripts/build.ts +504 -0
- package/src/scripts/check-npm-version.ts +7 -0
- package/src/scripts/command-launcher.js.ejs +168 -0
- package/src/scripts/kill-existing-agent.ts +22 -0
- package/src/scripts/publish.ts +47 -0
- package/src/scripts/windows-bin-shims.md +1104 -0
- package/multi-call-binary.exe +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Effect, Layer, Match, Option, pipe, Data, FileSystem, Schedule, Result } from "effect";
|
|
2
|
+
import { effunct, implementing } from "effective-modules";
|
|
3
|
+
import { FetchHttpClient } from "effect/unstable/http";
|
|
4
|
+
import { RpcClient, RpcSerialization } from "effect/unstable/rpc";
|
|
5
|
+
import { AgentRpcGroup } from "@/modules/ssh-agent/session/interface-rpc";
|
|
6
|
+
import { cliModules } from "..";
|
|
7
|
+
import { AgentClientError } from "./interface";
|
|
8
|
+
import { AGENT_CMD_PATH, AGENT_PID_FILE_PATH, AGENT_PORT_FILE_PATH, AGENT_SOCK_FILE_PATH, CURRENT_VERSION } from "@/common/constants";
|
|
9
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
10
|
+
import { log } from "@/common/log";
|
|
11
|
+
function makeAgentClientLayer(port) {
|
|
12
|
+
return pipe(RpcClient.layerProtocolHttp({ url: `http://localhost:${port}/rpc` }), Layer.provideMerge(RpcSerialization.layerJson), Layer.provideMerge(FetchHttpClient.layer));
|
|
13
|
+
}
|
|
14
|
+
class NoResponseError extends Data.TaggedError("NoResponseError") {
|
|
15
|
+
toString() { return "No response from agent."; }
|
|
16
|
+
}
|
|
17
|
+
class NonMatchingVersionError extends Data.TaggedError("NonMatchingVersionError") {
|
|
18
|
+
toString() {
|
|
19
|
+
return `Agent running but with mismatched version ${this.agentVersion} compared to CLI version ${this.cliVersion}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class AgentClientImpl extends implementing(cliModules.AgentClient).uses(FileSystem.FileSystem) {
|
|
23
|
+
*readPortFromFile() {
|
|
24
|
+
const result = yield* pipe(this.getDependency(FileSystem.FileSystem).readFileString(AGENT_PORT_FILE_PATH), Effect.result);
|
|
25
|
+
if (Result.isFailure(result))
|
|
26
|
+
return Option.none();
|
|
27
|
+
const port = parseInt(result.success.trim());
|
|
28
|
+
if (isNaN(port) || port <= 0 || port > 65535) {
|
|
29
|
+
log(`Read out of bounds port ${port}`);
|
|
30
|
+
return Option.none();
|
|
31
|
+
}
|
|
32
|
+
return Option.some(port);
|
|
33
|
+
}
|
|
34
|
+
*pingAtPort(port) {
|
|
35
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
36
|
+
const client = yield* RpcClient.make(AgentRpcGroup);
|
|
37
|
+
const { version } = yield* pipe(client.GetVersion({}), Effect.catchTag("RpcClientError", () => new NoResponseError()));
|
|
38
|
+
if (version !== CURRENT_VERSION)
|
|
39
|
+
yield* new NonMatchingVersionError({ cliVersion: CURRENT_VERSION, agentVersion: version });
|
|
40
|
+
})).pipe(Effect.provide(makeAgentClientLayer(port)));
|
|
41
|
+
}
|
|
42
|
+
*ping() {
|
|
43
|
+
const portOption = yield* effunct(this.readPortFromFile)();
|
|
44
|
+
if (Option.isNone(portOption))
|
|
45
|
+
return yield* new NoResponseError();
|
|
46
|
+
const port = portOption.value;
|
|
47
|
+
yield* effunct(this.pingAtPort)(port);
|
|
48
|
+
return { port };
|
|
49
|
+
}
|
|
50
|
+
*waitForPidFile(expectedPid) {
|
|
51
|
+
const fs = this.getDependency(FileSystem.FileSystem);
|
|
52
|
+
yield* pipe(Effect.retry(pipe(fs.readFileString(AGENT_PID_FILE_PATH), Effect.catchTag("PlatformError", () => Effect.fail("pid file not yet written")), Effect.flatMap(content => {
|
|
53
|
+
const pid = parseInt(content.trim());
|
|
54
|
+
return pid === expectedPid
|
|
55
|
+
? Effect.void
|
|
56
|
+
: Effect.fail(`PID mismatch: expected ${expectedPid}, got ${pid}`);
|
|
57
|
+
})), Schedule.spaced("50 millis")), Effect.timeout("5 seconds"), Effect.mapError(() => "Agent did not start within 5 seconds"));
|
|
58
|
+
}
|
|
59
|
+
*startAgent() {
|
|
60
|
+
const proc = Bun.spawn([AGENT_CMD_PATH], { stdout: "ignore", stderr: "ignore" });
|
|
61
|
+
yield* effunct(this.waitForPidFile)(proc.pid);
|
|
62
|
+
const { port } = yield* effunct(this.ping)();
|
|
63
|
+
log(`Started agent at PID ${proc.pid}`);
|
|
64
|
+
return { pid: proc.pid, port };
|
|
65
|
+
}
|
|
66
|
+
*killIfRunning() {
|
|
67
|
+
try {
|
|
68
|
+
// Throws if file missing
|
|
69
|
+
const pidFileContent = readFileSync(AGENT_PID_FILE_PATH, "utf-8");
|
|
70
|
+
const PID = parseInt(pidFileContent.trim());
|
|
71
|
+
// If doesn't exist, below line throws
|
|
72
|
+
process.kill(PID, 0);
|
|
73
|
+
log(`Killing agent on PID ${PID}`);
|
|
74
|
+
process.kill(PID, "SIGTERM");
|
|
75
|
+
yield* Effect.sleep(500);
|
|
76
|
+
}
|
|
77
|
+
catch { }
|
|
78
|
+
try {
|
|
79
|
+
rmSync(AGENT_PID_FILE_PATH);
|
|
80
|
+
}
|
|
81
|
+
catch { }
|
|
82
|
+
try {
|
|
83
|
+
rmSync(AGENT_PORT_FILE_PATH);
|
|
84
|
+
}
|
|
85
|
+
catch { }
|
|
86
|
+
try {
|
|
87
|
+
rmSync(AGENT_SOCK_FILE_PATH);
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
}
|
|
91
|
+
*ensureRunning() {
|
|
92
|
+
const pingResult = yield* pipe(effunct(this.ping)(), Effect.result);
|
|
93
|
+
if (Result.isSuccess(pingResult))
|
|
94
|
+
return pingResult.success;
|
|
95
|
+
log(pingResult.failure.toString());
|
|
96
|
+
yield* Match.value(pingResult.failure).pipe(Match.tag("NonMatchingVersionError", () => effunct(this.killIfRunning)()), Match.tag("NoResponseError", () => effunct(this.killIfRunning)()), Match.exhaustive);
|
|
97
|
+
return yield* pipe(effunct(this.startAgent)(), Effect.mapError(err => typeof err === "string" ?
|
|
98
|
+
err :
|
|
99
|
+
`Failed to start agent due to ${err.name}: ${err.toString()}`));
|
|
100
|
+
}
|
|
101
|
+
*usingClient(use) {
|
|
102
|
+
const { port } = yield* pipe(effunct(this.ensureRunning)(), Effect.mapError(reason => new AgentClientError.ClientError({ reason })));
|
|
103
|
+
return yield* pipe(Effect.scoped(Effect.gen(function* () {
|
|
104
|
+
const client = yield* RpcClient.make(AgentRpcGroup);
|
|
105
|
+
return yield* use(client);
|
|
106
|
+
})), Effect.provide(makeAgentClientLayer(port)), Effect.mapError(e => new AgentClientError.UsageError({ cause: e })));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/agent-client/impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Data } from "effect";
|
|
2
|
+
export var AgentClientError;
|
|
3
|
+
(function (AgentClientError) {
|
|
4
|
+
class UsageError extends Data.TaggedError("AgentClientUsageError") {
|
|
5
|
+
}
|
|
6
|
+
AgentClientError.UsageError = UsageError;
|
|
7
|
+
class ClientError extends Data.TaggedError("AgentClientError") {
|
|
8
|
+
}
|
|
9
|
+
AgentClientError.ClientError = ClientError;
|
|
10
|
+
})(AgentClientError || (AgentClientError = {}));
|
|
11
|
+
//# sourceMappingURL=interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/agent-client/interface.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAI9B,MAAM,KAAW,gBAAgB,CAGhC;AAHD,WAAiB,gBAAgB;IAC/B,MAAa,UAAc,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAwB;KAAG;IAAzF,2BAAU,aAA+E,CAAA;IACtG,MAAa,WAAY,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAA8B;KAAG;IAAxF,4BAAW,cAA6E,CAAA;AACvG,CAAC,EAHgB,gBAAgB,KAAhB,gBAAgB,QAGhC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { implementing } from "effective-modules";
|
|
2
|
+
import { cliModules } from "..";
|
|
3
|
+
import { commonModules } from "@/modules/common";
|
|
4
|
+
import { $ } from 'bun';
|
|
5
|
+
import { Effect, Option, pipe } from "effect";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { SSH_KEYGEN_CMD_PATH, STANDARD_REMOTE_PREFIX } from "@/common/constants";
|
|
9
|
+
import { Gitmodules } from "./submodule/gitmodules";
|
|
10
|
+
import { readGitState } from "./submodule/git-state";
|
|
11
|
+
import { fixGitConfig, fixModuleDirs, fixIndexGitlinks } from "./submodule/fix";
|
|
12
|
+
import { printSyncState, printFixes } from "./submodule/printer";
|
|
13
|
+
export class GitImpl extends implementing(cliModules.Git).uses(commonModules.OSPlatform, commonModules.SSHConfig) {
|
|
14
|
+
parseOwnerRepo(remote) {
|
|
15
|
+
const sshMatch = remote.match(/^git@[^:]+:([^/]+)\/(.+?)(?:\.git)?$/);
|
|
16
|
+
if (sshMatch)
|
|
17
|
+
return Effect.succeed({ owner: sshMatch[1], repo: sshMatch[2] });
|
|
18
|
+
const httpsMatch = remote.match(/^https?:\/\/[^/]+\/([^/]+)\/(.+?)(?:\.git)?$/);
|
|
19
|
+
if (httpsMatch)
|
|
20
|
+
return Effect.succeed({ owner: httpsMatch[1], repo: httpsMatch[2] });
|
|
21
|
+
return Effect.fail(`Cannot parse owner/repo from remote: ${remote}`);
|
|
22
|
+
}
|
|
23
|
+
*resolveOwnerAndRepo(maybeOwnerAndRepo) {
|
|
24
|
+
if (Option.isSome(maybeOwnerAndRepo)) {
|
|
25
|
+
const parts = maybeOwnerAndRepo.value.split('/');
|
|
26
|
+
const [owner, repo] = parts;
|
|
27
|
+
if (parts.length !== 2 || !owner || !repo)
|
|
28
|
+
return yield* Effect.fail(`Cannot parse remote error: Expected "owner/repo", got "${maybeOwnerAndRepo.value}"`);
|
|
29
|
+
return { owner, repo };
|
|
30
|
+
}
|
|
31
|
+
if (!(yield* this.isGitRepository())) {
|
|
32
|
+
yield* Effect.fail(`not in git repo: Current directory is not a git repository`);
|
|
33
|
+
}
|
|
34
|
+
const remoteOption = yield* this.getRemoteOrigin();
|
|
35
|
+
if (Option.isNone(remoteOption)) {
|
|
36
|
+
return yield* Effect.fail(`no remote origin: No remote.origin.url — pass owner/repo as argument to clone instead`);
|
|
37
|
+
}
|
|
38
|
+
return yield* this.parseOwnerRepo(remoteOption.value);
|
|
39
|
+
}
|
|
40
|
+
*isGitRepository() {
|
|
41
|
+
return yield* pipe(Effect.tryPromise(async () => {
|
|
42
|
+
await $ `git rev-parse --is-inside-work-tree`.quiet();
|
|
43
|
+
return true;
|
|
44
|
+
}), Effect.catchTag("UnknownError", () => Effect.succeed(false)));
|
|
45
|
+
}
|
|
46
|
+
*getRemoteOrigin() {
|
|
47
|
+
return yield* pipe(Effect.tryPromise(async () => {
|
|
48
|
+
return Option.some((await $ `git config --get remote.origin.url`.quiet()).text().trim());
|
|
49
|
+
}), Effect.catchTag("UnknownError", () => Effect.succeed(Option.none())));
|
|
50
|
+
}
|
|
51
|
+
*clone(owner, repo) {
|
|
52
|
+
const result = Bun.spawnSync(['git', 'clone', '--recurse-submodules', `${STANDARD_REMOTE_PREFIX}${owner}/${repo}.git`], { stdout: 'inherit', stderr: 'inherit' });
|
|
53
|
+
if (result.exitCode !== 0)
|
|
54
|
+
return yield* Effect.fail(`git clone failed with exit code ${result.exitCode}`);
|
|
55
|
+
process.chdir(`./${repo}`);
|
|
56
|
+
}
|
|
57
|
+
*setLocalConfig(key, value) {
|
|
58
|
+
yield* Effect.tryPromise({
|
|
59
|
+
try: async () => { await $ `git config --local ${key} ${value}`.quiet(); },
|
|
60
|
+
catch: (e) => `git config ${key}: ${e instanceof Error ? e.message : String(e)}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
*configureRepo({ dir, remoteURL, user, pubkeyPath }) {
|
|
64
|
+
yield* Effect.log(`Configuring ${dir}`);
|
|
65
|
+
yield* Effect.tryPromise({
|
|
66
|
+
try: async () => {
|
|
67
|
+
const configs = [
|
|
68
|
+
['remote.origin.url', remoteURL],
|
|
69
|
+
['user.name', user.name],
|
|
70
|
+
['user.email', user.email],
|
|
71
|
+
['user.signingkey', pubkeyPath],
|
|
72
|
+
['gpg.format', 'ssh'],
|
|
73
|
+
['gpg.ssh.program', SSH_KEYGEN_CMD_PATH],
|
|
74
|
+
['commit.gpgsign', 'true'],
|
|
75
|
+
['tag.gpgsign', 'true'],
|
|
76
|
+
];
|
|
77
|
+
for (const [k, v] of configs) {
|
|
78
|
+
const r = Bun.spawnSync(['git', 'config', '--local', k, v], { cwd: dir, stdout: 'pipe', stderr: 'pipe' });
|
|
79
|
+
if (r.exitCode !== 0) {
|
|
80
|
+
const err = new TextDecoder().decode(r.stderr);
|
|
81
|
+
throw new Error(`git config ${k} failed: ${err.trim()}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
catch: (e) => e instanceof Error ? e.message : String(e),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
*syncSubmoduleState(repoRoot, topLevelRoot) {
|
|
89
|
+
const gitmodules = yield* Gitmodules.fromRepoRoot(repoRoot);
|
|
90
|
+
if (gitmodules.list.length === 0)
|
|
91
|
+
return gitmodules;
|
|
92
|
+
const submodulePaths = gitmodules.list.map(m => m.path);
|
|
93
|
+
const state = yield* readGitState(repoRoot, submodulePaths);
|
|
94
|
+
printSyncState(gitmodules, state);
|
|
95
|
+
const fixResults = yield* Effect.all([
|
|
96
|
+
fixGitConfig(repoRoot, gitmodules),
|
|
97
|
+
fixModuleDirs(repoRoot, gitmodules, state.moduleDirs, state.orphanModuleDirs, topLevelRoot),
|
|
98
|
+
fixIndexGitlinks(repoRoot, gitmodules, state.index),
|
|
99
|
+
], { concurrency: "unbounded" });
|
|
100
|
+
printFixes(fixResults.flat());
|
|
101
|
+
return gitmodules;
|
|
102
|
+
}
|
|
103
|
+
*setupRepo(input) {
|
|
104
|
+
yield* this.setupRepoAt(input, input.dir);
|
|
105
|
+
}
|
|
106
|
+
*setupRepoAt(input, topLevelRoot) {
|
|
107
|
+
yield* this.configureRepo(input);
|
|
108
|
+
if (!existsSync(resolve(input.dir, '.gitmodules')))
|
|
109
|
+
return;
|
|
110
|
+
const gitmodules = yield* this.syncSubmoduleState(input.dir, topLevelRoot);
|
|
111
|
+
for (const m of gitmodules.list) {
|
|
112
|
+
const subDir = resolve(input.dir, m.path);
|
|
113
|
+
if (!existsSync(subDir))
|
|
114
|
+
continue;
|
|
115
|
+
yield* this.setupRepoAt({
|
|
116
|
+
dir: subDir,
|
|
117
|
+
remoteURL: m.url,
|
|
118
|
+
user: input.user,
|
|
119
|
+
pubkeyPath: input.pubkeyPath
|
|
120
|
+
}, topLevelRoot);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impl.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/git/impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../../../../../src/modules/cli/git/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile, rename, mkdir, rm } from "node:fs/promises";
|
|
3
|
+
import { resolve, join, dirname, relative } from "node:path";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { resolveGitDir } from "./resolve-git-dir";
|
|
6
|
+
function parseConfigSubmoduleValues(content) {
|
|
7
|
+
const entries = new Map();
|
|
8
|
+
let current = null;
|
|
9
|
+
for (const line of content.split("\n")) {
|
|
10
|
+
const headerMatch = line.match(/^\[submodule "(.+)"\]$/);
|
|
11
|
+
if (headerMatch) {
|
|
12
|
+
current = {};
|
|
13
|
+
entries.set(headerMatch[1], current);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (!current)
|
|
17
|
+
continue;
|
|
18
|
+
const kvMatch = line.match(/^\s+(\w+)\s*=\s*(.+)$/);
|
|
19
|
+
if (!kvMatch)
|
|
20
|
+
continue;
|
|
21
|
+
const [, key, value] = kvMatch;
|
|
22
|
+
if (key === "url" || key === "path")
|
|
23
|
+
current[key] = value.trim();
|
|
24
|
+
}
|
|
25
|
+
return entries;
|
|
26
|
+
}
|
|
27
|
+
// Drops any stanza whose name isn't a valid submodule, is a stale duplicate, or
|
|
28
|
+
// has url/path values that no longer match .gitmodules — so it can be re-added fresh.
|
|
29
|
+
function removeExtraConfigSubmodules(content, modules) {
|
|
30
|
+
const byName = new Map(modules.list.map((m) => [m.name, m]));
|
|
31
|
+
const existingValues = parseConfigSubmoduleValues(content);
|
|
32
|
+
const staleNames = new Set();
|
|
33
|
+
for (const [name, values] of existingValues) {
|
|
34
|
+
const m = byName.get(name);
|
|
35
|
+
if (!m || values.url !== m.url || values.path !== m.path)
|
|
36
|
+
staleNames.add(name);
|
|
37
|
+
}
|
|
38
|
+
const removed = [];
|
|
39
|
+
const seen = new Set();
|
|
40
|
+
const output = [];
|
|
41
|
+
let dropping = false;
|
|
42
|
+
for (const line of content.split("\n")) {
|
|
43
|
+
const submoduleMatch = line.match(/^\[submodule "(.+)"\]$/);
|
|
44
|
+
if (submoduleMatch) {
|
|
45
|
+
const name = submoduleMatch[1];
|
|
46
|
+
if (!staleNames.has(name) && !seen.has(name)) {
|
|
47
|
+
seen.add(name);
|
|
48
|
+
dropping = false;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
removed.push(name);
|
|
52
|
+
dropping = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (/^\[/.test(line)) {
|
|
56
|
+
dropping = false;
|
|
57
|
+
}
|
|
58
|
+
if (!dropping)
|
|
59
|
+
output.push(line);
|
|
60
|
+
}
|
|
61
|
+
return { result: output.join("\n"), removed };
|
|
62
|
+
}
|
|
63
|
+
async function spawnGit(args, cwd) {
|
|
64
|
+
const proc = Bun.spawn(["git", ...args], { cwd, stdout: "pipe", stderr: "pipe" });
|
|
65
|
+
const code = await proc.exited;
|
|
66
|
+
if (code !== 0) {
|
|
67
|
+
const err = await new Response(proc.stderr).text();
|
|
68
|
+
throw new Error(`git ${args.join(" ")} exited with code ${code}\n${err.trim()}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function fixGitConfig(repoRoot, modules) {
|
|
72
|
+
return Effect.tryPromise({
|
|
73
|
+
try: async () => {
|
|
74
|
+
const gitDir = await resolveGitDir(repoRoot);
|
|
75
|
+
const configPath = resolve(gitDir, "config");
|
|
76
|
+
const content = await readFile(configPath, "utf8");
|
|
77
|
+
const { result: afterRemoval, removed } = removeExtraConfigSubmodules(content, modules);
|
|
78
|
+
const existingNames = new Set([...afterRemoval.matchAll(/^\[submodule "(.+)"\]$/gm)].map((m) => m[1]));
|
|
79
|
+
const missing = modules.list.filter((m) => !existingNames.has(m.name));
|
|
80
|
+
let result = afterRemoval;
|
|
81
|
+
for (const m of missing) {
|
|
82
|
+
if (!result.endsWith("\n"))
|
|
83
|
+
result += "\n";
|
|
84
|
+
result += `[submodule "${m.name}"]\n\tactive = true\n\turl = ${m.url}\n\tpath = ${m.path}\n`;
|
|
85
|
+
}
|
|
86
|
+
if (removed.length === 0 && missing.length === 0)
|
|
87
|
+
return [];
|
|
88
|
+
await writeFile(configPath, result, "utf8");
|
|
89
|
+
return [
|
|
90
|
+
...removed.map((name) => ({ location: [".git", "config", name], action: "deleted" })),
|
|
91
|
+
...missing.map((m) => ({ location: [".git", "config", m.name], action: "synced" })),
|
|
92
|
+
];
|
|
93
|
+
},
|
|
94
|
+
catch: (e) => e instanceof Error ? e.message : String(e),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const GIT_MODULES_MARKER = ".git/modules/";
|
|
98
|
+
// A stale redirect's leading "../" prefix can be wrong after a path rename, but the
|
|
99
|
+
// suffix starting at ".git/modules/" always describes a location under the single
|
|
100
|
+
// top-level .git, at any nesting depth — so anchor on that marker instead of trusting
|
|
101
|
+
// the relative resolution.
|
|
102
|
+
function recoverStaleGitDirTarget(redirectContent, topLevelRoot) {
|
|
103
|
+
const match = redirectContent.match(/^gitdir:\s*(.+)$/m);
|
|
104
|
+
if (!match)
|
|
105
|
+
return undefined;
|
|
106
|
+
const idx = match[1].indexOf(GIT_MODULES_MARKER);
|
|
107
|
+
if (idx === -1)
|
|
108
|
+
return undefined;
|
|
109
|
+
return resolve(topLevelRoot, match[1].slice(idx).trim());
|
|
110
|
+
}
|
|
111
|
+
// Moves existing git data into moduleGitDir instead of abandoning it, whether it's a
|
|
112
|
+
// standalone clone's literal .git directory, or a redirect file (even a stale one
|
|
113
|
+
// left over from a path rename) pointing at git data that still exists.
|
|
114
|
+
async function migrateExistingGitDir(workingTreeDir, moduleGitDir, topLevelRoot) {
|
|
115
|
+
const dotGit = join(workingTreeDir, ".git");
|
|
116
|
+
if (!existsSync(dotGit))
|
|
117
|
+
return false;
|
|
118
|
+
if (statSync(dotGit).isDirectory()) {
|
|
119
|
+
await mkdir(dirname(moduleGitDir), { recursive: true });
|
|
120
|
+
await rename(dotGit, moduleGitDir);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
const content = await readFile(dotGit, "utf8");
|
|
124
|
+
const target = recoverStaleGitDirTarget(content, topLevelRoot);
|
|
125
|
+
if (!target || target === moduleGitDir || !existsSync(target))
|
|
126
|
+
return false;
|
|
127
|
+
await mkdir(dirname(moduleGitDir), { recursive: true });
|
|
128
|
+
await rename(target, moduleGitDir);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
export function fixModuleDirs(repoRoot, modules, moduleDirs, orphanModuleDirs, topLevelRoot) {
|
|
132
|
+
return Effect.tryPromise({
|
|
133
|
+
try: async () => {
|
|
134
|
+
const fixes = [];
|
|
135
|
+
const modulesRoot = resolve(await resolveGitDir(repoRoot), "modules");
|
|
136
|
+
// Establish each module's git dir (migrating existing data if any exists
|
|
137
|
+
// anywhere) before the orphan cleanup below runs, so nothing real gets deleted
|
|
138
|
+
// out from under a path rename.
|
|
139
|
+
for (const m of modules.list) {
|
|
140
|
+
const workingTreeDir = resolve(repoRoot, m.path);
|
|
141
|
+
const moduleGitDir = join(modulesRoot, m.path);
|
|
142
|
+
if (!existsSync(workingTreeDir))
|
|
143
|
+
continue;
|
|
144
|
+
const alreadyEstablished = existsSync(moduleGitDir);
|
|
145
|
+
let freshlyCloned = false;
|
|
146
|
+
if (!alreadyEstablished) {
|
|
147
|
+
const migrated = await migrateExistingGitDir(workingTreeDir, moduleGitDir, topLevelRoot);
|
|
148
|
+
if (migrated) {
|
|
149
|
+
fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "migrated" });
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
await mkdir(dirname(moduleGitDir), { recursive: true });
|
|
153
|
+
await spawnGit(["clone", "--bare", m.url, moduleGitDir], repoRoot);
|
|
154
|
+
fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "initialized" });
|
|
155
|
+
freshlyCloned = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (freshlyCloned) {
|
|
159
|
+
const configFile = join(moduleGitDir, "config");
|
|
160
|
+
const worktree = relative(moduleGitDir, workingTreeDir);
|
|
161
|
+
await spawnGit(["config", "-f", configFile, "core.bare", "false"], repoRoot);
|
|
162
|
+
await spawnGit(["config", "-f", configFile, "core.worktree", worktree], repoRoot);
|
|
163
|
+
}
|
|
164
|
+
// A bare clone (whether just made above, or left over from a prior buggy
|
|
165
|
+
// run) never gets an index — populate it from HEAD whenever it's missing,
|
|
166
|
+
// not only right after we ourselves created it.
|
|
167
|
+
if (!existsSync(join(moduleGitDir, "index"))) {
|
|
168
|
+
const headCheck = Bun.spawn(["git", "--git-dir", moduleGitDir, "rev-parse", "--verify", "HEAD"], { stdout: "ignore", stderr: "ignore" });
|
|
169
|
+
if ((await headCheck.exited) !== 0)
|
|
170
|
+
await spawnGit(["--git-dir", moduleGitDir, "fetch", "origin"], repoRoot);
|
|
171
|
+
await spawnGit(["--git-dir", moduleGitDir, "read-tree", "HEAD"], repoRoot);
|
|
172
|
+
fixes.push({ location: [".git", "modules", ...m.path.split("/")], action: "synced", detail: "populated index" });
|
|
173
|
+
}
|
|
174
|
+
// Always re-point the working tree's .git redirect — never assume an
|
|
175
|
+
// existing file is already correct.
|
|
176
|
+
const dotGit = join(workingTreeDir, ".git");
|
|
177
|
+
const rel = relative(workingTreeDir, moduleGitDir);
|
|
178
|
+
const desired = `gitdir: ${rel}\n`;
|
|
179
|
+
const current = existsSync(dotGit) && !statSync(dotGit).isDirectory()
|
|
180
|
+
? await readFile(dotGit, "utf8")
|
|
181
|
+
: undefined;
|
|
182
|
+
if (current !== desired) {
|
|
183
|
+
await writeFile(dotGit, desired, "utf8");
|
|
184
|
+
fixes.push({ location: [...m.path.split("/"), ".git"], action: "synced" });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const gmByPath = new Map(modules.list.map((m) => [m.path, m]));
|
|
188
|
+
for (const d of moduleDirs) {
|
|
189
|
+
const gm = gmByPath.get(d.relativePath);
|
|
190
|
+
if (!gm && existsSync(join(modulesRoot, d.relativePath))) {
|
|
191
|
+
await rm(join(modulesRoot, d.relativePath), { recursive: true, force: true });
|
|
192
|
+
fixes.push({ location: [".git", "modules", ...d.relativePath.split("/")], action: "deleted" });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
for (const rel of orphanModuleDirs) {
|
|
196
|
+
if (existsSync(join(modulesRoot, rel))) {
|
|
197
|
+
await rm(join(modulesRoot, rel), { recursive: true, force: true });
|
|
198
|
+
fixes.push({ location: [".git", "modules", ...rel.split("/")], action: "deleted" });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (const m of modules.list) {
|
|
202
|
+
const moduleGitDir = join(modulesRoot, m.path);
|
|
203
|
+
if (!existsSync(moduleGitDir))
|
|
204
|
+
continue;
|
|
205
|
+
const configFile = join(moduleGitDir, "config");
|
|
206
|
+
const readConfig = (key) => Bun.spawn(["git", "config", "-f", configFile, key], { cwd: repoRoot, stdout: "pipe", stderr: "pipe" });
|
|
207
|
+
const [currentUrl, currentWorktree] = await Promise.all([
|
|
208
|
+
new Response(readConfig("remote.origin.url").stdout).text().then(t => t.trim()),
|
|
209
|
+
new Response(readConfig("core.worktree").stdout).text().then(t => t.trim()),
|
|
210
|
+
]);
|
|
211
|
+
const worktree = relative(moduleGitDir, resolve(repoRoot, m.path));
|
|
212
|
+
if (currentUrl !== m.url) {
|
|
213
|
+
await spawnGit(["config", "-f", configFile, "remote.origin.url", m.url], repoRoot);
|
|
214
|
+
fixes.push({ location: [".git", "modules", ...m.path.split("/"), "config"], action: "synced", detail: "remote.origin.url" });
|
|
215
|
+
}
|
|
216
|
+
if (currentWorktree !== worktree) {
|
|
217
|
+
await spawnGit(["config", "-f", configFile, "core.worktree", worktree], repoRoot);
|
|
218
|
+
fixes.push({ location: [".git", "modules", ...m.path.split("/"), "config"], action: "synced", detail: "core.worktree" });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return fixes;
|
|
222
|
+
},
|
|
223
|
+
catch: (e) => e instanceof Error ? e.message : String(e),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
export function fixIndexGitlinks(repoRoot, modules, currentIndex) {
|
|
227
|
+
return Effect.tryPromise({
|
|
228
|
+
try: async () => {
|
|
229
|
+
const currentShas = new Map(currentIndex.map((e) => [e.path, e.commit]));
|
|
230
|
+
const validPaths = new Set(modules.list.map((m) => m.path));
|
|
231
|
+
const fixes = [];
|
|
232
|
+
for (const entry of currentIndex) {
|
|
233
|
+
if (!validPaths.has(entry.path)) {
|
|
234
|
+
await spawnGit(["update-index", "--force-remove", entry.path], repoRoot);
|
|
235
|
+
fixes.push({ location: [".git", "index"], action: "deleted", detail: entry.path });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
for (const m of modules.list) {
|
|
239
|
+
const workingTree = resolve(repoRoot, m.path);
|
|
240
|
+
if (!existsSync(workingTree))
|
|
241
|
+
continue;
|
|
242
|
+
const shaProc = Bun.spawn(["git", "rev-parse", "HEAD"], { cwd: workingTree, stdout: "pipe", stderr: "pipe" });
|
|
243
|
+
const sha = (await new Response(shaProc.stdout).text()).trim();
|
|
244
|
+
if (!/^[0-9a-f]{40}$/.test(sha))
|
|
245
|
+
continue;
|
|
246
|
+
const current = currentShas.get(m.path);
|
|
247
|
+
await spawnGit(["update-index", "--add", "--cacheinfo", `160000,${sha},${m.path}`], repoRoot);
|
|
248
|
+
if (current !== sha) {
|
|
249
|
+
fixes.push({ location: [".git", "index"], action: "synced", detail: `${m.path}: ${sha.slice(0, 8)}` });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return fixes;
|
|
253
|
+
},
|
|
254
|
+
catch: (e) => e instanceof Error ? e.message : String(e),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../../../../../../src/modules/cli/git/submodule/fix.ts"],"names":[],"mappings":"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"}
|