Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25162597e1 | ||
|
|
6502f27963 | ||
|
|
13e0bd2cff | ||
|
|
591242ab5f | ||
|
|
93e633490a | ||
|
|
250b5ca064 | ||
|
|
f0ae9b3a12 | ||
|
|
edb0af19c4 | ||
|
|
6329ba4091 | ||
|
|
ef48323a9b | ||
|
|
87a1e507ac | ||
|
|
0e3114a252 | ||
|
|
21f6ea640f | ||
|
|
03ebaf8783 | ||
|
|
d575335ade | ||
|
|
31abc1847f | ||
|
|
0b08fc9bac | ||
|
|
2bb1462f10 | ||
|
|
0ab9f770ea | ||
|
|
4416479d1c | ||
|
|
6231202374 | ||
|
|
6542b63660 | ||
|
|
fcab84cf6a | ||
|
|
e2e350883e | ||
|
|
47353932a1 | ||
|
|
850c61dc76 | ||
|
|
84bacd7edc | ||
|
|
773e60e31e | ||
|
|
9bce9d7a5d | ||
|
|
f1457ecffc | ||
|
|
8c284037c9 | ||
|
|
f2311d7dba | ||
|
|
3b4092f1ac | ||
|
|
2608f1a47c | ||
|
|
656018a440 | ||
|
|
70637aeb69 | ||
|
|
543aa5e3bb | ||
|
|
119a06f807 | ||
|
|
cb5b588711 | ||
|
|
adb9a4112c | ||
|
|
48653c0854 | ||
|
|
49e5dfdc24 | ||
|
|
35ebdb302a | ||
|
|
58f15d95d4 | ||
|
|
17db1d5970 | ||
|
|
0b97bea982 | ||
|
|
f054ffe9c8 | ||
|
|
2855600b5b | ||
|
|
ebb24763bd | ||
|
|
0c0f78d915 | ||
|
|
b0182fdd9a | ||
|
|
378e37adc9 | ||
|
|
3612c22adf | ||
|
|
230bce9864 | ||
|
|
f611df293f | ||
|
|
46944da663 | ||
|
|
518ea5bc31 | ||
|
|
3ee264015a | ||
|
|
65fcb15c09 | ||
|
|
304a336b57 | ||
|
|
28762c4be2 | ||
|
|
c2ca699e39 | ||
|
|
a8694b59a0 | ||
|
|
f0ecdd4862 | ||
|
|
98bfb54efc | ||
|
|
3a8e920a0d | ||
|
|
ba0cc65530 | ||
|
|
320d355e5d | ||
|
|
feae362cc3 | ||
|
|
66b0dbb945 | ||
|
|
14f2cc2bf4 | ||
|
|
c2fdf75c8c | ||
|
|
281d04feaf | ||
|
|
3526f5092c | ||
|
|
2be467ed68 | ||
|
|
38ed24f6a0 | ||
|
|
b56711ff6c | ||
|
|
379d1c8472 | ||
|
|
03b3995e19 | ||
|
|
466fb3b6bc | ||
|
|
08fd6214c9 | ||
|
|
feb70a3680 | ||
|
|
9e9430e9b4 | ||
|
|
b38e9ef00a | ||
|
|
58cce1a996 | ||
|
|
0806b5774c | ||
|
|
3ff67ac89a | ||
|
|
5d358dc8de | ||
|
|
2832e546e0 | ||
|
|
5669aeb26a | ||
|
|
c846e8106d | ||
|
|
35c55c2555 | ||
|
|
065454194a | ||
|
|
9e5237fa99 | ||
|
|
7d7ff29911 | ||
|
|
5e019a77da | ||
|
|
68c9cb9236 | ||
|
|
36f04f0fce | ||
|
|
168eba4e28 | ||
|
|
39366406c5 | ||
|
|
9b1bf3b238 | ||
|
|
8eb5e9cd0e | ||
|
|
effd140a87 | ||
|
|
2afbce5b28 | ||
|
|
0c2b40b22f | ||
|
|
b590e097dc | ||
|
|
2f3f444b17 | ||
|
|
d04085e017 | ||
|
|
3eff13967a | ||
|
|
cba220883b | ||
|
|
423f838ce8 | ||
|
|
20f9990784 | ||
|
|
d6574c6d3f | ||
|
|
f5d711bd0b | ||
|
|
bd3102ad91 | ||
|
|
9005aca568 | ||
|
|
54c6227d89 | ||
|
|
41303ed8cc | ||
|
|
b885e2c39a | ||
|
|
853a4f3582 | ||
|
|
6ee27f5716 | ||
|
|
d8c3426058 | ||
|
|
886d3c58e9 | ||
|
|
ae17dab804 | ||
|
|
9fd2438d4c | ||
|
|
1ac61ed3b6 | ||
|
|
6bd2bb5fdb | ||
|
|
ac1e3274ec | ||
|
|
14be9092a1 | ||
|
|
5dfb14f86e | ||
|
|
b42091e660 | ||
|
|
646f40b8b5 | ||
|
|
c357584ec0 | ||
|
|
5d736cc6c8 | ||
|
|
304858c0cb | ||
|
|
fa32357231 | ||
|
|
8879e4e399 | ||
|
|
f1712ca20b | ||
|
|
0445fc4207 | ||
|
|
34c3835151 | ||
|
|
f38f551cda | ||
|
|
93fcc05944 | ||
|
|
12dbf2cd68 | ||
|
|
6a97dd8c93 | ||
|
|
16b4710f8c | ||
|
|
3d58b640f0 | ||
|
|
a5b573dbcd | ||
|
|
9360987d31 | ||
|
|
08776b77f7 | ||
|
|
b34766054b | ||
|
|
8914e28c26 | ||
|
|
2a39dc402a | ||
|
|
b55a98c697 | ||
|
|
fe9cfe318a | ||
|
|
08b9c995bd | ||
|
|
6da34e4236 | ||
|
|
2080e28813 | ||
|
|
79e846844f | ||
|
|
e172440607 | ||
|
|
996453b3a8 | ||
|
|
0eb68d22a0 | ||
|
|
a2a8d77445 | ||
|
|
032d9a288e | ||
|
|
3a74d10317 | ||
|
|
ef637af801 | ||
|
|
833795da79 | ||
|
|
68bc9642f4 | ||
|
|
a8bae9e3a6 | ||
|
|
fe2c5ef04b | ||
|
|
83521bc682 | ||
|
|
59ea146b6e | ||
|
|
09a1ce1e8a | ||
|
|
58a9ec846f | ||
|
|
6f3ae65833 | ||
|
|
a8e6695b55 | ||
|
|
c7edc9981f | ||
|
|
4d0912eb9d | ||
|
|
7747ac6226 | ||
|
|
13155149ea | ||
|
|
d3fffbad7b | ||
|
|
6fe98d2f54 | ||
|
|
a2683630e0 | ||
|
|
590923ca99 | ||
|
|
3263fab54f | ||
|
|
3254d7db33 | ||
|
|
77bdf4b028 | ||
|
|
ca16d85890 | ||
|
|
74f12d8071 | ||
|
|
dc6b33eda2 | ||
|
|
bde931bc3a | ||
|
|
872c86ad20 | ||
|
|
6736b6771f | ||
|
|
4b4ea51138 | ||
|
|
380dcbbb58 | ||
|
|
0a002db1e5 | ||
|
|
b5b1c2b9df | ||
|
|
dd8f358076 | ||
|
|
34cd49174e | ||
|
|
2874fd2600 |
@@ -1,65 +0,0 @@
|
||||
---
|
||||
name: Bug Report - Language Service
|
||||
about: 'Create a bug report for IntelliSense, autocomplete, code editing, code navigation, etc.'
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Bug type: Language Service
|
||||
|
||||
<!-- Prior to creating a bug report, please review:
|
||||
📝 Existing issues at https://github.com/Microsoft/vscode-cpptools/issues
|
||||
📜 Our documentation at https://code.visualstudio.com/docs/languages/cpp
|
||||
📙 FAQs at https://code.visualstudio.com/docs/cpp/faq-cpp
|
||||
-->
|
||||
|
||||
|
||||
**Describe the bug**
|
||||
- OS and Version:
|
||||
- VS Code Version:
|
||||
- C/C++ Extension Version:
|
||||
- Other extensions you installed (and if the issue persists after disabling them):
|
||||
- If using SSH remote, specify OS of remote machine:
|
||||
- A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc).
|
||||
|
||||
|
||||
**Steps to reproduce**
|
||||
<!-- Provide clear steps to reproduce the bug: -->
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
|
||||
**Code sample and logs**
|
||||
<!-- Please provide code sample, your c_cpp_properties.json and logs. -->
|
||||
- Code sample
|
||||
|
||||
- Configurations in `c_cpp_properties.json`
|
||||
|
||||
- Logs from running `C/C++: Log Diagnostics` from the VS Code command palette
|
||||
|
||||
- Logs from [the language server logging](https://code.visualstudio.com/docs/cpp/enable-logging-cpp#_enable-logging-for-the-language-server)
|
||||
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
|
||||
**Additional context**
|
||||
<!--
|
||||
Providing call stacks:
|
||||
For bugs like crashes, deadlocks, infinite loops, etc. that we are not able to repro and for which the call stack may be useful, please attach a debugger and/or create a dmp and provide the call stacks. Windows binaries have symbols available in VS Code by setting your "symbolSearchPath" to "https://msdl.microsoft.com/download/symbols".
|
||||
|
||||
Instructions for attaching debugger to language service process:
|
||||
https://github.com/microsoft/vscode-cpptools/wiki/Attaching-debugger-to-cpptools-or-cpptools%E2%80%90srv.
|
||||
|
||||
Performance analysis:
|
||||
For a performance issue see instructions at https://github.com/microsoft/vscode-cpptools/wiki/Troubleshooting-Performance-Issues.
|
||||
-->
|
||||
@@ -0,0 +1,86 @@
|
||||
name: Bug Report - Language Service
|
||||
description: Create a bug report for IntelliSense, autocomplete, code editing, code navigation, etc.
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Is there an existing issue for this?
|
||||
Please search our [existing issues](https://github.com/microsoft/vscode-cpptools/issues) to see if an issue already exists for the bug you encountered.
|
||||
|
||||
Please also review our [documentation](https://code.visualstudio.com/docs/languages/cpp) and [FAQs](https://code.visualstudio.com/docs/cpp/faq-cpp).
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Environment
|
||||
description: |
|
||||
Please provide the information for the following:
|
||||
- OS and Version
|
||||
- VS Code Version
|
||||
- C/C++ Extension Version
|
||||
- Other extensions you installed (and if the issue persists after disabling them)
|
||||
- If using SSH remote, specify OS of remote machine
|
||||
- A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc).
|
||||
value: |
|
||||
- OS and Version:
|
||||
- VS Code Version:
|
||||
- C/C++ Extension Version:
|
||||
- Other extensions you installed (and if the issue persists after disabling them):
|
||||
- If using SSH remote, specify OS of remote machine:
|
||||
- A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Bug Summary and Steps to Reproduce
|
||||
description: |
|
||||
Please describe the language service issue or language service feature that is not working as expected.
|
||||
|
||||
Include clear steps on how to reproduce the issue.
|
||||
value: |
|
||||
Bug Summary:
|
||||
|
||||
|
||||
Steps to reproduce:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Expected behavior
|
||||
description: A clear and concise description of what you expected to happen.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Code sample and Logs
|
||||
description: |
|
||||
Please provide code sample, your c_cpp_properties.json and logs:
|
||||
- Code sample
|
||||
- Configurations in `c_cpp_properties.json`
|
||||
- Logs from running `C/C++: Log Diagnostics` from the VS Code command palette
|
||||
- Logs from [the language server logging](https://code.visualstudio.com/docs/cpp/enable-logging-cpp#_enable-logging-for-the-language-server)
|
||||
render: shell
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Screenshots
|
||||
description: If applicable, add screenshots to help explain your problem.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional context
|
||||
description: |
|
||||
Providing call stacks:
|
||||
For bugs like crashes, deadlocks, infinite loops, etc. that we are not able to repro and for which the call stack may be useful, please attach a debugger and/or create a dmp and provide the call stacks. Windows binaries have symbols available in VS Code by setting your "symbolSearchPath" to "https://msdl.microsoft.com/download/symbols".
|
||||
|
||||
Instructions for attaching debugger to language service process:
|
||||
https://github.com/microsoft/vscode-cpptools/wiki/Attaching-debugger-to-cpptools-or-cpptools%E2%80%90srv.
|
||||
|
||||
Performance analysis:
|
||||
For a performance issue see instructions at https://github.com/microsoft/vscode-cpptools/wiki/Troubleshooting-Performance-Issues.
|
||||
validations:
|
||||
required: false
|
||||
@@ -15,8 +15,8 @@ class Locker extends ActionBase_1.ActionBase {
|
||||
this.daysSinceUpdate = daysSinceUpdate;
|
||||
}
|
||||
async run() {
|
||||
const closedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.daysSinceClose);
|
||||
const updatedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.daysSinceUpdate);
|
||||
const closedTimestamp = (0, utils_1.daysAgoToHumanReadbleDate)(this.daysSinceClose);
|
||||
const updatedTimestamp = (0, utils_1.daysAgoToHumanReadbleDate)(this.daysSinceUpdate);
|
||||
const query = this.buildQuery((this.daysSinceClose ? `closed:<${closedTimestamp} ` : "") + (this.daysSinceUpdate ? `updated:<${updatedTimestamp} ` : "") + "is:closed is:unlocked");
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(page.map(async (issue) => {
|
||||
@@ -24,15 +24,15 @@ class Locker extends ActionBase_1.ActionBase {
|
||||
if (!hydrated.locked && hydrated.open === false && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
console.log(`Locking issue ${hydrated.number}`);
|
||||
(0, utils_1.safeLog)(`Locking issue ${hydrated.number}`);
|
||||
await issue.lockIssue();
|
||||
}
|
||||
else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is already locked. Ignoring`);
|
||||
(0, utils_1.safeLog)(`Issue ${hydrated.number} is already locked. Ignoring`);
|
||||
}
|
||||
else if (hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
(0, utils_1.safeLog)(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub, Issue } from '../api/api'
|
||||
import { daysAgoToHumanReadbleDate } from '../common/utils'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
import { GitHub, Issue } from '../api/api';
|
||||
import { daysAgoToHumanReadbleDate, safeLog } from '../common/utils';
|
||||
import { ActionBase } from '../common/ActionBase';
|
||||
|
||||
export class Locker extends ActionBase {
|
||||
constructor(
|
||||
@@ -26,26 +26,26 @@ export class Locker extends ActionBase {
|
||||
}
|
||||
|
||||
async run() {
|
||||
const closedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceClose)
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceUpdate)
|
||||
const closedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceClose);
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceUpdate);
|
||||
|
||||
const query = this.buildQuery((this.daysSinceClose ? `closed:<${closedTimestamp} ` : "") + (this.daysSinceUpdate ? `updated:<${updatedTimestamp} ` : "") + "is:closed is:unlocked");
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(
|
||||
page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue()
|
||||
const hydrated = await issue.getIssue();
|
||||
|
||||
if (!hydrated.locked && hydrated.open === false && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
console.log(`Locking issue ${hydrated.number}`)
|
||||
await issue.lockIssue()
|
||||
safeLog(`Locking issue ${hydrated.number}`);
|
||||
await issue.lockIssue();
|
||||
} else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is already locked. Ignoring`)
|
||||
safeLog(`Issue ${hydrated.number} is already locked. Ignoring`);
|
||||
} else if (hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`)
|
||||
safeLog(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -13,7 +13,7 @@ class LockerAction extends Action_1.Action {
|
||||
this.id = 'Locker';
|
||||
}
|
||||
async onTriggered(github) {
|
||||
await new Locker_1.Locker(github, +utils_1.getRequiredInput('daysSinceClose'), +utils_1.getRequiredInput('daysSinceUpdate'), utils_1.getInput('labels') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999)).run();
|
||||
await new Locker_1.Locker(github, +(0, utils_1.getRequiredInput)('daysSinceClose'), +(0, utils_1.getRequiredInput)('daysSinceUpdate'), (0, utils_1.getInput)('labels') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999)).run();
|
||||
}
|
||||
}
|
||||
new LockerAction().run(); // eslint-disable-line
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit } from '../api/octokit'
|
||||
import { getInput, getRequiredInput } from '../common/utils'
|
||||
import { Locker } from './Locker'
|
||||
import { Action } from '../common/Action'
|
||||
import { OctoKit } from '../api/octokit';
|
||||
import { getInput, getRequiredInput } from '../common/utils';
|
||||
import { Locker } from './Locker';
|
||||
import { Action } from '../common/Action';
|
||||
|
||||
class LockerAction extends Action {
|
||||
id = 'Locker'
|
||||
id = 'Locker';
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
await new Locker(
|
||||
@@ -24,8 +24,8 @@ class LockerAction extends Action {
|
||||
getInput('ignoreMilestoneIds') || undefined,
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999)
|
||||
).run()
|
||||
).run();
|
||||
}
|
||||
}
|
||||
|
||||
new LockerAction().run() // eslint-disable-line
|
||||
new LockerAction().run(); // eslint-disable-line
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Reopener = void 0;
|
||||
const utils_1 = require("../common/utils");
|
||||
const ActionBase_1 = require("../common/ActionBase");
|
||||
class Reopener extends ActionBase_1.ActionBase {
|
||||
constructor(github, alsoApplyToOpenIssues, addLabels, removeLabels, reopenComment, setMilestoneId, labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes) {
|
||||
@@ -19,7 +20,7 @@ class Reopener extends ActionBase_1.ActionBase {
|
||||
async run() {
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
console.log(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
(0, utils_1.safeLog)(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
const query = this.buildQuery((this.alsoApplyToOpenIssues ? "" : "is:closed ") + "is:unlocked");
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(page.map(async (issue) => {
|
||||
@@ -28,17 +29,17 @@ class Reopener extends ActionBase_1.ActionBase {
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
if (hydrated.open === false) {
|
||||
console.log(`Reopening issue ${hydrated.number}`);
|
||||
(0, utils_1.safeLog)(`Reopening issue ${hydrated.number}`);
|
||||
await issue.reopenIssue();
|
||||
}
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
(0, utils_1.safeLog)(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
(0, utils_1.safeLog)(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
@@ -46,22 +47,22 @@ class Reopener extends ActionBase_1.ActionBase {
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
(0, utils_1.safeLog)(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.reopenComment) {
|
||||
console.log(`Posting comment to issue ${hydrated.number}.`);
|
||||
(0, utils_1.safeLog)(`Posting comment to issue ${hydrated.number}.`);
|
||||
await issue.postComment(this.reopenComment);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is locked. Ignoring`);
|
||||
(0, utils_1.safeLog)(`Issue ${hydrated.number} is locked. Ignoring`);
|
||||
}
|
||||
else if (!this.alsoApplyToOpenIssues && hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
(0, utils_1.safeLog)(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub, Issue } from '../api/api'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
import { GitHub, Issue } from '../api/api';
|
||||
import { daysAgoToHumanReadbleDate, safeLog } from '../common/utils';
|
||||
import { ActionBase } from '../common/ActionBase';
|
||||
|
||||
export class Reopener extends ActionBase {
|
||||
constructor(
|
||||
@@ -31,50 +32,50 @@ export class Reopener extends ActionBase {
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
|
||||
console.log(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
safeLog(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
|
||||
const query = this.buildQuery((this.alsoApplyToOpenIssues ? "": "is:closed ") + "is:unlocked");
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(
|
||||
page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue()
|
||||
const hydrated = await issue.getIssue();
|
||||
if (!hydrated.locked && (this.alsoApplyToOpenIssues || hydrated.open === false) && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
if (hydrated.open === false) {
|
||||
console.log(`Reopening issue ${hydrated.number}`)
|
||||
await issue.reopenIssue()
|
||||
safeLog(`Reopening issue ${hydrated.number}`);
|
||||
await issue.reopenIssue();
|
||||
}
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`)
|
||||
await issue.setMilestone(+this.setMilestoneId)
|
||||
safeLog(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`)
|
||||
await issue.removeLabel(removeLabel)
|
||||
safeLog(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`)
|
||||
await issue.addLabel(addLabel)
|
||||
safeLog(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.reopenComment) {
|
||||
console.log(`Posting comment to issue ${hydrated.number}.`)
|
||||
await issue.postComment(this.reopenComment)
|
||||
safeLog(`Posting comment to issue ${hydrated.number}.`);
|
||||
await issue.postComment(this.reopenComment);
|
||||
}
|
||||
} else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is locked. Ignoring`)
|
||||
safeLog(`Issue ${hydrated.number} is locked. Ignoring`);
|
||||
} else if (!this.alsoApplyToOpenIssues && hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`)
|
||||
safeLog(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -10,11 +10,11 @@ const Action_1 = require("../common/Action");
|
||||
class ReopenerAction extends Action_1.Action {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.id = 'Locker';
|
||||
this.id = 'Reopener';
|
||||
}
|
||||
async onTriggered(github) {
|
||||
const alsoApplyToOpenIssues = utils_1.getInput('alsoApplyToOpenIssues');
|
||||
await new Reopener_1.Reopener(github, alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true', utils_1.getInput('addLabels') || undefined, utils_1.getInput('removeLabels') || undefined, utils_1.getInput('reopenComment') || '', utils_1.getInput('setMilestoneId') || undefined, utils_1.getInput('labels') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999)).run();
|
||||
const alsoApplyToOpenIssues = (0, utils_1.getInput)('alsoApplyToOpenIssues');
|
||||
await new Reopener_1.Reopener(github, alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true', (0, utils_1.getInput)('addLabels') || undefined, (0, utils_1.getInput)('removeLabels') || undefined, (0, utils_1.getInput)('reopenComment') || '', (0, utils_1.getInput)('setMilestoneId') || undefined, (0, utils_1.getInput)('labels') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999)).run();
|
||||
}
|
||||
}
|
||||
new ReopenerAction().run(); // eslint-disable-line
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit } from '../api/octokit'
|
||||
import { getInput, getRequiredInput } from '../common/utils'
|
||||
import { Reopener } from './Reopener'
|
||||
import { Action } from '../common/Action'
|
||||
import { OctoKit } from '../api/octokit';
|
||||
import { getInput, getRequiredInput } from '../common/utils';
|
||||
import { Reopener } from './Reopener';
|
||||
import { Action } from '../common/Action';
|
||||
|
||||
class ReopenerAction extends Action {
|
||||
id = 'Locker'
|
||||
id = 'Reopener';
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
const alsoApplyToOpenIssues: string | undefined = getInput('alsoApplyToOpenIssues');
|
||||
@@ -28,8 +28,8 @@ class ReopenerAction extends Action {
|
||||
getInput('ignoreMilestoneIds') || undefined,
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999)
|
||||
).run()
|
||||
).run();
|
||||
}
|
||||
}
|
||||
|
||||
new ReopenerAction().run() // eslint-disable-line
|
||||
new ReopenerAction().run(); // eslint-disable-line
|
||||
|
||||
@@ -21,8 +21,8 @@ class StaleCloser extends ActionBase_1.ActionBase {
|
||||
this.setMilestoneId = setMilestoneId;
|
||||
}
|
||||
async run() {
|
||||
const updatedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.closeDays);
|
||||
const pingTimestamp = this.pingDays ? utils_1.daysAgoToTimestamp(this.pingDays) : undefined;
|
||||
const updatedTimestamp = (0, utils_1.daysAgoToHumanReadbleDate)(this.closeDays);
|
||||
const pingTimestamp = this.pingDays ? (0, utils_1.daysAgoToTimestamp)(this.pingDays) : undefined;
|
||||
const query = this.buildQuery((this.closeDays ? `updated:<${updatedTimestamp} ` : "") + "is:open is:unlocked");
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
@@ -45,20 +45,20 @@ class StaleCloser extends ActionBase_1.ActionBase {
|
||||
await issue.hasWriteAccess(lastComment.author)) {
|
||||
if (pingTimestamp != undefined) {
|
||||
if (lastComment) {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`);
|
||||
(0, utils_1.safeLog)(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`);
|
||||
}
|
||||
else {
|
||||
console.log(`No comments on issue ${hydrated.number}. Closing.`);
|
||||
(0, utils_1.safeLog)(`No comments on issue ${hydrated.number}. Closing.`);
|
||||
}
|
||||
}
|
||||
if (this.closeComment) {
|
||||
console.log(`Posting comment on issue ${hydrated.number}`);
|
||||
(0, utils_1.safeLog)(`Posting comment on issue ${hydrated.number}`);
|
||||
await issue.postComment(this.closeComment);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
(0, utils_1.safeLog)(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
@@ -66,22 +66,22 @@ class StaleCloser extends ActionBase_1.ActionBase {
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
(0, utils_1.safeLog)(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
await issue.closeIssue();
|
||||
await issue.closeIssue("not_planned");
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
(0, utils_1.safeLog)(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
console.log(`Closing issue ${hydrated.number}.`);
|
||||
(0, utils_1.safeLog)(`Closing issue ${hydrated.number}.`);
|
||||
}
|
||||
else {
|
||||
// Ping
|
||||
if (hydrated.updatedAt < pingTimestamp && hydrated.assignee) {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Pinging @${hydrated.assignee}`);
|
||||
(0, utils_1.safeLog)(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Pinging @${hydrated.assignee}`);
|
||||
if (this.pingComment) {
|
||||
await issue.postComment(this.pingComment
|
||||
.replace('${assignee}', hydrated.assignee)
|
||||
@@ -89,13 +89,13 @@ class StaleCloser extends ActionBase_1.ActionBase {
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Skipping.${hydrated.assignee ? ' cc @' + hydrated.assignee : ''}`);
|
||||
(0, utils_1.safeLog)(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Skipping.${hydrated.assignee ? ' cc @' + hydrated.assignee : ''}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is not open. Ignoring`);
|
||||
(0, utils_1.safeLog)(`Issue ${hydrated.number} is not open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub } from '../api/api'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
import { daysAgoToHumanReadbleDate, daysAgoToTimestamp } from '../common/utils'
|
||||
import { GitHub } from '../api/api';
|
||||
import { ActionBase } from '../common/ActionBase';
|
||||
import { daysAgoToHumanReadbleDate, daysAgoToTimestamp, safeLog } from '../common/utils';
|
||||
|
||||
export class StaleCloser extends ActionBase {
|
||||
constructor(
|
||||
@@ -33,7 +33,7 @@ export class StaleCloser extends ActionBase {
|
||||
}
|
||||
|
||||
async run() {
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.closeDays)
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.closeDays);
|
||||
const pingTimestamp = this.pingDays ? daysAgoToTimestamp(this.pingDays) : undefined;
|
||||
|
||||
const query = this.buildQuery((this.closeDays ? `updated:<${updatedTimestamp} ` : "") + "is:open is:unlocked");
|
||||
@@ -43,12 +43,12 @@ export class StaleCloser extends ActionBase {
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
for (const issue of page) {
|
||||
const hydrated = await issue.getIssue()
|
||||
const lastCommentIterator = await issue.getComments(true).next()
|
||||
const hydrated = await issue.getIssue();
|
||||
const lastCommentIterator = await issue.getComments(true).next();
|
||||
if (lastCommentIterator.done) {
|
||||
throw Error('Unexpected comment data')
|
||||
throw Error('Unexpected comment data');
|
||||
}
|
||||
const lastComment = lastCommentIterator.value[0]
|
||||
const lastComment = lastCommentIterator.value[0];
|
||||
|
||||
if (hydrated.open && this.validateIssue(hydrated)
|
||||
// TODO: Verify updated timestamp
|
||||
@@ -63,63 +63,63 @@ export class StaleCloser extends ActionBase {
|
||||
) {
|
||||
if (pingTimestamp != undefined) {
|
||||
if (lastComment) {
|
||||
console.log(
|
||||
safeLog(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`,
|
||||
)
|
||||
);
|
||||
} else {
|
||||
console.log(`No comments on issue ${hydrated.number}. Closing.`)
|
||||
safeLog(`No comments on issue ${hydrated.number}. Closing.`);
|
||||
}
|
||||
}
|
||||
if (this.closeComment) {
|
||||
console.log(`Posting comment on issue ${hydrated.number}`)
|
||||
await issue.postComment(this.closeComment)
|
||||
safeLog(`Posting comment on issue ${hydrated.number}`);
|
||||
await issue.postComment(this.closeComment);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`)
|
||||
await issue.removeLabel(removeLabel)
|
||||
safeLog(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`)
|
||||
await issue.addLabel(addLabel)
|
||||
safeLog(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
await issue.closeIssue()
|
||||
await issue.closeIssue("not_planned");
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`)
|
||||
await issue.setMilestone(+this.setMilestoneId)
|
||||
safeLog(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
console.log(`Closing issue ${hydrated.number}.`)
|
||||
safeLog(`Closing issue ${hydrated.number}.`);
|
||||
} else {
|
||||
// Ping
|
||||
if (hydrated.updatedAt < pingTimestamp && hydrated.assignee) {
|
||||
console.log(
|
||||
safeLog(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Pinging @${hydrated.assignee}`,
|
||||
)
|
||||
);
|
||||
if (this.pingComment) {
|
||||
await issue.postComment(
|
||||
this.pingComment
|
||||
.replace('${assignee}', hydrated.assignee)
|
||||
.replace('${author}', hydrated.author.name),
|
||||
)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
console.log(
|
||||
safeLog(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Skipping.${
|
||||
hydrated.assignee ? ' cc @' + hydrated.assignee : ''
|
||||
}`,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is not open. Ignoring`)
|
||||
safeLog(`Issue ${hydrated.number} is not open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class StaleCloserAction extends Action_1.Action {
|
||||
}
|
||||
async onTriggered(github) {
|
||||
var _a;
|
||||
await new StaleCloser_1.StaleCloser(github, +utils_1.getRequiredInput('closeDays'), utils_1.getRequiredInput('labels'), utils_1.getInput('closeComment') || '', +(utils_1.getInput('pingDays') || 0), utils_1.getInput('pingComment') || '', ((_a = utils_1.getInput('additionalTeam')) !== null && _a !== void 0 ? _a : '').split(','), utils_1.getInput('addLabels') || undefined, utils_1.getInput('removeLabels') || undefined, utils_1.getInput('setMilestoneId') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999), utils_1.getInput('involves') || undefined).run();
|
||||
await new StaleCloser_1.StaleCloser(github, +(0, utils_1.getRequiredInput)('closeDays'), (0, utils_1.getRequiredInput)('labels'), (0, utils_1.getInput)('closeComment') || '', +((0, utils_1.getInput)('pingDays') || 0), (0, utils_1.getInput)('pingComment') || '', ((_a = (0, utils_1.getInput)('additionalTeam')) !== null && _a !== void 0 ? _a : '').split(','), (0, utils_1.getInput)('addLabels') || undefined, (0, utils_1.getInput)('removeLabels') || undefined, (0, utils_1.getInput)('setMilestoneId') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999), (0, utils_1.getInput)('involves') || undefined).run();
|
||||
}
|
||||
}
|
||||
new StaleCloserAction().run(); // eslint-disable-line
|
||||
|
||||
@@ -9,7 +9,7 @@ import { StaleCloser } from './StaleCloser'
|
||||
import { Action } from '../common/Action'
|
||||
|
||||
class StaleCloserAction extends Action {
|
||||
id = 'StaleCloser'
|
||||
id = 'StaleCloser';
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
await new StaleCloser(
|
||||
@@ -31,8 +31,8 @@ class StaleCloserAction extends Action {
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999),
|
||||
getInput('involves') || undefined
|
||||
).run()
|
||||
).run();
|
||||
}
|
||||
}
|
||||
|
||||
new StaleCloserAction().run() // eslint-disable-line
|
||||
new StaleCloserAction().run(); // eslint-disable-line
|
||||
|
||||
+79
-56
@@ -4,43 +4,53 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
export interface GitHub {
|
||||
query(query: Query): AsyncIterableIterator<GitHubIssue[]>
|
||||
repoOwner: string;
|
||||
repoName: string;
|
||||
|
||||
hasWriteAccess(user: User): Promise<boolean>
|
||||
query(query: Query): AsyncIterableIterator<GitHubIssue[]>;
|
||||
|
||||
repoHasLabel(label: string): Promise<boolean>
|
||||
createLabel(label: string, color: string, description: string): Promise<void>
|
||||
deleteLabel(label: string): Promise<void>
|
||||
hasWriteAccess(user: User): Promise<boolean>;
|
||||
|
||||
readConfig(path: string): Promise<any>
|
||||
repoHasLabel(label: string): Promise<boolean>;
|
||||
createLabel(label: string, color: string, description: string): Promise<void>;
|
||||
deleteLabel(label: string): Promise<void>;
|
||||
|
||||
dispatch(title: string): Promise<void>
|
||||
readConfig(path: string): Promise<any>;
|
||||
|
||||
createIssue(owner: string, repo: string, title: string, body: string): Promise<void>
|
||||
dispatch(title: string): Promise<void>;
|
||||
|
||||
releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'>
|
||||
createIssue(owner: string, repo: string, title: string, body: string): Promise<void>;
|
||||
|
||||
releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'>;
|
||||
|
||||
/**
|
||||
* Returns what we think the current milestone for the repo is based on the due on date.
|
||||
* @returns The milestone id if one is found, else undefined
|
||||
*/
|
||||
getCurrentRepoMilestone(): Promise<number | undefined>;
|
||||
}
|
||||
|
||||
export interface GitHubIssue extends GitHub {
|
||||
getIssue(): Promise<Issue>
|
||||
getIssue(): Promise<Issue>;
|
||||
|
||||
postComment(body: string): Promise<void>
|
||||
deleteComment(id: number): Promise<void>
|
||||
getComments(last?: boolean): AsyncIterableIterator<Comment[]>
|
||||
postComment(body: string): Promise<void>;
|
||||
deleteComment(id: number): Promise<void>;
|
||||
getComments(last?: boolean): AsyncIterableIterator<Comment[]>;
|
||||
|
||||
closeIssue(): Promise<void>
|
||||
lockIssue(): Promise<void>
|
||||
reopenIssue(): Promise<void>
|
||||
closeIssue(reason: 'completed' | 'not_planned'): Promise<void>;
|
||||
lockIssue(): Promise<void>;
|
||||
unlockIssue(): Promise<void>;
|
||||
reopenIssue(): Promise<void>;
|
||||
|
||||
setMilestone(milestoneId: number): Promise<void>
|
||||
setMilestone(milestoneId: number): Promise<void>;
|
||||
|
||||
addLabel(label: string): Promise<void>
|
||||
removeLabel(label: string): Promise<void>
|
||||
addLabel(label: string): Promise<void>;
|
||||
removeLabel(label: string): Promise<void>;
|
||||
|
||||
addAssignee(assignee: string): Promise<void>
|
||||
removeAssignee(assignee: string): Promise<void>
|
||||
addAssignee(assignee: string): Promise<void>;
|
||||
removeAssignee(assignee: string): Promise<void>;
|
||||
|
||||
getClosingInfo(): Promise<{ hash: string | undefined; timestamp: number } | undefined>
|
||||
getClosingInfo(): Promise<{ hash: string | undefined; timestamp: number } | undefined>;
|
||||
}
|
||||
|
||||
type SortVar =
|
||||
@@ -54,47 +64,60 @@ type SortVar =
|
||||
| 'reactions-tada'
|
||||
| 'interactions'
|
||||
| 'created'
|
||||
| 'updated'
|
||||
type SortOrder = 'asc' | 'desc'
|
||||
| 'updated';
|
||||
type SortOrder = 'asc' | 'desc';
|
||||
export type Reactions = {
|
||||
'+1': number
|
||||
'-1': number
|
||||
laugh: number
|
||||
hooray: number
|
||||
confused: number
|
||||
heart: number
|
||||
rocket: number
|
||||
eyes: number
|
||||
}
|
||||
'+1': number;
|
||||
'-1': number;
|
||||
laugh: number;
|
||||
hooray: number;
|
||||
confused: number;
|
||||
heart: number;
|
||||
rocket: number;
|
||||
eyes: number;
|
||||
};
|
||||
|
||||
export interface User {
|
||||
name: string
|
||||
isGitHubApp?: boolean
|
||||
name: string;
|
||||
isGitHubApp?: boolean;
|
||||
}
|
||||
export interface Comment {
|
||||
author: User
|
||||
body: string
|
||||
id: number
|
||||
timestamp: number
|
||||
author: User;
|
||||
body: string;
|
||||
id: number;
|
||||
timestamp: number;
|
||||
}
|
||||
export interface Issue {
|
||||
author: User
|
||||
body: string
|
||||
title: string
|
||||
labels: string[]
|
||||
open: boolean
|
||||
locked: boolean
|
||||
number: number
|
||||
numComments: number
|
||||
reactions: Reactions
|
||||
milestoneId: number | null
|
||||
assignee?: string
|
||||
createdAt: number
|
||||
updatedAt: number
|
||||
closedAt?: number
|
||||
author: User;
|
||||
body: string;
|
||||
title: string;
|
||||
labels: string[];
|
||||
open: boolean;
|
||||
locked: boolean;
|
||||
number: number;
|
||||
isPr: boolean;
|
||||
numComments: number;
|
||||
reactions: Reactions;
|
||||
milestone: Milestone | null;
|
||||
assignee?: string;
|
||||
assignees: string[];
|
||||
createdAt: number;
|
||||
updatedAt: number;
|
||||
closedAt?: number;
|
||||
}
|
||||
export interface Milestone {
|
||||
milestoneId: number;
|
||||
title: string;
|
||||
description: string;
|
||||
numClosedIssues: number;
|
||||
numOpenIssues: number;
|
||||
dueOn: Date | null;
|
||||
createdAt: Date | null;
|
||||
closedAt: Date | null;
|
||||
state: 'open' | 'closed';
|
||||
}
|
||||
export interface Query {
|
||||
q: string
|
||||
sort?: SortVar
|
||||
order?: SortOrder
|
||||
q: string;
|
||||
sort?: SortVar;
|
||||
order?: SortOrder;
|
||||
}
|
||||
|
||||
+169
-90
@@ -5,11 +5,12 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OctoKitIssue = exports.OctoKit = exports.getNumRequests = void 0;
|
||||
const core_1 = require("@actions/core");
|
||||
const github_1 = require("@actions/github");
|
||||
const child_process_1 = require("child_process");
|
||||
const utils_1 = require("../common/utils");
|
||||
let numRequests = 0;
|
||||
exports.getNumRequests = () => numRequests;
|
||||
const getNumRequests = () => numRequests;
|
||||
exports.getNumRequests = getNumRequests;
|
||||
class OctoKit {
|
||||
constructor(token, params, options = { readonly: false }) {
|
||||
this.token = token;
|
||||
@@ -18,73 +19,97 @@ class OctoKit {
|
||||
// when in readonly mode, record labels just-created so at to not throw unneccesary errors
|
||||
this.mockLabels = new Set();
|
||||
this.writeAccessCache = {};
|
||||
this._octokit = new github_1.GitHub(token);
|
||||
this._octokit = (0, github_1.getOctokit)(token);
|
||||
this.repoName = params.repo;
|
||||
this.repoOwner = params.owner;
|
||||
}
|
||||
get octokit() {
|
||||
numRequests++;
|
||||
return this._octokit;
|
||||
}
|
||||
getIssueByNumber(number) {
|
||||
return new OctoKitIssue(this.token, this.params, { number: number });
|
||||
}
|
||||
// TODO: just iterate over the issues in a page here instead of making caller do it
|
||||
async *query(query) {
|
||||
const q = query.q + ` repo:${this.params.owner}/${this.params.repo}`;
|
||||
console.log(`Querying for ${q}:`);
|
||||
const options = this.octokit.search.issuesAndPullRequests.endpoint.merge({
|
||||
const options = {
|
||||
...query,
|
||||
q,
|
||||
per_page: 100,
|
||||
headers: { Accept: 'application/vnd.github.squirrel-girl-preview+json' },
|
||||
});
|
||||
};
|
||||
let pageNum = 0;
|
||||
const timeout = async () => {
|
||||
if (pageNum < 2) {
|
||||
/* pass */
|
||||
}
|
||||
else if (pageNum < 4) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 3000));
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||
}
|
||||
else {
|
||||
await new Promise((resolve) => setTimeout(resolve, 30000));
|
||||
}
|
||||
};
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(options)) {
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(this.octokit.rest.search.issuesAndPullRequests, options)) {
|
||||
await timeout();
|
||||
numRequests++;
|
||||
const page = pageResponse.data;
|
||||
console.log(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`);
|
||||
(0, utils_1.safeLog)(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`);
|
||||
yield page.map((issue) => new OctoKitIssue(this.token, this.params, this.octokitIssueToIssue(issue), this.options));
|
||||
}
|
||||
}
|
||||
async createIssue(owner, repo, title, body) {
|
||||
core_1.debug(`Creating issue \`${title}\` on ${owner}/${repo}`);
|
||||
(0, utils_1.safeLog)(`Creating issue \`${title}\` on ${owner}/${repo}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.create({ owner, repo, title, body });
|
||||
await this.octokit.rest.issues.create({ owner, repo, title, body });
|
||||
}
|
||||
octokitIssueToIssue(issue) {
|
||||
var _a, _b, _c, _d, _e, _f;
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
||||
return {
|
||||
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
|
||||
body: issue.body,
|
||||
author: { name: (_b = (_a = issue.user) === null || _a === void 0 ? void 0 : _a.login) !== null && _b !== void 0 ? _b : 'unkown', isGitHubApp: ((_c = issue.user) === null || _c === void 0 ? void 0 : _c.type) === 'Bot' },
|
||||
body: (_d = issue.body) !== null && _d !== void 0 ? _d : '',
|
||||
number: issue.number,
|
||||
title: issue.title,
|
||||
labels: issue.labels.map((label) => label.name),
|
||||
isPr: !!((_e = issue.pull_request) === null || _e === void 0 ? void 0 : _e.html_url),
|
||||
labels: issue.labels.map((label) => { var _a; return (typeof label === 'string' ? label : (_a = label.name) !== null && _a !== void 0 ? _a : ''); }),
|
||||
open: issue.state === 'open',
|
||||
locked: issue.locked,
|
||||
numComments: issue.comments,
|
||||
reactions: issue.reactions,
|
||||
assignee: (_b = (_a = issue.assignee) === null || _a === void 0 ? void 0 : _a.login) !== null && _b !== void 0 ? _b : (_d = (_c = issue.assignees) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.login,
|
||||
milestoneId: (_f = (_e = issue.milestone) === null || _e === void 0 ? void 0 : _e.number) !== null && _f !== void 0 ? _f : null,
|
||||
assignee: (_g = (_f = issue.assignee) === null || _f === void 0 ? void 0 : _f.login) !== null && _g !== void 0 ? _g : (_j = (_h = issue.assignees) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.login,
|
||||
assignees: (_l = (_k = issue.assignees) === null || _k === void 0 ? void 0 : _k.map((assignee) => assignee.login)) !== null && _l !== void 0 ? _l : [],
|
||||
milestone: issue.milestone ? this.octokitMilestoneToMilestone(issue.milestone) : null,
|
||||
createdAt: +new Date(issue.created_at),
|
||||
updatedAt: +new Date(issue.updated_at),
|
||||
closedAt: issue.closed_at ? +new Date(issue.closed_at) : undefined,
|
||||
};
|
||||
}
|
||||
octokitMilestoneToMilestone(milestone) {
|
||||
var _a;
|
||||
if ((milestone === null || milestone === void 0 ? void 0 : milestone.number) === undefined) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
title: milestone.title,
|
||||
milestoneId: milestone.number,
|
||||
// Remove the time portions of the dates as they're not important
|
||||
createdAt: milestone.created_at !== null ? new Date(milestone.created_at.split('T')[0]) : null,
|
||||
dueOn: milestone.due_on !== null ? new Date(milestone.due_on.split('T')[0]) : null,
|
||||
closedAt: milestone.closed_at !== null ? new Date(milestone.closed_at.split('T')[0]) : null,
|
||||
description: (_a = milestone.description) !== null && _a !== void 0 ? _a : '',
|
||||
numClosedIssues: milestone.closed_issues,
|
||||
numOpenIssues: milestone.open_issues,
|
||||
state: milestone.state === 'open' ? 'open' : 'closed',
|
||||
};
|
||||
}
|
||||
async hasWriteAccess(user) {
|
||||
if (user.name in this.writeAccessCache) {
|
||||
core_1.debug('Got permissions from cache for ' + user);
|
||||
(0, utils_1.safeLog)('Got permissions from cache for ' + user);
|
||||
return this.writeAccessCache[user.name];
|
||||
}
|
||||
core_1.debug('Fetching permissions for ' + user);
|
||||
const permissions = (await this.octokit.repos.getCollaboratorPermissionLevel({
|
||||
(0, utils_1.safeLog)('Fetching permissions for ' + user.name);
|
||||
const permissions = (await this.octokit.rest.repos.getCollaboratorPermissionLevel({
|
||||
...this.params,
|
||||
username: user.name,
|
||||
})).data.permission;
|
||||
@@ -92,42 +117,44 @@ class OctoKit {
|
||||
}
|
||||
async repoHasLabel(name) {
|
||||
try {
|
||||
await this.octokit.issues.getLabel({ ...this.params, name });
|
||||
await this.octokit.rest.issues.getLabel({ ...this.params, name });
|
||||
return true;
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
const statusErorr = err;
|
||||
if (statusErorr.status === 404) {
|
||||
return this.options.readonly && this.mockLabels.has(name);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async createLabel(name, color, description) {
|
||||
core_1.debug('Creating label ' + name);
|
||||
(0, utils_1.safeLog)('Creating label ' + name);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createLabel({ ...this.params, color, description, name });
|
||||
await this.octokit.rest.issues.createLabel({ ...this.params, color, description, name });
|
||||
else
|
||||
this.mockLabels.add(name);
|
||||
}
|
||||
async deleteLabel(name) {
|
||||
core_1.debug('Deleting label ' + name);
|
||||
(0, utils_1.safeLog)('Deleting label ' + name);
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteLabel({ ...this.params, name });
|
||||
await this.octokit.rest.issues.deleteLabel({ ...this.params, name });
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
const statusErorr = err;
|
||||
if (statusErorr.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async readConfig(path) {
|
||||
core_1.debug('Reading config at ' + path);
|
||||
(0, utils_1.safeLog)('Reading config at ' + path);
|
||||
const repoPath = `.github/${path}.json`;
|
||||
try {
|
||||
const data = (await this.octokit.repos.getContents({ ...this.params, path: repoPath })).data;
|
||||
if ('type' in data && data.type === 'file') {
|
||||
const data = (await this.octokit.rest.repos.getContent({ ...this.params, path: repoPath })).data;
|
||||
if ('type' in data && data.type === 'file' && 'content' in data) {
|
||||
if (data.encoding === 'base64' && data.content) {
|
||||
return JSON.parse(Buffer.from(data.content, 'base64').toString('utf-8'));
|
||||
}
|
||||
@@ -140,7 +167,10 @@ class OctoKit {
|
||||
}
|
||||
}
|
||||
async releaseContainsCommit(release, commit) {
|
||||
return new Promise((resolve, reject) => child_process_1.exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
|
||||
const isHash = (s) => /^[a-fA-F0-9]*$/.test(s);
|
||||
if (!isHash(release) || !isHash(commit))
|
||||
return 'unknown';
|
||||
return new Promise((resolve, reject) => (0, child_process_1.exec)(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
|
||||
if (!err || err.code === 1) {
|
||||
resolve(!err ? 'yes' : 'no');
|
||||
}
|
||||
@@ -157,10 +187,31 @@ class OctoKit {
|
||||
}
|
||||
}));
|
||||
}
|
||||
async getCurrentRepoMilestone() {
|
||||
(0, utils_1.safeLog)(`Getting repo milestone for ${this.params.owner}/${this.params.repo}`);
|
||||
// Fetch all milestones open for this repo
|
||||
const allMilestones = (await this.octokit.rest.issues.listMilestones({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
state: 'open',
|
||||
sort: 'due_on',
|
||||
direction: 'asc',
|
||||
})).data;
|
||||
const currentDate = new Date();
|
||||
const possibleMilestones = allMilestones
|
||||
.filter((milestone) => new Date(milestone.due_on === null ? currentDate : milestone.due_on) > currentDate &&
|
||||
currentDate > new Date(milestone.created_at) &&
|
||||
!milestone.title.includes('Recovery'))
|
||||
.sort((a, b) => { var _a, _b; return +new Date((_a = a.due_on) !== null && _a !== void 0 ? _a : currentDate) - +new Date((_b = b.due_on) !== null && _b !== void 0 ? _b : currentDate); });
|
||||
if (possibleMilestones.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
return possibleMilestones[0].number;
|
||||
}
|
||||
async dispatch(title) {
|
||||
core_1.debug('Dispatching ' + title);
|
||||
(0, utils_1.safeLog)('Dispatching ' + title);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title });
|
||||
await this.octokit.rest.repos.createDispatchEvent({ ...this.params, event_type: title });
|
||||
}
|
||||
}
|
||||
exports.OctoKit = OctoKit;
|
||||
@@ -169,12 +220,12 @@ class OctoKitIssue extends OctoKit {
|
||||
super(token, params, options);
|
||||
this.params = params;
|
||||
this.issueData = issueData;
|
||||
console.log('running bot on issue', issueData.number);
|
||||
(0, utils_1.safeLog)('running bot on issue', issueData.number);
|
||||
}
|
||||
async addAssignee(assignee) {
|
||||
core_1.debug('Adding assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
(0, utils_1.safeLog)('Adding assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.addAssignees({
|
||||
await this.octokit.rest.issues.addAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
@@ -182,45 +233,64 @@ class OctoKitIssue extends OctoKit {
|
||||
}
|
||||
}
|
||||
async removeAssignee(assignee) {
|
||||
core_1.debug('Removing assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
(0, utils_1.safeLog)('Removing assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.removeAssignees({
|
||||
await this.octokit.rest.issues.removeAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
});
|
||||
}
|
||||
}
|
||||
async closeIssue() {
|
||||
core_1.debug('Closing issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
async closeIssue(reason) {
|
||||
(0, utils_1.safeLog)('Closing issue ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
const issue = await this.octokit.rest.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
});
|
||||
// Don't close already closed issues even if it means changing the state
|
||||
if (issue.data.state === 'closed') {
|
||||
return;
|
||||
}
|
||||
await this.octokit.rest.issues
|
||||
.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'closed',
|
||||
state_reason: reason,
|
||||
})
|
||||
.catch((e) => {
|
||||
(0, utils_1.safeLog)('error closing issue:', e);
|
||||
});
|
||||
}
|
||||
}
|
||||
async reopenIssue() {
|
||||
core_1.debug('Reopening issue ' + this.issueData.number);
|
||||
(0, utils_1.safeLog)('Reopening issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
await this.octokit.rest.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'open',
|
||||
});
|
||||
}
|
||||
async lockIssue() {
|
||||
core_1.debug('Locking issue ' + this.issueData.number);
|
||||
(0, utils_1.safeLog)('Locking issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.lock({ ...this.params, issue_number: this.issueData.number });
|
||||
await this.octokit.rest.issues.lock({ ...this.params, issue_number: this.issueData.number });
|
||||
}
|
||||
async unlockIssue() {
|
||||
(0, utils_1.safeLog)('Unlocking issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.rest.issues.unlock({ ...this.params, issue_number: this.issueData.number });
|
||||
}
|
||||
async getIssue() {
|
||||
if (isIssue(this.issueData)) {
|
||||
core_1.debug('Got issue data from query result ' + this.issueData.number);
|
||||
(0, utils_1.safeLog)('Got issue data from query result ' + this.issueData.number);
|
||||
return this.issueData;
|
||||
}
|
||||
console.log('Fetching issue ' + this.issueData.number);
|
||||
const issue = (await this.octokit.issues.get({
|
||||
(0, utils_1.safeLog)('Fetching issue ' + this.issueData.number);
|
||||
const issue = (await this.octokit.rest.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
mediaType: { previews: ['squirrel-girl'] },
|
||||
@@ -228,77 +298,83 @@ class OctoKitIssue extends OctoKit {
|
||||
return (this.issueData = this.octokitIssueToIssue(issue));
|
||||
}
|
||||
async postComment(body) {
|
||||
core_1.debug(`Posting comment ${body} on ${this.issueData.number}`);
|
||||
(0, utils_1.safeLog)(`Posting comment on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createComment({
|
||||
await this.octokit.rest.issues.createComment({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
body,
|
||||
});
|
||||
}
|
||||
async deleteComment(id) {
|
||||
core_1.debug(`Deleting comment ${id} on ${this.issueData.number}`);
|
||||
(0, utils_1.safeLog)(`Deleting comment ${id} on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteComment({
|
||||
await this.octokit.rest.issues.deleteComment({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
comment_id: id,
|
||||
});
|
||||
}
|
||||
async setMilestone(milestoneId) {
|
||||
core_1.debug(`Setting milestone for ${this.issueData.number} to ${milestoneId}`);
|
||||
(0, utils_1.safeLog)(`Setting milestone for ${this.issueData.number} to ${milestoneId}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
await this.octokit.rest.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
milestone: milestoneId,
|
||||
});
|
||||
}
|
||||
async *getComments(last) {
|
||||
core_1.debug('Fetching comments for ' + this.issueData.number);
|
||||
const response = this.octokit.paginate.iterator(this.octokit.issues.listComments.endpoint.merge({
|
||||
(0, utils_1.safeLog)('Fetching comments for ' + this.issueData.number);
|
||||
const response = this.octokit.paginate.iterator(this.octokit.rest.issues.listComments, {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
per_page: 100,
|
||||
...(last ? { per_page: 1, page: (await this.getIssue()).numComments } : {}),
|
||||
}));
|
||||
});
|
||||
for await (const page of response) {
|
||||
numRequests++;
|
||||
yield page.data.map((comment) => ({
|
||||
author: { name: comment.user.login, isGitHubApp: comment.user.type === 'Bot' },
|
||||
body: comment.body,
|
||||
id: comment.id,
|
||||
timestamp: +new Date(comment.created_at),
|
||||
}));
|
||||
yield page.data.map((comment) => {
|
||||
var _a, _b, _c, _d;
|
||||
return ({
|
||||
author: { name: (_b = (_a = comment.user) === null || _a === void 0 ? void 0 : _a.login) !== null && _b !== void 0 ? _b : '', isGitHubApp: ((_c = comment.user) === null || _c === void 0 ? void 0 : _c.type) === 'Bot' },
|
||||
body: (_d = comment.body) !== null && _d !== void 0 ? _d : '',
|
||||
id: comment.id,
|
||||
timestamp: +new Date(comment.created_at),
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
async addLabel(name) {
|
||||
core_1.debug(`Adding label ${name} to ${this.issueData.number}`);
|
||||
(0, utils_1.safeLog)(`Adding label ${name} to ${this.issueData.number}`);
|
||||
if (!(await this.repoHasLabel(name))) {
|
||||
throw Error(`Action could not execute becuase label ${name} is not defined.`);
|
||||
}
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.addLabels({
|
||||
await this.octokit.rest.issues.addLabels({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
labels: [name],
|
||||
});
|
||||
}
|
||||
async getAssigner(assignee) {
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
var _a, _b;
|
||||
const options = {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
});
|
||||
};
|
||||
let assigner;
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
for await (const event of this.octokit.paginate.iterator(this.octokit.rest.issues.listEventsForTimeline, options)) {
|
||||
numRequests++;
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (timelineEvent.event === 'assigned' &&
|
||||
timelineEvent.assignee.login === assignee) {
|
||||
assigner = timelineEvent.actor.login;
|
||||
if (timelineEvent.event === 'assigned' && ((_a = timelineEvent.assignee) === null || _a === void 0 ? void 0 : _a.login) === assignee) {
|
||||
assigner = (_b = timelineEvent.actor) === null || _b === void 0 ? void 0 : _b.login;
|
||||
}
|
||||
}
|
||||
if (assigner) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!assigner) {
|
||||
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.');
|
||||
@@ -306,25 +382,26 @@ class OctoKitIssue extends OctoKit {
|
||||
return assigner;
|
||||
}
|
||||
async removeLabel(name) {
|
||||
core_1.debug(`Removing label ${name} from ${this.issueData.number}`);
|
||||
(0, utils_1.safeLog)(`Removing label ${name} from ${this.issueData.number}`);
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.removeLabel({
|
||||
await this.octokit.rest.issues.removeLabel({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
name,
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
console.log(`Label ${name} not found on issue`);
|
||||
const statusErorr = err;
|
||||
if (statusErorr.status === 404) {
|
||||
(0, utils_1.safeLog)(`Label ${name} not found on issue`);
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async getClosingInfo(alreadyChecked = []) {
|
||||
var _a, _b, _c, _d, _e, _f, _g;
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h;
|
||||
if (alreadyChecked.includes(this.issueData.number)) {
|
||||
return undefined;
|
||||
}
|
||||
@@ -332,22 +409,21 @@ class OctoKitIssue extends OctoKit {
|
||||
if ((await this.getIssue()).open) {
|
||||
return;
|
||||
}
|
||||
const closingHashComment = /(?:\\|\/)closedWith (\S*)/;
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
const closingHashComment = /(?:\\|\/)closedWith (?:https:\/\/github\.com\/microsoft\/vscode\/commit\/)?([a-fA-F0-9]{7,40})/;
|
||||
const options = {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
});
|
||||
};
|
||||
let closingCommit;
|
||||
const crossReferencing = [];
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
for await (const event of this.octokit.paginate.iterator(this.octokit.rest.issues.listEventsForTimeline, options)) {
|
||||
numRequests++;
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if ((timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
|
||||
timelineEvent.created_at &&
|
||||
timelineEvent.commit_id &&
|
||||
timelineEvent.commit_url
|
||||
.toLowerCase()
|
||||
.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase())) {
|
||||
((_a = timelineEvent.commit_url) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) {
|
||||
closingCommit = {
|
||||
hash: timelineEvent.commit_id,
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
@@ -356,15 +432,18 @@ class OctoKitIssue extends OctoKit {
|
||||
if (timelineEvent.event === 'reopened') {
|
||||
closingCommit = undefined;
|
||||
}
|
||||
if (timelineEvent.event === 'commented' &&
|
||||
!((_a = timelineEvent.body) === null || _a === void 0 ? void 0 : _a.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE')) &&
|
||||
if (timelineEvent.created_at &&
|
||||
timelineEvent.event === 'commented' &&
|
||||
!((_b = timelineEvent.body) === null || _b === void 0 ? void 0 : _b.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE')) &&
|
||||
closingHashComment.test(timelineEvent.body)) {
|
||||
closingCommit = {
|
||||
hash: closingHashComment.exec(timelineEvent.body)[1],
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
};
|
||||
}
|
||||
if (timelineEvent.event === 'cross-referenced' && ((_c = (_b = timelineEvent.source) === null || _b === void 0 ? void 0 : _b.issue) === null || _c === void 0 ? void 0 : _c.number) && ((_f = (_e = (_d = timelineEvent.source) === null || _d === void 0 ? void 0 : _d.issue) === null || _e === void 0 ? void 0 : _e.pull_request) === null || _f === void 0 ? void 0 : _f.url.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) {
|
||||
if (timelineEvent.event === 'cross-referenced' &&
|
||||
((_d = (_c = timelineEvent.source) === null || _c === void 0 ? void 0 : _c.issue) === null || _d === void 0 ? void 0 : _d.number) &&
|
||||
((_g = (_f = (_e = timelineEvent.source) === null || _e === void 0 ? void 0 : _e.issue) === null || _f === void 0 ? void 0 : _f.pull_request) === null || _g === void 0 ? void 0 : _g.url.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) {
|
||||
crossReferencing.push(timelineEvent.source.issue.number);
|
||||
}
|
||||
}
|
||||
@@ -375,16 +454,16 @@ class OctoKitIssue extends OctoKit {
|
||||
for (const id of crossReferencing.reverse()) {
|
||||
const closed = await new OctoKitIssue(this.token, this.params, {
|
||||
number: id,
|
||||
}, this.options).getClosingInfo(alreadyChecked);
|
||||
}).getClosingInfo(alreadyChecked);
|
||||
if (closed) {
|
||||
if (Math.abs(closed.timestamp - ((_g = (await this.getIssue()).closedAt) !== null && _g !== void 0 ? _g : 0)) < 5000) {
|
||||
if (Math.abs(closed.timestamp - ((_h = (await this.getIssue()).closedAt) !== null && _h !== void 0 ? _h : 0)) < 5000) {
|
||||
closingCommit = closed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`);
|
||||
(0, utils_1.safeLog)(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`);
|
||||
return closingCommit;
|
||||
}
|
||||
}
|
||||
|
||||
+260
-171
@@ -3,181 +3,242 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { debug } from '@actions/core'
|
||||
import { GitHub as GitHubAPI } from '@actions/github'
|
||||
import { Octokit } from '@octokit/rest'
|
||||
import { exec } from 'child_process'
|
||||
import { Comment, GitHub, GitHubIssue, Issue, Query, User } from './api'
|
||||
import { getOctokit } from '@actions/github';
|
||||
import type { RequestError } from '@octokit/request-error';
|
||||
import { exec } from 'child_process';
|
||||
import { IssueGetResponse, IssuesGetResponseMilestone } from '../common/OctokitTypings';
|
||||
import { safeLog } from '../common/utils';
|
||||
import { Comment, GitHub, GitHubIssue, Issue, Milestone, Query, User } from './api';
|
||||
|
||||
let numRequests = 0
|
||||
export const getNumRequests = () => numRequests
|
||||
let numRequests = 0;
|
||||
export const getNumRequests = () => numRequests;
|
||||
|
||||
export class OctoKit implements GitHub {
|
||||
private _octokit: GitHubAPI
|
||||
protected get octokit(): GitHubAPI {
|
||||
numRequests++
|
||||
return this._octokit
|
||||
private _octokit: ReturnType<typeof getOctokit>;
|
||||
protected get octokit(): ReturnType<typeof getOctokit> {
|
||||
numRequests++;
|
||||
return this._octokit;
|
||||
}
|
||||
|
||||
// when in readonly mode, record labels just-created so at to not throw unneccesary errors
|
||||
protected mockLabels: Set<string> = new Set()
|
||||
protected mockLabels: Set<string> = new Set();
|
||||
|
||||
public readonly repoName: string;
|
||||
public readonly repoOwner: string;
|
||||
|
||||
constructor(
|
||||
protected token: string,
|
||||
protected params: { repo: string; owner: string },
|
||||
protected options: { readonly: boolean } = { readonly: false },
|
||||
) {
|
||||
this._octokit = new GitHubAPI(token)
|
||||
this._octokit = getOctokit(token);
|
||||
this.repoName = params.repo;
|
||||
this.repoOwner = params.owner;
|
||||
}
|
||||
|
||||
getIssueByNumber(number: number) {
|
||||
return new OctoKitIssue(this.token, this.params, { number: number });
|
||||
}
|
||||
|
||||
// TODO: just iterate over the issues in a page here instead of making caller do it
|
||||
async *query(query: Query): AsyncIterableIterator<GitHubIssue[]> {
|
||||
const q = query.q + ` repo:${this.params.owner}/${this.params.repo}`
|
||||
console.log(`Querying for ${q}:`)
|
||||
const q = query.q + ` repo:${this.params.owner}/${this.params.repo}`;
|
||||
|
||||
const options = this.octokit.search.issuesAndPullRequests.endpoint.merge({
|
||||
const options = {
|
||||
...query,
|
||||
q,
|
||||
per_page: 100,
|
||||
headers: { Accept: 'application/vnd.github.squirrel-girl-preview+json' },
|
||||
})
|
||||
};
|
||||
|
||||
let pageNum = 0
|
||||
let pageNum = 0;
|
||||
|
||||
const timeout = async () => {
|
||||
if (pageNum < 2) {
|
||||
/* pass */
|
||||
} else if (pageNum < 4) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 3000))
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||
} else {
|
||||
await new Promise((resolve) => setTimeout(resolve, 30000))
|
||||
await new Promise((resolve) => setTimeout(resolve, 30000));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(options)) {
|
||||
await timeout()
|
||||
numRequests++
|
||||
const page: Array<Octokit.SearchIssuesAndPullRequestsResponseItemsItem> = pageResponse.data
|
||||
console.log(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`)
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(
|
||||
this.octokit.rest.search.issuesAndPullRequests,
|
||||
options,
|
||||
)) {
|
||||
await timeout();
|
||||
numRequests++;
|
||||
const page = pageResponse.data;
|
||||
safeLog(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`);
|
||||
yield page.map(
|
||||
(issue) => new OctoKitIssue(this.token, this.params, this.octokitIssueToIssue(issue), this.options),
|
||||
)
|
||||
(issue) =>
|
||||
new OctoKitIssue(this.token, this.params, this.octokitIssueToIssue(issue), this.options),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async createIssue(owner: string, repo: string, title: string, body: string): Promise<void> {
|
||||
debug(`Creating issue \`${title}\` on ${owner}/${repo}`)
|
||||
if (!this.options.readonly) await this.octokit.issues.create({ owner, repo, title, body })
|
||||
safeLog(`Creating issue \`${title}\` on ${owner}/${repo}`);
|
||||
if (!this.options.readonly) await this.octokit.rest.issues.create({ owner, repo, title, body });
|
||||
}
|
||||
|
||||
protected octokitIssueToIssue(
|
||||
issue: Octokit.IssuesGetResponse | Octokit.SearchIssuesAndPullRequestsResponseItemsItem,
|
||||
): Issue {
|
||||
protected octokitIssueToIssue(issue: IssueGetResponse): Issue {
|
||||
return {
|
||||
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
|
||||
body: issue.body,
|
||||
author: { name: issue.user?.login ?? 'unkown', isGitHubApp: issue.user?.type === 'Bot' },
|
||||
body: issue.body ?? '',
|
||||
number: issue.number,
|
||||
title: issue.title,
|
||||
labels: (issue.labels as Octokit.IssuesGetLabelResponse[]).map((label) => label.name),
|
||||
isPr: !!issue.pull_request?.html_url,
|
||||
labels: issue.labels.map((label) => (typeof label === 'string' ? label : label.name ?? '')),
|
||||
open: issue.state === 'open',
|
||||
locked: (issue as any).locked,
|
||||
numComments: issue.comments,
|
||||
reactions: (issue as any).reactions,
|
||||
assignee: issue.assignee?.login ?? (issue as any).assignees?.[0]?.login,
|
||||
milestoneId: issue.milestone?.number ?? null,
|
||||
assignee: issue.assignee?.login ?? (issue as IssueGetResponse).assignees?.[0]?.login,
|
||||
assignees: (issue as IssueGetResponse).assignees?.map((assignee) => assignee.login) ?? [],
|
||||
milestone: issue.milestone ? this.octokitMilestoneToMilestone(issue.milestone) : null,
|
||||
createdAt: +new Date(issue.created_at),
|
||||
updatedAt: +new Date(issue.updated_at),
|
||||
closedAt: issue.closed_at ? +new Date((issue.closed_at as unknown) as string) : undefined,
|
||||
}
|
||||
closedAt: issue.closed_at ? +new Date(issue.closed_at as unknown as string) : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
private writeAccessCache: Record<string, boolean> = {}
|
||||
protected octokitMilestoneToMilestone(milestone: IssuesGetResponseMilestone): Milestone | null {
|
||||
if (milestone?.number === undefined) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
title: milestone.title,
|
||||
milestoneId: milestone.number,
|
||||
// Remove the time portions of the dates as they're not important
|
||||
createdAt: milestone.created_at !== null ? new Date(milestone.created_at.split('T')[0]) : null,
|
||||
dueOn: milestone.due_on !== null ? new Date(milestone.due_on.split('T')[0]) : null,
|
||||
closedAt: milestone.closed_at !== null ? new Date(milestone.closed_at.split('T')[0]) : null,
|
||||
description: milestone.description ?? '',
|
||||
numClosedIssues: milestone.closed_issues,
|
||||
numOpenIssues: milestone.open_issues,
|
||||
state: milestone.state === 'open' ? 'open' : 'closed',
|
||||
};
|
||||
}
|
||||
|
||||
private writeAccessCache: Record<string, boolean> = {};
|
||||
async hasWriteAccess(user: User): Promise<boolean> {
|
||||
if (user.name in this.writeAccessCache) {
|
||||
debug('Got permissions from cache for ' + user)
|
||||
return this.writeAccessCache[user.name]
|
||||
safeLog('Got permissions from cache for ' + user);
|
||||
return this.writeAccessCache[user.name];
|
||||
}
|
||||
debug('Fetching permissions for ' + user)
|
||||
safeLog('Fetching permissions for ' + user.name);
|
||||
const permissions = (
|
||||
await this.octokit.repos.getCollaboratorPermissionLevel({
|
||||
await this.octokit.rest.repos.getCollaboratorPermissionLevel({
|
||||
...this.params,
|
||||
username: user.name,
|
||||
})
|
||||
).data.permission
|
||||
return (this.writeAccessCache[user.name] = permissions === 'admin' || permissions === 'write')
|
||||
).data.permission;
|
||||
return (this.writeAccessCache[user.name] = permissions === 'admin' || permissions === 'write');
|
||||
}
|
||||
|
||||
async repoHasLabel(name: string): Promise<boolean> {
|
||||
try {
|
||||
await this.octokit.issues.getLabel({ ...this.params, name })
|
||||
return true
|
||||
await this.octokit.rest.issues.getLabel({ ...this.params, name });
|
||||
return true;
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
return this.options.readonly && this.mockLabels.has(name)
|
||||
const statusErorr = err as RequestError;
|
||||
if (statusErorr.status === 404) {
|
||||
return this.options.readonly && this.mockLabels.has(name);
|
||||
}
|
||||
throw err
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
async createLabel(name: string, color: string, description: string): Promise<void> {
|
||||
debug('Creating label ' + name)
|
||||
safeLog('Creating label ' + name);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createLabel({ ...this.params, color, description, name })
|
||||
else this.mockLabels.add(name)
|
||||
await this.octokit.rest.issues.createLabel({ ...this.params, color, description, name });
|
||||
else this.mockLabels.add(name);
|
||||
}
|
||||
|
||||
async deleteLabel(name: string): Promise<void> {
|
||||
debug('Deleting label ' + name)
|
||||
safeLog('Deleting label ' + name);
|
||||
try {
|
||||
if (!this.options.readonly) await this.octokit.issues.deleteLabel({ ...this.params, name })
|
||||
if (!this.options.readonly) await this.octokit.rest.issues.deleteLabel({ ...this.params, name });
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
return
|
||||
const statusErorr = err as RequestError;
|
||||
if (statusErorr.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw err
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
async readConfig(path: string): Promise<any> {
|
||||
debug('Reading config at ' + path)
|
||||
const repoPath = `.github/${path}.json`
|
||||
safeLog('Reading config at ' + path);
|
||||
const repoPath = `.github/${path}.json`;
|
||||
try {
|
||||
const data = (await this.octokit.repos.getContents({ ...this.params, path: repoPath })).data
|
||||
|
||||
if ('type' in data && data.type === 'file') {
|
||||
const data = (await this.octokit.rest.repos.getContent({ ...this.params, path: repoPath })).data;
|
||||
if ('type' in data && data.type === 'file' && 'content' in data) {
|
||||
if (data.encoding === 'base64' && data.content) {
|
||||
return JSON.parse(Buffer.from(data.content, 'base64').toString('utf-8'))
|
||||
return JSON.parse(Buffer.from(data.content, 'base64').toString('utf-8'));
|
||||
}
|
||||
throw Error(`Could not read contents "${data.content}" in encoding "${data.encoding}"`)
|
||||
throw Error(`Could not read contents "${data.content}" in encoding "${data.encoding}"`);
|
||||
}
|
||||
throw Error('Found directory at config path when expecting file' + JSON.stringify(data))
|
||||
throw Error('Found directory at config path when expecting file' + JSON.stringify(data));
|
||||
} catch (e) {
|
||||
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e))
|
||||
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e));
|
||||
}
|
||||
}
|
||||
|
||||
async releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'> {
|
||||
const isHash = (s: string) => /^[a-fA-F0-9]*$/.test(s);
|
||||
if (!isHash(release) || !isHash(commit)) return 'unknown';
|
||||
return new Promise((resolve, reject) =>
|
||||
exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
|
||||
if (!err || err.code === 1) {
|
||||
resolve(!err ? 'yes' : 'no')
|
||||
resolve(!err ? 'yes' : 'no');
|
||||
} else if (err.message.includes(`Not a valid commit name ${release}`)) {
|
||||
// release branch is forked. Probably in endgame. Not released.
|
||||
resolve('no')
|
||||
resolve('no');
|
||||
} else if (err.message.includes(`Not a valid commit name ${commit}`)) {
|
||||
// commit is probably in a different repo.
|
||||
resolve('unknown')
|
||||
resolve('unknown');
|
||||
} else {
|
||||
reject(err)
|
||||
reject(err);
|
||||
}
|
||||
}),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
async getCurrentRepoMilestone(): Promise<number | undefined> {
|
||||
safeLog(`Getting repo milestone for ${this.params.owner}/${this.params.repo}`);
|
||||
// Fetch all milestones open for this repo
|
||||
const allMilestones = (
|
||||
await this.octokit.rest.issues.listMilestones({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
state: 'open',
|
||||
sort: 'due_on',
|
||||
direction: 'asc',
|
||||
})
|
||||
).data;
|
||||
const currentDate = new Date();
|
||||
const possibleMilestones = allMilestones
|
||||
.filter(
|
||||
(milestone) =>
|
||||
new Date(milestone.due_on === null ? currentDate : milestone.due_on) > currentDate &&
|
||||
currentDate > new Date(milestone.created_at) &&
|
||||
!milestone.title.includes('Recovery'),
|
||||
)
|
||||
.sort((a, b) => +new Date(a.due_on ?? currentDate) - +new Date(b.due_on ?? currentDate));
|
||||
if (possibleMilestones.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
return possibleMilestones[0].number;
|
||||
}
|
||||
|
||||
async dispatch(title: string): Promise<void> {
|
||||
debug('Dispatching ' + title)
|
||||
safeLog('Dispatching ' + title);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title })
|
||||
await this.octokit.rest.repos.createDispatchEvent({ ...this.params, event_type: title });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,184 +249,206 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
private issueData: { number: number } | Issue,
|
||||
options: { readonly: boolean } = { readonly: false },
|
||||
) {
|
||||
super(token, params, options)
|
||||
console.log('running bot on issue', issueData.number)
|
||||
super(token, params, options);
|
||||
safeLog('running bot on issue', issueData.number);
|
||||
}
|
||||
|
||||
async addAssignee(assignee: string): Promise<void> {
|
||||
debug('Adding assignee ' + assignee + ' to ' + this.issueData.number)
|
||||
safeLog('Adding assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.addAssignees({
|
||||
await this.octokit.rest.issues.addAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async removeAssignee(assignee: string): Promise<void> {
|
||||
debug('Removing assignee ' + assignee + ' to ' + this.issueData.number)
|
||||
safeLog('Removing assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.removeAssignees({
|
||||
await this.octokit.rest.issues.removeAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async closeIssue(): Promise<void> {
|
||||
debug('Closing issue ' + this.issueData.number)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
async closeIssue(reason: 'completed' | 'not_planned'): Promise<void> {
|
||||
safeLog('Closing issue ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
const issue = await this.octokit.rest.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'closed',
|
||||
})
|
||||
});
|
||||
// Don't close already closed issues even if it means changing the state
|
||||
if (issue.data.state === 'closed') {
|
||||
return;
|
||||
}
|
||||
await this.octokit.rest.issues
|
||||
.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'closed',
|
||||
state_reason: reason,
|
||||
})
|
||||
.catch((e) => {
|
||||
safeLog('error closing issue:', e);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async reopenIssue(): Promise<void> {
|
||||
debug('Reopening issue ' + this.issueData.number)
|
||||
safeLog('Reopening issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
await this.octokit.rest.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'open',
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async lockIssue(): Promise<void> {
|
||||
debug('Locking issue ' + this.issueData.number)
|
||||
safeLog('Locking issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.lock({ ...this.params, issue_number: this.issueData.number })
|
||||
await this.octokit.rest.issues.lock({ ...this.params, issue_number: this.issueData.number });
|
||||
}
|
||||
|
||||
async unlockIssue(): Promise<void> {
|
||||
safeLog('Unlocking issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.rest.issues.unlock({ ...this.params, issue_number: this.issueData.number });
|
||||
}
|
||||
|
||||
async getIssue(): Promise<Issue> {
|
||||
if (isIssue(this.issueData)) {
|
||||
debug('Got issue data from query result ' + this.issueData.number)
|
||||
return this.issueData
|
||||
safeLog('Got issue data from query result ' + this.issueData.number);
|
||||
return this.issueData;
|
||||
}
|
||||
|
||||
console.log('Fetching issue ' + this.issueData.number)
|
||||
safeLog('Fetching issue ' + this.issueData.number);
|
||||
const issue = (
|
||||
await this.octokit.issues.get({
|
||||
await this.octokit.rest.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
mediaType: { previews: ['squirrel-girl'] },
|
||||
})
|
||||
).data
|
||||
return (this.issueData = this.octokitIssueToIssue(issue))
|
||||
).data;
|
||||
return (this.issueData = this.octokitIssueToIssue(issue));
|
||||
}
|
||||
|
||||
async postComment(body: string): Promise<void> {
|
||||
debug(`Posting comment ${body} on ${this.issueData.number}`)
|
||||
safeLog(`Posting comment on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createComment({
|
||||
await this.octokit.rest.issues.createComment({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
body,
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async deleteComment(id: number): Promise<void> {
|
||||
debug(`Deleting comment ${id} on ${this.issueData.number}`)
|
||||
safeLog(`Deleting comment ${id} on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteComment({
|
||||
await this.octokit.rest.issues.deleteComment({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
comment_id: id,
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async setMilestone(milestoneId: number) {
|
||||
debug(`Setting milestone for ${this.issueData.number} to ${milestoneId}`)
|
||||
safeLog(`Setting milestone for ${this.issueData.number} to ${milestoneId}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
await this.octokit.rest.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
milestone: milestoneId,
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async *getComments(last?: boolean): AsyncIterableIterator<Comment[]> {
|
||||
debug('Fetching comments for ' + this.issueData.number)
|
||||
safeLog('Fetching comments for ' + this.issueData.number);
|
||||
|
||||
const response = this.octokit.paginate.iterator(
|
||||
this.octokit.issues.listComments.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
per_page: 100,
|
||||
...(last ? { per_page: 1, page: (await this.getIssue()).numComments } : {}),
|
||||
}),
|
||||
)
|
||||
const response = this.octokit.paginate.iterator(this.octokit.rest.issues.listComments, {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
per_page: 100,
|
||||
...(last ? { per_page: 1, page: (await this.getIssue()).numComments } : {}),
|
||||
});
|
||||
|
||||
for await (const page of response) {
|
||||
numRequests++
|
||||
yield (page.data as Octokit.IssuesListCommentsResponseItem[]).map((comment) => ({
|
||||
author: { name: comment.user.login, isGitHubApp: comment.user.type === 'Bot' },
|
||||
body: comment.body,
|
||||
numRequests++;
|
||||
yield page.data.map((comment) => ({
|
||||
author: { name: comment.user?.login ?? '', isGitHubApp: comment.user?.type === 'Bot' },
|
||||
body: comment.body ?? '',
|
||||
id: comment.id,
|
||||
timestamp: +new Date(comment.created_at),
|
||||
}))
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
async addLabel(name: string): Promise<void> {
|
||||
debug(`Adding label ${name} to ${this.issueData.number}`)
|
||||
safeLog(`Adding label ${name} to ${this.issueData.number}`);
|
||||
if (!(await this.repoHasLabel(name))) {
|
||||
throw Error(`Action could not execute becuase label ${name} is not defined.`)
|
||||
throw Error(`Action could not execute becuase label ${name} is not defined.`);
|
||||
}
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.addLabels({
|
||||
await this.octokit.rest.issues.addLabels({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
labels: [name],
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async getAssigner(assignee: string): Promise<string> {
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
const options = {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
})
|
||||
};
|
||||
|
||||
let assigner: string | undefined
|
||||
let assigner: string | undefined;
|
||||
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++
|
||||
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
|
||||
for await (const event of this.octokit.paginate.iterator(
|
||||
this.octokit.rest.issues.listEventsForTimeline,
|
||||
options,
|
||||
)) {
|
||||
numRequests++;
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (
|
||||
timelineEvent.event === 'assigned' &&
|
||||
(timelineEvent as any).assignee.login === assignee
|
||||
) {
|
||||
assigner = timelineEvent.actor.login
|
||||
if (timelineEvent.event === 'assigned' && timelineEvent.assignee?.login === assignee) {
|
||||
assigner = timelineEvent.actor?.login;
|
||||
}
|
||||
}
|
||||
if (assigner) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!assigner) {
|
||||
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.')
|
||||
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.');
|
||||
}
|
||||
|
||||
return assigner
|
||||
return assigner;
|
||||
}
|
||||
|
||||
async removeLabel(name: string): Promise<void> {
|
||||
debug(`Removing label ${name} from ${this.issueData.number}`)
|
||||
safeLog(`Removing label ${name} from ${this.issueData.number}`);
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.removeLabel({
|
||||
await this.octokit.rest.issues.removeLabel({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
name,
|
||||
})
|
||||
});
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
console.log(`Label ${name} not found on issue`)
|
||||
return
|
||||
const statusErorr = err as RequestError;
|
||||
if (statusErorr.status === 404) {
|
||||
safeLog(`Label ${name} not found on issue`);
|
||||
return;
|
||||
}
|
||||
throw err
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,43 +456,49 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
alreadyChecked: number[] = [],
|
||||
): Promise<{ hash: string | undefined; timestamp: number } | undefined> {
|
||||
if (alreadyChecked.includes(this.issueData.number)) {
|
||||
return undefined
|
||||
return undefined;
|
||||
}
|
||||
alreadyChecked.push(this.issueData.number)
|
||||
alreadyChecked.push(this.issueData.number);
|
||||
|
||||
if ((await this.getIssue()).open) {
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
const closingHashComment = /(?:\\|\/)closedWith (\S*)/
|
||||
const closingHashComment =
|
||||
/(?:\\|\/)closedWith (?:https:\/\/github\.com\/microsoft\/vscode\/commit\/)?([a-fA-F0-9]{7,40})/;
|
||||
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
const options = {
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
})
|
||||
let closingCommit: { hash: string | undefined; timestamp: number } | undefined
|
||||
const crossReferencing: number[] = []
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++
|
||||
};
|
||||
let closingCommit: { hash: string | undefined; timestamp: number } | undefined;
|
||||
const crossReferencing: number[] = [];
|
||||
for await (const event of this.octokit.paginate.iterator(
|
||||
this.octokit.rest.issues.listEventsForTimeline,
|
||||
options,
|
||||
)) {
|
||||
numRequests++;
|
||||
|
||||
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (
|
||||
(timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
|
||||
timelineEvent.created_at &&
|
||||
timelineEvent.commit_id &&
|
||||
timelineEvent.commit_url
|
||||
.toLowerCase()
|
||||
?.toLowerCase()
|
||||
.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase())
|
||||
) {
|
||||
closingCommit = {
|
||||
hash: timelineEvent.commit_id,
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
}
|
||||
};
|
||||
}
|
||||
if (timelineEvent.event === 'reopened') {
|
||||
closingCommit = undefined
|
||||
closingCommit = undefined;
|
||||
}
|
||||
if (
|
||||
timelineEvent.created_at &&
|
||||
timelineEvent.event === 'commented' &&
|
||||
!((timelineEvent as any).body as string)?.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') &&
|
||||
closingHashComment.test((timelineEvent as any).body)
|
||||
@@ -417,7 +506,7 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
closingCommit = {
|
||||
hash: closingHashComment.exec((timelineEvent as any).body)![1],
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
}
|
||||
};
|
||||
}
|
||||
if (
|
||||
timelineEvent.event === 'cross-referenced' &&
|
||||
@@ -426,7 +515,7 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
`/${this.params.owner}/${this.params.repo}/`.toLowerCase(),
|
||||
)
|
||||
) {
|
||||
crossReferencing.push((timelineEvent as any).source.issue.number)
|
||||
crossReferencing.push((timelineEvent as any).source.issue.number);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -437,19 +526,19 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
for (const id of crossReferencing.reverse()) {
|
||||
const closed = await new OctoKitIssue(this.token, this.params, {
|
||||
number: id,
|
||||
}, this.options).getClosingInfo(alreadyChecked)
|
||||
}).getClosingInfo(alreadyChecked);
|
||||
|
||||
if (closed) {
|
||||
if (Math.abs(closed.timestamp - ((await this.getIssue()).closedAt ?? 0)) < 5000) {
|
||||
closingCommit = closed
|
||||
break
|
||||
closingCommit = closed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`)
|
||||
return closingCommit
|
||||
safeLog(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`);
|
||||
return closingCommit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -464,7 +553,7 @@ function isIssue(object: any): object is Issue {
|
||||
'number' in object &&
|
||||
'numComments' in object &&
|
||||
'reactions' in object &&
|
||||
'milestoneId' in object
|
||||
'milestoneId' in object;
|
||||
|
||||
return isIssue
|
||||
return isIssue;
|
||||
}
|
||||
|
||||
@@ -11,51 +11,50 @@ const utils_1 = require("./utils");
|
||||
const core_1 = require("@actions/core");
|
||||
class Action {
|
||||
constructor() {
|
||||
this.token = utils_1.getRequiredInput('token');
|
||||
this.username = new github_1.GitHub(this.token).users.getAuthenticated().then((v) => v.data.name);
|
||||
this.token = (0, utils_1.getRequiredInput)('token');
|
||||
this.username = (0, github_1.getOctokit)(this.token)
|
||||
.rest.users.getAuthenticated()
|
||||
.then((v) => { var _a; return (_a = v.data.name) !== null && _a !== void 0 ? _a : 'unknown'; }, () => 'unknown');
|
||||
}
|
||||
async run() {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
||||
console.log('running ', this.id, 'with context', {
|
||||
...github_1.context,
|
||||
payload: {
|
||||
issue: (_b = (_a = github_1.context.payload) === null || _a === void 0 ? void 0 : _a.issue) === null || _b === void 0 ? void 0 : _b.number,
|
||||
label: (_d = (_c = github_1.context.payload) === null || _c === void 0 ? void 0 : _c.label) === null || _d === void 0 ? void 0 : _d.name,
|
||||
repository: (_f = (_e = github_1.context.payload) === null || _e === void 0 ? void 0 : _e.repository) === null || _f === void 0 ? void 0 : _f.html_url,
|
||||
sender: (_j = (_h = (_g = github_1.context.payload) === null || _g === void 0 ? void 0 : _g.sender) === null || _h === void 0 ? void 0 : _h.login) !== null && _j !== void 0 ? _j : (_l = (_k = github_1.context.payload) === null || _k === void 0 ? void 0 : _k.sender) === null || _l === void 0 ? void 0 : _l.type,
|
||||
},
|
||||
});
|
||||
var _a, _b, _c, _d, _e, _f;
|
||||
if (utils_1.errorLoggingIssue) {
|
||||
const { repo, issue, owner } = utils_1.errorLoggingIssue;
|
||||
if (github_1.context.repo.repo === repo &&
|
||||
github_1.context.repo.owner === owner &&
|
||||
((_m = github_1.context.payload.issue) === null || _m === void 0 ? void 0 : _m.number) === issue) {
|
||||
return console.log('refusing to run on error logging issue to prevent cascading errors');
|
||||
((_a = github_1.context.payload.issue) === null || _a === void 0 ? void 0 : _a.number) === issue) {
|
||||
return (0, utils_1.safeLog)('refusing to run on error logging issue to prevent cascading errors');
|
||||
}
|
||||
}
|
||||
try {
|
||||
const token = utils_1.getRequiredInput('token');
|
||||
const readonly = !!core_1.getInput('readonly');
|
||||
const issue = (_o = github_1.context === null || github_1.context === void 0 ? void 0 : github_1.context.issue) === null || _o === void 0 ? void 0 : _o.number;
|
||||
const token = (0, utils_1.getRequiredInput)('token');
|
||||
const readonly = !!(0, core_1.getInput)('readonly');
|
||||
const issue = (_b = github_1.context === null || github_1.context === void 0 ? void 0 : github_1.context.issue) === null || _b === void 0 ? void 0 : _b.number;
|
||||
if (issue) {
|
||||
const octokit = new octokit_1.OctoKitIssue(token, github_1.context.repo, { number: issue }, { readonly });
|
||||
if (github_1.context.eventName === 'issue_comment') {
|
||||
await this.onCommented(octokit, github_1.context.payload.comment.body, github_1.context.actor);
|
||||
await this.onCommented(octokit, (_c = github_1.context.payload.comment) === null || _c === void 0 ? void 0 : _c.body, github_1.context.actor);
|
||||
}
|
||||
else if (github_1.context.eventName === 'issues') {
|
||||
else if (github_1.context.eventName === 'issues' ||
|
||||
github_1.context.eventName === 'pull_request' ||
|
||||
github_1.context.eventName === 'pull_request_target') {
|
||||
switch (github_1.context.payload.action) {
|
||||
case 'opened':
|
||||
await this.onOpened(octokit);
|
||||
case 'ready_for_review':
|
||||
await this.onOpened(octokit, github_1.context.payload);
|
||||
break;
|
||||
case 'reopened':
|
||||
await this.onReopened(octokit);
|
||||
break;
|
||||
case 'closed':
|
||||
await this.onClosed(octokit);
|
||||
await this.onClosed(octokit, github_1.context.payload);
|
||||
break;
|
||||
case 'labeled':
|
||||
await this.onLabeled(octokit, github_1.context.payload.label.name);
|
||||
break;
|
||||
case 'assigned':
|
||||
await this.onAssigned(octokit, github_1.context.payload.assignee.login);
|
||||
break;
|
||||
case 'unassigned':
|
||||
await this.onUnassigned(octokit, github_1.context.payload.assignee.login);
|
||||
break;
|
||||
@@ -70,22 +69,32 @@ class Action {
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (github_1.context.eventName === 'create') {
|
||||
await this.onCreated(new octokit_1.OctoKit(token, github_1.context.repo, { readonly }), (_d = github_1.context === null || github_1.context === void 0 ? void 0 : github_1.context.payload) === null || _d === void 0 ? void 0 : _d.ref, (_f = (_e = github_1.context === null || github_1.context === void 0 ? void 0 : github_1.context.payload) === null || _e === void 0 ? void 0 : _e.sender) === null || _f === void 0 ? void 0 : _f.login);
|
||||
}
|
||||
else {
|
||||
await this.onTriggered(new octokit_1.OctoKit(token, github_1.context.repo, { readonly }));
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
await this.error(e);
|
||||
const err = e;
|
||||
try {
|
||||
await this.error(err);
|
||||
}
|
||||
catch {
|
||||
(0, utils_1.safeLog)((err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.message) || String(e));
|
||||
}
|
||||
}
|
||||
const usage = await utils_1.getRateLimit(this.token);
|
||||
const usage = await (0, utils_1.getRateLimit)(this.token);
|
||||
}
|
||||
async error(error) {
|
||||
var _a;
|
||||
const details = {
|
||||
message: `${error.message}\n${error.stack}`,
|
||||
id: this.id,
|
||||
user: await this.username,
|
||||
};
|
||||
if (github_1.context.issue.number)
|
||||
if ((_a = github_1.context.issue) === null || _a === void 0 ? void 0 : _a.number)
|
||||
details.issue = github_1.context.issue.number;
|
||||
const rendered = `
|
||||
Message: ${details.message}
|
||||
@@ -94,28 +103,34 @@ Actor: ${details.user}
|
||||
|
||||
ID: ${details.id}
|
||||
`;
|
||||
await utils_1.logErrorToIssue(rendered, true, this.token);
|
||||
core_1.setFailed(error.message);
|
||||
await (0, utils_1.logErrorToIssue)(rendered, true, this.token);
|
||||
(0, core_1.setFailed)(error.message);
|
||||
}
|
||||
async onTriggered(_octokit) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onCreated(_octokit, _ref, _creator) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onEdited(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onLabeled(_issue, _label) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onUnassigned(_issue, _label) {
|
||||
async onAssigned(_issue, _assignee) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onOpened(_issue) {
|
||||
async onUnassigned(_issue, _assignee) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onOpened(_issue, _payload) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onReopened(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onClosed(_issue) {
|
||||
async onClosed(_issue, _payload) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onMilestoned(_issue) {
|
||||
|
||||
@@ -3,87 +3,102 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit, OctoKitIssue, getNumRequests } from '../api/octokit'
|
||||
import { context, GitHub } from '@actions/github'
|
||||
import { getRequiredInput, logErrorToIssue, getRateLimit, errorLoggingIssue } from './utils'
|
||||
import { getInput, setFailed } from '@actions/core'
|
||||
import { OctoKit, OctoKitIssue, getNumRequests } from '../api/octokit';
|
||||
import { context, getOctokit } from '@actions/github';
|
||||
import { getRequiredInput, logErrorToIssue, getRateLimit, errorLoggingIssue, safeLog } from './utils';
|
||||
import { getInput, setFailed } from '@actions/core';
|
||||
import { WebhookPayload } from '@actions/github/lib/interfaces';
|
||||
|
||||
export abstract class Action {
|
||||
abstract id: string
|
||||
abstract id: string;
|
||||
|
||||
private username: Promise<string>
|
||||
private token = getRequiredInput('token')
|
||||
private username: Promise<string>;
|
||||
private token = getRequiredInput('token');
|
||||
|
||||
constructor() {
|
||||
this.username = new GitHub(this.token).users.getAuthenticated().then((v) => v.data.name)
|
||||
this.username = getOctokit(this.token)
|
||||
.rest.users.getAuthenticated()
|
||||
.then(
|
||||
(v) => v.data.name ?? 'unknown',
|
||||
() => 'unknown',
|
||||
);
|
||||
}
|
||||
|
||||
public async run() {
|
||||
console.log('running ', this.id, 'with context', {
|
||||
...context,
|
||||
payload: {
|
||||
issue: context.payload?.issue?.number,
|
||||
label: context.payload?.label?.name,
|
||||
repository: context.payload?.repository?.html_url,
|
||||
sender: context.payload?.sender?.login ?? context.payload?.sender?.type,
|
||||
},
|
||||
})
|
||||
|
||||
if (errorLoggingIssue) {
|
||||
const { repo, issue, owner } = errorLoggingIssue
|
||||
const { repo, issue, owner } = errorLoggingIssue;
|
||||
if (
|
||||
context.repo.repo === repo &&
|
||||
context.repo.owner === owner &&
|
||||
context.payload.issue?.number === issue
|
||||
) {
|
||||
return console.log('refusing to run on error logging issue to prevent cascading errors')
|
||||
return safeLog('refusing to run on error logging issue to prevent cascading errors');
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const token = getRequiredInput('token')
|
||||
const readonly = !!getInput('readonly')
|
||||
const token = getRequiredInput('token');
|
||||
const readonly = !!getInput('readonly');
|
||||
|
||||
const issue = context?.issue?.number
|
||||
const issue = context?.issue?.number;
|
||||
if (issue) {
|
||||
const octokit = new OctoKitIssue(token, context.repo, { number: issue }, { readonly })
|
||||
const octokit = new OctoKitIssue(token, context.repo, { number: issue }, { readonly });
|
||||
if (context.eventName === 'issue_comment') {
|
||||
await this.onCommented(octokit, context.payload.comment.body, context.actor)
|
||||
} else if (context.eventName === 'issues') {
|
||||
await this.onCommented(octokit, context.payload.comment?.body, context.actor);
|
||||
} else if (
|
||||
context.eventName === 'issues' ||
|
||||
context.eventName === 'pull_request' ||
|
||||
context.eventName === 'pull_request_target'
|
||||
) {
|
||||
switch (context.payload.action) {
|
||||
case 'opened':
|
||||
await this.onOpened(octokit)
|
||||
break
|
||||
case 'ready_for_review':
|
||||
await this.onOpened(octokit, context.payload);
|
||||
break;
|
||||
case 'reopened':
|
||||
await this.onReopened(octokit)
|
||||
break
|
||||
await this.onReopened(octokit);
|
||||
break;
|
||||
case 'closed':
|
||||
await this.onClosed(octokit)
|
||||
break
|
||||
await this.onClosed(octokit, context.payload);
|
||||
break;
|
||||
case 'labeled':
|
||||
await this.onLabeled(octokit, context.payload.label.name)
|
||||
break
|
||||
await this.onLabeled(octokit, context.payload.label.name);
|
||||
break;
|
||||
case 'assigned':
|
||||
await this.onAssigned(octokit, context.payload.assignee.login);
|
||||
break;
|
||||
case 'unassigned':
|
||||
await this.onUnassigned(octokit, context.payload.assignee.login)
|
||||
break
|
||||
await this.onUnassigned(octokit, context.payload.assignee.login);
|
||||
break;
|
||||
case 'edited':
|
||||
await this.onEdited(octokit)
|
||||
break
|
||||
await this.onEdited(octokit);
|
||||
break;
|
||||
case 'milestoned':
|
||||
await this.onMilestoned(octokit)
|
||||
break
|
||||
await this.onMilestoned(octokit);
|
||||
break;
|
||||
default:
|
||||
throw Error('Unexpected action: ' + context.payload.action)
|
||||
throw Error('Unexpected action: ' + context.payload.action);
|
||||
}
|
||||
}
|
||||
} else if (context.eventName === 'create') {
|
||||
await this.onCreated(
|
||||
new OctoKit(token, context.repo, { readonly }),
|
||||
context?.payload?.ref,
|
||||
context?.payload?.sender?.login,
|
||||
);
|
||||
} else {
|
||||
await this.onTriggered(new OctoKit(token, context.repo, { readonly }))
|
||||
await this.onTriggered(new OctoKit(token, context.repo, { readonly }));
|
||||
}
|
||||
} catch (e) {
|
||||
await this.error(e)
|
||||
const err = e as Error;
|
||||
try {
|
||||
await this.error(err);
|
||||
} catch {
|
||||
safeLog(err?.stack || err?.message || String(e));
|
||||
}
|
||||
}
|
||||
|
||||
const usage = await getRateLimit(this.token)
|
||||
const usage = await getRateLimit(this.token);
|
||||
}
|
||||
|
||||
private async error(error: Error) {
|
||||
@@ -91,9 +106,9 @@ export abstract class Action {
|
||||
message: `${error.message}\n${error.stack}`,
|
||||
id: this.id,
|
||||
user: await this.username,
|
||||
}
|
||||
};
|
||||
|
||||
if (context.issue.number) details.issue = context.issue.number
|
||||
if (context.issue?.number) details.issue = context.issue.number;
|
||||
|
||||
const rendered = `
|
||||
Message: ${details.message}
|
||||
@@ -101,37 +116,43 @@ Message: ${details.message}
|
||||
Actor: ${details.user}
|
||||
|
||||
ID: ${details.id}
|
||||
`
|
||||
await logErrorToIssue(rendered, true, this.token)
|
||||
`;
|
||||
await logErrorToIssue(rendered, true, this.token);
|
||||
|
||||
setFailed(error.message)
|
||||
setFailed(error.message);
|
||||
}
|
||||
|
||||
protected async onTriggered(_octokit: OctoKit): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onCreated(_octokit: OctoKit, _ref: string, _creator: string): Promise<void> {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onEdited(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onLabeled(_issue: OctoKitIssue, _label: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onUnassigned(_issue: OctoKitIssue, _label: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
protected async onAssigned(_issue: OctoKitIssue, _assignee: string): Promise<void> {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onOpened(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
protected async onUnassigned(_issue: OctoKitIssue, _assignee: string): Promise<void> {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onOpened(_issue: OctoKitIssue, _payload: WebhookPayload): Promise<void> {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onReopened(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onClosed(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
protected async onClosed(_issue: OctoKitIssue, _payload: WebhookPayload): Promise<void> {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onMilestoned(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
protected async onCommented(_issue: OctoKitIssue, _comment: string, _actor: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
throw Error('not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionBase = void 0;
|
||||
const utils_1 = require("./utils");
|
||||
class ActionBase {
|
||||
constructor(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves) {
|
||||
this.labels = labels;
|
||||
@@ -27,15 +28,15 @@ class ActionBase {
|
||||
buildQuery(baseQuery) {
|
||||
var _a, _b, _c, _d, _e, _f;
|
||||
let query = baseQuery;
|
||||
console.log(`labels: ${this.labels}`);
|
||||
console.log(`milestoneName: ${this.milestoneName}`);
|
||||
console.log(`milestoneId: ${this.milestoneId}`);
|
||||
console.log(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
console.log(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
console.log(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
console.log(`minimumVotes: ${this.minimumVotes}`);
|
||||
console.log(`maximumVotes: ${this.maximumVotes}`);
|
||||
console.log(`involves: ${this.involves}`);
|
||||
(0, utils_1.safeLog)(`labels: ${this.labels}`);
|
||||
(0, utils_1.safeLog)(`milestoneName: ${this.milestoneName}`);
|
||||
(0, utils_1.safeLog)(`milestoneId: ${this.milestoneId}`);
|
||||
(0, utils_1.safeLog)(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
(0, utils_1.safeLog)(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
(0, utils_1.safeLog)(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
(0, utils_1.safeLog)(`minimumVotes: ${this.minimumVotes}`);
|
||||
(0, utils_1.safeLog)(`maximumVotes: ${this.maximumVotes}`);
|
||||
(0, utils_1.safeLog)(`involves: ${this.involves}`);
|
||||
// Both milestone name and milestone Id must be provided and must match.
|
||||
// The name is used to construct the query, which does not accept ID.
|
||||
// The ID is used for comparisons with issue data, which does not include the name.
|
||||
@@ -104,22 +105,23 @@ class ActionBase {
|
||||
// This is necessary because GitHub sometimes returns incorrect results,
|
||||
// and because issues may get modified while we are processing them.
|
||||
validateIssue(issue) {
|
||||
var _a, _b;
|
||||
if (this.ignoreAllWithLabels) {
|
||||
// Validate that the issue does not have labels
|
||||
if (issue.labels && issue.labels.length !== 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Make sure all labels we wanted are present.
|
||||
if ((!issue.labels || issue.labels.length == 0) && this.labelsSet.length > 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
return false;
|
||||
}
|
||||
for (const str of this.labelsSet) {
|
||||
if (!issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -127,7 +129,7 @@ class ActionBase {
|
||||
if (issue.labels && issue.labels.length > 0) {
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -135,22 +137,22 @@ class ActionBase {
|
||||
}
|
||||
if (this.ignoreAllWithMilestones) {
|
||||
// Validate that the issue does not have a milestone.
|
||||
if (issue.milestoneId != null) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
if (issue.milestone) {
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Make sure milestone is present, if required.
|
||||
if (this.milestoneId != undefined && issue.milestoneId != +this.milestoneId) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${issue.milestoneId}`);
|
||||
if (this.milestoneId != null && ((_a = issue.milestone) === null || _a === void 0 ? void 0 : _a.milestoneId) != +this.milestoneId) {
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${(_b = issue.milestone) === null || _b === void 0 ? void 0 : _b.milestoneId}`);
|
||||
return false;
|
||||
}
|
||||
// Make sure a milestones we wanted to ignore is not present.
|
||||
if (issue.milestoneId != null) {
|
||||
if (issue.milestone && issue.milestone.milestoneId != null) {
|
||||
for (const str of this.ignoreMilestoneIdsSet) {
|
||||
if (issue.milestoneId == +str) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone ${issue.milestoneId} found in list of ignored milestone IDs.`);
|
||||
if (issue.milestone.milestoneId == +str) {
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to milestone ${issue.milestone.milestoneId} found in list of ignored milestone IDs.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -163,14 +165,14 @@ class ActionBase {
|
||||
}
|
||||
if (this.minimumVotes != undefined) {
|
||||
if (upvotes < this.minimumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Verify the issue does not have too many upvotes
|
||||
if (this.maximumVotes != undefined) {
|
||||
if (upvotes > this.maximumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
(0, utils_1.safeLog)(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Issue } from '../api/api'
|
||||
import { safeLog } from './utils';
|
||||
|
||||
export class ActionBase {
|
||||
constructor(
|
||||
@@ -29,15 +30,15 @@ export class ActionBase {
|
||||
buildQuery(baseQuery: string): string {
|
||||
let query = baseQuery;
|
||||
|
||||
console.log(`labels: ${this.labels}`);
|
||||
console.log(`milestoneName: ${this.milestoneName}`);
|
||||
console.log(`milestoneId: ${this.milestoneId}`);
|
||||
console.log(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
console.log(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
console.log(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
console.log(`minimumVotes: ${this.minimumVotes}`);
|
||||
console.log(`maximumVotes: ${this.maximumVotes}`);
|
||||
console.log(`involves: ${this.involves}`);
|
||||
safeLog(`labels: ${this.labels}`);
|
||||
safeLog(`milestoneName: ${this.milestoneName}`);
|
||||
safeLog(`milestoneId: ${this.milestoneId}`);
|
||||
safeLog(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
safeLog(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
safeLog(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
safeLog(`minimumVotes: ${this.minimumVotes}`);
|
||||
safeLog(`maximumVotes: ${this.maximumVotes}`);
|
||||
safeLog(`involves: ${this.involves}`);
|
||||
|
||||
// Both milestone name and milestone Id must be provided and must match.
|
||||
// The name is used to construct the query, which does not accept ID.
|
||||
@@ -117,18 +118,18 @@ export class ActionBase {
|
||||
if (this.ignoreAllWithLabels) {
|
||||
// Validate that the issue does not have labels
|
||||
if (issue.labels && issue.labels.length !== 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
safeLog(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Make sure all labels we wanted are present.
|
||||
if ((!issue.labels || issue.labels.length == 0) && this.labelsSet.length > 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
safeLog(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
return false;
|
||||
}
|
||||
for (const str of this.labelsSet) {
|
||||
if (!issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
safeLog(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -136,7 +137,7 @@ export class ActionBase {
|
||||
if (issue.labels && issue.labels.length > 0) {
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
safeLog(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -144,21 +145,21 @@ export class ActionBase {
|
||||
}
|
||||
if (this.ignoreAllWithMilestones) {
|
||||
// Validate that the issue does not have a milestone.
|
||||
if (issue.milestoneId != null) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
if (issue.milestone) {
|
||||
safeLog(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Make sure milestone is present, if required.
|
||||
if (this.milestoneId != undefined && issue.milestoneId != +this.milestoneId) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${issue.milestoneId}`);
|
||||
if (this.milestoneId != null && issue.milestone?.milestoneId != +this.milestoneId) {
|
||||
safeLog(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${issue.milestone?.milestoneId}`);
|
||||
return false;
|
||||
}
|
||||
// Make sure a milestones we wanted to ignore is not present.
|
||||
if (issue.milestoneId != null) {
|
||||
if (issue.milestone && issue.milestone.milestoneId != null) {
|
||||
for (const str of this.ignoreMilestoneIdsSet) {
|
||||
if (issue.milestoneId == +str) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone ${issue.milestoneId} found in list of ignored milestone IDs.`);
|
||||
if (issue.milestone.milestoneId == +str) {
|
||||
safeLog(`Issue ${issue.number} skipped due to milestone ${issue.milestone.milestoneId} found in list of ignored milestone IDs.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -171,14 +172,14 @@ export class ActionBase {
|
||||
}
|
||||
if (this.minimumVotes != undefined) {
|
||||
if (upvotes < this.minimumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
safeLog(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Verify the issue does not have too many upvotes
|
||||
if (this.maximumVotes != undefined) {
|
||||
if (upvotes > this.maximumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
safeLog(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=OctokitTypings.js.map
|
||||
@@ -0,0 +1,16 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import type { RestEndpointMethodTypes } from '@octokit/rest';
|
||||
|
||||
// This file is just to re-export some octokit types as nicer names
|
||||
|
||||
export type ActionsListWorkflowRunsResponseWorkflowRunsItem =
|
||||
RestEndpointMethodTypes['actions']['listWorkflowRuns']['response']['data']['workflow_runs'][0];
|
||||
|
||||
export type IssueGetResponse = RestEndpointMethodTypes['issues']['get']['response']['data'];
|
||||
|
||||
export type IssuesGetResponseMilestone =
|
||||
RestEndpointMethodTypes['issues']['get']['response']['data']['milestone'];
|
||||
@@ -4,14 +4,16 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.logErrorToIssue = exports.errorLoggingIssue = exports.getRateLimit = exports.daysAgoToHumanReadbleDate = exports.daysAgoToTimestamp = exports.loadLatestRelease = exports.normalizeIssue = exports.getRequiredInput = exports.getInput = void 0;
|
||||
exports.safeLog = exports.logErrorToIssue = exports.errorLoggingIssue = exports.getRateLimit = exports.daysAgoToHumanReadbleDate = exports.daysAgoToTimestamp = exports.loadLatestRelease = exports.normalizeIssue = exports.getRequiredInput = exports.getInput = void 0;
|
||||
const core = require("@actions/core");
|
||||
const github_1 = require("@actions/github");
|
||||
const axios_1 = require("axios");
|
||||
const octokit_1 = require("../api/octokit");
|
||||
exports.getInput = (name) => core.getInput(name) || undefined;
|
||||
exports.getRequiredInput = (name) => core.getInput(name, { required: true });
|
||||
exports.normalizeIssue = (issue) => {
|
||||
const getInput = (name) => core.getInput(name) || undefined;
|
||||
exports.getInput = getInput;
|
||||
const getRequiredInput = (name) => core.getInput(name, { required: true });
|
||||
exports.getRequiredInput = getRequiredInput;
|
||||
const normalizeIssue = (issue) => {
|
||||
let { body, title } = issue;
|
||||
body = body !== null && body !== void 0 ? body : '';
|
||||
title = title !== null && title !== void 0 ? title : '';
|
||||
@@ -43,25 +45,36 @@ exports.normalizeIssue = (issue) => {
|
||||
issueType: isBug ? 'bug' : isFeatureRequest ? 'feature_request' : 'unknown',
|
||||
};
|
||||
};
|
||||
exports.loadLatestRelease = async (quality) => (await axios_1.default.get(`https://vscode-update.azurewebsites.net/api/update/darwin/${quality}/latest`)).data;
|
||||
exports.daysAgoToTimestamp = (days) => +new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
||||
exports.daysAgoToHumanReadbleDate = (days) => new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '');
|
||||
exports.getRateLimit = async (token) => {
|
||||
const usageData = (await new github_1.GitHub(token).rateLimit.get()).data.resources;
|
||||
exports.normalizeIssue = normalizeIssue;
|
||||
const loadLatestRelease = async (quality) => (await axios_1.default.get(`https://update.code.visualstudio.com/api/update/darwin/${quality}/latest`)).data;
|
||||
exports.loadLatestRelease = loadLatestRelease;
|
||||
const daysAgoToTimestamp = (days) => +new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
||||
exports.daysAgoToTimestamp = daysAgoToTimestamp;
|
||||
const daysAgoToHumanReadbleDate = (days) => new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '');
|
||||
exports.daysAgoToHumanReadbleDate = daysAgoToHumanReadbleDate;
|
||||
const getRateLimit = async (token) => {
|
||||
const usageData = (await (0, github_1.getOctokit)(token).rest.rateLimit.get()).data.resources;
|
||||
const usage = {};
|
||||
['core', 'graphql', 'search'].forEach(async (category) => {
|
||||
usage[category] = 1 - usageData[category].remaining / usageData[category].limit;
|
||||
var _a, _b, _c, _d;
|
||||
if (usageData[category]) {
|
||||
usage[category] = 1 - ((_b = (_a = usageData[category]) === null || _a === void 0 ? void 0 : _a.remaining) !== null && _b !== void 0 ? _b : 0) / ((_d = (_c = usageData[category]) === null || _c === void 0 ? void 0 : _c.limit) !== null && _d !== void 0 ? _d : 1);
|
||||
}
|
||||
});
|
||||
return usage;
|
||||
};
|
||||
exports.getRateLimit = getRateLimit;
|
||||
exports.errorLoggingIssue = (() => {
|
||||
try {
|
||||
const repo = github_1.context.repo.owner.toLowerCase() + '/' + github_1.context.repo.repo.toLowerCase();
|
||||
if (repo === 'microsoft/vscode-cpptools') {
|
||||
return { repo: 'vscode-cpptools', owner: 'Microsoft', issue: 6282 };
|
||||
if (repo === 'microsoft/vscode' || repo === 'microsoft/vscode-remote-release') {
|
||||
return { repo: 'vscode', owner: 'Microsoft', issue: 93814 };
|
||||
}
|
||||
else if (exports.getInput('errorLogIssueNumber')) {
|
||||
return { ...github_1.context.repo, issue: +exports.getRequiredInput('errorLogIssueNumber') };
|
||||
else if (/microsoft\//.test(repo)) {
|
||||
return { repo: 'vscode-internalbacklog', owner: 'Microsoft', issue: 974 };
|
||||
}
|
||||
else if ((0, exports.getInput)('errorLogIssueNumber')) {
|
||||
return { ...github_1.context.repo, issue: +(0, exports.getRequiredInput)('errorLogIssueNumber') };
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
@@ -72,19 +85,20 @@ exports.errorLoggingIssue = (() => {
|
||||
return undefined;
|
||||
}
|
||||
})();
|
||||
exports.logErrorToIssue = async (message, ping, token) => {
|
||||
const logErrorToIssue = async (message, ping, token) => {
|
||||
var _a;
|
||||
// Attempt to wait out abuse detection timeout if present
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||
const dest = exports.errorLoggingIssue;
|
||||
if (!dest)
|
||||
return console.log('no error logging repo defined. swallowing error:', message);
|
||||
return new octokit_1.OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue }, { readonly: !!exports.getInput('readonly') })
|
||||
return console.log('no error logging repo defined. swallowing error.');
|
||||
return new octokit_1.OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue })
|
||||
.postComment(`
|
||||
Workflow: ${github_1.context.workflow}
|
||||
|
||||
Error: ${message}
|
||||
|
||||
Issue: ${ping ? `${github_1.context.repo.owner}/${github_1.context.repo.repo}#` : ''}${github_1.context.issue.number}
|
||||
Issue: ${ping ? `${github_1.context.repo.owner}/${github_1.context.repo.repo}#` : ''}${(_a = github_1.context.issue) === null || _a === void 0 ? void 0 : _a.number}
|
||||
|
||||
Repo: ${github_1.context.repo.owner}/${github_1.context.repo.repo}
|
||||
|
||||
@@ -96,4 +110,10 @@ ${JSON.stringify(github_1.context, null, 2)
|
||||
-->
|
||||
`);
|
||||
};
|
||||
exports.logErrorToIssue = logErrorToIssue;
|
||||
const safeLog = (message, ...args) => {
|
||||
const clean = (val) => ('' + val).replace(/:|#/g, '');
|
||||
console.log(clean(message), ...args.map(clean));
|
||||
};
|
||||
exports.safeLog = safeLog;
|
||||
//# sourceMappingURL=utils.js.map
|
||||
@@ -3,24 +3,24 @@
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as core from '@actions/core'
|
||||
import { context, GitHub } from '@actions/github'
|
||||
import axios from 'axios'
|
||||
import { OctoKitIssue } from '../api/octokit'
|
||||
import * as core from '@actions/core';
|
||||
import { context, getOctokit } from '@actions/github';
|
||||
import axios from 'axios';
|
||||
import { OctoKitIssue } from '../api/octokit';
|
||||
|
||||
export const getInput = (name: string) => core.getInput(name) || undefined
|
||||
export const getRequiredInput = (name: string) => core.getInput(name, { required: true })
|
||||
export const getInput = (name: string) => core.getInput(name) || undefined;
|
||||
export const getRequiredInput = (name: string) => core.getInput(name, { required: true });
|
||||
|
||||
export const normalizeIssue = (issue: {
|
||||
body: string
|
||||
title: string
|
||||
body: string;
|
||||
title: string;
|
||||
}): { body: string; title: string; issueType: 'bug' | 'feature_request' | 'unknown' } => {
|
||||
let { body, title } = issue
|
||||
body = body ?? ''
|
||||
title = title ?? ''
|
||||
const isBug = body.includes('bug_report_template') || /Issue Type:.*Bug.*/.test(body)
|
||||
let { body, title } = issue;
|
||||
body = body ?? '';
|
||||
title = title ?? '';
|
||||
const isBug = body.includes('bug_report_template') || /Issue Type:.*Bug.*/.test(body);
|
||||
const isFeatureRequest =
|
||||
body.includes('feature_request_template') || /Issue Type:.*Feature Request.*/.test(body)
|
||||
body.includes('feature_request_template') || /Issue Type:.*Feature Request.*/.test(body);
|
||||
|
||||
const cleanse = (str: string) => {
|
||||
let out = str
|
||||
@@ -34,78 +34,83 @@ export const normalizeIssue = (issue: {
|
||||
.replace(/does this issue occur when all extensions are disabled.*/gu, '')
|
||||
.replace(/!?\[[^\]]*\]\([^)]*\)/gu, '')
|
||||
.replace(/\s+/gu, ' ')
|
||||
.replace(/```[^`]*?```/gu, '')
|
||||
.replace(/```[^`]*?```/gu, '');
|
||||
|
||||
while (
|
||||
out.includes(`<details>`) &&
|
||||
out.includes('</details>') &&
|
||||
out.indexOf(`</details>`) > out.indexOf(`<details>`)
|
||||
) {
|
||||
out = out.slice(0, out.indexOf('<details>')) + out.slice(out.indexOf(`</details>`) + 10)
|
||||
out = out.slice(0, out.indexOf('<details>')) + out.slice(out.indexOf(`</details>`) + 10);
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
return out;
|
||||
};
|
||||
|
||||
return {
|
||||
body: cleanse(body),
|
||||
title: cleanse(title),
|
||||
issueType: isBug ? 'bug' : isFeatureRequest ? 'feature_request' : 'unknown',
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
export interface Release {
|
||||
productVersion: string
|
||||
timestamp: number
|
||||
version: string
|
||||
productVersion: string;
|
||||
timestamp: number;
|
||||
version: string;
|
||||
}
|
||||
|
||||
export const loadLatestRelease = async (quality: 'stable' | 'insider'): Promise<Release | undefined> =>
|
||||
(await axios.get(`https://vscode-update.azurewebsites.net/api/update/darwin/${quality}/latest`)).data
|
||||
(await axios.get(`https://update.code.visualstudio.com/api/update/darwin/${quality}/latest`)).data;
|
||||
|
||||
export const daysAgoToTimestamp = (days: number): number => +new Date(Date.now() - days * 24 * 60 * 60 * 1000)
|
||||
export const daysAgoToTimestamp = (days: number): number =>
|
||||
+new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
||||
|
||||
export const daysAgoToHumanReadbleDate = (days: number) =>
|
||||
new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '')
|
||||
new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '');
|
||||
|
||||
export const getRateLimit = async (token: string) => {
|
||||
const usageData = (await new GitHub(token).rateLimit.get()).data.resources
|
||||
const usage = {} as { core: number; graphql: number; search: number }
|
||||
;(['core', 'graphql', 'search'] as const).forEach(async (category) => {
|
||||
usage[category] = 1 - usageData[category].remaining / usageData[category].limit
|
||||
})
|
||||
return usage
|
||||
}
|
||||
const usageData = (await getOctokit(token).rest.rateLimit.get()).data.resources;
|
||||
const usage = {} as { core: number; graphql: number; search: number };
|
||||
(['core', 'graphql', 'search'] as const).forEach(async (category) => {
|
||||
if (usageData[category]) {
|
||||
usage[category] = 1 - (usageData[category]?.remaining ?? 0) / (usageData[category]?.limit ?? 1);
|
||||
}
|
||||
});
|
||||
return usage;
|
||||
};
|
||||
|
||||
export const errorLoggingIssue = (() => {
|
||||
try {
|
||||
const repo = context.repo.owner.toLowerCase() + '/' + context.repo.repo.toLowerCase()
|
||||
if (repo === 'microsoft/vscode-cpptools') {
|
||||
return { repo: 'vscode-cpptools', owner: 'Microsoft', issue: 6282 }
|
||||
const repo = context.repo.owner.toLowerCase() + '/' + context.repo.repo.toLowerCase();
|
||||
if (repo === 'microsoft/vscode' || repo === 'microsoft/vscode-remote-release') {
|
||||
return { repo: 'vscode', owner: 'Microsoft', issue: 93814 };
|
||||
} else if (/microsoft\//.test(repo)) {
|
||||
return { repo: 'vscode-internalbacklog', owner: 'Microsoft', issue: 974 };
|
||||
} else if (getInput('errorLogIssueNumber')) {
|
||||
return { ...context.repo, issue: +getRequiredInput('errorLogIssueNumber') }
|
||||
return { ...context.repo, issue: +getRequiredInput('errorLogIssueNumber') };
|
||||
} else {
|
||||
return undefined
|
||||
return undefined;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return undefined
|
||||
console.error(e);
|
||||
return undefined;
|
||||
}
|
||||
})()
|
||||
})();
|
||||
|
||||
export const logErrorToIssue = async (message: string, ping: boolean, token: string): Promise<void> => {
|
||||
// Attempt to wait out abuse detection timeout if present
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000))
|
||||
const dest = errorLoggingIssue
|
||||
if (!dest) return console.log('no error logging repo defined. swallowing error:', message)
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||
const dest = errorLoggingIssue;
|
||||
if (!dest) return console.log('no error logging repo defined. swallowing error.');
|
||||
|
||||
return new OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue }, { readonly: !!getInput('readonly') })
|
||||
return new OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue })
|
||||
.postComment(`
|
||||
Workflow: ${context.workflow}
|
||||
|
||||
Error: ${message}
|
||||
|
||||
Issue: ${ping ? `${context.repo.owner}/${context.repo.repo}#` : ''}${context.issue.number}
|
||||
Issue: ${ping ? `${context.repo.owner}/${context.repo.repo}#` : ''}${context.issue?.number}
|
||||
|
||||
Repo: ${context.repo.owner}/${context.repo.repo}
|
||||
|
||||
@@ -115,5 +120,10 @@ ${JSON.stringify(context, null, 2)
|
||||
.replace(/-->/gu, '--@>')
|
||||
.replace(/\/|\\/gu, 'slash-')}
|
||||
-->
|
||||
`)
|
||||
}
|
||||
`);
|
||||
};
|
||||
|
||||
export const safeLog = (message: string, ...args: (string | number | string[])[]): void => {
|
||||
const clean = (val: any) => ('' + val).replace(/:|#/g, '');
|
||||
console.log(clean(message), ...args.map(clean));
|
||||
};
|
||||
|
||||
Generated
+5808
-417
File diff suppressed because it is too large
Load Diff
@@ -10,15 +10,36 @@
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/github": "^2.1.1",
|
||||
"axios": "^0.21.4"
|
||||
},
|
||||
"resolutions": {
|
||||
"follow-redirects": "1.14.7"
|
||||
"@actions/core": "^1.9.1",
|
||||
"@actions/github": "^5.0.3",
|
||||
"@octokit/rest": "^19.0.3",
|
||||
"@slack/web-api": "^6.7.2",
|
||||
"applicationinsights": "^2.3.1",
|
||||
"axios": "^0.27.2",
|
||||
"uuid": "^8.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.1.0",
|
||||
"typescript": "^3.8.3"
|
||||
"@azure/storage-blob": "^12.11.0",
|
||||
"@types/chai": "^4.3.3",
|
||||
"@types/mocha": "^9.1.1",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"@types/yargs": "^17.0.11",
|
||||
"@typescript-eslint/eslint-plugin": "^5.33.0",
|
||||
"@typescript-eslint/parser": "^5.33.0",
|
||||
"chai": "^4.3.6",
|
||||
"eslint": "^8.21.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"husky": "^8.0.1",
|
||||
"mocha": "^10.0.0",
|
||||
"mongodb": "^4.8.1",
|
||||
"nock": "^13.2.9",
|
||||
"prettier": "2.7.1",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.7.4",
|
||||
"yargs": "^17.5.1"
|
||||
},
|
||||
"resolutions": {
|
||||
"minimatch": "^3.0.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"moduleResolution": "node",
|
||||
"removeComments": false,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"sourceMap": true,
|
||||
"lib": [
|
||||
"es2020"
|
||||
|
||||
@@ -33,3 +33,4 @@ localized_string_ids.h
|
||||
# ignore generate files. It will be generated when building
|
||||
src/nativeStrings.ts
|
||||
|
||||
vscode*.d.ts
|
||||
|
||||
Vendored
-8
@@ -10,7 +10,6 @@
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
@@ -25,7 +24,6 @@
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
@@ -40,7 +38,6 @@
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
@@ -54,7 +51,6 @@
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
@@ -69,7 +65,6 @@
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
@@ -85,7 +80,6 @@
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/unitTests/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
@@ -102,7 +96,6 @@
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
@@ -119,7 +112,6 @@
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/IntelliSenseFeatures/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
|
||||
+167
-19
@@ -1,15 +1,163 @@
|
||||
# C/C++ for Visual Studio Code Change Log
|
||||
# C/C++ for Visual Studio Code Changelog
|
||||
|
||||
## Version 1.11.0: June 20, 2022
|
||||
### New Features
|
||||
* Add inlay hints for parameters and auto types. [#5845](https://github.com/microsoft/vscode-cpptools/issues/5845)
|
||||
## Version 1.13.3: October 26, 2022
|
||||
### Enhancements
|
||||
* Make Doxygen hover comments customizable with `C_Cpp.doxygen.sectionTags`. [#8525](https://github.com/microsoft/vscode-cpptools/issues/8525)
|
||||
* Delay applying `c_cpp_properties.json` changes until after a save. [#9185](https://github.com/microsoft/vscode-cpptools/issues/9185)
|
||||
* Create directories on Linux/Mac with 755 instead of 777 permissions. [#9670](https://github.com/microsoft/vscode-cpptools/issues/9670)
|
||||
* Add a `C_Cpp.hover` setting to enable disabling hover results. [#9793](https://github.com/microsoft/vscode-cpptools/issues/9793)
|
||||
* Update to clang-format and clang-tidy 15.0.3. [#9816](https://github.com/microsoft/vscode-cpptools/issues/9816)
|
||||
* Make array settings give a warning for duplicates. [PR #9959](https://github.com/microsoft/vscode-cpptools/pull/9959)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix "final" breaking formatting. [#6638](https://github.com/microsoft/vscode-cpptools/issues/6638)
|
||||
* Fix an IntelliSense crash with the seqan3 library. [#8956](https://github.com/microsoft/vscode-cpptools/issues/8956)
|
||||
* Fix the `editor.parameterHints.enabled` setting not being used when `C_Cpp.autocompleteAddParentheses` is `true`. [#9314](https://github.com/microsoft/vscode-cpptools/issues/9314)
|
||||
* Fix wordexp sometimes getting stuck on Mac (and Linux). [#9688](https://github.com/microsoft/vscode-cpptools/issues/9688)
|
||||
* Fix ctrl+space completion for Doxygen tags. [#9732](https://github.com/microsoft/vscode-cpptools/issues/9732 )
|
||||
* Fix inlay hints showing "type" for lambdas in certain cases. [#9971](https://github.com/microsoft/vscode-cpptools/issues/9971)
|
||||
* Resolve variables for `C_Cpp.codeAnalysis.clangTidy.args` and `headerFilter`. [#9981](https://github.com/microsoft/vscode-cpptools/issues/9981), [#9996](https://github.com/microsoft/vscode-cpptools/issues/9996)
|
||||
* Fix some translations. [#9986](https://github.com/microsoft/vscode-cpptools/issues/9986), [#10011](https://github.com/microsoft/vscode-cpptools/issues/10011), [#10012](https://github.com/microsoft/vscode-cpptools/issues/10012), [#10013](https://github.com/microsoft/vscode-cpptools/issues/10013)
|
||||
* Disable the "Generate Doxygen Comment" context menu when IntelliSense is disabled. [PR #10007](https://github.com/microsoft/vscode-cpptools/pull/10007)
|
||||
* Fix clang-tidy and clang-format not working on CentOS7 and other Linux OS's without glibc 2.27 or greater. [#10019](https://github.com/microsoft/vscode-cpptools/issues/10019)
|
||||
* Fix various bugs with the `C_Cpp.codeAnalysis.clangTidy.headerFilter` setting. [#10023](https://github.com/microsoft/vscode-cpptools/issues/10023)
|
||||
* Fix extensionHost logging an error related to onWillSaveTextDocument whenever a save is done.
|
||||
* Fix random "Failed to spawn IntelliSense process" on Mac.
|
||||
* Fix redundant rescan when adding a workspace folder.
|
||||
|
||||
## Version 1.13.2: October 5, 2022
|
||||
### Enhancements
|
||||
* Enable the inlay hint settings to be set per-workspace folder. [#9782](https://github.com/microsoft/vscode-cpptools/issues/9782)
|
||||
* Switch from RapidJSON to VS's internal JSON parser.
|
||||
|
||||
### Bug Fixes
|
||||
* Fix "final" breaking formatting. [#6638](https://github.com/microsoft/vscode-cpptools/issues/6638)
|
||||
* Reduce the occurrence of wordexp getting stuck. [#9688](https://github.com/microsoft/vscode-cpptools/issues/9688)
|
||||
* Fix IntelliSense crash with range-v3 `ranges::views::addressof`. [#9870](https://github.com/microsoft/vscode-cpptools/issues/9870)
|
||||
* Fix slow compiler querying. [#9882](https://github.com/microsoft/vscode-cpptools/issues/9882)
|
||||
* Fix issue with parsing SSH configurations that could cause the extension to fail to activate. [#9933](https://github.com/microsoft/vscode-cpptools/pull/9933)
|
||||
|
||||
## Version 1.13.1: September 27, 2022
|
||||
### Enhancements
|
||||
* Enable hiding the SSH Targets view with the `C_Cpp.sshTargetsView` setting. [#9836](https://github.com/microsoft/vscode-cpptools/issues/9836)
|
||||
* Change "Enabled", "Disabled", "Default" settings to camelCase. [PR #9862](https://github.com/microsoft/vscode-cpptools/pull/9862)
|
||||
* Add support for C++ modules IFC version 0.42. [#9884](https://github.com/microsoft/vscode-cpptools/issues/9884)
|
||||
* Add SSH terminal for targets. [PR #9895](https://github.com/microsoft/vscode-cpptools/pull/9895)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix incorrect Outline view with C++20 namespace ::inline syntax. [#7216](https://github.com/microsoft/vscode-cpptools/issues/7216)
|
||||
* Fix variadic macros not expanding correctly. [#8178](https://github.com/microsoft/vscode-cpptools/issues/8178)
|
||||
* Add diagnostic changes for the issue with wordexp getting stuck. [#9688](https://github.com/microsoft/vscode-cpptools/issues/9688)
|
||||
* Fix `-std=` being passed to clang-tidy in certain cases . [#9776](https://github.com/microsoft/vscode-cpptools/issues/9776)
|
||||
* Fix debugger visualization for ArrayItem elements more than 1000. [#9801](https://github.com/microsoft/vscode-cpptools/issues/9801)
|
||||
* Handle `-fexperimental-library` clang argument. [#9888](https://github.com/microsoft/vscode-cpptools/issues/9888)
|
||||
* Fix compiler querying with multiple -arch. [#9894](https://github.com/microsoft/vscode-cpptools/issues/9894)
|
||||
* Fix "Failed to read file C:\ProgramData\ssh\ssh_config." in logging . [#9899](https://github.com/microsoft/vscode-cpptools/issues/9899)
|
||||
* Fix "Natvis: are multi-dimensional arrays supported in gdb natvis?". [MIEngine#980](https://github.com/microsoft/MIEngine/issues/980)
|
||||
|
||||
## Version 1.13.0: September 7, 2022
|
||||
### New Features
|
||||
* SSH Target Selector. [PR #9760](https://github.com/microsoft/vscode-cpptools/pull/9760)
|
||||
* rsync support in deploySteps. [PR #9808](https://github.com/microsoft/vscode-cpptools/pull/9808)
|
||||
|
||||
### Enhancements
|
||||
* Add `C_Cpp.caseSensitiveFileSupport` for enabling case sensitive file handling on Windows. [#1994](https://github.com/microsoft/vscode-cpptools/issues/1994)
|
||||
* Add better build and debug task handling for when a compiler or debugger doesn't exist. [#8836](https://github.com/microsoft/vscode-cpptools/issues/8836)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix `${workspaceFolder}` not being resolved in `C_Cpp.clang_format_style`. [#9786](https://github.com/microsoft/vscode-cpptools/issues/9786)
|
||||
* Fix extra comma in the generated the `(gdb) attach` configuration in `launch.json`. [#9818](https://github.com/microsoft/vscode-cpptools/issues/9818)
|
||||
* Fix include completion sorting extensionless headers (e.g. string) after headers with an extension (e.g. string.h).
|
||||
|
||||
## Version 1.12.4: August 31, 2022
|
||||
### Other
|
||||
* Revert changes to telemetry key format. [PR #9822](https://github.com/microsoft/vscode-cpptools/pull/9822)
|
||||
|
||||
## Version 1.12.3: August 30, 2022
|
||||
### New Features
|
||||
* Add Doxygen comment generation via command, context menu, code action, or typing. [#5683](https://github.com/microsoft/vscode-cpptools/issues/5683)
|
||||
* Add auto-complete of Doxygen keywords in comments.
|
||||
|
||||
### Enhancements
|
||||
* Add auto-formatting of lines that are changed by code analysis fixes. [#9322](https://github.com/microsoft/vscode-cpptools/issues/9322)
|
||||
* Add compile arguments to enable colorized output in cppBuild tasks for clang. [#9643](https://github.com/microsoft/vscode-cpptools/issues/9643)
|
||||
* Cache and reuse SSH passwords in the current remote debugging session. [PR #9654](https://github.com/microsoft/vscode-cpptools/pull/9654)
|
||||
* Fix "natvis collections only show the first 50 elements". [MIEngine#821](https://github.com/microsoft/MIEngine/issues/821)
|
||||
* Related [#9377](https://github.com/microsoft/vscode-cpptools/issues/9377)
|
||||
* Fix "cppdbg doesn't support array view of char* buf". [MIEngine#1258](https://github.com/microsoft/MIEngine/issues/1258)
|
||||
* Support explicit `this` references in natvis files.
|
||||
* @Trass3r [PR MIEngine#1163](https://github.com/microsoft/MIEngine/pull/1163)
|
||||
* Do std fallback when compiler querying, even when explicitly specified via a compiler arg.
|
||||
|
||||
### Bug Fixes
|
||||
* Fix several IntelliSense parsing bugs. [#3683](https://github.com/microsoft/vscode-cpptools/issues/3683), [#6659](https://github.com/microsoft/vscode-cpptools/issues/6659), [#7446](https://github.com/microsoft/vscode-cpptools/issues/7446), [#9215](https://github.com/microsoft/vscode-cpptools/issues/9215)
|
||||
* Fix crash when tag parsing files containing certain string literals. [#9538](https://github.com/microsoft/vscode-cpptools/issues/9538)
|
||||
* Fix incorrect semantic tokens with templated operator overloads. [#9556](https://github.com/microsoft/vscode-cpptools/issues/9556)
|
||||
* Fix `.` to `->` completion in functions defined in the class/struct definition. [#9599](https://github.com/microsoft/vscode-cpptools/issues/9599)
|
||||
* Fix inlay hint filtering not working with some cases of whitespace. [#9606](https://github.com/microsoft/vscode-cpptools/issues/9606)
|
||||
* Fix Chinese translation mistakes.
|
||||
* kouhe3 (@kouhe3) [PR #9624](https://github.com/microsoft/vscode-cpptools/pull/9624)
|
||||
* Fix IntelliSense error with ARM register declarations. [#9627](https://github.com/microsoft/vscode-cpptools/issues/9627)
|
||||
* Fix files with a `.c` extension not using a C++ `std` version passed in the `compilerArgs` or `compilerFragments`. [#9628](https://github.com/microsoft/vscode-cpptools/issues/9628)
|
||||
* Fix unnecessary IntelliSense process restarting on file creation handling. [#9630](https://github.com/microsoft/vscode-cpptools/issues/9630)
|
||||
* Fix tag parsing of classes and enums with attributes. [#9672](https://github.com/microsoft/vscode-cpptools/issues/9672)
|
||||
* Add PID to the extended remote process picker. [PR #9673](https://github.com/microsoft/vscode-cpptools/pull/9673)
|
||||
* Fix tag parser crash. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679), [#9695](https://github.com/microsoft/vscode-cpptools/issues/9695)
|
||||
* Fix code analysis fixes generating invalid code when the fix has escaped characters. [#9683](https://github.com/microsoft/vscode-cpptools/issues/9683)
|
||||
* Fix unintended generation of `nul.d` file when querying clang or gcc, when compiler arguments include dependency generation arguments. [#9707](https://github.com/microsoft/vscode-cpptools/issues/9707)
|
||||
* Fix code analysis fixes not being available when more than one check is associated with a fix. [#9755](https://github.com/microsoft/vscode-cpptools/issues/9755)
|
||||
* Fix error when debugging is started without a launch.json and IntelliSense is disabled. [#9762](https://github.com/microsoft/vscode-cpptools/issues/9762)
|
||||
* Fix "The result of GDB -exec evaluate request in all contexts is printed in debug console." [MIEngine #1236](https://github.com/microsoft/MIEngine/issues/1236)
|
||||
* Fix "Evaluating a variable after a failed Step Out causes a fatal error, leaving debug session unusable". [MIEngine#1336](https://github.com/microsoft/MIEngine/issues/1336)
|
||||
* Gareth Rees (@gareth-rees) [PR MIEngine#1337](https://github.com/microsoft/MIEngine/pull/1337)
|
||||
* Fix deadlock in HandleStackTraceRequestAsync where lock was hold too long.
|
||||
* GeorgeMay (@JoergMeier106) [PR MIEngine#1309](https://github.com/microsoft/MIEngine/pull/1309)
|
||||
* Fix potential crashes on shutdown.
|
||||
|
||||
## Version 1.11.5: August 9, 2022
|
||||
### Bug Fixes
|
||||
* Fix crash when tag parsing files containing certain string literals. [#9538](https://github.com/microsoft/vscode-cpptools/issues/9538)
|
||||
* Fix `llvm-project` parser crash on file: `clang/test/parser/parser_overflow.c`. [#9653](https://github.com/microsoft/vscode-cpptools/issues/9653)
|
||||
* Fix `llvm-project` parser crash on file: `libcxx/test/support/test.support/make_string_header.pass.cpp`. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679)
|
||||
|
||||
## Version 1.11.4: July 21, 2022
|
||||
### New Features
|
||||
* Add inlay hints for parameters and auto types. [#5845](https://github.com/microsoft/vscode-cpptools/issues/5845)
|
||||
* Add extended remote support for debugging. [#8497](https://github.com/microsoft/vscode-cpptools/issues/8497), [#9195](https://github.com/microsoft/vscode-cpptools/issues/9195), [#9491](https://github.com/microsoft/vscode-cpptools/discussions/9491), [#9505](https://github.com/microsoft/vscode-cpptools/issues/9505)
|
||||
|
||||
### Enhancements
|
||||
* Add deploySteps and variables to cppdbg. [PR #9418](https://github.com/microsoft/vscode-cpptools/pull/9418)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix "unknown register name" IntelliSense error. [#4382](https://github.com/microsoft/vscode-cpptools/issues/4382)
|
||||
* Fix performance issue with tag parsing a file with a lot of defines. [#6454](https://github.com/microsoft/vscode-cpptools/issues/6454)
|
||||
* Fix IntelliSense with gcc vector extension types. [#6890](https://github.com/microsoft/vscode-cpptools/issues/6890)
|
||||
* Fix doc comments for macros and typedefs. [#8320](https://github.com/microsoft/vscode-cpptools/issues/8320)
|
||||
* Fix issue with CUDA configuration when using a custom config provider and no config is available for the file. [#8483](https://github.com/microsoft/vscode-cpptools/issues/8483)
|
||||
* Fix missing logging when `C_Cpp.intelliSenseEngine` is set to `"Disabled"`. [#9277](https://github.com/microsoft/vscode-cpptools/issues/9277)
|
||||
* Fix doxygen comments not being displayed for multiple adjacent `@brief` or `@return` tags. [#9316](https://github.com/microsoft/vscode-cpptools/issues/9316)
|
||||
* Fix crash if clang-tidy returns a replacement with an empty FilePath. [#9437](https://github.com/microsoft/vscode-cpptools/issues/9437)
|
||||
* Fix the code analysis "disable" option not automatically clearing the disabled diagnostics. [#9364](https://github.com/microsoft/vscode-cpptools/issues/9364)
|
||||
* Fix `-isystem` not being used for system headers with code analysis. [#9366](https://github.com/microsoft/vscode-cpptools/issues/9366)
|
||||
* Fix compiler querying for EDG-based compilers. [#9410](https://github.com/microsoft/vscode-cpptools/issues/9410)
|
||||
* Fix hiding IntelliSense dependent commands when `C_Cpp.intelliSenseEngine` is `"Disabled"`. [#9451](https://github.com/microsoft/vscode-cpptools/issues/9451)
|
||||
* Fix cl.exe build tasks not showing for .c files and .c build tasks being cached for .cpp files (and vice versa). [PR #9544](https://github.com/microsoft/vscode-cpptools/pull/9544)
|
||||
* Fix code analysis not detecting warnings with relative paths. [#9555](https://github.com/microsoft/vscode-cpptools/issues/9555)
|
||||
* Fix `--header-filter` being used with clang-tidy when it shouldn't when a .clang-tidy file exists. [#9566](https://github.com/microsoft/vscode-cpptools/issues/9566)
|
||||
* Fix code analysis giving an error with `__has_include` with gcc 9. [#9575](https://github.com/microsoft/vscode-cpptools/issues/9575)
|
||||
* Fix `-target` not being processed in `compilerArgs`. [#9586](https://github.com/microsoft/vscode-cpptools/issues/9586)
|
||||
|
||||
## Version 1.10.8: July 7, 2022
|
||||
### Enhancements
|
||||
* Allow breakpoints for Rust debugging. [PR #9484](https://github.com/microsoft/vscode-cpptools/pull/9484)
|
||||
* Make `C_Cpp.debugShortcut` settable per-workspace folder. [PR #9514](https://github.com/microsoft/vscode-cpptools/pull/9514)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix crash if clang-tidy returns a replacement with an empty FilePath. [#9437](https://github.com/microsoft/vscode-cpptools/issues/9437)
|
||||
* Fix skipping the compiler argument after `-c`. [#9453](https://github.com/microsoft/vscode-cpptools/issues/9453)
|
||||
* Fix `-std:c++20` not being handled with cl.exe. [#9458](https://github.com/microsoft/vscode-cpptools/issues/9458)
|
||||
* Fix bug with the environment being incorrect when compiler querying. [#9472](https://github.com/microsoft/vscode-cpptools/issues/9472)
|
||||
* Fix duplicate compiler args in compiler query with custom configuration providers using cpptools-api prior to v6. [#9531](https://github.com/microsoft/vscode-cpptools/issues/9531)
|
||||
* Fix process launching concurrency issues on Windows.
|
||||
|
||||
## Version 1.10.7: June 15, 2022
|
||||
### Bug Fixes
|
||||
@@ -40,7 +188,7 @@
|
||||
* Fix several IntelliSense bugs. [#6226](https://github.com/microsoft/vscode-cpptools/issues/6226), [#8294](https://github.com/microsoft/vscode-cpptools/issues/8294), [#8530](https://github.com/microsoft/vscode-cpptools/issues/8530), [#8725](https://github.com/microsoft/vscode-cpptools/issues/8725), [#8751](https://github.com/microsoft/vscode-cpptools/issues/8751), [#9076](https://github.com/microsoft/vscode-cpptools/issues/9076), [#9224](https://github.com/microsoft/vscode-cpptools/issues/9224), [#9336](https://github.com/microsoft/vscode-cpptools/issues/9336).
|
||||
* Fix issue with shell processing incorrectly occurring for `arguments` fields in `compile_commands.json` files. [#8649](https://github.com/microsoft/vscode-cpptools/issues/8649)
|
||||
* Fix handling of `@response` files for clang-tidy on Windows. [#8843](https://github.com/microsoft/vscode-cpptools/issues/8843), [#9032](https://github.com/microsoft/vscode-cpptools/issues/9032), [#9102](https://github.com/microsoft/vscode-cpptools/issues/9102)
|
||||
* Fix issue with inconsistent handling of shell escaping in compiler arg fields. All compiler arg array fields are now assumed to not include shell quoting, escaping or shell variables. Added a `C_Cpp.legacyCompilerArgsBehavior` to restore the legacy behavior. [#8963](https://github.com/microsoft/vscode-cpptools/issues/8963)
|
||||
* Fix issue with inconsistent handling of shell escaping in compiler arg fields. All compiler arg array fields are now assumed to not include shell quoting, escaping or shell variables. Added a `C_Cpp.legacyCompilerArgsBehavior` to restore the legacy behavior. [#8963](https://github.com/microsoft/vscode-cpptools/issues/8963)
|
||||
* Add localized strings for build tasks. [#9051](https://github.com/microsoft/vscode-cpptools/issues/9051)
|
||||
* Fix Go to Definition with C for identifiers that are C++ keywords. [#9081](https://github.com/microsoft/vscode-cpptools/issues/9081)
|
||||
* Fix the new Run/Debug Code button not working with a modified program location. [#9082](https://github.com/microsoft/vscode-cpptools/issues/9082)
|
||||
@@ -85,9 +233,9 @@
|
||||
* Add a "More Info" option when an incompatible VSIX is encountered. [PR #8920](https://github.com/microsoft/vscode-cpptools/pull/8920)
|
||||
* Add `;` to `break` and `continue` completion keywords. [#8932](https://github.com/microsoft/vscode-cpptools/issues/8932)
|
||||
* Prevent stripping of format specifiers from -exec commands.
|
||||
* Gareth Rees (@gareth-rees) [MIEngine#1277](https://github.com/microsoft/MIEngine/pull/1278)
|
||||
* Gareth Rees (@gareth-rees) [PR MIEngine#1277](https://github.com/microsoft/MIEngine/pull/1278)
|
||||
* Improve messages for unknown breakpoints and watchpoints.
|
||||
* Gareth Rees (@gareth-rees) [MIEngine#1282](https://github.com/microsoft/MIEngine/pull/1283)
|
||||
* Gareth Rees (@gareth-rees) [PR MIEngine#1282](https://github.com/microsoft/MIEngine/pull/1283)
|
||||
|
||||
### Bug Fixes
|
||||
* Fix some IntelliSense parsing bugs. [#5117](https://github.com/microsoft/vscode-cpptools/issues/5117)
|
||||
@@ -194,7 +342,7 @@
|
||||
### New Features
|
||||
* Add a command to restart IntelliSense for a specific file. [#3727](https://github.com/microsoft/vscode-cpptools/issues/3727)
|
||||
* Add support for macOS app bundles [#6726](https://github.com/microsoft/vscode-cpptools/issues/6726)
|
||||
* [MIEngine#1091](https://github.com/microsoft/MIEngine/pull/1091)
|
||||
* [PR MIEngine#1091](https://github.com/microsoft/MIEngine/pull/1091)
|
||||
* Add support for Go To / Peek Type Definition. [#7999](https://github.com/microsoft/vscode-cpptools/issues/7999)
|
||||
|
||||
### Enhancements
|
||||
@@ -218,10 +366,10 @@
|
||||
* Fix an issue related to arg parsing in build tasks. [#7891](https://github.com/microsoft/vscode-cpptools/issues/7891)
|
||||
* Add a check when cppbuild task is used when the active file is not a source file. [#7892](https://github.com/microsoft/vscode-cpptools/issues/7892)
|
||||
* Fix a cpptools crash [#8055](https://github.com/microsoft/vscode-cpptools/issues/8055)
|
||||
* Fix issue "LogPoint stopped working v1.6.0". [#8065](https://github.com/microsoft/vscode-cpptools/issues/8065)
|
||||
* [MIEngine#1208](https://github.com/microsoft/MIEngine/pull/1208)
|
||||
* Fix issue "LogPoint stopped working v1.6.0". [#8065](https://github.com/microsoft/vscode-cpptools/issues/8065)
|
||||
* [PR MIEngine#1208](https://github.com/microsoft/MIEngine/pull/1208)
|
||||
* Fix issue "Debugger won't read/write from/to stdio". [#8075](https://github.com/microsoft/vscode-cpptools/issues/8075)
|
||||
* [MIEngine#1209](https://github.com/microsoft/MIEngine/pull/1209)
|
||||
* [PR MIEngine#1209](https://github.com/microsoft/MIEngine/pull/1209)
|
||||
* Fix an issue with VC 14.0 headers not being found. [#8078](https://github.com/microsoft/vscode-cpptools/issues/8078)
|
||||
* Fix an issue with CUDA support with `compile_commands.json`. [#8091](https://github.com/microsoft/vscode-cpptools/issues/8091)
|
||||
* Fix an issue with `/kernel` arg to `cl.exe` for C files. [#8158](https://github.com/microsoft/vscode-cpptools/issues/8158)
|
||||
@@ -230,9 +378,9 @@
|
||||
## Version 1.6.0: August 24, 2021
|
||||
### New Features
|
||||
* Added support for standard `.editorconfig` entries when using vcFormat. [#7920](https://github.com/microsoft/vscode-cpptools/issues/7920)
|
||||
* Debug Step Granularity for cppdbg [MIEngine#1169](https://github.com/microsoft/MIEngine/pull/1169)
|
||||
* Debug Step Granularity for cppdbg [PR MIEngine#1169](https://github.com/microsoft/MIEngine/pull/1169)
|
||||
* Thank you for the contribution @Trass3r
|
||||
* InstructionBreakpoints for cppdbg [MIEgnine#1192](https://github.com/microsoft/MIEngine/pull/1192)
|
||||
* InstructionBreakpoints for cppdbg [PR MIEgnine#1192](https://github.com/microsoft/MIEngine/pull/1192)
|
||||
|
||||
### Enhancements
|
||||
* Debugger now runs on .NET 5 [#7858](https://github.com/microsoft/vscode-cpptools/pull/7858)
|
||||
@@ -261,7 +409,7 @@
|
||||
* Fix an issue with cppdbg debugging on Windows x64. [#7971](https://github.com/microsoft/vscode-cpptools/issues/7971)
|
||||
* Fix an issue with VS `<execution>` header causing IntelliSense process crash. [#7972](https://github.com/microsoft/vscode-cpptools/issues/7972)
|
||||
* Fix insiders update install loop for remote scenarios. [#8000](https://github.com/microsoft/vscode-cpptools/issues/8000)
|
||||
* Fix MacOS unable to use external terminal to debug [#8008](https://github.com/microsoft/vscode-cpptools/issues/8008)
|
||||
* Fix macOS unable to use external terminal to debug [#8008](https://github.com/microsoft/vscode-cpptools/issues/8008)
|
||||
|
||||
## Version 1.5.1: July 9, 2021
|
||||
### Bug Fixes
|
||||
@@ -321,7 +469,7 @@
|
||||
* Update to clang-format 12. [#6434](https://github.com/microsoft/vscode-cpptools/issues/6434)
|
||||
* Add `private` or `protected` scope labels to class symbols. [#7120](https://github.com/microsoft/vscode-cpptools/issues/7120)
|
||||
* Fix file:line path for $FILEPOS [#7193](https://github.com/microsoft/vscode-cpptools/issues/7193)
|
||||
* [#1124](https://github.com/microsoft/MIEngine/pull/1124)
|
||||
* [PR MIEngine#1124](https://github.com/microsoft/MIEngine/pull/1124)
|
||||
* Add `stopAtConnect` and `hardwareBreakpoints` launch options [PR #7449](https://github.com/microsoft/vscode-cpptools/pull/7449)
|
||||
* `stopAtConnect` stops the debugger on connection to a remote target [PR MIEngine#1109](https://github.com/microsoft/MIEngine/pull/1109)
|
||||
* `hardwareBreakpoints` controls usage and number of remote hardware breakpoints [PR MIEngine#1128](https://github.com/microsoft/MIEngine/pull/1128)
|
||||
@@ -338,7 +486,7 @@
|
||||
* Fix an IntelliSense crash with `#pragma GCC target`. [#6698](https://github.com/microsoft/vscode-cpptools/issues/6698), [#7377](https://github.com/microsoft/vscode-cpptools/issues/7377)
|
||||
* Fix bitness detection for compilers targeting esp32. [#7034](https://github.com/microsoft/vscode-cpptools/issues/7034)
|
||||
* Fix -idirafter directories being included too early. [#7129](https://github.com/microsoft/vscode-cpptools/issues/7129)
|
||||
* Fix issue with the cpptools process lingering when no longer needed. [#7262](https://github.com/microsoft/vscode-cpptools/issues/7262)
|
||||
* Fix issue with the cpptools process lingering when no longer needed. [#7262](https://github.com/microsoft/vscode-cpptools/issues/7262)
|
||||
* Filter out C++ std when querying the compiler as C (and vice versa). [#7269](https://github.com/microsoft/vscode-cpptools/issues/7269)
|
||||
* Fix `files.exclude` ending with `/folder/**` not excluding `/folder`. [#7331](https://github.com/microsoft/vscode-cpptools/issues/7331)
|
||||
* Fix VS Code UI freezing when hovering over very large literals. [#7334](https://github.com/microsoft/vscode-cpptools/issues/7334), [#7577](https://github.com/microsoft/vscode-cpptools/issues/7577)
|
||||
@@ -666,7 +814,7 @@
|
||||
* The way comments are formatted is controlled by the `C_Cpp.simplifyStructuredComments` setting.
|
||||
* Auto-convert `.` to `->` when the type is a pointer. [#862](https://github.com/microsoft/vscode-cpptools/issues/862)
|
||||
* Switch to using the VS Code Semantic Tokens API for semantic colorization (works with remoting). [PR #5401](https://github.com/microsoft/vscode-cpptools/pull/5401), [#3932](https://github.com/microsoft/vscode-cpptools/issues/3932), [#3933](https://github.com/microsoft/vscode-cpptools/issues/3933), [#3942](https://github.com/microsoft/vscode-cpptools/issues/3942)
|
||||
* Add support for LogMessage Breakpoints for debug type `cppdbg`. [MIEngine#1013](https://github.com/microsoft/MIEngine/pull/1013)
|
||||
* Add support for LogMessage Breakpoints for debug type `cppdbg`. [PR MIEngine#1013](https://github.com/microsoft/MIEngine/pull/1013)
|
||||
|
||||
### Enhancements
|
||||
* Automatically add `"${default}"` to the default `includePath` in `c_cpp_properties.json` if `C_Cpp.default.includePath` is set. [#3733](https://github.com/microsoft/vscode-cpptools/issues/3733)
|
||||
@@ -807,7 +955,7 @@
|
||||
* Fix failure to detect CL.exe if VS Installer files are stored on a drive other than the system drive. [#4929](https://github.com/microsoft/vscode-cpptools/issues/4929)
|
||||
* Fix extension randomly getting stuck while communicating with the IntelliSense process on Mac. [#4989](https://github.com/microsoft/vscode-cpptools/issues/4989)
|
||||
* Fix completion results appearing after numeric literals. [#5019](https://github.com/microsoft/vscode-cpptools/issues/5019)
|
||||
* Fix issue with cancellation of a `Rename` operation causing subsequent `Find All References` and `Rename` operations to fail. [#5022](https://github.com/microsoft/vscode-cpptools/issues/5022)
|
||||
* Fix issue with cancellation of a `Rename` operation causing subsequent `Find All References` and `Rename` operations to fail. [#5022](https://github.com/microsoft/vscode-cpptools/issues/5022)
|
||||
* Fix some settings not being editable in the UI. [PR #5126](https://github.com/microsoft/vscode-cpptools/pull/5126)
|
||||
* Fix `cpp_properties.json` error squiggles not appearing. [#5131](https://github.com/microsoft/vscode-cpptools/issues/5131)
|
||||
* Fix `search.exclude` not applying if there are > 1 symbols matching in the excluded file. [#5152](https://github.com/microsoft/vscode-cpptools/issues/5152)
|
||||
|
||||
+21
-1
@@ -4,10 +4,30 @@
|
||||
|
||||
[](https://aka.ms/vsls)
|
||||
|
||||
The C/C++ extension adds language support for C/C++ to Visual Studio Code, including features such as IntelliSense and debugging.
|
||||
The C/C++ extension adds language support for C/C++ to Visual Studio Code, including [editing (IntelliSense)](https://code.visualstudio.com/docs/cpp/cpp-ide) and [debugging](https://code.visualstudio.com/docs/cpp/cpp-debug) features.
|
||||
|
||||
## Pre-requisites
|
||||
C++ is a compiled language meaning your program's source code must be translated (compiled) before it can be run on your computer. VS Code is first and foremost an editor, and relies on command-line tools to do much of the development workflow. The C/C++ extension **does not include a C++ compiler or debugger**. You will need to install these tools or use those already installed on your computer.
|
||||
* C++ compiler pre-installed
|
||||
* C++ debugger pre-installed
|
||||
|
||||
<br/>
|
||||
|
||||
Here is a list of compilers and architectures per platform officially supported by the extension. These are reflected by the available [IntelliSense modes](https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation#_intellisense-mode) from the extension's IntelliSense configuration. Note that support for other compilers may be limited.
|
||||
|
||||
Platform | Compilers | Architectures
|
||||
:--- | :--- | :---
|
||||
Windows | MSVC, Clang, GCC | x64, x86, arm64, arm
|
||||
Linux | Clang, GCC | x64, x86, arm64, arm
|
||||
macOS | Clang, GCC | x64, x86, arm64
|
||||
|
||||
For more information about installing the required tools or setting up the extension, please follow the tutorials below.
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
## Overview and tutorials
|
||||
* [C/C++ extension overview](https://code.visualstudio.com/docs/languages/cpp)
|
||||
* [Introductory Videos](https://code.visualstudio.com/docs/cpp/introvideos-cpp)
|
||||
|
||||
C/C++ extension tutorials per compiler and platform
|
||||
* [Microsoft C++ compiler (MSVC) on Windows](https://code.visualstudio.com/docs/cpp/config-msvc)
|
||||
|
||||
+3640
-2822
File diff suppressed because it is too large
Load Diff
@@ -3423,7 +3423,7 @@
|
||||
"Pro oddíl %sq2 se požádalo o pozici v souboru %d1 (relativní pozice %d2) v modulu %sq1, pozice ale předchází začátek oddílu.",
|
||||
"Pro oddíl %sq2 se požádalo o pozici v souboru %d1 (relativní pozice %d2) v modulu %sq1, pozice ale přetéká konec svého oddílu.",
|
||||
"Pro oddíl %sq2 se požádalo o pozici v souboru %d1 (relativní pozice %d2) v modulu %sq1, pozice ale není zarovnaná s elementy oddílu.",
|
||||
"Z podpole %sq",
|
||||
"z dílčího pole %sq (relativní pozice k uzlu %d)",
|
||||
"Z oddílu %sq, elementu %d1 (pozice v souboru %d2, relativní pozice %d3)",
|
||||
"Atributy výrazu lambda tady nejsou standardní.",
|
||||
"Identifikátor %sq by bylo možné zaměnit za vizuálně podobné %p.",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"kvalifikovaný typ je pro anonymní bitová pole nestandardní.",
|
||||
"typ elementu vektorové podmínky (%t1) musí mít stejnou velikost jako typ elementu výsledku (%t2).",
|
||||
"typ operandu vektoru s plovoucí desetinnou čárkou (%t) nemá žádný odpovídající celočíselný vektorový typ.",
|
||||
"mangling pro výrazy requires ještě není implementovaný."
|
||||
"mangling pro výrazy requires ještě není implementovaný.",
|
||||
"kvůli atributu „není k dispozici“",
|
||||
"došlo k pokusu o vytvoření elementu z oddílu IFC %sq pomocí indexu do oddílu IFC %sq.",
|
||||
"oddíl %sq určil svou velikost položky jako %d1, když bylo očekáváno %d2.",
|
||||
"při zpracování modulu %sq1 byl zjištěn neočekávaný požadavek IFC.",
|
||||
"podmínka selhala na řádku %d v %s1: %sq2",
|
||||
"atomické omezení závisí na sobě",
|
||||
"Funkce noreturn má návratový typ, který není void.",
|
||||
"oprava byla provedena vyřazením parametru %sq (v relativním indexu %d).",
|
||||
"při rekonstrukci entity se zjistil neplatný název identifikátoru IFC %sq.",
|
||||
"neplatný identifikátor IFC s názvem %sq byl během obnovy entity přeskočen.",
|
||||
"neplatná hodnota řazení modulu %sq",
|
||||
"šablona funkce načtená z modulu IFC byla nesprávně parsována jako %nd.",
|
||||
"nepovedlo se načíst odkaz na entitu IFC v modulu %sq.",
|
||||
"Řazení indexu IFC = %d1, hodnota = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"Modul %sq1 Dateiposition %d1 (relative Position %d2) wurde für Partition %sq2 angefordert – was dem Start der Partition vorausgeht",
|
||||
"Modul %sq1 Dateiposition %d1 (relative Position %d2) wurde für die Partition %sq2 angefordert – was das Ende ihrer Partition überschreitet",
|
||||
"Modul %sq1 Dateiposition %d1 (relative Position %d2) wurde für die Partition %sq2 angefordert – welche mit ihren Partitionselementen falsch ausgerichtet ist",
|
||||
"aus dem Subfeld %sq",
|
||||
"von Unterfeld %sq (relative Position zum Knoten %d)",
|
||||
"von Partition %sq Element %d1 (Dateiposition %d2, relative Position %d3)",
|
||||
"Lambda-Attribute entsprechen hier nicht dem Standard",
|
||||
"der Bezeichner %sq könnte mit einem visuell ähnlichen Bezeichner verwechselt werden, der %p angezeigt wird",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"ein qualifizierter Typ ist kein Standard für anonyme Bitfelder",
|
||||
"der Elementtyp der Vektorbedingung (%t1) muss dieselbe Größe haben wie der Elementtyp des Ergebnisses (%t2)",
|
||||
"der Gleitkomma-Vektoroperandentyp (%t) hat keinen übereinstimmenden ganzzahligen Vektortyp",
|
||||
"das Mangling für 'requires'-Ausdrücke ist noch nicht implementiert"
|
||||
"das Mangling für 'requires'-Ausdrücke ist noch nicht implementiert",
|
||||
"aufgrund eines „nicht verfügbaren“ Attributs",
|
||||
"Es wurde versucht, ein Element aus der IFC-Partition %sq mithilfe eines Indexes in der IFC-Partition %sq zu erstellen",
|
||||
"Die Partition %sq hat ihre Eintragsgröße mit %d1 angegeben, obwohl %d2 erwartet wurde",
|
||||
"Unerwartete IFC-Anforderung beim Verarbeiten des Moduls %sq1",
|
||||
"Bedingungsfehler in Zeile %d in %s1: %sq2",
|
||||
"Die atomische Einschränkung hängt von sich selbst ab",
|
||||
"Die Funktion \"noreturn\" weist den Rückgabetyp \"nicht void\" auf.",
|
||||
"Eine Korrektur wurde vorgenommen, indem der Parameter %sq (beim relativen Index %d) weggelassen wurde",
|
||||
"Ungültiger IFC-Bezeichnername %sq bei der Rekonstruktion der Entität gefunden",
|
||||
"Ungültiger IFC-Bezeichnername %sq bei der Rekonstruktion der Entität übersprungen",
|
||||
"Modul %sq ungültiger Sortierwert",
|
||||
"Eine aus einem IFC-Modul geladene Funktionsvorlage wurde fälschlicherweise als %nd analysiert",
|
||||
"Fehler beim Laden eines IFC-Entitätsverweises im Modul \"%sq\"",
|
||||
"IFC-Indexsortierung = %d1, Wert = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"módulo %sq1, posición de archivo %d1 (posición relativa %d2) solicitada para la partición %sq2, que es anterior al inicio de la partición",
|
||||
"módulo %sq1, posición de archivo %d1 (posición relativa %d2) solicitada para la partición %sq2, que desborda el final de su partición",
|
||||
"módulo %sq1 posición de archivo %d1 (posición relativa %d2) solicitada para la partición %sq2, que está mal alineada con sus elementos de particiones",
|
||||
"del subcampo %sq",
|
||||
"desde el subcampo %sq (posición relativa al nodo %d)",
|
||||
"de la partición %sq elemento %d1 (posición de archivo %d2, posición relativa %d3)",
|
||||
"los atributos lambda no son estándar aquí",
|
||||
"el identificador %sq podría confundirse con uno visualmente similar que aparece %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"un tipo calificado no es estándar para campos de bits anónimos",
|
||||
"el tipo de elemento de la condición de vector (%t1) debe tener el mismo tamaño que el tipo de elemento del resultado (%t2)",
|
||||
"el tipo de operando de vector de punto flotante (%t) no tiene ningún tipo de vector entero coincidente",
|
||||
"aún no se ha implementado la limpieza de expresiones \"requires\""
|
||||
"aún no se ha implementado la limpieza de expresiones \"requires\"",
|
||||
"debido a un atributo “no disponible”",
|
||||
"intentó construir un elemento a partir de la partición IFC %sq mediante un índice en la partición IFC %sq",
|
||||
"la partición %sq especificó su tamaño de entrada como %d1 cuando se esperaba %d2",
|
||||
"se encontró un requisito IFC inesperado al procesar el módulo %sq1",
|
||||
"error de condición en la línea %d en %s1: %sq2",
|
||||
"la restricción atómica depende de sí misma",
|
||||
"La función \"noreturn\" tiene un tipo de valor devuelto distinto de nulo",
|
||||
"se ha quitado el parámetro %sq (en el índice relativo %d) para realizar una corrección",
|
||||
"se encontró un nombre de identificador IFC no válido %sq durante la reconstrucción de entidades",
|
||||
"se omitió un nombre de identificador IFC no válido %sq durante la reconstrucción de entidades",
|
||||
"el módulo %sq es un valor de ordenación no válido",
|
||||
"una plantilla de función cargada desde un módulo IFC se analizó incorrectamente como %nd",
|
||||
"no se pudo cargar una referencia de entidad IFC en el módulo %sq",
|
||||
"Ordenación de índice IFC = %d1, valor = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"module %sq1 position de fichier %d1 (position relative %d2) demandée pour la partition %sq2, qui précède le début de la partition",
|
||||
"module %sq1 position de fichier %d1 (position relative %d2) demandée pour la partition %sq2, qui dépasse la fin de sa partition",
|
||||
"module %sq1 position de fichier %d1 (position relative %d2) demandée pour la partition %sq2, qui est mal alignée avec ses éléments de partitions",
|
||||
"à partir du sous-champ %sq",
|
||||
"à partir du sous-champ %sq (position relative par rapport au nœud %d)",
|
||||
"à partir de la partition %sq, élément %d1 (position de fichier %d2, position relative %d3)",
|
||||
"les attributs lambda ne sont pas standard ici",
|
||||
"l’identificateur %sq peut être confondu avec un identificateur visuellement similaire qui apparaît %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"un type qualifié n’est pas standard pour les champs de bits anonymes.",
|
||||
"le type d’élément de la condition vectorielle (%t1) doit avoir la même taille que le type d’élément du résultat (%t2).",
|
||||
"le type d’opérande vectoriel à virgule flottante (%t) n’a pas de type de vecteur entier correspondant.",
|
||||
"La gestion des expressions \"requires\" n'est pas encore implémentée."
|
||||
"La gestion des expressions \"requires\" n'est pas encore implémentée.",
|
||||
"en raison d’un attribut 'unavailable'",
|
||||
"a tenté de construire un élément à partir d’une partition IFC %sq à l’aide d’un index dans la partition IFC %sq.",
|
||||
"le %sq de partition a spécifié sa taille d’entrée %d1 alors que %d2 était attendu.",
|
||||
"une exigence IFC inattendue s’est produite lors du traitement du module %sq1.",
|
||||
"échec de la condition à la ligne %d dans %s1 : %sq2",
|
||||
"la contrainte atomique dépend d’elle-même.",
|
||||
"La fonction 'noreturn' a un type de retour non vide",
|
||||
"une correction a été effectuée en supprimant le paramètre %sq (au %d d’index relatif)",
|
||||
"nom d’identificateur IFC non valide %sq rencontré lors de la reconstruction de l’entité",
|
||||
"identificateur IFC non valide nommé %sq ignoré lors de la reconstruction de l’entité",
|
||||
"le module %sq valeur de tri non valide",
|
||||
"un modèle de fonction chargé à partir d’un module IFC a été analysé de manière incorrecte en tant que %nd",
|
||||
"échec du chargement d’une référence d’entité IFC dans le module %sq",
|
||||
"Tri d’index IFC = %d1, valeur = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"modulo %sq1 posizione del file %d1 (posizione relativa %d2) richiesta per la partizione %sq2, che precede l'inizio della partizione",
|
||||
"modulo %sq1 posizione del file %d1 (posizione relativa %d2) richiesta per la partizione %sq2, che causa l'overflow della fine della partizione",
|
||||
"modulo %sq1 posizione file %d1 (posizione relativa %d2) richiesta per la partizione %sq2, che non è allineata con i relativi elementi di partizioni",
|
||||
"dal sottocampo %sq",
|
||||
"dal sottocampo %sq (posizione relativa al nodo %d)",
|
||||
"dalla partizione %sq elemento %d1 (posizione file %d2, posizione relativa %d3)",
|
||||
"attributi lambda non conformi allo standard",
|
||||
"l'identificatore %sq potrebbe essere confuso con un identificatore visivamente simile visualizzato %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"un tipo qualificato non è conforme allo standard per i campi di bit anonimi",
|
||||
"il tipo di elemento della condizione vettoriale (%t1) deve avere le stesse dimensioni del tipo di elemento del risultato (%t2)",
|
||||
"il tipo di operando di vettore a virgola mobile (%t) non ha un tipo di vettore intero corrispondente",
|
||||
"il mangling per le espressioni 'requires' non è ancora implementato"
|
||||
"il mangling per le espressioni 'requires' non è ancora implementato",
|
||||
"a causa di un attributo 'non disponibile'",
|
||||
"ha tentato di costruire un elemento dalla partizione IFC %sq utilizzando un indice nella partizione IFC %sq",
|
||||
"la partizione %sq ha specificato la dimensione della voce come %d1 mentre era previsto %d2",
|
||||
"Durante l'elaborazione del modulo %sq1 è stato riscontrato un requisito IFC imprevisto.",
|
||||
"condizione fallita alla riga %d in %s1: %sq2",
|
||||
"il vincolo atomico dipende da se stesso",
|
||||
"La funzione 'noreturn' ha un tipo restituito non void",
|
||||
"è stata apportata una correzione eliminando il parametro %sq (in corrispondenza dell'indice relativo %d)",
|
||||
"nome identificatore IFC %sq non valido rilevato durante la ricostruzione dell'entità",
|
||||
"nome identificatore IFC %sq non valido ignorato durante la ricostruzione dell'entità",
|
||||
"il modulo %sq valore di ordinamento non valido",
|
||||
"un modello di funzione caricato da un modulo IFC è stato analizzato erroneamente come %nd",
|
||||
"non è stato possibile caricare un riferimento all'entità IFC nel modulo %sq",
|
||||
"Ordinamento indice IFC = %d1, valore = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"モジュール %sq1 ファイル位置 %d1 (相対位置 %d2) がパーティション %sq2 に対して要求されました - これはパーティションの始点より前です",
|
||||
"モジュール %sq1 ファイル位置 %d1 (相対位置 %d2) がパーティション %sq2 に対して要求されました - これはそのパーティションの終点をオーバーフローしています",
|
||||
"モジュール %sq1 ファイル位置 %d1 (相対位置 %d2) がパーティション %sq2 に対して要求されました - これはそのパーティション要素の整列誤りです",
|
||||
"サブフィールド %sq の始点",
|
||||
"サブフィールド %sq から (ノード %d への相対位置)",
|
||||
"パーティション元 %sq 要素 %d1 (ファイル位置 %d2、相対位置 %d3)",
|
||||
"ラムダ属性はここでは非標準です",
|
||||
"識別子 %sq は、%p に表示される視覚的に類似したものと混同される可能性があります",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"修飾された型は匿名ビット フィールドでは非標準です",
|
||||
"ベクトル条件 (%t1) の要素型は、結果の要素型 (%t2) と同じサイズである必要があります",
|
||||
"浮動小数点ベクトル オペランド型 (%t) に一致する整数ベクトル型がありません",
|
||||
"'requires' 式のためのマングリングは、まだ実装されていません"
|
||||
"'requires' 式のためのマングリングは、まだ実装されていません",
|
||||
"'unavailable' 属性が原因です",
|
||||
"IFC パーティション %sq へのインデックスを使用して、IFC パーティション %sq から要素を構築しようとしました",
|
||||
"パーティション %sq は、%d2 が予期されたときにエントリ サイズを %d1 として指定しました",
|
||||
"モジュール %sq1 の処理中に予期しない IFC 要件が発生しました",
|
||||
"条件が行 %d で失敗しました (%s1: %sq2)",
|
||||
"アトミック制約は、それ自体に依存します",
|
||||
"'noreturn' 関数に void 以外の戻り値の型があります",
|
||||
"パラメーター %sq (相対インデックス %d) を削除することで修正が行われています",
|
||||
"エンティティの再構築中に無効な IFC 識別子名 %sq が見つかりました",
|
||||
"エンティティの再構築中に %sq と命名された無効な IFC 識別子がスキップされました",
|
||||
"モジュール %sq は無効な並べ替え値です",
|
||||
"IFC モジュールから読み込まれた関数テンプレートが誤って %nd として解析されました",
|
||||
"モジュール %sq で IFC エンティティ参照を読み込めませんでした",
|
||||
"IFC インデックスの並べ替え = %d1、値 = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"%sq1 모듈 파일 위치 %d1(상대 위치 %d2)이(가) 파티션 %sq2에 대해 요청되었습니다. 이는 파티션의 시작을 선행합니다.",
|
||||
"모듈 %sq1 파일 위치 %d1(상대 위치 %d2)이(가) 파티션의 끝을 오버플로하는 파티션 %sq2에 대해 요청되었습니다.",
|
||||
"모듈 %sq1 파일 위치 %d1(상대 위치 %d2)이(가) 파티션 요소가 잘못 정렬된 파티션 %sq2에 대해 요청되었습니다.",
|
||||
"하위 필드 %sq에서",
|
||||
"하위 필드 %sq(노드 %d에 대한 상대 위치)에서",
|
||||
"파티션 %sq 요소 %d1(파일 위치 %d2, 상대 위치 %d3)에서",
|
||||
"여기서 람다 특성은 표준이 아닙니다.",
|
||||
"식별자 %sq은(는) 시각적으로 유사한 식별자와 혼동될 수 있습니다. %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"정규화된 형식이 익명 비트 필드에 대해 표준이 아닙니다.",
|
||||
"벡터 조건의 요소 유형(%t1)은 결과의 요소 유형(%t2)과 크기가 같아야 합니다.",
|
||||
"부동 소수점 벡터 피연산자 유형(%t)에 일치하는 정수 벡터 유형이 없습니다.",
|
||||
"'requires' 식에 대한 mangling이 아직 구현되지 않았습니다."
|
||||
"'requires' 식에 대한 mangling이 아직 구현되지 않았습니다.",
|
||||
"'unavailable' 특성 때문에",
|
||||
"IFC 파티션 %sq에 대한 인덱스를 사용하여 IFC 파티션 %sq에서 요소를 구성하려고 했습니다.",
|
||||
"파티션 %sq는 %d2가 예상될 때 항목 크기를 %d1로 지정했습니다.",
|
||||
"모듈 %sq1을(를) 처리하는 동안 예기치 않은 IFC 요구 사항이 발생했습니다.",
|
||||
"%d행(%s1)에서 조건 실패: %sq2",
|
||||
"원자성 제약 조건은 자체에 따라 달라집니다.",
|
||||
"'noreturn' 함수에 void가 아닌 반환 형식이 있습니다.",
|
||||
"매개 변수 %sq(상대 인덱스 %d)를 삭제하여 수정했습니다.",
|
||||
"엔터티를 재구성하는 동안 %sq라는 잘못된 IFC 식별자를 발견했습니다.",
|
||||
"엔티티를 재구성하는 동안 %sq라는 잘못된 IFC 식별자를 건너뛰었습니다.",
|
||||
"모듈 %sq 잘못된 정렬 값",
|
||||
"IFC 모듈에서 로드된 함수 템플릿이 %nd(으)로 잘못 구문 분석되었습니다.",
|
||||
"모듈 %sq에서 IFC 엔터티 참조를 로드하지 못했습니다.",
|
||||
"IFC 인덱스 정렬 = %d1, 값 = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"zażądano modułu %sq1 pozycji pliku %d1 (względna pozycja %d2) dla partycji %sq2, która poprzedza rozpoczęcie partycji",
|
||||
"zażądano modułu %sq1 pozycji pliku %d1 (pozycja względna %d2) dla partycji %sq2, która powoduje przepełnienie końca partycji",
|
||||
"zażądano modułu %sq1 pozycji pliku %d1 (pozycja względna %d2) dla partycji %sq2, która jest nieprawidłowo wyrównana do jej elementów partycji",
|
||||
"z podpola %sq",
|
||||
"z podpola %sq (względne położenie w stosunku do węzła %d)",
|
||||
"z partycji %sq element %d1 (pozycja pliku %d2, względna pozycja %d3)",
|
||||
"atrybuty lambda są niestandardowe w tym miejscu",
|
||||
"identyfikator %sq można pomylić z widocznym wizualnie identyfikatorem %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"kwalifikowany typ jest niestandardowy dla anonimowych pól bitowych",
|
||||
"typ elementu warunku wektora (%t1) musi mieć taki sam rozmiar jak typ elementu wyniku (%t2)",
|
||||
"typ operandu wektora zmiennoprzecinkowego (%t) nie ma zgodnego typu wektora liczb całkowitych",
|
||||
"nie jest jeszcze zaimplementowane dekorowanie wyrażeń typu „requires”."
|
||||
"nie jest jeszcze zaimplementowane dekorowanie wyrażeń typu „requires”.",
|
||||
"z powodu atrybutu „unavailable”",
|
||||
"próbowano skonstruować element z partycji IFC %sq przy użyciu indeksu do partycji IFC %sq",
|
||||
"partycja %sq określiła swój rozmiar wpisu jako %d1, gdy oczekiwano wartości %d2",
|
||||
"napotkano nieoczekiwane wymaganie IFC podczas przetwarzania modułu %sq1",
|
||||
"warunek nie powiódł się w wierszu %d w %s1: %sq2",
|
||||
"niepodzielne ograniczenie zależy od samego siebie",
|
||||
"Funkcja \"noreturn\" ma zwracany typ inny niż void",
|
||||
"wprowadzono poprawkę przez usunięcie parametru %sq (względny indeks %d)",
|
||||
"napotkano nieprawidłową nazwę identyfikatora IFC %sq podczas odbudowy jednostki",
|
||||
"podczas odbudowy jednostki pominięto nieprawidłowy identyfikator IFC o nazwie %sq",
|
||||
"nieprawidłowa wartość sortowania modułu %sq",
|
||||
"szablon funkcji załadowany z modułu IFC został niepoprawnie przeanalizowany jako %nd",
|
||||
"nie można załadować odwołania do jednostki IFC w module %sq",
|
||||
"Sortowanie indeksu IFC = %d1, wartość = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"módulo %sq1 posição de arquivo %d1 (posição relativa %d2) solicitada para a partição %sq2 - que impede o início da partição",
|
||||
"módulo %sq1 posição de arquivo %d1 (posição relativa %d2) solicitada para a partição %sq2 - que estoura o final de sua partição",
|
||||
"módulo %sq1 posição de arquivo %d1 (posição relativa %d2) solicitada para a partição %sq2 - que está desalinhada com seus elementos de partições",
|
||||
"do subcampo %sq",
|
||||
"do subcampo %sq (posição relativa ao nó %d)",
|
||||
"da partição %sq elemento %d1 (posição do arquivo %d2, posição relativa %d3)",
|
||||
"os atributos lambda não são padrão aqui",
|
||||
"O identificador %sq pode ser confundido com um visualmente semelhante ao que aparece %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"um tipo qualificado não é padrão para campos de bits anônimos",
|
||||
"o tipo de elemento da condição de vetor (%t1) deve ter o mesmo tamanho que o tipo de elemento do resultado (%t2)",
|
||||
"o tipo de operando vetorial de ponto flutuante (%t) não tem nenhum tipo de vetor inteiro correspondente",
|
||||
"a estruturação para expressões 'requires' ainda não foi implementada"
|
||||
"a estruturação para expressões 'requires' ainda não foi implementada",
|
||||
"devido a um atributo 'indisponível'",
|
||||
"tentou construir um elemento da partição IFC %sq usando um índice na partição IFC %sq",
|
||||
"a partição %sq especificou seu tamanho de entrada como %d1 quando %d2 era esperado",
|
||||
"um requisito IFC inesperado foi encontrado durante o processamento do módulo %sq1",
|
||||
"condição falhou na linha %d em %s1: %sq2",
|
||||
"restrição atômica depende de si mesma",
|
||||
"A função 'noreturn' tem um tipo de retorno não nulo",
|
||||
"foi feita uma correção eliminando o parâmetro %sq (no índice relativo %d)",
|
||||
"nome de identificador IFC inválido %sq encontrado durante a reconstrução da entidade",
|
||||
"identificador IFC inválido chamado %sq ignorado durante a reconstrução da entidade",
|
||||
"valor de classificação inválido do módulo %sq",
|
||||
"um modelo de função carregado de um módulo IFC foi analisado incorretamente como %nd",
|
||||
"falha ao carregar uma referência de entidade IFC no módulo %sq",
|
||||
"Classificação do índice IFC = %d1, valor = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"модуль %sq1, позиция файла %d1 (относительная позиция %d2) запрошена для раздела %sq2, который находится перед началом раздела",
|
||||
"модуль %sq1, позиция файла %d1 (относительная позиция %d2) для раздела %sq2, который переполняет окончание этого раздела",
|
||||
"модуль %sq1, позиция файла %d1 (относительная позиция %d2) запрошена для раздела %sq2, который не выровнен по элементам разделов",
|
||||
"из подполя %sq",
|
||||
"из подполя %sq (относительное положение к узлу %d)",
|
||||
"из раздела %sq, элемент %d1 (позиция файла %d2, относительная позиция %d3)",
|
||||
"здесь нестандартные лямбда-атрибуты",
|
||||
"идентификатор %sq можно перепутать с визуально похожим %p",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"нестандартный тип с квалификатором для анонимных битовых полей",
|
||||
"тип элемента векторного условия (%t1) должен иметь тот же размер, что и тип элемента результата (%t2)",
|
||||
"тип векторного операнда с плавающей запятой (%t) не имеет соответствующего целочисленного векторного типа",
|
||||
"искажение для выражений \"requires\" еще не реализовано"
|
||||
"искажение для выражений \"requires\" еще не реализовано",
|
||||
"из-за атрибута \"unavailable\"",
|
||||
"попытка создать элемент из раздела IFC %sq с использованием индекса в разделе IFC %sq",
|
||||
"раздел %sq указал размер своей записи как %d1, в то время как ожидалось %d2",
|
||||
"При обработке модуля %sq1 было обнаружено неожиданное требование IFC",
|
||||
"сбой условия в строке %d в %s1: %sq2",
|
||||
"атомарное ограничение зависит от самого себя",
|
||||
"Функция \"noreturn\" имеет не недействительный тип возврата",
|
||||
"исправление внесено путем удаления параметра %sq (по относительному индексу %d)",
|
||||
"обнаружено недопустимое имя идентификатора IFC %sq во время реконструкции сущности",
|
||||
"недопустимое имя идентификатора IFC %sq пропущено во время реконструкции сущности",
|
||||
"недопустимое значение сортировки модуля %sq",
|
||||
"шаблон функции, загруженный из модуля IFC, был неправильно проанализирован как %nd",
|
||||
"не удалось загрузить ссылку на объект IFC в модуль %sq",
|
||||
"Сортировка индекса IFC = %d1, значение = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"%sq1 modülünün %d1 dosya konumu (%d2 göreli konumu) bölümün başlangıcından önce gelen %sq2 bölümü için istekte bulundu",
|
||||
"%sq1 modülünün %d1 dosya konumu (%d2 göreli konumu) bölümünün sonundan taşan %sq2 bölümü için istekte bulundu",
|
||||
"%sq1 modülünün %d1 dosya konumu (%d2 göreli konumu) bölüm öğeleriyle yanlış hizalanan %sq2 bölümü için istekte bulundu",
|
||||
"%sq alt alanından",
|
||||
"%sq alt alanından (%d düğümüne göreli olan konum)",
|
||||
"%sq bölümündeki %d1 öğesinden (%d2 dosya konumu, %d3 göreli konumu)",
|
||||
"lambda öznitelikleri burada standart dışı",
|
||||
"%sq tanımlayıcısı görsel olarak %p gibi görünen tanımlayıcıyla karıştırılabilir",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"nitelenmiş bir tür adı anonim bit alanları için standart dışı",
|
||||
"vektör koşulunun öğe türü (%t1), sonucun öğe türü (%t2) ile aynı boyuta sahip olmalıdır",
|
||||
"kayan nokta vektörü işlenen türü (%t) eşleşen bir tamsayı vektörü türü içermiyor",
|
||||
"'requires' ifadeleri için değiştirme henüz uygulanmadı"
|
||||
"'requires' ifadeleri için değiştirme henüz uygulanmadı",
|
||||
"'kullanılamayan' bir öznitelik nedeniyle",
|
||||
"%sq IFC bölümü içinde bir dizin kullanılarak %sq IFC bölümündeki bir öğe oluşturulmaya çalışıldı",
|
||||
"%sq bölümü, %d2 beklenirken girdi boyutunu %d1 olarak belirtti",
|
||||
"%sq1 modülü işlenirken beklenmeyen bir IFC gereksinimiyle karşılaşıldı",
|
||||
"koşul, %d numaralı satırda (%s1 içinde) başarısız oldu: %sq2",
|
||||
"atomik kısıtlama kendisine bağımlı",
|
||||
"'noreturn' işlevi geçersiz olmayan bir dönüş türüne sahiptir",
|
||||
"%sq parametresi kaldırılarak bir düzeltme yapıldı (%d göreli dizininde)",
|
||||
"varlık yeniden oluşturma işlemi sırasında geçersiz %sq IFC tanımlayıcı adı ile karşılaşıldı",
|
||||
"varlık yeniden oluşturma işlemi sırasında geçersiz %sq IFC tanımlayıcı adı atlandı",
|
||||
"%sq modülü geçersiz sıralama değeri",
|
||||
"bir IFC modülünden yüklenen bir fonksiyon şablonu hatalı bir şekilde %nd olarak ayrıştırıldı",
|
||||
"%sq modülünde bir IFC varlık referansı yüklenemedi",
|
||||
"IFC dizin sıralaması = %d1, değer = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"已请求模块 %sq1 文件位置 %d1 (相对位置 %d2),针对分区 %sq2 请求 - 分区开始前",
|
||||
"已请求模块 %sq1 文件位置 %d1 (相对位置 %d2),针对分区 %sq2 请求 - 溢出其分区的末尾",
|
||||
"已请求模块 %sq1 文件位置 %d1 (相对位置 %d2),针对分区 %sq2 - 与其分区元素不一致",
|
||||
"从子字段 %sq",
|
||||
"从子域 %sq (相对于节点 %d 的位置)",
|
||||
"从分区 %sq 元素 %d1 (文件位置 %d2,相对位置 %d3)",
|
||||
"lambda 属性在此处为非标准属性",
|
||||
"标识符 %sq 可能与显示 %p 的视觉上相似的标识符混淆",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"限定类型对于匿名位字段是非标准的",
|
||||
"向量条件的元素类型(%t1)的大小必须与结果的元素类型相同(%t2)",
|
||||
"浮点向量操作数类型(%t)没有匹配的整数向量类型",
|
||||
"尚未实现 “requires” 表达式的变量名压缩"
|
||||
"尚未实现 “requires” 表达式的变量名压缩",
|
||||
"因为“不可用”属性",
|
||||
"已尝试使用索引将一个元素从 IFC 分区 %sq 构造到 IFC 分区 %sq",
|
||||
"分区 %sq 将其条目大小指定为 %d1,正确的大小为 %d2",
|
||||
"处理模块 %sq1 时遇到意外的 IFC 要求",
|
||||
"条件失败,行 %d,%s1: %sq2",
|
||||
"原子约束依赖于自身",
|
||||
"“noreturn”函数具有非 void 返回类型",
|
||||
"通过删除参数 %sq (在相对索引 %d 处)进行了更正",
|
||||
"实体重建期间遇到了无效的 IFC 标识符名称 %sq",
|
||||
"实体重建期间跳过了名为 %sq 的无效 IFC 标识符",
|
||||
"模块 %sq 排序值无效",
|
||||
"从 IFC 模块加载的函数模板被错误地分析为 %nd",
|
||||
"未能在模块 %sq 中加载 IFC 实体引用",
|
||||
"IFC 索引排序 = %d1,值 = %d2"
|
||||
]
|
||||
@@ -3423,7 +3423,7 @@
|
||||
"模組 %sq1 檔案位置 %d1 (相對位置 %d2) 要求分割區 %sq2 - 在分割區開始之前",
|
||||
"模組 %sq1 檔案位置 %d1 (相對位置 %d2) 要求分割區 %sq2 - 溢出其分割區的結尾",
|
||||
"模組 %sq1 檔案位置 %d1 (相對位置 %d2) 要求分割區 %sq2 - 與其分割區元素對齊錯誤",
|
||||
"從子欄位 %sq",
|
||||
"從 subfield %sq (節點 %d 的相對位置)",
|
||||
"從分割區 %sq 元素 %d1 (檔案位置 %d2,相對位置 %d3)",
|
||||
"Lambda 屬性在此為非標準",
|
||||
"識別碼 %sq 可能會與 %p 上視覺類似的識別碼混淆",
|
||||
@@ -3461,5 +3461,19 @@
|
||||
"限定類型對匿名位欄位而言不是標準類型",
|
||||
"向量條件 (%t1) 的元素類型大小必須與結果的元素類型相同 (%t2)",
|
||||
"浮點向量運算元類型 (%t) 沒有相符的整數向量類型",
|
||||
"尚未實作 'requires' 運算式的重整"
|
||||
"尚未實作 'requires' 運算式的重整",
|
||||
"因為 'unavailable' 屬性",
|
||||
"已嘗試使用索引從 IFC 磁碟分割 %sq 將元素建構到 IFC 磁碟分割 %sq",
|
||||
"磁碟分割 %sq 在需要 %d2 時將其項目大小指定為 %d1",
|
||||
"處理模組 %sq1 時發現未預期的 IFC 需求",
|
||||
"第 %d 行 (在 %s1 中) 條件失敗: %sq2",
|
||||
"不可部分完成限制式依賴其本身",
|
||||
"'noreturn' 函數具有非 void 的返回類型",
|
||||
"已置放參數 %sq (相對索引 %d) 進行修正",
|
||||
"實體重建期間發現無效 IFC 識別碼名稱 %sq",
|
||||
"實體重建期間略過名稱為 %sq 的無效 IFC 識別碼",
|
||||
"模組 %sq 無效排序值",
|
||||
"從 IFC 模組載入的函數範本不正確地剖析為 %nd",
|
||||
"無法在模組 %sq 中載入 IFC 實體參考",
|
||||
"IFC 索引排序 = %d1,值 = %d2"
|
||||
]
|
||||
+22
-21
@@ -1,24 +1,25 @@
|
||||
{
|
||||
"Registrations": [
|
||||
{
|
||||
"Component": {
|
||||
"Type": "git",
|
||||
"Git": {
|
||||
"RepositoryUrl": "https://github.com/llvm/llvm-project",
|
||||
"CommitHash": "0d44201451f03ba907cdb268ddddfc3fa38a0ebd"
|
||||
},
|
||||
"DevelopmentDependency": true
|
||||
}
|
||||
"$schema": "https://json.schemastore.org/component-detection-manifest.json",
|
||||
"Registrations": [
|
||||
{
|
||||
"Component": {
|
||||
"Type": "git",
|
||||
"Git": {
|
||||
"RepositoryUrl": "https://github.com/llvm/llvm-project",
|
||||
"CommitHash": "0d44201451f03ba907cdb268ddddfc3fa38a0ebd"
|
||||
},
|
||||
{
|
||||
"Component": {
|
||||
"Type": "git",
|
||||
"Git": {
|
||||
"RepositoryUrl": "https://github.com/lldb-tools/lldb-mi",
|
||||
"CommitHash": "2388bd74133bc21eac59b2e2bf97f2a30770a315"
|
||||
}
|
||||
}
|
||||
"DevelopmentDependency": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"Component": {
|
||||
"Type": "git",
|
||||
"Git": {
|
||||
"RepositoryUrl": "https://github.com/lldb-tools/lldb-mi",
|
||||
"CommitHash": "2388bd74133bc21eac59b2e2bf97f2a30770a315"
|
||||
}
|
||||
],
|
||||
"Version": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Version": 1
|
||||
}
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
"c_cpp.command.BuildAndDebugFile.title": "调试 C/C++ 文件",
|
||||
"c_cpp.command.BuildAndRunFile.title": "运行 C/C++ 文件",
|
||||
"c_cpp.command.AddDebugConfiguration.title": "添加调试配置",
|
||||
"c_cpp.command.GenerateDoxygenComment.title": "生成 Doxygen 注释",
|
||||
"c_cpp.command.addSshTarget.title": "添加 SSH 目标",
|
||||
"c_cpp.command.removeSshTarget.title": "移除 SSH 目标",
|
||||
"c_cpp.command.setActiveSshTarget.title": "将此 SSH 目标设置为活动目标",
|
||||
"c_cpp.command.selectActiveSshTarget.title": "选择活动 SSH 目标",
|
||||
"c_cpp.command.selectSshTarget.title": "选择 SSH 目标",
|
||||
"c_cpp.command.activeSshTarget.title": "获取活动 SSH 目标",
|
||||
"c_cpp.command.refreshCppSshTargetsView.title": "刷新",
|
||||
"c_cpp.command.sshTerminal.title": "在新终端中连接到此 SSH 目标",
|
||||
"c_cpp.configuration.maxConcurrentThreads.markdownDescription": "用于语言服务处理的最大并发线程数。该值是一个提示,且不能始终使用。默认值 `null` (空)使用可用的逻辑处理器数。",
|
||||
"c_cpp.configuration.maxCachedProcesses.markdownDescription": "用于语言服务处理的最大缓存进程数。默认值 `null` (空)使用可用逻辑处理器数的两倍。",
|
||||
"c_cpp.configuration.maxMemory.markdownDescription": "可用于语言服务处理的最大内存(以 MB 为单位)。超过此内存使用量后,将缓存且并发运行较少的进程。默认值 `null` (空)使用系统的空闲内存。",
|
||||
@@ -44,17 +53,18 @@
|
||||
"c_cpp.configuration.codeAnalysis.maxConcurrentThreads.markdownDescription": "用于代码分析的最大并发线程数。默认值 `null` (空)使用从 `#C_Cpp.maxConcurrentThreads#` 继承的值的一半。",
|
||||
"c_cpp.configuration.codeAnalysis.maxMemory.markdownDescription": "超过此内存使用量(以 MB 为单位)后,将并发运行更少的代码分析进程。默认值 `null` (空)使用从 `#C_Cpp.maxMemory#` 继承的值。",
|
||||
"c_cpp.configuration.codeAnalysis.updateDelay.markdownDescription": "控制在 `#files.autoSave#` 为 `afterDelay` 且 `#C_Cpp.codeAnalysis.runAutomatically#` 为 `true` 时从编辑触发保存后,代码分析开始处理之前的延迟(以毫秒为单位)。",
|
||||
"c_cpp.configuration.codeAnalysis.exclude.markdownDescription": "配置 glob 模式已排除用于代码分析的文件夹和文件。始终排除不在工作区文件夹下的文件。从 `#files.exclude#` 和 `#C_Cpp.files.exclude#` 继承值。详细了解 glob 模式 [此处](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)。",
|
||||
"c_cpp.configuration.codeAnalysis.exclude.markdownDescription": "配置 glob 模式以排除用于代码分析的文件夹和文件。始终排除不在工作区文件夹下的文件。从 `#files.exclude#` 和 `#C_Cpp.files.exclude#` 继承值。详细了解 glob 模式 [此处](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)。",
|
||||
"c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "要与文件路径匹配的 glob 模式。设置为 `true` 或 `false` 以启用或禁用模式。",
|
||||
"c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "对匹配文件同辈进行其他检查。将 `$(basename)` 用作匹配文件名变量。",
|
||||
"c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "如果为 `true`,则代码分析将在文件打开或保存后自动在文件上运行。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果为`true`,`禁用'代码操作将在可用时显示(下次运行代码分析时)。使用`禁用'代码操作时,它会将警告代码添加到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled`设置。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果为`true`,“显示文档”代码操作将在可用时显示(下次运行代码分析时)。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果为`true`,'禁用'代码操作将在可用时显示(下次运行代码分析时)。使用'禁用'代码操作时,它会将警告代码添加到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled`设置。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果为 `true`,“显示文档”代码操作将在可用时显示(下次运行代码分析时)。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "控制哪些“清除”代码分析问题代码操作选项可用。更改设置以显示更多选项可能需要重新运行代码分析。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "不显示“清除”代码操作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "仅显示“全部清除”代码操作(如果只有一种类型,则显示“清除所有<type>”,如果只有一个问题,则显示“清除此项”)。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "如果存在多个问题类型,显示“全部清除”代码操作和“清除所有 <type>”代码操作(或如果<type>只有一个问题,显示“清除此项”)",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "如果有多个问题类型,显示“全部清除”,如果有多个 <type> 问题,显示“清除所有 <type>”以及显示“清除此项”代码操作",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "如果为 `true`,则在 '修复' 代码操作更改的行上运行格式设置。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "如果为 `true`,则在 `#C_Cpp.codeAnalysis.runAutomatically#` 为 `true` (默认值)时,将启用并自动运行使用 `clang-tidy` 的代码分析。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` 可执行文件的完整路径。如果未指定,并且 `clang-tidy` 在环境路径中可用,则使用该路径。如果在环境路径中找不到,则将使用与扩展捆绑的 `clang-tidy`。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "指定 YAML/JSON 格式的 `clang-tidy` 配置: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{键: x, 值: y}]}`。当值为空时,`clang-tidy` 将尝试为其父目录中的每个源文件查找名为 `.clang-tidy` 的文件。",
|
||||
@@ -155,7 +165,7 @@
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": "任何在一行中输入左大括号和右大括号的代码都会保留在一行上,不考虑任何 `C_Cpp.vcFormat.newLine.*` 设置的值。",
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "代码块始终基于 `C_Cpp.vcFormat.newLine.*` 设置的值进行格式化。",
|
||||
"c_cpp.configuration.clang_format_path.markdownDescription": "`clang-format` 可执行文件的完整路径。如果未指定,则 `clang-format` 在使用的环境路径中可用。如果在环境路径中找不到,则将使用与扩展捆绑的 `clang-format`。",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "编码样式目前支持: `Visual Studio`、`LLVM`、 `Google`、`Chromium`、`Mozilla`、`WebKit`、 `Microsoft`、`GNU`。使用 `file` 从当前目录或父目录中的 `.clang-format` 文件加载样式。使用 `{键: 值, ...}` 以设置特定参数。例如,`Visual Studio` 样式类似于: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "编码样式目前支持: `Visual Studio`、`LLVM`、 `Google`、`Chromium`、`Mozilla`、`WebKit`、 `Microsoft`、`GNU`。使用 `file` 从当前目录或父目录中的 `.clang-format` 文件加载样式,或使用 `file:<路径>/.clang-format` 引用特定路径。使用 `{键: 值, ...}` 设置特定参数。例如,`Visual Studio` 样式类似于: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "用作回退的预定义样式的名称,以防使用样式 `file` 调用 `clang-format` 但找不到 `.clang-format` 文件。可能的值为 `Visual Studio`、`LLVM`、 `Google`、`Chromium`、`Mozilla`、`WebKit`、 `Microsoft`、`GNU`、`none`,或使用 `{键: 值, ...}` 以设置特定参数。例如,`Visual Studio` 样式类似于: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_sortIncludes.markdownDescription": "如果设置,则替换由 `SortIncludes` 参数确定的包含排序行为。",
|
||||
"c_cpp.configuration.intelliSenseEngine.description": "控制 IntelliSense 提供程序。",
|
||||
@@ -163,7 +173,7 @@
|
||||
"c_cpp.configuration.intelliSenseEngine.tagParser.description": "提供非上下文感知的“模糊”结果。",
|
||||
"c_cpp.configuration.intelliSenseEngine.disabled.description": "关闭 C/C++ 语言服务功能。",
|
||||
"c_cpp.configuration.intelliSenseEngineFallback.markdownDescription": "控制 IntelliSense 引擎是否将自动切换为包含 `#include` 错误的翻译单元的标记分析器。",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "控制自动完成提供程序。如果“已禁用”,且你想要基于字词的补全,则还需要设置 `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}`(对 `c` 和 `cuda-cpp` 语言同样执行此操作)。",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "控制自动完成提供程序。如果 `disabled`,且你想要基于字词的补全,则还需要设置 `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}`(对 `c` 和 `cuda-cpp` 语言同样执行此操作)。",
|
||||
"c_cpp.configuration.autocomplete.default.description": "使用活动的 IntelliSense 引擎。",
|
||||
"c_cpp.configuration.autocomplete.disabled.description": "使用 Visual Studio Code 提供的基于字词的补全。",
|
||||
"c_cpp.configuration.errorSquiggles.description": "控制是否将 IntelliSense 引擎检测到的可疑编译错误报告回编辑器。还控制是否报告代码分析警告(如果找不到包含)。标记分析器引擎将忽略此设置。",
|
||||
@@ -171,6 +181,13 @@
|
||||
"c_cpp.configuration.inactiveRegionOpacity.markdownDescription": "控制非活动预处理器块的不透明度。在 `0.1` 和 `1.0` 之间进行缩放。仅当启用非活动区域暗化时,此设置才适用。",
|
||||
"c_cpp.configuration.inactiveRegionForegroundColor.description": "控制非活动预处理程序块的字体颜色。输入的格式为十六进制颜色代码或有效的主题颜色。如果未设置,则默认为编辑器的语法颜色方案。此设置仅在启用非活动区域变暗时适用。",
|
||||
"c_cpp.configuration.inactiveRegionBackgroundColor.description": "控制非活动预处理程序块的背景颜色。输入的格式为十六进制颜色代码或有效的主题颜色。如果未设置,则默认为透明。此设置仅在启用了非活动区域变暗时适用。",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.enabled.markdownDescription": "在声明中使用 `auto` 时显示推导类型的内嵌提示:\n```cpp \n\n auto index /* : int */ = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "在标识符左侧声明中使用 `auto` 时显示推导类型的内嵌提示:\n```cpp \n\n auto /* int */ index = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "显示参数名称的内嵌提示:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "在参数名称提示中隐藏开头的 `_`。",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "当参数文本或内联注释包含参数名称时,抑制参数名称提示:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "显示非常量引用传递的参数的内嵌提示引用运算符 `&`:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "控制在 `&` 后是否显示非常量引用传递的参数的空格:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```",
|
||||
"c_cpp.configuration.loggingLevel.markdownDescription": "输出面板中日志记录的详细程度。从最不详细到最详细的级别顺序为: `None` < `Error` < `Warning` < `Information` < `Debug`。",
|
||||
"c_cpp.configuration.autoAddFileAssociations.markdownDescription": "控制当文件为 C/C++ 文件中导航操作的目标时,其是否自动添加到 `#files.associations#`。",
|
||||
"c_cpp.configuration.workspaceParsingPriority.markdownDescription": "控制分析非活动工作区文件是否使用睡眠以避免使用 100% CPU。值 `highest`/`high`/`medium`/`low` 对应于约 100/75/50/25% 的 CPU 使用率。",
|
||||
@@ -180,6 +197,9 @@
|
||||
"c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "将针对每个遇到的文件和文件夹评估排除筛选器。",
|
||||
"c_cpp.configuration.preferredPathSeparator.markdownDescription": "用作 `#include` 自动完成结果的路径分隔符的字符。",
|
||||
"c_cpp.configuration.simplifyStructuredComments.markdownDescription": "如果为 `true`,则悬停和自动完成的工具提示将仅显示结构化注释的某些标签。否则,将显示所有注释。",
|
||||
"c_cpp.configuration.doxygen.generateOnType.description": "控制在键入所选注释样式后是否自动插入 Doxygen 注释。",
|
||||
"c_cpp.configuration.doxygen.generatedStyle.description": "用作 Doxygen 注释起始行的字符串。",
|
||||
"c_cpp.configuration.doxygen.sectionTags.description": "启用 `简化结构化注释` 设置后,选择希望在工具提示区域中悬停时显示的 Doxygen 节标记。 ",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "开始多行或单行注释块的模式。多行注释块的延续模式默认为 ` * `,或单行注释块默认为此字符串。",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "开启一个多行或单行注释块的模式。",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "在多行或单行注释块内按下 Enter 键时要插入到下一行的文本。",
|
||||
@@ -213,19 +233,22 @@
|
||||
"c_cpp.configuration.default.dotConfig.markdownDescription": "未指定 `dotConfig` 时要在配置中使用的值,或 `dotConfig` 中存在 `${default}` 时要插入的值。",
|
||||
"c_cpp.configuration.experimentalFeatures.description": "控制“实验性”功能是否可用。",
|
||||
"c_cpp.configuration.suggestSnippets.markdownDescription": "如果为 `true`,则由语言服务器提供片段。",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "如果启用,则根据 IntelliSense 对代码进行着色。仅当 `#C_Cpp.intelliSenseEngine#` 设置为 `Default` 时,此设置才适用。",
|
||||
"c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": "如果设置为 `default`,则假定工作区的文件系统在 Windows 上不区分大小写,在 macOS 或 Linux 上区分大小写。如果设置为 `enabled`,则假定工作区的文件系统在 Windows 上区分大小写。",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "如果启用,则根据 IntelliSense 对代码进行着色。仅当 `#C_Cpp.intelliSenseEngine#` 设置为 `default` 时,此设置才适用。",
|
||||
"c_cpp.configuration.codeFolding.description": "如果启用,则由语言服务器提供代码折叠范围。",
|
||||
"c_cpp.configuration.vcpkg.enabled.markdownDescription": "为 [vcpkg 依存关系管理器](https://aka.ms/vcpkg/) 启用集成服务。",
|
||||
"c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "当来自 `nan` 和 `node-addon-api` 的包含路径为依赖项时,请将其添加。",
|
||||
"c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "如果为 `true`,则“重命名符号”将需要有效的 C/C++ 标识符。",
|
||||
"c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "如果为 `true`,则自动完成将在函数调用后自动添加 `(` ,在这种情况下,也可以添加 `(` ,具体取决于 `#editor.autoClosingBrackets#` 设置的值。",
|
||||
"c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "如果为 `true`,则自动完成将在函数调用后自动添加 `(` ,在这种情况下,也可以添加 `)` ,具体取决于 `#editor.autoClosingBrackets#` 设置的值。",
|
||||
"c_cpp.configuration.filesExclude.markdownDescription": "为排除文件夹(以及文件 - 如果更改了 `#C_Cpp.exclusionPolicy#`)配置 glob 模式。这些特定于 C/C++ 扩展,并且是 `#files.exclude#` 的补充,但与 `#files.exclude#` 不同,它们也适用于当前工作区文件夹之外的路径,并且不会从资源管理器视图中删除。[此处](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)。",
|
||||
"c_cpp.configuration.filesExcludeBoolean.markdownDescription": "要与文件路径匹配的 glob 模式。设置为 `true` 或 `false` 以启用或禁用模式。",
|
||||
"c_cpp.configuration.filesExcludeWhen.markdownDescription": "对匹配文件同辈进行其他检查。将 `$(basename)` 用作匹配文件名变量。",
|
||||
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "如果为 `true`,则调试程序 shell 命令替换将使用过时的反引号 ``(`)``。",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "启用 v1.10.0 以前的行为,以了解在编译器参数设置中如何处理 shell 转义。从 v1.10.0 开始,参数数组在默认情况下不再需要或支持 shell 转义。",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "此设置是临时的,用于支持转换为 v1.10.0 中更正后的行为。",
|
||||
"c_cpp.configuration.sshTargetsView.description": "控制 SSH 目标视图是否可见。默认情况下,在调用 SSH 命令时启用视图。",
|
||||
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: 其他引用结果",
|
||||
"c_cpp.contributes.views.sshTargetsView.title": "Cpptools: SSH 目标",
|
||||
"c_cpp.contributes.viewsWelcome.contents": "要了解有关 launch.json 的信息,请参阅 [配置 C/C++ 调试](https://code.visualstudio.com/docs/cpp/launch-json-reference)。",
|
||||
"c_cpp.configuration.debugShortcut.description": "显示 C++ 文件编辑器标题栏中的“运行和调试”播放按钮和“添加调试配置”齿轮。",
|
||||
"c_cpp.debuggers.pipeTransport.description": "如果存在,这会指示调试程序使用其他可执行文件作为管道来连接到远程计算机,此管道将在 VS Code 和已启用 MI 的调试程序后端可执行文件(如 gdb)之间中继标准输入/输入。",
|
||||
@@ -270,6 +293,7 @@
|
||||
"c_cpp.debuggers.miDebuggerPath.description": "MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序。",
|
||||
"c_cpp.debuggers.miDebuggerArgs.description": "MI 调试程序(如 gdb)的其他参数。",
|
||||
"c_cpp.debuggers.miDebuggerServerAddress.description": "要连接到的 MI 调试程序服务器的网络地址(示例: localhost:1234)。",
|
||||
"c_cpp.debuggers.useExtendedRemote.description": "使用目标扩展远程模式连接到 MI 调试器服务器。",
|
||||
"c_cpp.debuggers.stopAtEntry.description": "可选参数。如果为 true,则调试程序应在目标的入口点处停止。如果传递了 processId,则不起任何作用。",
|
||||
"c_cpp.debuggers.debugServerPath.description": "到要启动的调试服务器的可选完整路径。默认值为 null。该路径与 “miDebugServerAddress” 或带有运行 “-target-select remote <server:port>” 的 “customSetupCommand” 的自有服务器配合使用。",
|
||||
"c_cpp.debuggers.debugServerArgs.description": "可选调试服务器参数。默认为 null。",
|
||||
@@ -299,6 +323,37 @@
|
||||
"c_cpp.debuggers.hardwareBreakpoints.description": "对远程目标的硬件断点行为的显式控制。",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.require.description": "如果为 true,请始终使用硬件断点。默认值为 false。",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "要使用的可用硬件断点数量的可选限制。仅在“需要”为 true 且“限制”大于 0 时强制使用。默认值为 0。",
|
||||
"c_cpp.debuggers.variables.description": "此启动配置中递归替换的变量。每个变量都可以引用其他变量。",
|
||||
"c_cpp.debuggers.variables.properties.description": "此启动配置中递归替换的变量。该值可以引用其他变量。",
|
||||
"c_cpp.debuggers.host.description": "主机信息。",
|
||||
"c_cpp.debuggers.host.user.description": "登录到主机的用户。",
|
||||
"c_cpp.debuggers.host.hostName.description": "主机名。",
|
||||
"c_cpp.debuggers.host.port.description": "主机上的 SSH 端口。默认值为 22。",
|
||||
"c_cpp.debuggers.host.jumpHost.description": "首先连接到跳转主机以连接到目标主机。",
|
||||
"c_cpp.debuggers.host.localForward.description": "将本地(客户端)主机上给定 TCP 端口或 Unix 套接字的连接转发到远程端上的给定主机和端口或 Unix 套接字",
|
||||
"c_cpp.debuggers.host.localForward.bindAddress.description": "本地地址",
|
||||
"c_cpp.debuggers.host.localForward.port.description": "本地端口",
|
||||
"c_cpp.debuggers.host.localForward.host.description": "主机名",
|
||||
"c_cpp.debuggers.host.localForward.hostPort.description": "主机端口",
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "本地套接字",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "远程套接字",
|
||||
"c_cpp.debuggers.deploySteps.description": "部署应用程序所需的步骤。顺序很重要。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.description": "使用 SCP 或 rsync 复制文件。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.files.description": "要复制的文件。支持路径模式。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "目标目录。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.recursive.description": "如果为 true,则以递归方式复制文件夹。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "SCP 的可选完整路径。假定 SCP 位于 PATH 上(如果未指定)",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "rsync 的可选完整路径。假定 rsync 在 PATH 上(如果未指定)",
|
||||
"c_cpp.debuggers.deploySteps.debug": "如果为 true,则在不调试的情况下启动时跳过。如果为 false,则在开始调试时跳过。如果未定义,则从不跳过。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.description": "SSH 命令步骤。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.command.description": "要通过 SSH 执行的命令。SSH 命令中 \"-c\" 后面的命令。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.sshPath.description": "SSH 的可选完整路径。假定 SSH 位于 PATH 上(如果未指定)",
|
||||
"c_cpp.debuggers.deploySteps.continueOn.description": "输出中的可选完成模式。在输出中看到此模式时,无论此步骤是否返回,都继续执行部署过程。",
|
||||
"c_cpp.debuggers.deploySteps.shell.description": "shell 命令步骤。",
|
||||
"c_cpp.debuggers.deploySteps.shell.command.description": "要执行的 shell 命令。",
|
||||
"c_cpp.debuggers.vsCodeCommand.description": "要调用的 VS Code 命令。可以是 VS Code 或活动扩展中的命令。",
|
||||
"c_cpp.debuggers.vsCodeCommand.command.description": "要调用的 VS Code 命令。",
|
||||
"c_cpp.debuggers.vsCodeCommand.args.description": "VS Code 命令的参数。",
|
||||
"c_cpp.taskDefinitions.name.description": "任务名称。",
|
||||
"c_cpp.taskDefinitions.command.description": "执行编译的编译器或脚本的路径。",
|
||||
"c_cpp.taskDefinitions.args.description": "其他要传递给编译器或编译脚本的参数。",
|
||||
@@ -309,6 +364,7 @@
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "编辑器将使用的源树的路径。",
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "如果此条目仅用于堆栈帧位置映射,则为 False。如果在指定断点位置时也需要使用此条目,则为 True。",
|
||||
"c_cpp.debuggers.symbolOptions.description": "用于控制如何找到和加载符号(.pdb 文件)的选项。",
|
||||
"c_cpp.debuggers.unknownBreakpointHandling.description": "控制在命中时如何处理(通常通过原始 GDB 命令)外部设置的断点。\n允许的值为 \"throw\" (好像应用程序抛出了异常)和 \"stop\" (只会暂停调试会话)。默认值为 \"throw\"。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.description": "提供用于找到符号并将其加载到调试适配器的配置。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "在其中搜索 .pdb 文件的符号服务器 URL (例如 http://MyExampleSymbolServer)或目录(例如 /build/symbols)的数组。除了默认位置,还将搜索这些目录 - 在模块以及 pdb 最初放置到的路径的旁边。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchMicrosoftSymbolServer.description": "如果为 \"true\",则 Microsoft 符号服务器(https://msdl.microsoft.com/download/symbols)会添加到符号搜索路径。如果未指定,此选项会默认为 \"false\"。",
|
||||
|
||||
@@ -4,9 +4,12 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.pipetransport": "所选的调试配置不包含 {0}",
|
||||
"debugger.path.and.server.address.required": "调试配置中的 {0} 需要 {1} 和 {2}",
|
||||
"no.pipetransport.useextendedremote": "所选的调试配置不包含 {0} 或 {1}",
|
||||
"select.process.attach": "选择要附加到的进程",
|
||||
"process.not.selected": "未选择进程。",
|
||||
"pipe.failed": "管道传输未能获取 OS 和进程。",
|
||||
"no.process.list": "传输附加无法获取进程列表。"
|
||||
"no.process.list": "传输附加无法获取进程列表。",
|
||||
"failed.to.make.gdb.connection": "无法建立 GDB 连接:“{0}”。",
|
||||
"failed.to.parse.processes": "无法分析进程:“{0}”。"
|
||||
}
|
||||
@@ -11,7 +11,11 @@
|
||||
"lldb.framework.install.xcode": "详细信息",
|
||||
"lldb.framework.not.found": "找不到用于 lldb-mi 的 \"LLDB.framework\"。请安装 XCode 或 XCode 命令行工具。",
|
||||
"debugger.launchConfig": "启动配置:",
|
||||
"vs.code.1.69+.required": "\"deploySteps\" 需要 VS Code 1.69+。",
|
||||
"running.deploy.steps": "正在运行部署步骤...",
|
||||
"compiler.path.not.exists": "找不到 {0}。将忽略 {1} 任务。",
|
||||
"pre.Launch.Task": "preLaunchTask: {0}",
|
||||
"debugger.path.not.exists": "找不到 {0} 调试器。将忽略 {1} 的调试配置。",
|
||||
"build.and.debug.active.file": "生成和调试活动文件",
|
||||
"cl.exe.not.available": "仅当从 VS 开发人员命令提示符处运行 VS Code 时,{0} 生成和调试才可用。",
|
||||
"lldb.find.failed": "缺少 lldb-mi 可执行文件的依赖项“{0}”。",
|
||||
@@ -29,6 +33,12 @@
|
||||
"cannot.build.non.cpp": "无法生成和调试,因为活动文件不是 C 或 C++ 源文件。",
|
||||
"no.compiler.found": "未找到编译程序",
|
||||
"select.debug.configuration": "选择调试配置",
|
||||
"command.args.must.be.array": "命令部署步骤中的 \"args\" 必须为数组。",
|
||||
"missing.properties.copyFile": "{0} 步骤中需要 \"host\"、\"files\" 和 \"targetDir\"。",
|
||||
"incorrect.files.type.copyFile": "“files” 必须为 {0} 步骤中的字符串或字符串数组。",
|
||||
"missing.properties.ssh": "SSH 步骤需要 \"host\" 和 \"command\"。",
|
||||
"missing.properties.shell": "shell 步骤需要 \"command\"。",
|
||||
"deploy.step.type.not.supported": "不支持部署步骤类型 {0}。",
|
||||
"unexpected.os": "意外的 OS 类型",
|
||||
"path.to.pipe.program": "管道程序的完整路径,如 {0}",
|
||||
"enable.pretty.printing": "为 {0} 启用整齐打印",
|
||||
|
||||
@@ -4,5 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"add.debug.configuration.not.available.for.single.file": "添加调试配置不适用于单个文件。"
|
||||
"add.debug.configuration.not.available.for.single.file": "添加调试配置不适用于单个文件。",
|
||||
"cannot.modify.config.file": "由于分析失败“{0}”,无法修改 SSH 配置文件。",
|
||||
"no.valid.ssh.config.file": "找不到有效的 SSH 配置文件。",
|
||||
"enter.ssh.target.name": "输入 SSH 目标名称",
|
||||
"ssh.target.name.place.holder": "示例: `mySSHTarget`",
|
||||
"enter.ssh.connection.command": "输入 SSH 连接命令",
|
||||
"ssh.connection.command.place.holder": "示例: `ssh [email protected] -A`",
|
||||
"select.ssh.config.file": "选择 SSH 配置文件",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"ssh.target.delete.confirmation": "是否确实要永久删除“{0}”?"
|
||||
}
|
||||
@@ -4,16 +4,6 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "修复所有代码分析问题",
|
||||
"clear_all_code_analysis_problems": "清除所有代码分析问题",
|
||||
"c.cpp.debug.protocol": "C/C++ 调试协议",
|
||||
"c.cpp.warnings": "C/C++ 配置警告",
|
||||
"fix_all_type_problems": "修复所有 {0} 问题",
|
||||
"disable_all_type_problems": "禁用所有 {0} 问题",
|
||||
"clear_all_type_problems": "清除所有{0}问题",
|
||||
"clear_this_problem": "清除此 {0} 问题",
|
||||
"fix_this_problem": "修复此 {0} 问题",
|
||||
"show_documentation_for": "显示 {0} 文档",
|
||||
"unable.to.start": "无法启动 C/C++ 语言服务器。IntelliSense 功能将被禁用。错误: {0}",
|
||||
"check.permissions": "EPERM: 检查“{0}”的权限",
|
||||
"server.crashed2": "在过去 3 分钟内,语言服务器崩溃了 5 次。它不会重新启动。",
|
||||
@@ -23,7 +13,6 @@
|
||||
"allow.button": "允许",
|
||||
"dont.allow.button": "不允许",
|
||||
"ask.me.later.button": "稍后询问我",
|
||||
"c.cpp.diagnostics": "C/C++ 诊断",
|
||||
"dismiss.button": "消除",
|
||||
"diable.warnings.button": "禁用警告",
|
||||
"unable.to.provide.configuration": "{0} 无法为“{1}”提供 IntelliSense 配置信息。将改为使用“{2}”配置中的设置。",
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "修复所有代码分析问题",
|
||||
"clear_all_code_analysis_problems": "清除所有代码分析问题",
|
||||
"fix_all_type_problems": "修复所有 {0} 问题",
|
||||
"disable_all_type_problems": "禁用所有 {0} 问题",
|
||||
"clear_all_type_problems": "清除所有{0}问题",
|
||||
"clear_this_problem": "清除此 {0} 问题",
|
||||
"fix_this_problem": "修复此 {0} 问题",
|
||||
"show_documentation_for": "显示 {0} 文档"
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "了解如何使用 vcpkg 为此标头安装库",
|
||||
"copy.vcpkg.command": "将用于安装“{0}”的 vcpkg 命令复制到剪贴板",
|
||||
"on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `disabled` 时,无法执行与 IntelliSense 相关的命令。",
|
||||
"client.not.found": "未找到客户端",
|
||||
"configuration.select.first": "首先打开一个文件夹以选择配置",
|
||||
"configuration.provider.select.first": "首先打开一个文件夹以选择配置提供程序",
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.symbolscope.separator": "{0},{1}"
|
||||
}
|
||||
@@ -4,5 +4,5 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"editorconfig.default.behavior": "代码格式设置使用 .editorconfig 中的设置,而不是 .clang-format 中的设置。有关详细信息,请参阅文档了解“C_Cpp.formatting”设置的“Default”值。"
|
||||
"editorconfig.default.behavior": "代码格式设置使用 .editorconfig 中的设置,而不是 .clang-format 中的设置。有关详细信息,请参阅文档以了解 'C_Cpp.formatting' 设置的 'default' 值。"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.ssh.targets": "无 SSH 目标",
|
||||
"active.ssh.target.selection.cancelled": "已取消活动 SSH 目标选择。",
|
||||
"add.new.ssh.target": "{0} 添加新的 SSH 目标...",
|
||||
"select.ssh.target": "选择 SSH 目标"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"ssh.target.active.description": "[活动]"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"failed.to.connect": "未能连接到 {0}"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"local.forward.local.conflict": "在 localForwards 中,不能同时使用 \"bindAddress\" 或 \"port\" 指定 \"localSocket\"",
|
||||
"local.forward.local.missing": "localForwards 中需要 \"port\" 或 \"localSocket\"",
|
||||
"local.forward.remote.conflict": "在 localForwards 中,不能同时使用 \"host\" 或 \"hostPort\" 指定 \"remoteSocket\"",
|
||||
"local.forward.remote.missing": "localForwards 中需要 \"host\" 和 \"hostPort\" 或 \"remoteSocket\""
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"ssh.canceled": "已取消 SSH 命令",
|
||||
"ssh.passphrase.input.box": "输入 ssh 密钥的密码{0}",
|
||||
"ssh.enter.password.for.user": "输入用户 \"{0}\" 的密码",
|
||||
"ssh_message_enterPassword": "输入密码",
|
||||
"ssh.continue.confirmation.placeholder": "您确定要继续吗?",
|
||||
"ssh.host.key.confirmation.title": "\"{0}\" 具有指纹 \"{1}\"。",
|
||||
"continue": "继续",
|
||||
"cancel": "取消",
|
||||
"ssh.terminal.command.canceled": "已取消 \"{0}\" 终端命令。",
|
||||
"ssh.terminal.command.done": "已完成 \"{0}\" 终端命令。",
|
||||
"ssh.continuing.command.canceled": "已取消任务 \"{0}\",但基础命令可能不会终止。请手动进行检查。",
|
||||
"ssh.process.failed": "\"{0}\" 进程失败: {1}",
|
||||
"ssh.wrote.data.to.terminal": "\"{0}\" 已将数据写入终端: \"{1}\"。"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"failed.to.parse.SSH.config": "无法分析 SSH 配置文件 {0}: {1}",
|
||||
"failed.to.read.file": "未能读取文件 {0}。",
|
||||
"failed.to.write.file": "无法写入文件 {0}。"
|
||||
}
|
||||
@@ -7,11 +7,11 @@
|
||||
"failed.to.parse.json": "未能分析 json 文件,可能是因注释或尾部逗号所致。",
|
||||
"extension.not.ready": "C/C++ 扩展仍在安装。请查看输出窗口获取详细信息。",
|
||||
"refer.read.me": "请参阅 {0} 了解疑难解答信息。可在 {1} 处创建问题",
|
||||
"process.exited.with.code": "{0} 已退出,收到错误代码 {1}",
|
||||
"process.exited": "已退出进程,代码为 {0}",
|
||||
"process.succeeded": "已成功执行进程。",
|
||||
"killing.process": "正在终止进程 {0}",
|
||||
"warning.file.missing": "警告: 缺少预期的文件 {0}。",
|
||||
"warning.debugging.not.tested": "警告: 尚未为此平台测试调试。",
|
||||
"reload.workspace.for.changes": "重新加载工作区以使设置更改生效。",
|
||||
"reload.string": "重新加载",
|
||||
"invalid.download.location.received": "接收的下载位置无效",
|
||||
"c.cpp.symbolscope.separator": "{0},{1}"
|
||||
"reload.string": "重新加载"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"max.recursion.reached": "已达到最大字符串扩展递归。可能存在循环引用。",
|
||||
"invalid.var.reference": "字符串: {1} 中的变量引用 {0} 无效。",
|
||||
"env.var.not.found": "找不到环境变量 {0}",
|
||||
"commands.not.supported": "字符串: {0} 不支持命令。",
|
||||
"exception.executing.command": "执行字符串: {1} {2} 的命令 {0} 时出现异常。"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 诊断",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ 调试协议",
|
||||
"c.cpp.warnings": "C/C++ 配置警告"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"macos.version.deprecated": "C/C++ 扩展的版本比 {0} 更新的版本至少需要 macOS 版本 {1}。",
|
||||
"intellisense.disabled": "已禁用 intelliSenseEngine",
|
||||
"more.info.button": "详细信息",
|
||||
"ignore.button": "忽略",
|
||||
"vsix.platform.incompatible": "已安装的 C/C++ 扩展与系统不匹配。",
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
"default_query_failed": "未能查询 {0} 的默认包含路径和定义。",
|
||||
"failed_call": "未能调用 {0}",
|
||||
"quick_info_failed": "快速信息操作失败: {0}",
|
||||
"create_intellisense_client_failed": "未能创建 IntelliSense 客户端。{0}",
|
||||
"intellisense_spawn_failed": "未能生成 IntelliSense 进程:",
|
||||
"create_intellisense_client_failed": "未能创建 IntelliSense 客户端: {0}",
|
||||
"intellisense_spawn_failed": "未能生成 IntelliSense 进程: {0}",
|
||||
"browse_engine_update_thread_join_failed": "调用 browse_engine_update_thread.join() 时出错: {0}",
|
||||
"already_open_different_casing": "此文件({0})已在编辑器中打开,但大小写不同。将对此文件的副本禁用 IntelliSense 功能。",
|
||||
"intellisense_client_disconnected": "IntelliSense 客户端已与服务器断开连接 - {0}",
|
||||
@@ -168,12 +168,32 @@
|
||||
"specialization": "还有 1 个专业化",
|
||||
"specializations": "还有 %d 个专业化",
|
||||
"expands_to": "扩展到:",
|
||||
"file_label": "文件:",
|
||||
"parameters_label": "参数:",
|
||||
"returns_label": "返回:",
|
||||
"attention_label": "注意:",
|
||||
"author_label": "作者:",
|
||||
"authors_label": "作者:",
|
||||
"bug_label": "Bug:",
|
||||
"copyright_label": "版权所有:",
|
||||
"deprecated_label": "已弃用:",
|
||||
"date_label": "日期:",
|
||||
"details_label": "详细信息:",
|
||||
"exceptions_label": "异常:",
|
||||
"invariant_label": "不变量:",
|
||||
"file_label": "文件:",
|
||||
"note_label": "备注:",
|
||||
"parameters_label": "参数:",
|
||||
"pre_label": "前置条件:",
|
||||
"post_label": "后置条件:",
|
||||
"remark_label": "注解:",
|
||||
"remarks_label": "注解:",
|
||||
"result_label": "结果:",
|
||||
"return_label": "返回:",
|
||||
"returns_label": "返回:",
|
||||
"since_label": "开始日期:",
|
||||
"template_parameters_label": "模板参数:",
|
||||
"test_label": "测试:",
|
||||
"todo_label": "TODO:",
|
||||
"version_label": "版本:",
|
||||
"warning_label": "警告:",
|
||||
"compiler_query_command_line": "编译器查询命令行: {0}",
|
||||
"c_compiler_from_compiler_path": "正在尝试从 \"compilerPath\" 属性中的 C 编译器获取默认值:“{0}”",
|
||||
"cpp_compiler_from_compiler_path": "正在尝试从 \"compilerPath\" 属性中的 C++ 编译器获取默认值:“{0}”",
|
||||
@@ -221,5 +241,6 @@
|
||||
"folder_tag": "文件夹",
|
||||
"file_tag": "文件",
|
||||
"compiler_default_language_standard_version_old": "编译器返回默认语言标准版本:{0}。由于此版本是旧版本,因此将尝试使用较新版本 {1} 作为默认版本。",
|
||||
"unexpected_output_from_clang_tidy": "来自 clang-tidy 的意外输出:{0}。应为:{1}。"
|
||||
"unexpected_output_from_clang_tidy": "来自 clang-tidy 的意外输出:{0}。应为:{1}。",
|
||||
"generate_doxygen_comment": "生成 Doxygen 注释"
|
||||
}
|
||||
+10
-10
@@ -4,15 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"walkthrough.mac.title.run.and.debug.your.file": "在 Windows 上运行并调试 C++ 文件",
|
||||
"walkthrough.mac.run.and.debug.your.file": "要在 VS Code 中运行并调试 C++ 文件:",
|
||||
"walkthrough.mac.instructions1": "打开要运行和调试的 C++ 源文件。请确保此文件在编辑器中处于活动状态(当前已显示并选择)。",
|
||||
"walkthrough.mac.press.f5": "按 {0},或从主菜单中选择 {1}。",
|
||||
"walkthrough.mac.run": "运行",
|
||||
"walkthrough.mac.start.debugging": "开始调试",
|
||||
"walkthrough.mac.select.compiler": "选择 {0}。",
|
||||
"walkthrough.mac.choose.build.active.file": "选择 {0}。",
|
||||
"walkthrough.windows.title.run.and.debug.your.file": "在 Windows 上运行并调试 C++ 文件",
|
||||
"walkthrough.windows.run.and.debug.your.file": "要在 VS Code 中运行并调试 C++ 文件:",
|
||||
"walkthrough.windows.instructions1": "打开要运行和调试的 C++ 源文件。请确保此文件在编辑器中处于活动状态(当前已显示并选择)。",
|
||||
"walkthrough.windows.press.f5": "按 {0},或从主菜单中选择 {1}。",
|
||||
"walkthrough.windows.run": "运行",
|
||||
"walkthrough.windows.start.debugging": "开始调试",
|
||||
"walkthrough.windows.select.compiler": "选择 {0}。",
|
||||
"walkthrough.windows.choose.build.active.file": "选择 {0}。",
|
||||
"walkthrough.windows.build.and.debug.active.file": "生成和调试活动文件",
|
||||
"walkthrough.mac.after.running": "首次运行和调试 C++ 文件后,你将注意到项目 {0} 的文件夹内有两个新文件: {1} 和 {2}。",
|
||||
"walkthrough.mac.for.more.complex": "对于更复杂的生成和调试场景,可以在 {0} 和 {1} 中自定义生成任务和调试配置。例如,如果在从命令行生成时通常会将参数传递给编译器,则可以使用 {3} 属性以在 {2} 中指定这些参数。同样,可以定义要传递给程序的参数,以在 {4}中进行调试。"
|
||||
"walkthrough.windows.after.running": "首次运行和调试 C++ 文件后,你将注意到项目 {0} 的文件夹内有两个新文件: {1} 和 {2}。",
|
||||
"walkthrough.windows.for.more.complex": "对于更复杂的生成和调试场景,可以在 {0} 和 {1} 中自定义生成任务和调试配置。例如,如果在从命令行生成时通常会将参数传递给编译器,则可以使用 {3} 属性以在 {2} 中指定这些参数。同样,可以定义要传递给程序的参数,以在 {4}中进行调试。"
|
||||
}
|
||||
@@ -33,6 +33,15 @@
|
||||
"c_cpp.command.BuildAndDebugFile.title": "偵錯 C/C++ 檔案",
|
||||
"c_cpp.command.BuildAndRunFile.title": "執行 C/C++ 檔案",
|
||||
"c_cpp.command.AddDebugConfiguration.title": "新增偵錯設定",
|
||||
"c_cpp.command.GenerateDoxygenComment.title": "產生 Doxygen 註解",
|
||||
"c_cpp.command.addSshTarget.title": "新增 SSH 目標",
|
||||
"c_cpp.command.removeSshTarget.title": "移除 SSH 目標",
|
||||
"c_cpp.command.setActiveSshTarget.title": "將此 SSH 目標設定為使用中目標",
|
||||
"c_cpp.command.selectActiveSshTarget.title": "選取使用中的 SSH 目標",
|
||||
"c_cpp.command.selectSshTarget.title": "選取 SSH 目標",
|
||||
"c_cpp.command.activeSshTarget.title": "取得使用中的 SSH 目標",
|
||||
"c_cpp.command.refreshCppSshTargetsView.title": "重新整理",
|
||||
"c_cpp.command.sshTerminal.title": "連線至這個在新終端機中的 SSH 目標",
|
||||
"c_cpp.configuration.maxConcurrentThreads.markdownDescription": "用於語言服務處理的並行執行緒數目上限。該值是提示,且可能不會一律使用。預設的 `null` (空白) 會使用可用的邏輯處理器數目。",
|
||||
"c_cpp.configuration.maxCachedProcesses.markdownDescription": "用於語言服務處理的快取處理序數目上限。預設的 `null` (空白) 使用的邏輯處理器數目是可用邏輯處理器的兩倍。",
|
||||
"c_cpp.configuration.maxMemory.markdownDescription": "記憶體上限 (MB) 可供語言服務處理。超過此記憶體使用量之後,同時快取及執行的處理序將會減少。預設的 `null` (空白) 會使用系統的可用記憶體。",
|
||||
@@ -48,20 +57,21 @@
|
||||
"c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "要符合檔案路徑的 Glob 模式。設為 `true` 或 `false` 可啟用或停用模式。",
|
||||
"c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "對相符檔案同層級進行額外檢查。請使用 `$(basename)` 作為相符檔案名稱的變數。",
|
||||
"c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "若為 `true`,則程式碼分析將會在檔案開啟或儲存之後,自動在該檔案上執行。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '禁用' 程式碼動作。使用 '禁用' 程式碼動作時,它會將警告碼新增到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '顯示 的文件' 程式碼動作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果為`true`,則在可用時 (下次執行程式碼分析時),將會顯示 '停用' 程式碼動作。使用 '停用' 程式碼動作時,它會將警告碼新增到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '顯示的文件' 程式碼動作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "控制可使用哪些 '清除' 程式碼分析問題程式碼動作選項。變更設定以顯示更多選項可能需要重新執行程式碼分析。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "不顯示 '清除' 程式碼動作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "如果只有一種類型,則只顯示 '清除所有' 程式碼動作 (如果只有一種類型,則顯示 '清除所有 <type>,或如果只有一個問題,則顯示 '清除此')。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "顯示 '清除所有' 程式碼動作 (如果有多種問題類型) 和 '清除所有 <type>' 程式碼動作 (如果 <type> 只有一個問題,則顯示 '清除此')",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "顯示 '清除所有' (如果有多個問題類型)、'清除所有 <type>' (如果 <type> 有多個問題) 和 '清除此' 程式碼動作",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "如果為 `true`,格式就會在由 '修正' 程式碼動作變更的行上執行。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "若為 `true`,則會啟用使用 `clang-tidy` 的程式碼分析,並在 `#C_Cpp.codeAnalysis.runAutomatically#` 為 `true` 時自動執行 (預設)。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` 可執行檔的完整路徑。若未指定可執行檔,且可在環境路徑中使用 `clang-tidy`,則會加以使用。若在環境路徑中找不到可執行檔,則會使用與延伸模組搭配的 `clang-tidy`。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "以 YAML/JSON 格式指定 `clang-tidy` 組態: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{索引鍵: x, 值: y}]}`。當值為空白時,`clang-tidy` 將會嘗試為其父目錄中的每個來源檔案尋找名為 `.clang-tidy` 的檔案。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "當 `#C_Cpp.codeAnalysis.clangTidy.config#` 未設定且找不到 `.clang-tidy` 檔案時,指定 YAML/JSON 格式的 `clang-tidy` 組態用作遞補: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{索引鍵: x, 值: y}]}`。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "符合輸出診斷來源之標頭名稱的 POSIX 擴充規則運算式 (ERE)。來自每個編譯單位之主要檔案的診斷將一律顯示。支援 `${workspaceFolder}` 變數 (如果沒有 `.clang-tidy` 檔案,則作為預設後援值)。若此選項並非 `null` (空白),則會覆寫 `.clang-tidy` 檔案中的 `HeaderFilterRegex` 選項 (如果有的話)。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "要傳遞給 `clang-tidy` 的其他命令列引數。這些命令列引數會比對等的 `C_Cpp.codeAnalysis.clangTidy.*` 設定優先考慮。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "如果設定了 `true` 和 'compileCommands',則 `-p=<build-path>` 引數會傳遞至 `clang-tidy`,而非在 `--` 之後傳遞組建引數。若未設定環境變數以找到系統包含的環境變數,可能無法運作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "如果設定了 `true` 和 `compileCommands`,則 `-p=<build-path>` 引數會傳遞至 `clang-tidy`,而非在 `--` 之後傳遞組建引數。若未設定環境變數以找到系統包含的環境變數,可能無法運作。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "已啟用的 `clang-tidy` 檢查清單。值會附加到 `.clang-tidy` 檔案中的 `Checks` 或 `#C_Cpp.codeAnalysis.clangTidy.config#` (如果有的話)。除非明確地停用,否則一律使用預設檢查 `clang-analyzer-*`。",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.checks.disabled.markdownDescription": "已停用的 `clang-tidy` 檢查清單。值會附加到 `.clang-tidy` 檔案中的 `Checks` 或 `#C_Cpp.codeAnalysis.clangTidy.config#` (如果有的話)。",
|
||||
"c_cpp.configuration.formatting.description": "選擇格式設定引擎。",
|
||||
@@ -155,7 +165,7 @@
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": "在一行中所輸入由左大括號和右大括號括住的任何程式碼,都保留在同一行,而不考慮任何 `C_Cpp.vcFormat.newLine.*` 設定。",
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "程式碼區塊一律根據 `C_Cpp.vcFormat.newLine.*` 設定的值來格式化。",
|
||||
"c_cpp.configuration.clang_format_path.markdownDescription": "此為 `clang-format` 可執行檔的完整路徑。如果未指定,且在環境路徑中可用 `clang-format`,即會使用該格式。如果在環境路徑中找不到,則會使用延伸模組所配備的 `clang-format`。",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "編碼樣式,目前支援: `Visual Studio`、`LLVM`、`Google`、`Chromium`、`Mozilla`、`WebKit`、`Microsoft`、`GNU`。使用 `file` 可從目前目錄或父目錄的 .clang-format 檔案載入樣式。使用 `{索引鍵: 值, ...}` 可設定特定參數。例如,`Visual Studio` 樣式類似於: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "編碼樣式,目前支援: `Visual Studio`、`LLVM`、`Google`、`Chromium`、`Mozilla`、`WebKit`、`Microsoft`、`GNU`。使用 `file` 可從目前目錄或父目錄的 `.clang-format` 檔案載入樣式,或使用 `file:<path>/.clang-format` 參照特定路徑。使用 `{索引鍵: 值, ...}` 可設定特定參數。例如,`Visual Studio` 樣式類似於: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "當已使用樣式 `file` 叫用 `clang-format`,但找不到 `.clang-format` 檔案時,用作後援的預先定義樣式名稱。可能的值包括 `Visual Studio`、`LLVM`、`Google`、`Chromium`、`Mozilla`、`WebKit`、`Microsoft`、`GNU`、`none` 或使用 {索引鍵: 值, ...} 來設定特定參數。例如,`Visual Studio` 樣式類似於: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。",
|
||||
"c_cpp.configuration.clang_format_sortIncludes.markdownDescription": "若設定,會覆寫 `SortIncludes` 參數所決定的包含排序行為。",
|
||||
"c_cpp.configuration.intelliSenseEngine.description": "控制 IntelliSense 提供者。",
|
||||
@@ -163,7 +173,7 @@
|
||||
"c_cpp.configuration.intelliSenseEngine.tagParser.description": "提供不屬於內容意識的 `模糊` 結果。",
|
||||
"c_cpp.configuration.intelliSenseEngine.disabled.description": "關閉 C/C++ 語言服務功能。",
|
||||
"c_cpp.configuration.intelliSenseEngineFallback.markdownDescription": "控制 IntelliSense 引擎是否會自動切換到包含 `#include` 錯誤之編譯單位的標籤剖析器。",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "控制自動完成提供者。若設為 `Disabled` 且您想要以文字方式完成,您也必須設定 `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}` (與 `c` 及 `cuda-cpp` 語言類似)。",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "控制自動完成提供者。若設為 `disabled` 且您想要以文字方式完成,您也必須設定 `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}` (與 `c` 及 `cuda-cpp` 語言類似)。",
|
||||
"c_cpp.configuration.autocomplete.default.description": "使用作用中 IntelliSense 引擎。",
|
||||
"c_cpp.configuration.autocomplete.disabled.description": "使用 Visual Studio Code 所提供的文字型完成。",
|
||||
"c_cpp.configuration.errorSquiggles.description": "該設定會控制是否將 IntelliSense 引擎偵測到的可疑編譯錯誤回報給編輯器。其也會在找不到內容時,控制是否回報程式碼分析警告。標籤剖析器引擎已忽略此設定。",
|
||||
@@ -171,6 +181,13 @@
|
||||
"c_cpp.configuration.inactiveRegionOpacity.markdownDescription": "控制非作用中前置處理器區塊的不透明度。在 `0.1` 與 `1.0` 之間縮放。只有在啟用非作用中區域變暗時,才會套用此設定。",
|
||||
"c_cpp.configuration.inactiveRegionForegroundColor.description": "控制非作用中前置處理器區塊的前景色彩。輸入的格式為十六進位色彩代碼或有效的佈景主題色彩。若未設定,會預設為編輯器的語法著色配置。只有在啟用非作用中區域變暗時,才會套用此設定。",
|
||||
"c_cpp.configuration.inactiveRegionBackgroundColor.description": "控制非作用中前置處理器區塊的背景色彩。輸入的格式為十六進位色彩代碼或有效的佈景主題色彩。若未設定,會預設為透明。只有在啟用非作用中區域變暗時,才會套用此設定。",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.enabled.markdownDescription": "宣告中使用 `auto` 時,顯示推算類型的內嵌提示:\n```cpp \n\n auto index /* : int */ = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "在識別碼左側的宣告中使用 `auto` 時,顯示推算類型的內嵌提示:\n```cpp \n\n auto /* int */ index = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "顯示參數名稱的內嵌提示:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "隱藏參數名稱提示中的前置 `_`。",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "當引數文字或內嵌註解包含參數名稱時,隱藏參數名稱提示:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "顯示非 const 參照所傳遞之參數的內嵌提示參照運算子 `&`:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "控制是否針對非 const 參照所傳遞的參數在 `&` 之後顯示空格:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```",
|
||||
"c_cpp.configuration.loggingLevel.markdownDescription": "輸出面板中記錄的詳細程度。從最不詳細到最詳細的層級順序為: `None` < `Error` < `Warning` < `Information` < `Debug`。",
|
||||
"c_cpp.configuration.autoAddFileAssociations.markdownDescription": "控制是否會在檔案為 C/C++ 檔案的瀏覽作業目標時,自動將檔案新增至 `#files.associations#`。",
|
||||
"c_cpp.configuration.workspaceParsingPriority.markdownDescription": "控制非作用中工作區檔案的剖析是否會使用睡眠來避免使用 100% 的 CPU。值 `highest`/`high`/`medium`/`low` 會約略對應至 100/75/50/25% CPU 使用率。",
|
||||
@@ -180,6 +197,9 @@
|
||||
"c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "將會針對每個遇到的檔案和資料夾評估排除篩選。",
|
||||
"c_cpp.configuration.preferredPathSeparator.markdownDescription": "用作 `#include` 自動完成結果路徑分隔符號的字元。",
|
||||
"c_cpp.configuration.simplifyStructuredComments.markdownDescription": "若為 `true`,暫留與自動完成的工具提示只會顯示特定結構化註解標籤,否則將會顯示所有註解。",
|
||||
"c_cpp.configuration.doxygen.generateOnType.description": "控制是否在輸入選擇的註解樣式後自動插入 Doxygen 註解。",
|
||||
"c_cpp.configuration.doxygen.generatedStyle.description": "作為 Doxygen 註解起始行的字元字串。",
|
||||
"c_cpp.configuration.doxygen.sectionTags.description": "選取啟用 [簡化結構化註解] 設定時,要在工具提示區域暫留時顯示的 [Doxygen] 區段標籤。 ",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "開始多行或單行註解區塊的模式。對於多行註解區塊,接續模式預設為 ` * `,或此字串表示單行註解區塊。",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "開始多行或單行註解區塊的模式。",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "在多行或單行註解區塊中按下 ENTER 時,將在下一行插入的文字。",
|
||||
@@ -213,6 +233,7 @@
|
||||
"c_cpp.configuration.default.dotConfig.markdownDescription": "當 `dotConfig` 未指定時,要在設定中使用的值,或 `dotConfig` 中有 `${default}` 時要插入的值。",
|
||||
"c_cpp.configuration.experimentalFeatures.description": "控制「實驗性」功能是否可用。",
|
||||
"c_cpp.configuration.suggestSnippets.markdownDescription": "若為 `true`,則由語言伺服器提供程式碼片段。",
|
||||
"c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": "如果設定為 `default`,則工作區的檔案系統會在 Windows 上假設為不區分大小寫,而在 macOS 或 Linux 上區分大小寫。如果設為 `enabled`,則工作區的檔案系統在 Windows 上會假設為區分大小寫。",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "若啟用,將會依據 IntelliSense 顯示彩色的程式碼。僅當 `#C_Cpp.intelliSenseEngine#` 設為 `Default` 時,才適用此設定。",
|
||||
"c_cpp.configuration.codeFolding.description": "若啟用,則由語言伺服器提供程式碼摺疊功能範圍。",
|
||||
"c_cpp.configuration.vcpkg.enabled.markdownDescription": "啟用 [vcpkg 相依性管理員](https://aka.ms/vcpkg/) 的整合服務。",
|
||||
@@ -225,7 +246,9 @@
|
||||
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "若為 `true`,偵錯工具殼層命令替代將會使用已淘汰的反引號 ``(`)``。",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "啟用 v1.10.0 之前的行為,以了解如何在編譯器自參數設定中處理殼層逸出。自 v1.10.0 開始,引數陣列中不再預期或預設支援殼層逸出。",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "此設定是暫時性的,可支援轉換至 v1.10.0 中的更正行為。",
|
||||
"c_cpp.configuration.sshTargetsView.description": "控制是否顯示 SSH 目標檢視。根據預設,在叫用 SSH 命令時會啟用該檢視。",
|
||||
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: 其他參考結果",
|
||||
"c_cpp.contributes.views.sshTargetsView.title": "Cpptools: SSH 目標",
|
||||
"c_cpp.contributes.viewsWelcome.contents": "如需深入了解 launch.json,請參閱 [設定 C/C++ 偵錯](https://code.visualstudio.com/docs/cpp/launch-json-reference)。",
|
||||
"c_cpp.configuration.debugShortcut.description": "在 C++ 檔案的編輯器標題列中顯示 [執行及偵錯] 播放按鈕和 [新增偵錯設定] 齒輪。",
|
||||
"c_cpp.debuggers.pipeTransport.description": "出現時,會指示偵錯工具使用另一個可執行檔來連線至遠端電腦,該管道會在 VS Code 與 MI 啟用偵錯工具後端可執行檔之間傳送標準輸入/輸出 (例如 gdb)。",
|
||||
@@ -270,6 +293,7 @@
|
||||
"c_cpp.debuggers.miDebuggerPath.description": "MI 偵錯工具 (例如 gdb) 的路徑。若未指定,會先搜尋偵錯工具的路徑。",
|
||||
"c_cpp.debuggers.miDebuggerArgs.description": "MI 偵錯工具 (例如 gdb) 的其他引數。",
|
||||
"c_cpp.debuggers.miDebuggerServerAddress.description": "MI 偵錯工具伺服器要連線至的網路位址 (範例: localhost:1234)。",
|
||||
"c_cpp.debuggers.useExtendedRemote.description": "使用目標延伸的遠端模式連線到 MI 偵錯工具伺服器。",
|
||||
"c_cpp.debuggers.stopAtEntry.description": "選擇性參數。若為 true,則偵錯工具應該在目標的進入點停止。如果已傳遞 processId。就沒有效果。",
|
||||
"c_cpp.debuggers.debugServerPath.description": "要啟動的偵錯伺服器選用完整路徑。預設為 Null。使用時,會將 \"miDebugServerAddress\" 或您自己的伺服器與 \"customSetupCommand\" 連接,以執行 \"-target-select remote <伺服器:連接埠>\"。",
|
||||
"c_cpp.debuggers.debugServerArgs.description": "選擇性偵錯伺服器引數。預設為 null。",
|
||||
@@ -299,6 +323,37 @@
|
||||
"c_cpp.debuggers.hardwareBreakpoints.description": "明確控制遠端目標的硬體中斷點行為。",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.require.description": "如果為 True,請一律使用硬體中斷點。預設為 False。",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "可用硬體中斷點數目的選用限制。只有在「需要」為 True 且「限制」大於 0 時強制執行。預設為 0。",
|
||||
"c_cpp.debuggers.variables.description": "用於在此啟動設定中遞迴替代的變數。每個變數可能參照其他項目。",
|
||||
"c_cpp.debuggers.variables.properties.description": "用於在此啟動設定中遞迴替代的變數。值可能參照其他變數。",
|
||||
"c_cpp.debuggers.host.description": "主機資訊。",
|
||||
"c_cpp.debuggers.host.user.description": "使用者登入主機。",
|
||||
"c_cpp.debuggers.host.hostName.description": "主機名稱。",
|
||||
"c_cpp.debuggers.host.port.description": "主機上的 SSH 連接埠。預設值為 22。",
|
||||
"c_cpp.debuggers.host.jumpHost.description": "先與跳板機建立連線,以連線至目標主機。",
|
||||
"c_cpp.debuggers.host.localForward.description": "將通往至本機 (用戶端) 主機上指定的 TCP 連接埠或 Unix 通訊端的連線轉送至遠端上指定的主機和連接埠或 Unix 通訊端",
|
||||
"c_cpp.debuggers.host.localForward.bindAddress.description": "本機位址",
|
||||
"c_cpp.debuggers.host.localForward.port.description": "本機連接埠",
|
||||
"c_cpp.debuggers.host.localForward.host.description": "主機名稱",
|
||||
"c_cpp.debuggers.host.localForward.hostPort.description": "主機連接埠",
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "本機通訊端",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "遠端通訊端",
|
||||
"c_cpp.debuggers.deploySteps.description": "部署應用程式所需的步驟。順序很重要。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.description": "使用 SCP 或 rsync 複製檔案。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.files.description": "要複製的檔案。支援路徑模式。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "目標目錄。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.recursive.description": "若為 True,會以遞迴方式複製資料夾。",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "SCP 的選用完整路徑。如果未指定,則會假設 SCP 在 PATH 上",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "rsync 的選用完整路徑。如果未指定,則會假設 rsync 在 PATH 上",
|
||||
"c_cpp.debuggers.deploySteps.debug": "如果為 True,則在啟動而不偵錯的情況下略過。如果為 False,則在啟動而偵錯的情況下略過。如果未定義,則永不略過。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.description": "SSH 命令步驟。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.command.description": "要透過 SSH 執行的命令。SSH 命令中 '-c' 之後的命令。",
|
||||
"c_cpp.debuggers.deploySteps.ssh.sshPath.description": "SSH 的選用完整路徑。如果未指定,則會假設 SSH 在 PATH 上",
|
||||
"c_cpp.debuggers.deploySteps.continueOn.description": "輸出中選用的完成模式。當輸出中出現此模式,則會繼續執行部署程序 (而無論此步驟是否傳回)。",
|
||||
"c_cpp.debuggers.deploySteps.shell.description": "殼層命令步驟。",
|
||||
"c_cpp.debuggers.deploySteps.shell.command.description": "要執行的殼層命令。",
|
||||
"c_cpp.debuggers.vsCodeCommand.description": "要叫用的 VS Code 命令。可以是 VS Code 中的命令或使用中的延伸模組。",
|
||||
"c_cpp.debuggers.vsCodeCommand.command.description": "要叫用的 VS Code 命令。",
|
||||
"c_cpp.debuggers.vsCodeCommand.args.description": "VS Code 命令的引數。",
|
||||
"c_cpp.taskDefinitions.name.description": "工作的名稱。",
|
||||
"c_cpp.taskDefinitions.command.description": "執行編譯的編譯器或指令碼路徑。",
|
||||
"c_cpp.taskDefinitions.args.description": "要傳遞給編譯器或編譯指令碼的其他引數。",
|
||||
@@ -309,6 +364,7 @@
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "編輯器要使用的來源樹狀路徑。",
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "若此項目只用於堆疊框架位置對應,則為 False; 若在指定中斷點位置時也應該使用此項目,則為 True。",
|
||||
"c_cpp.debuggers.symbolOptions.description": "控制如何找到並載入符號 (.pdb 檔案) 的選項。",
|
||||
"c_cpp.debuggers.unknownBreakpointHandling.description": "控制叫用時如何處理在外部設定的中斷點 (通常是透過原始 GDB 命令)。\n允許的值為 \"throw\",其作用就像應用程式擲出例外,以及 \"stop\",其只會暫停偵錯工作階段。預設值為 \"throw\"。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.description": "提供將符號尋找及載入至偵錯介面卡的設定。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "符號陣列伺服器 URL (範例: http://MyExampleSymbolServer) 或目錄 (範例: /build/symbols) 搜尋 .pdb 檔案。除了預設位置 (位於模組旁和 pdb 原先放置的路徑),也會搜尋這些目錄。",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchMicrosoftSymbolServer.description": "如果是 'true',則會將 Microsoft 符號伺服器 (https://msdl.microsoft.com/download/symbols) 新增至符號搜尋路徑。若未指定,這個選項會預設為 'false'。",
|
||||
|
||||
@@ -4,9 +4,12 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.pipetransport": "選擇的偵錯組態未包含 {0}",
|
||||
"debugger.path.and.server.address.required": "偵錯設定中的 {0} 需要 {1} 和 {2}",
|
||||
"no.pipetransport.useextendedremote": "選擇的偵錯設定未包含 {0} 或 {1}",
|
||||
"select.process.attach": "選取要附加至的目標處理序",
|
||||
"process.not.selected": "未選取處理序。",
|
||||
"pipe.failed": "管道傳輸無法取得 OS 和處理序。",
|
||||
"no.process.list": "傳輸附加無法取得處理序清單。"
|
||||
"no.process.list": "傳輸附加無法取得處理序清單。",
|
||||
"failed.to.make.gdb.connection": "無法建立 GDB 連線: \"{0}\"。",
|
||||
"failed.to.parse.processes": "無法剖析處理式: \"{0}\"。"
|
||||
}
|
||||
@@ -11,7 +11,11 @@
|
||||
"lldb.framework.install.xcode": "更多資訊",
|
||||
"lldb.framework.not.found": "找不到 lldb-mi 的 'LLDB.framework'。請安裝 XCode 或 XCode 命令列工具。",
|
||||
"debugger.launchConfig": "啟動設定:",
|
||||
"vs.code.1.69+.required": "'deploySteps' 需要 VS Code 1.69+。",
|
||||
"running.deploy.steps": "正在執行部署步驟...",
|
||||
"compiler.path.not.exists": "找不到 {0}。已略過 {1} 工作。",
|
||||
"pre.Launch.Task": "preLaunchTask: {0}",
|
||||
"debugger.path.not.exists": "找不到 {0} 偵錯工具。已略過 {1} 的偵錯設定。",
|
||||
"build.and.debug.active.file": "建置及偵錯使用中的檔案",
|
||||
"cl.exe.not.available": "只有從 VS 的開發人員命令提示字元執行 VS Code 時,才可使用 {0} 組建和偵錯。",
|
||||
"lldb.find.failed": "缺少 lldb-mi 可執行檔的相依性 '{0}'。",
|
||||
@@ -29,6 +33,12 @@
|
||||
"cannot.build.non.cpp": "因為作用中的檔案不是 C 或 C++ 來源檔案,所以無法建立和偵錯。",
|
||||
"no.compiler.found": "找不到任何編譯器",
|
||||
"select.debug.configuration": "選取偵錯設定",
|
||||
"command.args.must.be.array": "命令部署步驟中的 \"args\" 必須是陣列。",
|
||||
"missing.properties.copyFile": "{0} 步驟中需要 \"host\"、\"files\" 和 \"targetDir\"。",
|
||||
"incorrect.files.type.copyFile": "\"files\" 必須是 {0} 步驟中的字串或字串陣列。",
|
||||
"missing.properties.ssh": "ssh 步驟中需要 \"host\" 和 \"command\"。",
|
||||
"missing.properties.shell": "殼層步驟需要 \"command\"。",
|
||||
"deploy.step.type.not.supported": "不支援部署步驟類型 {0}。",
|
||||
"unexpected.os": "未預期的 OS 類型",
|
||||
"path.to.pipe.program": "管道程式的完整路徑,例如 {0}",
|
||||
"enable.pretty.printing": "啟用 {0} 的美化顯示",
|
||||
|
||||
@@ -4,5 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"add.debug.configuration.not.available.for.single.file": "新增偵錯設定無法用於單一檔案。"
|
||||
"add.debug.configuration.not.available.for.single.file": "新增偵錯設定無法用於單一檔案。",
|
||||
"cannot.modify.config.file": "無法修改 SSH 設定檔,因為剖析失敗「{0}」。",
|
||||
"no.valid.ssh.config.file": "找不到有效的 SSH 設定檔。",
|
||||
"enter.ssh.target.name": "輸入 SSH 目標名稱",
|
||||
"ssh.target.name.place.holder": "範例: `mySSHTarget`",
|
||||
"enter.ssh.connection.command": "輸入 SSH 連線命令",
|
||||
"ssh.connection.command.place.holder": "範例: `ssh [email protected] -A`",
|
||||
"select.ssh.config.file": "選取 SSH 設定檔",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"ssh.target.delete.confirmation": "確定要永久刪除 \"{0}\" 嗎?"
|
||||
}
|
||||
@@ -4,16 +4,6 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "修正所有程式碼分析問題",
|
||||
"clear_all_code_analysis_problems": "清除所有程式碼分析問題",
|
||||
"c.cpp.debug.protocol": "C/C++ 偵錯通訊協定",
|
||||
"c.cpp.warnings": "C/C++ 設定警告",
|
||||
"fix_all_type_problems": "修正所有 {0} 問題",
|
||||
"disable_all_type_problems": "停用所有 {0} 問題",
|
||||
"clear_all_type_problems": "清除所有 {0} 問題",
|
||||
"clear_this_problem": "清除此 {0} 問題",
|
||||
"fix_this_problem": "修正此 {0} 問題",
|
||||
"show_documentation_for": "顯示 {0} 的文件",
|
||||
"unable.to.start": "無法啟動 C/C + + 語言伺服器。將停用 IntelliSense 功能。錯誤: {0}",
|
||||
"check.permissions": "EPERM: 檢查 '{0}' 的權限",
|
||||
"server.crashed2": "語言伺服器在過去 3 分鐘內發生 5 次故障。將不會重新啟動。",
|
||||
@@ -23,7 +13,6 @@
|
||||
"allow.button": "允許",
|
||||
"dont.allow.button": "不允許",
|
||||
"ask.me.later.button": "稍後詢問我",
|
||||
"c.cpp.diagnostics": "C/C++ 診斷",
|
||||
"dismiss.button": "關閉",
|
||||
"diable.warnings.button": "停用警告",
|
||||
"unable.to.provide.configuration": "{0} 無法提供 '{1}' 的 IntelliSense 組態資訊。將改用來自 '{2}' 組態的設定。",
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "修正所有程式碼分析問題",
|
||||
"clear_all_code_analysis_problems": "清除所有程式碼分析問題",
|
||||
"fix_all_type_problems": "修正所有 {0} 問題",
|
||||
"disable_all_type_problems": "停用所有 {0} 問題",
|
||||
"clear_all_type_problems": "清除所有 {0} 問題",
|
||||
"clear_this_problem": "清除此 {0} 問題",
|
||||
"fix_this_problem": "修正此 {0} 問題",
|
||||
"show_documentation_for": "顯示 {0} 的文件"
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "了解如何使用 vcpkg 安裝此標頭的程式庫",
|
||||
"copy.vcpkg.command": "將用於安裝 '{0}' 的 vcpkg 命令複製到剪貼簿",
|
||||
"on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `disabled` 時,無法執行IntelliSense 的相關命令。",
|
||||
"client.not.found": "找不到用戶端",
|
||||
"configuration.select.first": "先開啟資料夾以選取組態",
|
||||
"configuration.provider.select.first": "先開啟資料夾以選取組態提供者",
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.symbolscope.separator": "{0},{1}"
|
||||
}
|
||||
@@ -4,5 +4,5 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"editorconfig.default.behavior": "程式碼格式設定使用來自 .editorconfig 的設定,而不是 .clang-format 格式。如需詳細資訊,請參閱 'C_Cpp.formatting' 設定之 'Default' 值的文件。"
|
||||
"editorconfig.default.behavior": "程式碼格式設定使用來自 .editorconfig 的設定,而不是 .clang-format 格式。如需詳細資訊,請參閱 'C_Cpp.formatting' 設定之 'default' 值的文件。"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.ssh.targets": "沒有 SSH 目標",
|
||||
"active.ssh.target.selection.cancelled": "已取消選取使用中的 SSH 目標。",
|
||||
"add.new.ssh.target": "{0} 新增 SSH 目標...",
|
||||
"select.ssh.target": "選取 SSH 目標"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"ssh.target.active.description": "[使用中]"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"failed.to.connect": "無法連線至 {0}"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"local.forward.local.conflict": "\"localSocket\" 不能同時與 \"bindAddress\" 或 \"port\" 在 localForwards 中指定",
|
||||
"local.forward.local.missing": "localForwards 中需要 \"port\" 或 \"localSocket\"",
|
||||
"local.forward.remote.conflict": "\"remoteSocket\" 不能同時與 \"host\" 或 \"hostPort\" 在 localForwards 中指定",
|
||||
"local.forward.remote.missing": "localForwards 中需要 \"host\" 和 \"hostPort\" 或 \"remoteSocket\""
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"ssh.canceled": "SSH 命令已取消",
|
||||
"ssh.passphrase.input.box": "輸入 ssh 金鑰 {0} 的複雜密碼",
|
||||
"ssh.enter.password.for.user": "輸入使用者 \"{0}\" 的密碼",
|
||||
"ssh_message_enterPassword": "輸入密碼",
|
||||
"ssh.continue.confirmation.placeholder": "您確定要繼續嗎?",
|
||||
"ssh.host.key.confirmation.title": "「{0}」具有指紋「{1}」。",
|
||||
"continue": "繼續",
|
||||
"cancel": "取消",
|
||||
"ssh.terminal.command.canceled": "\"{0}\" 終端命令已取消。",
|
||||
"ssh.terminal.command.done": "\"{0}\" 終端命令完成。",
|
||||
"ssh.continuing.command.canceled": "工作 '{0}' 已取消,但可能無法終止基礎命令。請手動檢查。",
|
||||
"ssh.process.failed": "\"{0}\" 程序已失敗: {1}",
|
||||
"ssh.wrote.data.to.terminal": "\"{0}\" 將資料寫入終端: \"{1}\"。"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"failed.to.parse.SSH.config": "無法剖析 SSH 設定檔 {0}: {1}",
|
||||
"failed.to.read.file": "無法讀取檔案 {0}。",
|
||||
"failed.to.write.file": "無法寫入檔案 {0}。"
|
||||
}
|
||||
@@ -7,11 +7,11 @@
|
||||
"failed.to.parse.json": "無法剖析 json 檔案,這可能是因為註解或結尾逗號所致。",
|
||||
"extension.not.ready": "C/C ++ 延伸模組仍在安裝。如需詳細資訊,請查看輸出視窗。",
|
||||
"refer.read.me": "如需疑難排解資訊,請參閱 {0}。問題可在 {1} 建立",
|
||||
"process.exited.with.code": "{0} 已結束,錯誤碼為 {1}",
|
||||
"process.exited": "處理序已結束,代碼為 {0}",
|
||||
"process.succeeded": "程序已成功執行。",
|
||||
"killing.process": "終止程序 {0}",
|
||||
"warning.file.missing": "警告: 缺少預期的檔案 {0}。",
|
||||
"warning.debugging.not.tested": "警告: 尚未針對此平台測試偵錯。",
|
||||
"reload.workspace.for.changes": "請重新載入工作區以讓設定變更生效。",
|
||||
"reload.string": "重新載入",
|
||||
"invalid.download.location.received": "收到的下載位置無效",
|
||||
"c.cpp.symbolscope.separator": "{0},{1}"
|
||||
"reload.string": "重新載入"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"max.recursion.reached": "已達到字串展開遞迴的最大值。可能的循環參考。",
|
||||
"invalid.var.reference": "字串中無效的變數參考 {0}: {1}。",
|
||||
"env.var.not.found": "找不到環境變數 {0}",
|
||||
"commands.not.supported": "字串不支援的命令: {0}。",
|
||||
"exception.executing.command": "執行字串的命令 {0} 時發生例外狀況: {1} {2}。"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 診斷",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ 偵錯通訊協定",
|
||||
"c.cpp.warnings": "C/C++ 設定警告"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"macos.version.deprecated": "比 {0} 更新的 C/C++ 延伸模組版本至少需要 macOS 版本 {1}。",
|
||||
"intellisense.disabled": "intelliSenseEngine 已停用",
|
||||
"more.info.button": "更多資訊",
|
||||
"ignore.button": "略過",
|
||||
"vsix.platform.incompatible": "安裝的 C/C++ 延伸模組與您的系統不相符。",
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
"default_query_failed": "無法查詢 {0} 的預設 include 路徑和 define。",
|
||||
"failed_call": "無法呼叫 {0}",
|
||||
"quick_info_failed": "快速資訊作業失敗: {0}",
|
||||
"create_intellisense_client_failed": "無法建立 IntelliSense 用戶端。{0}",
|
||||
"intellisense_spawn_failed": "無法繁衍 IntelliSense 處理序:",
|
||||
"create_intellisense_client_failed": "無法建立 IntelliSense 用戶端: {0}",
|
||||
"intellisense_spawn_failed": "無法產生 IntelliSense 處理序: {0}",
|
||||
"browse_engine_update_thread_join_failed": "呼叫 browse_engine_update_thread.join() 時發生錯誤: {0}",
|
||||
"already_open_different_casing": "這個檔案 ({0}) 已經在編輯器中開啟,但大小寫不同。此檔案複本上的 IntelliSense 功能將會停用。",
|
||||
"intellisense_client_disconnected": "IntelliSense 用戶端已與伺服器中斷連線 - {0}",
|
||||
@@ -168,12 +168,32 @@
|
||||
"specialization": "還有 1 次特殊化",
|
||||
"specializations": "還有 %d 次特殊化",
|
||||
"expands_to": "展開至:",
|
||||
"file_label": "檔案:",
|
||||
"parameters_label": "參數:",
|
||||
"returns_label": "傳回:",
|
||||
"attention_label": "注意:",
|
||||
"author_label": "作者:",
|
||||
"authors_label": "作者:",
|
||||
"bug_label": "錯誤 (bug):",
|
||||
"copyright_label": "著作權:",
|
||||
"deprecated_label": "已淘汰:",
|
||||
"date_label": "日期:",
|
||||
"details_label": "詳細資料:",
|
||||
"exceptions_label": "例外狀況:",
|
||||
"invariant_label": "不區分:",
|
||||
"file_label": "檔案:",
|
||||
"note_label": "注意事項:",
|
||||
"parameters_label": "參數:",
|
||||
"pre_label": "先決條件:",
|
||||
"post_label": "後置:",
|
||||
"remark_label": "備註:",
|
||||
"remarks_label": "備註:",
|
||||
"result_label": "結果:",
|
||||
"return_label": "傳回:",
|
||||
"returns_label": "傳回:",
|
||||
"since_label": "自:",
|
||||
"template_parameters_label": "範本參數:",
|
||||
"test_label": "測試:",
|
||||
"todo_label": "TODO:",
|
||||
"version_label": "版本:",
|
||||
"warning_label": "警告:",
|
||||
"compiler_query_command_line": "編譯器查詢命令列: {0}",
|
||||
"c_compiler_from_compiler_path": "正在嘗試從 C 編譯器的 \"compilerPath\" 屬性中取得預設值: '{0}'",
|
||||
"cpp_compiler_from_compiler_path": "正在嘗試從 C++ 編譯器的 \"compilerPath\" 屬性中取得預設值: '{0}'",
|
||||
@@ -221,5 +241,6 @@
|
||||
"folder_tag": "資料夾",
|
||||
"file_tag": "檔案",
|
||||
"compiler_default_language_standard_version_old": "編譯器傳回預設語言標準版本: {0}。因為此版本為舊版本,將嘗試使用較新的版本 {1} 為預設版本。",
|
||||
"unexpected_output_from_clang_tidy": "來自 clang-tidy 的未預期輸出: {0}。預期是: {1}。"
|
||||
"unexpected_output_from_clang_tidy": "來自 clang-tidy 的未預期輸出: {0}。預期是: {1}。",
|
||||
"generate_doxygen_comment": "產生 Doxygen 註解"
|
||||
}
|
||||
+10
-10
@@ -4,15 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"walkthrough.mac.title.run.and.debug.your.file": "在 Windows 上執行並偵錯您的 C++ 檔案",
|
||||
"walkthrough.mac.run.and.debug.your.file": "若要在 VS Code 中執行和偵錯您的 C++ 檔案:",
|
||||
"walkthrough.mac.instructions1": "開啟您要執行及偵錯的 C++ 來源檔案。請確定此檔案在編輯器中為作用中 (目前顯示且已選取)。",
|
||||
"walkthrough.mac.press.f5": "按 {0}。或者,從主功能表中選擇 {1}。",
|
||||
"walkthrough.mac.run": "執行",
|
||||
"walkthrough.mac.start.debugging": "開始偵錯",
|
||||
"walkthrough.mac.select.compiler": "選取 {0}。",
|
||||
"walkthrough.mac.choose.build.active.file": "選擇 {0}。",
|
||||
"walkthrough.windows.title.run.and.debug.your.file": "在 Windows 上執行並偵錯您的 C++ 檔案",
|
||||
"walkthrough.windows.run.and.debug.your.file": "若要在 VS Code 中執行和偵錯您的 C++ 檔案:",
|
||||
"walkthrough.windows.instructions1": "開啟您要執行及偵錯的 C++ 來源檔案。請確定此檔案在編輯器中為作用中 (目前顯示且已選取)。",
|
||||
"walkthrough.windows.press.f5": "按 {0}。或者,從主功能表中選擇 {1}。",
|
||||
"walkthrough.windows.run": "執行",
|
||||
"walkthrough.windows.start.debugging": "開始偵錯",
|
||||
"walkthrough.windows.select.compiler": "選取 {0}。",
|
||||
"walkthrough.windows.choose.build.active.file": "選擇 {0}。",
|
||||
"walkthrough.windows.build.and.debug.active.file": "建置及偵錯使用中的檔案",
|
||||
"walkthrough.mac.after.running": "第一次執行並偵錯您的 C++ 檔案之後,您會注意到專案 {0} 資料夾中有兩個新檔案: {1} 及 {2}。",
|
||||
"walkthrough.mac.for.more.complex": "如需更複雜的組建和偵錯案例,您可以在 {0} 及 {1} 中自訂群組建工作和偵錯設定。例如,如果您在從命令列組建時,通常會將引數傳遞給編譯器,可以使用 {3} 屬性在 {2} 中指定這些引數。類似地,您可以定義要傳遞給程式的引數,以便在 {4} 進行偵錯。"
|
||||
"walkthrough.windows.after.running": "第一次執行並偵錯您的 C++ 檔案之後,您會注意到專案 {0} 資料夾中有兩個新檔案: {1} 及 {2}。",
|
||||
"walkthrough.windows.for.more.complex": "如需更複雜的組建和偵錯案例,您可以在 {0} 及 {1} 中自訂群組建工作和偵錯設定。例如,如果您在從命令列組建時,通常會將引數傳遞給編譯器,可以使用 {3} 屬性在 {2} 中指定這些引數。類似地,您可以定義要傳遞給程式的引數,以便在 {4} 進行偵錯。"
|
||||
}
|
||||
@@ -33,6 +33,15 @@
|
||||
"c_cpp.command.BuildAndDebugFile.title": "Ladit soubor C/C++",
|
||||
"c_cpp.command.BuildAndRunFile.title": "Spustit soubor C/C++",
|
||||
"c_cpp.command.AddDebugConfiguration.title": "Přidat konfiguraci ladění",
|
||||
"c_cpp.command.GenerateDoxygenComment.title": "Vygenerovat komentář Doxygen",
|
||||
"c_cpp.command.addSshTarget.title": "Přidat cíl SSH",
|
||||
"c_cpp.command.removeSshTarget.title": "Odebrat cíl SSH",
|
||||
"c_cpp.command.setActiveSshTarget.title": "Nastavit tento cíl SSH jako aktivní cíl",
|
||||
"c_cpp.command.selectActiveSshTarget.title": "Vyberte aktivní cíl SSH",
|
||||
"c_cpp.command.selectSshTarget.title": "Vybrat cíl SSH",
|
||||
"c_cpp.command.activeSshTarget.title": "Získání aktivního cíle SSH",
|
||||
"c_cpp.command.refreshCppSshTargetsView.title": "Aktualizovat",
|
||||
"c_cpp.command.sshTerminal.title": "Připojení k tomuto cíli SSH v novém terminálu",
|
||||
"c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Maximální počet souběžných vláken, která se mají použít pro zpracování služby jazyka. Hodnota je nápověda a nemusí být vždy použita. Výchozí hodnota `null` (prázdná) používá počet dostupných logických procesorů.",
|
||||
"c_cpp.configuration.maxCachedProcesses.markdownDescription": "Maximální počet procesů uložených v mezipaměti, které se mají použít pro zpracování služby jazyka. Výchozí hodnota `null` (prázdná) používá dvojnásobek dostupného počtu logických procesorů.",
|
||||
"c_cpp.configuration.maxMemory.markdownDescription": "Maximální paměť (v MB), která je k dispozici pro zpracování služby jazyka. Po překročení tohoto využití paměti bude uloženo do mezipaměti méně procesů, které budou spuštěny souběžně. Výchozí hodnota `null` (prázdná) používá volnou paměť systému.",
|
||||
@@ -55,6 +64,7 @@
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Zobrazit jenom akci kódu Vymazat vše (nebo Vymazat vše <type>, pokud existuje jenom jeden typ, nebo Vymazat toto, pokud je jenom jeden problém).",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Zobrazit akci kódu Vymazat vše (pokud existuje více typů problémů) a akci kódu Vymazat vše <type> (nebo Vymazat toto, pokud u <type> dochází pouze k jednomu problému)",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Zobrazení možnosti Vymazat vše (pokud existuje více typů problémů), Vymazat všechny <type> (pokud existuje více problémů pro <type>) a Vymazat tento kód",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Pokud je hodnota `true`, formátování se spustí na řádcích změněných akcemi kódu 'Opravit'.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Pokud `true`, bude analýza kódu pomocí `clang-tidy` povolena a spuštěna automaticky, pokud je `#C_Cpp.codeAnalysis.runAutomatically#` `true` (výchozí).",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Úplná cesta ke spustitelnému souboru `clang-tidy`. Pokud se nespecifikuje a `clang-tidy` je k dispozici na cestě prostředí, použije se. Pokud se na cestě prostředí nenajde, použije se kopie `clang-tidy`, která se dodává spolu s rozšířením.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Určuje konfiguraci `clang-tidy` ve formátu YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{key: x, value: y}]}`. Když je hodnota prázdná, `clang-tidy` se pokusí najít soubor s názvem `.clang-tidy` pro každý zdrojový soubor v jeho nadřazených adresářích.",
|
||||
@@ -155,7 +165,7 @@
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": "Jakýkoli kód, ve kterém se na jednom řádku zadají levá a pravá složená závorka, zůstane na jednom řádku bez ohledu na hodnoty kteréhokoli nastavení `C_Cpp.vcFormat.newLine.*`.",
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "Bloky kódu se budou vždy formátovat podle hodnot nastavení `C_Cpp.vcFormat.newLine.*`.",
|
||||
"c_cpp.configuration.clang_format_path.markdownDescription": "Úplná cesta ke spustitelnému souboru `clang-format`. Pokud se nespecifikuje a `clang-format` je k dispozici na cestě prostředí, použije se. Pokud se na cestě prostředí nenajde, použije se kopie `clang-format`, která se dodává spolu s rozšířením.",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "Styl kódování, v současné době se podporuje: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Pokud chcete načíst styl ze souboru `.clang-format` v aktuálním nebo nadřazeném adresáři, použijte možnost `file`. Pokud chcete zadat konkrétní parametry, použijte `{klíč: hodnota, ...}`. Například styl `Visual Studio` je podobný tomuto: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "Styl kódování, v současné době se podporuje: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Pokud chcete načíst styl ze souboru `.clang-format` v aktuálním nebo nadřazeném adresáři, použijte možnost `file` nebo použijte `file:<cesta>/.clang-format` k odkázání na konkrétní cestu. Pokud chcete zadat konkrétní parametry, použijte `{klíč: hodnota, ...}`. Například styl `Visual Studio` je podobný tomuto: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.",
|
||||
"c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "Název předdefinovaného stylu, který se použije jako záloha v případě, že se vyvolá `clang-format` se stylem `file`, ale nenajde se soubor `.clang-format`. Možné hodnoty jsou `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`, `none`, případně můžete použít `{klíč: hodnota, ...}` a nastavit konkrétní parametry. Například styl `Visual Studio` je podobný tomuto: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.",
|
||||
"c_cpp.configuration.clang_format_sortIncludes.markdownDescription": "Pokud se nastaví, přepíše chování řazení vložených souborů určené parametrem `SortIncludes`.",
|
||||
"c_cpp.configuration.intelliSenseEngine.description": "Řídí poskytovatele technologie IntelliSense.",
|
||||
@@ -163,7 +173,7 @@
|
||||
"c_cpp.configuration.intelliSenseEngine.tagParser.description": "Poskytuje přibližné výsledky, které nejsou v kontextu.",
|
||||
"c_cpp.configuration.intelliSenseEngine.disabled.description": "Vypne funkce služby jazyka C/C++.",
|
||||
"c_cpp.configuration.intelliSenseEngineFallback.markdownDescription": "Určuje, jestli se modul IntelliSense automaticky přepne na analyzátor značek pro jednotky překladu, které obsahují chyby direktiv `#include`.",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Určuje poskytovatele automatického dokončování. Pokud je hodnota `Disabled` a chcete dokončování na základě slov, musíte nastavit také `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}` (a podobně také pro jazyky `c` a `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Určuje poskytovatele automatického dokončování. Pokud je hodnota `disabled` a chcete dokončování na základě slov, musíte nastavit také \"[cpp]\": {\"editor.wordBasedSuggestions\": true} (a podobně také pro jazyky `c` a `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.default.description": "Používá aktivní modul IntelliSense.",
|
||||
"c_cpp.configuration.autocomplete.disabled.description": "Používá dokončování na základě slov, které nabízí Visual Studio Code.",
|
||||
"c_cpp.configuration.errorSquiggles.description": "Určuje, jestli budou podezřelé chyby kompilace zjištěné modulem IntelliSense hlášeny zpět editoru. Také řídí, zda jsou hlášena upozornění na analýzu kódu, pokud nelze najít zahrnutí. Modul analyzátoru značek toto nastavení ignoruje.",
|
||||
@@ -171,6 +181,13 @@
|
||||
"c_cpp.configuration.inactiveRegionOpacity.markdownDescription": "Určuje neprůhlednost neaktivních bloků preprocesoru. Hodnoty spadají do rozsahu od `0,1 do `1,0`. Toto nastavení platí jen v případě, že je povolené ztmavování neaktivních oblastí.",
|
||||
"c_cpp.configuration.inactiveRegionForegroundColor.description": "Určuje barvení písma neaktivních bloků preprocesoru. Vstup má tvar šestnáctkového kódu barvy nebo platné barvy motivu. Pokud se nenastaví, výchozí nastavení je schéma barvení syntaxe v editoru. Toto nastavení platí jen v případě, že je povolené ztmavování neaktivních oblastí.",
|
||||
"c_cpp.configuration.inactiveRegionBackgroundColor.description": "Určuje barvení pozadí neaktivních bloků preprocesoru. Vstup má tvar šestnáctkového kódu barvy nebo platné barvy motivu. Pokud se nenastaví, výchozí nastavení je průhledné pozadí. Toto nastavení platí jen v případě, že je povolené ztmavování neaktivních oblastí.",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.enabled.markdownDescription": "Zobrazit pomocné parametry vloženého kódu pro odvozený typ, když se v deklaraci používá `auto`:\n```cpp \n\n auto index /* : int */ = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "Zobrazit pomocné parametry vloženého kódu pro odvozený typ, když se v deklaraci na levé straně identifikátoru používá `auto`:\n```cpp \n\n auto /* int */ index = 0;\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "Zobrazit pomocné parametry vloženého kódu pro názvy parametrů:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "Skryje úvodní `_` v pomocných parametrech pro názvy parametrů.",
|
||||
"c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Potlačit pomocné parametry názvu parametru, pokud text argumentu nebo vložený komentář obsahuje název parametru:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "Zobrazí operátor odkazu na pomocný parametr vloženého kódu `&` pro parametry předané nekonstantním odkazem:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```",
|
||||
"c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "Určuje, jestli se za znakem `&` u parametrů, předaných nekonstantním odkazem, zobrazí mezera:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```",
|
||||
"c_cpp.configuration.loggingLevel.markdownDescription": "Úroveň podrobností protokolování panelu výstupu. Pořadí úrovní od nejméně podrobné po nejpodrobnější je toto: `None` < `Error` < `Warning` < `Information` < `Debug`.",
|
||||
"c_cpp.configuration.autoAddFileAssociations.markdownDescription": "Určuje, jestli se soubory automaticky přidají do `#files.associations#`, když budou cílem operace navigace ze souboru C/C++.",
|
||||
"c_cpp.configuration.workspaceParsingPriority.markdownDescription": "Určuje, jestli parsování neaktivních souborů pracovního prostoru použije operace čekání, aby se procesor nevyužíval na 100 %. Hodnoty `highest`/`high`/`medium`/`low` odpovídají přibližně 100/75/50/25 % využití procesoru.",
|
||||
@@ -180,6 +197,9 @@
|
||||
"c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Filtry vyloučení se vyhodnotí pro každý soubor a složku, které se vyskytnou.",
|
||||
"c_cpp.configuration.preferredPathSeparator.markdownDescription": "Znak, který se použije jako oddělovač cest pro výsledky automatického dokončení direktiv `#include`",
|
||||
"c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Když se tato možnost nastaví na `true`, popisky ovládacích prvků po najetí myší a automatické dokončování budou zobrazovat jen určité popisky strukturovaných komentářů. Jinak se budou zobrazovat všechny komentáře.",
|
||||
"c_cpp.configuration.doxygen.generateOnType.description": "Určuje, jestli se má po zadání zvoleného stylu komentáře automaticky vložit komentář Doxygen.",
|
||||
"c_cpp.configuration.doxygen.generatedStyle.description": "Řetězec znaků použitý jako počáteční řádek komentáře Doxygen.",
|
||||
"c_cpp.configuration.doxygen.sectionTags.description": "Vyberte značky oddílu Doxygen, které chcete zobrazit při najetí myší v oblasti popisu, pokud je povolené nastavení Zjednodušit strukturované komentáře. ",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Vzor, který zahájí víceřádkový nebo jednořádkový blok komentáře. Výchozí vzor pro pokračování je pro víceřádkové bloky komentářů ` * `, nebo tento řetězec pro jednořádkové bloky.",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Vzor, který zahájí víceřádkový nebo jednořádkový blok komentáře",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Text, který se vloží na další řádek, když se ve víceřádkovém nebo jednořádkovém bloku komentáře stiskne klávesa Enter.",
|
||||
@@ -213,7 +233,8 @@
|
||||
"c_cpp.configuration.default.dotConfig.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nezadá `dotConfig`, nebo hodnota, která se má vložit, pokud se v `dotConfig` nachází `${default}`",
|
||||
"c_cpp.configuration.experimentalFeatures.description": "Určuje, jestli je možné použít experimentální funkce.",
|
||||
"c_cpp.configuration.suggestSnippets.markdownDescription": "Pokud se nastaví na `true`, jazykový server poskytne fragmenty kódu.",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "Když se tato možnost povolí, kód se bude obarvovat podle IntelliSense. Toto nastavení se použije jen v případě, že možnost `#C_Cpp.intelliSenseEngine#` je nastavená na `Default`.",
|
||||
"c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": "Když se nastaví na `default`, předpokládá se, že systém souborů pracovního prostoru ve Windows nerozlišuje velká a malá písmena a v macOS nebo Linuxu rozlišuje malá a velká písmena. Když se tato možnost nastaví na `enabled`, předpokládá se, že systém souborů pracovního prostoru ve Windows rozlišuje velká a malá písmena.",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "Když se tato možnost povolí, kód se bude obarvovat podle IntelliSense. Toto nastavení se použije jen v případě, že možnost `#C_Cpp.intelliSenseEngine#` je nastavená na `default`.",
|
||||
"c_cpp.configuration.codeFolding.description": "Když se tato možnost povolí, rozsahy sbalování kódu bude poskytovat jazykový server.",
|
||||
"c_cpp.configuration.vcpkg.enabled.markdownDescription": "Povolte integrační služby pro [správce závislostí vcpkg](https://aka.ms/vcpkg/).",
|
||||
"c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Pokud existují závislosti, přidejte cesty pro zahrnuté soubory z `nan` a `node-addon-api`.",
|
||||
@@ -225,7 +246,9 @@
|
||||
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "Když se nastaví na `true`, nahrazování příkazů shellu ladicího programu bude používat starou verzi obrácené čárky ``(`)``.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "V nastaveních argumentu kompilátoru povolte chování starší verze než 1.10.0 pro zpracování escapování shellu. Počínaje verzí 1.10.0 se escapování shellu v polích argumentů ve výchozím nastavení neočekává ani nepodporuje.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "Toto nastavení je dočasné, aby podporovalo přechod na opravené chování ve verzi 1.10.0.",
|
||||
"c_cpp.configuration.sshTargetsView.description": "Určuje, jestli je zobrazení Cílů SSH viditelné. Ve výchozím nastavení povolte zobrazení při vyvolání příkazu SSH.",
|
||||
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: výsledky jiných odkazů",
|
||||
"c_cpp.contributes.views.sshTargetsView.title": "Cpptools: cíle SSH",
|
||||
"c_cpp.contributes.viewsWelcome.contents": "Další informace o launch.json najdete tady: [konfigurace C/C++ ladění](https://code.visualstudio.com/docs/cpp/launch-json-reference).",
|
||||
"c_cpp.configuration.debugShortcut.description": "Zobrazit tlačítko pro přehrávání Spustit a ladit a ozubené kolečko Přidat konfiguraci ladění v záhlaví editoru pro soubory C++.",
|
||||
"c_cpp.debuggers.pipeTransport.description": "Pokud je k dispozici, předá ladicímu programu informaci, aby se připojil ke vzdálenému počítači pomocí dalšího spustitelného souboru jako kanál, který bude přenášet standardní vstup a výstup mezi nástrojem VS Code a spustitelným souborem back-endu ladicího programu s podporou MI (třeba gdb).",
|
||||
@@ -270,6 +293,7 @@
|
||||
"c_cpp.debuggers.miDebuggerPath.description": "Cesta k ladicímu programu MI (třeba gdb). Pokud se nezadá, vyhledá se pro ladicí program nejdříve cesta.",
|
||||
"c_cpp.debuggers.miDebuggerArgs.description": "Další argumenty pro ladicí program MI (třeba gdb)",
|
||||
"c_cpp.debuggers.miDebuggerServerAddress.description": "Síťová adresa MI Debugger Serveru, ke kterému se má připojit (příklad: localhost:1234)",
|
||||
"c_cpp.debuggers.useExtendedRemote.description": "Připojení k serveru ladicího programu MI přes cílový rozšířený vzdálený režim.",
|
||||
"c_cpp.debuggers.stopAtEntry.description": "Nepovinný parametr. Když se nastaví na true, ladicí program by se měl zastavit u vstupního bodu cíle. Pokud se předá processId, nemá parametr žádný vliv.",
|
||||
"c_cpp.debuggers.debugServerPath.description": "Volitelná úplná cesta k ladicímu serveru, který se má spustit. Výchozí hodnota je null. Používá se ve spojení buď s miDebugServerAddress, nebo s vlastním serverem s customSetupCommand, na kterém běží \"-target-select remote <server:port>\".",
|
||||
"c_cpp.debuggers.debugServerArgs.description": "Volitelné argumenty ladicího serveru. Výchozí hodnota je null.",
|
||||
@@ -299,6 +323,37 @@
|
||||
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicitní řízení chování zarážek hardwaru pro vzdálené cíle.",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.require.description": "Pokud je hodnota true, vždy používejte hardwarové zarážky. Výchozí hodnota je false.",
|
||||
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Volitelný limit počtu dostupných hardwarových zarážek, které se mají použít. Vynucuje se jenom v případě, že hodnota \"require\" je true a \"limit\" je větší než 0. Výchozí hodnota je 0.",
|
||||
"c_cpp.debuggers.variables.description": "Proměnná pro rekurzivní nahrazování v této konfiguraci spuštění. Každá proměnná může odkazovat na jiné proměnné.",
|
||||
"c_cpp.debuggers.variables.properties.description": "Proměnná pro rekurzivní nahrazování v této konfiguraci spuštění. Hodnota může odkazovat na jiné proměnné.",
|
||||
"c_cpp.debuggers.host.description": "Informace o hostiteli.",
|
||||
"c_cpp.debuggers.host.user.description": "Uživatel se přihlašuje k hostiteli.",
|
||||
"c_cpp.debuggers.host.hostName.description": "Název hostitele.",
|
||||
"c_cpp.debuggers.host.port.description": "Port SSH na hostiteli. Výchozí hodnota je 22.",
|
||||
"c_cpp.debuggers.host.jumpHost.description": "Připojte se k cílovému hostiteli tak, že nejdříve vytvoříte připojení k hostitelům přeskakování.",
|
||||
"c_cpp.debuggers.host.localForward.description": "Přesměrovat připojení k danému portu TCP nebo soketu Unixu na místním (klientském) hostiteli na daného hostitele a port nebo soket Unix na vzdálené straně",
|
||||
"c_cpp.debuggers.host.localForward.bindAddress.description": "Místní adresa",
|
||||
"c_cpp.debuggers.host.localForward.port.description": "Místní port",
|
||||
"c_cpp.debuggers.host.localForward.host.description": "Název hostitele",
|
||||
"c_cpp.debuggers.host.localForward.hostPort.description": "Port hostitele",
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "Místní soket",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "Vzdálený soket",
|
||||
"c_cpp.debuggers.deploySteps.description": "Kroky potřebné k nasazení aplikace. Pořadí je důležité.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.description": "Zkopírujte soubory pomocí spojovacího bodu služby nebo rsync.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.files.description": "Soubory, které se mají zkopírovat Podporuje vzor cesty.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "Cílový adresář.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.recursive.description": "Při hodnotě true kopíruje složky rekurzivně.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "Volitelná úplná cesta k SCP. Předpokládá, že SCP je na cestě PATH, pokud není zadané",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "Volitelná úplná cesta k rsync Předpokládá, že rsync je v CESTĚ, pokud není zadané.",
|
||||
"c_cpp.debuggers.deploySteps.debug": "Při hodnotě true přeskočte při spuštění bez ladění. Pokud je hodnota false, přeskočte při spuštění ladění. Pokud není definováno, nikdy nepřeskakujte.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.description": "Krok příkazu SSH.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.command.description": "Příkaz, který se má provést přes SSH. Příkaz za znakem -c v příkazu SSH.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.sshPath.description": "Volitelná úplná cesta k SSH. Předpokládá, že SSH je na cestě PATH, pokud není zadané",
|
||||
"c_cpp.debuggers.deploySteps.continueOn.description": "Nepovinný vzor dokončení při výstupu. Pokud je tento vzor zaznamenán při výstupu, pokračujte v nasazování procedur bez ohledu na to, zda se tento krok vrátí.",
|
||||
"c_cpp.debuggers.deploySteps.shell.description": "Krok příkazu prostředí.",
|
||||
"c_cpp.debuggers.deploySteps.shell.command.description": "Příkaz prostředí, který se má provést.",
|
||||
"c_cpp.debuggers.vsCodeCommand.description": "Příkaz VS Code, který má být vyvolán. Může to být příkaz v VS Code nebo v aktivním rozšíření.",
|
||||
"c_cpp.debuggers.vsCodeCommand.command.description": "Příkaz VS Code, který má být vyvolán.",
|
||||
"c_cpp.debuggers.vsCodeCommand.args.description": "Argumenty příkazu VS Code.",
|
||||
"c_cpp.taskDefinitions.name.description": "Název úlohy.",
|
||||
"c_cpp.taskDefinitions.command.description": "Cesta ke kompilátoru nebo skriptu, který provádí kompilaci.",
|
||||
"c_cpp.taskDefinitions.args.description": "Další argumenty, které se mají předat kompilátoru nebo kompilačnímu skriptu.",
|
||||
@@ -309,6 +364,7 @@
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Cesta ke zdrojovému souboru, který se použije v editoru",
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "False, pokud se tato položka používá jen k mapování umístění bloku zásobníku. True, pokud se tato entita má použít i při zadávání umístění zarážek",
|
||||
"c_cpp.debuggers.symbolOptions.description": "Možnosti kontroly způsobu, jakým se hledají a načítají symboly (soubory .pdb).",
|
||||
"c_cpp.debuggers.unknownBreakpointHandling.description": "Určuje, jak se mají zarážky nastavené externě (obvykle prostřednictvím nezpracovaných příkazů GDB) zpracovávat při průchodu.\nPovolené hodnoty jsou throw, která se chová, jako by aplikace vyvolala výjimku, a stop, která pouze pozastaví ladicí relaci. Výchozí hodnota je throw.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.description": "Poskytuje konfiguraci pro vyhledávání a načítání symbolů do ladicího adaptéru.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Pole adres URL serveru symbolů (například: http://MyExampleSymbolServer) nebo adresářů (například: /build/symbols) k vyhledávání souborů .pdb. Tyto adresáře budou prohledány kromě výchozích umístění – vedle modulu a cesty, kam byl soubor pdb původně přemístěn.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchMicrosoftSymbolServer.description": "Pokud je hodnota true, přidá se do cesty pro hledání symbolů server symbolů pro produkty Microsoft (https://msdl.microsoft.com/download/symbols). Pokud tato možnost není zadaná, výchozí hodnota je false.",
|
||||
|
||||
@@ -4,9 +4,12 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.pipetransport": "Zvolená konfigurace ladění neobsahuje {0}.",
|
||||
"debugger.path.and.server.address.required": "{0} v konfiguraci ladění vyžaduje {1} a {2}",
|
||||
"no.pipetransport.useextendedremote": "Zvolená konfigurace ladění neobsahuje {0} nebo {1}",
|
||||
"select.process.attach": "Vyberte proces, ke kterému se má program připojit.",
|
||||
"process.not.selected": "Proces se nevybral.",
|
||||
"pipe.failed": "Operaci přenosu přes kanál se nepovedlo získat operační systém a procesy.",
|
||||
"no.process.list": "Operaci připojení přenosu se nepovedlo získat seznam procesů."
|
||||
"no.process.list": "Operaci připojení přenosu se nepovedlo získat seznam procesů.",
|
||||
"failed.to.make.gdb.connection": "Nepodařilo se vytvořit připojení GDB: {0}.",
|
||||
"failed.to.parse.processes": "Nepodařilo se parsovat procesy: {0}."
|
||||
}
|
||||
@@ -11,7 +11,11 @@
|
||||
"lldb.framework.install.xcode": "Další informace",
|
||||
"lldb.framework.not.found": "Nepovedlo se najít LLDB.framework pro lldb-mi. Nainstalujte prosím XCode nebo jeho nástroje příkazového řádku.",
|
||||
"debugger.launchConfig": "Spustit konfiguraci:",
|
||||
"vs.code.1.69+.required": "DeploySteps vyžaduje VS Code 1.69+.",
|
||||
"running.deploy.steps": "Spouští se kroky nasazení...",
|
||||
"compiler.path.not.exists": "Nepovedlo se najít {0}. Úloha {1} se ignoruje.",
|
||||
"pre.Launch.Task": "preLaunchTask: {0}",
|
||||
"debugger.path.not.exists": "Nepovedlo se najít ladicí program {0}. Konfigurace ladění pro {1} se ignoruje.",
|
||||
"build.and.debug.active.file": "sestavit a ladit aktivní soubor",
|
||||
"cl.exe.not.available": "Sestavení a ladění {0} je k dispozici jen v případě, že se nástroj VS Code spustil z nástroje Developer Command Prompt pro VS.",
|
||||
"lldb.find.failed": "Chybí závislosti {0} pro spustitelný soubor lldb-mi.",
|
||||
@@ -29,6 +33,12 @@
|
||||
"cannot.build.non.cpp": "Sestavení a ladění není možné, protože aktivní soubor není zdrojový soubor jazyka C ani C++.",
|
||||
"no.compiler.found": "Nenašel se žádný kompilátor.",
|
||||
"select.debug.configuration": "Vyberte konfiguraci ladění",
|
||||
"command.args.must.be.array": "Argumenty v kroku nasazení příkazu musí být pole.",
|
||||
"missing.properties.copyFile": "V {0} krocích se vyžadují „host“, „files“ a „targetDir“.",
|
||||
"incorrect.files.type.copyFile": "„files“ musí být řetězec nebo pole řetězců v {0} krocích.",
|
||||
"missing.properties.ssh": "Pro kroky ssh se vyžadují \"host\" a \"command\".",
|
||||
"missing.properties.shell": "Pro kroky prostředí se vyžaduje příkaz command.",
|
||||
"deploy.step.type.not.supported": "Typ kroku nasazení{0}se nepodporuje.",
|
||||
"unexpected.os": "Neočekávaný typ operačního systému",
|
||||
"path.to.pipe.program": "úplná cesta k programu kanálu, třeba {0}",
|
||||
"enable.pretty.printing": "Povolit přehledný výpis pro {0}",
|
||||
|
||||
@@ -4,5 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"add.debug.configuration.not.available.for.single.file": "Přidání konfigurace ladění není k dispozici pro jeden soubor."
|
||||
"add.debug.configuration.not.available.for.single.file": "Přidání konfigurace ladění není k dispozici pro jeden soubor.",
|
||||
"cannot.modify.config.file": "Konfigurační soubor SSH nelze změnit, protože došlo k chybě parsování {0}.",
|
||||
"no.valid.ssh.config.file": "Nenašel se žádný platný konfigurační soubor SSH.",
|
||||
"enter.ssh.target.name": "Zadejte název cíle SSH.",
|
||||
"ssh.target.name.place.holder": "Příklad: mySSHTarget",
|
||||
"enter.ssh.connection.command": "Zadejte příkaz připojení SSH.",
|
||||
"ssh.connection.command.place.holder": "Příklad: ssh [email protected] -A",
|
||||
"select.ssh.config.file": "Vyberte konfigurační soubor SSH.",
|
||||
"yes": "Ano",
|
||||
"no": "Ne",
|
||||
"ssh.target.delete.confirmation": "Opravdu chcete„{0}“ trvale odstranit?"
|
||||
}
|
||||
@@ -4,16 +4,6 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "Opravit všechny problémy s analýzou kódu",
|
||||
"clear_all_code_analysis_problems": "Vymazat všechny problémy s analýzou kódu",
|
||||
"c.cpp.debug.protocol": "Protokol ladění C/C++",
|
||||
"c.cpp.warnings": "Upozornění konfigurace C/C++",
|
||||
"fix_all_type_problems": "Opravit všechny problémy {0}",
|
||||
"disable_all_type_problems": "Zakázat všechny problémy {0}",
|
||||
"clear_all_type_problems": "Vymazat všechny problémy {0}",
|
||||
"clear_this_problem": "Vymazat tento problém {0}",
|
||||
"fix_this_problem": "Opravit tento problém {0}",
|
||||
"show_documentation_for": "Zobrazit dokumentaci pro {0}",
|
||||
"unable.to.start": "Nepovedlo se spustit jazykový server C/C++. Funkce IntelliSense se zakážou. Chyba: {0}",
|
||||
"check.permissions": "EPERM: Zkontrolujte oprávnění pro {0}.",
|
||||
"server.crashed2": "Jazykový server se 5krát za poslední 3 minuty chybově ukončil. Nebude se restartovat.",
|
||||
@@ -23,7 +13,6 @@
|
||||
"allow.button": "Povolit",
|
||||
"dont.allow.button": "Nepovolit",
|
||||
"ask.me.later.button": "Požádat později",
|
||||
"c.cpp.diagnostics": "Diagnostika C/C++",
|
||||
"dismiss.button": "Zrušit",
|
||||
"diable.warnings.button": "Zakázat upozornění",
|
||||
"unable.to.provide.configuration": "{0} nemůže poskytnout informace pro konfiguraci IntelliSense pro {1}. Místo nich se použijí nastavení z konfigurace {2}.",
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"fix_all_code_analysis_problems": "Opravit všechny problémy s analýzou kódu",
|
||||
"clear_all_code_analysis_problems": "Vymazat všechny problémy s analýzou kódu",
|
||||
"fix_all_type_problems": "Opravit všechny problémy {0}",
|
||||
"disable_all_type_problems": "Zakázat všechny problémy {0}",
|
||||
"clear_all_type_problems": "Vymazat všechny problémy {0}",
|
||||
"clear_this_problem": "Vymazat tento problém {0}",
|
||||
"fix_this_problem": "Opravit tento problém {0}",
|
||||
"show_documentation_for": "Zobrazit dokumentaci pro {0}"
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "Jak nainstalovat knihovnu pro tuto hlavičku pomocí vcpkg",
|
||||
"copy.vcpkg.command": "Zkopírovat příkaz vcpkg pro instalaci {0} do schránky",
|
||||
"on.disabled.command": "Příkazy související s IntelliSense se nedají spustit, když je `C_Cpp.intelliSenseEngine` nastavené na `disabled`.",
|
||||
"client.not.found": "klient se nenašel",
|
||||
"configuration.select.first": "Pokud chcete vybrat konfiguraci, otevřete nejdříve složku.",
|
||||
"configuration.provider.select.first": "Pokud chcete vybrat poskytovatele konfigurace, otevřete nejdříve složku.",
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.symbolscope.separator": "{0}, {1}"
|
||||
}
|
||||
@@ -4,5 +4,5 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"editorconfig.default.behavior": "Formátování kódu používá nastavení z .editorconfig namísto .clang-format. Další informace najdete v dokumentaci k hodnotě 'Default' v nastavení 'C_Cpp.formatting'."
|
||||
"editorconfig.default.behavior": "Formátování kódu používá nastavení z .editorconfig namísto .clang-format. Další informace najdete v dokumentaci k hodnotě 'default' v nastavení 'C_Cpp.formatting'."
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"no.ssh.targets": "Žádné cíle SSH",
|
||||
"active.ssh.target.selection.cancelled": "Aktivní výběr cíle SSH byl zrušen.",
|
||||
"add.new.ssh.target": "{0} Přidat nový cíl SSH...",
|
||||
"select.ssh.target": "Vyberte cíl SSH."
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"ssh.target.active.description": "[Aktivní]"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user