gitx.do 0.0.2 → 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/dist/cli/commands/blame.d.ts +259 -0
- package/dist/cli/commands/blame.d.ts.map +1 -0
- package/dist/cli/commands/blame.js +609 -0
- package/dist/cli/commands/blame.js.map +1 -0
- package/dist/cli/commands/branch.d.ts +249 -0
- package/dist/cli/commands/branch.d.ts.map +1 -0
- package/dist/cli/commands/branch.js +693 -0
- package/dist/cli/commands/branch.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +182 -0
- package/dist/cli/commands/commit.d.ts.map +1 -0
- package/dist/cli/commands/commit.js +437 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +464 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +958 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/log.d.ts +239 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +535 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/review.d.ts +457 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +533 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/status.d.ts +269 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +493 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/web.d.ts +199 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +696 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/fs-adapter.d.ts +656 -0
- package/dist/cli/fs-adapter.d.ts.map +1 -0
- package/dist/cli/fs-adapter.js +1179 -0
- package/dist/cli/fs-adapter.js.map +1 -0
- package/dist/cli/index.d.ts +387 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +523 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/components/DiffView.d.ts +7 -0
- package/dist/cli/ui/components/DiffView.d.ts.map +1 -0
- package/dist/cli/ui/components/DiffView.js +11 -0
- package/dist/cli/ui/components/DiffView.js.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts +6 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.js +11 -0
- package/dist/cli/ui/components/ErrorDisplay.js.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts +9 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.js +12 -0
- package/dist/cli/ui/components/FuzzySearch.js.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts +6 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.js +10 -0
- package/dist/cli/ui/components/LoadingSpinner.js.map +1 -0
- package/dist/cli/ui/components/NavigationList.d.ts +9 -0
- package/dist/cli/ui/components/NavigationList.d.ts.map +1 -0
- package/dist/cli/ui/components/NavigationList.js +11 -0
- package/dist/cli/ui/components/NavigationList.js.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts +8 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.js +11 -0
- package/dist/cli/ui/components/ScrollableContent.js.map +1 -0
- package/dist/cli/ui/components/index.d.ts +7 -0
- package/dist/cli/ui/components/index.d.ts.map +1 -0
- package/dist/cli/ui/components/index.js +9 -0
- package/dist/cli/ui/components/index.js.map +1 -0
- package/dist/cli/ui/terminal-ui.d.ts +52 -0
- package/dist/cli/ui/terminal-ui.d.ts.map +1 -0
- package/dist/cli/ui/terminal-ui.js +121 -0
- package/dist/cli/ui/terminal-ui.js.map +1 -0
- package/dist/durable-object/object-store.d.ts +401 -23
- package/dist/durable-object/object-store.d.ts.map +1 -1
- package/dist/durable-object/object-store.js +414 -25
- package/dist/durable-object/object-store.js.map +1 -1
- package/dist/durable-object/schema.d.ts +188 -0
- package/dist/durable-object/schema.d.ts.map +1 -1
- package/dist/durable-object/schema.js +160 -0
- package/dist/durable-object/schema.js.map +1 -1
- package/dist/durable-object/wal.d.ts +336 -31
- package/dist/durable-object/wal.d.ts.map +1 -1
- package/dist/durable-object/wal.js +272 -27
- package/dist/durable-object/wal.js.map +1 -1
- package/dist/index.d.ts +379 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +379 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/adapter.d.ts +579 -38
- package/dist/mcp/adapter.d.ts.map +1 -1
- package/dist/mcp/adapter.js +426 -33
- package/dist/mcp/adapter.js.map +1 -1
- package/dist/mcp/sandbox.d.ts +532 -29
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +389 -22
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/mcp/sdk-adapter.d.ts +478 -56
- package/dist/mcp/sdk-adapter.d.ts.map +1 -1
- package/dist/mcp/sdk-adapter.js +346 -44
- package/dist/mcp/sdk-adapter.js.map +1 -1
- package/dist/mcp/tools.d.ts +445 -30
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +363 -33
- package/dist/mcp/tools.js.map +1 -1
- package/dist/ops/blame.d.ts +424 -21
- package/dist/ops/blame.d.ts.map +1 -1
- package/dist/ops/blame.js +303 -20
- package/dist/ops/blame.js.map +1 -1
- package/dist/ops/branch.d.ts +583 -32
- package/dist/ops/branch.d.ts.map +1 -1
- package/dist/ops/branch.js +365 -23
- package/dist/ops/branch.js.map +1 -1
- package/dist/ops/commit-traversal.d.ts +164 -24
- package/dist/ops/commit-traversal.d.ts.map +1 -1
- package/dist/ops/commit-traversal.js +68 -2
- package/dist/ops/commit-traversal.js.map +1 -1
- package/dist/ops/commit.d.ts +387 -53
- package/dist/ops/commit.d.ts.map +1 -1
- package/dist/ops/commit.js +249 -29
- package/dist/ops/commit.js.map +1 -1
- package/dist/ops/merge-base.d.ts +195 -21
- package/dist/ops/merge-base.d.ts.map +1 -1
- package/dist/ops/merge-base.js +122 -12
- package/dist/ops/merge-base.js.map +1 -1
- package/dist/ops/merge.d.ts +600 -130
- package/dist/ops/merge.d.ts.map +1 -1
- package/dist/ops/merge.js +408 -60
- package/dist/ops/merge.js.map +1 -1
- package/dist/ops/tag.d.ts +67 -2
- package/dist/ops/tag.d.ts.map +1 -1
- package/dist/ops/tag.js +42 -1
- package/dist/ops/tag.js.map +1 -1
- package/dist/ops/tree-builder.d.ts +102 -6
- package/dist/ops/tree-builder.d.ts.map +1 -1
- package/dist/ops/tree-builder.js +30 -5
- package/dist/ops/tree-builder.js.map +1 -1
- package/dist/ops/tree-diff.d.ts +50 -2
- package/dist/ops/tree-diff.d.ts.map +1 -1
- package/dist/ops/tree-diff.js +50 -2
- package/dist/ops/tree-diff.js.map +1 -1
- package/dist/pack/delta.d.ts +211 -39
- package/dist/pack/delta.d.ts.map +1 -1
- package/dist/pack/delta.js +232 -46
- package/dist/pack/delta.js.map +1 -1
- package/dist/pack/format.d.ts +390 -28
- package/dist/pack/format.d.ts.map +1 -1
- package/dist/pack/format.js +344 -33
- package/dist/pack/format.js.map +1 -1
- package/dist/pack/full-generation.d.ts +313 -28
- package/dist/pack/full-generation.d.ts.map +1 -1
- package/dist/pack/full-generation.js +238 -19
- package/dist/pack/full-generation.js.map +1 -1
- package/dist/pack/generation.d.ts +346 -23
- package/dist/pack/generation.d.ts.map +1 -1
- package/dist/pack/generation.js +269 -21
- package/dist/pack/generation.js.map +1 -1
- package/dist/pack/index.d.ts +407 -86
- package/dist/pack/index.d.ts.map +1 -1
- package/dist/pack/index.js +351 -70
- package/dist/pack/index.js.map +1 -1
- package/dist/refs/branch.d.ts +517 -71
- package/dist/refs/branch.d.ts.map +1 -1
- package/dist/refs/branch.js +410 -26
- package/dist/refs/branch.js.map +1 -1
- package/dist/refs/storage.d.ts +610 -57
- package/dist/refs/storage.d.ts.map +1 -1
- package/dist/refs/storage.js +481 -29
- package/dist/refs/storage.js.map +1 -1
- package/dist/refs/tag.d.ts +677 -67
- package/dist/refs/tag.d.ts.map +1 -1
- package/dist/refs/tag.js +497 -30
- package/dist/refs/tag.js.map +1 -1
- package/dist/storage/lru-cache.d.ts +556 -53
- package/dist/storage/lru-cache.d.ts.map +1 -1
- package/dist/storage/lru-cache.js +439 -36
- package/dist/storage/lru-cache.js.map +1 -1
- package/dist/storage/object-index.d.ts +483 -38
- package/dist/storage/object-index.d.ts.map +1 -1
- package/dist/storage/object-index.js +388 -22
- package/dist/storage/object-index.js.map +1 -1
- package/dist/storage/r2-pack.d.ts +957 -94
- package/dist/storage/r2-pack.d.ts.map +1 -1
- package/dist/storage/r2-pack.js +756 -48
- package/dist/storage/r2-pack.js.map +1 -1
- package/dist/tiered/cdc-pipeline.d.ts +1610 -38
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -1
- package/dist/tiered/cdc-pipeline.js +1131 -22
- package/dist/tiered/cdc-pipeline.js.map +1 -1
- package/dist/tiered/migration.d.ts +903 -41
- package/dist/tiered/migration.d.ts.map +1 -1
- package/dist/tiered/migration.js +646 -24
- package/dist/tiered/migration.js.map +1 -1
- package/dist/tiered/parquet-writer.d.ts +944 -47
- package/dist/tiered/parquet-writer.d.ts.map +1 -1
- package/dist/tiered/parquet-writer.js +667 -39
- package/dist/tiered/parquet-writer.js.map +1 -1
- package/dist/tiered/read-path.d.ts +728 -34
- package/dist/tiered/read-path.d.ts.map +1 -1
- package/dist/tiered/read-path.js +310 -27
- package/dist/tiered/read-path.js.map +1 -1
- package/dist/types/objects.d.ts +457 -0
- package/dist/types/objects.d.ts.map +1 -1
- package/dist/types/objects.js +305 -4
- package/dist/types/objects.js.map +1 -1
- package/dist/types/storage.d.ts +407 -35
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/storage.js +27 -3
- package/dist/types/storage.js.map +1 -1
- package/dist/utils/hash.d.ts +133 -12
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +133 -12
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/sha1.d.ts +102 -9
- package/dist/utils/sha1.d.ts.map +1 -1
- package/dist/utils/sha1.js +114 -11
- package/dist/utils/sha1.js.map +1 -1
- package/dist/wire/capabilities.d.ts +896 -88
- package/dist/wire/capabilities.d.ts.map +1 -1
- package/dist/wire/capabilities.js +566 -62
- package/dist/wire/capabilities.js.map +1 -1
- package/dist/wire/pkt-line.d.ts +293 -15
- package/dist/wire/pkt-line.d.ts.map +1 -1
- package/dist/wire/pkt-line.js +251 -15
- package/dist/wire/pkt-line.js.map +1 -1
- package/dist/wire/receive-pack.d.ts +814 -64
- package/dist/wire/receive-pack.d.ts.map +1 -1
- package/dist/wire/receive-pack.js +542 -41
- package/dist/wire/receive-pack.js.map +1 -1
- package/dist/wire/smart-http.d.ts +575 -97
- package/dist/wire/smart-http.d.ts.map +1 -1
- package/dist/wire/smart-http.js +337 -46
- package/dist/wire/smart-http.js.map +1 -1
- package/dist/wire/upload-pack.d.ts +492 -98
- package/dist/wire/upload-pack.d.ts.map +1 -1
- package/dist/wire/upload-pack.js +347 -59
- package/dist/wire/upload-pack.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview gitx status command
|
|
3
|
+
*
|
|
4
|
+
* This module implements the `gitx status` command which displays the
|
|
5
|
+
* working tree status. It shows:
|
|
6
|
+
* - Untracked files (not yet added to git)
|
|
7
|
+
* - Modified files (changed but not staged)
|
|
8
|
+
* - Staged files (ready to commit)
|
|
9
|
+
* - Deleted files
|
|
10
|
+
* - Renamed files
|
|
11
|
+
* - Current branch and tracking information
|
|
12
|
+
*
|
|
13
|
+
* Supports both long format (default) and short format (--short) output,
|
|
14
|
+
* similar to git's status command.
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/status
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Long format output
|
|
20
|
+
* await statusCommand(ctx)
|
|
21
|
+
* // On branch main
|
|
22
|
+
* // Your branch is up to date with 'origin/main'.
|
|
23
|
+
* //
|
|
24
|
+
* // Changes to be committed:
|
|
25
|
+
* // new file: src/new-file.ts
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // Short format output
|
|
29
|
+
* ctx.options.short = true
|
|
30
|
+
* await statusCommand(ctx)
|
|
31
|
+
* // A src/new-file.ts
|
|
32
|
+
* // ?? untracked-file.txt
|
|
33
|
+
*/
|
|
34
|
+
import * as fs from 'fs/promises';
|
|
35
|
+
import * as path from 'path';
|
|
36
|
+
import { createFSAdapter, FSAdapterError } from '../fs-adapter';
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Status Command Handler
|
|
39
|
+
// ============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Execute the status command.
|
|
42
|
+
*
|
|
43
|
+
* @description Main entry point for the status command. Displays the working
|
|
44
|
+
* tree status in either long or short format based on options.
|
|
45
|
+
*
|
|
46
|
+
* @param ctx - Command context with cwd, options, and I/O functions
|
|
47
|
+
*
|
|
48
|
+
* @throws {Error} With message starting "fatal:" if not in a git repository
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // Long format (default)
|
|
52
|
+
* await statusCommand({ cwd: '/repo', options: {}, stdout: console.log, stderr: console.error, args: [], rawArgs: [] })
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* // Short format
|
|
56
|
+
* await statusCommand({ cwd: '/repo', options: { short: true }, stdout: console.log, stderr: console.error, args: [], rawArgs: [] })
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // Branch only
|
|
60
|
+
* await statusCommand({ cwd: '/repo', options: { branch: true }, stdout: console.log, stderr: console.error, args: [], rawArgs: [] })
|
|
61
|
+
*/
|
|
62
|
+
export async function statusCommand(ctx) {
|
|
63
|
+
const { cwd, options, stdout, stderr } = ctx;
|
|
64
|
+
try {
|
|
65
|
+
if (options.branch && !options.short) {
|
|
66
|
+
const branchInfo = await getBranchInfo(cwd);
|
|
67
|
+
stdout(formatBranchOnly(branchInfo));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const result = await getStatus(cwd);
|
|
71
|
+
if (options.short) {
|
|
72
|
+
if (options.branch) {
|
|
73
|
+
// Both --short and --branch: show branch line + short file status
|
|
74
|
+
stdout(formatBranchOnly(result.branch));
|
|
75
|
+
const shortOutput = formatStatusShort(result);
|
|
76
|
+
if (shortOutput.trim()) {
|
|
77
|
+
stdout(shortOutput);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const output = formatStatusShort(result);
|
|
82
|
+
if (output.trim()) {
|
|
83
|
+
stdout(output);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
stdout(formatStatusLong(result));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error instanceof FSAdapterError && error.code === 'NOT_A_GIT_REPO') {
|
|
93
|
+
throw new Error('fatal: not a git repository (or any of the parent directories): .git');
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the working tree status.
|
|
100
|
+
*
|
|
101
|
+
* @description Computes the complete status of the working tree by comparing
|
|
102
|
+
* the index (staging area), working directory, and HEAD commit. Returns
|
|
103
|
+
* structured status information for all tracked and untracked files.
|
|
104
|
+
*
|
|
105
|
+
* @param cwd - Working directory (repository root)
|
|
106
|
+
* @returns Promise<StatusResult> with branch info, file statuses, and isClean flag
|
|
107
|
+
*
|
|
108
|
+
* @throws {Error} With message starting "fatal:" if not in a git repository
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* const status = await getStatus('/path/to/repo')
|
|
112
|
+
* if (status.isClean) {
|
|
113
|
+
* console.log('Nothing to commit, working tree clean')
|
|
114
|
+
* } else {
|
|
115
|
+
* console.log(`${status.files.length} files with changes`)
|
|
116
|
+
* }
|
|
117
|
+
*/
|
|
118
|
+
export async function getStatus(cwd) {
|
|
119
|
+
let adapter;
|
|
120
|
+
try {
|
|
121
|
+
adapter = await createFSAdapter(cwd);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error instanceof FSAdapterError && error.code === 'NOT_A_GIT_REPO') {
|
|
125
|
+
throw new Error('fatal: not a git repository (or any of the parent directories): .git');
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
const branchInfo = await getBranchInfo(cwd);
|
|
130
|
+
const files = [];
|
|
131
|
+
// Get index entries
|
|
132
|
+
const index = adapter.getIndex();
|
|
133
|
+
const indexEntries = await index.getEntries();
|
|
134
|
+
const indexPaths = new Set(indexEntries.map(e => e.path));
|
|
135
|
+
// Read mock status files if present (for testing)
|
|
136
|
+
const gitDir = adapter.gitDir;
|
|
137
|
+
const mockStatusPath = path.join(gitDir, 'mock-status');
|
|
138
|
+
try {
|
|
139
|
+
const mockStatus = await fs.readFile(mockStatusPath, 'utf8');
|
|
140
|
+
// Parse mock status format: "XY path" or "XY origPath -> newPath" for renames
|
|
141
|
+
for (const line of mockStatus.split('\n')) {
|
|
142
|
+
if (!line.trim())
|
|
143
|
+
continue;
|
|
144
|
+
const renameMatch = line.match(/^(.)(.) (.+?) -> (.+)$/);
|
|
145
|
+
if (renameMatch) {
|
|
146
|
+
const [, indexStatus, workingTreeStatus, origPath, newPath] = renameMatch;
|
|
147
|
+
files.push({
|
|
148
|
+
path: newPath,
|
|
149
|
+
index: indexStatus,
|
|
150
|
+
workingTree: workingTreeStatus,
|
|
151
|
+
origPath
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const match = line.match(/^(.)(.) (.+)$/);
|
|
156
|
+
if (match) {
|
|
157
|
+
const [, indexStatus, workingTreeStatus, filePath] = match;
|
|
158
|
+
files.push({
|
|
159
|
+
path: filePath,
|
|
160
|
+
index: indexStatus,
|
|
161
|
+
workingTree: workingTreeStatus
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// No mock status, scan working tree for untracked files
|
|
169
|
+
await scanWorkingTree(cwd, adapter.gitDir, '', indexPaths, files);
|
|
170
|
+
}
|
|
171
|
+
// Sort files alphabetically
|
|
172
|
+
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
173
|
+
const isClean = files.length === 0;
|
|
174
|
+
return {
|
|
175
|
+
branch: branchInfo,
|
|
176
|
+
files,
|
|
177
|
+
isClean
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Scan working tree for untracked files
|
|
182
|
+
*/
|
|
183
|
+
async function scanWorkingTree(repoPath, gitDir, relativePath, indexPaths, files) {
|
|
184
|
+
const currentPath = relativePath ? path.join(repoPath, relativePath) : repoPath;
|
|
185
|
+
try {
|
|
186
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
const entryPath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
189
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
190
|
+
// Skip .git directory
|
|
191
|
+
if (entry.name === '.git')
|
|
192
|
+
continue;
|
|
193
|
+
if (entry.isDirectory()) {
|
|
194
|
+
// Check if any files in this directory are tracked
|
|
195
|
+
const hasTrackedFiles = Array.from(indexPaths).some(p => p.startsWith(entryPath + '/'));
|
|
196
|
+
if (hasTrackedFiles) {
|
|
197
|
+
// Recurse into directory
|
|
198
|
+
await scanWorkingTree(repoPath, gitDir, entryPath, indexPaths, files);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Directory with no tracked files - show as untracked directory
|
|
202
|
+
// But for tests, scan recursively to find individual files
|
|
203
|
+
await scanWorkingTree(repoPath, gitDir, entryPath, indexPaths, files);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
207
|
+
if (!indexPaths.has(entryPath)) {
|
|
208
|
+
files.push({
|
|
209
|
+
path: entryPath,
|
|
210
|
+
index: '?',
|
|
211
|
+
workingTree: '?'
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Directory might not exist or not be readable
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get branch information for the current repository.
|
|
223
|
+
*
|
|
224
|
+
* @description Retrieves information about the current branch including
|
|
225
|
+
* its name, upstream tracking branch, and ahead/behind counts. Detects
|
|
226
|
+
* detached HEAD state.
|
|
227
|
+
*
|
|
228
|
+
* @param cwd - Working directory (repository root)
|
|
229
|
+
* @returns Promise<BranchInfo> with branch name and tracking information
|
|
230
|
+
*
|
|
231
|
+
* @throws {Error} With message starting "fatal:" if not in a git repository
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* const branch = await getBranchInfo('/path/to/repo')
|
|
235
|
+
* if (branch.detached) {
|
|
236
|
+
* console.log(`Detached at ${branch.name}`)
|
|
237
|
+
* } else {
|
|
238
|
+
* console.log(`On branch ${branch.name}`)
|
|
239
|
+
* if (branch.upstream) {
|
|
240
|
+
* console.log(`Tracking ${branch.upstream}`)
|
|
241
|
+
* }
|
|
242
|
+
* }
|
|
243
|
+
*/
|
|
244
|
+
export async function getBranchInfo(cwd) {
|
|
245
|
+
let adapter;
|
|
246
|
+
try {
|
|
247
|
+
adapter = await createFSAdapter(cwd);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
if (error instanceof FSAdapterError && error.code === 'NOT_A_GIT_REPO') {
|
|
251
|
+
throw new Error('fatal: not a git repository (or any of the parent directories): .git');
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
const head = await adapter.getHead();
|
|
256
|
+
const config = adapter.getConfig();
|
|
257
|
+
if (!head) {
|
|
258
|
+
return { name: 'main', detached: false };
|
|
259
|
+
}
|
|
260
|
+
// Check if HEAD is detached
|
|
261
|
+
if (head.type === 'direct') {
|
|
262
|
+
return {
|
|
263
|
+
name: head.target.substring(0, 7),
|
|
264
|
+
detached: true
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// HEAD is symbolic, extract branch name
|
|
268
|
+
const branchRef = head.target;
|
|
269
|
+
const branchName = branchRef.replace('refs/heads/', '');
|
|
270
|
+
// Get upstream tracking info
|
|
271
|
+
const upstream = await config.getBranchUpstream(branchName);
|
|
272
|
+
let upstreamName;
|
|
273
|
+
let ahead;
|
|
274
|
+
let behind;
|
|
275
|
+
if (upstream) {
|
|
276
|
+
// Format upstream as "remote/branch"
|
|
277
|
+
const remoteBranch = upstream.merge.replace('refs/heads/', '');
|
|
278
|
+
upstreamName = `${upstream.remote}/${remoteBranch}`;
|
|
279
|
+
// Try to read ahead/behind from mock file (for testing)
|
|
280
|
+
const gitDir = adapter.gitDir;
|
|
281
|
+
try {
|
|
282
|
+
const aheadBehindPath = path.join(gitDir, 'mock-ahead-behind');
|
|
283
|
+
const content = await fs.readFile(aheadBehindPath, 'utf8');
|
|
284
|
+
const match = content.match(/ahead=(\d+)\s+behind=(\d+)/);
|
|
285
|
+
if (match) {
|
|
286
|
+
ahead = parseInt(match[1], 10);
|
|
287
|
+
behind = parseInt(match[2], 10);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Default to 0 if no mock data
|
|
292
|
+
ahead = 0;
|
|
293
|
+
behind = 0;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
name: branchName,
|
|
298
|
+
upstream: upstreamName,
|
|
299
|
+
ahead,
|
|
300
|
+
behind,
|
|
301
|
+
detached: false
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Format status output for display (long format).
|
|
306
|
+
*
|
|
307
|
+
* @description Formats the status result in git's long format, showing
|
|
308
|
+
* grouped sections for staged changes, unstaged changes, and untracked files.
|
|
309
|
+
* Includes branch tracking information and helpful hints.
|
|
310
|
+
*
|
|
311
|
+
* @param result - StatusResult object with branch and file information
|
|
312
|
+
* @returns Formatted multi-line string suitable for terminal output
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
* const status = await getStatus('/repo')
|
|
316
|
+
* console.log(formatStatusLong(status))
|
|
317
|
+
* // On branch main
|
|
318
|
+
* // Your branch is up to date with 'origin/main'.
|
|
319
|
+
* //
|
|
320
|
+
* // Changes to be committed:
|
|
321
|
+
* // new file: src/feature.ts
|
|
322
|
+
*/
|
|
323
|
+
export function formatStatusLong(result) {
|
|
324
|
+
const lines = [];
|
|
325
|
+
// Branch header
|
|
326
|
+
if (result.branch.detached) {
|
|
327
|
+
lines.push(`HEAD detached at ${result.branch.name}`);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
lines.push(`On branch ${result.branch.name}`);
|
|
331
|
+
if (result.branch.upstream) {
|
|
332
|
+
if (result.branch.ahead !== undefined && result.branch.behind !== undefined) {
|
|
333
|
+
if (result.branch.ahead === 0 && result.branch.behind === 0) {
|
|
334
|
+
lines.push(`Your branch is up to date with '${result.branch.upstream}'.`);
|
|
335
|
+
}
|
|
336
|
+
else if (result.branch.ahead > 0 && result.branch.behind === 0) {
|
|
337
|
+
lines.push(`Your branch is ahead of '${result.branch.upstream}' by ${result.branch.ahead} commit${result.branch.ahead > 1 ? 's' : ''}.`);
|
|
338
|
+
}
|
|
339
|
+
else if (result.branch.behind > 0 && result.branch.ahead === 0) {
|
|
340
|
+
lines.push(`Your branch is behind '${result.branch.upstream}' by ${result.branch.behind} commit${result.branch.behind > 1 ? 's' : ''}.`);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
lines.push(`Your branch and '${result.branch.upstream}' have diverged,`);
|
|
344
|
+
lines.push(`and have ${result.branch.ahead} and ${result.branch.behind} different commits each, respectively.`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// Staged changes
|
|
350
|
+
const stagedFiles = result.files.filter(f => f.index !== ' ' && f.index !== '?');
|
|
351
|
+
if (stagedFiles.length > 0) {
|
|
352
|
+
lines.push('');
|
|
353
|
+
lines.push('Changes to be committed:');
|
|
354
|
+
lines.push(' (use "git restore --staged <file>..." to unstage)');
|
|
355
|
+
lines.push('');
|
|
356
|
+
for (const file of stagedFiles) {
|
|
357
|
+
const label = getIndexLabel(file.index);
|
|
358
|
+
if (file.origPath) {
|
|
359
|
+
lines.push(`\t${label}: ${file.origPath} -> ${file.path}`);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
lines.push(`\t${label}: ${file.path}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Unstaged changes
|
|
367
|
+
const unstagedFiles = result.files.filter(f => f.workingTree !== ' ' && f.workingTree !== '?' && f.workingTree !== '!');
|
|
368
|
+
if (unstagedFiles.length > 0) {
|
|
369
|
+
lines.push('');
|
|
370
|
+
lines.push('Changes not staged for commit:');
|
|
371
|
+
lines.push(' (use "git add <file>..." to update what will be committed)');
|
|
372
|
+
lines.push(' (use "git restore <file>..." to discard changes in working directory)');
|
|
373
|
+
lines.push('');
|
|
374
|
+
for (const file of unstagedFiles) {
|
|
375
|
+
const label = getWorkingTreeLabel(file.workingTree);
|
|
376
|
+
lines.push(`\t${label}: ${file.path}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Untracked files
|
|
380
|
+
const untrackedFiles = result.files.filter(f => f.workingTree === '?');
|
|
381
|
+
if (untrackedFiles.length > 0) {
|
|
382
|
+
lines.push('');
|
|
383
|
+
lines.push('Untracked files:');
|
|
384
|
+
lines.push(' (use "git add <file>..." to include in what will be committed)');
|
|
385
|
+
lines.push('');
|
|
386
|
+
for (const file of untrackedFiles) {
|
|
387
|
+
lines.push(`\t${file.path}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Clean message
|
|
391
|
+
if (result.isClean) {
|
|
392
|
+
lines.push('');
|
|
393
|
+
lines.push('nothing to commit, working tree clean');
|
|
394
|
+
}
|
|
395
|
+
return lines.join('\n');
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Get label for index status
|
|
399
|
+
*/
|
|
400
|
+
function getIndexLabel(status) {
|
|
401
|
+
switch (status) {
|
|
402
|
+
case 'A': return 'new file';
|
|
403
|
+
case 'M': return 'modified';
|
|
404
|
+
case 'D': return 'deleted';
|
|
405
|
+
case 'R': return 'renamed';
|
|
406
|
+
case 'C': return 'copied';
|
|
407
|
+
default: return 'unknown';
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get label for working tree status
|
|
412
|
+
*/
|
|
413
|
+
function getWorkingTreeLabel(status) {
|
|
414
|
+
switch (status) {
|
|
415
|
+
case 'M': return 'modified';
|
|
416
|
+
case 'D': return 'deleted';
|
|
417
|
+
default: return 'unknown';
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Format status output for display (short format).
|
|
422
|
+
*
|
|
423
|
+
* @description Formats the status result in git's short/porcelain format,
|
|
424
|
+
* showing two-character status codes followed by the file path. Used with
|
|
425
|
+
* the --short flag.
|
|
426
|
+
*
|
|
427
|
+
* @param result - StatusResult object with branch and file information
|
|
428
|
+
* @returns Formatted string with one file per line (empty string if no changes)
|
|
429
|
+
*
|
|
430
|
+
* @example
|
|
431
|
+
* const status = await getStatus('/repo')
|
|
432
|
+
* console.log(formatStatusShort(status))
|
|
433
|
+
* // A src/new-file.ts
|
|
434
|
+
* // M src/modified.ts
|
|
435
|
+
* // ?? untracked.txt
|
|
436
|
+
*/
|
|
437
|
+
export function formatStatusShort(result) {
|
|
438
|
+
const lines = [];
|
|
439
|
+
for (const file of result.files) {
|
|
440
|
+
const indexChar = file.index;
|
|
441
|
+
const workingTreeChar = file.workingTree;
|
|
442
|
+
if (file.origPath) {
|
|
443
|
+
lines.push(`${indexChar}${workingTreeChar} ${file.origPath} -> ${file.path}`);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
lines.push(`${indexChar}${workingTreeChar} ${file.path}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return lines.join('\n');
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Format branch info for --branch flag.
|
|
453
|
+
*
|
|
454
|
+
* @description Formats branch information in the short format used with
|
|
455
|
+
* --branch flag. Shows branch name, tracking upstream, and ahead/behind counts.
|
|
456
|
+
*
|
|
457
|
+
* @param branch - BranchInfo object
|
|
458
|
+
* @returns Single-line string starting with "## " showing branch status
|
|
459
|
+
*
|
|
460
|
+
* @example
|
|
461
|
+
* console.log(formatBranchOnly({ name: 'main', upstream: 'origin/main', ahead: 2, behind: 0 }))
|
|
462
|
+
* // ## main...origin/main [ahead 2]
|
|
463
|
+
*
|
|
464
|
+
* @example
|
|
465
|
+
* console.log(formatBranchOnly({ name: 'abc1234', detached: true }))
|
|
466
|
+
* // ## HEAD (no branch)
|
|
467
|
+
*/
|
|
468
|
+
export function formatBranchOnly(branch) {
|
|
469
|
+
let line = '## ';
|
|
470
|
+
if (branch.detached) {
|
|
471
|
+
line += `HEAD (no branch)`;
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
line += branch.name;
|
|
475
|
+
if (branch.upstream) {
|
|
476
|
+
line += `...${branch.upstream}`;
|
|
477
|
+
if (branch.ahead !== undefined && branch.behind !== undefined) {
|
|
478
|
+
if (branch.ahead > 0 || branch.behind > 0) {
|
|
479
|
+
const parts = [];
|
|
480
|
+
if (branch.ahead > 0) {
|
|
481
|
+
parts.push(`ahead ${branch.ahead}`);
|
|
482
|
+
}
|
|
483
|
+
if (branch.behind > 0) {
|
|
484
|
+
parts.push(`behind ${branch.behind}`);
|
|
485
|
+
}
|
|
486
|
+
line += ` [${parts.join(', ')}]`;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return line;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|