Add checkout command with co alias
This commit is contained in:
parent
9b5b0bc1b6
commit
156e4d9590
14
src/cli.ts
14
src/cli.ts
|
|
@ -10,6 +10,7 @@ import { action as openAction } from "./commands/open.ts"
|
||||||
import { action as reviewAction } from "./commands/review.ts"
|
import { action as reviewAction } from "./commands/review.ts"
|
||||||
import { action as shellAction } from "./commands/shell.ts"
|
import { action as shellAction } from "./commands/shell.ts"
|
||||||
import { action as closeAction } from "./commands/close.ts"
|
import { action as closeAction } from "./commands/close.ts"
|
||||||
|
import { action as checkoutAction } from "./commands/checkout.ts"
|
||||||
import { action as mergeAction } from "./commands/merge.ts"
|
import { action as mergeAction } from "./commands/merge.ts"
|
||||||
import { action as squashAction } from "./commands/squash.ts"
|
import { action as squashAction } from "./commands/squash.ts"
|
||||||
import { action as rebaseAction } from "./commands/rebase.ts"
|
import { action as rebaseAction } from "./commands/rebase.ts"
|
||||||
|
|
@ -81,6 +82,19 @@ program
|
||||||
.description("Remove a session (alias for close)")
|
.description("Remove a session (alias for close)")
|
||||||
.action((branch: string, opts: { force?: boolean }) => closeAction(branch, opts))
|
.action((branch: string, opts: { force?: boolean }) => closeAction(branch, opts))
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("checkout")
|
||||||
|
.argument("<branch>", "branch name")
|
||||||
|
.option("-f, --force", "checkout even if there are unsaved changes")
|
||||||
|
.description("Close the session and check out the branch locally")
|
||||||
|
.action((branch: string, opts: { force?: boolean }) => checkoutAction(branch, opts))
|
||||||
|
|
||||||
|
program
|
||||||
|
.command("co", { hidden: true })
|
||||||
|
.argument("<branch>", "branch name")
|
||||||
|
.option("-f, --force", "checkout even if there are unsaved changes")
|
||||||
|
.action((branch: string, opts: { force?: boolean }) => checkoutAction(branch, opts))
|
||||||
|
|
||||||
// ── Branch ──────────────────────────────────────────────────────────
|
// ── Branch ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
program.commandsGroup("Branch Commands:")
|
program.commandsGroup("Branch Commands:")
|
||||||
|
|
|
||||||
35
src/commands/checkout.ts
Normal file
35
src/commands/checkout.ts
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
import { join } from "path"
|
||||||
|
import { unlink } from "fs/promises"
|
||||||
|
import * as git from "../git.ts"
|
||||||
|
import * as vm from "../vm.ts"
|
||||||
|
import * as state from "../state.ts"
|
||||||
|
import { die } from "../fmt.ts"
|
||||||
|
|
||||||
|
export async function action(branch: string, opts: { force?: boolean } = {}) {
|
||||||
|
const root = await git.repoRoot()
|
||||||
|
const session = await state.getSession(root, branch)
|
||||||
|
|
||||||
|
if (!session) {
|
||||||
|
die(`No session found for branch "${branch}"`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const worktreeAbs = session.worktree
|
||||||
|
|
||||||
|
if (!opts.force && await git.isDirty(worktreeAbs)) {
|
||||||
|
die(`Branch "${branch}" has unsaved changes. Run "sandlot save ${branch}" first, or use -f to force.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
await vm.clearActivity(worktreeAbs, branch)
|
||||||
|
|
||||||
|
await git.removeWorktree(worktreeAbs, root)
|
||||||
|
.catch((e) => console.warn(`⚠ Failed to remove worktree: ${e.message}`))
|
||||||
|
|
||||||
|
await unlink(join(root, '.sandlot', branch))
|
||||||
|
.catch(() => {}) // symlink may not exist
|
||||||
|
|
||||||
|
await state.removeSession(root, branch)
|
||||||
|
|
||||||
|
await git.checkout(branch, root)
|
||||||
|
|
||||||
|
console.log(`✔ Checked out ${branch}`)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user