worktree-add 1.3.12 → 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 +14 -6
- package/dist/app/resolve-open-target.d.ts +16 -0
- package/dist/app/resolve-open-target.d.ts.map +1 -0
- package/dist/app/{resolve-apps.js → resolve-open-target.js} +18 -9
- package/dist/app/resolve-open-target.js.map +1 -0
- 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/open-worktree-apps.d.ts +2 -1
- package/dist/cli/open-worktree-apps.d.ts.map +1 -1
- package/dist/cli/open-worktree-apps.js +20 -2
- package/dist/cli/open-worktree-apps.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 +1 -0
- package/dist/cli/run-worktree-add.d.ts.map +1 -1
- package/dist/cli/run-worktree-add.js +8 -10
- package/dist/cli/run-worktree-add.js.map +1 -1
- package/dist/cli.js +5 -3
- package/dist/cli.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 +5 -4
- package/dist/app/resolve-apps.d.ts +0 -7
- package/dist/app/resolve-apps.d.ts.map +0 -1
- package/dist/app/resolve-apps.js.map +0 -1
package/README.md
CHANGED
|
@@ -24,13 +24,15 @@ Running `worktree-add <branch>` from inside a repo:
|
|
|
24
24
|
8. Detects your package manager and installs dependencies with lockfile‑safe flags
|
|
25
25
|
(`npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, etc.).
|
|
26
26
|
9. If the project uses Next.js and supports it, runs `next typegen`.
|
|
27
|
-
10. Opens the new worktree
|
|
27
|
+
10. Opens the new worktree if you passed `--app` or `--open`.
|
|
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
|
|
|
@@ -72,6 +74,7 @@ Common options:
|
|
|
72
74
|
|
|
73
75
|
```text
|
|
74
76
|
-a, --app <name> Open the worktree in an app (repeatable)
|
|
77
|
+
-o, --open Open the worktree after creating it
|
|
75
78
|
--offline Create from HEAD when origin can't be reached
|
|
76
79
|
-y, --yes Skip confirmation and replace existing destination
|
|
77
80
|
--interactive Allow confirmation prompts (requires a TTY)
|
|
@@ -111,10 +114,13 @@ App names are executed on your machine, so only use values you trust. Validation
|
|
|
111
114
|
Arguments are not parsed: values like `code -w` are treated as part of the app name and will likely fail.
|
|
112
115
|
|
|
113
116
|
1. `--app <name>` flag (repeatable): `worktree-add feature/foo --app ghostty --app code`
|
|
114
|
-
2.
|
|
117
|
+
2. `-o, --open`: `worktree-add feature/foo --open`
|
|
118
|
+
3. `WORKTREE_ADD_APP` env var (comma-separated): the app list used by `--open`
|
|
115
119
|
|
|
116
|
-
|
|
117
|
-
|
|
120
|
+
`--app` takes priority over `--open` / `WORKTREE_ADD_APP`.
|
|
121
|
+
`WORKTREE_ADD_APP` does not open anything on its own; pass `--open` to use it.
|
|
122
|
+
If `--open` is set and no apps are configured, the destination is opened with the OS default handler.
|
|
123
|
+
To explicitly open nothing even when `--open` is set, pass `--app ""`.
|
|
118
124
|
Whitespace-only values like `--app " "` are treated as absent and do not override `WORKTREE_ADD_APP`.
|
|
119
125
|
|
|
120
126
|
If launching an app fails to start, the worktree still stays created and ready.
|
|
@@ -123,10 +129,12 @@ Platform note: on macOS the app value is passed to `open -a`, so use an applicat
|
|
|
123
129
|
|
|
124
130
|
Terminal-based editors (vim/nvim/nano) are not supported via `--app` — apps are launched detached from the current terminal.
|
|
125
131
|
|
|
126
|
-
Tip:
|
|
132
|
+
Tip: set default apps for `--open` in your shell profile, then pass `-o` when you want them:
|
|
127
133
|
|
|
128
134
|
```bash
|
|
129
135
|
worktree-add() { WORKTREE_ADD_APP=ghostty,code command worktree-add "$@" }
|
|
136
|
+
# worktree-add feature/foo # create only
|
|
137
|
+
# worktree-add feature/foo -o # create and open in Ghostty + VS Code
|
|
130
138
|
```
|
|
131
139
|
|
|
132
140
|
Add it to your shell profile:
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface ResolveOpenTargetInput {
|
|
2
|
+
optionApps: string[] | undefined;
|
|
3
|
+
environmentApps: string | undefined;
|
|
4
|
+
open: boolean;
|
|
5
|
+
}
|
|
6
|
+
export type OpenTarget = {
|
|
7
|
+
type: "none";
|
|
8
|
+
} | {
|
|
9
|
+
type: "default";
|
|
10
|
+
} | {
|
|
11
|
+
type: "apps";
|
|
12
|
+
apps: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveOpenTarget({ optionApps, environmentApps, open, }: ResolveOpenTargetInput): OpenTarget;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=resolve-open-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-open-target.d.ts","sourceRoot":"","sources":["../../src/app/resolve-open-target.ts"],"names":[],"mappings":"AAAA,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwBnG,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,IAAI,GACL,EAAE,sBAAsB,GAAG,UAAU,CA2BrC"}
|
|
@@ -10,24 +10,33 @@ function dedupePreserveOrder(apps) {
|
|
|
10
10
|
}
|
|
11
11
|
return deduped;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
function parseAppList(value) {
|
|
14
|
+
return dedupePreserveOrder(value
|
|
15
|
+
.split(",")
|
|
16
|
+
.map((app) => app.trim())
|
|
17
|
+
.filter(Boolean));
|
|
18
|
+
}
|
|
19
|
+
export function resolveOpenTarget({ optionApps, environmentApps, open, }) {
|
|
14
20
|
const hasExplicitEmptyOption = optionApps?.includes("") ?? false;
|
|
15
21
|
const normalizedOptionApps = optionApps?.map((app) => app.trim()).filter(Boolean) ?? [];
|
|
16
22
|
if (optionApps !== undefined) {
|
|
17
23
|
if (normalizedOptionApps.length > 0) {
|
|
18
|
-
return dedupePreserveOrder(normalizedOptionApps);
|
|
24
|
+
return { type: "apps", apps: dedupePreserveOrder(normalizedOptionApps) };
|
|
19
25
|
}
|
|
20
26
|
if (hasExplicitEmptyOption) {
|
|
21
|
-
return
|
|
27
|
+
return { type: "none" };
|
|
22
28
|
}
|
|
23
29
|
}
|
|
30
|
+
if (!open) {
|
|
31
|
+
return { type: "none" };
|
|
32
|
+
}
|
|
24
33
|
const normalized = environmentApps?.trim();
|
|
25
34
|
if (normalized) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
const apps = parseAppList(normalized);
|
|
36
|
+
if (apps.length > 0) {
|
|
37
|
+
return { type: "apps", apps };
|
|
38
|
+
}
|
|
30
39
|
}
|
|
31
|
-
return
|
|
40
|
+
return { type: "default" };
|
|
32
41
|
}
|
|
33
|
-
//# sourceMappingURL=resolve-
|
|
42
|
+
//# sourceMappingURL=resolve-open-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-open-target.js","sourceRoot":"","sources":["../../src/app/resolve-open-target.ts"],"names":[],"mappings":"AAQA,SAAS,mBAAmB,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,mBAAmB,CACxB,KAAK;SACF,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,IAAI,GACmB;IACvB,MAAM,sBAAsB,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACjE,MAAM,oBAAoB,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAExF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -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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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { StatusLogger } from "../output/create-status-logger.js";
|
|
2
|
-
|
|
2
|
+
import type { OpenTarget } from "../app/resolve-open-target.js";
|
|
3
|
+
export declare function openWorktreeApps(destinationDirectory: string, target: OpenTarget, options?: {
|
|
3
4
|
dryRun?: boolean;
|
|
4
5
|
logger?: StatusLogger;
|
|
5
6
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-worktree-apps.d.ts","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"open-worktree-apps.d.ts","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,oBAAoB,EAAE,MAAM,EAC5B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAqDf"}
|
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
import open from "open";
|
|
2
2
|
import { fallbackStatusLogger } from "../output/create-status-logger.js";
|
|
3
3
|
import { getUnsafeAppNameReason } from "../app/get-unsafe-app-name-reason.js";
|
|
4
|
-
export async function openWorktreeApps(destinationDirectory,
|
|
4
|
+
export async function openWorktreeApps(destinationDirectory, target, options = {}) {
|
|
5
5
|
const logger = options.logger ?? fallbackStatusLogger;
|
|
6
6
|
const dryRun = options.dryRun ?? false;
|
|
7
|
-
|
|
7
|
+
if (target.type === "none") {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (target.type === "default") {
|
|
11
|
+
if (dryRun) {
|
|
12
|
+
logger.step(`Would open ${JSON.stringify(destinationDirectory)}`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
logger.step(`Opening ${JSON.stringify(destinationDirectory)} …`);
|
|
16
|
+
try {
|
|
17
|
+
await open(destinationDirectory, { wait: false });
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
logger.warn(`Failed to open ${JSON.stringify(destinationDirectory)}: ${message}.`);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
await Promise.all(target.apps.map(async (app) => {
|
|
8
26
|
const unsafeReason = getUnsafeAppNameReason(app);
|
|
9
27
|
if (unsafeReason) {
|
|
10
28
|
logger.warn(`Skipping app ${JSON.stringify(app)}: ${unsafeReason}.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-worktree-apps.js","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"open-worktree-apps.js","sourceRoot":"","sources":["../../src/cli/open-worktree-apps.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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createStatusLogger } from "../output/create-status-logger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveOpenTarget } from "../app/resolve-open-target.js";
|
|
3
3
|
import { handleExistingDirectory } from "../worktree/destination-directory.js";
|
|
4
4
|
import { copyUntrackedFiles } from "../worktree/untracked-file-copy.js";
|
|
5
5
|
import { setupProject } from "../project/setup.js";
|
|
@@ -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,24 +74,22 @@ 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,
|
|
88
85
|
});
|
|
89
86
|
await setupProject(context.destinationDirectory, { dryRun, logger });
|
|
90
|
-
const
|
|
87
|
+
const target = resolveOpenTarget({
|
|
91
88
|
optionApps: options.app,
|
|
92
89
|
environmentApps: process.env.WORKTREE_ADD_APP,
|
|
90
|
+
open: options.open ?? false,
|
|
93
91
|
});
|
|
94
|
-
await openWorktreeApps(context.destinationDirectory,
|
|
92
|
+
await openWorktreeApps(context.destinationDirectory, target, {
|
|
95
93
|
dryRun,
|
|
96
94
|
logger,
|
|
97
95
|
});
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"run-worktree-add.js","sourceRoot":"","sources":["../../src/cli/run-worktree-add.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ const program = new Command()
|
|
|
11
11
|
.version(packageJson.version)
|
|
12
12
|
.argument("<branch>", "branch name for the worktree")
|
|
13
13
|
.option("-a, --app <name>", "Open the worktree in an app (repeatable)", collectApp)
|
|
14
|
+
.option("-o, --open", "Open the worktree after creating it (uses WORKTREE_ADD_APP, or the OS default handler)")
|
|
14
15
|
.option("--offline", "Allow creating a new local branch from HEAD when origin cannot be reached and the branch does not exist locally")
|
|
15
16
|
.option("-y, --yes", "Skip confirmation and replace existing destination")
|
|
16
17
|
.option("--dry-run", "Show what would happen without making changes")
|
|
@@ -22,14 +23,15 @@ const program = new Command()
|
|
|
22
23
|
Examples:
|
|
23
24
|
$ worktree-add feature/login-form
|
|
24
25
|
$ worktree-add feature/api --app code
|
|
25
|
-
$
|
|
26
|
+
$ worktree-add feature/new-branch --open
|
|
27
|
+
$ WORKTREE_ADD_APP=ghostty,code worktree-add feature/new-branch --open
|
|
26
28
|
$ git branch --format="%(refname:short)" | head -n1 | xargs worktree-add
|
|
27
29
|
|
|
28
30
|
App notes:
|
|
29
31
|
- App names are executed on your machine; only use values you trust.
|
|
30
32
|
- Arguments are not parsed; pass only the app name (e.g., "code", not "code --wait").
|
|
31
|
-
- WORKTREE_ADD_APP is a comma-separated list of apps (
|
|
32
|
-
- To explicitly open nothing when
|
|
33
|
+
- WORKTREE_ADD_APP is a comma-separated list of apps used by --open (it does not open on its own).
|
|
34
|
+
- To explicitly open nothing when --open is set, pass --app "".
|
|
33
35
|
|
|
34
36
|
Dependencies:
|
|
35
37
|
- git (with worktree support)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,SAAS,UAAU,CAAC,GAAW,EAAE,QAA8B;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;KACtB,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;KACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,UAAU,CAAC;KAClF,MAAM,CACL,WAAW,EACX,iHAAiH,CAClH;KACA,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,kBAAkB,CAAC,yCAAyC,CAAC;KAC7D,wBAAwB,EAAE;KAC1B,WAAW,CACV,OAAO,EACP
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,SAAS,UAAU,CAAC,GAAW,EAAE,QAA8B;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;KACtB,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;KACpC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,UAAU,CAAC;KAClF,MAAM,CACL,YAAY,EACZ,wFAAwF,CACzF;KACA,MAAM,CACL,WAAW,EACX,iHAAiH,CAClH;KACA,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,kBAAkB,CAAC,yCAAyC,CAAC;KAC7D,wBAAwB,EAAE;KAC1B,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;CAiBH,CACE;KACA,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAmB,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAEnD,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,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"}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -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": "
|
|
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,8 +60,9 @@
|
|
|
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
|
+
"conventional-changelog-conventionalcommits": "^9.3.1",
|
|
65
66
|
"fta-check": "^1.5.4",
|
|
66
67
|
"fta-cli": "^3.0.0",
|
|
67
68
|
"knip": "^6.16.1",
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
"vitest": "^4.1.8"
|
|
74
75
|
},
|
|
75
76
|
"engines": {
|
|
76
|
-
"node": ">=24.
|
|
77
|
+
"node": ">=24.15.0"
|
|
77
78
|
},
|
|
78
|
-
"packageManager": "pnpm@11.
|
|
79
|
+
"packageManager": "pnpm@11.22.0"
|
|
79
80
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-apps.d.ts","sourceRoot":"","sources":["../../src/app/resolve-apps.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAyBvF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-apps.js","sourceRoot":"","sources":["../../src/app/resolve-apps.ts"],"names":[],"mappings":"AAKA,SAAS,mBAAmB,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,UAAU,EAAE,eAAe,EAAoB;IAC3E,MAAM,sBAAsB,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACjE,MAAM,oBAAoB,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAExF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,mBAAmB,CACxB,UAAU;aACP,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|