@ferueda/grove 0.1.2 → 0.3.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/dist/errors.d.ts +34 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +55 -0
- package/dist/git/branch.d.ts +8 -0
- package/dist/git/branch.d.ts.map +1 -1
- package/dist/git/branch.js +57 -0
- package/dist/hooks.d.ts +3 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +11 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/pool.d.ts +20 -20
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +395 -182
- package/dist/process/detect.d.ts +9 -2
- package/dist/process/detect.d.ts.map +1 -1
- package/dist/process/detect.js +7 -5
- package/dist/process/terminate.js +2 -2
- package/dist/queries.d.ts +8 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +97 -0
- package/dist/schemas.d.ts +79 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +29 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +5 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +1 -1
package/dist/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type GroveErrorCode = "GROVE_EXHAUSTED" | "WORKTREE_DESTROYING" | "WORKTREE_NOT_MANAGED" | "WORKTREE_IN_USE" | "GIT_NOT_FOUND" | "GIT_COMMAND_FAILED" | "INVALID_GROVE_STATE" | "LOCK_FAILED";
|
|
1
|
+
export type GroveErrorCode = "GROVE_EXHAUSTED" | "WORKTREE_DESTROYING" | "WORKTREE_NOT_MANAGED" | "WORKTREE_IN_USE" | "GIT_NOT_FOUND" | "GIT_COMMAND_FAILED" | "INVALID_GROVE_STATE" | "LOCK_FAILED" | "LEASE_NOT_FOUND" | "LEASE_CONFLICT" | "LEASE_ALREADY_EXISTS" | "LEASE_QUARANTINED" | "UNSAFE_CLEANUP" | "BRANCH_EXISTS" | "BRANCH_NOT_FOUND" | "REF_NOT_FOUND" | "PATH_OUTSIDE_POOL" | "BRANCH_DELETE_FAILED" | "HOOK_FAILED";
|
|
2
2
|
export declare class GroveError extends Error {
|
|
3
3
|
readonly code: GroveErrorCode;
|
|
4
4
|
constructor(message: string, code: GroveErrorCode);
|
|
@@ -28,4 +28,37 @@ export declare class InvalidGroveStateError extends GroveError {
|
|
|
28
28
|
export declare class LockFailedError extends GroveError {
|
|
29
29
|
constructor(message?: string);
|
|
30
30
|
}
|
|
31
|
+
export declare class LeaseNotFoundError extends GroveError {
|
|
32
|
+
constructor(message?: string);
|
|
33
|
+
}
|
|
34
|
+
export declare class LeaseConflictError extends GroveError {
|
|
35
|
+
constructor(message?: string);
|
|
36
|
+
}
|
|
37
|
+
export declare class LeaseAlreadyExistsError extends GroveError {
|
|
38
|
+
constructor(message?: string);
|
|
39
|
+
}
|
|
40
|
+
export declare class LeaseQuarantinedError extends GroveError {
|
|
41
|
+
constructor(message?: string);
|
|
42
|
+
}
|
|
43
|
+
export declare class UnsafeCleanupError extends GroveError {
|
|
44
|
+
constructor(message?: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class BranchExistsError extends GroveError {
|
|
47
|
+
constructor(message?: string);
|
|
48
|
+
}
|
|
49
|
+
export declare class BranchNotFoundError extends GroveError {
|
|
50
|
+
constructor(message?: string);
|
|
51
|
+
}
|
|
52
|
+
export declare class RefNotFoundError extends GroveError {
|
|
53
|
+
constructor(message?: string);
|
|
54
|
+
}
|
|
55
|
+
export declare class PathOutsidePoolError extends GroveError {
|
|
56
|
+
constructor(message?: string);
|
|
57
|
+
}
|
|
58
|
+
export declare class BranchDeleteFailedError extends GroveError {
|
|
59
|
+
constructor(message: string);
|
|
60
|
+
}
|
|
61
|
+
export declare class HookFailedError extends GroveError {
|
|
62
|
+
constructor(message: string);
|
|
63
|
+
}
|
|
31
64
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,GACtB,iBAAiB,GACjB,eAAe,GACf,oBAAoB,GACpB,qBAAqB,GACrB,aAAa,CAAC;AAElB,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAIhD;CACF;AAED,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,GAAE,MAA0B,EAE9C;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,GAAE,MAAiC,EAErD;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,GAAE,MAA+B,EAEnD;CACF;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAE,MAA6B,EAEjD;CACF;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAG/C;CACF;AAED,qBAAa,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAO,GAAE,MAA8B,EAElD;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAO,GAAE,MAAiC,EAErD;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,GACtB,iBAAiB,GACjB,eAAe,GACf,oBAAoB,GACpB,qBAAqB,GACrB,aAAa,GACb,iBAAiB,GACjB,gBAAgB,GAChB,sBAAsB,GACtB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,aAAa,CAAC;AAElB,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAIhD;CACF;AAED,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,GAAE,MAA0B,EAE9C;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,GAAE,MAAiC,EAErD;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,GAAE,MAA+B,EAEnD;CACF;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAE,MAA6B,EAEjD;CACF;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAG/C;CACF;AAED,qBAAa,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAO,GAAE,MAA8B,EAElD;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAO,GAAE,MAAiC,EAErD;CACF;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAE,MAA0B,EAE9C;CACF;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAE,MAAyB,EAE7C;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,GAAE,MAA+B,EAEnD;CACF;AAED,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,YAAY,OAAO,GAAE,MAA4B,EAEhD;CACF;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAE,MAAyB,EAE7C;CACF;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,GAAE,MAA2B,EAE/C;CACF;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,GAAE,MAAqC,EAEzD;CACF;AAED,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF"}
|
package/dist/errors.js
CHANGED
|
@@ -48,3 +48,58 @@ export class LockFailedError extends GroveError {
|
|
|
48
48
|
super(message, "LOCK_FAILED");
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
export class LeaseNotFoundError extends GroveError {
|
|
52
|
+
constructor(message = "Lease not found") {
|
|
53
|
+
super(message, "LEASE_NOT_FOUND");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class LeaseConflictError extends GroveError {
|
|
57
|
+
constructor(message = "Lease conflict") {
|
|
58
|
+
super(message, "LEASE_CONFLICT");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class LeaseAlreadyExistsError extends GroveError {
|
|
62
|
+
constructor(message = "Lease already exists") {
|
|
63
|
+
super(message, "LEASE_ALREADY_EXISTS");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export class LeaseQuarantinedError extends GroveError {
|
|
67
|
+
constructor(message = "Lease quarantined") {
|
|
68
|
+
super(message, "LEASE_QUARANTINED");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class UnsafeCleanupError extends GroveError {
|
|
72
|
+
constructor(message = "Unsafe cleanup") {
|
|
73
|
+
super(message, "UNSAFE_CLEANUP");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export class BranchExistsError extends GroveError {
|
|
77
|
+
constructor(message = "Branch exists") {
|
|
78
|
+
super(message, "BRANCH_EXISTS");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export class BranchNotFoundError extends GroveError {
|
|
82
|
+
constructor(message = "Branch not found") {
|
|
83
|
+
super(message, "BRANCH_NOT_FOUND");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export class RefNotFoundError extends GroveError {
|
|
87
|
+
constructor(message = "Ref not found") {
|
|
88
|
+
super(message, "REF_NOT_FOUND");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export class PathOutsidePoolError extends GroveError {
|
|
92
|
+
constructor(message = "Path outside pool boundary") {
|
|
93
|
+
super(message, "PATH_OUTSIDE_POOL");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export class BranchDeleteFailedError extends GroveError {
|
|
97
|
+
constructor(message) {
|
|
98
|
+
super(message, "BRANCH_DELETE_FAILED");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class HookFailedError extends GroveError {
|
|
102
|
+
constructor(message) {
|
|
103
|
+
super(message, "HOOK_FAILED");
|
|
104
|
+
}
|
|
105
|
+
}
|
package/dist/git/branch.d.ts
CHANGED
|
@@ -6,4 +6,12 @@ export declare function getRemoteUrl(repoRoot: string): Promise<string>;
|
|
|
6
6
|
export declare function shortHash(input: string): string;
|
|
7
7
|
export declare function isAncestor(repoRoot: string, a: string, b: string): Promise<boolean>;
|
|
8
8
|
export declare function branchRef(repoRoot: string, branch: string): Promise<string>;
|
|
9
|
+
export declare function getHeadSha(wtPath: string): Promise<string>;
|
|
10
|
+
export declare function resolveRef(repoRoot: string, ref: string): Promise<string>;
|
|
11
|
+
export declare function checkoutBranch(wtPath: string, branch: string, createOpts?: {
|
|
12
|
+
from: string;
|
|
13
|
+
ifExists?: "reuse" | "fail";
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export declare function checkoutDetached(wtPath: string, ref: string): Promise<void>;
|
|
16
|
+
export declare function deleteBranch(repoRoot: string, branch: string, force?: boolean): Promise<void>;
|
|
9
17
|
//# sourceMappingURL=branch.d.ts.map
|
package/dist/git/branch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/git/branch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/git/branch.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCxE;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUhF;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzF;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BjF;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/E;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjF;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnG"}
|
package/dist/git/branch.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { runGit } from "./run.js";
|
|
3
|
+
import { BranchExistsError, BranchNotFoundError, RefNotFoundError, GitCommandError } from "../errors.js";
|
|
3
4
|
export async function findRepoRoot(cwd) {
|
|
4
5
|
return runGit(cwd, ["rev-parse", "--show-toplevel"]);
|
|
5
6
|
}
|
|
@@ -104,3 +105,59 @@ export async function branchRef(repoRoot, branch) {
|
|
|
104
105
|
return remote;
|
|
105
106
|
return branch; // fallback
|
|
106
107
|
}
|
|
108
|
+
export async function getHeadSha(wtPath) {
|
|
109
|
+
return (await runGit(wtPath, ["rev-parse", "HEAD"])).trim();
|
|
110
|
+
}
|
|
111
|
+
export async function resolveRef(repoRoot, ref) {
|
|
112
|
+
try {
|
|
113
|
+
return (await runGit(repoRoot, ["rev-parse", ref])).trim();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new RefNotFoundError(`Ref not found: ${ref}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function checkoutBranch(wtPath, branch, createOpts) {
|
|
120
|
+
if (createOpts) {
|
|
121
|
+
const localBranches = await runGit(wtPath, ["branch", "--list", branch]);
|
|
122
|
+
if (localBranches.trim()) {
|
|
123
|
+
if (createOpts.ifExists === "fail") {
|
|
124
|
+
throw new BranchExistsError(`Branch exists: ${branch}`);
|
|
125
|
+
}
|
|
126
|
+
// reuse
|
|
127
|
+
await runGit(wtPath, ["checkout", branch]);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
try {
|
|
131
|
+
await runGit(wtPath, ["checkout", "-b", branch, createOpts.from]);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
throw new GitCommandError(`Failed to create branch ${branch} from ${createOpts.from}`, err.message);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
try {
|
|
140
|
+
await runGit(wtPath, ["checkout", branch]);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new BranchNotFoundError(`Branch not found: ${branch}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export async function checkoutDetached(wtPath, ref) {
|
|
148
|
+
try {
|
|
149
|
+
await runGit(wtPath, ["checkout", "--detach", ref]);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
throw new RefNotFoundError(`Ref not found: ${ref}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export async function deleteBranch(repoRoot, branch, force) {
|
|
156
|
+
try {
|
|
157
|
+
const args = force ? ["branch", "-D", branch] : ["branch", "-d", branch];
|
|
158
|
+
await runGit(repoRoot, args);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
throw new GitCommandError(`Failed to delete branch ${branch}`, err.message);
|
|
162
|
+
}
|
|
163
|
+
}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import type { Writable } from "node:stream";
|
|
|
2
2
|
export interface RunHooksOptions {
|
|
3
3
|
stdout?: Writable;
|
|
4
4
|
stderr?: Writable;
|
|
5
|
+
timeoutMs?: number | undefined;
|
|
6
|
+
env?: Record<string, string> | undefined;
|
|
7
|
+
onFailure?: "ignore" | "fail" | undefined;
|
|
5
8
|
}
|
|
6
9
|
export declare function runHooks(commands: string[], workDir: string, opts?: RunHooksOptions): Promise<void>;
|
|
7
10
|
//# sourceMappingURL=hooks.d.ts.map
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
package/dist/hooks.js
CHANGED
|
@@ -5,12 +5,17 @@ export async function runHooks(commands, workDir, opts = {}) {
|
|
|
5
5
|
const isWin = process.platform === "win32";
|
|
6
6
|
const shell = isWin ? process.env.COMSPEC || "cmd.exe" : "/bin/sh";
|
|
7
7
|
const args = isWin ? ["/d", "/s", "/c", command] : ["-c", command];
|
|
8
|
-
const
|
|
8
|
+
const execOpts = {
|
|
9
9
|
cwd: workDir,
|
|
10
10
|
stdout: opts.stdout ? "pipe" : "ignore",
|
|
11
11
|
stderr: opts.stderr ? "pipe" : "ignore",
|
|
12
12
|
windowsVerbatimArguments: isWin,
|
|
13
|
-
}
|
|
13
|
+
};
|
|
14
|
+
if (opts.timeoutMs !== undefined)
|
|
15
|
+
execOpts.timeout = opts.timeoutMs;
|
|
16
|
+
if (opts.env !== undefined)
|
|
17
|
+
execOpts.env = opts.env;
|
|
18
|
+
const child = execa(shell, args, execOpts);
|
|
14
19
|
if (opts.stdout) {
|
|
15
20
|
child.stdout?.pipe(opts.stdout, { end: false });
|
|
16
21
|
}
|
|
@@ -28,6 +33,10 @@ export async function runHooks(commands, workDir, opts = {}) {
|
|
|
28
33
|
else {
|
|
29
34
|
process.stderr.write(msg);
|
|
30
35
|
}
|
|
36
|
+
if (opts.onFailure === "fail") {
|
|
37
|
+
const { HookFailedError } = await import("./errors.js");
|
|
38
|
+
throw new HookFailedError(`Hook failed: ${command}`);
|
|
39
|
+
}
|
|
31
40
|
}
|
|
32
41
|
}
|
|
33
42
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Grove } from "./pool.js";
|
|
2
2
|
import type { GroveConfig } from "./schemas.js";
|
|
3
3
|
export { Grove } from "./pool.js";
|
|
4
|
-
export type { AcquiredSlot, WorktreeStatus, WorktreeStatusInfo } from "./
|
|
4
|
+
export type { AcquiredSlot, AcquireLeaseOptions, ReleaseLeaseOptions, DestroyLeaseOptions, RepairLeaseOptions, GroveLease, WorktreeStatus, WorktreeStatusInfo, } from "./types.js";
|
|
5
5
|
export { GroveConfigSchema } from "./schemas.js";
|
|
6
|
-
export type { GroveConfig, WorktreeEntry, GroveState } from "./schemas.js";
|
|
7
|
-
export { GroveError, GroveExhaustedError, WorktreeDestroyingError, WorktreeNotManagedError, WorktreeInUseError, GitNotFoundError, GitCommandError, InvalidGroveStateError, LockFailedError, } from "./errors.js";
|
|
6
|
+
export type { GroveConfig, WorktreeEntry, GroveState, GroveCleanupIntent } from "./schemas.js";
|
|
7
|
+
export { GroveError, GroveExhaustedError, WorktreeDestroyingError, WorktreeNotManagedError, WorktreeInUseError, GitNotFoundError, GitCommandError, InvalidGroveStateError, LockFailedError, LeaseNotFoundError, LeaseConflictError, LeaseAlreadyExistsError, LeaseQuarantinedError, UnsafeCleanupError, BranchExistsError, BranchNotFoundError, RefNotFoundError, PathOutsidePoolError, BranchDeleteFailedError, HookFailedError, } from "./errors.js";
|
|
8
8
|
export type { GroveErrorCode } from "./errors.js";
|
|
9
9
|
export declare function createGrove(configInput: GroveConfig): Promise<Grove>;
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAK1E"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Grove } from "./pool.js";
|
|
|
3
3
|
import { GroveConfigSchema } from "./schemas.js";
|
|
4
4
|
export { Grove } from "./pool.js";
|
|
5
5
|
export { GroveConfigSchema } from "./schemas.js";
|
|
6
|
-
export { GroveError, GroveExhaustedError, WorktreeDestroyingError, WorktreeNotManagedError, WorktreeInUseError, GitNotFoundError, GitCommandError, InvalidGroveStateError, LockFailedError, } from "./errors.js";
|
|
6
|
+
export { GroveError, GroveExhaustedError, WorktreeDestroyingError, WorktreeNotManagedError, WorktreeInUseError, GitNotFoundError, GitCommandError, InvalidGroveStateError, LockFailedError, LeaseNotFoundError, LeaseConflictError, LeaseAlreadyExistsError, LeaseQuarantinedError, UnsafeCleanupError, BranchExistsError, BranchNotFoundError, RefNotFoundError, PathOutsidePoolError, BranchDeleteFailedError, HookFailedError, } from "./errors.js";
|
|
7
7
|
export async function createGrove(configInput) {
|
|
8
8
|
const config = GroveConfigSchema.parse(configInput);
|
|
9
9
|
const groveDir = config.groveDir || (await resolveGroveDir(config.repoRoot, config.groveRoot || ""));
|
package/dist/pool.d.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import type { GroveConfig } from "./index.js";
|
|
2
2
|
import type { WorktreeEntry } from "./schemas.js";
|
|
3
|
-
|
|
4
|
-
export interface AcquiredSlot {
|
|
5
|
-
readonly path: string;
|
|
6
|
-
readonly name: string;
|
|
7
|
-
}
|
|
8
|
-
export interface WorktreeStatus {
|
|
9
|
-
name: string;
|
|
10
|
-
path: string;
|
|
11
|
-
status: WorktreeStatusInfo;
|
|
12
|
-
processes: {
|
|
13
|
-
PID: number;
|
|
14
|
-
Name?: string;
|
|
15
|
-
}[];
|
|
16
|
-
}
|
|
3
|
+
import type { AcquiredSlot, AcquireLeaseOptions, ReleaseLeaseOptions, DestroyLeaseOptions, RepairLeaseOptions, GroveLease, WorktreeStatus } from "./types.js";
|
|
17
4
|
export declare class Grove {
|
|
18
5
|
readonly poolDir: string;
|
|
19
6
|
private config;
|
|
20
7
|
constructor(poolDir: string, config: GroveConfig);
|
|
8
|
+
private runHook;
|
|
9
|
+
private findOrAllocateSlot;
|
|
21
10
|
acquire(): Promise<AcquiredSlot>;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
destroy(
|
|
26
|
-
|
|
27
|
-
}): Promise<void>;
|
|
11
|
+
acquire(options: AcquireLeaseOptions): Promise<GroveLease>;
|
|
12
|
+
release(path: string): Promise<void>;
|
|
13
|
+
release(leaseIdOrPath: string, options: ReleaseLeaseOptions): Promise<GroveLease>;
|
|
14
|
+
destroy(leaseIdOrPath: string, options?: DestroyLeaseOptions): Promise<void>;
|
|
15
|
+
private executeDestroy;
|
|
28
16
|
destroyAll(options?: {
|
|
29
17
|
force?: boolean;
|
|
30
18
|
}): Promise<void>;
|
|
19
|
+
repair(options: RepairLeaseOptions): Promise<GroveLease | void>;
|
|
20
|
+
inspect(leaseIdOrPath: string): Promise<GroveLease | null>;
|
|
21
|
+
list(_options?: {
|
|
22
|
+
includeProcesses?: boolean;
|
|
23
|
+
}): Promise<WorktreeStatus[]>;
|
|
24
|
+
listLeases(_options?: {
|
|
25
|
+
includeProcesses?: boolean;
|
|
26
|
+
}): Promise<GroveLease[]>;
|
|
31
27
|
findByPath(worktreePath: string): Promise<WorktreeEntry | null>;
|
|
28
|
+
private nextName;
|
|
29
|
+
private cwdInWorktree;
|
|
30
|
+
private assertPathWithinPool;
|
|
31
|
+
private leaseEnv;
|
|
32
32
|
}
|
|
33
33
|
//# sourceMappingURL=pool.d.ts.map
|
package/dist/pool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,cAAc,CAAC;AAc9D,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,qBAAa,KAAK;aAEE,OAAO,EAAE,MAAM;IAC/B,OAAO,CAAC,MAAM;IAFhB,YACkB,OAAO,EAAE,MAAM,EACvB,MAAM,EAAE,WAAW,EACzB;YAEU,OAAO;YAiBP,kBAAkB;IA0C1B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IA4J3D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IA2GlF,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CjF;YAEa,cAAc;IA0CtB,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD7D;IAEK,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAiDpE;IAEK,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAE/D;IAEK,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE/E;IAEK,UAAU,CAAC,QAAQ,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEjF;IAEK,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQpE;IAED,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,QAAQ;CAUjB"}
|