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,609 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Git Blame Command
|
|
3
|
+
*
|
|
4
|
+
* This module implements the `gitx blame` command which shows what revision
|
|
5
|
+
* and author last modified each line of a file. Features include:
|
|
6
|
+
* - Line-by-line attribution to commits and authors
|
|
7
|
+
* - Line range filtering
|
|
8
|
+
* - Rename tracking (-C flag)
|
|
9
|
+
* - Syntax highlighting support via Shiki
|
|
10
|
+
* - Binary file detection
|
|
11
|
+
*
|
|
12
|
+
* @module cli/commands/blame
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Blame entire file
|
|
16
|
+
* const result = await getBlame(adapter, 'src/index.ts')
|
|
17
|
+
* for (const line of result.lines) {
|
|
18
|
+
* console.log(formatBlameLine(line))
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Blame specific line range
|
|
23
|
+
* const result = await getBlame(adapter, 'src/index.ts', { lineRange: '10,20' })
|
|
24
|
+
*/
|
|
25
|
+
import { parseCommit, parseTree } from '../../types/objects';
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Helper Functions
|
|
28
|
+
// ============================================================================
|
|
29
|
+
const decoder = new TextDecoder();
|
|
30
|
+
/**
|
|
31
|
+
* Check if content is likely binary (contains null bytes)
|
|
32
|
+
*/
|
|
33
|
+
function isBinaryContent(data) {
|
|
34
|
+
const checkLength = Math.min(data.length, 8000);
|
|
35
|
+
for (let i = 0; i < checkLength; i++) {
|
|
36
|
+
if (data[i] === 0)
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Split content into lines
|
|
43
|
+
*/
|
|
44
|
+
function splitLines(content) {
|
|
45
|
+
if (content === '')
|
|
46
|
+
return [];
|
|
47
|
+
const lines = content.split('\n');
|
|
48
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') {
|
|
49
|
+
lines.pop();
|
|
50
|
+
}
|
|
51
|
+
return lines.map(line => line.replace(/\r$/, ''));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get file extension from path
|
|
55
|
+
*/
|
|
56
|
+
function getExtension(filePath) {
|
|
57
|
+
const lastDot = filePath.lastIndexOf('.');
|
|
58
|
+
if (lastDot === -1)
|
|
59
|
+
return '';
|
|
60
|
+
return filePath.slice(lastDot + 1).toLowerCase();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Map file extension to language name
|
|
64
|
+
*/
|
|
65
|
+
function extensionToLanguage(ext) {
|
|
66
|
+
const mapping = {
|
|
67
|
+
'js': 'javascript',
|
|
68
|
+
'ts': 'typescript',
|
|
69
|
+
'tsx': 'typescript',
|
|
70
|
+
'jsx': 'javascript',
|
|
71
|
+
'py': 'python',
|
|
72
|
+
'rb': 'ruby',
|
|
73
|
+
'go': 'go',
|
|
74
|
+
'rs': 'rust',
|
|
75
|
+
'java': 'java',
|
|
76
|
+
'c': 'c',
|
|
77
|
+
'cpp': 'cpp',
|
|
78
|
+
'h': 'c',
|
|
79
|
+
'hpp': 'cpp',
|
|
80
|
+
'cs': 'csharp',
|
|
81
|
+
'php': 'php',
|
|
82
|
+
'sh': 'bash',
|
|
83
|
+
'bash': 'bash',
|
|
84
|
+
'zsh': 'bash',
|
|
85
|
+
'json': 'json',
|
|
86
|
+
'yaml': 'yaml',
|
|
87
|
+
'yml': 'yaml',
|
|
88
|
+
'md': 'markdown',
|
|
89
|
+
'html': 'html',
|
|
90
|
+
'css': 'css',
|
|
91
|
+
'scss': 'scss',
|
|
92
|
+
'sql': 'sql',
|
|
93
|
+
'xml': 'xml'
|
|
94
|
+
};
|
|
95
|
+
return mapping[ext] || 'text';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse a commit object from raw data
|
|
99
|
+
*/
|
|
100
|
+
function parseCommitObject(obj) {
|
|
101
|
+
// Build the full git object format: "commit <size>\0<data>"
|
|
102
|
+
const header = new TextEncoder().encode(`commit ${obj.data.length}\0`);
|
|
103
|
+
const fullData = new Uint8Array(header.length + obj.data.length);
|
|
104
|
+
fullData.set(header);
|
|
105
|
+
fullData.set(obj.data, header.length);
|
|
106
|
+
return parseCommit(fullData);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Parse a tree object from raw data
|
|
110
|
+
*/
|
|
111
|
+
function parseTreeObject(obj) {
|
|
112
|
+
const header = new TextEncoder().encode(`tree ${obj.data.length}\0`);
|
|
113
|
+
const fullData = new Uint8Array(header.length + obj.data.length);
|
|
114
|
+
fullData.set(header);
|
|
115
|
+
fullData.set(obj.data, header.length);
|
|
116
|
+
return parseTree(fullData);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get file content at a specific commit
|
|
120
|
+
*/
|
|
121
|
+
async function getFileAtCommit(adapter, commitSha, filePath) {
|
|
122
|
+
const commitObj = await adapter.getObject(commitSha);
|
|
123
|
+
if (!commitObj || commitObj.type !== 'commit')
|
|
124
|
+
return null;
|
|
125
|
+
const commit = parseCommitObject(commitObj);
|
|
126
|
+
// Navigate through tree to find file
|
|
127
|
+
const pathParts = filePath.split('/');
|
|
128
|
+
let currentTreeSha = commit.tree;
|
|
129
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
130
|
+
const treeObj = await adapter.getObject(currentTreeSha);
|
|
131
|
+
if (!treeObj || treeObj.type !== 'tree')
|
|
132
|
+
return null;
|
|
133
|
+
const tree = parseTreeObject(treeObj);
|
|
134
|
+
const entry = tree.entries.find(e => e.name === pathParts[i]);
|
|
135
|
+
if (!entry)
|
|
136
|
+
return null;
|
|
137
|
+
if (i === pathParts.length - 1) {
|
|
138
|
+
// Final part - should be a blob
|
|
139
|
+
const blobObj = await adapter.getObject(entry.sha);
|
|
140
|
+
if (!blobObj || blobObj.type !== 'blob')
|
|
141
|
+
return null;
|
|
142
|
+
return blobObj.data;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Intermediate part - should be a tree
|
|
146
|
+
if (entry.mode !== '040000')
|
|
147
|
+
return null;
|
|
148
|
+
currentTreeSha = entry.sha;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the blob SHA for a file at a specific commit
|
|
155
|
+
*/
|
|
156
|
+
async function getFileBlobSha(adapter, commitSha, filePath) {
|
|
157
|
+
const commitObj = await adapter.getObject(commitSha);
|
|
158
|
+
if (!commitObj || commitObj.type !== 'commit')
|
|
159
|
+
return null;
|
|
160
|
+
const commit = parseCommitObject(commitObj);
|
|
161
|
+
// Navigate through tree to find file
|
|
162
|
+
const pathParts = filePath.split('/');
|
|
163
|
+
let currentTreeSha = commit.tree;
|
|
164
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
165
|
+
const treeObj = await adapter.getObject(currentTreeSha);
|
|
166
|
+
if (!treeObj || treeObj.type !== 'tree')
|
|
167
|
+
return null;
|
|
168
|
+
const tree = parseTreeObject(treeObj);
|
|
169
|
+
const entry = tree.entries.find(e => e.name === pathParts[i]);
|
|
170
|
+
if (!entry)
|
|
171
|
+
return null;
|
|
172
|
+
if (i === pathParts.length - 1) {
|
|
173
|
+
return entry.sha;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (entry.mode !== '040000')
|
|
177
|
+
return null;
|
|
178
|
+
currentTreeSha = entry.sha;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Find a file in a commit tree by its blob SHA (for rename detection)
|
|
185
|
+
*/
|
|
186
|
+
async function findFileByBlobSha(adapter, commitSha, targetBlobSha) {
|
|
187
|
+
const commitObj = await adapter.getObject(commitSha);
|
|
188
|
+
if (!commitObj || commitObj.type !== 'commit')
|
|
189
|
+
return null;
|
|
190
|
+
const commit = parseCommitObject(commitObj);
|
|
191
|
+
// Search tree for a file with the matching blob SHA
|
|
192
|
+
async function searchTree(treeSha, prefix) {
|
|
193
|
+
const treeObj = await adapter.getObject(treeSha);
|
|
194
|
+
if (!treeObj || treeObj.type !== 'tree')
|
|
195
|
+
return null;
|
|
196
|
+
const tree = parseTreeObject(treeObj);
|
|
197
|
+
for (const entry of tree.entries) {
|
|
198
|
+
const entryPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
199
|
+
if (entry.mode === '040000') {
|
|
200
|
+
// It's a directory - recurse
|
|
201
|
+
const found = await searchTree(entry.sha, entryPath);
|
|
202
|
+
if (found)
|
|
203
|
+
return found;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// It's a file - check SHA
|
|
207
|
+
if (entry.sha === targetBlobSha) {
|
|
208
|
+
return entryPath;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
return searchTree(commit.tree, '');
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Compute line mapping between parent and child versions using LCS
|
|
218
|
+
*/
|
|
219
|
+
function computeLineMapping(oldLines, newLines) {
|
|
220
|
+
const mapping = new Map();
|
|
221
|
+
const m = oldLines.length;
|
|
222
|
+
const n = newLines.length;
|
|
223
|
+
if (m === 0 || n === 0)
|
|
224
|
+
return mapping;
|
|
225
|
+
// Create LCS table
|
|
226
|
+
const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));
|
|
227
|
+
for (let i = 1; i <= m; i++) {
|
|
228
|
+
for (let j = 1; j <= n; j++) {
|
|
229
|
+
if (oldLines[i - 1] === newLines[j - 1]) {
|
|
230
|
+
dp[i][j] = dp[i - 1][j - 1] + 1;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Backtrack to find matching lines
|
|
238
|
+
let i = m, j = n;
|
|
239
|
+
while (i > 0 && j > 0) {
|
|
240
|
+
if (oldLines[i - 1] === newLines[j - 1]) {
|
|
241
|
+
mapping.set(i - 1, j - 1);
|
|
242
|
+
i--;
|
|
243
|
+
j--;
|
|
244
|
+
}
|
|
245
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
246
|
+
i--;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
j--;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return mapping;
|
|
253
|
+
}
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// Blame Command Implementation
|
|
256
|
+
// ============================================================================
|
|
257
|
+
/**
|
|
258
|
+
* Execute the blame command from the CLI.
|
|
259
|
+
*
|
|
260
|
+
* @description Parses command-line arguments and displays blame annotations
|
|
261
|
+
* for the specified file. This is the entry point for the `gitx blame` command.
|
|
262
|
+
*
|
|
263
|
+
* @param ctx - Command context containing cwd, args, options, and output functions
|
|
264
|
+
* @returns Promise that resolves when output is complete
|
|
265
|
+
* @throws {Error} Always throws "Not implemented" - command not yet implemented
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* // CLI usage
|
|
269
|
+
* // gitx blame src/index.ts
|
|
270
|
+
* // gitx blame -L 10,20 src/index.ts
|
|
271
|
+
* // gitx blame -C src/renamed-file.ts
|
|
272
|
+
*/
|
|
273
|
+
export async function blameCommand(ctx) {
|
|
274
|
+
throw new Error('Not implemented');
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get blame annotations for a file.
|
|
278
|
+
*
|
|
279
|
+
* @description Computes blame annotations for each line of a file by walking
|
|
280
|
+
* the commit history. For each line, identifies the commit and author that
|
|
281
|
+
* last modified it. Supports line range filtering and rename tracking.
|
|
282
|
+
*
|
|
283
|
+
* The algorithm:
|
|
284
|
+
* 1. Gets the current file content at HEAD
|
|
285
|
+
* 2. Initializes all lines as attributed to HEAD
|
|
286
|
+
* 3. Walks backward through commit history
|
|
287
|
+
* 4. Uses LCS (Longest Common Subsequence) to map lines between commits
|
|
288
|
+
* 5. Updates line attribution when a line exists in a parent commit
|
|
289
|
+
*
|
|
290
|
+
* @param adapter - Filesystem adapter for reading git objects
|
|
291
|
+
* @param filePath - Path to the file to blame (relative to repo root)
|
|
292
|
+
* @param options - Blame options for filtering and behavior
|
|
293
|
+
* @returns Promise resolving to blame result with line annotations
|
|
294
|
+
* @throws {Error} If file path contains null character
|
|
295
|
+
* @throws {Error} If HEAD cannot be resolved (empty repository)
|
|
296
|
+
* @throws {Error} If HEAD commit cannot be read
|
|
297
|
+
* @throws {Error} If file does not exist in repository
|
|
298
|
+
* @throws {Error} If line range is invalid (end before start, exceeds file length)
|
|
299
|
+
*
|
|
300
|
+
* @example
|
|
301
|
+
* // Blame entire file
|
|
302
|
+
* const result = await getBlame(adapter, 'src/index.ts')
|
|
303
|
+
* console.log(`File has ${result.lines.length} lines`)
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* // Blame specific line range
|
|
307
|
+
* const result = await getBlame(adapter, 'src/index.ts', { lineRange: '10,20' })
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* // Blame with rename tracking
|
|
311
|
+
* const result = await getBlame(adapter, 'src/new-name.ts', { followRenames: true })
|
|
312
|
+
* if (result.originalPath) {
|
|
313
|
+
* console.log(`File was renamed from ${result.originalPath}`)
|
|
314
|
+
* }
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* // Handle binary files
|
|
318
|
+
* const result = await getBlame(adapter, 'assets/image.png')
|
|
319
|
+
* if (result.isBinary) {
|
|
320
|
+
* console.log(result.message) // "binary file - cannot show line-by-line blame"
|
|
321
|
+
* console.log(`Last modified by: ${result.fileCommit?.author}`)
|
|
322
|
+
* }
|
|
323
|
+
*/
|
|
324
|
+
export async function getBlame(adapter, filePath, options = {}) {
|
|
325
|
+
// Validate file path
|
|
326
|
+
if (filePath.includes('\0')) {
|
|
327
|
+
throw new Error('Invalid file path: contains null character');
|
|
328
|
+
}
|
|
329
|
+
// Resolve HEAD to get current commit
|
|
330
|
+
const headResolved = await adapter.resolveRef('HEAD');
|
|
331
|
+
if (!headResolved) {
|
|
332
|
+
throw new Error('Cannot resolve HEAD: repository may be empty');
|
|
333
|
+
}
|
|
334
|
+
const headCommitSha = headResolved.sha;
|
|
335
|
+
// Get the commit object
|
|
336
|
+
const commitObj = await adapter.getObject(headCommitSha);
|
|
337
|
+
if (!commitObj || commitObj.type !== 'commit') {
|
|
338
|
+
throw new Error(`Cannot read HEAD commit: ${headCommitSha}`);
|
|
339
|
+
}
|
|
340
|
+
const headCommit = parseCommitObject(commitObj);
|
|
341
|
+
// Get file content at HEAD
|
|
342
|
+
const fileContent = await getFileAtCommit(adapter, headCommitSha, filePath);
|
|
343
|
+
if (fileContent === null) {
|
|
344
|
+
throw new Error(`File not found: ${filePath} does not exist in repository`);
|
|
345
|
+
}
|
|
346
|
+
// Check for binary file
|
|
347
|
+
if (isBinaryContent(fileContent)) {
|
|
348
|
+
return {
|
|
349
|
+
path: filePath,
|
|
350
|
+
lines: [],
|
|
351
|
+
isBinary: true,
|
|
352
|
+
message: 'binary file - cannot show line-by-line blame',
|
|
353
|
+
fileCommit: {
|
|
354
|
+
sha: headCommitSha,
|
|
355
|
+
author: headCommit.author.name,
|
|
356
|
+
date: new Date(headCommit.author.timestamp * 1000)
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
// Parse file content
|
|
361
|
+
const contentStr = decoder.decode(fileContent);
|
|
362
|
+
const lines = splitLines(contentStr);
|
|
363
|
+
// Handle empty file
|
|
364
|
+
if (lines.length === 0) {
|
|
365
|
+
return {
|
|
366
|
+
path: filePath,
|
|
367
|
+
lines: [],
|
|
368
|
+
isBinary: false
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
// Parse and validate line range
|
|
372
|
+
let startLine = 1;
|
|
373
|
+
let endLine = lines.length;
|
|
374
|
+
if (options.lineRange) {
|
|
375
|
+
const range = parseLineRange(options.lineRange);
|
|
376
|
+
if (range.end < range.start) {
|
|
377
|
+
throw new Error(`Invalid line range: end (${range.end}) is before start (${range.start})`);
|
|
378
|
+
}
|
|
379
|
+
if (range.end > lines.length) {
|
|
380
|
+
throw new Error(`Invalid line range: end (${range.end}) exceeds file length (${lines.length})`);
|
|
381
|
+
}
|
|
382
|
+
startLine = range.start;
|
|
383
|
+
endLine = range.end;
|
|
384
|
+
}
|
|
385
|
+
// Initialize blame info for each line
|
|
386
|
+
const blameInfo = lines.map((content, idx) => ({
|
|
387
|
+
commitSha: headCommitSha,
|
|
388
|
+
shortSha: headCommitSha.substring(0, 8),
|
|
389
|
+
author: headCommit.author.name,
|
|
390
|
+
authorEmail: headCommit.author.email,
|
|
391
|
+
date: new Date(headCommit.author.timestamp * 1000),
|
|
392
|
+
lineNumber: idx + 1,
|
|
393
|
+
originalLineNumber: idx + 1,
|
|
394
|
+
content
|
|
395
|
+
}));
|
|
396
|
+
// Track rename history
|
|
397
|
+
let currentPath = filePath;
|
|
398
|
+
let originalPathFound;
|
|
399
|
+
// Walk through commit history to attribute lines
|
|
400
|
+
const commitQueue = [];
|
|
401
|
+
// Initialize with HEAD's parents
|
|
402
|
+
if (headCommit.parents.length > 0) {
|
|
403
|
+
const identityMapping = new Map();
|
|
404
|
+
for (let i = 0; i < lines.length; i++) {
|
|
405
|
+
identityMapping.set(i, i);
|
|
406
|
+
}
|
|
407
|
+
for (const parentSha of headCommit.parents) {
|
|
408
|
+
commitQueue.push({
|
|
409
|
+
sha: parentSha,
|
|
410
|
+
lines: lines,
|
|
411
|
+
path: currentPath,
|
|
412
|
+
lineMapping: identityMapping,
|
|
413
|
+
childSha: headCommitSha
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const visitedCommits = new Set();
|
|
418
|
+
visitedCommits.add(headCommitSha);
|
|
419
|
+
while (commitQueue.length > 0) {
|
|
420
|
+
const item = commitQueue.shift();
|
|
421
|
+
const { sha: parentSha, lines: childLines, path: childPath, lineMapping: childToOriginal, childSha } = item;
|
|
422
|
+
if (visitedCommits.has(parentSha))
|
|
423
|
+
continue;
|
|
424
|
+
visitedCommits.add(parentSha);
|
|
425
|
+
// Get parent commit
|
|
426
|
+
const parentCommitObj = await adapter.getObject(parentSha);
|
|
427
|
+
if (!parentCommitObj || parentCommitObj.type !== 'commit')
|
|
428
|
+
continue;
|
|
429
|
+
const parentCommit = parseCommitObject(parentCommitObj);
|
|
430
|
+
// Check for renames if followRenames is enabled
|
|
431
|
+
let pathInParent = childPath;
|
|
432
|
+
if (options.followRenames) {
|
|
433
|
+
// Check if file exists at current path in parent
|
|
434
|
+
const contentAtPath = await getFileAtCommit(adapter, parentSha, childPath);
|
|
435
|
+
if (contentAtPath === null) {
|
|
436
|
+
// File doesn't exist at this path - try to find it by blob SHA (rename detection)
|
|
437
|
+
const childBlobSha = await getFileBlobSha(adapter, childSha, childPath);
|
|
438
|
+
if (childBlobSha) {
|
|
439
|
+
const renamedPath = await findFileByBlobSha(adapter, parentSha, childBlobSha);
|
|
440
|
+
if (renamedPath) {
|
|
441
|
+
pathInParent = renamedPath;
|
|
442
|
+
if (!originalPathFound)
|
|
443
|
+
originalPathFound = renamedPath;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Get parent file content
|
|
449
|
+
const parentContent = await getFileAtCommit(adapter, parentSha, pathInParent);
|
|
450
|
+
if (!parentContent) {
|
|
451
|
+
// File doesn't exist in parent - all remaining lines are from child commit
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
if (isBinaryContent(parentContent))
|
|
455
|
+
continue;
|
|
456
|
+
const parentContentStr = decoder.decode(parentContent);
|
|
457
|
+
const parentLines = splitLines(parentContentStr);
|
|
458
|
+
// Compute line mapping between parent and child
|
|
459
|
+
const mapping = computeLineMapping(parentLines, childLines);
|
|
460
|
+
// Update blame for lines that came from parent
|
|
461
|
+
for (const [parentIdx, childIdx] of mapping) {
|
|
462
|
+
for (const [origIdx, mappedChildIdx] of childToOriginal) {
|
|
463
|
+
if (mappedChildIdx === childIdx) {
|
|
464
|
+
// This line exists in parent - attribute to parent
|
|
465
|
+
blameInfo[origIdx].commitSha = parentSha;
|
|
466
|
+
blameInfo[origIdx].shortSha = parentSha.substring(0, 8);
|
|
467
|
+
blameInfo[origIdx].author = parentCommit.author.name;
|
|
468
|
+
blameInfo[origIdx].authorEmail = parentCommit.author.email;
|
|
469
|
+
blameInfo[origIdx].date = new Date(parentCommit.author.timestamp * 1000);
|
|
470
|
+
blameInfo[origIdx].originalLineNumber = parentIdx + 1;
|
|
471
|
+
// Track original path when following renames
|
|
472
|
+
if (pathInParent !== childPath) {
|
|
473
|
+
blameInfo[origIdx].originalPath = pathInParent;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// Build new mapping from original indices to parent indices
|
|
479
|
+
const newMapping = new Map();
|
|
480
|
+
for (const [origIdx, childIdx] of childToOriginal) {
|
|
481
|
+
for (const [parentIdx, mappedChildIdx] of mapping) {
|
|
482
|
+
if (mappedChildIdx === childIdx) {
|
|
483
|
+
newMapping.set(origIdx, parentIdx);
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// Add parent's parents to queue
|
|
489
|
+
if (parentCommit.parents.length > 0 && newMapping.size > 0) {
|
|
490
|
+
for (const grandparentSha of parentCommit.parents) {
|
|
491
|
+
commitQueue.push({
|
|
492
|
+
sha: grandparentSha,
|
|
493
|
+
lines: parentLines,
|
|
494
|
+
path: pathInParent,
|
|
495
|
+
lineMapping: newMapping,
|
|
496
|
+
childSha: parentSha
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Filter to requested line range
|
|
502
|
+
let resultLines = blameInfo;
|
|
503
|
+
if (options.lineRange) {
|
|
504
|
+
resultLines = blameInfo.filter(l => l.lineNumber >= startLine && l.lineNumber <= endLine);
|
|
505
|
+
}
|
|
506
|
+
// Build result
|
|
507
|
+
const result = {
|
|
508
|
+
path: filePath,
|
|
509
|
+
lines: resultLines,
|
|
510
|
+
isBinary: false
|
|
511
|
+
};
|
|
512
|
+
// Add original path if found through rename tracking
|
|
513
|
+
if (originalPathFound) {
|
|
514
|
+
result.originalPath = originalPathFound;
|
|
515
|
+
}
|
|
516
|
+
// Handle syntax highlighting
|
|
517
|
+
if (options.highlight) {
|
|
518
|
+
const ext = getExtension(filePath);
|
|
519
|
+
const language = extensionToLanguage(ext);
|
|
520
|
+
result.language = language;
|
|
521
|
+
result.theme = options.theme || 'github-dark';
|
|
522
|
+
result.highlighted = resultLines.map(l => l.content); // Placeholder - actual highlighting would use Shiki
|
|
523
|
+
}
|
|
524
|
+
return result;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Format a blame line annotation for display.
|
|
528
|
+
*
|
|
529
|
+
* @description Formats a single blame line in a human-readable format similar
|
|
530
|
+
* to git blame output: `<sha> (<author> <date>) <content>`
|
|
531
|
+
*
|
|
532
|
+
* @param annotation - The blame line annotation to format
|
|
533
|
+
* @param options - Formatting options
|
|
534
|
+
* @param options.showOriginalLineNumber - If true, shows both original and current line numbers
|
|
535
|
+
* @returns Formatted string for display
|
|
536
|
+
*
|
|
537
|
+
* @example
|
|
538
|
+
* const formatted = formatBlameLine(annotation)
|
|
539
|
+
* // Output: "abc12345 (John Doe 2024-01-15) const x = 1"
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* // With original line numbers (for renamed files)
|
|
543
|
+
* const formatted = formatBlameLine(annotation, { showOriginalLineNumber: true })
|
|
544
|
+
* // Output: "abc12345 (John Doe 2024-01-15 10 12) const x = 1"
|
|
545
|
+
*/
|
|
546
|
+
export function formatBlameLine(annotation, options = {}) {
|
|
547
|
+
const { shortSha, author, date, lineNumber, originalLineNumber, content } = annotation;
|
|
548
|
+
// Format date as YYYY-MM-DD or similar
|
|
549
|
+
const dateStr = date.toISOString().substring(0, 10);
|
|
550
|
+
// Pad author to fixed width
|
|
551
|
+
const authorStr = author.padEnd(15).substring(0, 15);
|
|
552
|
+
let result = `${shortSha} (${authorStr} ${dateStr}`;
|
|
553
|
+
if (options.showOriginalLineNumber) {
|
|
554
|
+
result += ` ${originalLineNumber.toString().padStart(4)} ${lineNumber.toString().padStart(4)}`;
|
|
555
|
+
}
|
|
556
|
+
result += `) ${content}`;
|
|
557
|
+
return result;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Parse a line range string into start and end values.
|
|
561
|
+
*
|
|
562
|
+
* @description Parses line range specifications used with the -L flag.
|
|
563
|
+
* Supports two formats:
|
|
564
|
+
* - Absolute: "start,end" (e.g., "10,20" for lines 10-20)
|
|
565
|
+
* - Relative: "start,+count" (e.g., "10,+5" for lines 10-15)
|
|
566
|
+
*
|
|
567
|
+
* @param rangeStr - Line range string in "start,end" or "start,+count" format
|
|
568
|
+
* @returns Parsed line range with start and end (1-indexed, inclusive)
|
|
569
|
+
* @throws {Error} If format is invalid (not two comma-separated values)
|
|
570
|
+
* @throws {Error} If start line is not a valid number
|
|
571
|
+
* @throws {Error} If end line or offset is not a valid number
|
|
572
|
+
*
|
|
573
|
+
* @example
|
|
574
|
+
* // Absolute range
|
|
575
|
+
* const range = parseLineRange('10,20')
|
|
576
|
+
* console.log(range) // { start: 10, end: 20 }
|
|
577
|
+
*
|
|
578
|
+
* @example
|
|
579
|
+
* // Relative range
|
|
580
|
+
* const range = parseLineRange('10,+5')
|
|
581
|
+
* console.log(range) // { start: 10, end: 15 }
|
|
582
|
+
*/
|
|
583
|
+
export function parseLineRange(rangeStr) {
|
|
584
|
+
const parts = rangeStr.split(',');
|
|
585
|
+
if (parts.length !== 2) {
|
|
586
|
+
throw new Error(`Invalid line range format: ${rangeStr}`);
|
|
587
|
+
}
|
|
588
|
+
const start = parseInt(parts[0], 10);
|
|
589
|
+
if (isNaN(start)) {
|
|
590
|
+
throw new Error(`Invalid start line: ${parts[0]}`);
|
|
591
|
+
}
|
|
592
|
+
let end;
|
|
593
|
+
if (parts[1].startsWith('+')) {
|
|
594
|
+
// Relative offset: start + offset
|
|
595
|
+
const offset = parseInt(parts[1].slice(1), 10);
|
|
596
|
+
if (isNaN(offset)) {
|
|
597
|
+
throw new Error(`Invalid line offset: ${parts[1]}`);
|
|
598
|
+
}
|
|
599
|
+
end = start + offset;
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
end = parseInt(parts[1], 10);
|
|
603
|
+
if (isNaN(end)) {
|
|
604
|
+
throw new Error(`Invalid end line: ${parts[1]}`);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return { start, end };
|
|
608
|
+
}
|
|
609
|
+
//# sourceMappingURL=blame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blame.js","sourceRoot":"","sources":["../../../src/cli/commands/blame.ts"],"names":[],"mappings":"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"}
|