@spences10/pi-git-ui 0.0.1 → 0.0.3
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 +15 -1
- package/dist/commit-composer.d.ts +2 -1
- package/dist/commit-composer.js +8 -4
- package/dist/commit-composer.js.map +1 -1
- package/dist/git/client.d.ts +2 -0
- package/dist/git/client.js +35 -0
- package/dist/git/client.js.map +1 -0
- package/dist/git/diff.d.ts +9 -0
- package/dist/git/diff.js +152 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/errors.d.ts +1 -0
- package/dist/git/errors.js +17 -0
- package/dist/git/errors.js.map +1 -0
- package/dist/git/operations.d.ts +11 -0
- package/dist/git/operations.js +46 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/git/overview.d.ts +2 -0
- package/dist/git/overview.js +23 -0
- package/dist/git/overview.js.map +1 -0
- package/dist/git/status.d.ts +5 -0
- package/dist/git/status.js +85 -0
- package/dist/git/status.js.map +1 -0
- package/dist/git/types.d.ts +33 -0
- package/dist/git/types.js +7 -0
- package/dist/git/types.js.map +1 -0
- package/dist/git.d.ts +7 -31
- package/dist/git.js +6 -162
- package/dist/git.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stage-body.d.ts +30 -9
- package/dist/stage-body.js +357 -116
- package/dist/stage-body.js.map +1 -1
- package/dist/stage-render.d.ts +2 -0
- package/dist/stage-render.js +210 -0
- package/dist/stage-render.js.map +1 -0
- package/dist/stage-types.d.ts +24 -0
- package/dist/stage-types.js +2 -0
- package/dist/stage-types.js.map +1 -0
- package/package.json +8 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @spences10/pi-git-ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Focused Git staging, diff review, and commit modal for Pi.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
@@ -17,15 +17,29 @@ Then run:
|
|
|
17
17
|
Controls:
|
|
18
18
|
|
|
19
19
|
- `↑`/`↓` or `j`/`k` — move file selection
|
|
20
|
+
- `/` — filter files by path, state, or status code
|
|
21
|
+
- `enter` — open contextual actions for the selected file
|
|
22
|
+
- `?` — show grouped keyboard help
|
|
20
23
|
- `←`/`→` or `h`/`l` — scroll the diff preview
|
|
24
|
+
- `n`/`p` — move between diff hunks
|
|
25
|
+
- `[`/`]` — move between changed lines
|
|
21
26
|
- `space` — safely stage/unstage selected file; disabled for
|
|
22
27
|
partial/conflicted files
|
|
23
28
|
- `s` — stage selected file explicitly
|
|
24
29
|
- `x` — unstage selected file explicitly
|
|
30
|
+
- `S` — stage selected hunk
|
|
31
|
+
- `X` — unstage selected hunk
|
|
32
|
+
- `+` — stage selected changed line
|
|
33
|
+
- `-` — unstage selected changed line
|
|
25
34
|
- `c` — commit staged changes with a Conventional Commit helper or raw
|
|
26
35
|
message
|
|
36
|
+
- `m` — amend the last commit with staged changes
|
|
37
|
+
- `g` — show repository overview with branches, recent commits,
|
|
38
|
+
stashes, and remotes
|
|
27
39
|
- `a` — safely stage all; blocked if partial/conflicted files exist
|
|
28
40
|
- `A` — force stage all
|
|
29
41
|
- `u` — unstage all
|
|
42
|
+
- actions menu → `discard file` — confirm and discard unstaged file
|
|
43
|
+
changes
|
|
30
44
|
- `r` — refresh
|
|
31
45
|
- `esc`/`q` — close
|
|
@@ -5,11 +5,12 @@ export declare class CommitComposer implements Focusable {
|
|
|
5
5
|
private readonly staged_count;
|
|
6
6
|
private readonly on_commit;
|
|
7
7
|
private readonly on_cancel;
|
|
8
|
+
private readonly amend;
|
|
8
9
|
private step;
|
|
9
10
|
private selected_type;
|
|
10
11
|
private conventional;
|
|
11
12
|
private readonly input;
|
|
12
|
-
constructor(theme: ModalTheme, staged_count: number, on_commit: (message: string) => void, on_cancel: () => void);
|
|
13
|
+
constructor(theme: ModalTheme, staged_count: number, on_commit: (message: string) => void, on_cancel: () => void, amend?: boolean);
|
|
13
14
|
get focused(): boolean;
|
|
14
15
|
set focused(value: boolean);
|
|
15
16
|
render(width: number): string[];
|
package/dist/commit-composer.js
CHANGED
|
@@ -13,15 +13,17 @@ export class CommitComposer {
|
|
|
13
13
|
staged_count;
|
|
14
14
|
on_commit;
|
|
15
15
|
on_cancel;
|
|
16
|
+
amend;
|
|
16
17
|
step = 'type';
|
|
17
18
|
selected_type = 'feat';
|
|
18
19
|
conventional = true;
|
|
19
20
|
input = new Input();
|
|
20
|
-
constructor(theme, staged_count, on_commit, on_cancel) {
|
|
21
|
+
constructor(theme, staged_count, on_commit, on_cancel, amend = false) {
|
|
21
22
|
this.theme = theme;
|
|
22
23
|
this.staged_count = staged_count;
|
|
23
24
|
this.on_commit = on_commit;
|
|
24
25
|
this.on_cancel = on_cancel;
|
|
26
|
+
this.amend = amend;
|
|
25
27
|
this.input.onSubmit = (summary) => this.submit(summary);
|
|
26
28
|
this.input.onEscape = () => this.on_cancel();
|
|
27
29
|
}
|
|
@@ -62,7 +64,7 @@ export class CommitComposer {
|
|
|
62
64
|
}
|
|
63
65
|
render_type_picker(width) {
|
|
64
66
|
const lines = [
|
|
65
|
-
this.theme.bold('Commit staged changes'),
|
|
67
|
+
this.theme.bold(this.amend ? 'Amend last commit' : 'Commit staged changes'),
|
|
66
68
|
this.theme.fg('muted', `${this.staged_count} staged file${this.staged_count === 1 ? '' : 's'}`),
|
|
67
69
|
'',
|
|
68
70
|
'Choose commit format:',
|
|
@@ -76,7 +78,7 @@ export class CommitComposer {
|
|
|
76
78
|
render_summary(width) {
|
|
77
79
|
const preview = this.build_message(this.input.getValue().trim());
|
|
78
80
|
const lines = [
|
|
79
|
-
this.theme.bold('Commit message'),
|
|
81
|
+
this.theme.bold(this.amend ? 'Amend message' : 'Commit message'),
|
|
80
82
|
this.theme.fg('muted', `${this.staged_count} staged file${this.staged_count === 1 ? '' : 's'}`),
|
|
81
83
|
'',
|
|
82
84
|
this.conventional
|
|
@@ -87,7 +89,9 @@ export class CommitComposer {
|
|
|
87
89
|
'Summary:',
|
|
88
90
|
...this.input.render(width),
|
|
89
91
|
'',
|
|
90
|
-
this.theme.fg('dim',
|
|
92
|
+
this.theme.fg('dim', this.amend
|
|
93
|
+
? 'enter amend • esc cancel'
|
|
94
|
+
: 'enter commit • esc cancel'),
|
|
91
95
|
];
|
|
92
96
|
return lines;
|
|
93
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit-composer.js","sourceRoot":"","sources":["../src/commit-composer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAkB,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,KAAK,GAAG;IACb,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3C,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACjD,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1C,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;CAClC,CAAC;AAIX,MAAM,OAAO,cAAc;IAOR;IACA;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"commit-composer.js","sourceRoot":"","sources":["../src/commit-composer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const exec_file = promisify(execFile);
|
|
4
|
+
export async function git(args, cwd) {
|
|
5
|
+
const { stdout } = await exec_file('git', args, {
|
|
6
|
+
cwd,
|
|
7
|
+
encoding: 'utf8',
|
|
8
|
+
maxBuffer: 1024 * 1024 * 8,
|
|
9
|
+
});
|
|
10
|
+
return stdout;
|
|
11
|
+
}
|
|
12
|
+
export async function git_with_input(args, cwd, input) {
|
|
13
|
+
return await new Promise((resolve, reject) => {
|
|
14
|
+
const child = spawn('git', args, { cwd, stdio: 'pipe' });
|
|
15
|
+
let stdout = '';
|
|
16
|
+
let stderr = '';
|
|
17
|
+
child.stdout.setEncoding('utf8');
|
|
18
|
+
child.stderr.setEncoding('utf8');
|
|
19
|
+
child.stdout.on('data', (chunk) => {
|
|
20
|
+
stdout += chunk;
|
|
21
|
+
});
|
|
22
|
+
child.stderr.on('data', (chunk) => {
|
|
23
|
+
stderr += chunk;
|
|
24
|
+
});
|
|
25
|
+
child.on('error', reject);
|
|
26
|
+
child.on('close', (code) => {
|
|
27
|
+
if (code === 0)
|
|
28
|
+
resolve(stdout);
|
|
29
|
+
else
|
|
30
|
+
reject(new Error(stderr || `git exited with status ${code}`));
|
|
31
|
+
});
|
|
32
|
+
child.stdin.end(input);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/git/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,GAAG,CACxB,IAAc,EACd,GAAW;IAEX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/C,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC;KAC1B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,IAAc,EACd,GAAW,EACX,KAAa;IAEb,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;gBAE/B,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DiffHunk, DiffSection, DiffView, GitFile } from './types.js';
|
|
2
|
+
export declare function read_diff(cwd: string, file: GitFile): Promise<DiffView>;
|
|
3
|
+
export declare function parse_diff_hunks(raw: string, section: DiffSection): DiffHunk[];
|
|
4
|
+
export declare function changed_line_indexes(hunk: DiffHunk): number[];
|
|
5
|
+
export declare function stage_hunk(cwd: string, hunk: DiffHunk): Promise<void>;
|
|
6
|
+
export declare function unstage_hunk(cwd: string, hunk: DiffHunk): Promise<void>;
|
|
7
|
+
export declare function stage_line(cwd: string, hunk: DiffHunk, line_index: number): Promise<void>;
|
|
8
|
+
export declare function unstage_line(cwd: string, hunk: DiffHunk, line_index: number): Promise<void>;
|
|
9
|
+
export declare function build_line_patch(hunk: DiffHunk, line_index: number): string;
|
package/dist/git/diff.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { git, git_with_input } from './client.js';
|
|
2
|
+
import { format_git_error } from './errors.js';
|
|
3
|
+
import { git_path } from './operations.js';
|
|
4
|
+
export async function read_diff(cwd, file) {
|
|
5
|
+
const path = git_path(file);
|
|
6
|
+
if (file.state === 'untracked') {
|
|
7
|
+
return {
|
|
8
|
+
path: file.path,
|
|
9
|
+
lines: [
|
|
10
|
+
'Untracked file',
|
|
11
|
+
'',
|
|
12
|
+
'Press space or s to stage it.',
|
|
13
|
+
'No diff is available until Git starts tracking the path.',
|
|
14
|
+
],
|
|
15
|
+
hunks: [],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const lines = [];
|
|
19
|
+
const hunks = [];
|
|
20
|
+
const staged = await git(['diff', '--cached', '--', path], cwd).catch((error) => format_git_error(error));
|
|
21
|
+
const unstaged = await git(['diff', '--', path], cwd).catch((error) => format_git_error(error));
|
|
22
|
+
append_diff_section(lines, hunks, 'staged', staged);
|
|
23
|
+
if (staged.trim() && unstaged.trim())
|
|
24
|
+
lines.push('', '');
|
|
25
|
+
append_diff_section(lines, hunks, 'unstaged', unstaged);
|
|
26
|
+
if (lines.length === 0)
|
|
27
|
+
lines.push('No textual diff for this file.');
|
|
28
|
+
return { path: file.path, lines, hunks };
|
|
29
|
+
}
|
|
30
|
+
function append_diff_section(lines, hunks, section, raw) {
|
|
31
|
+
if (!raw.trim())
|
|
32
|
+
return;
|
|
33
|
+
lines.push(section.toUpperCase(), '');
|
|
34
|
+
const offset = lines.length;
|
|
35
|
+
const parsed = parse_diff_hunks(raw, section);
|
|
36
|
+
for (const hunk of parsed) {
|
|
37
|
+
hunks.push({ ...hunk, line_index: offset + hunk.line_index });
|
|
38
|
+
}
|
|
39
|
+
lines.push(...raw.split('\n'));
|
|
40
|
+
}
|
|
41
|
+
export function parse_diff_hunks(raw, section) {
|
|
42
|
+
const lines = raw.endsWith('\n')
|
|
43
|
+
? raw.slice(0, -1).split('\n')
|
|
44
|
+
: raw.split('\n');
|
|
45
|
+
const hunks = [];
|
|
46
|
+
let file_header = [];
|
|
47
|
+
let current_hunk;
|
|
48
|
+
const flush_hunk = () => {
|
|
49
|
+
if (!current_hunk)
|
|
50
|
+
return;
|
|
51
|
+
hunks.push({
|
|
52
|
+
section,
|
|
53
|
+
line_index: current_hunk.start,
|
|
54
|
+
header: current_hunk.lines[0] ?? '@@',
|
|
55
|
+
patch: [...file_header, ...current_hunk.lines].join('\n'),
|
|
56
|
+
});
|
|
57
|
+
current_hunk = undefined;
|
|
58
|
+
};
|
|
59
|
+
for (let index = 0; index < lines.length; index++) {
|
|
60
|
+
const line = lines[index];
|
|
61
|
+
if (line.startsWith('diff --git ')) {
|
|
62
|
+
flush_hunk();
|
|
63
|
+
file_header = [line];
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (line.startsWith('@@')) {
|
|
67
|
+
flush_hunk();
|
|
68
|
+
current_hunk = { start: index, lines: [line] };
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (current_hunk)
|
|
72
|
+
current_hunk.lines.push(line);
|
|
73
|
+
else if (file_header.length > 0)
|
|
74
|
+
file_header.push(line);
|
|
75
|
+
}
|
|
76
|
+
flush_hunk();
|
|
77
|
+
return hunks;
|
|
78
|
+
}
|
|
79
|
+
export function changed_line_indexes(hunk) {
|
|
80
|
+
const lines = hunk.patch.split('\n');
|
|
81
|
+
const header_index = lines.findIndex((line) => line.startsWith('@@'));
|
|
82
|
+
if (header_index < 0)
|
|
83
|
+
return [];
|
|
84
|
+
return lines
|
|
85
|
+
.slice(header_index + 1)
|
|
86
|
+
.flatMap((line, index) => (line.startsWith('+') || line.startsWith('-')) &&
|
|
87
|
+
!line.startsWith('+++') &&
|
|
88
|
+
!line.startsWith('---')
|
|
89
|
+
? [hunk.line_index + 1 + index]
|
|
90
|
+
: []);
|
|
91
|
+
}
|
|
92
|
+
export async function stage_hunk(cwd, hunk) {
|
|
93
|
+
if (hunk.section !== 'unstaged')
|
|
94
|
+
throw new Error('Selected hunk is already staged.');
|
|
95
|
+
await git_with_input(['apply', '--cached', '--whitespace=nowarn', '-'], cwd, `${hunk.patch}\n`);
|
|
96
|
+
}
|
|
97
|
+
export async function unstage_hunk(cwd, hunk) {
|
|
98
|
+
if (hunk.section !== 'staged')
|
|
99
|
+
throw new Error('Selected hunk is not staged.');
|
|
100
|
+
await git_with_input(['apply', '--cached', '--reverse', '--whitespace=nowarn', '-'], cwd, `${hunk.patch}\n`);
|
|
101
|
+
}
|
|
102
|
+
export async function stage_line(cwd, hunk, line_index) {
|
|
103
|
+
if (hunk.section !== 'unstaged')
|
|
104
|
+
throw new Error('Selected line is already staged.');
|
|
105
|
+
await git_with_input(['apply', '--cached', '--whitespace=nowarn', '-'], cwd, `${build_line_patch(hunk, line_index)}\n`);
|
|
106
|
+
}
|
|
107
|
+
export async function unstage_line(cwd, hunk, line_index) {
|
|
108
|
+
if (hunk.section !== 'staged')
|
|
109
|
+
throw new Error('Selected line is not staged.');
|
|
110
|
+
await git_with_input(['apply', '--cached', '--reverse', '--whitespace=nowarn', '-'], cwd, `${build_line_patch(hunk, line_index)}\n`);
|
|
111
|
+
}
|
|
112
|
+
export function build_line_patch(hunk, line_index) {
|
|
113
|
+
const lines = hunk.patch.split('\n');
|
|
114
|
+
const header_index = lines.findIndex((line) => line.startsWith('@@'));
|
|
115
|
+
if (header_index < 0)
|
|
116
|
+
throw new Error('Selected hunk has no header.');
|
|
117
|
+
const body_index = line_index - hunk.line_index - 1;
|
|
118
|
+
const body = lines.slice(header_index + 1);
|
|
119
|
+
const selected = body[body_index];
|
|
120
|
+
if (!selected ||
|
|
121
|
+
(!selected.startsWith('+') && !selected.startsWith('-'))) {
|
|
122
|
+
throw new Error('Selected line is not stageable.');
|
|
123
|
+
}
|
|
124
|
+
const next_body = body.flatMap((line, index) => {
|
|
125
|
+
if (index === body_index)
|
|
126
|
+
return [line];
|
|
127
|
+
if (line.startsWith('+'))
|
|
128
|
+
return [];
|
|
129
|
+
if (line.startsWith('-'))
|
|
130
|
+
return [` ${line.slice(1)}`];
|
|
131
|
+
return [line];
|
|
132
|
+
});
|
|
133
|
+
const header = rebuild_hunk_header(lines[header_index], next_body);
|
|
134
|
+
return [...lines.slice(0, header_index), header, ...next_body].join('\n');
|
|
135
|
+
}
|
|
136
|
+
function rebuild_hunk_header(header, body) {
|
|
137
|
+
const match = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@(.*)$/.exec(header);
|
|
138
|
+
if (!match)
|
|
139
|
+
return header;
|
|
140
|
+
let old_count = 0;
|
|
141
|
+
let new_count = 0;
|
|
142
|
+
for (const line of body) {
|
|
143
|
+
if (line.startsWith('\\'))
|
|
144
|
+
continue;
|
|
145
|
+
if (!line.startsWith('+'))
|
|
146
|
+
old_count++;
|
|
147
|
+
if (!line.startsWith('-'))
|
|
148
|
+
new_count++;
|
|
149
|
+
}
|
|
150
|
+
return `@@ -${match[1]},${old_count} +${match[2]},${new_count} @@${match[3]}`;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function format_git_error(error: unknown): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function format_git_error(error) {
|
|
2
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
3
|
+
if (message.includes('No staged changes'))
|
|
4
|
+
return 'No staged changes to commit.';
|
|
5
|
+
if (message.includes('nothing to commit'))
|
|
6
|
+
return 'Nothing to commit.';
|
|
7
|
+
if (message.includes('patch does not apply')) {
|
|
8
|
+
return 'Hunk no longer applies. Refresh and try again.';
|
|
9
|
+
}
|
|
10
|
+
if (message.includes('CONFLICT')) {
|
|
11
|
+
return 'Git conflict detected. Resolve conflict markers, then stage the file.';
|
|
12
|
+
}
|
|
13
|
+
if (message.includes('not a git repository'))
|
|
14
|
+
return 'Not inside a Git repository.';
|
|
15
|
+
return message;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/git/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC9C,MAAM,OAAO,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxC,OAAO,8BAA8B,CAAC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxC,OAAO,oBAAoB,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC9C,OAAO,gDAAgD,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,uEAAuE,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3C,OAAO,8BAA8B,CAAC;IACvC,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GitFile } from './types.js';
|
|
2
|
+
export declare function git_path(file: GitFile): string;
|
|
3
|
+
export declare function stage_file(cwd: string, file: GitFile): Promise<void>;
|
|
4
|
+
export declare function unstage_file(cwd: string, file: GitFile): Promise<void>;
|
|
5
|
+
export declare function toggle_file(cwd: string, file: GitFile): Promise<void>;
|
|
6
|
+
export declare function stage_all(cwd: string): Promise<void>;
|
|
7
|
+
export declare function unstage_all(cwd: string): Promise<void>;
|
|
8
|
+
export declare function discard_file(cwd: string, file: GitFile): Promise<void>;
|
|
9
|
+
export declare function commit(cwd: string, message: string, options?: {
|
|
10
|
+
amend?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { git } from './client.js';
|
|
2
|
+
export function git_path(file) {
|
|
3
|
+
const arrow = ' → ';
|
|
4
|
+
return file.path.includes(arrow)
|
|
5
|
+
? file.path.split(arrow).at(-1)
|
|
6
|
+
: file.path;
|
|
7
|
+
}
|
|
8
|
+
export async function stage_file(cwd, file) {
|
|
9
|
+
await git(['add', '--', git_path(file)], cwd);
|
|
10
|
+
}
|
|
11
|
+
export async function unstage_file(cwd, file) {
|
|
12
|
+
await git(['restore', '--staged', '--', git_path(file)], cwd);
|
|
13
|
+
}
|
|
14
|
+
export async function toggle_file(cwd, file) {
|
|
15
|
+
if (file.state === 'mixed') {
|
|
16
|
+
throw new Error('Partial file: space is disabled. Use s to stage worktree changes or x to unstage staged changes.');
|
|
17
|
+
}
|
|
18
|
+
if (file.state === 'conflicted') {
|
|
19
|
+
throw new Error('Conflicted file: resolve conflicts, then stage explicitly with s.');
|
|
20
|
+
}
|
|
21
|
+
if (file.state === 'staged')
|
|
22
|
+
await unstage_file(cwd, file);
|
|
23
|
+
else
|
|
24
|
+
await stage_file(cwd, file);
|
|
25
|
+
}
|
|
26
|
+
export async function stage_all(cwd) {
|
|
27
|
+
await git(['add', '--all'], cwd);
|
|
28
|
+
}
|
|
29
|
+
export async function unstage_all(cwd) {
|
|
30
|
+
await git(['restore', '--staged', '--', ':/'], cwd);
|
|
31
|
+
}
|
|
32
|
+
export async function discard_file(cwd, file) {
|
|
33
|
+
const path = git_path(file);
|
|
34
|
+
if (file.state === 'untracked')
|
|
35
|
+
await git(['clean', '-f', '--', path], cwd);
|
|
36
|
+
else
|
|
37
|
+
await git(['restore', '--worktree', '--', path], cwd);
|
|
38
|
+
}
|
|
39
|
+
export async function commit(cwd, message, options = {}) {
|
|
40
|
+
const args = ['commit'];
|
|
41
|
+
if (options.amend)
|
|
42
|
+
args.push('--amend');
|
|
43
|
+
args.push('-m', message);
|
|
44
|
+
await git(args, cwd);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/git/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,UAAU,QAAQ,CAAC,IAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE;QAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,GAAW,EACX,IAAa;IAEb,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAa;IAEb,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,GAAW,EACX,IAAa;IAEb,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,kGAAkG,CAClG,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACd,mEAAmE,CACnE,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;QACtD,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IAC1C,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC5C,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAa;IAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;QAC7B,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;QACxC,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,GAAW,EACX,OAAe,EACf,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { git } from './client.js';
|
|
2
|
+
import { format_git_error } from './errors.js';
|
|
3
|
+
export async function read_repo_overview(cwd) {
|
|
4
|
+
const [branches, log, stashes, remotes] = await Promise.all([
|
|
5
|
+
git(['branch', '--all', '--format=%(HEAD) %(refname:short)'], cwd).catch((error) => format_git_error(error)),
|
|
6
|
+
git(['log', '--oneline', '--decorate', '-n', '8'], cwd).catch((error) => format_git_error(error)),
|
|
7
|
+
git(['stash', 'list', '-n', '8'], cwd).catch((error) => format_git_error(error)),
|
|
8
|
+
git(['remote', '-v'], cwd).catch((error) => format_git_error(error)),
|
|
9
|
+
]);
|
|
10
|
+
return {
|
|
11
|
+
branches: split_non_empty(branches),
|
|
12
|
+
log: split_non_empty(log),
|
|
13
|
+
stashes: split_non_empty(stashes),
|
|
14
|
+
remotes: split_non_empty(remotes),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function split_non_empty(raw) {
|
|
18
|
+
return raw
|
|
19
|
+
.split('\n')
|
|
20
|
+
.map((line) => line.trim())
|
|
21
|
+
.filter(Boolean);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/git/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,GAAW;IAEX,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC3D,GAAG,CACF,CAAC,QAAQ,EAAE,OAAO,EAAE,mCAAmC,CAAC,EACxD,GAAG,CACH,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAC5D,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAClC;QACD,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,gBAAgB,CAAC,KAAK,CAAC,CACvB;QACD,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,gBAAgB,CAAC,KAAK,CAAC,CACvB;KACD,CAAC,CAAC;IACH,OAAO;QACN,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;QACnC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC;QACzB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;KACjC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IACnC,OAAO,GAAG;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GitFile, GitStatus } from './types.js';
|
|
2
|
+
export declare function read_status(cwd: string): Promise<GitStatus>;
|
|
3
|
+
export declare function parse_porcelain_z(raw: string): GitFile[];
|
|
4
|
+
export declare function has_staged_changes(files: GitFile[]): boolean;
|
|
5
|
+
export declare function staged_file_count(files: GitFile[]): number;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { git } from './client.js';
|
|
2
|
+
export async function read_status(cwd) {
|
|
3
|
+
const [branch, upstream, raw] = await Promise.all([
|
|
4
|
+
git(['branch', '--show-current'], cwd).catch(() => 'detached'),
|
|
5
|
+
git([
|
|
6
|
+
'rev-parse',
|
|
7
|
+
'--abbrev-ref',
|
|
8
|
+
'--symbolic-full-name',
|
|
9
|
+
'@{upstream}',
|
|
10
|
+
], cwd).catch(() => ''),
|
|
11
|
+
git(['status', '--porcelain=v1', '-z'], cwd),
|
|
12
|
+
]);
|
|
13
|
+
const counts = upstream.trim()
|
|
14
|
+
? await read_ahead_behind(cwd)
|
|
15
|
+
: { ahead: 0, behind: 0 };
|
|
16
|
+
return {
|
|
17
|
+
branch: branch.trim() || 'detached',
|
|
18
|
+
upstream: upstream.trim() || undefined,
|
|
19
|
+
...counts,
|
|
20
|
+
files: parse_porcelain_z(raw),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function read_ahead_behind(cwd) {
|
|
24
|
+
const raw = await git(['rev-list', '--left-right', '--count', '@{upstream}...HEAD'], cwd).catch(() => '');
|
|
25
|
+
const [behind = '0', ahead = '0'] = raw.trim().split(/\s+/);
|
|
26
|
+
return { ahead: Number(ahead) || 0, behind: Number(behind) || 0 };
|
|
27
|
+
}
|
|
28
|
+
export function parse_porcelain_z(raw) {
|
|
29
|
+
if (!raw)
|
|
30
|
+
return [];
|
|
31
|
+
const entries = raw.split('\0').filter(Boolean);
|
|
32
|
+
const files = [];
|
|
33
|
+
for (let i = 0; i < entries.length; i++) {
|
|
34
|
+
const entry = entries[i];
|
|
35
|
+
const index_status = entry[0] ?? ' ';
|
|
36
|
+
const worktree_status = entry[1] ?? ' ';
|
|
37
|
+
let path = entry.slice(3);
|
|
38
|
+
if (index_status === 'R' || index_status === 'C') {
|
|
39
|
+
const original = entries[++i];
|
|
40
|
+
if (original)
|
|
41
|
+
path = `${original} → ${path}`;
|
|
42
|
+
}
|
|
43
|
+
files.push({
|
|
44
|
+
path,
|
|
45
|
+
index_status,
|
|
46
|
+
worktree_status,
|
|
47
|
+
state: get_file_state(index_status, worktree_status),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return files.sort((a, b) => state_rank(a.state) - state_rank(b.state) ||
|
|
51
|
+
a.path.localeCompare(b.path));
|
|
52
|
+
}
|
|
53
|
+
function get_file_state(index_status, worktree_status) {
|
|
54
|
+
if (index_status === '?' && worktree_status === '?')
|
|
55
|
+
return 'untracked';
|
|
56
|
+
if (index_status === 'U' ||
|
|
57
|
+
worktree_status === 'U' ||
|
|
58
|
+
(index_status === 'A' && worktree_status === 'A') ||
|
|
59
|
+
(index_status === 'D' && worktree_status === 'D')) {
|
|
60
|
+
return 'conflicted';
|
|
61
|
+
}
|
|
62
|
+
const has_index = index_status !== ' ';
|
|
63
|
+
const has_worktree = worktree_status !== ' ';
|
|
64
|
+
if (has_index && has_worktree)
|
|
65
|
+
return 'mixed';
|
|
66
|
+
if (has_index)
|
|
67
|
+
return 'staged';
|
|
68
|
+
return 'changed';
|
|
69
|
+
}
|
|
70
|
+
function state_rank(state) {
|
|
71
|
+
return [
|
|
72
|
+
'conflicted',
|
|
73
|
+
'changed',
|
|
74
|
+
'untracked',
|
|
75
|
+
'mixed',
|
|
76
|
+
'staged',
|
|
77
|
+
].indexOf(state);
|
|
78
|
+
}
|
|
79
|
+
export function has_staged_changes(files) {
|
|
80
|
+
return files.some((file) => file.index_status !== ' ' && file.index_status !== '?');
|
|
81
|
+
}
|
|
82
|
+
export function staged_file_count(files) {
|
|
83
|
+
return files.filter((file) => file.index_status !== ' ' && file.index_status !== '?').length;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/git/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type FileState = 'staged' | 'changed' | 'mixed' | 'untracked' | 'conflicted';
|
|
2
|
+
export interface GitFile {
|
|
3
|
+
path: string;
|
|
4
|
+
index_status: string;
|
|
5
|
+
worktree_status: string;
|
|
6
|
+
state: FileState;
|
|
7
|
+
}
|
|
8
|
+
export interface GitStatus {
|
|
9
|
+
branch: string;
|
|
10
|
+
upstream?: string;
|
|
11
|
+
ahead: number;
|
|
12
|
+
behind: number;
|
|
13
|
+
files: GitFile[];
|
|
14
|
+
}
|
|
15
|
+
export type DiffSection = 'staged' | 'unstaged';
|
|
16
|
+
export interface DiffHunk {
|
|
17
|
+
section: DiffSection;
|
|
18
|
+
line_index: number;
|
|
19
|
+
header: string;
|
|
20
|
+
patch: string;
|
|
21
|
+
}
|
|
22
|
+
export interface DiffView {
|
|
23
|
+
path: string;
|
|
24
|
+
lines: string[];
|
|
25
|
+
hunks: DiffHunk[];
|
|
26
|
+
}
|
|
27
|
+
export interface RepoOverview {
|
|
28
|
+
branches: string[];
|
|
29
|
+
log: string[];
|
|
30
|
+
stashes: string[];
|
|
31
|
+
remotes: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare const EMPTY_STATUS: GitStatus;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAC,MAAM,YAAY,GAAc;IACtC,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,EAAE;CACT,CAAC"}
|