@cesarandreslopez/occ 0.8.12 → 0.9.0

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.
Files changed (178) hide show
  1. package/README.md +167 -79
  2. package/dist/src/cli-validation.js +3 -11
  3. package/dist/src/cli-validation.js.map +1 -1
  4. package/dist/src/cli.js +23 -11
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/code/build.js +28 -22
  7. package/dist/src/code/build.js.map +1 -1
  8. package/dist/src/code/cache.js +3 -1
  9. package/dist/src/code/cache.js.map +1 -1
  10. package/dist/src/code/chunk.js +4 -4
  11. package/dist/src/code/chunk.js.map +1 -1
  12. package/dist/src/code/command.js +147 -37
  13. package/dist/src/code/command.js.map +1 -1
  14. package/dist/src/code/diff.d.ts +264 -0
  15. package/dist/src/code/diff.js +504 -0
  16. package/dist/src/code/diff.js.map +1 -0
  17. package/dist/src/code/discover.js +5 -5
  18. package/dist/src/code/discover.js.map +1 -1
  19. package/dist/src/code/focus.js +5 -5
  20. package/dist/src/code/focus.js.map +1 -1
  21. package/dist/src/code/incremental.js +11 -9
  22. package/dist/src/code/incremental.js.map +1 -1
  23. package/dist/src/code/index-io.js.map +1 -1
  24. package/dist/src/code/isolated-runner.js.map +1 -1
  25. package/dist/src/code/isolated.js +2 -2
  26. package/dist/src/code/isolated.js.map +1 -1
  27. package/dist/src/code/languages.js +2 -2
  28. package/dist/src/code/languages.js.map +1 -1
  29. package/dist/src/code/map.d.ts +12 -0
  30. package/dist/src/code/map.js +22 -9
  31. package/dist/src/code/map.js.map +1 -1
  32. package/dist/src/code/output.d.ts +3 -0
  33. package/dist/src/code/output.js +39 -22
  34. package/dist/src/code/output.js.map +1 -1
  35. package/dist/src/code/parsers.js +87 -26
  36. package/dist/src/code/parsers.js.map +1 -1
  37. package/dist/src/code/query.js +44 -38
  38. package/dist/src/code/query.js.map +1 -1
  39. package/dist/src/code/rank.js +30 -17
  40. package/dist/src/code/rank.js.map +1 -1
  41. package/dist/src/code/session.js.map +1 -1
  42. package/dist/src/code/slim.js.map +1 -1
  43. package/dist/src/code/store.js +35 -23
  44. package/dist/src/code/store.js.map +1 -1
  45. package/dist/src/code/types.js +15 -3
  46. package/dist/src/code/types.js.map +1 -1
  47. package/dist/src/doc/batch.js +6 -2
  48. package/dist/src/doc/batch.js.map +1 -1
  49. package/dist/src/doc/chunk.js +9 -5
  50. package/dist/src/doc/chunk.js.map +1 -1
  51. package/dist/src/doc/command.js +18 -9
  52. package/dist/src/doc/command.js.map +1 -1
  53. package/dist/src/doc/discover.d.ts +1 -1
  54. package/dist/src/doc/discover.js.map +1 -1
  55. package/dist/src/doc/entities.js +90 -10
  56. package/dist/src/doc/entities.js.map +1 -1
  57. package/dist/src/doc/inspect-docx.js +5 -4
  58. package/dist/src/doc/inspect-docx.js.map +1 -1
  59. package/dist/src/doc/inspect-odt.js.map +1 -1
  60. package/dist/src/doc/inspect-pdf.js +1 -1
  61. package/dist/src/doc/inspect-pdf.js.map +1 -1
  62. package/dist/src/doc/inspect.js +4 -4
  63. package/dist/src/doc/inspect.js.map +1 -1
  64. package/dist/src/doc/output.js +11 -8
  65. package/dist/src/doc/output.js.map +1 -1
  66. package/dist/src/doc/references.js +4 -4
  67. package/dist/src/doc/references.js.map +1 -1
  68. package/dist/src/errors.js +2 -4
  69. package/dist/src/errors.js.map +1 -1
  70. package/dist/src/git/api.d.ts +34 -0
  71. package/dist/src/git/api.js +247 -0
  72. package/dist/src/git/api.js.map +1 -0
  73. package/dist/src/git/client.d.ts +48 -0
  74. package/dist/src/git/client.js +336 -0
  75. package/dist/src/git/client.js.map +1 -0
  76. package/dist/src/git/command.d.ts +2 -0
  77. package/dist/src/git/command.js +173 -0
  78. package/dist/src/git/command.js.map +1 -0
  79. package/dist/src/git/index.d.ts +5 -0
  80. package/dist/src/git/index.js +6 -0
  81. package/dist/src/git/index.js.map +1 -0
  82. package/dist/src/git/output.d.ts +8 -0
  83. package/dist/src/git/output.js +38 -0
  84. package/dist/src/git/output.js.map +1 -0
  85. package/dist/src/git/parse.d.ts +19 -0
  86. package/dist/src/git/parse.js +354 -0
  87. package/dist/src/git/parse.js.map +1 -0
  88. package/dist/src/git/types.d.ts +334 -0
  89. package/dist/src/git/types.js +135 -0
  90. package/dist/src/git/types.js.map +1 -0
  91. package/dist/src/index.d.ts +29 -7
  92. package/dist/src/index.js +20 -3
  93. package/dist/src/index.js.map +1 -1
  94. package/dist/src/inspect/shared.js.map +1 -1
  95. package/dist/src/markdown/convert.js +17 -11
  96. package/dist/src/markdown/convert.js.map +1 -1
  97. package/dist/src/output/tabular.js +25 -17
  98. package/dist/src/output/tabular.js.map +1 -1
  99. package/dist/src/output/tree.js +7 -7
  100. package/dist/src/output/tree.js.map +1 -1
  101. package/dist/src/parsers/docx.js +1 -1
  102. package/dist/src/parsers/docx.js.map +1 -1
  103. package/dist/src/parsers/index.js +9 -7
  104. package/dist/src/parsers/index.js.map +1 -1
  105. package/dist/src/parsers/pdf.js +1 -1
  106. package/dist/src/parsers/pdf.js.map +1 -1
  107. package/dist/src/parsers/pptx.js.map +1 -1
  108. package/dist/src/parsers/xlsx.js +5 -3
  109. package/dist/src/parsers/xlsx.js.map +1 -1
  110. package/dist/src/scc.js +9 -5
  111. package/dist/src/scc.js.map +1 -1
  112. package/dist/src/sheet/command.js +11 -7
  113. package/dist/src/sheet/command.js.map +1 -1
  114. package/dist/src/sheet/inspect.js +14 -14
  115. package/dist/src/sheet/inspect.js.map +1 -1
  116. package/dist/src/sheet/output.js +10 -15
  117. package/dist/src/sheet/output.js.map +1 -1
  118. package/dist/src/skills/command.d.ts +2 -0
  119. package/dist/src/skills/command.js +188 -0
  120. package/dist/src/skills/command.js.map +1 -0
  121. package/dist/src/slide/command.js +8 -6
  122. package/dist/src/slide/command.js.map +1 -1
  123. package/dist/src/slide/inspect-odp.js.map +1 -1
  124. package/dist/src/slide/inspect-pptx.js +5 -2
  125. package/dist/src/slide/inspect-pptx.js.map +1 -1
  126. package/dist/src/slide/inspect.js +4 -2
  127. package/dist/src/slide/inspect.js.map +1 -1
  128. package/dist/src/slide/output.js +10 -15
  129. package/dist/src/slide/output.js.map +1 -1
  130. package/dist/src/slide/types.js.map +1 -1
  131. package/dist/src/stats.js +31 -3
  132. package/dist/src/stats.js.map +1 -1
  133. package/dist/src/table/command.js +8 -6
  134. package/dist/src/table/command.js.map +1 -1
  135. package/dist/src/table/inspect-docx.js +1 -1
  136. package/dist/src/table/inspect-docx.js.map +1 -1
  137. package/dist/src/table/inspect-odt.js.map +1 -1
  138. package/dist/src/table/inspect-pptx.js +5 -2
  139. package/dist/src/table/inspect-pptx.js.map +1 -1
  140. package/dist/src/table/inspect-xlsx.js +1 -1
  141. package/dist/src/table/inspect-xlsx.js.map +1 -1
  142. package/dist/src/table/inspect.js +3 -1
  143. package/dist/src/table/inspect.js.map +1 -1
  144. package/dist/src/table/output.js +7 -11
  145. package/dist/src/table/output.js.map +1 -1
  146. package/dist/src/table/types.js.map +1 -1
  147. package/dist/src/tokens.js +1 -1
  148. package/dist/src/tokens.js.map +1 -1
  149. package/dist/src/utils.js +6 -11
  150. package/dist/src/utils.js.map +1 -1
  151. package/dist/src/walker.js +2 -4
  152. package/dist/src/walker.js.map +1 -1
  153. package/dist/src/workspace/analyze.js +4 -4
  154. package/dist/src/workspace/analyze.js.map +1 -1
  155. package/dist/src/workspace/bundle.js +57 -60
  156. package/dist/src/workspace/bundle.js.map +1 -1
  157. package/dist/src/workspace/command.js +31 -16
  158. package/dist/src/workspace/command.js.map +1 -1
  159. package/dist/src/workspace/describe-output.js +10 -9
  160. package/dist/src/workspace/describe-output.js.map +1 -1
  161. package/dist/src/workspace/describe.js +54 -47
  162. package/dist/src/workspace/describe.js.map +1 -1
  163. package/dist/src/workspace/documents.js +28 -8
  164. package/dist/src/workspace/documents.js.map +1 -1
  165. package/dist/src/workspace/prepare-runner.js.map +1 -1
  166. package/dist/src/workspace/prepare-types.js.map +1 -1
  167. package/dist/src/workspace/prepare.js +38 -19
  168. package/dist/src/workspace/prepare.js.map +1 -1
  169. package/dist/src/workspace/types.js +4 -2
  170. package/dist/src/workspace/types.js.map +1 -1
  171. package/package.json +57 -4
  172. package/scripts/postinstall.js +13 -9
  173. package/skills/occ/SKILL.md +77 -0
  174. package/skills/occ/reference/code.md +69 -0
  175. package/skills/occ/reference/commands.md +66 -0
  176. package/skills/occ/reference/documents.md +65 -0
  177. package/skills/occ/reference/git.md +55 -0
  178. package/skills/occ/reference/workspace.md +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/git/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerGitCommands(program: Command): void;
