@jawkx1999/opencr 0.1.0-alpha.0 → 0.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/client/assets/index-BnzvJWAx.js +1974 -0
- package/dist/client/assets/index-FRegO2ve.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/cli/index.js +59 -5
- package/dist/server/cli/index.js.map +1 -1
- package/dist/server/cli/utils.js +1 -306
- package/dist/server/cli/utils.js.map +1 -1
- package/dist/server/core/reviewPayload.js +5 -1
- package/dist/server/core/reviewPayload.js.map +1 -1
- package/dist/server/core/reviewRequest.js +1 -5
- package/dist/server/core/reviewRequest.js.map +1 -1
- package/dist/server/core/reviewSource/commandErrors.js +24 -0
- package/dist/server/core/reviewSource/commandErrors.js.map +1 -0
- package/dist/server/core/reviewSource/commitish.js +107 -0
- package/dist/server/core/reviewSource/commitish.js.map +1 -0
- package/dist/server/core/reviewSource/contentSummary.js +13 -0
- package/dist/server/core/reviewSource/contentSummary.js.map +1 -0
- package/dist/server/core/reviewSource/gitDiff.js +92 -0
- package/dist/server/core/reviewSource/gitDiff.js.map +1 -0
- package/dist/server/core/reviewSource/githubPr.js +48 -0
- package/dist/server/core/reviewSource/githubPr.js.map +1 -0
- package/dist/server/core/reviewSource/index.js +6 -0
- package/dist/server/core/reviewSource/index.js.map +1 -0
- package/dist/server/core/reviewSource/stdin.js +32 -0
- package/dist/server/core/reviewSource/stdin.js.map +1 -0
- package/dist/server/core/server.js +25 -6
- package/dist/server/core/server.js.map +1 -1
- package/dist/server/core/workspace/identity.js +47 -0
- package/dist/server/core/workspace/identity.js.map +1 -0
- package/dist/server/core/workspace/repository.js +309 -0
- package/dist/server/core/workspace/repository.js.map +1 -0
- package/dist/server/server/app.js +47 -2
- package/dist/server/server/app.js.map +1 -1
- package/package.json +2 -1
- package/dist/client/assets/index-BISvyTuG.css +0 -1
- package/dist/client/assets/index-Co9fPoWo.js +0 -1970
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Data, Effect } from 'effect';
|
|
2
|
-
import { buildContentSummary, detectStdinSource, determineDiffWatchMode, getGitRoot, getPrPatch, inferBaseCommitish, parseGitHubPrUrl, readStdin, shouldReadStdin, validateDiffArguments, } from '
|
|
2
|
+
import { buildContentSummary, detectStdinSource, determineDiffWatchMode, getGitRoot, getPrPatch, inferBaseCommitish, parseGitHubPrUrl, readStdin, shouldReadStdin, validateDiffArguments, } from './reviewSource/index.js';
|
|
3
3
|
export class ReviewRequestError extends Data.TaggedError('ReviewRequestError') {
|
|
4
4
|
}
|
|
5
5
|
const fail = (message) => Effect.fail(new ReviewRequestError({ message }));
|
|
@@ -23,9 +23,6 @@ const tryPromise = (thunk, message) => {
|
|
|
23
23
|
};
|
|
24
24
|
export function resolveReviewRequest(input) {
|
|
25
25
|
return Effect.gen(function* () {
|
|
26
|
-
if (input.options.tuiRequested) {
|
|
27
|
-
return yield* fail('--tui is not implemented yet. opencr currently supports the WebUI pipeline only.');
|
|
28
|
-
}
|
|
29
26
|
const behavior = {
|
|
30
27
|
...(input.options.preferredPort === undefined
|
|
31
28
|
? {}
|
|
@@ -77,7 +74,6 @@ export function resolveReviewRequest(input) {
|
|
|
77
74
|
commitish: input.commitish,
|
|
78
75
|
hasPositionalArgs: input.hasPositionalArgs,
|
|
79
76
|
hasPrOption: false,
|
|
80
|
-
hasTuiOption: false,
|
|
81
77
|
stdinSource,
|
|
82
78
|
});
|
|
83
79
|
if (shouldConsumeStdin) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewRequest.js","sourceRoot":"","sources":["../../../src/core/reviewRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,qBAAqB,GACtB,MAAM,
|
|
1
|
+
{"version":3,"file":"reviewRequest.js","sourceRoot":"","sources":["../../../src/core/reviewRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function getCommandErrorText(error) {
|
|
2
|
+
const stderr = error.stderr;
|
|
3
|
+
if (typeof stderr === 'string') {
|
|
4
|
+
return stderr.trim();
|
|
5
|
+
}
|
|
6
|
+
if (Buffer.isBuffer(stderr)) {
|
|
7
|
+
return stderr.toString('utf8').trim();
|
|
8
|
+
}
|
|
9
|
+
if (error instanceof Error) {
|
|
10
|
+
return error.message;
|
|
11
|
+
}
|
|
12
|
+
return String(error);
|
|
13
|
+
}
|
|
14
|
+
export function getCommandOutputText(error) {
|
|
15
|
+
const stdout = error.stdout;
|
|
16
|
+
if (typeof stdout === 'string') {
|
|
17
|
+
return stdout;
|
|
18
|
+
}
|
|
19
|
+
if (Buffer.isBuffer(stdout)) {
|
|
20
|
+
return stdout.toString('utf8');
|
|
21
|
+
}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=commandErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandErrors.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/commandErrors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,MAAM,GAAI,KAAsC,CAAC,MAAM,CAAC;IAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,MAAM,GAAI,KAAsC,CAAC,MAAM,CAAC;IAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
function isSpecialArg(arg) {
|
|
2
|
+
return arg === 'working' || arg === 'staged' || arg === '.';
|
|
3
|
+
}
|
|
4
|
+
export function inferBaseCommitish(targetCommitish, compareWith) {
|
|
5
|
+
if (compareWith) {
|
|
6
|
+
return compareWith;
|
|
7
|
+
}
|
|
8
|
+
if (targetCommitish === 'working') {
|
|
9
|
+
return 'staged';
|
|
10
|
+
}
|
|
11
|
+
if (isSpecialArg(targetCommitish)) {
|
|
12
|
+
return 'HEAD';
|
|
13
|
+
}
|
|
14
|
+
return `${targetCommitish}^`;
|
|
15
|
+
}
|
|
16
|
+
export function determineDiffWatchMode(targetCommitish, compareWith) {
|
|
17
|
+
if (compareWith && targetCommitish !== 'HEAD' && targetCommitish !== '.') {
|
|
18
|
+
return 'specific';
|
|
19
|
+
}
|
|
20
|
+
if (targetCommitish === 'working') {
|
|
21
|
+
return 'working';
|
|
22
|
+
}
|
|
23
|
+
if (targetCommitish === 'staged') {
|
|
24
|
+
return 'staged';
|
|
25
|
+
}
|
|
26
|
+
if (targetCommitish === '.') {
|
|
27
|
+
return 'dot';
|
|
28
|
+
}
|
|
29
|
+
return 'default';
|
|
30
|
+
}
|
|
31
|
+
export function validateCommitish(commitish) {
|
|
32
|
+
const trimmed = commitish.trim();
|
|
33
|
+
if (trimmed.length === 0 || trimmed === 'HEAD~') {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (isSpecialArg(trimmed)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const validPatterns = [
|
|
40
|
+
/^[a-f0-9]{4,40}$/i,
|
|
41
|
+
/^[a-f0-9]{4,40}\^+$/i,
|
|
42
|
+
/^[a-f0-9]{4,40}~\d+$/i,
|
|
43
|
+
/^HEAD(~\d+|\^\d*)*$/,
|
|
44
|
+
/^@(~\d+|\^\d*)*$/,
|
|
45
|
+
];
|
|
46
|
+
if (validPatterns.some((pattern) => pattern.test(trimmed))) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return isValidBranchName(trimmed);
|
|
50
|
+
}
|
|
51
|
+
function isValidBranchName(name) {
|
|
52
|
+
if (name.startsWith('-') || name.endsWith('.') || name.includes('..')) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (name.includes('@{') || name.includes('//')) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (name.startsWith('/') || name.endsWith('/') || name.endsWith('.lock')) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
for (const character of name) {
|
|
62
|
+
const codePoint = character.codePointAt(0);
|
|
63
|
+
if (codePoint === undefined) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if ('~^:?*[\\'.includes(character) || codePoint <= 0x20 || codePoint === 0x7f) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return name.split('/').every((component) => {
|
|
71
|
+
return component.length > 0 && !component.startsWith('.') && !component.endsWith('.lock');
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function validateDiffArguments(targetCommitish, baseCommitish) {
|
|
75
|
+
if (!validateCommitish(targetCommitish)) {
|
|
76
|
+
return { valid: false, error: 'Invalid target commit-ish format' };
|
|
77
|
+
}
|
|
78
|
+
if (baseCommitish !== undefined && !validateCommitish(baseCommitish)) {
|
|
79
|
+
return { valid: false, error: 'Invalid base commit-ish format' };
|
|
80
|
+
}
|
|
81
|
+
const specialArgs = ['working', 'staged', '.'];
|
|
82
|
+
if (baseCommitish && specialArgs.includes(baseCommitish)) {
|
|
83
|
+
if (!(baseCommitish === 'staged' && targetCommitish === 'working')) {
|
|
84
|
+
return {
|
|
85
|
+
valid: false,
|
|
86
|
+
error: `Special arguments (working, staged, .) are only allowed as target, not base. Got base: ${baseCommitish}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (targetCommitish === baseCommitish) {
|
|
91
|
+
return {
|
|
92
|
+
valid: false,
|
|
93
|
+
error: `Cannot compare ${targetCommitish} with itself`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (targetCommitish === 'working' && baseCommitish && baseCommitish !== 'staged') {
|
|
97
|
+
return {
|
|
98
|
+
valid: false,
|
|
99
|
+
error: '"working" shows unstaged changes and cannot be compared with another commit. Use "." instead to compare all uncommitted changes with a specific commit.',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return { valid: true };
|
|
103
|
+
}
|
|
104
|
+
export function createCommitRangeString(baseCommitish, targetCommitish) {
|
|
105
|
+
return `${baseCommitish}...${targetCommitish}`;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=commitish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commitish.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/commitish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function buildContentSummary(content, maxPreviewLength = 4000) {
|
|
3
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
4
|
+
const preview = normalized.slice(0, maxPreviewLength);
|
|
5
|
+
return {
|
|
6
|
+
bytes: Buffer.byteLength(content, 'utf8'),
|
|
7
|
+
lineCount: normalized.length === 0 ? 0 : normalized.split('\n').length,
|
|
8
|
+
sha256: createHash('sha256').update(content).digest('hex'),
|
|
9
|
+
preview,
|
|
10
|
+
truncated: normalized.length > preview.length,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=contentSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentSummary.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/contentSummary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,gBAAgB,GAAG,IAAI;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAEtD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;QACzC,SAAS,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;QACtE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1D,OAAO;QACP,SAAS,EAAE,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
2
|
+
import { createCommitRangeString } from './commitish.js';
|
|
3
|
+
import { getCommandErrorText, getCommandOutputText } from './commandErrors.js';
|
|
4
|
+
const NULL_DEVICE_PATH = process.platform === 'win32' ? 'NUL' : '/dev/null';
|
|
5
|
+
export function getGitRoot() {
|
|
6
|
+
const result = execSync('git rev-parse --show-toplevel', {
|
|
7
|
+
encoding: 'utf8',
|
|
8
|
+
stdio: 'pipe',
|
|
9
|
+
});
|
|
10
|
+
return result.trim();
|
|
11
|
+
}
|
|
12
|
+
export function getGitDiffPatch(options) {
|
|
13
|
+
const args = ['diff'];
|
|
14
|
+
if (options.targetCommitish === 'working') {
|
|
15
|
+
// no extra args; git diff shows unstaged changes
|
|
16
|
+
}
|
|
17
|
+
else if (options.targetCommitish === 'staged') {
|
|
18
|
+
args.push('--cached', options.baseCommitish);
|
|
19
|
+
}
|
|
20
|
+
else if (options.targetCommitish === '.') {
|
|
21
|
+
args.push(options.baseCommitish);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
args.push(createCommitRangeString(options.baseCommitish, options.targetCommitish));
|
|
25
|
+
}
|
|
26
|
+
args.push('--no-ext-diff', '--color=never');
|
|
27
|
+
try {
|
|
28
|
+
const patch = execFileSync('git', args, {
|
|
29
|
+
cwd: options.repositoryPath,
|
|
30
|
+
encoding: 'utf8',
|
|
31
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
32
|
+
});
|
|
33
|
+
if (!shouldIncludeUntrackedFiles(options)) {
|
|
34
|
+
return patch;
|
|
35
|
+
}
|
|
36
|
+
const untrackedPatch = buildUntrackedFilesPatch(options.repositoryPath);
|
|
37
|
+
return joinPatchSegments([patch, untrackedPatch]);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new Error(getCommandErrorText(error) || 'Unknown error while running git diff', {
|
|
41
|
+
cause: error,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function shouldIncludeUntrackedFiles(options) {
|
|
46
|
+
if (!options.includeUntracked) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return options.targetCommitish === 'working' || options.targetCommitish === '.';
|
|
50
|
+
}
|
|
51
|
+
function buildUntrackedFilesPatch(repositoryPath) {
|
|
52
|
+
const untrackedFiles = listUntrackedFiles(repositoryPath);
|
|
53
|
+
if (untrackedFiles.length === 0) {
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
return joinPatchSegments(untrackedFiles.map((filePath) => getUntrackedFilePatch(repositoryPath, filePath)));
|
|
57
|
+
}
|
|
58
|
+
function listUntrackedFiles(repositoryPath) {
|
|
59
|
+
const output = execFileSync('git', ['ls-files', '--others', '--exclude-standard', '-z'], {
|
|
60
|
+
cwd: repositoryPath,
|
|
61
|
+
encoding: 'utf8',
|
|
62
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
63
|
+
});
|
|
64
|
+
return output.split('\0').filter((filePath) => filePath.length > 0);
|
|
65
|
+
}
|
|
66
|
+
function getUntrackedFilePatch(repositoryPath, filePath) {
|
|
67
|
+
try {
|
|
68
|
+
return execFileSync('git', ['diff', '--no-index', '--no-ext-diff', '--color=never', '--', NULL_DEVICE_PATH, filePath], {
|
|
69
|
+
cwd: repositoryPath,
|
|
70
|
+
encoding: 'utf8',
|
|
71
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const exitStatus = error.status;
|
|
76
|
+
const stdout = getCommandOutputText(error);
|
|
77
|
+
if (exitStatus === 1 && stdout.trim().length > 0) {
|
|
78
|
+
return stdout;
|
|
79
|
+
}
|
|
80
|
+
throw new Error(getCommandErrorText(error) || `Unknown error while diffing untracked file ${filePath}`, {
|
|
81
|
+
cause: error,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function joinPatchSegments(segments) {
|
|
86
|
+
const nonEmptySegments = segments.filter((segment) => segment.trim().length > 0);
|
|
87
|
+
if (nonEmptySegments.length === 0) {
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
90
|
+
return nonEmptySegments.join('\n');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=gitDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitDiff.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/gitDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { getCommandErrorText } from './commandErrors.js';
|
|
3
|
+
export function parseGitHubPrUrl(url) {
|
|
4
|
+
try {
|
|
5
|
+
const urlObject = new URL(url);
|
|
6
|
+
const pathParts = urlObject.pathname.split('/').filter(Boolean);
|
|
7
|
+
if (pathParts.length < 4 || pathParts[2] !== 'pull') {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const pullNumber = Number.parseInt(pathParts[3] ?? '', 10);
|
|
11
|
+
if (Number.isNaN(pullNumber)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const owner = pathParts[0];
|
|
15
|
+
const repo = pathParts[1];
|
|
16
|
+
if (!owner || !repo) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
owner,
|
|
21
|
+
repo,
|
|
22
|
+
pullNumber,
|
|
23
|
+
hostname: urlObject.hostname,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function getPrPatch(prUrl) {
|
|
31
|
+
try {
|
|
32
|
+
const patch = execFileSync('gh', ['pr', 'diff', prUrl], {
|
|
33
|
+
encoding: 'utf8',
|
|
34
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
35
|
+
});
|
|
36
|
+
if (!patch.trim()) {
|
|
37
|
+
throw new Error('No diff content returned from gh pr diff');
|
|
38
|
+
}
|
|
39
|
+
return patch;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = getCommandErrorText(error) || 'Unknown error while running gh';
|
|
43
|
+
throw new Error(`${message}\nTry: gh auth login`, {
|
|
44
|
+
cause: error,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=githubPr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubPr.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/githubPr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AASzD,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEhE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,KAAK;YACL,IAAI;YACJ,UAAU;YACV,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;YACtD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,gCAAgC,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;YAChD,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { buildContentSummary } from './contentSummary.js';
|
|
2
|
+
export { createCommitRangeString, determineDiffWatchMode, inferBaseCommitish, validateCommitish, validateDiffArguments, } from './commitish.js';
|
|
3
|
+
export { getGitDiffPatch, getGitRoot } from './gitDiff.js';
|
|
4
|
+
export { getPrPatch, parseGitHubPrUrl } from './githubPr.js';
|
|
5
|
+
export { detectStdinSource, readStdin, shouldReadStdin } from './stdin.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { fstatSync } from 'node:fs';
|
|
2
|
+
export function detectStdinSource(stdinStat = fstatSync(0)) {
|
|
3
|
+
if (stdinStat.isFIFO()) {
|
|
4
|
+
return 'pipe';
|
|
5
|
+
}
|
|
6
|
+
if (stdinStat.isFile()) {
|
|
7
|
+
return 'file';
|
|
8
|
+
}
|
|
9
|
+
if (stdinStat.isSocket()) {
|
|
10
|
+
return 'socket';
|
|
11
|
+
}
|
|
12
|
+
return 'tty';
|
|
13
|
+
}
|
|
14
|
+
export function shouldReadStdin(options) {
|
|
15
|
+
if (options.commitish === '-') {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (options.hasPositionalArgs || options.hasPrOption) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const stdinSource = options.stdinSource ?? detectStdinSource();
|
|
22
|
+
return stdinSource === 'pipe' || stdinSource === 'file' || stdinSource === 'socket';
|
|
23
|
+
}
|
|
24
|
+
export async function readStdin() {
|
|
25
|
+
process.stdin.setEncoding('utf8');
|
|
26
|
+
let content = '';
|
|
27
|
+
for await (const chunk of process.stdin) {
|
|
28
|
+
content += chunk;
|
|
29
|
+
}
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../../../src/core/reviewSource/stdin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAahD,MAAM,UAAU,iBAAiB,CAAC,YAAuB,SAAS,CAAC,CAAC,CAAC;IACnE,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,iBAAiB,EAAE,CAAC;IAC/D,OAAO,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,QAAQ,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,IAAI,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -6,6 +6,7 @@ export class ServerStartError extends Error {
|
|
|
6
6
|
this.name = 'ServerStartError';
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
const AUTO_SHUTDOWN_DELAY_MS = 1500;
|
|
9
10
|
const toErrorMessage = (error) => {
|
|
10
11
|
if (error instanceof Error) {
|
|
11
12
|
return error.message;
|
|
@@ -49,10 +50,28 @@ export async function startDebugServer(input) {
|
|
|
49
50
|
};
|
|
50
51
|
let app;
|
|
51
52
|
let isShuttingDown = false;
|
|
53
|
+
let pendingShutdownTimer = null;
|
|
54
|
+
const clearPendingShutdown = () => {
|
|
55
|
+
if (pendingShutdownTimer == null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
clearTimeout(pendingShutdownTimer);
|
|
59
|
+
pendingShutdownTimer = null;
|
|
60
|
+
};
|
|
61
|
+
const scheduleShutdown = () => {
|
|
62
|
+
clearPendingShutdown();
|
|
63
|
+
pendingShutdownTimer = setTimeout(() => {
|
|
64
|
+
pendingShutdownTimer = null;
|
|
65
|
+
void stop().finally(() => {
|
|
66
|
+
process.exit(0);
|
|
67
|
+
});
|
|
68
|
+
}, AUTO_SHUTDOWN_DELAY_MS);
|
|
69
|
+
};
|
|
52
70
|
const stop = async () => {
|
|
53
71
|
if (isShuttingDown) {
|
|
54
72
|
return;
|
|
55
73
|
}
|
|
74
|
+
clearPendingShutdown();
|
|
56
75
|
isShuttingDown = true;
|
|
57
76
|
if (app) {
|
|
58
77
|
await app.close();
|
|
@@ -61,13 +80,13 @@ export async function startDebugServer(input) {
|
|
|
61
80
|
try {
|
|
62
81
|
app = await createApp({
|
|
63
82
|
debugState,
|
|
64
|
-
|
|
83
|
+
getReviewPayload: input.getReviewPayload,
|
|
84
|
+
saveWorkspace: input.saveWorkspace,
|
|
85
|
+
onHeartbeatClientConnected: () => {
|
|
86
|
+
clearPendingShutdown();
|
|
87
|
+
},
|
|
65
88
|
onLastClientDisconnected: () => {
|
|
66
|
-
|
|
67
|
-
void stop().finally(() => {
|
|
68
|
-
process.exit(0);
|
|
69
|
-
});
|
|
70
|
-
}, 100);
|
|
89
|
+
scheduleShutdown();
|
|
71
90
|
},
|
|
72
91
|
});
|
|
73
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/server.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const hashString = (input) => {
|
|
3
|
+
return createHash('sha256').update(input).digest('hex');
|
|
4
|
+
};
|
|
5
|
+
const buildTargetSeed = (request) => {
|
|
6
|
+
switch (request.source.kind) {
|
|
7
|
+
case 'git':
|
|
8
|
+
return [
|
|
9
|
+
'git',
|
|
10
|
+
request.source.repositoryPath,
|
|
11
|
+
request.source.baseCommitish,
|
|
12
|
+
request.source.targetCommitish,
|
|
13
|
+
request.source.diffWatchMode,
|
|
14
|
+
request.behavior.includeUntracked ? 'include-untracked' : 'tracked-only',
|
|
15
|
+
].join('|');
|
|
16
|
+
case 'pull-request':
|
|
17
|
+
return [
|
|
18
|
+
'pull-request',
|
|
19
|
+
request.source.hostname,
|
|
20
|
+
request.source.owner,
|
|
21
|
+
request.source.repo,
|
|
22
|
+
String(request.source.pullNumber),
|
|
23
|
+
].join('|');
|
|
24
|
+
case 'stdin':
|
|
25
|
+
return ['stdin', request.source.summary.sha256].join('|');
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const countPatchLines = (patch) => {
|
|
29
|
+
if (patch.length === 0) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
return patch.replace(/\r\n/g, '\n').split('\n').length;
|
|
33
|
+
};
|
|
34
|
+
export const buildReviewIdentity = (request, patch) => {
|
|
35
|
+
const snapshotId = hashString(patch);
|
|
36
|
+
const targetId = request.source.kind === 'stdin' ? snapshotId : hashString(buildTargetSeed(request));
|
|
37
|
+
return {
|
|
38
|
+
targetId,
|
|
39
|
+
snapshotId,
|
|
40
|
+
sourceKind: request.source.kind,
|
|
41
|
+
sourceLabel: request.reviewLabel,
|
|
42
|
+
sourceJson: JSON.stringify(request.source),
|
|
43
|
+
patchBytes: Buffer.byteLength(patch, 'utf8'),
|
|
44
|
+
patchLineCount: countPatchLines(patch),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../../src/core/workspace/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAsB,EAAU,EAAE;IACzD,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,KAAK;YACR,OAAO;gBACL,KAAK;gBACL,OAAO,CAAC,MAAM,CAAC,cAAc;gBAC7B,OAAO,CAAC,MAAM,CAAC,aAAa;gBAC5B,OAAO,CAAC,MAAM,CAAC,eAAe;gBAC9B,OAAO,CAAC,MAAM,CAAC,aAAa;gBAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc;aACzE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,KAAK,cAAc;YACjB,OAAO;gBACL,cAAc;gBACd,OAAO,CAAC,MAAM,CAAC,QAAQ;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK;gBACpB,OAAO,CAAC,MAAM,CAAC,IAAI;gBACnB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;aAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,KAAK,OAAO;YACV,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAE,KAAa,EAAkB,EAAE;IAC3F,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAErG,OAAO;QACL,QAAQ;QACR,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;QAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;QAC5C,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC;KACvC,CAAC;AACJ,CAAC,CAAC"}
|