worktree-add 2.0.0 → 2.0.1
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/README.md +3 -1
- package/dist/cli/cleanup-worktree.d.ts +2 -1
- package/dist/cli/cleanup-worktree.d.ts.map +1 -1
- package/dist/cli/cleanup-worktree.js +51 -4
- package/dist/cli/cleanup-worktree.js.map +1 -1
- package/dist/cli/plan-branch-cleanup.d.ts +17 -0
- package/dist/cli/plan-branch-cleanup.d.ts.map +1 -0
- package/dist/cli/plan-branch-cleanup.js +19 -0
- package/dist/cli/plan-branch-cleanup.js.map +1 -0
- package/dist/cli/run-worktree-add.d.ts.map +1 -1
- package/dist/cli/run-worktree-add.js +4 -7
- package/dist/cli/run-worktree-add.js.map +1 -1
- package/dist/git/create-worktree.d.ts +15 -1
- package/dist/git/create-worktree.d.ts.map +1 -1
- package/dist/git/create-worktree.js +48 -33
- package/dist/git/create-worktree.js.map +1 -1
- package/dist/git/delete-created-branch.d.ts +3 -0
- package/dist/git/delete-created-branch.d.ts.map +1 -0
- package/dist/git/delete-created-branch.js +6 -0
- package/dist/git/delete-created-branch.js.map +1 -0
- package/dist/git/git.d.ts +3 -0
- package/dist/git/git.d.ts.map +1 -1
- package/dist/git/git.js +12 -0
- package/dist/git/git.js.map +1 -1
- package/dist/git/parse-branch-config.d.ts +4 -0
- package/dist/git/parse-branch-config.d.ts.map +1 -0
- package/dist/git/parse-branch-config.js +17 -0
- package/dist/git/parse-branch-config.js.map +1 -0
- package/dist/git/restore-branch-config.d.ts +3 -0
- package/dist/git/restore-branch-config.d.ts.map +1 -0
- package/dist/git/restore-branch-config.js +30 -0
- package/dist/git/restore-branch-config.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -28,9 +28,11 @@ Running `worktree-add <branch>` from inside a repo:
|
|
|
28
28
|
|
|
29
29
|
Your original checkout is left untouched.
|
|
30
30
|
|
|
31
|
+
If a later step fails or you interrupt the run, the tool removes the new worktree. Once the worktree is removed, it also deletes the branch if this run created it (from `HEAD` or from `origin/<branch>`) and the branch still points at the commit it was created at. Its `branch.<branch>.*` config goes back to what it was before the run: the tracking settings the run added are removed, and any values you had set are kept. A branch that existed before the run, gained commits, or is checked out in another worktree is kept.
|
|
32
|
+
|
|
31
33
|
## Requirements
|
|
32
34
|
|
|
33
|
-
- Node.js ≥ 24.
|
|
35
|
+
- Node.js ≥ 24.15.0
|
|
34
36
|
- Git with `git worktree` support
|
|
35
37
|
- Git credentials configured for `origin/` (the tool is non-interactive and won’t prompt for authentication)
|
|
36
38
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { StatusLogger } from "../output/create-status-logger.js";
|
|
2
|
-
|
|
2
|
+
import type { CreatedWorktree } from "../git/create-worktree.js";
|
|
3
|
+
export declare function cleanupWorktree(worktree: CreatedWorktree, logger: StatusLogger, reason: string): void;
|
|
3
4
|
//# sourceMappingURL=cleanup-worktree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-worktree.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"cleanup-worktree.d.ts","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAkDhF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAcN"}
|
|
@@ -1,12 +1,59 @@
|
|
|
1
|
+
import { deleteCreatedBranch } from "../git/delete-created-branch.js";
|
|
2
|
+
import { extractDiagnosticLine } from "../git/extract-diagnostic-line.js";
|
|
3
|
+
import { resolveCommit } from "../git/git.js";
|
|
1
4
|
import { removeWorktree } from "../git/remove-worktree.js";
|
|
2
|
-
|
|
3
|
-
|
|
5
|
+
import { restoreBranchConfig } from "../git/restore-branch-config.js";
|
|
6
|
+
import { findWorktreeByBranchName } from "../git/worktree-discovery.js";
|
|
7
|
+
import { planBranchCleanup } from "./plan-branch-cleanup.js";
|
|
8
|
+
function restoreCreatedBranchConfig(branch, logger) {
|
|
4
9
|
try {
|
|
5
|
-
|
|
10
|
+
restoreBranchConfig(branch.name, branch.preexistingConfig);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const preexistingValues = branch.preexistingConfig.size === 0
|
|
14
|
+
? ""
|
|
15
|
+
: ` Its values before this run: ${JSON.stringify(Object.fromEntries(branch.preexistingConfig))}`;
|
|
16
|
+
logger.warn(`Failed to restore the config of branch '${branch.name}': ${extractDiagnosticLine(error)}.${preexistingValues}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function cleanupCreatedBranch(branch, logger) {
|
|
20
|
+
try {
|
|
21
|
+
const plan = planBranchCleanup({
|
|
22
|
+
createdBranch: branch,
|
|
23
|
+
currentCommit: resolveCommit(branch.ref),
|
|
24
|
+
checkedOutAt: findWorktreeByBranchName(branch.name),
|
|
25
|
+
});
|
|
26
|
+
switch (plan.action) {
|
|
27
|
+
case "delete": {
|
|
28
|
+
deleteCreatedBranch(branch);
|
|
29
|
+
logger.warn(`Deleted branch '${branch.name}', which this run created.`);
|
|
30
|
+
restoreCreatedBranchConfig(branch, logger);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case "keep": {
|
|
34
|
+
logger.warn(plan.message);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case "none": {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.warn(`Failed to delete branch '${branch.name}': ${extractDiagnosticLine(error)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function cleanupWorktree(worktree, logger, reason) {
|
|
47
|
+
logger.warn(`Cleaning up worktree at ${JSON.stringify(worktree.directory)} ${reason}.`);
|
|
48
|
+
try {
|
|
49
|
+
removeWorktree(worktree.directory);
|
|
6
50
|
}
|
|
7
51
|
catch (cleanupError) {
|
|
8
52
|
const cleanupMessage = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
9
|
-
logger.warn(`Failed to clean up worktree at ${JSON.stringify(
|
|
53
|
+
logger.warn(`Failed to clean up worktree at ${JSON.stringify(worktree.directory)}: ${cleanupMessage}`);
|
|
54
|
+
}
|
|
55
|
+
if (worktree.createdBranch !== undefined) {
|
|
56
|
+
cleanupCreatedBranch(worktree.createdBranch, logger);
|
|
10
57
|
}
|
|
11
58
|
}
|
|
12
59
|
//# sourceMappingURL=cleanup-worktree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-worktree.js","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cleanup-worktree.js","sourceRoot":"","sources":["../../src/cli/cleanup-worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CreatedBranch } from "../git/create-worktree.js";
|
|
2
|
+
interface PlanBranchCleanupInput {
|
|
3
|
+
readonly createdBranch: CreatedBranch;
|
|
4
|
+
readonly currentCommit: string | undefined;
|
|
5
|
+
readonly checkedOutAt: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
type BranchCleanupPlan = {
|
|
8
|
+
readonly action: "delete";
|
|
9
|
+
} | {
|
|
10
|
+
readonly action: "keep";
|
|
11
|
+
readonly message: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly action: "none";
|
|
14
|
+
};
|
|
15
|
+
export declare function planBranchCleanup({ createdBranch, currentCommit, checkedOutAt, }: PlanBranchCleanupInput): BranchCleanupPlan;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=plan-branch-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-branch-cleanup.d.ts","sourceRoot":"","sources":["../../src/cli/plan-branch-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,KAAK,iBAAiB,GAClB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,wBAAgB,iBAAiB,CAAC,EAChC,aAAa,EACb,aAAa,EACb,YAAY,GACb,EAAE,sBAAsB,GAAG,iBAAiB,CAiB5C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function planBranchCleanup({ createdBranch, currentCommit, checkedOutAt, }) {
|
|
2
|
+
if (currentCommit === undefined) {
|
|
3
|
+
return { action: "none" };
|
|
4
|
+
}
|
|
5
|
+
if (checkedOutAt !== undefined) {
|
|
6
|
+
return {
|
|
7
|
+
action: "keep",
|
|
8
|
+
message: `Keeping branch '${createdBranch.name}' because it is checked out at ${JSON.stringify(checkedOutAt)}.`,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (currentCommit !== createdBranch.commit) {
|
|
12
|
+
return {
|
|
13
|
+
action: "keep",
|
|
14
|
+
message: `Keeping branch '${createdBranch.name}' because it no longer points at the commit this run created it at.`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return { action: "delete" };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=plan-branch-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-branch-cleanup.js","sourceRoot":"","sources":["../../src/cli/plan-branch-cleanup.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,iBAAiB,CAAC,EAChC,aAAa,EACb,aAAa,EACb,YAAY,GACW;IACvB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB,aAAa,CAAC,IAAI,kCAAkC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG;SAChH,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB,aAAa,CAAC,IAAI,qEAAqE;SACpH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-worktree-add.d.ts","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-worktree-add.d.ts","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG1F"}
|
|
@@ -22,12 +22,12 @@ export async function runWorktreeAdd(branchRaw, options) {
|
|
|
22
22
|
const interactive = options.interactive ?? false;
|
|
23
23
|
const assumeYes = options.yes ?? false;
|
|
24
24
|
const context = resolveWorktreeContext(branchRaw);
|
|
25
|
-
let
|
|
25
|
+
let createdWorktree;
|
|
26
26
|
const cleanupIfNeeded = (reason) => {
|
|
27
|
-
if (
|
|
27
|
+
if (createdWorktree === undefined) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
cleanupWorktree(
|
|
30
|
+
cleanupWorktree(createdWorktree, logger, reason);
|
|
31
31
|
};
|
|
32
32
|
const unregisterSigintHandler = registerSigintHandler({
|
|
33
33
|
destinationDirectory: context.destinationDirectory,
|
|
@@ -74,14 +74,11 @@ export async function runWorktreeAdd(branchRaw, options) {
|
|
|
74
74
|
}
|
|
75
75
|
// Only treat origin as existing when confirmed; "unknown" remains false.
|
|
76
76
|
const remoteBranchExists = remoteStatus.status === "exists";
|
|
77
|
-
createWorktree(context.branch, context.destinationDirectory, {
|
|
77
|
+
createdWorktree = createWorktree(context.branch, context.destinationDirectory, {
|
|
78
78
|
remoteBranchExists,
|
|
79
79
|
dryRun,
|
|
80
80
|
logger,
|
|
81
81
|
});
|
|
82
|
-
if (!dryRun) {
|
|
83
|
-
worktreeCreated = true;
|
|
84
|
-
}
|
|
85
82
|
await copyUntrackedFiles(context.repoRoot, context.destinationDirectory, {
|
|
86
83
|
dryRun,
|
|
87
84
|
logger,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-worktree-add.js","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"run-worktree-add.js","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import type { StatusLogger } from "../output/create-status-logger.js";
|
|
2
|
+
import type { BranchConfig } from "./parse-branch-config.js";
|
|
3
|
+
export interface CreatedBranch {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly ref: string;
|
|
6
|
+
readonly commit: string;
|
|
7
|
+
/** `git worktree add -b` keeps `branch.<name>.*` config that predates the branch. */
|
|
8
|
+
readonly preexistingConfig: BranchConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface CreatedWorktree {
|
|
11
|
+
readonly directory: string;
|
|
12
|
+
/** Undefined unless this run created the branch and it still sat at its start point. */
|
|
13
|
+
readonly createdBranch: CreatedBranch | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Returns what was created, or undefined on a dry run. */
|
|
2
16
|
export declare function createWorktree(branch: string, destinationDirectory: string, options?: {
|
|
3
17
|
remoteBranchExists?: boolean;
|
|
4
18
|
dryRun?: boolean;
|
|
5
19
|
logger?: StatusLogger;
|
|
6
|
-
}):
|
|
20
|
+
}): CreatedWorktree | undefined;
|
|
7
21
|
//# sourceMappingURL=create-worktree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-worktree.d.ts","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"create-worktree.d.ts","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAUtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,iBAAiB,EAAE,YAAY,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;CACnD;AAuDD,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GACA,eAAe,GAAG,SAAS,CA+B7B"}
|
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
import { fallbackStatusLogger } from "../output/create-status-logger.js";
|
|
2
|
-
import { git, localBranchExists, normalizeBranchName, remoteBranchExists } from "./git.js";
|
|
2
|
+
import { git, localBranchExists, normalizeBranchName, readBranchConfig, remoteBranchExists, resolveCommit, } from "./git.js";
|
|
3
3
|
import { extractDiagnosticLine } from "./extract-diagnostic-line.js";
|
|
4
|
-
|
|
5
|
-
options.logger.step(`${options.dryRun ? "Would run " : ""}git ${args.join(" ")}`);
|
|
6
|
-
if (options.dryRun) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
git(...args);
|
|
10
|
-
};
|
|
11
|
-
export function createWorktree(branch, destinationDirectory, options) {
|
|
12
|
-
const logger = options?.logger ?? fallbackStatusLogger;
|
|
13
|
-
const dryRun = options?.dryRun ?? false;
|
|
14
|
-
const normalized = normalizeBranchName(branch);
|
|
4
|
+
function selectWorktreeAddCommand(normalized, destinationDirectory, remoteBranchExistsHint) {
|
|
15
5
|
if (localBranchExists(normalized)) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
return;
|
|
6
|
+
return {
|
|
7
|
+
args: ["worktree", "add", "--", destinationDirectory, `refs/heads/${normalized}`],
|
|
8
|
+
newBranchStartPoint: undefined,
|
|
9
|
+
};
|
|
21
10
|
}
|
|
22
|
-
let branchExistsOnOrigin =
|
|
11
|
+
let branchExistsOnOrigin = remoteBranchExistsHint;
|
|
23
12
|
if (branchExistsOnOrigin === undefined) {
|
|
24
13
|
try {
|
|
25
14
|
branchExistsOnOrigin = remoteBranchExists(normalized);
|
|
@@ -30,21 +19,47 @@ export function createWorktree(branch, destinationDirectory, options) {
|
|
|
30
19
|
}
|
|
31
20
|
}
|
|
32
21
|
if (branchExistsOnOrigin) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
22
|
+
return {
|
|
23
|
+
args: [
|
|
24
|
+
"worktree",
|
|
25
|
+
"add",
|
|
26
|
+
"--track",
|
|
27
|
+
"-b",
|
|
28
|
+
normalized,
|
|
29
|
+
"--",
|
|
30
|
+
destinationDirectory,
|
|
31
|
+
`origin/${normalized}`,
|
|
32
|
+
],
|
|
33
|
+
newBranchStartPoint: `refs/remotes/origin/${normalized}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
args: ["worktree", "add", "-b", normalized, "--", destinationDirectory],
|
|
38
|
+
newBranchStartPoint: "HEAD",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Returns what was created, or undefined on a dry run. */
|
|
42
|
+
export function createWorktree(branch, destinationDirectory, options) {
|
|
43
|
+
const logger = options?.logger ?? fallbackStatusLogger;
|
|
44
|
+
const dryRun = options?.dryRun ?? false;
|
|
45
|
+
const normalized = normalizeBranchName(branch);
|
|
46
|
+
const command = selectWorktreeAddCommand(normalized, destinationDirectory, options?.remoteBranchExists);
|
|
47
|
+
logger.step(`${dryRun ? "Would run " : ""}git ${command.args.join(" ")}`);
|
|
48
|
+
if (dryRun) {
|
|
49
|
+
return undefined;
|
|
44
50
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
// Resolved before the add: a post-checkout hook can commit onto the new branch during it.
|
|
52
|
+
const startCommit = command.newBranchStartPoint === undefined
|
|
53
|
+
? undefined
|
|
54
|
+
: resolveCommit(command.newBranchStartPoint);
|
|
55
|
+
const preexistingConfig = startCommit === undefined ? new Map() : readBranchConfig(normalized);
|
|
56
|
+
git(...command.args);
|
|
57
|
+
const ref = `refs/heads/${normalized}`;
|
|
58
|
+
return {
|
|
59
|
+
directory: destinationDirectory,
|
|
60
|
+
createdBranch: startCommit !== undefined && resolveCommit(ref) === startCommit
|
|
61
|
+
? { name: normalized, ref, commit: startCommit, preexistingConfig }
|
|
62
|
+
: undefined,
|
|
63
|
+
};
|
|
49
64
|
}
|
|
50
65
|
//# sourceMappingURL=create-worktree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-worktree.js","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"create-worktree.js","sourceRoot":"","sources":["../../src/git/create-worktree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAsBrE,SAAS,wBAAwB,CAC/B,UAAkB,EAClB,oBAA4B,EAC5B,sBAA2C;IAE3C,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,cAAc,UAAU,EAAE,CAAC;YACjF,mBAAmB,EAAE,SAAS;SAC/B,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,GAAG,sBAAsB,CAAC;IAClD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,oBAAoB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,4CAA4C,UAAU,aAAa,UAAU,EAAE,EAC/E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE;gBACJ,UAAU;gBACV,KAAK;gBACL,SAAS;gBACT,IAAI;gBACJ,UAAU;gBACV,IAAI;gBACJ,oBAAoB;gBACpB,UAAU,UAAU,EAAE;aACvB;YACD,mBAAmB,EAAE,uBAAuB,UAAU,EAAE;SACzD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,oBAAoB,CAAC;QACvE,mBAAmB,EAAE,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,oBAA4B,EAC5B,OAIC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,oBAAoB,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,wBAAwB,CACtC,UAAU,EACV,oBAAoB,EACpB,OAAO,EAAE,kBAAkB,CAC5B,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,0FAA0F;IAC1F,MAAM,WAAW,GACf,OAAO,CAAC,mBAAmB,KAAK,SAAS;QACvC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjD,MAAM,iBAAiB,GACrB,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,EAA6B,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAClG,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErB,MAAM,GAAG,GAAG,cAAc,UAAU,EAAE,CAAC;IACvC,OAAO;QACL,SAAS,EAAE,oBAAoB;QAC/B,aAAa,EACX,WAAW,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,WAAW;YAC7D,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE;YACnE,CAAC,CAAC,SAAS;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-created-branch.d.ts","sourceRoot":"","sources":["../../src/git/delete-created-branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAG/D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { git } from "./git.js";
|
|
2
|
+
export function deleteCreatedBranch(branch) {
|
|
3
|
+
// The expected old value makes the delete fail if the branch moved after it was read.
|
|
4
|
+
git("update-ref", "-d", branch.ref, branch.commit);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=delete-created-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-created-branch.js","sourceRoot":"","sources":["../../src/git/delete-created-branch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,sFAAsF;IACtF,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/git/git.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BranchConfig } from "./parse-branch-config.js";
|
|
1
2
|
export declare function git(...arguments_: [...string[], {
|
|
2
3
|
cwd?: string;
|
|
3
4
|
}] | string[]): string;
|
|
@@ -5,6 +6,8 @@ export declare function normalizeBranchName(name: string): string;
|
|
|
5
6
|
export declare function localBranchExists(branch: string): boolean;
|
|
6
7
|
export declare function remoteBranchExists(branch: string): boolean;
|
|
7
8
|
export declare function fetchOriginBranch(branch: string): void;
|
|
9
|
+
export declare function resolveCommit(revision: string): string | undefined;
|
|
10
|
+
export declare function readBranchConfig(branchName: string): BranchConfig;
|
|
8
11
|
export declare function getLocalBranchHead(branch: string): string | undefined;
|
|
9
12
|
export declare function getRemoteBranchHead(branch: string): string | undefined;
|
|
10
13
|
export declare function getAheadBehindCounts(localHead: string, remoteHead: string): {
|
package/dist/git/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,wBAAgB,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CA0BrF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQzD;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK1D;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASnC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAItD;AAeD,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D"}
|
package/dist/git/git.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import * as fs from "node:fs/promises";
|
|
3
3
|
import * as readline from "node:readline/promises";
|
|
4
|
+
import { parseBranchConfig } from "./parse-branch-config.js";
|
|
4
5
|
export function git(...arguments_) {
|
|
5
6
|
let cwd;
|
|
6
7
|
let gitArguments;
|
|
@@ -58,6 +59,17 @@ export function fetchOriginBranch(branch) {
|
|
|
58
59
|
const refspec = `+refs/heads/${normalized}:refs/remotes/origin/${normalized}`;
|
|
59
60
|
git("fetch", "origin", "--", refspec);
|
|
60
61
|
}
|
|
62
|
+
export function resolveCommit(revision) {
|
|
63
|
+
try {
|
|
64
|
+
return git("rev-parse", "--verify", "--quiet", `${revision}^{commit}`);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function readBranchConfig(branchName) {
|
|
71
|
+
return parseBranchConfig(git("config", "--local", "--null", "--list"), branchName);
|
|
72
|
+
}
|
|
61
73
|
export function getLocalBranchHead(branch) {
|
|
62
74
|
try {
|
|
63
75
|
const normalized = normalizeBranchName(branch);
|
package/dist/git/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,UAAU,GAAG,CAAC,GAAG,UAAsD;IAC3E,IAAI,GAAuB,CAAC;IAC5B,IAAI,YAAsB,CAAC;IAE3B,MAAM,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,KAAK,IAAI,YAAY,EAAE,CAAC;QAC9E,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;QACvB,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAa,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,UAAsB,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE;QAC5C,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,sCAAsC;QACpE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE;QACjD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO;SACX,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;SACxC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,yEAAyE;IACzE,2BAA2B;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,eAAe,UAAU,wBAAwB,UAAU,EAAE,CAAC;IAC9E,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,WAAW,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,WAAW,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,WAAW,EAAE,uBAAuB,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,UAAkB;IAElB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC;IACpD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;QACtC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK;SACT,IAAI,EAAE;SACN,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC;SACjC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;SACxB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,oFAAoF;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,OAAe;IACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Values per `branch.<name>.<variable>` key, in file order. */
|
|
2
|
+
export type BranchConfig = ReadonlyMap<string, readonly string[]>;
|
|
3
|
+
export declare function parseBranchConfig(nullListOutput: string, branchName: string): BranchConfig;
|
|
4
|
+
//# sourceMappingURL=parse-branch-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-branch-config.d.ts","sourceRoot":"","sources":["../../src/git/parse-branch-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAe1F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function parseBranchConfig(nullListOutput, branchName) {
|
|
2
|
+
const prefix = `branch.${branchName}.`;
|
|
3
|
+
const config = new Map();
|
|
4
|
+
for (const entry of nullListOutput.split("\0")) {
|
|
5
|
+
const newline = entry.indexOf("\n");
|
|
6
|
+
const key = newline === -1 ? entry : entry.slice(0, newline);
|
|
7
|
+
// Variable names contain no dot, so a dotted remainder belongs to a longer branch name.
|
|
8
|
+
if (!key.startsWith(prefix) || key.slice(prefix.length).includes(".")) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
// A key written without `=` is an implicit boolean true.
|
|
12
|
+
const value = newline === -1 ? "true" : entry.slice(newline + 1);
|
|
13
|
+
config.set(key, [...(config.get(key) ?? []), value]);
|
|
14
|
+
}
|
|
15
|
+
return config;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=parse-branch-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-branch-config.js","sourceRoot":"","sources":["../../src/git/parse-branch-config.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,cAAsB,EAAE,UAAkB;IAC1E,MAAM,MAAM,GAAG,UAAU,UAAU,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,wFAAwF;QACxF,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtE,SAAS;QACX,CAAC;QACD,yDAAyD;QACzD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-branch-config.d.ts","sourceRoot":"","sources":["../../src/git/restore-branch-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAG,IAAI,CA0B7F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
import { git, readBranchConfig } from "./git.js";
|
|
3
|
+
export function restoreBranchConfig(branchName, preexistingConfig) {
|
|
4
|
+
const currentConfig = readBranchConfig(branchName);
|
|
5
|
+
if (preexistingConfig.size === 0) {
|
|
6
|
+
if (currentConfig.size > 0) {
|
|
7
|
+
// The same removal `git branch -D` performs.
|
|
8
|
+
git("config", "--local", "--remove-section", `branch.${branchName}`);
|
|
9
|
+
}
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
// `--track` replaces or appends to tracking keys that predate the branch.
|
|
13
|
+
for (const key of new Set([...currentConfig.keys(), ...preexistingConfig.keys()])) {
|
|
14
|
+
const preexistingValues = preexistingConfig.get(key) ?? [];
|
|
15
|
+
if (isDeepStrictEqual(currentConfig.get(key) ?? [], preexistingValues)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const [firstValue, ...otherValues] = preexistingValues;
|
|
19
|
+
if (firstValue === undefined) {
|
|
20
|
+
git("config", "--local", "--unset-all", key);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
// `--replace-all` swaps the values in one write, so a failure never leaves the key unset.
|
|
24
|
+
git("config", "--local", "--replace-all", key, firstValue);
|
|
25
|
+
for (const value of otherValues) {
|
|
26
|
+
git("config", "--local", "--add", key, value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=restore-branch-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-branch-config.js","sourceRoot":"","sources":["../../src/git/restore-branch-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,iBAA+B;IACrF,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3B,6CAA6C;YAC7C,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,UAAU,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACvE,SAAS;QACX,CAAC;QACD,MAAM,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,GAAG,iBAAiB,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,0FAA0F;QAC1F,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "worktree-add",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Create a Git worktree next to your current repo for a branch, copy useful local files, install deps, and open it in your apps.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@j4k/oxlint-config": "^2.11.0",
|
|
62
62
|
"@total-typescript/ts-reset": "^0.6.1",
|
|
63
|
-
"@types/node": "^
|
|
63
|
+
"@types/node": "^24.0.0",
|
|
64
64
|
"@vitest/coverage-v8": "^4.1.8",
|
|
65
65
|
"conventional-changelog-conventionalcommits": "^9.3.1",
|
|
66
66
|
"fta-check": "^1.5.4",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"vitest": "^4.1.8"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|
|
77
|
-
"node": ">=24.
|
|
77
|
+
"node": ">=24.15.0"
|
|
78
78
|
},
|
|
79
79
|
"packageManager": "pnpm@11.22.0"
|
|
80
80
|
}
|