@cesarandreslopez/occ 0.8.12 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -79
- package/dist/src/cli-validation.js +3 -11
- package/dist/src/cli-validation.js.map +1 -1
- package/dist/src/cli.js +23 -11
- package/dist/src/cli.js.map +1 -1
- package/dist/src/code/build.d.ts +6 -7
- package/dist/src/code/build.js +62 -28
- package/dist/src/code/build.js.map +1 -1
- package/dist/src/code/cache.js +3 -1
- package/dist/src/code/cache.js.map +1 -1
- package/dist/src/code/chunk.d.ts +2 -0
- package/dist/src/code/chunk.js +16 -4
- package/dist/src/code/chunk.js.map +1 -1
- package/dist/src/code/command.js +147 -37
- package/dist/src/code/command.js.map +1 -1
- package/dist/src/code/diff.d.ts +264 -0
- package/dist/src/code/diff.js +504 -0
- package/dist/src/code/diff.js.map +1 -0
- package/dist/src/code/discover.js +5 -5
- package/dist/src/code/discover.js.map +1 -1
- package/dist/src/code/focus.js +5 -5
- package/dist/src/code/focus.js.map +1 -1
- package/dist/src/code/incremental.js +11 -9
- package/dist/src/code/incremental.js.map +1 -1
- package/dist/src/code/index-io.d.ts +2 -0
- package/dist/src/code/index-io.js +2 -2
- package/dist/src/code/index-io.js.map +1 -1
- package/dist/src/code/isolated-runner.js.map +1 -1
- package/dist/src/code/isolated.js +2 -2
- package/dist/src/code/isolated.js.map +1 -1
- package/dist/src/code/languages.js +2 -2
- package/dist/src/code/languages.js.map +1 -1
- package/dist/src/code/map.d.ts +12 -0
- package/dist/src/code/map.js +22 -9
- package/dist/src/code/map.js.map +1 -1
- package/dist/src/code/output.d.ts +3 -0
- package/dist/src/code/output.js +39 -22
- package/dist/src/code/output.js.map +1 -1
- package/dist/src/code/parsers.js +87 -26
- package/dist/src/code/parsers.js.map +1 -1
- package/dist/src/code/query.js +44 -38
- package/dist/src/code/query.js.map +1 -1
- package/dist/src/code/rank.js +30 -17
- package/dist/src/code/rank.js.map +1 -1
- package/dist/src/code/session.js.map +1 -1
- package/dist/src/code/slim.d.ts +2 -0
- package/dist/src/code/slim.js +23 -8
- package/dist/src/code/slim.js.map +1 -1
- package/dist/src/code/store.d.ts +6 -8
- package/dist/src/code/store.js +57 -41
- package/dist/src/code/store.js.map +1 -1
- package/dist/src/code/types.js +15 -3
- package/dist/src/code/types.js.map +1 -1
- package/dist/src/doc/batch.js +6 -2
- package/dist/src/doc/batch.js.map +1 -1
- package/dist/src/doc/chunk.js +9 -5
- package/dist/src/doc/chunk.js.map +1 -1
- package/dist/src/doc/command.js +18 -9
- package/dist/src/doc/command.js.map +1 -1
- package/dist/src/doc/discover.d.ts +1 -1
- package/dist/src/doc/discover.js.map +1 -1
- package/dist/src/doc/entities.js +90 -10
- package/dist/src/doc/entities.js.map +1 -1
- package/dist/src/doc/inspect-docx.js +5 -4
- package/dist/src/doc/inspect-docx.js.map +1 -1
- package/dist/src/doc/inspect-odt.js.map +1 -1
- package/dist/src/doc/inspect-pdf.js +1 -1
- package/dist/src/doc/inspect-pdf.js.map +1 -1
- package/dist/src/doc/inspect.js +4 -4
- package/dist/src/doc/inspect.js.map +1 -1
- package/dist/src/doc/output.js +11 -8
- package/dist/src/doc/output.js.map +1 -1
- package/dist/src/doc/references.js +4 -4
- package/dist/src/doc/references.js.map +1 -1
- package/dist/src/errors.js +2 -4
- package/dist/src/errors.js.map +1 -1
- package/dist/src/git/api.d.ts +34 -0
- package/dist/src/git/api.js +247 -0
- package/dist/src/git/api.js.map +1 -0
- package/dist/src/git/client.d.ts +48 -0
- package/dist/src/git/client.js +336 -0
- package/dist/src/git/client.js.map +1 -0
- package/dist/src/git/command.d.ts +2 -0
- package/dist/src/git/command.js +173 -0
- package/dist/src/git/command.js.map +1 -0
- package/dist/src/git/index.d.ts +5 -0
- package/dist/src/git/index.js +6 -0
- package/dist/src/git/index.js.map +1 -0
- package/dist/src/git/output.d.ts +8 -0
- package/dist/src/git/output.js +38 -0
- package/dist/src/git/output.js.map +1 -0
- package/dist/src/git/parse.d.ts +19 -0
- package/dist/src/git/parse.js +354 -0
- package/dist/src/git/parse.js.map +1 -0
- package/dist/src/git/types.d.ts +334 -0
- package/dist/src/git/types.js +135 -0
- package/dist/src/git/types.js.map +1 -0
- package/dist/src/index.d.ts +38 -12
- package/dist/src/index.js +27 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/inspect/shared.js.map +1 -1
- package/dist/src/markdown/convert.js +17 -11
- package/dist/src/markdown/convert.js.map +1 -1
- package/dist/src/output/tabular.js +25 -17
- package/dist/src/output/tabular.js.map +1 -1
- package/dist/src/output/tree.js +7 -7
- package/dist/src/output/tree.js.map +1 -1
- package/dist/src/parsers/docx.js +1 -1
- package/dist/src/parsers/docx.js.map +1 -1
- package/dist/src/parsers/index.js +9 -7
- package/dist/src/parsers/index.js.map +1 -1
- package/dist/src/parsers/pdf.js +1 -1
- package/dist/src/parsers/pdf.js.map +1 -1
- package/dist/src/parsers/pptx.js.map +1 -1
- package/dist/src/parsers/xlsx.js +5 -3
- package/dist/src/parsers/xlsx.js.map +1 -1
- package/dist/src/scc.js +9 -5
- package/dist/src/scc.js.map +1 -1
- package/dist/src/sheet/command.js +11 -7
- package/dist/src/sheet/command.js.map +1 -1
- package/dist/src/sheet/inspect.js +14 -14
- package/dist/src/sheet/inspect.js.map +1 -1
- package/dist/src/sheet/output.js +10 -15
- package/dist/src/sheet/output.js.map +1 -1
- package/dist/src/skills/command.d.ts +2 -0
- package/dist/src/skills/command.js +188 -0
- package/dist/src/skills/command.js.map +1 -0
- package/dist/src/slide/command.js +8 -6
- package/dist/src/slide/command.js.map +1 -1
- package/dist/src/slide/inspect-odp.js.map +1 -1
- package/dist/src/slide/inspect-pptx.js +5 -2
- package/dist/src/slide/inspect-pptx.js.map +1 -1
- package/dist/src/slide/inspect.js +4 -2
- package/dist/src/slide/inspect.js.map +1 -1
- package/dist/src/slide/output.js +10 -15
- package/dist/src/slide/output.js.map +1 -1
- package/dist/src/slide/types.js.map +1 -1
- package/dist/src/stats.js +31 -3
- package/dist/src/stats.js.map +1 -1
- package/dist/src/table/command.js +8 -6
- package/dist/src/table/command.js.map +1 -1
- package/dist/src/table/inspect-docx.js +1 -1
- package/dist/src/table/inspect-docx.js.map +1 -1
- package/dist/src/table/inspect-odt.js.map +1 -1
- package/dist/src/table/inspect-pptx.js +5 -2
- package/dist/src/table/inspect-pptx.js.map +1 -1
- package/dist/src/table/inspect-xlsx.js +1 -1
- package/dist/src/table/inspect-xlsx.js.map +1 -1
- package/dist/src/table/inspect.js +3 -1
- package/dist/src/table/inspect.js.map +1 -1
- package/dist/src/table/output.js +7 -11
- package/dist/src/table/output.js.map +1 -1
- package/dist/src/table/types.js.map +1 -1
- package/dist/src/tokens.js +1 -1
- package/dist/src/tokens.js.map +1 -1
- package/dist/src/utils.d.ts +14 -0
- package/dist/src/utils.js +32 -11
- package/dist/src/utils.js.map +1 -1
- package/dist/src/walker.js +2 -4
- package/dist/src/walker.js.map +1 -1
- package/dist/src/workspace/analyze.js +4 -4
- package/dist/src/workspace/analyze.js.map +1 -1
- package/dist/src/workspace/bundle-io.d.ts +14 -0
- package/dist/src/workspace/bundle-io.js +81 -0
- package/dist/src/workspace/bundle-io.js.map +1 -0
- package/dist/src/workspace/bundle-runner.d.ts +5 -0
- package/dist/src/workspace/bundle-runner.js +50 -0
- package/dist/src/workspace/bundle-runner.js.map +1 -0
- package/dist/src/workspace/bundle.d.ts +14 -0
- package/dist/src/workspace/bundle.js +315 -71
- package/dist/src/workspace/bundle.js.map +1 -1
- package/dist/src/workspace/command.js +31 -16
- package/dist/src/workspace/command.js.map +1 -1
- package/dist/src/workspace/describe-output.js +10 -9
- package/dist/src/workspace/describe-output.js.map +1 -1
- package/dist/src/workspace/describe.js +54 -47
- package/dist/src/workspace/describe.js.map +1 -1
- package/dist/src/workspace/documents.js +28 -8
- package/dist/src/workspace/documents.js.map +1 -1
- package/dist/src/workspace/prepare-runner.js.map +1 -1
- package/dist/src/workspace/prepare-types.js.map +1 -1
- package/dist/src/workspace/prepare.js +38 -19
- package/dist/src/workspace/prepare.js.map +1 -1
- package/dist/src/workspace/types.js +4 -2
- package/dist/src/workspace/types.js.map +1 -1
- package/package.json +57 -4
- package/scripts/postinstall.js +13 -9
- package/skills/occ/SKILL.md +77 -0
- package/skills/occ/reference/code.md +69 -0
- package/skills/occ/reference/commands.md +66 -0
- package/skills/occ/reference/documents.md +65 -0
- package/skills/occ/reference/git.md +55 -0
- 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,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 @@
|
|
|
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":"AASA,MAAM,UAAU,kBAAkB,CAAC,KAAgC;IACjE,OAAO,KAAK;SACT,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC;IAC5C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,CAAC,YAAY,mBAAmB,OAAO,CAAC,UAAU,mBAAmB,OAAO,CAAC,YAAY,eAAe;KACnH,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAyB;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,OAAO,OAAO,CAAC,OAAO;SACnB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,WAAW,KAAK,CAAC,KAAK,EAAE,CAAC;SAChH,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;AAClD,CAAC"}
|
|
@@ -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
|