@procedures/git 0.0.0-stage → 0.2.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 +35 -0
- package/LICENSE +21 -0
- package/README.md +1130 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +22 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +514 -0
- package/dist/module.js.map +1 -0
- package/dist/procedures/git/add.d.ts +12 -0
- package/dist/procedures/git/add.d.ts.map +1 -0
- package/dist/procedures/git/add.js +26 -0
- package/dist/procedures/git/add.js.map +1 -0
- package/dist/procedures/git/args.d.ts +15 -0
- package/dist/procedures/git/args.d.ts.map +1 -0
- package/dist/procedures/git/args.js +20 -0
- package/dist/procedures/git/args.js.map +1 -0
- package/dist/procedures/git/branch.d.ts +12 -0
- package/dist/procedures/git/branch.d.ts.map +1 -0
- package/dist/procedures/git/branch.js +54 -0
- package/dist/procedures/git/branch.js.map +1 -0
- package/dist/procedures/git/checkout.d.ts +12 -0
- package/dist/procedures/git/checkout.d.ts.map +1 -0
- package/dist/procedures/git/checkout.js +23 -0
- package/dist/procedures/git/checkout.js.map +1 -0
- package/dist/procedures/git/clone.d.ts +12 -0
- package/dist/procedures/git/clone.d.ts.map +1 -0
- package/dist/procedures/git/clone.js +28 -0
- package/dist/procedures/git/clone.js.map +1 -0
- package/dist/procedures/git/commit.d.ts +12 -0
- package/dist/procedures/git/commit.d.ts.map +1 -0
- package/dist/procedures/git/commit.js +41 -0
- package/dist/procedures/git/commit.js.map +1 -0
- package/dist/procedures/git/diff.d.ts +18 -0
- package/dist/procedures/git/diff.d.ts.map +1 -0
- package/dist/procedures/git/diff.js +58 -0
- package/dist/procedures/git/diff.js.map +1 -0
- package/dist/procedures/git/fetch.d.ts +12 -0
- package/dist/procedures/git/fetch.d.ts.map +1 -0
- package/dist/procedures/git/fetch.js +29 -0
- package/dist/procedures/git/fetch.js.map +1 -0
- package/dist/procedures/git/index.d.ts +15 -0
- package/dist/procedures/git/index.d.ts.map +1 -0
- package/dist/procedures/git/index.js +15 -0
- package/dist/procedures/git/index.js.map +1 -0
- package/dist/procedures/git/init.d.ts +12 -0
- package/dist/procedures/git/init.d.ts.map +1 -0
- package/dist/procedures/git/init.js +32 -0
- package/dist/procedures/git/init.js.map +1 -0
- package/dist/procedures/git/log.d.ts +12 -0
- package/dist/procedures/git/log.d.ts.map +1 -0
- package/dist/procedures/git/log.js +35 -0
- package/dist/procedures/git/log.js.map +1 -0
- package/dist/procedures/git/predicates.d.ts +40 -0
- package/dist/procedures/git/predicates.d.ts.map +1 -0
- package/dist/procedures/git/predicates.js +76 -0
- package/dist/procedures/git/predicates.js.map +1 -0
- package/dist/procedures/git/pull.d.ts +12 -0
- package/dist/procedures/git/pull.d.ts.map +1 -0
- package/dist/procedures/git/pull.js +36 -0
- package/dist/procedures/git/pull.js.map +1 -0
- package/dist/procedures/git/push.d.ts +12 -0
- package/dist/procedures/git/push.d.ts.map +1 -0
- package/dist/procedures/git/push.js +39 -0
- package/dist/procedures/git/push.js.map +1 -0
- package/dist/procedures/git/remote.d.ts +13 -0
- package/dist/procedures/git/remote.d.ts.map +1 -0
- package/dist/procedures/git/remote.js +30 -0
- package/dist/procedures/git/remote.js.map +1 -0
- package/dist/procedures/git/run.d.ts +32 -0
- package/dist/procedures/git/run.d.ts.map +1 -0
- package/dist/procedures/git/run.js +60 -0
- package/dist/procedures/git/run.js.map +1 -0
- package/dist/procedures/git/stash.d.ts +38 -0
- package/dist/procedures/git/stash.d.ts.map +1 -0
- package/dist/procedures/git/stash.js +211 -0
- package/dist/procedures/git/stash.js.map +1 -0
- package/dist/procedures/git/status.d.ts +17 -0
- package/dist/procedures/git/status.d.ts.map +1 -0
- package/dist/procedures/git/status.js +107 -0
- package/dist/procedures/git/status.js.map +1 -0
- package/dist/procedures/git.d.ts +5 -0
- package/dist/procedures/git.d.ts.map +1 -0
- package/dist/procedures/git.js +5 -0
- package/dist/procedures/git.js.map +1 -0
- package/dist/register.d.ts +7 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +9 -0
- package/dist/register.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +397 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -3
- package/src/index.ts +20 -0
- package/src/module.ts +656 -0
- package/src/procedures/git/add.ts +29 -0
- package/src/procedures/git/args.ts +21 -0
- package/src/procedures/git/branch.ts +61 -0
- package/src/procedures/git/checkout.ts +27 -0
- package/src/procedures/git/clone.ts +33 -0
- package/src/procedures/git/commit.ts +46 -0
- package/src/procedures/git/diff.ts +62 -0
- package/src/procedures/git/fetch.ts +32 -0
- package/src/procedures/git/index.ts +22 -0
- package/src/procedures/git/init.ts +43 -0
- package/src/procedures/git/log.ts +40 -0
- package/src/procedures/git/predicates.ts +90 -0
- package/src/procedures/git/pull.ts +45 -0
- package/src/procedures/git/push.ts +42 -0
- package/src/procedures/git/remote.ts +31 -0
- package/src/procedures/git/run.ts +70 -0
- package/src/procedures/git/stash.ts +255 -0
- package/src/procedures/git/status.ts +98 -0
- package/src/procedures/git.ts +5 -0
- package/src/register.ts +11 -0
- package/src/types.ts +815 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git predicate procedures
|
|
3
|
+
*
|
|
4
|
+
* Simple boolean predicates for conditional execution.
|
|
5
|
+
* These return true/false based on git repository state.
|
|
6
|
+
*/
|
|
7
|
+
import { git, GitError } from "./run.js";
|
|
8
|
+
/**
|
|
9
|
+
* The output of a git command, or null when git fails (for example outside a repository).
|
|
10
|
+
* An aborted signal still throws.
|
|
11
|
+
*/
|
|
12
|
+
async function gitOrNull(args, cwd, ctx) {
|
|
13
|
+
try {
|
|
14
|
+
return (await git(args, { cwd, signal: ctx.signal })).trim();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof GitError)
|
|
18
|
+
return null;
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if there are any changes (unstaged, staged, or untracked)
|
|
24
|
+
*/
|
|
25
|
+
export async function gitHasChanges(input, ctx = {}) {
|
|
26
|
+
const status = await gitOrNull(["status", "--porcelain"], input.cwd, ctx);
|
|
27
|
+
return { value: status !== null && status.length > 0 };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if there are any staged changes ready to commit
|
|
31
|
+
*/
|
|
32
|
+
export async function gitHasStagedChanges(input, ctx = {}) {
|
|
33
|
+
// git diff --cached shows only staged changes
|
|
34
|
+
const diff = await gitOrNull(["diff", "--cached", "--name-only"], input.cwd, ctx);
|
|
35
|
+
return { value: diff !== null && diff.length > 0 };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if there are any unstaged changes (modified or deleted files)
|
|
39
|
+
*/
|
|
40
|
+
export async function gitHasUnstagedChanges(input, ctx = {}) {
|
|
41
|
+
// git diff shows only unstaged changes to tracked files
|
|
42
|
+
const diff = await gitOrNull(["diff", "--name-only"], input.cwd, ctx);
|
|
43
|
+
return { value: diff !== null && diff.length > 0 };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if there are any untracked files
|
|
47
|
+
*/
|
|
48
|
+
export async function gitHasUntrackedFiles(input, ctx = {}) {
|
|
49
|
+
// List untracked files only
|
|
50
|
+
const untracked = await gitOrNull(["ls-files", "--others", "--exclude-standard"], input.cwd, ctx);
|
|
51
|
+
return { value: untracked !== null && untracked.length > 0 };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if there are local commits that haven't been pushed
|
|
55
|
+
*/
|
|
56
|
+
export async function gitHasLocalCommits(input, ctx = {}) {
|
|
57
|
+
// Get the upstream tracking branch
|
|
58
|
+
const upstream = await gitOrNull(["rev-parse", "--abbrev-ref", "@{upstream}"], input.cwd, ctx);
|
|
59
|
+
if (upstream !== null) {
|
|
60
|
+
// Count commits ahead of upstream
|
|
61
|
+
const count = await gitOrNull(["rev-list", "--count", `${upstream}..HEAD`], input.cwd, ctx);
|
|
62
|
+
if (count !== null)
|
|
63
|
+
return { value: parseInt(count, 10) > 0 };
|
|
64
|
+
}
|
|
65
|
+
// No upstream or error - HEAD exists but no upstream: treat as having local commits
|
|
66
|
+
const head = await gitOrNull(["rev-parse", "HEAD"], input.cwd, ctx);
|
|
67
|
+
return { value: head !== null };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if the working directory is clean (no changes at all)
|
|
71
|
+
*/
|
|
72
|
+
export async function gitIsClean(input, ctx = {}) {
|
|
73
|
+
const result = await gitHasChanges(input, ctx);
|
|
74
|
+
return { value: !result.value };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../../src/procedures/git/predicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.pull procedure
|
|
3
|
+
*
|
|
4
|
+
* Pull from remote
|
|
5
|
+
*/
|
|
6
|
+
import { type GitContext } from "./run.js";
|
|
7
|
+
import type { GitPullInput, GitPullOutput } from "../../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Pull from remote
|
|
10
|
+
*/
|
|
11
|
+
export declare function gitPull(input: GitPullInput, ctx?: GitContext): Promise<GitPullOutput>;
|
|
12
|
+
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/pull.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAO,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAElE;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA+B/F"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.pull procedure
|
|
3
|
+
*
|
|
4
|
+
* Pull from remote
|
|
5
|
+
*/
|
|
6
|
+
import { gitArg } from "./args.js";
|
|
7
|
+
import { git } from "./run.js";
|
|
8
|
+
/**
|
|
9
|
+
* Pull from remote
|
|
10
|
+
*/
|
|
11
|
+
export async function gitPull(input, ctx = {}) {
|
|
12
|
+
const { branch, rebase, cwd } = input;
|
|
13
|
+
const remoteName = input.remote ?? "origin";
|
|
14
|
+
const run = { cwd, signal: ctx.signal };
|
|
15
|
+
// Get current branch if not specified
|
|
16
|
+
const branchName = branch || (await git(["rev-parse", "--abbrev-ref", "HEAD"], run)).trim();
|
|
17
|
+
// Get current HEAD before pull
|
|
18
|
+
const beforeHead = (await git(["rev-parse", "HEAD"], run)).trim();
|
|
19
|
+
const args = ["pull"];
|
|
20
|
+
if (rebase)
|
|
21
|
+
args.push("--rebase");
|
|
22
|
+
args.push(gitArg("remote", remoteName), gitArg("branch", branchName));
|
|
23
|
+
await git(args, run);
|
|
24
|
+
// Get new HEAD after pull
|
|
25
|
+
const afterHead = (await git(["rev-parse", "HEAD"], run)).trim();
|
|
26
|
+
// Count new commits
|
|
27
|
+
let commits = 0;
|
|
28
|
+
if (beforeHead !== afterHead) {
|
|
29
|
+
const count = (await git(["rev-list", "--count", `${beforeHead}..${afterHead}`], run)).trim();
|
|
30
|
+
commits = parseInt(count, 10) || 0;
|
|
31
|
+
}
|
|
32
|
+
// Check if it was fast-forward
|
|
33
|
+
const fastForward = !rebase && beforeHead !== afterHead;
|
|
34
|
+
return { remote: remoteName, branch: branchName, commits, fastForward };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/procedures/git/pull.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAmB,MAAM,UAAU,CAAC;AAGhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB,EAAE,GAAG,GAAe,EAAE;IACrE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAExC,sCAAsC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5F,+BAA+B;IAC/B,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElE,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErB,0BAA0B;IAC1B,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjE,oBAAoB;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,UAAU,KAAK,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9F,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,UAAU,KAAK,SAAS,CAAC;IAExD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.push procedure
|
|
3
|
+
*
|
|
4
|
+
* Push to remote
|
|
5
|
+
*/
|
|
6
|
+
import { type GitContext } from "./run.js";
|
|
7
|
+
import type { GitPushInput, GitPushOutput } from "../../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Push to remote
|
|
10
|
+
*/
|
|
11
|
+
export declare function gitPush(input: GitPushInput, ctx?: GitContext): Promise<GitPushOutput>;
|
|
12
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAElE;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA4B/F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.push procedure
|
|
3
|
+
*
|
|
4
|
+
* Push to remote
|
|
5
|
+
*/
|
|
6
|
+
import { gitArg } from "./args.js";
|
|
7
|
+
import { git, GitError } from "./run.js";
|
|
8
|
+
/**
|
|
9
|
+
* Push to remote
|
|
10
|
+
*/
|
|
11
|
+
export async function gitPush(input, ctx = {}) {
|
|
12
|
+
const { branch, force, setUpstream, cwd } = input;
|
|
13
|
+
const remoteName = input.remote ?? "origin";
|
|
14
|
+
const run = { cwd, signal: ctx.signal };
|
|
15
|
+
// Get current branch if not specified
|
|
16
|
+
const branchName = branch || (await git(["rev-parse", "--abbrev-ref", "HEAD"], run)).trim();
|
|
17
|
+
// Count commits to push
|
|
18
|
+
let commits = 0;
|
|
19
|
+
try {
|
|
20
|
+
const count = (await git(["rev-list", "--count", `${remoteName}/${branchName}..HEAD`], run)).trim();
|
|
21
|
+
commits = parseInt(count, 10) || 0;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// Remote branch may not exist yet
|
|
25
|
+
if (!(error instanceof GitError))
|
|
26
|
+
throw error;
|
|
27
|
+
const count = (await git(["rev-list", "--count", "HEAD"], run)).trim();
|
|
28
|
+
commits = parseInt(count, 10) || 0;
|
|
29
|
+
}
|
|
30
|
+
const args = ["push"];
|
|
31
|
+
if (setUpstream)
|
|
32
|
+
args.push("-u");
|
|
33
|
+
if (force)
|
|
34
|
+
args.push("--force");
|
|
35
|
+
args.push(gitArg("remote", remoteName), gitArg("branch", branchName));
|
|
36
|
+
await git(args, run);
|
|
37
|
+
return { remote: remoteName, branch: branchName, commits };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/procedures/git/push.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAG1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB,EAAE,GAAG,GAAe,EAAE;IACrE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAExC,sCAAsC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5F,wBAAwB;IACxB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,UAAU,IAAI,UAAU,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpG,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kCAAkC;QAClC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.remote and git.remote.set
|
|
3
|
+
*
|
|
4
|
+
* git.remote reads the URL of a remote. git.remote.set replaces it, or adds the remote. Two
|
|
5
|
+
* procedures, so that a reader of the URL declares that it changes nothing (CAPABILITIES-2026-10).
|
|
6
|
+
*/
|
|
7
|
+
import { type GitContext } from "./run.js";
|
|
8
|
+
import type { GitRemoteInput, GitRemoteOutput, GitRemoteSetInput } from "../../types.js";
|
|
9
|
+
/** This function gives the URL of a remote. */
|
|
10
|
+
export declare function gitRemote(input: GitRemoteInput, ctx?: GitContext): Promise<GitRemoteOutput>;
|
|
11
|
+
/** This function sets the URL of a remote, and adds the remote when it is missing. */
|
|
12
|
+
export declare function gitRemoteSet(input: GitRemoteSetInput, ctx?: GitContext): Promise<GitRemoteOutput>;
|
|
13
|
+
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/remote.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEzF,+CAA+C;AAC/C,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrG;AAED,sFAAsF;AACtF,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAW3G"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.remote and git.remote.set
|
|
3
|
+
*
|
|
4
|
+
* git.remote reads the URL of a remote. git.remote.set replaces it, or adds the remote. Two
|
|
5
|
+
* procedures, so that a reader of the URL declares that it changes nothing (CAPABILITIES-2026-10).
|
|
6
|
+
*/
|
|
7
|
+
import { gitArg } from "./args.js";
|
|
8
|
+
import { git, GitError } from "./run.js";
|
|
9
|
+
/** This function gives the URL of a remote. */
|
|
10
|
+
export async function gitRemote(input, ctx = {}) {
|
|
11
|
+
const { name, cwd } = input;
|
|
12
|
+
const url = (await git(["remote", "get-url", gitArg("name", name)], { cwd, signal: ctx.signal })).trim();
|
|
13
|
+
return { name, url };
|
|
14
|
+
}
|
|
15
|
+
/** This function sets the URL of a remote, and adds the remote when it is missing. */
|
|
16
|
+
export async function gitRemoteSet(input, ctx = {}) {
|
|
17
|
+
const { name, url, cwd } = input;
|
|
18
|
+
const run = { cwd, signal: ctx.signal };
|
|
19
|
+
try {
|
|
20
|
+
await git(["remote", "set-url", gitArg("name", name), gitArg("url", url)], run);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// The remote is missing: add it
|
|
24
|
+
if (!(error instanceof GitError))
|
|
25
|
+
throw error;
|
|
26
|
+
await git(["remote", "add", gitArg("name", name), gitArg("url", url)], run);
|
|
27
|
+
}
|
|
28
|
+
return { name, url };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/procedures/git/remote.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAG1D,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB,EAAE,GAAG,GAAe,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzG,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,GAAG,GAAe,EAAE;IAC/E,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QAC9C,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the git procedures run git: through `runCommand` of client-shell (roadmap 2.2).
|
|
3
|
+
*
|
|
4
|
+
* Before, they called `execFileSync`: each git call blocked the event loop of the host (an MCP
|
|
5
|
+
* server or a warm `mark` server stopped all its other calls), and the signal of the call could
|
|
6
|
+
* not stop git. Now each call is async, the signal kills git, and the output has a limit.
|
|
7
|
+
*/
|
|
8
|
+
/** The part of the procedure context that the git procedures read. */
|
|
9
|
+
export interface GitContext {
|
|
10
|
+
signal?: AbortSignal | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface GitRunOptions extends GitContext {
|
|
13
|
+
cwd?: string | undefined;
|
|
14
|
+
/** Text to write to the stdin of git (for example a patch for `git apply`). */
|
|
15
|
+
input?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** A git command that ended with an exit code other than 0. */
|
|
18
|
+
export declare class GitError extends Error {
|
|
19
|
+
readonly args: readonly string[];
|
|
20
|
+
readonly exitCode: number;
|
|
21
|
+
readonly stdout: string;
|
|
22
|
+
readonly stderr: string;
|
|
23
|
+
constructor(args: readonly string[], exitCode: number, stdout: string, stderr: string);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* This function runs `git <args>` and gives its stdout. It throws a `GitError` when git fails,
|
|
27
|
+
* and an `AbortError` when the signal aborts.
|
|
28
|
+
*/
|
|
29
|
+
export declare function git(args: string[], options?: GitRunOptions): Promise<string>;
|
|
30
|
+
/** This function splits output that git wrote with `-z` into its fields. */
|
|
31
|
+
export declare function zFields(output: string): string[];
|
|
32
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,+DAA+D;AAC/D,qBAAa,QAAS,SAAQ,KAAK;IAE/B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,YACW,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAIxB;CACF;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBtF;AAED,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAIhD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the git procedures run git: through `runCommand` of client-shell (roadmap 2.2).
|
|
3
|
+
*
|
|
4
|
+
* Before, they called `execFileSync`: each git call blocked the event loop of the host (an MCP
|
|
5
|
+
* server or a warm `mark` server stopped all its other calls), and the signal of the call could
|
|
6
|
+
* not stop git. Now each call is async, the signal kills git, and the output has a limit.
|
|
7
|
+
*/
|
|
8
|
+
import { runCommand } from "@procedures/shell/command";
|
|
9
|
+
import { GIT_MAX_BUFFER } from "./args.js";
|
|
10
|
+
/** A git command that ended with an exit code other than 0. */
|
|
11
|
+
export class GitError extends Error {
|
|
12
|
+
args;
|
|
13
|
+
exitCode;
|
|
14
|
+
stdout;
|
|
15
|
+
stderr;
|
|
16
|
+
constructor(args, exitCode, stdout, stderr) {
|
|
17
|
+
super(`git ${args.join(" ")} failed (exit ${exitCode}): ${(stderr || stdout).trim()}`);
|
|
18
|
+
this.args = args;
|
|
19
|
+
this.exitCode = exitCode;
|
|
20
|
+
this.stdout = stdout;
|
|
21
|
+
this.stderr = stderr;
|
|
22
|
+
this.name = "GitError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* This function runs `git <args>` and gives its stdout. It throws a `GitError` when git fails,
|
|
27
|
+
* and an `AbortError` when the signal aborts.
|
|
28
|
+
*/
|
|
29
|
+
export async function git(args, options = {}) {
|
|
30
|
+
const result = await runCommand("git", {
|
|
31
|
+
args,
|
|
32
|
+
cwd: options.cwd,
|
|
33
|
+
signal: options.signal,
|
|
34
|
+
input: options.input,
|
|
35
|
+
maxOutputBytes: GIT_MAX_BUFFER,
|
|
36
|
+
});
|
|
37
|
+
if (result.aborted) {
|
|
38
|
+
const error = new Error(`git ${args[0]} was aborted`);
|
|
39
|
+
error.name = "AbortError";
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
if (result.error) {
|
|
43
|
+
throw new Error(`git did not start: ${result.error}`);
|
|
44
|
+
}
|
|
45
|
+
if (result.truncated?.stdout) {
|
|
46
|
+
throw new Error(`The output of git ${args[0]} is longer than ${GIT_MAX_BUFFER} bytes`);
|
|
47
|
+
}
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
throw new GitError(args, result.exitCode, result.stdout, result.stderr);
|
|
50
|
+
}
|
|
51
|
+
return result.stdout;
|
|
52
|
+
}
|
|
53
|
+
/** This function splits output that git wrote with `-z` into its fields. */
|
|
54
|
+
export function zFields(output) {
|
|
55
|
+
const fields = output.split("\0");
|
|
56
|
+
if (fields.at(-1) === "")
|
|
57
|
+
fields.pop();
|
|
58
|
+
return fields;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/procedures/git/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAa3C,+DAA+D;AAC/D,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,MAAM;IAJjB,YACW,IAAuB,EACvB,QAAgB,EAChB,MAAc,EACd,MAAc;QAEvB,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,QAAQ,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAL9E,IAAI;wBACJ,QAAQ;sBACR,MAAM;sBACN,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,OAAO,GAAkB,EAAE;IACnE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;QACrC,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,mBAAmB,cAAc,QAAQ,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.stash.* procedures
|
|
3
|
+
*
|
|
4
|
+
* Stash operations for saving and restoring work in progress.
|
|
5
|
+
* Includes export/import for snapshot storage.
|
|
6
|
+
*/
|
|
7
|
+
import { type GitContext } from "./run.js";
|
|
8
|
+
import type { GitStashListInput, GitStashListOutput, GitStashPushInput, GitStashPushOutput, GitStashPopInput, GitStashPopOutput, GitStashApplyInput, GitStashApplyOutput, GitStashDropInput, GitStashDropOutput, GitStashExportInput, GitStashExportOutput, GitStashImportInput, GitStashImportOutput } from "../../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* List all stashes
|
|
11
|
+
*/
|
|
12
|
+
export declare function gitStashList(input: GitStashListInput, ctx?: GitContext): Promise<GitStashListOutput>;
|
|
13
|
+
/**
|
|
14
|
+
* Push changes to stash
|
|
15
|
+
*/
|
|
16
|
+
export declare function gitStashPush(input: GitStashPushInput, ctx?: GitContext): Promise<GitStashPushOutput>;
|
|
17
|
+
/**
|
|
18
|
+
* Pop stash (apply and remove)
|
|
19
|
+
*/
|
|
20
|
+
export declare function gitStashPop(input: GitStashPopInput, ctx?: GitContext): Promise<GitStashPopOutput>;
|
|
21
|
+
/**
|
|
22
|
+
* Apply stash without removing
|
|
23
|
+
*/
|
|
24
|
+
export declare function gitStashApply(input: GitStashApplyInput, ctx?: GitContext): Promise<GitStashApplyOutput>;
|
|
25
|
+
/**
|
|
26
|
+
* Drop a stash
|
|
27
|
+
*/
|
|
28
|
+
export declare function gitStashDrop(input: GitStashDropInput, ctx?: GitContext): Promise<GitStashDropOutput>;
|
|
29
|
+
/**
|
|
30
|
+
* Export a stash as a patch (for snapshot storage)
|
|
31
|
+
*/
|
|
32
|
+
export declare function gitStashExport(input: GitStashExportInput, ctx?: GitContext): Promise<GitStashExportOutput>;
|
|
33
|
+
/**
|
|
34
|
+
* Import a stash from a patch (for snapshot restore)
|
|
35
|
+
* Note: This creates a new stash, it doesn't recreate the exact stash state
|
|
36
|
+
*/
|
|
37
|
+
export declare function gitStashImport(input: GitStashImportInput, ctx?: GitContext): Promise<GitStashImportOutput>;
|
|
38
|
+
//# sourceMappingURL=stash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../../../src/procedures/git/stash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EAErB,MAAM,gBAAgB,CAAC;AAqBxB;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgC9G;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0C9G;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAe3G;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAcjH;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW9G;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmCpH;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,UAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBpH"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git.stash.* procedures
|
|
3
|
+
*
|
|
4
|
+
* Stash operations for saving and restoring work in progress.
|
|
5
|
+
* Includes export/import for snapshot storage.
|
|
6
|
+
*/
|
|
7
|
+
import { gitArg } from "./args.js";
|
|
8
|
+
import { git, GitError } from "./run.js";
|
|
9
|
+
/**
|
|
10
|
+
* True when git stopped on a merge conflict. Git writes "CONFLICT (content): ..." to stdout,
|
|
11
|
+
* so the message alone (which has stderr) does not show it. (Before, the procedures examined
|
|
12
|
+
* only the message, and never reported a conflict.)
|
|
13
|
+
*/
|
|
14
|
+
function isConflict(error) {
|
|
15
|
+
return error instanceof GitError && /conflict/i.test(`${error.stdout}\n${error.stderr}`);
|
|
16
|
+
}
|
|
17
|
+
/** The message of a git failure. An abort is not a git failure: it throws again. */
|
|
18
|
+
function failure(error) {
|
|
19
|
+
if (!(error instanceof GitError))
|
|
20
|
+
throw error;
|
|
21
|
+
return error.message;
|
|
22
|
+
}
|
|
23
|
+
function stashRef(index) {
|
|
24
|
+
return index !== undefined ? `stash@{${index}}` : "stash@{0}";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* List all stashes
|
|
28
|
+
*/
|
|
29
|
+
export async function gitStashList(input, ctx = {}) {
|
|
30
|
+
const cwd = input.cwd || process.cwd();
|
|
31
|
+
let output;
|
|
32
|
+
try {
|
|
33
|
+
// Get stash list with format: stash@{n}: WIP on branch: message
|
|
34
|
+
output = await git(["stash", "list", "--format=%H%x00%gd%x00%gs"], { cwd, signal: ctx.signal });
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// No stashes or not a git repo
|
|
38
|
+
failure(error);
|
|
39
|
+
return { stashes: [], count: 0 };
|
|
40
|
+
}
|
|
41
|
+
const stashes = [];
|
|
42
|
+
for (const line of output.split("\n").filter(Boolean)) {
|
|
43
|
+
const parts = line.split("\0");
|
|
44
|
+
const hash = parts[0] || "";
|
|
45
|
+
const ref = parts[1] || "";
|
|
46
|
+
const message = parts[2] || "";
|
|
47
|
+
// Extract index from stash@{n}
|
|
48
|
+
const indexMatch = ref.match(/stash@\{(\d+)\}/);
|
|
49
|
+
const index = indexMatch && indexMatch[1] ? parseInt(indexMatch[1], 10) : 0;
|
|
50
|
+
stashes.push({
|
|
51
|
+
index,
|
|
52
|
+
ref,
|
|
53
|
+
hash,
|
|
54
|
+
message,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return { stashes, count: stashes.length };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Push changes to stash
|
|
61
|
+
*/
|
|
62
|
+
export async function gitStashPush(input, ctx = {}) {
|
|
63
|
+
const cwd = input.cwd || process.cwd();
|
|
64
|
+
const run = { cwd, signal: ctx.signal };
|
|
65
|
+
const args = ["stash", "push"];
|
|
66
|
+
if (input.message) {
|
|
67
|
+
args.push("-m", input.message);
|
|
68
|
+
}
|
|
69
|
+
if (input.includeUntracked) {
|
|
70
|
+
args.push("--include-untracked");
|
|
71
|
+
}
|
|
72
|
+
if (input.keepIndex) {
|
|
73
|
+
args.push("--keep-index");
|
|
74
|
+
}
|
|
75
|
+
if (input.paths && input.paths.length > 0) {
|
|
76
|
+
args.push("--");
|
|
77
|
+
args.push(...input.paths);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const output = await git(args, run);
|
|
81
|
+
// Check if anything was stashed
|
|
82
|
+
if (output.includes("No local changes to save")) {
|
|
83
|
+
return { stashed: false, message: "No local changes to save" };
|
|
84
|
+
}
|
|
85
|
+
// Get the ref of the new stash
|
|
86
|
+
const refOutput = (await git(["stash", "list", "-1", "--format=%gd"], run)).trim();
|
|
87
|
+
return {
|
|
88
|
+
stashed: true,
|
|
89
|
+
ref: refOutput || "stash@{0}",
|
|
90
|
+
message: input.message || "WIP",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return { stashed: false, message: failure(error) || "Failed to stash" };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pop stash (apply and remove)
|
|
99
|
+
*/
|
|
100
|
+
export async function gitStashPop(input, ctx = {}) {
|
|
101
|
+
const cwd = input.cwd || process.cwd();
|
|
102
|
+
const ref = stashRef(input.index);
|
|
103
|
+
try {
|
|
104
|
+
await git(["stash", "pop", gitArg("ref", ref)], { cwd, signal: ctx.signal });
|
|
105
|
+
return { applied: true, ref, dropped: true };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Check if it's a conflict
|
|
109
|
+
if (isConflict(error)) {
|
|
110
|
+
return { applied: false, ref, dropped: false, conflict: true };
|
|
111
|
+
}
|
|
112
|
+
failure(error);
|
|
113
|
+
return { applied: false, ref, dropped: false };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Apply stash without removing
|
|
118
|
+
*/
|
|
119
|
+
export async function gitStashApply(input, ctx = {}) {
|
|
120
|
+
const cwd = input.cwd || process.cwd();
|
|
121
|
+
const ref = stashRef(input.index);
|
|
122
|
+
try {
|
|
123
|
+
await git(["stash", "apply", gitArg("ref", ref)], { cwd, signal: ctx.signal });
|
|
124
|
+
return { applied: true, ref };
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (isConflict(error)) {
|
|
128
|
+
return { applied: false, ref, conflict: true };
|
|
129
|
+
}
|
|
130
|
+
failure(error);
|
|
131
|
+
return { applied: false, ref };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Drop a stash
|
|
136
|
+
*/
|
|
137
|
+
export async function gitStashDrop(input, ctx = {}) {
|
|
138
|
+
const cwd = input.cwd || process.cwd();
|
|
139
|
+
const ref = stashRef(input.index);
|
|
140
|
+
try {
|
|
141
|
+
await git(["stash", "drop", gitArg("ref", ref)], { cwd, signal: ctx.signal });
|
|
142
|
+
return { dropped: true, ref };
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
failure(error);
|
|
146
|
+
return { dropped: false, ref };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Export a stash as a patch (for snapshot storage)
|
|
151
|
+
*/
|
|
152
|
+
export async function gitStashExport(input, ctx = {}) {
|
|
153
|
+
const cwd = input.cwd || process.cwd();
|
|
154
|
+
const run = { cwd, signal: ctx.signal };
|
|
155
|
+
const ref = stashRef(input.index);
|
|
156
|
+
try {
|
|
157
|
+
// Get the stash as a patch
|
|
158
|
+
const patch = await git(["stash", "show", "-p", gitArg("ref", ref)], run);
|
|
159
|
+
// Get metadata
|
|
160
|
+
const metadata = (await git(["stash", "list", "-1", "--format=%H%x00%gs", ref], run)).trim();
|
|
161
|
+
const metaParts = metadata.split("\0");
|
|
162
|
+
const hash = metaParts[0] || "";
|
|
163
|
+
const message = metaParts[1] || "";
|
|
164
|
+
// Get untracked files if present (stash^3 contains untracked files if any)
|
|
165
|
+
let untrackedPatch = "";
|
|
166
|
+
try {
|
|
167
|
+
untrackedPatch = await git(["show", `${ref}^3`, "--format=", "--name-only"], run);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
// No untracked files in this stash
|
|
171
|
+
failure(error);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
ref,
|
|
175
|
+
hash,
|
|
176
|
+
message,
|
|
177
|
+
patch,
|
|
178
|
+
hasUntracked: untrackedPatch.length > 0,
|
|
179
|
+
untrackedPatch: untrackedPatch || undefined,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
throw new Error(`Failed to export stash ${ref}: ${failure(error)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Import a stash from a patch (for snapshot restore)
|
|
188
|
+
* Note: This creates a new stash, it doesn't recreate the exact stash state
|
|
189
|
+
*/
|
|
190
|
+
export async function gitStashImport(input, ctx = {}) {
|
|
191
|
+
const cwd = input.cwd || process.cwd();
|
|
192
|
+
const run = { cwd, signal: ctx.signal };
|
|
193
|
+
try {
|
|
194
|
+
// Apply the patch to working directory
|
|
195
|
+
await git(["apply", "--3way"], { ...run, input: input.patch });
|
|
196
|
+
// Stash the changes with the original message
|
|
197
|
+
const message = input.message || "Imported stash";
|
|
198
|
+
const args = ["stash", "push", "-m", message];
|
|
199
|
+
if (input.includeUntracked) {
|
|
200
|
+
args.push("--include-untracked");
|
|
201
|
+
}
|
|
202
|
+
await git(args, run);
|
|
203
|
+
// Get the new stash ref
|
|
204
|
+
const ref = (await git(["stash", "list", "-1", "--format=%gd"], run)).trim();
|
|
205
|
+
return { imported: true, ref: ref || "stash@{0}" };
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return { imported: false, error: failure(error) || "Failed to import stash" };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=stash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stash.js","sourceRoot":"","sources":["../../../src/procedures/git/stash.ts"],"names":[],"mappings":"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"}
|