Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7c2cc869a | ||
|
|
79c8d1d64a | ||
|
|
a397a4731a | ||
|
|
1a3afd10fc | ||
|
|
01a747ad35 | ||
|
|
c8cbf6c0ba | ||
|
|
07efeb4c6c | ||
|
|
3555e2f1ab | ||
|
|
cf2ebd75fe | ||
|
|
ac74b5b6a3 | ||
|
|
c22c28d0c6 | ||
|
|
4abec441f9 | ||
|
|
8e23df99d8 | ||
|
|
abe65b5879 | ||
|
|
7fec8ba15f | ||
|
|
24f5fdd122 | ||
|
|
6a063be33f | ||
|
|
150c7aaf84 | ||
|
|
c549c07fa6 | ||
|
|
340c00dc92 | ||
|
|
53b6bb29ec | ||
|
|
ed51a08388 | ||
|
|
140eb83f73 | ||
|
|
f1d9211b92 | ||
|
|
64b429c9a0 | ||
|
|
8a81837bd4 | ||
|
|
716979e1e3 | ||
|
|
117ec80611 | ||
|
|
6379d6e799 | ||
|
|
373e7face5 | ||
|
|
50eb6f94dd | ||
|
|
801c8dd5d4 | ||
|
|
27abc63d1c | ||
|
|
0a23125ae5 | ||
|
|
e8a33ff410 | ||
|
|
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 | ||
|
|
093757d182 | ||
|
|
a51209e051 | ||
|
|
4f86df6fa2 | ||
|
|
479368da95 | ||
|
|
ddc3857e36 | ||
|
|
c846e8106d | ||
|
|
68c9cb9236 | ||
|
|
2afbce5b28 | ||
|
|
d6574c6d3f | ||
|
|
886d3c58e9 | ||
|
|
0445fc4207 |
@@ -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
+5788
-416
File diff suppressed because it is too large
Load Diff
@@ -11,14 +11,35 @@
|
||||
"author": "",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.1",
|
||||
"@actions/github": "^2.1.1",
|
||||
"axios": "^0.21.4"
|
||||
},
|
||||
"resolutions": {
|
||||
"follow-redirects": "1.14.7"
|
||||
"@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"
|
||||
|
||||
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"
|
||||
|
||||
+94
-3
@@ -1,5 +1,96 @@
|
||||
# C/C++ for Visual Studio Code Changelog
|
||||
|
||||
## Version 1.13.9: January 4, 2023
|
||||
### Bug Fix
|
||||
* Fix clang-format and clang-tidy not working for macOS 11 arm64. [#10282](https://github.com/microsoft/vscode-cpptools/issues/10282)
|
||||
|
||||
## Version 1.13.8: December 15, 2022
|
||||
### Bug Fixes
|
||||
* Fix tag parser failure on machines with multiple extension users. [#10224](https://github.com/microsoft/vscode-cpptools/issues/10224)
|
||||
* Fix a `--using_directory` IntelliSense error if LIBPATH is defined with non-msvc IntelliSense modes. [#10249](https://github.com/microsoft/vscode-cpptools/issues/10249)
|
||||
* Fix a crash when the configuration name is missing. [#10251](https://github.com/microsoft/vscode-cpptools/issues/10251)
|
||||
|
||||
## Version 1.13.7: December 8, 2022
|
||||
### Bug Fix
|
||||
* Fix `files.associations` not working. [#10244](https://github.com/microsoft/vscode-cpptools/issues/10244)
|
||||
|
||||
## Version 1.13.6: December 6, 2022
|
||||
### New Features
|
||||
* Add the ability to generate definitions from declarations and vice versa. [#664](https://github.com/microsoft/vscode-cpptools/issues/664)
|
||||
* Add SSH Target Selector. [PR #9760](https://github.com/microsoft/vscode-cpptools/pull/9760)
|
||||
* Add 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 sections to settings. [#8237](https://github.com/microsoft/vscode-cpptools/issues/8237)
|
||||
* Make Doxygen hover comments customizable with `C_Cpp.doxygen.sectionTags`. [#8525](https://github.com/microsoft/vscode-cpptools/issues/8525)
|
||||
* 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)
|
||||
* 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)
|
||||
* Check for MSVC environment variables for configuring IntelliSense. [#9745](https://github.com/microsoft/vscode-cpptools/issues/9745)
|
||||
* Enable the inlay hint settings to be set per-workspace folder. [#9782](https://github.com/microsoft/vscode-cpptools/issues/9782)
|
||||
* 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)
|
||||
* 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)
|
||||
* Make array settings give a warning for duplicates. [PR #9959](https://github.com/microsoft/vscode-cpptools/pull/9959)
|
||||
* Add "iar" and "armcc5" problem matchers. [#10054](https://github.com/microsoft/vscode-cpptools/issues/10054)
|
||||
* Michael (@morsisko) [PR #10085](https://github.com/microsoft/vscode-cpptools/pull/10085), [PR #10101](https://github.com/microsoft/vscode-cpptools/pull/10101)
|
||||
* Pass `--Wno-error=unknown` to clang-format (12 or newer) to avoid failing on unsupported settings. [#10072](https://github.com/microsoft/vscode-cpptools/issues/10072)
|
||||
* Add support for `/cygdrive` paths returned by some versions of Cygwin. [#10112](https://github.com/microsoft/vscode-cpptools/issues/10112)
|
||||
* Switch from RapidJSON to VS's internal JSON parser.
|
||||
|
||||
### Bug Fixes
|
||||
* Fix "final" breaking formatting. [#6638](https://github.com/microsoft/vscode-cpptools/issues/6638)
|
||||
* Fix incorrect "expected concept name" IntelliSense error. [#6876](https://github.com/microsoft/vscode-cpptools/issues/6876)
|
||||
* Fix incorrect Outline view with C++20 namespace ::inline syntax. [#7216](https://github.com/microsoft/vscode-cpptools/issues/7216)
|
||||
* Fix updates to compile_commands.json not being handled if specified using a relative path. [#7610](https://github.com/microsoft/vscode-cpptools/issues/7610)
|
||||
* Fix variadic macros not expanding correctly. [#8178](https://github.com/microsoft/vscode-cpptools/issues/8178)
|
||||
* 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 IntelliSense bug "A result type of `__builtin_choose_expr` that returns a pointer to a function is not correctly inferred in clang mode". [#9368](https://github.com/microsoft/vscode-cpptools/issues/9368)
|
||||
* Fix some invalid macro redefinition errors. [#9435](https://github.com/microsoft/vscode-cpptools/issues/9435)
|
||||
* 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 the position of inlay parameter hints when using at or operator[]. [#9741](https://github.com/microsoft/vscode-cpptools/issues/9741)
|
||||
* Fix `-std=` being passed to clang-tidy in certain cases . [#9776](https://github.com/microsoft/vscode-cpptools/issues/9776)
|
||||
* Fix `${workspaceFolder}` not being resolved in `C_Cpp.clang_format_style`. [#9786](https://github.com/microsoft/vscode-cpptools/issues/9786)
|
||||
* Fix debugger visualization for ArrayItem elements more than 1000. [#9801](https://github.com/microsoft/vscode-cpptools/issues/9801)
|
||||
* Fix extra comma in the generated the `(gdb) attach` configuration in `launch.json`. [#9818](https://github.com/microsoft/vscode-cpptools/issues/9818)
|
||||
* 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)
|
||||
* 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 code analysis errors related to SSE being enabled when gcc is used. [#9898](https://github.com/microsoft/vscode-cpptools/issues/9898)
|
||||
* Fix issue with parsing SSH configurations that could cause the extension to fail to activate. [#9933](https://github.com/microsoft/vscode-cpptools/pull/9933)
|
||||
* 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)
|
||||
* Fix "Step Over past a logpoint stops at the wrong place". [#9995](https://github.com/microsoft/vscode-cpptools/issues/9995)
|
||||
* Disable the "Generate Doxygen Comment" context menu when IntelliSense is disabled. [PR #10007](https://github.com/microsoft/vscode-cpptools/pull/10007)
|
||||
* Fix Doxygen code action from appearing on a function that already has a `*/` comment. [#10009](https://github.com/microsoft/vscode-cpptools/issues/10009)
|
||||
* 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 Doxygen comment generation when there's a selection. [#10028](https://github.com/microsoft/vscode-cpptools/issues/10028)
|
||||
* Fix issue that could cause document corruption. [#10035](https://github.com/microsoft/vscode-cpptools/issues/10035)
|
||||
* Fixed crash on Linux/Mac when a full command line is specified in `compilerPath` containing invalid arguments. [PR #10070](https://github.com/microsoft/vscode-cpptools/pull/10070)
|
||||
* Fix random "Failed to spawn IntelliSense process: 65520" on Mac. [#10091](https://github.com/microsoft/vscode-cpptools/issues/10091)
|
||||
* Fix debugger throwing error "stdout maxBuffer exceeded". [10107](https://github.com/microsoft/vscode-cpptools/issues/10107)
|
||||
* Fix "Can't attach to process on Windows: Unexpected token \ in JSON". [#10108](https://github.com/microsoft/vscode-cpptools/issues/10108)
|
||||
* Fix "Don't hardcode path to kill in UnixUtilities". [#10124](https://github.com/microsoft/vscode-cpptools/issues/10124)
|
||||
* Ellie Hermaszewska (@expipiplus1) [PR #1373](https://github.com/microsoft/MIEngine/pull/1373)
|
||||
* Fix formatting when clang-format 11 or earlier is used (and another issue for version 8 or earlier). [#10178](https://github.com/microsoft/vscode-cpptools/issues/10178)
|
||||
* Fix "Natvis: are multi-dimensional arrays supported in gdb natvis?". [MIEngine#980](https://github.com/microsoft/MIEngine/issues/980)
|
||||
* Fix include completion sorting extensionless headers (e.g. string) after headers with an extension (e.g. string.h).
|
||||
* Fix extensionHost logging an error related to onWillSaveTextDocument whenever a save is done.
|
||||
* Fix random "Failed to spawn IntelliSense process" on Mac.
|
||||
* Fix a deadlock when IntelliSense errors are updating.
|
||||
* Fix redundant rescan when adding a workspace folder.
|
||||
|
||||
### Removed Feature
|
||||
* Removed explicit WSL support in favor of using the WSL extension. [PR #10066](https://github.com/microsoft/vscode-cpptools/pull/10066)
|
||||
|
||||
## Version 1.12.4: August 31, 2022
|
||||
### Other
|
||||
* Revert changes to telemetry key format. [PR #9822](https://github.com/microsoft/vscode-cpptools/pull/9822)
|
||||
@@ -742,7 +833,7 @@
|
||||
## Version 0.29.0: July 15, 2020
|
||||
### New Features
|
||||
* Add Doxygen comment support (to tooltip display of hover, completion, and signature help). [#658](https://github.com/microsoft/vscode-cpptools/issues/658)
|
||||
* The way comments are formatted is controlled by the `C_Cpp.simplifyStructuredComments` setting.
|
||||
* 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`. [PR MIEngine#1013](https://github.com/microsoft/MIEngine/pull/1013)
|
||||
@@ -1447,7 +1538,7 @@
|
||||
## Version 0.16.1: March 30, 2018
|
||||
* Fix random deadlock caused by logging code on Linux/Mac. [#1759](https://github.com/Microsoft/vscode-cpptools/issues/1759)
|
||||
* Fix compiler from `compileCommands` not being queried for includes/defines if `compilerPath` isn't set on Windows. [#1754](https://github.com/Microsoft/vscode-cpptools/issues/1754)
|
||||
* Fix OSX `UseShellExecute` I/O bug. [#1756](https://github.com/Microsoft/vscode-cpptools/issues/1756)
|
||||
* Fix OSX `UseShellExecute` I/O bug. [#1756](https://github.com/Microsoft/vscode-cpptools/issues/1756)
|
||||
* Invalidate partially unzipped files from package manager. [#1757](https://github.com/Microsoft/vscode-cpptools/issues/1757)
|
||||
|
||||
## Version 0.16.0: March 28, 2018
|
||||
@@ -1792,4 +1883,4 @@
|
||||
## Version 0.5.0: April 14, 2016
|
||||
* Usability and correctness bug fixes.
|
||||
* Simplify installation experience.
|
||||
* Usability and correctness bug fixes.
|
||||
* Usability and correctness bug fixes.
|
||||
+745
-172
File diff suppressed because it is too large
Load Diff
@@ -3467,5 +3467,13 @@
|
||||
"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ě"
|
||||
"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",
|
||||
@@ -3462,5 +3462,18 @@
|
||||
"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",
|
||||
"aufgrund eines „nicht verfügbaren“ Attributs"
|
||||
"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"
|
||||
]
|
||||
@@ -3467,5 +3467,13 @@
|
||||
"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 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"
|
||||
]
|
||||
@@ -3467,5 +3467,13 @@
|
||||
"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 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",
|
||||
@@ -3462,5 +3462,18 @@
|
||||
"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",
|
||||
"a causa di un attributo 'non disponibile'"
|
||||
"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"
|
||||
]
|
||||
@@ -3466,6 +3466,14 @@
|
||||
"IFC パーティション %sq へのインデックスを使用して、IFC パーティション %sq から要素を構築しようとしました",
|
||||
"パーティション %sq は、%d2 が予期されたときにエントリ サイズを %d1 として指定しました",
|
||||
"モジュール %sq1 の処理中に予期しない IFC 要件が発生しました",
|
||||
null,
|
||||
"アトミック制約は、それ自体に依存します"
|
||||
"条件が行 %d で失敗しました (%s1: %sq2)",
|
||||
"アトミック制約は、それ自体に依存します",
|
||||
"'noreturn' 関数に void 以外の戻り値の型があります",
|
||||
"パラメーター %sq (相対インデックス %d) を削除することで修正が行われています",
|
||||
"エンティティの再構築中に無効な IFC 識別子名 %sq が見つかりました",
|
||||
"エンティティの再構築中に %sq と命名された無効な IFC 識別子がスキップされました",
|
||||
"モジュール %sq は無効な並べ替え値です",
|
||||
"IFC モジュールから読み込まれた関数テンプレートが誤って %nd として解析されました",
|
||||
"モジュール %sq で IFC エンティティ参照を読み込めませんでした",
|
||||
"IFC インデックスの並べ替え = %d1、値 = %d2"
|
||||
]
|
||||
@@ -3466,6 +3466,14 @@
|
||||
"IFC 파티션 %sq에 대한 인덱스를 사용하여 IFC 파티션 %sq에서 요소를 구성하려고 했습니다.",
|
||||
"파티션 %sq는 %d2가 예상될 때 항목 크기를 %d1로 지정했습니다.",
|
||||
"모듈 %sq1을(를) 처리하는 동안 예기치 않은 IFC 요구 사항이 발생했습니다.",
|
||||
null,
|
||||
"원자성 제약 조건은 자체에 따라 달라집니다."
|
||||
"%d행(%s1)에서 조건 실패: %sq2",
|
||||
"원자성 제약 조건은 자체에 따라 달라집니다.",
|
||||
"'noreturn' 함수에 void가 아닌 반환 형식이 있습니다.",
|
||||
"매개 변수 %sq(상대 인덱스 %d)를 삭제하여 수정했습니다.",
|
||||
"엔터티를 재구성하는 동안 %sq라는 잘못된 IFC 식별자를 발견했습니다.",
|
||||
"엔티티를 재구성하는 동안 %sq라는 잘못된 IFC 식별자를 건너뛰었습니다.",
|
||||
"모듈 %sq 잘못된 정렬 값",
|
||||
"IFC 모듈에서 로드된 함수 템플릿이 %nd(으)로 잘못 구문 분석되었습니다.",
|
||||
"모듈 %sq에서 IFC 엔터티 참조를 로드하지 못했습니다.",
|
||||
"IFC 인덱스 정렬 = %d1, 값 = %d2"
|
||||
]
|
||||
@@ -3467,5 +3467,13 @@
|
||||
"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"
|
||||
"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"
|
||||
]
|
||||
@@ -3467,5 +3467,13 @@
|
||||
"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"
|
||||
"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"
|
||||
]
|
||||
@@ -3467,5 +3467,13 @@
|
||||
"раздел %sq указал размер своей записи как %d1, в то время как ожидалось %d2",
|
||||
"При обработке модуля %sq1 было обнаружено неожиданное требование IFC",
|
||||
"сбой условия в строке %d в %s1: %sq2",
|
||||
"атомарное ограничение зависит от самого себя"
|
||||
"атомарное ограничение зависит от самого себя",
|
||||
"Функция \"noreturn\" имеет не недействительный тип возврата",
|
||||
"исправление внесено путем удаления параметра %sq (по относительному индексу %d)",
|
||||
"обнаружено недопустимое имя идентификатора IFC %sq во время реконструкции сущности",
|
||||
"недопустимое имя идентификатора IFC %sq пропущено во время реконструкции сущности",
|
||||
"недопустимое значение сортировки модуля %sq",
|
||||
"шаблон функции, загруженный из модуля IFC, был неправильно проанализирован как %nd",
|
||||
"не удалось загрузить ссылку на объект IFC в модуль %sq",
|
||||
"Сортировка индекса IFC = %d1, значение = %d2"
|
||||
]
|
||||
@@ -3466,6 +3466,14 @@
|
||||
"%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ı",
|
||||
null,
|
||||
"atomik kısıtlama kendisine bağımlı"
|
||||
"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"
|
||||
]
|
||||
@@ -3464,8 +3464,16 @@
|
||||
"尚未实现 “requires” 表达式的变量名压缩",
|
||||
"因为“不可用”属性",
|
||||
"已尝试使用索引将一个元素从 IFC 分区 %sq 构造到 IFC 分区 %sq",
|
||||
null,
|
||||
"分区 %sq 将其条目大小指定为 %d1,正确的大小为 %d2",
|
||||
"处理模块 %sq1 时遇到意外的 IFC 要求",
|
||||
null,
|
||||
"原子约束依赖于自身"
|
||||
"条件失败,行 %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 上視覺類似的識別碼混淆",
|
||||
@@ -3462,5 +3462,18 @@
|
||||
"向量條件 (%t1) 的元素類型大小必須與結果的元素類型相同 (%t2)",
|
||||
"浮點向量運算元類型 (%t) 沒有相符的整數向量類型",
|
||||
"尚未實作 'requires' 運算式的重整",
|
||||
"因為 'unavailable' 屬性"
|
||||
"因為 '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
|
||||
}
|
||||
|
||||
@@ -34,6 +34,14 @@
|
||||
"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` (空)使用系统的空闲内存。",
|
||||
@@ -45,18 +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.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.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` 的文件。",
|
||||
@@ -157,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 提供程序。",
|
||||
@@ -165,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 引擎检测到的可疑编译错误报告回编辑器。还控制是否报告代码分析警告(如果找不到包含)。标记分析器引擎将忽略此设置。",
|
||||
@@ -191,6 +199,7 @@
|
||||
"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 键时要插入到下一行的文本。",
|
||||
@@ -224,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)之间中继标准输入/输入。",
|
||||
@@ -326,10 +338,12 @@
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "本地套接字",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "远程套接字",
|
||||
"c_cpp.debuggers.deploySteps.description": "部署应用程序所需的步骤。顺序很重要。",
|
||||
"c_cpp.debuggers.deploySteps.scp.description": "使用 SCP 复制文件。",
|
||||
"c_cpp.debuggers.deploySteps.scp.files.description": "要通过 SCP 复制的文件。支持路径模式。",
|
||||
"c_cpp.debuggers.deploySteps.scp.targetDir.description": "目标目录。",
|
||||
"c_cpp.debuggers.deploySteps.scp.scpPath.description": "SCP 的可选完整路径。假定 SCP 位于 PATH 上(如果未指定)",
|
||||
"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\" 后面的命令。",
|
||||
@@ -350,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\"。",
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"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}”。",
|
||||
@@ -32,8 +34,8 @@
|
||||
"no.compiler.found": "未找到编译程序",
|
||||
"select.debug.configuration": "选择调试配置",
|
||||
"command.args.must.be.array": "命令部署步骤中的 \"args\" 必须为数组。",
|
||||
"missing.properties.scp": "scp 步骤中需要 \"host\"、\"files\" 和 \"targetDir\"。",
|
||||
"incorrect.files.type.scp": "\"files\" 必须为 scp 步骤中的字符串或字符串数组。",
|
||||
"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}。",
|
||||
|
||||
@@ -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}”?"
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "了解如何使用 vcpkg 为此标头安装库",
|
||||
"copy.vcpkg.command": "将用于安装“{0}”的 vcpkg 命令复制到剪贴板",
|
||||
"on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `Disabled` 时,无法执行与 IntelliSense 相关的命令。",
|
||||
"on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `disabled` 时,无法执行与 IntelliSense 相关的命令。",
|
||||
"client.not.found": "未找到客户端",
|
||||
"configuration.select.first": "首先打开一个文件夹以选择配置",
|
||||
"configuration.provider.select.first": "首先打开一个文件夹以选择配置提供程序",
|
||||
|
||||
@@ -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,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}。"
|
||||
}
|
||||
@@ -13,6 +13,5 @@
|
||||
"warning.file.missing": "警告: 缺少预期的文件 {0}。",
|
||||
"warning.debugging.not.tested": "警告: 尚未为此平台测试调试。",
|
||||
"reload.workspace.for.changes": "重新加载工作区以使设置更改生效。",
|
||||
"reload.string": "重新加载",
|
||||
"invalid.download.location.received": "接收的下载位置无效"
|
||||
"reload.string": "重新加载"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// 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++ 配置警告"
|
||||
}
|
||||
@@ -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}”",
|
||||
|
||||
+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}中进行调试。"
|
||||
}
|
||||
@@ -34,6 +34,14 @@
|
||||
"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` (空白) 會使用系統的可用記憶體。",
|
||||
@@ -157,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 提供者。",
|
||||
@@ -165,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 引擎偵測到的可疑編譯錯誤回報給編輯器。其也會在找不到內容時,控制是否回報程式碼分析警告。標籤剖析器引擎已忽略此設定。",
|
||||
@@ -191,6 +199,7 @@
|
||||
"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 時,將在下一行插入的文字。",
|
||||
@@ -224,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/) 的整合服務。",
|
||||
@@ -236,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)。",
|
||||
@@ -326,10 +338,12 @@
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "本機通訊端",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "遠端通訊端",
|
||||
"c_cpp.debuggers.deploySteps.description": "部署應用程式所需的步驟。順序很重要。",
|
||||
"c_cpp.debuggers.deploySteps.scp.description": "使用 SCP 複製檔案。",
|
||||
"c_cpp.debuggers.deploySteps.scp.files.description": "要透過 SCP 複製的檔案。支援路徑模式。",
|
||||
"c_cpp.debuggers.deploySteps.scp.targetDir.description": "目標目錄。",
|
||||
"c_cpp.debuggers.deploySteps.scp.scpPath.description": "SCP 的選用完整路徑。如果未指定,則會假設 SCP 在 PATH 上",
|
||||
"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' 之後的命令。",
|
||||
@@ -350,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'。",
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"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}'。",
|
||||
@@ -32,8 +34,8 @@
|
||||
"no.compiler.found": "找不到任何編譯器",
|
||||
"select.debug.configuration": "選取偵錯設定",
|
||||
"command.args.must.be.array": "命令部署步驟中的 \"args\" 必須是陣列。",
|
||||
"missing.properties.scp": "scp 步驟中需要 \"host\"、\"files\" 和 \"targetDir\"。",
|
||||
"incorrect.files.type.scp": "\"files\" 必須是 scp 步驟中的字串或字串陣列。",
|
||||
"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}。",
|
||||
|
||||
@@ -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}\" 嗎?"
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "了解如何使用 vcpkg 安裝此標頭的程式庫",
|
||||
"copy.vcpkg.command": "將用於安裝 '{0}' 的 vcpkg 命令複製到剪貼簿",
|
||||
"on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `Disabled` 時,無法執行 IntelliSense 的相關命令。",
|
||||
"on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `disabled` 時,無法執行IntelliSense 的相關命令。",
|
||||
"client.not.found": "找不到用戶端",
|
||||
"configuration.select.first": "先開啟資料夾以選取組態",
|
||||
"configuration.provider.select.first": "先開啟資料夾以選取組態提供者",
|
||||
|
||||
@@ -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,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}。"
|
||||
}
|
||||
@@ -13,6 +13,5 @@
|
||||
"warning.file.missing": "警告: 缺少預期的檔案 {0}。",
|
||||
"warning.debugging.not.tested": "警告: 尚未針對此平台測試偵錯。",
|
||||
"reload.workspace.for.changes": "請重新載入工作區以讓設定變更生效。",
|
||||
"reload.string": "重新載入",
|
||||
"invalid.download.location.received": "收到的下載位置無效"
|
||||
"reload.string": "重新載入"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// 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++ 設定警告"
|
||||
}
|
||||
@@ -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}'",
|
||||
|
||||
+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,7 +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ář Doxygenu",
|
||||
"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.",
|
||||
@@ -157,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.",
|
||||
@@ -165,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.",
|
||||
@@ -191,6 +199,7 @@
|
||||
"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.",
|
||||
@@ -224,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`.",
|
||||
@@ -236,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).",
|
||||
@@ -326,10 +338,12 @@
|
||||
"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.scp.description": "Zkopírujte soubory pomocí spojovacího bodu SCP.",
|
||||
"c_cpp.debuggers.deploySteps.scp.files.description": "Soubory, které se mají zkopírovat přes spojovací bod SCP. Podporuje vzor cesty.",
|
||||
"c_cpp.debuggers.deploySteps.scp.targetDir.description": "Cílový adresář.",
|
||||
"c_cpp.debuggers.deploySteps.scp.scpPath.description": "Volitelná úplná cesta k SCP. Předpokládá, že SCP je na cestě PATH, pokud není zadané",
|
||||
"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.",
|
||||
@@ -350,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.",
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"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.",
|
||||
@@ -32,8 +34,8 @@
|
||||
"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.scp": "V krocích scp se vyžadují \"host\", \"files\" a \"targetDir\".",
|
||||
"incorrect.files.type.scp": "\"files\" musí být řetězec nebo pole řetězců v krocích SCP.",
|
||||
"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.",
|
||||
|
||||
@@ -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?"
|
||||
}
|
||||
@@ -6,7 +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`.",
|
||||
"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.",
|
||||
|
||||
@@ -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í]"
|
||||
}
|
||||
@@ -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": "Nepovedlo se při k {0}"
|
||||
}
|
||||
@@ -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": "Nepovedlo se parsovat konfigurační soubor SSH {0}: {1}",
|
||||
"failed.to.read.file": "Čtení souboru {0} se nezdařilo.",
|
||||
"failed.to.write.file": "Zápis do {0} souboru se nezdařil."
|
||||
}
|
||||
@@ -13,6 +13,5 @@
|
||||
"warning.file.missing": "Upozornění: Chybí očekávaný soubor {0}.",
|
||||
"warning.debugging.not.tested": "Upozornění: Ladění se pro tuto platformu netestovalo.",
|
||||
"reload.workspace.for.changes": "Načtěte pracovní prostor znovu, aby se změna nastavení projevila.",
|
||||
"reload.string": "Načíst znovu",
|
||||
"invalid.download.location.received": "Přijato neplatné umístění pro stahování"
|
||||
"reload.string": "Načíst znovu"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnostika C/C++",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protokol ladění C/C++",
|
||||
"c.cpp.warnings": "Upozornění konfigurace C/C++"
|
||||
}
|
||||
@@ -27,8 +27,8 @@
|
||||
"default_query_failed": "Nepovedlo se dotázat na výchozí cesty pro vložené soubory a direktivy define pro {0}.",
|
||||
"failed_call": "Nepovedlo se zavolat {0}.",
|
||||
"quick_info_failed": "Operace Rychlých informací neproběhla úspěšně: {0}",
|
||||
"create_intellisense_client_failed": "Nepovedlo se vytvořit klienta IntelliSense. {0}",
|
||||
"intellisense_spawn_failed": "Nepovedlo se vygenerovat proces IntelliSense:",
|
||||
"create_intellisense_client_failed": "Nepovedlo se vytvořit klienta IntelliSense: {0}",
|
||||
"intellisense_spawn_failed": "Nepovedlo se vygenerovat proces IntelliSense: {0}",
|
||||
"browse_engine_update_thread_join_failed": "Při volání browse_engine_update_thread.join() došlo k chybě: {0}",
|
||||
"already_open_different_casing": "Soubor ({0}) se v editoru už otevřel, ale s jinými velkými a malými písmeny. Funkce IntelliSense budou pro tuto kopii soubory zakázané.",
|
||||
"intellisense_client_disconnected": "Klient IntelliSense se odpojil od serveru – {0}",
|
||||
@@ -168,12 +168,32 @@
|
||||
"specialization": "+1 specializace",
|
||||
"specializations": "+tento počet specializací: %d",
|
||||
"expands_to": "Rozšiřuje se na:",
|
||||
"file_label": "Soubor:",
|
||||
"parameters_label": "Parametry:",
|
||||
"returns_label": "Vrací:",
|
||||
"attention_label": "Upozornění:",
|
||||
"author_label": "Autor:",
|
||||
"authors_label": "Autoři:",
|
||||
"bug_label": "Chyba:",
|
||||
"copyright_label": "Autorská práva:",
|
||||
"deprecated_label": "Zastaralé:",
|
||||
"date_label": "Datum:",
|
||||
"details_label": "Podrobnosti:",
|
||||
"exceptions_label": "Výjimky:",
|
||||
"invariant_label": "Invariantní:",
|
||||
"file_label": "Soubor:",
|
||||
"note_label": "Poznámka:",
|
||||
"parameters_label": "Parametry:",
|
||||
"pre_label": "Předpoklad:",
|
||||
"post_label": "Následná podmínka:",
|
||||
"remark_label": "Komentář:",
|
||||
"remarks_label": "Poznámky:",
|
||||
"result_label": "Výsledek:",
|
||||
"return_label": "Vrátit:",
|
||||
"returns_label": "Vrací:",
|
||||
"since_label": "Od:",
|
||||
"template_parameters_label": "Parametry šablony:",
|
||||
"test_label": "Test:",
|
||||
"todo_label": "TODO:",
|
||||
"version_label": "Verze:",
|
||||
"warning_label": "Upozornění:",
|
||||
"compiler_query_command_line": "Příkazový řádek sondy kompilátoru: {0}",
|
||||
"c_compiler_from_compiler_path": "Probíhá pokus o získání výchozích hodnot z kompilátoru jazyka C ve vlastnosti compilerPath: {0}",
|
||||
"cpp_compiler_from_compiler_path": "Probíhá pokus o získání výchozích hodnot z kompilátoru jazyka C++ ve vlastnosti compilerPath: {0}",
|
||||
@@ -222,5 +242,5 @@
|
||||
"file_tag": "Soubor",
|
||||
"compiler_default_language_standard_version_old": "Kompilátor vrátil standardní verzi výchozího jazyka: {0}. Protože je tato verze stará, pokusí se použít novější verzi {1} jako výchozí.",
|
||||
"unexpected_output_from_clang_tidy": "Neočekávaný výstup z clang-tidy: {0}. Očekáváno: {1}.",
|
||||
"generate_doxygen_comment": "Vygenerovat komentář Doxygenu"
|
||||
"generate_doxygen_comment": "Vygenerovat komentář Doxygen"
|
||||
}
|
||||
+10
-10
@@ -4,15 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"walkthrough.mac.title.run.and.debug.your.file": "Spuštění a ladění souboru C++ v systému Windows",
|
||||
"walkthrough.mac.run.and.debug.your.file": "Pokud chcete spustit a ladit váš soubor C++ ve VS Code:",
|
||||
"walkthrough.mac.instructions1": "Otevřete zdrojový soubor C++, který chcete spustit a ladit. Ujistěte se, že je tento soubor aktivní (aktuálně zobrazený a vybraný) v editoru.",
|
||||
"walkthrough.mac.press.f5": "Stiskněte klávesu {0}. Nebo v hlavní nabídce zvolte {1}.",
|
||||
"walkthrough.mac.run": "Spustit",
|
||||
"walkthrough.mac.start.debugging": "Spustit ladění",
|
||||
"walkthrough.mac.select.compiler": "Vyberte {0}.",
|
||||
"walkthrough.mac.choose.build.active.file": "Zvolte {0}.",
|
||||
"walkthrough.windows.title.run.and.debug.your.file": "Spuštění a ladění souboru C++ v systému Windows",
|
||||
"walkthrough.windows.run.and.debug.your.file": "Pokud chcete spustit a ladit váš soubor C++ ve VS Code:",
|
||||
"walkthrough.windows.instructions1": "Otevřete zdrojový soubor C++, který chcete spustit a ladit. Ujistěte se, že je tento soubor aktivní (aktuálně zobrazený a vybraný) v editoru.",
|
||||
"walkthrough.windows.press.f5": "Stiskněte klávesu {0}. Nebo v hlavní nabídce zvolte {1}.",
|
||||
"walkthrough.windows.run": "Spustit",
|
||||
"walkthrough.windows.start.debugging": "Spustit ladění",
|
||||
"walkthrough.windows.select.compiler": "Vyberte {0}.",
|
||||
"walkthrough.windows.choose.build.active.file": "Zvolte {0}.",
|
||||
"walkthrough.windows.build.and.debug.active.file": "Sestavit a ladit aktivní soubor",
|
||||
"walkthrough.mac.after.running": "Po prvním spuštění a ladění vašeho souboru C++ si všimnete dvou nových souborů ve složce projektu {0}: {1} a {2}.",
|
||||
"walkthrough.mac.for.more.complex": "Pro složitější scénáře sestavení a ladění můžete přizpůsobit úlohy sestavení a konfigurace ladění v {0} a {1}. Například, pokud obvykle předáváte argumenty kompilátoru při sestavování z příkazového řádku, můžete zadat tyto argumenty v {2} pomocí vlastnosti {3}. Podobně můžete definovat argumenty, které budou předány vašemu programu pro ladění v {4}."
|
||||
"walkthrough.windows.after.running": "Po prvním spuštění a ladění vašeho souboru C++ si všimnete dvou nových souborů ve složce projektu {0}: {1} a {2}.",
|
||||
"walkthrough.windows.for.more.complex": "Pro složitější scénáře sestavení a ladění můžete přizpůsobit úlohy sestavení a konfigurace ladění v {0} a {1}. Například, pokud obvykle předáváte argumenty kompilátoru při sestavování z příkazového řádku, můžete zadat tyto argumenty v {2} pomocí vlastnosti {3}. Podobně můžete definovat argumenty, které budou předány vašemu programu pro ladění v {4}."
|
||||
}
|
||||
@@ -34,6 +34,14 @@
|
||||
"c_cpp.command.BuildAndRunFile.title": "C/C++-Datei ausführen",
|
||||
"c_cpp.command.AddDebugConfiguration.title": "Debugkonfiguration hinzufügen",
|
||||
"c_cpp.command.GenerateDoxygenComment.title": "Doxygenkommentar generieren",
|
||||
"c_cpp.command.addSshTarget.title": "SSH-Ziel hinzufügen",
|
||||
"c_cpp.command.removeSshTarget.title": "SSH-Ziel entfernen",
|
||||
"c_cpp.command.setActiveSshTarget.title": "Dieses SSH-Ziel als aktives Ziel festlegen",
|
||||
"c_cpp.command.selectActiveSshTarget.title": "Wählen Sie ein aktives SSH-Ziel aus",
|
||||
"c_cpp.command.selectSshTarget.title": "SSH-Ziel auswählen",
|
||||
"c_cpp.command.activeSshTarget.title": "Aktives SSH-Ziel abrufen",
|
||||
"c_cpp.command.refreshCppSshTargetsView.title": "Aktualisieren",
|
||||
"c_cpp.command.sshTerminal.title": "Mit diesem SSH-Ziel in einem neuen Terminal verbinden",
|
||||
"c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Die maximale Anzahl gleichzeitiger Threads, die für die Sprachdienstverarbeitung verwendet werden sollen. Der Wert ist ein Hinweis und kann unter Umständen nicht immer verwendet werden. Mit dem Standardwert `null` (leer) werden doppelt so viele logische Prozessoren wie verfügbar verwendet.",
|
||||
"c_cpp.configuration.maxCachedProcesses.markdownDescription": "Die maximale Anzahl zwischengespeicherter Prozesse, die für die Sprachdienstverarbeitung verwendet werden sollen. Mit dem Standardwert `null` (leer) werden doppelt so viele logische Prozessoren wie verfügbar verwendet.",
|
||||
"c_cpp.configuration.maxMemory.markdownDescription": "Der maximale Arbeitsspeicher (in MB), der für die Sprachdienstverarbeitung verfügbar ist. Weniger Prozesse werden zwischengespeichert und gleichzeitig ausgeführt, nachdem diese Speicherauslastung überschritten wurde. Beim Standardwert `null` (leer) wird der freie Arbeitsspeicher des Systems verwendet.",
|
||||
@@ -56,7 +64,7 @@
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Zeigen Sie nur die Codeaktion „Alle löschen“ an (oder „Alle <type> löschen“, wenn nur ein Typ vorhanden ist, oder „Diese löschen“, wenn nur ein Problem vorliegt).",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Zeigen Sie die Codeaktion „Alle löschen“ (wenn mehrere Problemtypen vorhanden sind) und die Codeaktion „Alle <type> löschen“ (oder „Diese löschen“, wenn nur ein Problem für den <type> vorliegt)",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Zeigen Sie die Codeaktionen „Alle löschen“ (wenn mehrere Problemtypen vorhanden sind), „Alle <type> löschen“ (wenn mehrere Probleme für den <type> vorhanden sind) und „Diese löschen“ an.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Bei `true` wird die Formatierung in den Zeilen ausgeführt, die durch Codeaktionen vom Typ \"Korrigieren\" geändert wurden.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Bei `true` wird die Formatierung in den Zeilen ausgeführt, die durch Codeaktionen vom Typ 'Korrigieren' geändert wurden.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Bei `true` wird die Codeanalyse mit `clang-tidy` aktiviert und automatisch ausgeführt, wenn `#C_Cpp.codeAnalysis.runAutomatically#` gleich `true` (Standardeinstellung) ist.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Der vollständige Pfad der ausführbaren Datei `clang-tidy`. Wenn nicht angegeben, ist `clang-tidy` im verwendeten Umgebungspfad verfügbar. Wenn der Umgebungspfad nicht gefunden wird, wird die `clang-tidy` verwendet, die mit der Erweiterung gebündelt ist.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Gibt eine `clang-tidy`-Konfiguration im YAML-/JSON-Format an: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{Schlüssel: x, Wert: y}]}`. Wenn der Wert leer ist, versucht `clang-tidy`, eine Datei namens `.clang-tidy` für jede Quelldatei in den übergeordneten Verzeichnissen zu finden.",
|
||||
@@ -157,7 +165,7 @@
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": "Jeder Code, in dem die öffnende und schließende geschweifte Klammer in einer Zeile eingegeben wird, wird unabhängig von den Werten der Einstellungen für `C_Cpp.vcFormat.newLine.*` in einer Zeile beibehalten.",
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "Codeblöcke werden immer basierend auf den Werten der Einstellungen `C_Cpp.vcFormat.newLine.*` formatiert.",
|
||||
"c_cpp.configuration.clang_format_path.markdownDescription": "Der vollständige Pfad der ausführbaren `clang-format`-Datei. Wenn dieser nicht angegeben wird und `clang-format` im verwendeten Umgebungspfad verfügbar ist. Wenn sie nicht im Umgebungspfad gefunden wird, wird die mit der Erweiterung gebündelte `clang-format`-Datei verwendet.",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "Codierungsformat, unterstützt derzeit:`Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Verwenden Sie `file`, um das Format aus einer `.clang-format`-Datei im aktuellen oder übergeordneten Verzeichnis zu laden. Verwenden Sie {Schlüssel: Wert, ...}, um bestimmte Parameter festzulegen. Beispielsweise ähnelt das 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": "Codierungsformat, unterstützt derzeit:`Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Verwenden Sie `file`, um das Format aus einer `.clang-format`-Datei im aktuellen oder übergeordneten Verzeichnis zu laden, oder verwenden Sie `file:<path>/.clang-format`, um auf einen speziellen Pfad zu verweisen. Verwenden Sie {Schlüssel: Wert, ...}, um bestimmte Parameter festzulegen. Beispielsweise ähnelt das 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": "Name des vordefinierten Formats, das als Fallback verwendet wird, falls `clang-format` mit dem Format `file` aufgerufen wird, aber die `.clang-format`-Datei nicht gefunden wird. Mögliche Werte sind `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`, `none`, oder verwenden Sie `{Schlüssel: Wert, ...}`, um bestimmte Parameter festzulegen. Beispielsweise ähnelt das 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_sortIncludes.markdownDescription": "Wenn diese Option festgelegt ist, wird das durch den Parameter `SortIncludes` festgelegte Sortierverhalten für Includes überschrieben.",
|
||||
"c_cpp.configuration.intelliSenseEngine.description": "Steuert den IntelliSense-Anbieter.",
|
||||
@@ -165,7 +173,7 @@
|
||||
"c_cpp.configuration.intelliSenseEngine.tagParser.description": "Stellt „Fuzzy“-Ergebnisse bereit, die nicht kontextbezogen sind.",
|
||||
"c_cpp.configuration.intelliSenseEngine.disabled.description": "Deaktiviert die Features des C/C++-Sprachdiensts.",
|
||||
"c_cpp.configuration.intelliSenseEngineFallback.markdownDescription": "Steuert, ob das IntelliSense-Modul automatisch zum Tagparser für Übersetzungseinheiten wechselt, die `#include#`-Fehler enthalten.",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Steuert den Anbieter für AutoVervollständigen. Wenn `Disabled` festgelegt ist und Sie die wortbasierte Vervollständigung wünschen, müssen Sie auch `[cpp]` festlegen: `{\"editor.wordBasedSuggestions\": true}` (und ähnlich für die Sprachen `c` und `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Steuert den Anbieter für AutoVervollständigen. Wenn `disabled` festgelegt ist und Sie die wortbasierte Vervollständigung wünschen, müssen Sie auch `\"[cpp]\" festlegen: {\"editor.wordBasedSuggestions\": true}` (und ähnlich für die Sprachen `c` und `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.default.description": "Verwendet das aktive IntelliSense-Modul.",
|
||||
"c_cpp.configuration.autocomplete.disabled.description": "Verwendet die von Visual Studio Code bereitgestellte wortbasierte Vervollständigung.",
|
||||
"c_cpp.configuration.errorSquiggles.description": "Steuert, ob vermutete Kompilierungsfehler, die von der IntelliSense-Engine erkannt wurden, an den Editor zurückgegeben werden. Außerdem wird gesteuert, ob Codeanalysewarnungen gemeldet werden, wenn keine Enthaltenen gefunden werden können. Diese Einstellung wird von der Tagparser-Engine ignoriert.",
|
||||
@@ -191,6 +199,7 @@
|
||||
"c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Wenn `true` festgelegt ist, zeigen die QuickInfos für Draufzeigen und AutoVervollständigen nur bestimmte Bezeichnungen strukturierter Kommentare an. Andernfalls werden alle Kommentare angezeigt.",
|
||||
"c_cpp.configuration.doxygen.generateOnType.description": "Steuert, ob der Doxygenkommentar nach Eingabe des ausgewählten Kommentarstils automatisch eingefügt wird.",
|
||||
"c_cpp.configuration.doxygen.generatedStyle.description": "Die Zeichenfolge von Zeichen, die als Startzeile des Doxygen-Kommentars verwendet wird.",
|
||||
"c_cpp.configuration.doxygen.sectionTags.description": "Wählen Sie die Doxygen-Abschnittstags aus, die beim Daraufzeigen im QuickInfo-Bereich angezeigt werden sollen, wenn die Einstellung „Strukturierte Kommentare vereinfachen“ aktiviert ist. ",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Muster, mit dem ein mehrzeiliger oder einzeiliger Kommentarblock beginnt. Das Fortsetzungsmuster wird standardmäßig auf ` * ` für mehrzeilige Kommentarblöcke oder auf diese Zeichenfolge für einzeilige Kommentarblöcke festgelegt.",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Das Muster, mit dem ein mehrzeiliger oder einzeiliger Kommentarblock beginnt.",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Der Text, der in der nächsten Zeile eingefügt wird, wenn in einem mehrzeiligen oder einzeiligen Kommentarblock die EINGABETASTE gedrückt wird.",
|
||||
@@ -224,7 +233,8 @@
|
||||
"c_cpp.configuration.default.dotConfig.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn „dotConfig“ nicht angegeben ist, oder der einzufügende Wert, wenn „${default}“ in „dotConfig“ vorhanden ist.",
|
||||
"c_cpp.configuration.experimentalFeatures.description": "Hiermit wird gesteuert, ob experimentelle Features verwendet werden können.",
|
||||
"c_cpp.configuration.suggestSnippets.markdownDescription": "Wenn `true` festgelegt ist, werden Codeschnipsel vom Sprachserver bereitgestellt.",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "Wenn diese Option aktiviert ist, wird der Code basierend auf IntelliSense eingefärbt. Diese Einstellung gilt nur, wenn `#C_Cpp.intelliSenseEngine#` auf `Default` festgelegt ist.",
|
||||
"c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": "Wenn diese Einstellung auf `default` festgelegt ist, wird davon ausgegangen, dass für das Dateisystem des Arbeitsbereichs unter Windows die Groß-/Kleinschreibung nicht berücksichtigt und unter macOS oder Linux berücksichtigt wird. Wenn diese Einstellung auf `enabled` festgelegt ist, wird davon ausgegangen, dass für das Dateisystem des Arbeitsbereichs unter Windows die Groß-/Kleinschreibung beachtet wird.",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "Wenn diese Option aktiviert ist, wird der Code basierend auf IntelliSense eingefärbt. Diese Einstellung gilt nur, wenn `#C_Cpp.intelliSenseEngine#` auf `default` festgelegt ist.",
|
||||
"c_cpp.configuration.codeFolding.description": "Wenn diese Option aktiviert ist, werden Codefaltbereiche vom Sprachserver bereitgestellt.",
|
||||
"c_cpp.configuration.vcpkg.enabled.markdownDescription": "Hiermit aktivieren Sie Integrationsdienste für den [vcpkg-Abhängigkeitsmanager](https://aka.ms/vcpkg/).",
|
||||
"c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Fügen Sie Includepfade aus `nan` und `node-addon-api` hinzu, wenn es sich um Abhängigkeiten handelt.",
|
||||
@@ -236,7 +246,9 @@
|
||||
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "Wenn `true` festgelegt ist, verwendet die Befehlsersetzung der Debugger-Shell veraltete Backtick-Zeichen ``(`)``.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "Aktivieren Sie das Verhalten vor Version 1.10.0 für die Verarbeitung der Shell-Escapezeichen in den Einstellungen der Compilerargumente. Shell-Escapezeichen werden in Argumentarrays ab Version 1.10.0 nicht mehr erwartet oder standardmäßig unterstützt.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "Diese Einstellung ist temporär und unterstützt den Übergang zum korrigierten Verhalten in Version 1.10.0.",
|
||||
"c_cpp.configuration.sshTargetsView.description": "Steuert, ob die Ansicht „SSH-Ziele“ sichtbar ist. Aktivieren Sie die Ansicht standardmäßig, wenn ein SSH-Befehl aufgerufen wird.",
|
||||
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: andere Verweisergebnisse",
|
||||
"c_cpp.contributes.views.sshTargetsView.title": "Cpptools: SSH-Ziele",
|
||||
"c_cpp.contributes.viewsWelcome.contents": "Weitere Informationen zu launch.json finden Sie unter [Konfigurieren des C/C++-Debuggings](https://code.visualstudio.com/docs/cpp/launch-json-reference).",
|
||||
"c_cpp.configuration.debugShortcut.description": "Zeigen Sie die Wiedergabeschaltfläche \"Ausführen und Debuggen\" und das Zahnrad \"Debugkonfiguration hinzufügen\" in der Titelleiste des Editors für C++-Dateien an.",
|
||||
"c_cpp.debuggers.pipeTransport.description": "Falls angegeben, weist diese Option den Debugger an, eine Verbindung mit einem Remotecomputer mithilfe einer anderen ausführbaren Datei als Pipe herzustellen, die Standardeingaben/-ausgaben zwischen VS Code und der ausführbaren Back-End-Datei für den MI-fähigen Debugger weiterleitet (z. B. gdb).",
|
||||
@@ -326,10 +338,12 @@
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "Lokaler Socket",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "Remotesocket",
|
||||
"c_cpp.debuggers.deploySteps.description": "Schritte, die zum Bereitstellen der Anwendung erforderlich sind. Die Reihenfolge ist wichtig.",
|
||||
"c_cpp.debuggers.deploySteps.scp.description": "Kopieren Sie Dateien mithilfe von SCP.",
|
||||
"c_cpp.debuggers.deploySteps.scp.files.description": "Dateien, die über SCP kopiert werden sollen. Unterstützt Pfadmuster.",
|
||||
"c_cpp.debuggers.deploySteps.scp.targetDir.description": "Zielverzeichnis.",
|
||||
"c_cpp.debuggers.deploySteps.scp.scpPath.description": "Optionaler vollständiger Pfad zu SCP. Es wird davon ausgegangen, dass sich SCP auf PATH befindet, wenn keine Angabe erfolgt.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.description": "Kopieren Sie Dateien mithilfe von SCP oder rsync.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.files.description": "Dateien, die kopiert werden sollen. Unterstützt Pfadmuster.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "Zielverzeichnis.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.recursive.description": "Bei \"wahr\" werden Ordner rekursiv kopiert.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "Optionaler vollständiger Pfad zu SCP. Es wird davon ausgegangen, dass sich SCP auf PATH befindet, wenn keine Angabe erfolgt.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "Optionaler vollständiger Pfad zu rsync. Es wird davon ausgegangen, dass sich rsync auf PATH befindet, wenn nicht angegeben",
|
||||
"c_cpp.debuggers.deploySteps.debug": "Wenn WAHR, überspringen Sie beim Starten ohne Debuggen. Wenn FALSCH, überspringen Sie beim Starten von Debuggen. Wenn nicht definiert, überspringen Sie nie.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.description": "SSH-Befehlsschritt.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.command.description": "Befehl, der über SSH ausgeführt werden soll. Der Befehl nach „-c“ im SSH-Befehl.",
|
||||
@@ -350,6 +364,7 @@
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Der Pfad zur Quellstruktur, die vom Editor verwendet wird.",
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "FALSE, wenn dieser Eintrag nur für eine Stapelrahmen-Speicherortzuordnung verwendet wird. TRUE, wenn dieser Eintrag auch zum Angeben von Haltepunktpositionen verwendet werden soll.",
|
||||
"c_cpp.debuggers.symbolOptions.description": "Optionen zum Steuern, wie Symbole (PDB-Dateien) gefunden und geladen werden.",
|
||||
"c_cpp.debuggers.unknownBreakpointHandling.description": "Steuert, wie extern gesetzte Haltepunkte (normalerweise über rohe GDB-Befehle) behandelt werden, wenn ihnen begegnet wird.\nErlaubte Werte sind \"throw\", was sich so verhält, als ob eine Ausnahme von der Anwendung ausgelöst würde, und \"stop\", was die Debugsitzung nur pausiert. Der Standardwert ist \"throw\".",
|
||||
"c_cpp.debuggers.VSSymbolOptions.description": "Stellt eine Konfiguration zum Suchen und Laden von Symbolen in den Debugadapter bereit.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Ein Array von Symbolserver-URLs (Beispiel: http://MyExampleSymbolServer) oder Verzeichnisse (Beispiel:/Build/Symbols) für die Suche nach PDB-Dateien. Diese Verzeichnisse werden zusätzlich zu den Standardspeicherorten durchsucht – neben dem Modul und dem Pfad, in dem die PDB ursprünglich abgelegt wurde.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchMicrosoftSymbolServer.description": "Wenn „true“, wird der Microsoft-Symbolserver (https://msdl.microsoft.com/download/symbols) dem Symbolsuchpfad hinzugefügt. Wenn nicht angegeben, wird diese Option standardmäßig auf „false“ eingestellt.",
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"debugger.launchConfig": "Startkonfiguration:",
|
||||
"vs.code.1.69+.required": "„deploySteps“ erfordert VS Code 1.69 oder höher.",
|
||||
"running.deploy.steps": "Bereitstellungsschritte werden ausgeführt...",
|
||||
"compiler.path.not.exists": "{0} wurde nicht gefunden. {1} Aufgabe wird ignoriert.",
|
||||
"pre.Launch.Task": "preLaunchTask: {0}",
|
||||
"debugger.path.not.exists": "Der {0}-Debugger wurde nicht gefunden. Die Debugkonfiguration für {1} wird ignoriert.",
|
||||
"build.and.debug.active.file": "Aktive Datei erstellen und debuggen",
|
||||
"cl.exe.not.available": "{0}-Build und -Debuggen können nur verwendet werden, wenn VS Code von der Developer-Eingabeaufforderung für VS ausgeführt wird.",
|
||||
"lldb.find.failed": "Fehlende Abhängigkeit \"{0}\" für ausführbare LLDB-MI-Datei.",
|
||||
@@ -32,8 +34,8 @@
|
||||
"no.compiler.found": "Kein Compiler gefunden.",
|
||||
"select.debug.configuration": "Debugkonfiguration auswählen",
|
||||
"command.args.must.be.array": "„Args“ im Befehlsbereitstellungsschritt muss ein Array sein.",
|
||||
"missing.properties.scp": "„host“, „files“ und „targetDir“ sind in SCP-Schritten erforderlich.",
|
||||
"incorrect.files.type.scp": "„files“ muss eine Zeichenfolge oder ein Array von Zeichenfolgen in SCP-Schritten sein.",
|
||||
"missing.properties.copyFile": "„host“, „files“ und „targetDir“ sind in {0}-Schritten erforderlich.",
|
||||
"incorrect.files.type.copyFile": "„files“ muss eine Zeichenfolge oder ein Array von Zeichenfolgen in {0}-Schritten sein.",
|
||||
"missing.properties.ssh": "„Host“ und „Befehl“ sind für SSH-Schritte erforderlich.",
|
||||
"missing.properties.shell": "„Befehl“ ist für Shellschritte erforderlich.",
|
||||
"deploy.step.type.not.supported": "Der Bereitstellungsschritttyp „{0}“ wird nicht unterstützt.",
|
||||
|
||||
@@ -4,5 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"add.debug.configuration.not.available.for.single.file": "Das Hinzufügen der Debugkonfiguration ist für eine einzelne Datei nicht verfügbar."
|
||||
"add.debug.configuration.not.available.for.single.file": "Das Hinzufügen der Debugkonfiguration ist für eine einzelne Datei nicht verfügbar.",
|
||||
"cannot.modify.config.file": "Die SSH-Konfigurationsdatei kann aufgrund eines Analysefehlers „{0}“ nicht geändert werden.",
|
||||
"no.valid.ssh.config.file": "Es wurde keine gültige SSH-Konfigurationsdatei gefunden.",
|
||||
"enter.ssh.target.name": "SSH-Zielnamen eingeben",
|
||||
"ssh.target.name.place.holder": "Beispiel: \"mySSHTarget\"",
|
||||
"enter.ssh.connection.command": "SSH-Verbindungsbefehl eingeben",
|
||||
"ssh.connection.command.place.holder": "Beispiel: \"ssh [email protected] -A\"",
|
||||
"select.ssh.config.file": "Wählen Sie eine SSH-Konfigurationsdatei aus",
|
||||
"yes": "Ja",
|
||||
"no": "Nein",
|
||||
"ssh.target.delete.confirmation": "Möchten Sie „{0}“ endgültig löschen?"
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "Erfahren Sie, wie Sie mit vcpkg eine Bibliothek für diesen Header installieren.",
|
||||
"copy.vcpkg.command": "vcpkg-Befehl zum Installieren von \"{0}\" in die Zwischenablage kopieren",
|
||||
"on.disabled.command": "IntelliSense-bezogene Befehle können nicht ausgeführt werden, wenn `C_Cpp.intelliSenseEngine` auf `Disabled` festgelegt ist.",
|
||||
"on.disabled.command": "IntelliSense-bezogene Befehle können nicht ausgeführt werden, wenn `C_Cpp.intelliSenseEngine` auf `disabled` festgelegt ist.",
|
||||
"client.not.found": "Client nicht gefunden.",
|
||||
"configuration.select.first": "Zum Auswählen einer Konfiguration zuerst einen Ordner öffnen",
|
||||
"configuration.provider.select.first": "Zum Auswählen eines Konfigurationsanbieters zuerst einen Ordner öffnen",
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"editorconfig.default.behavior": "Die Codeformatierung verwendet die Einstellungen von .editorconfig anstelle von .clang-format. Weitere Informationen finden Sie in der Dokumentation zum Wert 'Default' der Einstellung 'C_Cpp.formatting'."
|
||||
"editorconfig.default.behavior": "Die Codeformatierung verwendet die Einstellungen von .editorconfig anstelle von .clang-format. Weitere Informationen finden Sie in der Dokumentation zum Wert \"default\" der Einstellung \"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": "Keine SSH-Ziele",
|
||||
"active.ssh.target.selection.cancelled": "Die Auswahl des aktiven SSH-Ziels wurde abgebrochen.",
|
||||
"add.new.ssh.target": "{0} Neues SSH-Ziel hinzufügen...",
|
||||
"select.ssh.target": "Wählen Sie ein SSH-Ziel aus"
|
||||
}
|
||||
@@ -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": "[Aktiv]"
|
||||
}
|
||||
@@ -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": "Fehler bei der Verbindungsherstellung mit „{0}“."
|
||||
}
|
||||
@@ -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": "Fehler beim Analysieren der Konfigurationsdatei {0}: {1}",
|
||||
"failed.to.read.file": "Fehler beim Lesen der Datei {0}.",
|
||||
"failed.to.write.file": "Fehler beim Schreiben in Datei {0}."
|
||||
}
|
||||
@@ -13,6 +13,5 @@
|
||||
"warning.file.missing": "Warnung: Die erwartete Datei \"{0}\" fehlt.",
|
||||
"warning.debugging.not.tested": "Warnung: Das Debugging wurde für diese Plattform nicht getestet.",
|
||||
"reload.workspace.for.changes": "Laden Sie den Arbeitsbereich neu, damit die Einstellungsänderung wirksam wird.",
|
||||
"reload.string": "Aktualisieren",
|
||||
"invalid.download.location.received": "Ungültiger Downloadspeicherort empfangen."
|
||||
"reload.string": "Aktualisieren"
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++-Diagnose",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++-Debugprotokoll",
|
||||
"c.cpp.warnings": "C/C++-Konfigurationswarnungen"
|
||||
}
|
||||
@@ -27,8 +27,8 @@
|
||||
"default_query_failed": "Fehler beim Abfragen von standardmäßigen Includepfaden und Define-Anweisungen für \"{0}\".",
|
||||
"failed_call": "Fehler beim Aufrufen von \"{0}\".",
|
||||
"quick_info_failed": "Fehler beim QuickInfo-Vorgang: {0}",
|
||||
"create_intellisense_client_failed": "Fehler beim Erstellen des IntelliSense-Clients. {0}",
|
||||
"intellisense_spawn_failed": "Fehler beim Erzeugen von IntelliSense-Prozess:",
|
||||
"create_intellisense_client_failed": "Fehler beim Erstellen des IntelliSense-Clients: {0}",
|
||||
"intellisense_spawn_failed": "Fehler beim Erzeugen des IntelliSense-Prozesses: {0}",
|
||||
"browse_engine_update_thread_join_failed": "Fehler beim Aufrufen von \"browse_engine_update_thread.join()\": {0}",
|
||||
"already_open_different_casing": "Diese Datei ({0}) ist bereits im Editor geöffnet, jedoch mit einer anderen Groß-/Kleinschreibung. IntelliSense-Features werden für diese Kopie der Datei deaktiviert.",
|
||||
"intellisense_client_disconnected": "Der IntelliSense-Client hat die Verbindung mit dem Server getrennt: {0}",
|
||||
@@ -168,12 +168,32 @@
|
||||
"specialization": "+1 Spezialisierung",
|
||||
"specializations": "+%d Spezialisierungen",
|
||||
"expands_to": "Wird erweitert auf:",
|
||||
"file_label": "Datei:",
|
||||
"parameters_label": "Parameter:",
|
||||
"returns_label": "Rückgabe:",
|
||||
"attention_label": "Achtung:",
|
||||
"author_label": "Autor:",
|
||||
"authors_label": "Autoren:",
|
||||
"bug_label": "Fehler:",
|
||||
"copyright_label": "Copyright:",
|
||||
"deprecated_label": "Veraltet:",
|
||||
"date_label": "Datum:",
|
||||
"details_label": "Details:",
|
||||
"exceptions_label": "Ausnahmen:",
|
||||
"invariant_label": "Invariant:",
|
||||
"file_label": "Datei:",
|
||||
"note_label": "Hinweis:",
|
||||
"parameters_label": "Parameter:",
|
||||
"pre_label": "Vorbedingung:",
|
||||
"post_label": "Nachbedingung:",
|
||||
"remark_label": "Bemerkung:",
|
||||
"remarks_label": "Bemerkungen:",
|
||||
"result_label": "Ergebnis:",
|
||||
"return_label": "Rückgabe:",
|
||||
"returns_label": "Rückgabe:",
|
||||
"since_label": "Seit:",
|
||||
"template_parameters_label": "Vorlagenparameter:",
|
||||
"test_label": "Test:",
|
||||
"todo_label": "TODO:",
|
||||
"version_label": "Version:",
|
||||
"warning_label": "Warnung:",
|
||||
"compiler_query_command_line": "Befehlszeile der Compilerabfrage: {0}",
|
||||
"c_compiler_from_compiler_path": "Es wird versucht, Standardwerte vom C-Compiler in der Eigenschaft \"compilerPath\" abzurufen: {0}",
|
||||
"cpp_compiler_from_compiler_path": "Es wird versucht, Standardwerte vom C++-Compiler in der Eigenschaft \"compilerPath\" abzurufen: {0}",
|
||||
|
||||
+10
-10
@@ -4,15 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"walkthrough.mac.title.run.and.debug.your.file": "C++-Datei auf Windows ausführen und debuggen",
|
||||
"walkthrough.mac.run.and.debug.your.file": "Zum Ausführen und Debuggen Ihrer C++-Datei in VS-Code tun Sie Folgendes:",
|
||||
"walkthrough.mac.instructions1": "Öffnen Sie die C++-Quelldatei, die Sie ausführen und debuggen möchten. Stellen Sie sicher, dass diese Datei im Editor aktiv ist, d. h. aktuell angezeigt wird und ausgewählt ist.",
|
||||
"walkthrough.mac.press.f5": "Drücken Sie {0}, oder wählen Sie im Hauptmenü {1} aus.",
|
||||
"walkthrough.mac.run": "Ausführen",
|
||||
"walkthrough.mac.start.debugging": "Debuggen starten",
|
||||
"walkthrough.mac.select.compiler": "Wählen Sie {0}.",
|
||||
"walkthrough.mac.choose.build.active.file": "Wählen Sie {0}.",
|
||||
"walkthrough.windows.title.run.and.debug.your.file": "C++-Datei auf Windows ausführen und debuggen",
|
||||
"walkthrough.windows.run.and.debug.your.file": "Zum Ausführen und Debuggen Ihrer C++-Datei in VS-Code tun Sie Folgendes:",
|
||||
"walkthrough.windows.instructions1": "Öffnen Sie die C++-Quelldatei, die Sie ausführen und debuggen möchten. Stellen Sie sicher, dass diese Datei im Editor aktiv ist, d. h. aktuell angezeigt wird und ausgewählt ist.",
|
||||
"walkthrough.windows.press.f5": "Drücken Sie {0}, oder wählen Sie im Hauptmenü {1} aus.",
|
||||
"walkthrough.windows.run": "Ausführen",
|
||||
"walkthrough.windows.start.debugging": "Debuggen starten",
|
||||
"walkthrough.windows.select.compiler": "Wählen Sie {0}.",
|
||||
"walkthrough.windows.choose.build.active.file": "Wählen Sie {0}.",
|
||||
"walkthrough.windows.build.and.debug.active.file": "Aktive Datei erstellen und debuggen",
|
||||
"walkthrough.mac.after.running": "Nachdem Sie die C++-Datei zum ersten Mal ausgeführt und debuggt haben, werden Sie zwei neue Dateien im {0}-Ordner Ihres Projekts sehen: {1} und {2}.",
|
||||
"walkthrough.mac.for.more.complex": "Für komplexere Build-und Debugging-Szenarios können Sie Ihre Build-Tasks- und Debugkonfigurationen in {0} und {1} anpassen. Wenn Sie beispielsweise beim Erstellen mithilfe der Befehlszeile Argumente an den Compiler übergeben, können Sie diese Argumente in {2} mithilfe der {3}-Eigenschaft angeben. Ebenso können Sie Argumente definieren, die zum Debuggen in {4} an Ihr Programm übergeben werden."
|
||||
"walkthrough.windows.after.running": "Nachdem Sie die C++-Datei zum ersten Mal ausgeführt und debuggt haben, werden Sie zwei neue Dateien im {0}-Ordner Ihres Projekts sehen: {1} und {2}.",
|
||||
"walkthrough.windows.for.more.complex": "Für komplexere Build-und Debugging-Szenarios können Sie Ihre Build-Tasks- und Debugkonfigurationen in {0} und {1} anpassen. Wenn Sie beispielsweise beim Erstellen mithilfe der Befehlszeile Argumente an den Compiler übergeben, können Sie diese Argumente in {2} mithilfe der {3}-Eigenschaft angeben. Ebenso können Sie Argumente definieren, die zum Debuggen in {4} an Ihr Programm übergeben werden."
|
||||
}
|
||||
@@ -34,6 +34,14 @@
|
||||
"c_cpp.command.BuildAndRunFile.title": "Ejecutar archivo C/C++",
|
||||
"c_cpp.command.AddDebugConfiguration.title": "Agregar configuración de depuración",
|
||||
"c_cpp.command.GenerateDoxygenComment.title": "Generar comentario de Doxygen",
|
||||
"c_cpp.command.addSshTarget.title": "Agregar destino SSH",
|
||||
"c_cpp.command.removeSshTarget.title": "Quitar destino SSH",
|
||||
"c_cpp.command.setActiveSshTarget.title": "Establecer este destino SSH como destino activo",
|
||||
"c_cpp.command.selectActiveSshTarget.title": "Selección de un destino SSH activo",
|
||||
"c_cpp.command.selectSshTarget.title": "Seleccionar destino SSH",
|
||||
"c_cpp.command.activeSshTarget.title": "Obtención del destino SSH activo",
|
||||
"c_cpp.command.refreshCppSshTargetsView.title": "Actualizar",
|
||||
"c_cpp.command.sshTerminal.title": "Conectarse a este destino SSH en un nuevo terminal",
|
||||
"c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Número máximo de subprocesos simultáneos que se usarán para el procesamiento del servicio de lenguaje. El valor es una sugerencia y no se puede usar siempre. El valor predeterminado de `null` (vacío) usa el número de procesadores lógicos disponibles.",
|
||||
"c_cpp.configuration.maxCachedProcesses.markdownDescription": "Número máximo de procesos almacenados en caché que se usarán para el procesamiento del servicio de lenguaje. El valor predeterminado de `null` (vacío) usa el doble de procesadores lógicos disponibles.",
|
||||
"c_cpp.configuration.maxMemory.markdownDescription": "Memoria máxima (en MB) disponible para el procesamiento del servicio de lenguaje. Menos procesos se almacenarán en caché y se ejecutarán simultáneamente después de que se supere el uso de memoria. El valor predeterminado de `null` (vacío) usa la memoria libre del sistema.",
|
||||
@@ -46,7 +54,7 @@
|
||||
"c_cpp.configuration.codeAnalysis.maxMemory.markdownDescription": "Menos procesos de análisis de código se ejecutarán simultáneamente después de superar este uso de memoria (en MB). El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxMemory#`.",
|
||||
"c_cpp.configuration.codeAnalysis.updateDelay.markdownDescription": "Controla el retraso en milisegundos antes de que el análisis de código empiece a procesarse después de que se desencadene un guardado desde una edición cuando `#files.autoSave#` es `afterDelay` y `#C_Cpp.codeAnalysis.runAutomatically#` es `true`.",
|
||||
"c_cpp.configuration.codeAnalysis.exclude.markdownDescription": "Configure patrones globales para excluir carpetas y archivos para el análisis de código. Los archivos que no estén en la carpeta del área de trabajo siempre se excluyen. Hereda valores de `#files.exclude#` y `#C_Cpp.files.exclude#`. Más información sobre los patrones globales [aquí](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
|
||||
"c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "El patrón global con el que se van a comparar las rutas de acceso de los archivos. Establézcalo en`true` o `false` para habilitarlo o deshabilitarlo.",
|
||||
"c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "El patrón global con el que se van a comparar las rutas de acceso de los archivos. Establézcalo en `true` o `false` para habilitarlo o deshabilitarlo.",
|
||||
"c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Usa `$(basename)` como variable para el nombre del archivo coincidente.",
|
||||
"c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "Si es `true`, el análisis de código se ejecutará automáticamente en un archivo después de abrirlo o guardarlo.",
|
||||
"c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "Si es `true`, la acción de código 'Deshabilitar' se mostrará cuando esté disponible (la próxima vez que se ejecute el análisis de código). Cuando se usa la acción de código 'Deshabilitar', agrega el código de advertencia a la configuración `C_Cpp.codeAnalysis.clangTidy.checks.disabled`.",
|
||||
@@ -157,7 +165,7 @@
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": "Cualquier código en el que la llave de apertura y de cierre se escriba en una línea se mantiene en una sola línea, independientemente de cualquiera de los valores de configuración de `C_Cpp.vcFormat.newLine.*`.",
|
||||
"c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "Los bloques de código siempre tienen formato basado en los valores de la configuración `C_Cpp.vcFormat.newLine.*`.",
|
||||
"c_cpp.configuration.clang_format_path.markdownDescription": "Ruta de acceso completa del archivo ejecutable de `clang-format`. Si no se especifica y `clang-format` está disponible en la ruta de acceso del entorno, se usará este. Si no se encuentra en la ruta de acceso del entorno, se usará el `clang-format` incluido con la extensión.",
|
||||
"c_cpp.configuration.clang_format_style.markdownDescription": "Estilo de codificación. Actualmente, admite: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Use `file` para cargar el estilo de un archivo `.clang-format` en el directorio actual o primario. Use `{clave: valor, ...}` para establecer parámetros específicos. Por ejemplo, el estilo de `Visual Studio` es similar a: `{ 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": "Estilo de codificación. Actualmente, admite: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Use `file` para cargar el estilo de un archivo `.clang-format` en el directorio actual o primario, o use `file:<path>/.clang-format` para hacer referencia a una ruta de acceso específica. Use `{clave: valor, ...}` para establecer parámetros específicos. Por ejemplo, el estilo de `Visual Studio` es similar a: `{ 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": "Nombre del estilo predefinido que se usa como elemento fallback en el caso de que se invoque a `clang-format` con el estilo `file` y no se encuentre el archivo `.clang-format`. Los valores posibles son `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`, ninguno o usar `{clave: valor, ...}` para establecer parámetros específicos. Por ejemplo, el estilo `Visual Studio` es similar a: `{ 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": "Si se establece, invalida el comportamiento de ordenación de inclusiones que determina el parámetro `SortIncludes`.",
|
||||
"c_cpp.configuration.intelliSenseEngine.description": "Controla el proveedor de IntelliSense.",
|
||||
@@ -165,7 +173,7 @@
|
||||
"c_cpp.configuration.intelliSenseEngine.tagParser.description": "Proporciona resultados \"fuzzy\" que no tienen en cuenta el contexto.",
|
||||
"c_cpp.configuration.intelliSenseEngine.disabled.description": "Desactiva las características del servicio de lenguaje C/C++.",
|
||||
"c_cpp.configuration.intelliSenseEngineFallback.markdownDescription": "Controla si el motor de IntelliSense cambiará automáticamente al Analizador de etiquetas para las unidades de traducción que contengan errores de `#include`.",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Controla el proveedor de finalización automática. Si está establecido en `Disabled` y desea la finalización basada en palabras, también tendrá que establecer `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}` (y de forma similar para los lenguajes `c` y `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.markdownDescription": "Controla el proveedor de finalización automática. Si está establecido en `disabled` y desea la finalización basada en palabras, también tendrá que establecer `\"[cpp]\": {\"editor.wordBasedSuggestions\": true}` (y de forma similar para los lenguajes `c` y `cuda-cpp`).",
|
||||
"c_cpp.configuration.autocomplete.default.description": "Usa el motor de IntelliSense activo.",
|
||||
"c_cpp.configuration.autocomplete.disabled.description": "Usa la finalización basada en palabras proporcionada por Visual Studio Code.",
|
||||
"c_cpp.configuration.errorSquiggles.description": "Controla si los posibles errores de compilación detectados por el motor de IntelliSense se notificarán al editor. También controla si se notifican advertencias de análisis de código si no se encuentran las inclusiones. El motor del analizador de etiquetas omite esta configuración.",
|
||||
@@ -191,6 +199,7 @@
|
||||
"c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Si es `true`, la información sobre herramientas al mantener el puntero y autocompletar solo mostrará ciertas etiquetas de comentarios estructurados. De lo contrario, se muestran todos los comentarios.",
|
||||
"c_cpp.configuration.doxygen.generateOnType.description": "Controla si se va a insertar automáticamente el comentario de Doxygen después de escribir el estilo de comentario elegido.",
|
||||
"c_cpp.configuration.doxygen.generatedStyle.description": "La cadena de caracteres utilizada como línea de inicio del comentario de Doxygen.",
|
||||
"c_cpp.configuration.doxygen.sectionTags.description": "Seleccione las etiquetas de sección de Doxygen que quiere que aparezcan al mantener el puntero en el área de información sobre herramientas cuando esté habilitada la opción \"Simplificar comentarios estructurados\". ",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Patrón que comienza un bloque de comentario de una o varias líneas. El valor predeterminado del patrón de continuación es ` * ` para los bloques de comentario multilínea o esta cadena para los bloques de comentario de una línea.",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Patrón que comienza un bloque de comentario de una o varias líneas.",
|
||||
"c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Texto que se insertará en la línea siguiente cuando se presione Entrar dentro de un bloque de comentario de una o varias líneas.",
|
||||
@@ -224,6 +233,7 @@
|
||||
"c_cpp.configuration.default.dotConfig.markdownDescription": "Valor que debe usarse en una configuración si no se especifica `dotConfig`, o bien los valores que se deben insertar si se especifica `${default}` en `dotConfig`.",
|
||||
"c_cpp.configuration.experimentalFeatures.description": "Controla si se pueden usar las características \"experimentales\".",
|
||||
"c_cpp.configuration.suggestSnippets.markdownDescription": "Si se establece en `true`, el servidor de lenguaje proporciona los fragmentos de código.",
|
||||
"c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": "Si se establece en `default`, el sistema de archivos del área de trabajo no distingue mayúsculas de minúsculas en Windows y distingue mayúsculas de minúsculas en macOS o Linux. Si se establece en `enabled`, el sistema de archivos del área de trabajo distingue mayúsculas de minúsculas en Windows.",
|
||||
"c_cpp.configuration.enhancedColorization.markdownDescription": "Si se habilita esta opción, el código se colorea de acuerdo con IntelliSense. Esta configuración solo se aplica si `#C_Cpp.intelliSenseEngine#` se establece en `Default`.",
|
||||
"c_cpp.configuration.codeFolding.description": "Si está habilitada, el servidor de lenguaje proporciona intervalos de plegado de código.",
|
||||
"c_cpp.configuration.vcpkg.enabled.markdownDescription": "Habilita los servicios de integración para el [administrador de dependencias de vcpkgs](https://aka.ms/vcpkg/).",
|
||||
@@ -236,7 +246,9 @@
|
||||
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "Si es `true`, la sustitución de comandos del shell del depurador usará un acento grave obsoleto ``(`)``.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "Habilite el comportamiento anterior a la v1.10.0 para saber cómo se controla el escape del shell en la configuración del argumento del compilador. El escape de shell ya no se espera ni se admite de forma predeterminada en las matrices de argumentos a partir de la v1.10.0.",
|
||||
"c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "Esta configuración es temporal para admitir la transición al comportamiento corregido en la v1.10.0.",
|
||||
"c_cpp.configuration.sshTargetsView.description": "Controla si la vista Destinos SSH es visible. De forma predeterminada, habilite la vista cuando se invoque un comando SSH.",
|
||||
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: resultados de otras referencias",
|
||||
"c_cpp.contributes.views.sshTargetsView.title": "Cpptools: destinos SSH",
|
||||
"c_cpp.contributes.viewsWelcome.contents": "Para obtener más información sobre launch.json, vea [Configuración de depuración de C/C++](https://code.visualstudio.com/docs/cpp/launch-json-reference).",
|
||||
"c_cpp.configuration.debugShortcut.description": "Mostrar el botón de reproducción \"Ejecutar y depurar\" y el engranaje \"Agregar configuración de depuración\" en la barra de título del editor para archivos de C++.",
|
||||
"c_cpp.debuggers.pipeTransport.description": "Cuando se especifica, indica al depurador que se conecte a un equipo remoto usando otro archivo ejecutable como canalización que retransmitirá la entrada o la salida estándar entre VS Code y el archivo ejecutable del back-end del depurador habilitado para MI (por ejemplo, gdb).",
|
||||
@@ -326,10 +338,12 @@
|
||||
"c_cpp.debuggers.host.localForward.localSocket.description": "Socket local",
|
||||
"c_cpp.debuggers.host.localForward.remoteSocket.description": "Socket remoto",
|
||||
"c_cpp.debuggers.deploySteps.description": "Pasos necesarios para implementar la aplicación. El orden es importante.",
|
||||
"c_cpp.debuggers.deploySteps.scp.description": "Copiar archivos mediante SCP.",
|
||||
"c_cpp.debuggers.deploySteps.scp.files.description": "Archivos que se van a copiar a través de SCP. Admite el patrón de ruta de acceso.",
|
||||
"c_cpp.debuggers.deploySteps.scp.targetDir.description": "Directorio de destino.",
|
||||
"c_cpp.debuggers.deploySteps.scp.scpPath.description": "Ruta de acceso completa opcional al SCP. Asume que SCP está en PATH si no se especifica",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.description": "Copiar archivos mediante SCP o rsync.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.files.description": "Archivos que se van a copiar. Admite el patrón de ruta de acceso.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "Directorio de destino.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.recursive.description": "Si es true, copia las carpetas de forma recursiva.",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "Ruta de acceso completa opcional al SCP. Asume que SCP está en PATH si no se especifica",
|
||||
"c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "Ruta de acceso completa opcional a rsync. Se supone que rsync está en PATH si no se especifica",
|
||||
"c_cpp.debuggers.deploySteps.debug": "Si es true, se omite cuando se inicia sin depuración. Si es false, se omite al iniciar la depuración. Si no está definido, no se omitirá nunca.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.description": "Paso del comando SSH.",
|
||||
"c_cpp.debuggers.deploySteps.ssh.command.description": "Comando que se ejecutará a través de SSH. Comando después de '-c' en el comando SSH.",
|
||||
@@ -350,6 +364,7 @@
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "La ruta de acceso al árbol de origen que el editor va a usar.",
|
||||
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "False si la entrada solo se usa para la asignación de ubicación del marco de pila. True si la entrada debe usarse también al especificar ubicaciones de los puntos de interrupción.",
|
||||
"c_cpp.debuggers.symbolOptions.description": "Opciones para controlar cómo se encuentran y se cargan los símbolos (archivos .pdb).",
|
||||
"c_cpp.debuggers.unknownBreakpointHandling.description": "Controla cómo se controlan los puntos de interrupción establecidos externamente (normalmente a través de comandos GDB sin procesar) cuando se alcanzan.\nLos valores permitidos son \"throw\", que actúa como si la aplicación iniciara una excepción y \"stop\", que solo pausa la sesión de depuración. El valor predeterminado es \"throw\".",
|
||||
"c_cpp.debuggers.VSSymbolOptions.description": "Proporciona la configuración para buscar y cargar símbolos en el adaptador de depuración.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Matriz de direcciones URL del servidor de símbolos (ejemplo: http://MiServidordeSímblosdeEjemplo) o de directorios (ejemplo: /compilar/symbols) para buscar archivos. pdb. Se buscarán estos directorios además de las ubicaciones predeterminadas, junto al módulo y la ruta de acceso en la que se anuló originalmente el archivo pdb.",
|
||||
"c_cpp.debuggers.VSSymbolOptions.searchMicrosoftSymbolServer.description": "Si es «verdadero», se agrega el servidor de símbolos de Microsoft (https://msdl.microsoft.com/download/symbols) a la ruta de búsqueda de símbolos. Si no se especifica, esta opción tendrá el valor predeterminado de «falso».",
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
"debugger.launchConfig": "Configuración de inicio:",
|
||||
"vs.code.1.69+.required": "\"deploySteps\" requiere VS Code 1.69 ó posterior.",
|
||||
"running.deploy.steps": "Ejecutando pasos de implementación...",
|
||||
"compiler.path.not.exists": "No se encuentra {0}. Se ha omitido la tarea de {1}.",
|
||||
"pre.Launch.Task": "preLaunchTask: {0}",
|
||||
"debugger.path.not.exists": "No se encuentra el depurador {0}. Se ha omitido la configuración de depuración de {1}.",
|
||||
"build.and.debug.active.file": "Compilar y depurar el archivo activo",
|
||||
"cl.exe.not.available": "La compilación y depuración de {0} solo se puede usar cuando VS Code se ejecuta desde el Símbolo del sistema para desarrolladores de Visual Studio.",
|
||||
"lldb.find.failed": "Falta la dependencia \"{0}\" para el ejecutable lldb-mi.",
|
||||
@@ -32,8 +34,8 @@
|
||||
"no.compiler.found": "No se encontró ningún compilador",
|
||||
"select.debug.configuration": "Seleccione una configuración de depuración",
|
||||
"command.args.must.be.array": "\"args\" en el paso de implementación de comandos debe ser una matriz.",
|
||||
"missing.properties.scp": "\"host\", \"files\" y \"targetDir\" son necesarios en los pasos de SCP.",
|
||||
"incorrect.files.type.scp": "\"files\" debe ser una cadena o una matriz de cadenas en los pasos de SCP.",
|
||||
"missing.properties.copyFile": "\"host\", \"files\" y \"targetDir\" son necesarios en los pasos de {0}.",
|
||||
"incorrect.files.type.copyFile": "\"files\" debe ser una cadena o una matriz de cadenas en los pasos de {0}.",
|
||||
"missing.properties.ssh": "Se requieren \"host\" y \"command\" para los pasos ssh.",
|
||||
"missing.properties.shell": "Se requiere \"command\" para los pasos del shell.",
|
||||
"deploy.step.type.not.supported": "No se admite el tipo de paso de implementación {0}.",
|
||||
|
||||
@@ -4,5 +4,15 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"add.debug.configuration.not.available.for.single.file": "Agregar configuración de depuración no está disponible para un solo archivo."
|
||||
"add.debug.configuration.not.available.for.single.file": "Agregar configuración de depuración no está disponible para un solo archivo.",
|
||||
"cannot.modify.config.file": "No se puede modificar el archivo de configuración SSH debido al error de análisis \"{0}\".",
|
||||
"no.valid.ssh.config.file": "No se encontró ningún archivo de configuración SSH válido.",
|
||||
"enter.ssh.target.name": "Escriba el nombre de destino SSH",
|
||||
"ssh.target.name.place.holder": "Ejemplo: `mySSHTarget`",
|
||||
"enter.ssh.connection.command": "Escriba el comando de conexión SSH",
|
||||
"ssh.connection.command.place.holder": "Ejemplo: \"ssh [email protected] -A\"",
|
||||
"select.ssh.config.file": "Selección de un archivo de configuración SSH",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"ssh.target.delete.confirmation": "¿Está seguro de que desea eliminar \"{0}\" de forma permanente?"
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
{
|
||||
"learn.how.to.install.a.library": "Más información sobre el modo de instalar una biblioteca para este encabezado con vcpkg",
|
||||
"copy.vcpkg.command": "Copie el comando vcpkg para instalar \"{0}\" en el Portapapeles",
|
||||
"on.disabled.command": "Los comandos relacionados con IntelliSense no se pueden ejecutar cuando `C_Cpp.intelliSenseEngine` está establecido en `Disabled`.",
|
||||
"on.disabled.command": "Los comandos relacionados con IntelliSense no se pueden ejecutar cuando `C_Cpp.intelliSenseEngine` está establecido en `disabled`.",
|
||||
"client.not.found": "No se encuentra el cliente",
|
||||
"configuration.select.first": "Abra una carpeta primero para seleccionar una configuración",
|
||||
"configuration.provider.select.first": "Abra una carpeta primero para seleccionar un proveedor de configuración",
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"editorconfig.default.behavior": "El formato de código está usando la configuración de .editorconfig en lugar de .clang-format. Para obtener más información, consulte la documentación para el valor 'Default' de la configuración 'C_Cpp.formatting'."
|
||||
"editorconfig.default.behavior": "El formato de código está usando la configuración de .editorconfig en lugar de .clang-format. Para obtener más información, consulte la documentación para el valor “Default” de la configuración “C_Cpp.formatting”."
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user