This commit is contained in:
2026-06-16 06:18:42 +02:00
parent 3f5078841d
commit 66248c4736
39 changed files with 6699 additions and 94 deletions

View File

@@ -1,4 +1,4 @@
import { readFile } from 'node:fs/promises'
import { readFile, rm } from 'node:fs/promises'
import { join } from 'node:path'
import { simpleGit, type SimpleGit } from 'simple-git'
@@ -22,7 +22,7 @@ function git(root: string): SimpleGit {
}
/** Map a porcelain code pair to our display letter + staged flag. */
function classify(index: string, working: string): { letter: GitStatusLetter; staged: boolean } {
export function classify(index: string, working: string): { letter: GitStatusLetter; staged: boolean } {
const staged = index !== ' ' && index !== '?'
const code = staged ? index : working
let letter: GitStatusLetter
@@ -103,6 +103,20 @@ export async function commit(root: string, message: string): Promise<void> {
await git(root).commit(message)
}
/**
* Discard working-tree changes for each path:
* - exists in HEAD → restore index + worktree to the last commit
* - not in HEAD → a new file (staged or untracked): unstage + delete from disk
*/
export async function discard(root: string, paths: string[]): Promise<void> {
await git(root).checkout(['--', ...paths])
const g = git(root)
for (const p of paths) {
const inHead = await g.raw(['cat-file', '-e', `HEAD:${p}`]).then(() => true).catch(() => false)
if (inHead) {
await g.checkout(['HEAD', '--', p])
} else {
try { await g.raw(['reset', '-q', 'HEAD', '--', p]) } catch { /* no HEAD / not staged */ }
await rm(join(root, p), { force: true })
}
}
}