feat: initial commit for git-worktree plugin
This commit is contained in:
commit
129d0594fc
5 files changed
+434
No files matched your search
@@ -0,0 +1,63 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import os from 'node:os'
|
||||
import {
|
||||
parseWorktreePorcelain,
|
||||
gitExec,
|
||||
getGitRoot,
|
||||
} from '../index.js'
|
||||
|
||||
test('parseWorktreePorcelain parses git porcelain worktree format', () => {
|
||||
const sample = `worktree /home/user/project
|
||||
HEAD 1234567890abcdef
|
||||
branch refs/heads/main
|
||||
|
||||
worktree /home/user/project/.worktrees/feature-a
|
||||
HEAD fedcba0987654321
|
||||
branch refs/heads/feature-a
|
||||
|
||||
worktree /home/user/project/.worktrees/detached-run
|
||||
HEAD aaaaaaa000000000
|
||||
detached
|
||||
`
|
||||
const res = parseWorktreePorcelain(sample)
|
||||
assert.equal(res.length, 3)
|
||||
assert.equal(res[0].path, '/home/user/project')
|
||||
assert.equal(res[0].branch, 'main')
|
||||
assert.equal(res[0].commit, '1234567890abcdef')
|
||||
assert.equal(res[1].branch, 'feature-a')
|
||||
assert.equal(res[2].detached, true)
|
||||
})
|
||||
|
||||
test('gitExec and getGitRoot inside real git repo', async () => {
|
||||
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'git-wt-test-'))
|
||||
await gitExec(tmp, ['init', '-b', 'main'])
|
||||
await gitExec(tmp, ['config', 'user.name', 'Test Agent'])
|
||||
await gitExec(tmp, ['config', 'user.email', 'test@example.com'])
|
||||
fs.writeFileSync(path.join(tmp, 'hello.txt'), 'hello world')
|
||||
await gitExec(tmp, ['add', 'hello.txt'])
|
||||
await gitExec(tmp, ['commit', '-m', 'initial commit'])
|
||||
|
||||
const root = await getGitRoot(tmp)
|
||||
// Resolve symlinks if any on temporary dirs
|
||||
assert.equal(fs.realpathSync(root), fs.realpathSync(tmp))
|
||||
|
||||
// Create worktree
|
||||
const wtDir = path.join(tmp, '.worktrees', 'test-wt')
|
||||
const addRes = await gitExec(tmp, ['worktree', 'add', '-b', 'feature-test', wtDir])
|
||||
assert.equal(addRes.code, 0)
|
||||
|
||||
// Verify list
|
||||
const listRes = await gitExec(tmp, ['worktree', 'list', '--porcelain'])
|
||||
const parsed = parseWorktreePorcelain(listRes.stdout)
|
||||
assert.equal(parsed.length, 2)
|
||||
assert.ok(parsed.some((w) => w.branch === 'feature-test'))
|
||||
|
||||
// Remove worktree
|
||||
const rmRes = await gitExec(tmp, ['worktree', 'remove', wtDir])
|
||||
assert.equal(rmRes.code, 0)
|
||||
|
||||
fs.rmSync(tmp, { recursive: true, force: true })
|
||||
})
|
||||
Reference in new issue
Block a user