@@ -0,0 +1,173 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { Option } from 'commander';
3
+ import { z } from 'zod';
4
+ import { writeStream } from '../utils.js';
5
+ import { getGitChangedFiles, getGitChurnSummary, getGitCommitHistory, getGitDiffPatch, getGitDiffSummary, getGitFileHistory, } from './api.js';
6
+ import { formatChangedFiles, formatChurnSummary, formatCommitHistory, formatDiffPatch, formatDiffSummary, formatFileHistory, formatGitJson, } from './output.js';
7
+ const GitCommandOptionsSchema = z
8
+ .object({
9
+ path: z.string().optional(),
10
+ base: z.string().optional(),
11
+ head: z.string().optional(),
12
+ staged: z.boolean().optional(),
13
+ format: z.string().optional(),
14
+ output: z.string().optional(),
15
+ limit: z.string().optional(),
16
+ since: z.string().optional(),
17
+ patch: z.boolean().optional(),
18
+ mapTokens: z.string().optional(),
19
+ tokenizer: z.string().optional(),
20
+ sort: z.string().optional(),
21
+ follow: z.boolean().optional(),
22
+ lineStart: z.string().optional(),
23
+ lineEnd: z.string().optional(),
24
+ })
25
+ .passthrough();
26
+ function getOptions(command) {
27
+ return GitCommandOptionsSchema.parse(command.optsWithGlobals());
28
+ }
29
+ async function emit(output, options) {
30
+ const text = output.endsWith('\n') ? output : `${output}\n`;
31
+ if (options.output) {
32
+ await writeFile(options.output, text);
33
+ return;
34
+ }
35
+ await writeStream(process.stdout, text);
36
+ }
37
+ function addSharedGitOptions(command) {
38
+ command
39
+ .option('--path <repo-root>', 'repository root', process.cwd())
40
+ .option('--base <ref>', 'base ref for the diff range')
41
+ .option('--head <ref>', 'head ref for the diff range')
42
+ .option('--staged', 'inspect staged changes')
43
+ .addOption(new Option('--format <type>', 'output format').choices(['tabular', 'json']).default('tabular'))
44
+ .option('-o, --output <file>', 'write output to file');
45
+ }
46
+ function commonApiOptions(options) {
47
+ return {
48
+ repoRoot: options.path,
49
+ base: options.base,
50
+ head: options.head,
51
+ staged: options.staged,
52
+ };
53
+ }
54
+ function parsePositiveIntOption(value, fallback, label) {
55
+ if (value == null || value === '')
56
+ return fallback;
57
+ const parsed = Number.parseInt(value, 10);
58
+ if (!Number.isFinite(parsed) || parsed <= 0) {
59
+ throw new Error(`Invalid ${label}: expected a positive integer.`);
60
+ }
61
+ return parsed;
62
+ }
63
+ // The root scan defines a global `--sort` option that is inherited by every subcommand and
64
+ // wins option parsing, so `git churn` cannot rely on commander to validate its own keys. We
65
+ // resolve the value here instead, defaulting to `churn` for anything that is not a churn key
66
+ // (including the scan's default of `files`).
67
+ function resolveChurnSort(value) {
68
+ switch (value) {
69
+ case 'commits':
70
+ case 'added':
71
+ case 'deleted':
72
+ case 'net':
73
+ case 'churn':
74
+ return value;
75
+ default:
76
+ return 'churn';
77
+ }
78
+ }
79
+ export function registerGitCommands(program) {
80
+ const git = program.command('git').description('Inspect git changes, history, and churn');
81
+ const changed = git.command('changed').description('List changed files for the resolved diff range');
82
+ addSharedGitOptions(changed);
83
+ changed.action(async (_options, command) => {
84
+ const options = getOptions(command);
85
+ const files = await getGitChangedFiles(commonApiOptions(options));
86
+ const output = options.format === 'json' ? formatGitJson({ files }) : formatChangedFiles(files);
87
+ await emit(output, options);
88
+ });
89
+ const diff = git.command('diff').description('Summarize or render the resolved diff');
90
+ addSharedGitOptions(diff);
91
+ diff.option('--patch', 'emit the raw patch instead of a summary');
92
+ diff.option('--map-tokens <n>', 'token budget for --patch');
93
+ diff.addOption(new Option('--tokenizer <name>', 'token counter for --map-tokens').choices([
94
+ 'heuristic',
95
+ 'o200k_base',
96
+ 'cl100k_base',
97
+ ]));
98
+ diff.action(async (_options, command) => {
99
+ const options = getOptions(command);
100
+ if (options.patch) {
101
+ const result = await getGitDiffPatch({
102
+ ...commonApiOptions(options),
103
+ tokenBudget: options.mapTokens ? parsePositiveIntOption(options.mapTokens, 0, 'map tokens') : undefined,
104
+ tokenizer: options.tokenizer,
105
+ });
106
+ const output = options.format === 'json' ? formatGitJson(result) : formatDiffPatch(result);
107
+ await emit(output, options);
108
+ return;
109
+ }
110
+ const summary = await getGitDiffSummary(commonApiOptions(options));
111
+ const output = options.format === 'json' ? formatGitJson(summary) : formatDiffSummary(summary);
112
+ await emit(output, options);
113
+ });
114
+ const history = git
115
+ .command('history')
116
+ .argument('[file]', 'optional file path to filter history')
117
+ .description('Show commit history for a range or file');
118
+ addSharedGitOptions(history);
119
+ history.option('--limit <n>', 'maximum commits to return', '50');
120
+ history.option('--since <date>', 'only include commits after this date');
121
+ history.option('--follow', 'follow a single file across renames');
122
+ history.option('--line-start <n>', 'start line for git log -L file history');
123
+ history.option('--line-end <n>', 'end line for git log -L file history');
124
+ history.action(async (file, _options, command) => {
125
+ const options = getOptions(command);
126
+ const limit = parsePositiveIntOption(options.limit, 50, 'limit');
127
+ if (file) {
128
+ const hasLineRange = options.lineStart != null || options.lineEnd != null;
129
+ const result = await getGitFileHistory({
130
+ ...commonApiOptions(options),
131
+ path: file,
132
+ follow: options.follow,
133
+ since: options.since,
134
+ limit,
135
+ lineRange: hasLineRange
136
+ ? {
137
+ start: parsePositiveIntOption(options.lineStart, 1, 'line start'),
138
+ end: parsePositiveIntOption(options.lineEnd, parsePositiveIntOption(options.lineStart, 1, 'line end'), 'line end'),
139
+ }
140
+ : undefined,
141
+ });
142
+ const output = options.format === 'json' ? formatGitJson(result) : formatFileHistory(result);
143
+ await emit(output, options);
144
+ return;
145
+ }
146
+ const result = await getGitCommitHistory({
147
+ ...commonApiOptions(options),
148
+ since: options.since,
149
+ limit,
150
+ });
151
+ const output = options.format === 'json' ? formatGitJson(result) : formatCommitHistory(result);
152
+ await emit(output, options);
153
+ });
154
+ const churn = git.command('churn').description('Rank changed files by churn');
155
+ addSharedGitOptions(churn);
156
+ churn.option('--limit <n>', 'maximum files to return');
157
+ churn.option('--since <date>', 'only include commits after this date');
158
+ // Declared without .choices() because the inherited global `--sort` (from the default scan)
159
+ // wins parsing; resolveChurnSort validates the value in the action instead.
160
+ churn.option('--sort <key>', 'sort by: churn, commits, added, deleted, or net (default: churn)');
161
+ churn.action(async (_options, command) => {
162
+ const options = getOptions(command);
163
+ const result = await getGitChurnSummary({
164
+ ...commonApiOptions(options),
165
+ since: options.since,
166
+ limit: options.limit ? parsePositiveIntOption(options.limit, 0, 'limit') : undefined,
167
+ sort: resolveChurnSort(options.sort),
168
+ });
169
+ const output = options.format === 'json' ? formatGitJson(result) : formatChurnSummary(result);
170
+ await emit(output, options);
171
+ });
172
+ }
173
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/git/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './client.js';
3
+ export * from './parse.js';
4
+ export * from './api.js';
5
+ export * from './output.js';
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './client.js';
3
+ export * from './parse.js';
4
+ export * from './api.js';
5
+ export * from './output.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/git/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { GitChangedFile, GitChurnSummary, GitCommitHistory, GitDiffPatch, GitDiffSummary, GitFileHistory } from './types.js';
2
+ export declare function formatChangedFiles(files: readonly GitChangedFile[]): string;
3
+ export declare function formatDiffSummary(summary: GitDiffSummary): string;
4
+ export declare function formatDiffPatch(patch: GitDiffPatch): string;
5
+ export declare function formatCommitHistory(history: GitCommitHistory): string;
6
+ export declare function formatFileHistory(history: GitFileHistory): string;
7
+ export declare function formatChurnSummary(summary: GitChurnSummary): string;
8
+ export declare function formatGitJson(value: unknown): string;
@@ -0,0 +1,38 @@
1
+ export function formatChangedFiles(files) {
2
+ return files
3
+ .map(file => {
4
+ const path = file.oldPath ? `${file.oldPath} -> ${file.path}` : file.path;
5
+ const suffix = file.binary ? ' [binary]' : '';
6
+ return `${file.status}\t${path}${suffix}`;
7
+ })
8
+ .join('\n');
9
+ }
10
+ export function formatDiffSummary(summary) {
11
+ const lines = [
12
+ `${summary.filesChanged} files changed, ${summary.totalAdded} insertions(+), ${summary.totalDeleted} deletions(-)`,
13
+ ];
14
+ for (const file of summary.files) {
15
+ const churn = summary.numstat.find(entry => entry.path === file.path);
16
+ const counts = churn ? (churn.binary ? 'binary' : `+${churn.added ?? 0}/-${churn.deleted ?? 0}`) : '';
17
+ lines.push(`${file.status}\t${file.oldPath ? `${file.oldPath} -> ${file.path}` : file.path}${counts ? `\t${counts}` : ''}`);
18
+ }
19
+ return lines.join('\n');
20
+ }
21
+ export function formatDiffPatch(patch) {
22
+ return patch.patch;
23
+ }
24
+ export function formatCommitHistory(history) {
25
+ return history.commits.map(commit => `${commit.shortHash} ${commit.authorDate} ${commit.subject}`).join('\n');
26
+ }
27
+ export function formatFileHistory(history) {
28
+ return history.entries.map(entry => `${entry.shortHash} ${entry.authorDate} ${entry.subject}`).join('\n');
29
+ }
30
+ export function formatChurnSummary(summary) {
31
+ return summary.entries
32
+ .map(entry => `${entry.path}\t${entry.commits} commits\t+${entry.added}/-${entry.deleted}\tchurn ${entry.churn}`)
33
+ .join('\n');
34
+ }
35
+ export function formatGitJson(value) {
36
+ return JSON.stringify(value, null, 2) ?? 'null';
37
+ }
38
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/git/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { GitChangedFile, GitChurnSort, GitChurnSummary, GitCommit, GitDiffHunks, GitNumstat, GitRange } from './types.js';
2
+ export interface GitLogNumstatRecord {
3
+ commit: GitCommit;
4
+ numstat: GitNumstat[];
5
+ }
6
+ export declare class GitParseError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare function splitNul(input: Buffer): Buffer[];
10
+ export declare function decodeGitPath(input: Buffer | string): string;
11
+ export declare function parseNameStatusZ(_input: Buffer): GitChangedFile[];
12
+ export declare function parseNumstatZ(_input: Buffer): GitNumstat[];
13
+ export interface ParseDiffPatchHunksOptions {
14
+ includeLineText?: boolean;
15
+ }
16
+ export declare function parseDiffPatchHunks(_patch: string, _range: GitRange, _options?: ParseDiffPatchHunksOptions): GitDiffHunks;
17
+ export declare function parseLogRecords(_input: Buffer): GitCommit[];
18
+ export declare function parseLogNumstatZ(_input: Buffer): GitLogNumstatRecord[];
19
+ export declare function aggregateChurn(_records: readonly GitLogNumstatRecord[], _range: GitRange, _sortedBy?: GitChurnSort): GitChurnSummary;
@@ -0,0 +1,354 @@
1
+ const UNIT_SEPARATOR = '\x1f';
2
+ export class GitParseError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'GitParseError';
6
+ }
7
+ }
8
+ export function splitNul(input) {
9
+ const fields = [];
10
+ let start = 0;
11
+ for (let i = 0; i < input.length; i++) {
12
+ if (input[i] !== 0)
13
+ continue;
14
+ fields.push(input.subarray(start, i));
15
+ start = i + 1;
16
+ }
17
+ if (start < input.length)
18
+ fields.push(input.subarray(start));
19
+ return fields;
20
+ }
21
+ export function decodeGitPath(input) {
22
+ return Buffer.isBuffer(input) ? input.toString('utf8') : input;
23
+ }
24
+ function statusFromCode(status) {
25
+ switch (status[0]) {
26
+ case 'A':
27
+ return 'added';
28
+ case 'M':
29
+ return 'modified';
30
+ case 'D':
31
+ return 'deleted';
32
+ case 'R':
33
+ return 'renamed';
34
+ case 'C':
35
+ return 'copied';
36
+ case 'T':
37
+ return 'type-changed';
38
+ case 'U':
39
+ return 'unmerged';
40
+ default:
41
+ return 'unknown';
42
+ }
43
+ }
44
+ function parseSimilarity(status) {
45
+ if (status.length <= 1)
46
+ return undefined;
47
+ const value = Number.parseInt(status.slice(1), 10);
48
+ return Number.isFinite(value) ? value : undefined;
49
+ }
50
+ function parseCount(value) {
51
+ if (value === '-')
52
+ return null;
53
+ const parsed = Number.parseInt(value, 10);
54
+ if (!Number.isFinite(parsed)) {
55
+ throw new GitParseError(`Invalid numstat count "${value}".`);
56
+ }
57
+ return parsed;
58
+ }
59
+ function parseNumstatAt(fields, index) {
60
+ const countsAndMaybePath = decodeGitPath(fields[index] ?? Buffer.alloc(0));
61
+ const parts = countsAndMaybePath.split('\t');
62
+ if (parts.length < 2) {
63
+ throw new GitParseError(`Malformed numstat record "${countsAndMaybePath}".`);
64
+ }
65
+ const added = parseCount(parts[0]);
66
+ const deleted = parseCount(parts[1]);
67
+ const binary = added == null || deleted == null;
68
+ const isRename = parts.length < 3 || parts[2] === '';
69
+ if (isRename) {
70
+ const oldPath = fields[index + 1];
71
+ const newPath = fields[index + 2];
72
+ if (!oldPath || !newPath) {
73
+ throw new GitParseError('Malformed rename numstat record.');
74
+ }
75
+ return {
76
+ stat: {
77
+ path: decodeGitPath(newPath),
78
+ oldPath: decodeGitPath(oldPath),
79
+ added,
80
+ deleted,
81
+ binary,
82
+ },
83
+ nextIndex: index + 3,
84
+ };
85
+ }
86
+ return {
87
+ stat: {
88
+ path: parts.slice(2).join('\t'),
89
+ added,
90
+ deleted,
91
+ binary,
92
+ },
93
+ nextIndex: index + 1,
94
+ };
95
+ }
96
+ function parseCommitField(field) {
97
+ const parts = field.split(UNIT_SEPARATOR);
98
+ if (parts.length < 7) {
99
+ throw new GitParseError('Malformed git log record.');
100
+ }
101
+ const [hash, shortHash, authorName, authorEmail, authorDate, committerDate, subject, ...bodyParts] = parts;
102
+ const body = bodyParts.join(UNIT_SEPARATOR);
103
+ const commit = {
104
+ hash,
105
+ shortHash,
106
+ authorName,
107
+ authorEmail,
108
+ authorDate,
109
+ committerDate,
110
+ subject,
111
+ };
112
+ if (body.length > 0)
113
+ commit.body = body;
114
+ return commit;
115
+ }
116
+ function isCommitField(field) {
117
+ return field.includes(UNIT_SEPARATOR) && field.split(UNIT_SEPARATOR).length >= 7;
118
+ }
119
+ function stripGitPathPrefix(value) {
120
+ if (value === '/dev/null')
121
+ return undefined;
122
+ if (value.startsWith('a/') || value.startsWith('b/'))
123
+ return value.slice(2);
124
+ return value;
125
+ }
126
+ function parseHeaderPath(line, prefix) {
127
+ const raw = line.slice(prefix.length);
128
+ const pathOnly = raw.split('\t')[0];
129
+ return stripGitPathPrefix(pathOnly);
130
+ }
131
+ function parseDiffGitLine(line) {
132
+ const match = line.match(/^diff --git a\/(.+) b\/(.+)$/);
133
+ if (!match)
134
+ return undefined;
135
+ return { oldPath: match[1], newPath: match[2] };
136
+ }
137
+ function createHunk(path, oldPath, header) {
138
+ const match = header.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
139
+ if (!match) {
140
+ throw new GitParseError(`Malformed diff hunk header "${header}".`);
141
+ }
142
+ const oldStart = Number.parseInt(match[1], 10);
143
+ const oldLines = match[2] == null ? 1 : Number.parseInt(match[2], 10);
144
+ const newStart = Number.parseInt(match[3], 10);
145
+ const newLines = match[4] == null ? 1 : Number.parseInt(match[4], 10);
146
+ const hunk = {
147
+ path,
148
+ oldStart,
149
+ oldLines,
150
+ newStart,
151
+ newLines,
152
+ newEnd: newStart + Math.max(newLines, 1) - 1,
153
+ header,
154
+ addedLines: [],
155
+ deletedLines: [],
156
+ };
157
+ if (oldPath)
158
+ hunk.oldPath = oldPath;
159
+ return hunk;
160
+ }
161
+ export function parseNameStatusZ(_input) {
162
+ const fields = splitNul(_input);
163
+ const files = [];
164
+ for (let i = 0; i < fields.length;) {
165
+ const status = decodeGitPath(fields[i]);
166
+ if (status.length === 0) {
167
+ i++;
168
+ continue;
169
+ }
170
+ const statusCode = statusFromCode(status);
171
+ if (status[0] === 'R' || status[0] === 'C') {
172
+ const oldPath = fields[i + 1];
173
+ const newPath = fields[i + 2];
174
+ if (!oldPath || !newPath) {
175
+ throw new GitParseError(`Malformed ${status[0] === 'R' ? 'rename' : 'copy'} name-status record.`);
176
+ }
177
+ const change = {
178
+ status: statusCode,
179
+ path: decodeGitPath(newPath),
180
+ oldPath: decodeGitPath(oldPath),
181
+ };
182
+ const similarity = parseSimilarity(status);
183
+ if (similarity != null)
184
+ change.similarity = similarity;
185
+ files.push(change);
186
+ i += 3;
187
+ continue;
188
+ }
189
+ const path = fields[i + 1];
190
+ if (!path)
191
+ throw new GitParseError(`Malformed name-status record "${status}".`);
192
+ files.push({ status: statusCode, path: decodeGitPath(path) });
193
+ i += 2;
194
+ }
195
+ return files;
196
+ }
197
+ export function parseNumstatZ(_input) {
198
+ const fields = splitNul(_input);
199
+ const stats = [];
200
+ for (let i = 0; i < fields.length;) {
201
+ const parsed = parseNumstatAt(fields, i);
202
+ stats.push(parsed.stat);
203
+ i = parsed.nextIndex;
204
+ }
205
+ return stats;
206
+ }
207
+ export function parseDiffPatchHunks(_patch, _range, _options = {}) {
208
+ const files = [];
209
+ let currentFile;
210
+ let currentHunk;
211
+ let oldLine = 0;
212
+ let newLine = 0;
213
+ const finishHunk = () => {
214
+ if (!currentFile || !currentHunk)
215
+ return;
216
+ currentFile.hunks.push(currentHunk);
217
+ currentHunk = undefined;
218
+ };
219
+ const startFile = (path, oldPath) => {
220
+ finishHunk();
221
+ currentFile = { path, binary: false, hunks: [] };
222
+ if (oldPath && oldPath !== path)
223
+ currentFile.oldPath = oldPath;
224
+ files.push(currentFile);
225
+ };
226
+ for (const line of _patch.split(/\r?\n/)) {
227
+ if (line.startsWith('diff --git ')) {
228
+ const parsed = parseDiffGitLine(line);
229
+ startFile(parsed?.newPath ?? parsed?.oldPath ?? '', parsed?.oldPath);
230
+ continue;
231
+ }
232
+ if (!currentFile)
233
+ continue;
234
+ if (line.startsWith('Binary files ')) {
235
+ currentFile.binary = true;
236
+ continue;
237
+ }
238
+ if (!currentHunk && line.startsWith('--- ')) {
239
+ const oldPath = parseHeaderPath(line, '--- ');
240
+ if (oldPath && oldPath !== currentFile.path)
241
+ currentFile.oldPath = oldPath;
242
+ continue;
243
+ }
244
+ if (!currentHunk && line.startsWith('+++ ')) {
245
+ const newPath = parseHeaderPath(line, '+++ ');
246
+ if (newPath)
247
+ currentFile.path = newPath;
248
+ continue;
249
+ }
250
+ if (line.startsWith('@@ ')) {
251
+ finishHunk();
252
+ currentHunk = createHunk(currentFile.path, currentFile.oldPath, line);
253
+ oldLine = currentHunk.oldStart;
254
+ newLine = currentHunk.newStart;
255
+ continue;
256
+ }
257
+ if (!currentHunk)
258
+ continue;
259
+ if (line.startsWith('+')) {
260
+ currentHunk.addedLines.push(newLine);
261
+ newLine++;
262
+ }
263
+ else if (line.startsWith('-')) {
264
+ if (_options.includeLineText) {
265
+ currentHunk.deletedLineTexts ??= [];
266
+ currentHunk.deletedLineTexts.push({ line: oldLine, text: line.slice(1) });
267
+ }
268
+ currentHunk.deletedLines.push(oldLine);
269
+ oldLine++;
270
+ }
271
+ else if (line.startsWith(' ')) {
272
+ oldLine++;
273
+ newLine++;
274
+ }
275
+ }
276
+ finishHunk();
277
+ return { range: _range, files: files.filter(file => file.path.length > 0) };
278
+ }
279
+ export function parseLogRecords(_input) {
280
+ return splitNul(_input)
281
+ .map(field => decodeGitPath(field))
282
+ .filter(field => field.length > 0)
283
+ .map(field => parseCommitField(field));
284
+ }
285
+ export function parseLogNumstatZ(_input) {
286
+ const fields = splitNul(_input);
287
+ const records = [];
288
+ let current;
289
+ for (let i = 0; i < fields.length;) {
290
+ const field = decodeGitPath(fields[i]);
291
+ if (field.length === 0) {
292
+ i++;
293
+ continue;
294
+ }
295
+ if (isCommitField(field)) {
296
+ current = { commit: parseCommitField(field), numstat: [] };
297
+ records.push(current);
298
+ i++;
299
+ continue;
300
+ }
301
+ if (!current) {
302
+ throw new GitParseError('Encountered numstat record before a commit record.');
303
+ }
304
+ const parsed = parseNumstatAt(fields, i);
305
+ current.numstat.push(parsed.stat);
306
+ i = parsed.nextIndex;
307
+ }
308
+ return records;
309
+ }
310
+ export function aggregateChurn(_records, _range, _sortedBy = 'churn') {
311
+ const byPath = new Map();
312
+ for (const record of _records) {
313
+ const touchedInCommit = new Set();
314
+ for (const stat of record.numstat) {
315
+ const entry = byPath.get(stat.path) ?? {
316
+ path: stat.path,
317
+ commits: 0,
318
+ added: 0,
319
+ deleted: 0,
320
+ lastTouched: record.commit.authorDate,
321
+ };
322
+ entry.added += stat.added ?? 0;
323
+ entry.deleted += stat.deleted ?? 0;
324
+ if (!touchedInCommit.has(stat.path)) {
325
+ entry.commits++;
326
+ touchedInCommit.add(stat.path);
327
+ }
328
+ if (record.commit.authorDate > entry.lastTouched) {
329
+ entry.lastTouched = record.commit.authorDate;
330
+ }
331
+ byPath.set(stat.path, entry);
332
+ }
333
+ }
334
+ const entries = [...byPath.values()].map(entry => ({
335
+ path: entry.path,
336
+ commits: entry.commits,
337
+ added: entry.added,
338
+ deleted: entry.deleted,
339
+ net: entry.added - entry.deleted,
340
+ churn: entry.added + entry.deleted,
341
+ lastTouched: entry.lastTouched,
342
+ }));
343
+ entries.sort((a, b) => {
344
+ const diff = b[_sortedBy] - a[_sortedBy];
345
+ return diff !== 0 ? diff : a.path.localeCompare(b.path);
346
+ });
347
+ return {
348
+ range: _range,
349
+ entries,
350
+ totalCommits: _records.length,
351
+ sortedBy: _sortedBy,
352
+ };
353
+ }
354
+ //# sourceMappingURL=parse.js.map