Compare commits

..
232 Commits
Author SHA1 Message Date
Sean McManus 32c1d6bf52 Merge pull request #6997 from microsoft/main
Merge for 1.2.2-insiders2
2021-02-18 18:13:59 -08:00
Sean McManus 2199ec324d Update changelog for 1.2.2-insiders2. (#6996) 2021-02-18 17:48:21 -08:00
Sean McManus 4f3e3c8f63 Fix regression. Add test case. (#6993)
* Add test case.
* Fix regression bug.
2021-02-18 15:56:20 -08:00
csigsandDevDiv Build Lab - Dev14 585cb66534 Localization - Translated Strings (#6991)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-18 11:14:30 -08:00
Sean McManus ebd5314b48 Merge pull request #6986 from microsoft/seanmcm/1_2_2_insiders
1.2.2-insiders
2021-02-17 15:01:04 -08:00
Sean McManus 5c7f551dba Merge. 2021-02-17 14:57:49 -08:00
Colen Garoutte-Carson 325ea2939d Update CHANGELOG.md for 1.2.2-insiders (#6985) 2021-02-17 14:52:53 -08:00
Colen Garoutte-Carson 1a26463bcb Move initialization of TimeTelemetryCollector (#6984) 2021-02-17 14:33:24 -08:00
csigs 71a1005720 Localization - Translated Strings (#6970) 2021-02-16 11:44:06 -08:00
Elaheh Rashedi fcd84dda26 updating fwlinks and changelog for 1.2.1 (#6960)
* update fwlinks

* update changelog

* change date to 16th
2021-02-12 10:36:34 -08:00
csigsandDevDiv Build Lab - Dev14 dfd4970060 Localization - Translated Strings (#6959)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-12 10:20:13 -08:00
Colen Garoutte-Carson 256d0cd95f Update codespaces check to also include VS Code remoting codespaces (#6952) 2021-02-11 15:16:20 -08:00
Sean McManus 9d4238b236 Fix bug with cwd in build tasks. (#6954) 2021-02-11 12:27:03 -08:00
Sean McManus 9ba19af496 Update signed LLDB-MI for mac. (#6956) 2021-02-11 11:18:08 -08:00
csigsandDevDiv Build Lab - Dev14 c15f359d8f Localization - Translated Strings (#6955)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-11 09:39:21 -08:00
Elaheh Rashedi 7fc86af212 changelog 1.2.1 (#6949) 2021-02-10 14:49:42 -05:00
csigsandDevDiv Build Lab - Dev14 10c477eb09 Localization - Translated Strings (#6946)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-10 09:19:22 -08:00
Michelle Matias 4f4d662541 Add link to Discussions board (#6938) 2021-02-09 14:38:09 -08:00
Sean McManus 9196ba593b Update clang-format style descriptions. (#6914) 2021-02-08 13:45:02 -08:00
chausner 0c6e43c33d Fix typo in README.md (#6918) 2021-02-08 13:15:04 -08:00
Michelle Matias 6514d98b2c Clarify legacy IntelliSense modes in description (#6929) 2021-02-08 13:07:51 -08:00
Sean McManus 64b502b4f2 Fix switch header source with symlinked workspace folders. (#6863) 2021-02-04 11:12:08 -08:00
Sean McManus 3b0b4d1ef0 Merge pull request #6906 from microsoft/localization
[Auto] Localization - Translated Strings
2021-02-04 10:58:07 -08:00
DevDiv Build Lab - Dev14 5661f0a56d Localization - Translated Strings 2021-02-04 15:01:42 +00:00
csigs 1534bc53d8 Localization - Translated Strings (#6899) 2021-02-03 13:56:37 -08:00
csigsandDevDiv Build Lab - Dev14 76e427fdb2 Localization - Translated Strings (#6891)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-02 11:03:17 -08:00
Sean McManus f17ce8703d Fix CHS translation (#6886)
* Fix CHS translation.
* Update date.
* Update hashes.
2021-02-01 20:14:16 -08:00
csigsandDevDiv Build Lab - Dev14 880277c473 Localization - Translated Strings (#6822)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-02-01 13:59:47 -08:00
Sean McManus 3faceeb863 Update changelog and fwlinks (#6872)
* Update changelog.
* Update fwlinks and hashes.
2021-02-01 13:49:24 -08:00
Sean McManus 5746586532 Fix cl.exe not appearing in the compiler list. (#6884) 2021-02-01 12:58:25 -08:00
Sean McManus b1deef866d Fix updateChannel for code-exploration. (#6882) 2021-02-01 12:47:28 -08:00
Sean McManus 6ccea3878b Merge pull request #6853 from microsoft/seanmcm/1_2_0_insiders3
1.2.0-insiders3
2021-01-26 18:22:11 -08:00
Sean McManus e5fd036af9 Update changelog. 2021-01-26 17:40:57 -08:00
Sean McManus 4254419e76 Merge branch 'main' into seanmcm/1_2_0_insiders3 2021-01-26 17:27:51 -08:00
Sean McManus fb89c1c2d8 Add crash count telemetry. (#6851)
* Add crash count telemetry.
2021-01-26 17:24:06 -08:00
Sean McManus fdda9c2db5 Update changelog. (#6852)
* Update changelog.
2021-01-26 16:59:19 -08:00
Elaheh Rashedi 89cdae0456 avoid throwing error for single-file mode task configuration (#6828)
* change master to main

* ignore single-mode files error

* linter error
2021-01-21 13:48:41 -08:00
Michelle Matias f73a5d169a Use cpptools API v5 (#6823) 2021-01-21 13:01:56 -08:00
Sean McManus f9ecc9c6f9 Merge pull request #6820 from microsoft/seanmcm/1_2_0_insiders2
1.2.0-insiders2
2021-01-19 20:26:53 -08:00
Sean McManus 9405f41521 Merge branch 'main' into seanmcm/1_2_0_insiders2 2021-01-19 18:22:49 -08:00
Sean McManus 5f94a645d5 1.2.0-insiders2 changelog (#6817)
* Update changelog.
2021-01-19 18:20:44 -08:00
Sean McManus f9b6d18af4 Revert "Remove .dylib filtering. (#6796)" (#6797)
This reverts commit e4809d9f90.
2021-01-15 22:09:16 -08:00
Andrew Wang 51fff8eb42 Add new "console" launch config for cppvsdbg (#6794)
* Add new "console" launch config for vsdbg

This PR adds new console support for the cppvsdbg debug type.

This removes the legacy 'externalConsole' flag with 'console'.
Console has four enums:
- internalConsole: Output to the VS Code Debug Console. This doesn't
  support reading console input (ex:Console.ReadLine)
- integratedTerminal: VS Code's integrated terminal
- externalTerminal: External terminal that can be configured via user
  settings
- newExternalWindow: Console applications will be launched in their own
  external console window which will end when the application stops.
  Non-console applications will run without a terminal, and
  stdout/stderr will be ignored.
2021-01-15 18:09:56 -08:00
Sean McManus e4809d9f90 Remove .dylib filtering. (#6796)
* Remove .dylib filtering.
2021-01-15 16:10:21 -08:00
Sean McManus bbcc3fdcab Fix Go to Symbol in Workspace (#6795)
* Fix Go to Symbol in Workspace
2021-01-15 15:57:20 -08:00
Colen Garoutte-Carson 781e813abd Fix issue with git cleanup in loc auto-pr script (#6786) 2021-01-15 11:44:46 -08:00
Sean McManus 37cca41225 Merge pull request #6785 from microsoft/seanmcm/1_2_0_insiders_updates
1 2 0 insiders updates
2021-01-14 18:22:43 -08:00
Sean McManus ed584b23e2 Merge branch 'main' into seanmcm/1_2_0_insiders_updates 2021-01-14 18:21:56 -08:00
Colen Garoutte-Carson 8e8482b527 Fix issue with multiple didOpen (#6784) 2021-01-14 18:21:09 -08:00
Sean McManus f7cab674a4 Merge branch 'main' into seanmcm/1_2_0_insiders_updates 2021-01-14 17:31:47 -08:00
Michelle Matias 3e2488a9e7 fix config name UI error (#6783) 2021-01-14 17:15:42 -08:00
Sean McManus 2a94a2b26d Fix configuration status bar issue. Update changelog. (#6782)
* Fix configuration status bar issue. Update changelog.
2021-01-14 17:05:50 -08:00
Sean McManus 42586081fa Merge pull request #6777 from microsoft/seanmcm/1_2_0_insiders
Merge latest changes for 1.2.0-insiders
2021-01-13 18:56:37 -08:00
Sean McManus c49e51d386 Fix extra space. 2021-01-13 18:53:52 -08:00
Sean McManus 51557b5ae9 1.2.0-insiders changelog (#6776)
* Update changelog for 1.2.0-insiders.
* Update version.
2021-01-13 18:40:22 -08:00
Sean McManus 1201a56169 Merge pull request #6775 from microsoft/insiders
Merge to main: implement addNodeAddonIncludePaths (#6731)
2021-01-13 18:16:12 -08:00
Sean McManus 3c32946d88 Merge branch 'main' into insiders 2021-01-13 18:10:08 -08:00
Bruce MacNaughton 41b7678e62 implement addNodeAddonIncludePaths (#6731)
* add addNodeAddonIncludePaths, fix for https://github.com/microsoft/vscode-cpptools/issues/4854
2021-01-13 18:09:01 -08:00
Elaheh Rashedi 1145a49108 show a Squiggle if there is a duplicate configuration name (#6752)
* change master to main

* check for duplicate names

* check duplicates before removing the later configs

* spelling check

* fix spelling error

* add configNameInvalid for UI error(won't show yet)

* show the UI error

* squiggle for all duplicates

* change let to const

* squiggle for first one as well

* let to const
2021-01-13 18:02:59 -08:00
Colen Garoutte-Carson 02c547b60e Update offline links to clang-format (#6774) 2021-01-13 15:30:59 -08:00
Michelle Matias 46e6b87d13 Add triplet IntelliSense modes to support cross-compilation (#6745) 2021-01-13 15:05:30 -08:00
Elaheh Rashedi 1bf090238d edit to compile-commands take effect immediately (#6748)
* draft

* check CompileCommands

* check CompileCommands

* remove updateCompileCommandsFileWatchers

* remove array of filewatchers for compile_commands

* Revert "remove array of filewatchers for compile_commands"

This reverts commit d557c6328cfb32adbe79a098df062c74f651d9e9.

* Revert "remove updateCompileCommandsFileWatchers"

This reverts commit 0e6c03a65b1dfad56b79ae39a4ddfbb9f2c35486.
2021-01-11 10:49:13 -08:00
Sean McManus 438a7e337d Fix SwitchHeaderSource with RevealIfOpen (#6751) 2021-01-08 17:46:13 -08:00
Andrew Wang 4ae2f001fa Update link for Windows Debugger (#6750)
* Update link for Windows Debugger

This PR updated the License.txt when vsdbg is downloaded in
debugAdapters.

See https://github.com/microsoft/vscode-cpptools/pull/6735

* Update integreity hash for the Windows Debugger
2021-01-07 14:59:07 -08:00
Sean McManus effb26733e Update runtime licenses. (#6735)
* Update licenses.
* Update License.md to reference RuntimeLicenses.
2021-01-06 17:27:47 -08:00
Sean McManus 1fa4f67afd Stop falling back to a /usr/bin debugger on Windows, show an error when a non-existent miDebuggerPath is used, and stop showing "unknown error" (#6705)
Fix for #6511 and #6608
* Stop falling back to a /usr/bin debugger on Windows.
* Add error message.
* Fix unknown error.
2021-01-06 14:48:53 -08:00
Sean McManus 6254bb6ad2 Output the cppbuild command used. Fix D warnings. (#6701)
* Output the cppbuild command used. Fixes #6647 .
Also fixes "D" command line warnings with cl.exe.
Move the build result message to the end.
Handle the /nologo case and always shows the logo/header if it exists (but default to use /nologo).
2021-01-06 14:35:13 -08:00
dependabot[bot] bf6bc96437 Bump axios from 0.19.2 to 0.21.1 in /.github/actions (#6743)
Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.21.1)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-06 14:13:51 -08:00
Sean McManus 71d1f4c701 Remove references to deprecated code. (#6728) 2021-01-04 16:58:06 -08:00
Sean McManus 2ad35c83c0 Add IntelliSense crashed string and update changelog (#6674)
* Add IntelliSense crashed string.
* Update changelog.
2020-12-21 13:04:06 -08:00
Elaheh Rashedi 72c9f2115e change master to main (#6679)
* change master to main

* master to main
2020-12-17 16:04:38 -08:00
Colen Garoutte-Carson 805f884b17 Handle inactive regions when determining folding ranges (#6667) 2020-12-14 16:22:31 -08:00
Elaheh Rashedi 26726df578 check for valid user compiler path (#6606)
* valid user compiler path

* fix lint error
2020-12-14 13:48:17 -08:00
csigs b7a0279352 Localization - Translated Strings (#6664) 2020-12-14 12:45:24 -08:00
dependabot[bot] f724ae8912 Bump ini from 1.3.5 to 1.3.7 in /Extension (#6653)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-11 15:09:06 -08:00
Sean McManus ab55557ddb Cache call to which.sync('clang-format') (#6645) 2020-12-08 19:25:46 -08:00
Michelle Matias c70dc9e93b Separate "investigate costing" and "investigate" for debugger issue workflows (#6646) 2020-12-08 16:41:21 -08:00
Michelle Matias 0aaf0c5af4 Fix yaml syntax for GitHub actions (#6644) 2020-12-08 15:58:50 -08:00
Michelle Matias 29ff9be9f7 add GitHub actions for debugger issues (#6637) 2020-12-08 13:23:58 -08:00
Sean McManus 52469738d3 Update TPN. (#6529)
* Update TPN.
2020-12-04 13:26:52 -08:00
Sean McManus 8dd2efd090 Merge pull request #6601 from xymeng16/master
Allow extension's x64 binaries to run on Apple Silicon x64 emulator
2020-12-03 17:20:43 -08:00
Sean McManus 07683b02fe Merge branch 'master' into master 2020-12-03 16:13:41 -08:00
Sean McManus a0a7d5b678 Add dependencies for TPN generation. (#6621) 2020-12-03 16:13:15 -08:00
Sean McManus 3e34ba2227 Fix cwd. (#6619)
Fixes #6618
2020-12-03 14:00:20 -08:00
Colen Garoutte-Carson 08a28c3fd5 Add field to activation telemetry for web-based Codespaces (#6609) 2020-12-02 12:22:40 -08:00
Xiangyi Meng 95ae82ff5c Merge branch 'master' into master 2020-12-02 15:08:05 +08:00
Sean McManus 94294dd372 Fix infinite loop after cpptools crashes. (#6604)
* Fix infinite loop after cpptools crashes: https://github.com/microsoft/vscode-cpptools/issues/6603
2020-12-01 15:50:24 -08:00
Sean McManus 61e98c0e0d Fix cppbuild task warnings. (#6557)
* Fix cppbuild task warnings: https://github.com/microsoft/vscode-cpptools/issues/6556
2020-12-01 14:22:59 -08:00
Xiangyi Meng bb910aa280 Add support to Apple Silicon 2020-12-01 20:17:23 +08:00
Sean McManus a6c7ffd8f5 Update a loc string. (#6577) 2020-11-25 20:30:57 -08:00
Elaheh Rashedi 4c2124ebf4 Add localization to strings in LanguageServer\cppBuildTaskProvider.ts (#6544)
* localizing for task provider

* localize single_file_mode_not_available

* remove end of line from localalized string

* modify error(s)

* remove space from localized string

* remove space from localized string
2020-11-25 15:13:31 -08:00
Sean McManus aefe53cab1 Update IntelliSense strings. (#6528) 2020-11-20 12:31:25 -08:00
Sean McManus ce3d3fa403 Fix build task bugs. (#6539)
* Fix build task bugs.
* Use VS Code's variable resolution.
2020-11-19 16:09:03 -08:00
Colen Garoutte-Carson 55a9117ecf Remove telemetry for remoteName (#6537) 2020-11-18 12:54:16 -08:00
guntern e5d08d2a9e fixed problemmatcher regexp (#6490)
* fixed problemmatcher regexp so that it should work with compilers not printing the column
Co-authored-by: guntern <[email protected]>
2020-11-17 14:21:23 -08:00
csigsandazure-pipelines[bot] 3194b10e62 Localization - Translated Strings (#6533)
Co-authored-by: azure-pipelines[bot] <azure-pipelines[bot]@users.noreply.github.com>
2020-11-17 11:39:46 -08:00
Colen Garoutte-Carson 12c653fa7b Do not prompt Web-based Codespaces users to join Insiders (#6513) 2020-11-16 14:34:24 -08:00
csigsandazure-pipelines[bot] 0c32d707ab Localization - Translated Strings (#6523)
Co-authored-by: azure-pipelines[bot] <azure-pipelines[bot]@users.noreply.github.com>
2020-11-16 12:44:47 -08:00
Colen Garoutte-Carson b4e2a8457f Automatically fall back to config provider (#6504) 2020-11-13 14:29:02 -08:00
csigs f6d7577688 Localization - Translated Strings (#6499) 2020-11-11 12:54:47 -08:00
Colen Garoutte-Carson c026a827c6 Replace uses of 'probe' with 'query' (#6495) 2020-11-10 18:57:09 -08:00
Sean McManus 55421659dc Remove symbol_add_failed. (#6493)
* Remove unused strings.
2020-11-10 17:15:28 -08:00
Sean McManus 1a718f3f0e Fix fileDirname. (#6482) 2020-11-10 15:12:12 -08:00
Colen Garoutte-Carson 68078182bf Command to generate .editorconfig file (#6415) 2020-11-10 13:22:48 -08:00
Colen Garoutte-Carson 7bcbea62e9 Replace uses of process.env.HOME with os.homedir() (#6479) 2020-11-10 13:10:58 -08:00
csigs ec66642c60 Localization - Translated Strings (#6487) 2020-11-10 11:58:44 -08:00
Colen Garoutte-Carson 4119b6c263 Add string for log message regarding compiler probeability (#6463) 2020-11-09 21:45:17 -08:00
Sean McManus 49d9cfd5ee Fix invalid architectures. (#6480)
* Fix invalid architectures.
2020-11-09 15:56:54 -08:00
csigsandazure-pipelines[bot] 6867272d06 Localization - Translated Strings (#6477)
Co-authored-by: azure-pipelines[bot] <azure-pipelines[bot]@users.noreply.github.com>
2020-11-09 09:50:26 -08:00
csigs 890dae3a87 Localization - Translated Strings (#6455) 2020-11-06 11:30:56 -08:00
Sean McManus 9a7fa21028 Update cpptools.json (#6452)
* Update cpptools.json
2020-11-05 19:09:49 -08:00
Sean McManus 64de2af400 Update changelog and integrity hashes. (#6447) 2020-11-05 15:24:18 -08:00
csigs 646c3e5ca5 Localization - Translated Strings (#6440) 2020-11-04 12:10:23 -08:00
Elaheh Rashedi f0be1a2d76 add detail to menuItem (#6435) 2020-11-03 16:18:41 -08:00
Elaheh Rashedi df8523e550 "F5" using the correct build task (#6420)
* shows details correctly

* change default name

* generating unique names

* lint errors

* lint errors

* modify resolvetask

* modify details
2020-11-03 14:39:48 -08:00
David Sanders 7d7b898ee6 Fix whitespace in imports (#6421) 2020-11-03 14:12:09 -08:00
Elaheh Rashedi a94de6edff update changelog for insiders 4 (#6429)
* insiders 4

* order

* order 2

* PR #
2020-11-03 13:05:29 -08:00
csigsandDevDiv Build Lab - Dev14 6fbf85df90 Localization - Translated Strings (#6432)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-11-03 10:07:38 -08:00
csigsandDevDiv Build Lab - Dev14 dfa59e12aa Localization - Translated Strings (#6425)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-11-02 11:25:55 -08:00
Colen Garoutte-Carson 5a5903ab25 Add telemetry for machineId changes and remoteName (#6419) 2020-10-30 17:22:49 -07:00
Colen Garoutte-Carson fc7cdac41b Fix paths to edge message files (#6418) 2020-10-30 16:22:02 -07:00
Andrew Wang 68733b4ea6 Update DebugServerPath description (#6414) 2020-10-30 14:17:48 -07:00
csigsandDevDiv Build Lab - Dev14 9a9d58f76b Localization - Translated Strings (#6416)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-10-30 10:15:11 -07:00
Sean McManus 3dd3e8857f Don't register cppvsdbg for Windows ARM. (#6401) 2020-10-29 13:33:07 -07:00
Colen Garoutte-Carson b25e5192bb Various bug fixes with vcFormat (#6408) 2020-10-29 11:37:09 -07:00
csigs c18f3f67b3 Localization - Translated Strings (#6405) 2020-10-28 12:49:22 -07:00
Elaheh Rashedi e5b3136d3b show details of the compiler path (#6377)
* show details of the compiler path

* remove detail from launch.json

* rename noDetailConfig

* lint error

* add comments
2020-10-27 17:26:01 -07:00
Elaheh Rashedi 554c91430b fix terminal issues (windows/linux/linux-on-wsl verified) (#6384)
* fix tab issues on g++ on windows

* add ;

* windows+linux verified
2020-10-27 13:03:28 -07:00
csigs 5ee1034856 Localization - Translated Strings (#6400) 2020-10-27 11:11:11 -07:00
Andrew Wang dcc1f93f1c ResolveDebugConfigurationWithSubstitutedVariable (#6382)
Add resolveDebugConfigurationWithSubstitutedVariables for
configurationProviders.

Keeping resolveDebugConfiguration to return null if type is not provided
in order to prompt `provideDebugConfiguration`.
2020-10-26 15:00:21 -07:00
csigsandDevDiv Build Lab - Dev14 7690c1a1dd Localization - Translated Strings (#6380)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-10-26 13:21:41 -07:00
Elaheh Rashedi 3832029be4 don't overwrite options and args (#6374)
* dont overwrite options and args

* linter error

* update changelog
2020-10-22 16:47:23 -07:00
Sean McManus 61ab30fe87 Fix insiders bug. (#6373) 2020-10-22 14:56:12 -07:00
Andrew Wang 839eefa032 [cppdbg] Support new sourceFileMap schema (#6319)
* [cppdbg] Support new sourceFileMap schema

For cppdbg, sourceFileMap can be used for binding breakpoints.
If keeping with the old format "<source-path>":"<target-path>", it will
always be used for breakpoints.

If you use the new:
"<compile-path>" : {
   "editorPath": "<target-path>",
   "useForBreakpoints": true
}

The sourceMap will only be used for frame enumeration.

* Fix linter issues

* Addressing PR comments
2020-10-22 13:36:06 -07:00
Sean McManus 7779eb0a56 update1 1 0 insider3 changelog (#6371)
* Update changelog.
2020-10-22 13:27:16 -07:00
csigsandDevDiv Build Lab - Dev14 da43cf9b15 Localization - Translated Strings (#6367)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-10-21 11:20:54 -07:00
Sean McManus 73653f894e Fixes for Windows ARM64 (#6337)
* Fixes for Windows ARM64
* Update node types version.
2020-10-20 19:38:16 -07:00
余腾靖 12feb81aa1 Add intelliSenseUpdateDelay setting (#6344)
* Add intelliSenseUpdateDelay setting
* Typo: settings_spaceWithinSquareBracketse -> settings_spaceWithinSquareBrackets
2020-10-20 10:54:37 -07:00
Elaheh Rashedi e41b32c5cd setup time (#6351) 2020-10-19 12:59:38 -07:00
Colen Garoutte-Carson f73d351981 Action bug fixes (#6336) 2020-10-16 17:44:29 -07:00
Elaheh Rashedi 5f43d5fcc1 add telemetry updates for openfile (#6257)
* copy ClientCollection.ts

* copy extension.ts

* copy client.ts

* rename LS message

* create new file

* spath to path

* remove uri with logged telemtery

* fix linter errors

* fix linter errors 2

* fix linter error 3

* change warm start collection

* nit

* bring setDidOpenTime to the beginnign of didOpen

* reply to reviews
2020-10-16 17:18:54 -07:00
Colen Garoutte-Carson 444b3ccb9e Add action to reopen feature requests that get enough votes (#6305) 2020-10-16 14:14:12 -07:00
Sean McManus a052d76f62 Revert "Use 'resolveDebugConfigWithSubVariables' (#6328)" (#6331)
This reverts commit 2ec525e129.
2020-10-15 19:46:51 -07:00
Colen Garoutte-Carson 8ac65e65b5 Only show warning channel the first time populated (#6330) 2020-10-15 17:55:42 -07:00
Andrew Wang 2ec525e129 Use 'resolveDebugConfigWithSubVariables' (#6328)
This PR uses the
DebugConfigurationProvider.resolveDebugConfigurationWithSubstitutedVariables
which allows the debug configuration to wait for the preLaunchTask to
complete before continuing on and resolving variables that may have been
set in the 'tasks.json'.

This also resolves the logging issue where the 'Build and Debug Active
File' preLaunchTask uses the current file but we switch to the output
window for logging.
2020-10-15 16:13:32 -07:00
Sean McManus b124e441fa Update changelog for 1.1.0-insiders2. (#6327) 2020-10-15 15:55:41 -07:00
Colen Garoutte-Carson ff6fd3473b Remove files for Azure Pipeline CI (#6313) 2020-10-13 21:44:35 -07:00
Colen Garoutte-Carson da110e78f0 CI workflows based on GitHub actions (#6312) 2020-10-13 20:07:52 -07:00
Colen Garoutte-Carson 89f609d70b Prevent config warnings from stealing user focus (#6310) 2020-10-13 19:45:57 -07:00
Andrew Wang 9dfb2c6060 Fix 'Build and Debug Active File' race condition with EngineLogs (#6304)
* Fix 'Build and Debug Active File' race condition with EngineLogs

If users use 'Build and Debug Active File' with "engineLogging", the resolveDebugConfigurations will quickly switch to the output window and `${fileBasenameNoExtension}` will resolve to something similar to `./extension-output-#5`.

This may be a bug with VS Code determining the output window to be a file, but this will unblock users who need to enable engine logging for this scenario.
2020-10-13 17:01:59 -07:00
Colen Garoutte-Carson 20759af979 Regenerate action JS files (#6306) 2020-10-13 13:41:03 -07:00
Colen Garoutte-Carson 2dbe8e4366 Fix issue causing locker action to lock closed issues too early (#6303) 2020-10-13 12:00:22 -07:00
Sean McManus f94e7e05e0 Update changelog. (#6299)
* Update changelog.
2020-10-13 01:03:30 -07:00
Sean McManus aa2b618ff6 Update VS version. (#6298) 2020-10-12 18:31:20 -07:00
Colen Garoutte-Carson 551642a987 Add timestamps to config warning output (#6297) 2020-10-12 18:10:02 -07:00
csigs c1c59368c1 Localization - Translated Strings (#6295) 2020-10-12 12:59:42 -07:00
Colen Garoutte-Carson 6aa6146689 Add closers for 'by design' and 'duplicate' issues (#6286) 2020-10-09 13:23:54 -07:00
csigsandvs-mobiletools-engineering-service2 558a3cf892 Localization - Translated Strings (#6287)
Co-authored-by: vs-mobiletools-engineering-service2 <[email protected]>
2020-10-09 10:23:24 -07:00
Colen Garoutte-Carson 659cc18243 Corrected some missed occurances of gnu18 -> gnu17 (#6284) 2020-10-08 17:49:34 -07:00
Colen Garoutte-Carson 1e5c015f99 Restrict feature request close action to Triage and Backlog milestones (#6283) 2020-10-08 16:15:33 -07:00
Colen Garoutte-Carson 225a8631d2 Add custom actions to close and lock stale issues (#6241) 2020-10-08 14:11:31 -07:00
csigsandvs-mobiletools-engineering-service2 b8cd5d8bb0 Localization - Translated Strings (#6274)
Co-authored-by: vs-mobiletools-engineering-service2 <[email protected]>
2020-10-08 10:45:07 -07:00
csigs 9fcdafb9cc [Auto] Localization - Translated Strings (#6268) 2020-10-07 16:43:48 -07:00
Sean McManus c71e06a208 Update changelog for 1.1.0-insiders. (#6263) 2020-10-06 16:14:01 -07:00
csigsandDevDiv Build Lab - Dev14 77319d5ce0 Localization - Translated Strings (#6261)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-10-06 16:02:59 -07:00
Michelle Matias 7dcf4db276 Add memory usage limit of an IntelliSense process (#6240) 2020-10-05 14:19:12 -07:00
csigs eac4703376 Localization - Translated Strings (#6253) 2020-10-05 12:35:50 -07:00
csigsandDevDiv Build Lab - Dev14 ca4482d664 Localization - Translated Strings (#6243)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-10-02 10:51:25 -07:00
Sean McManus b31c42e629 Update IntelliSense localized strings. (#6220) 2020-10-01 16:28:18 -07:00
csigs 754dd9a440 Localization - Translated Strings (#6233) 2020-09-30 12:10:32 -07:00
Elaheh Rashedi 25dc96ac27 build clang-format binary for Windows32 instead of 64 (#6223)
* update fwlink

* updare integrity
2020-09-29 22:57:58 -07:00
Sean McManus 1a03dd2a1d Add runtime licenses (#6140)
* Add RuntimeLicenses
* Update version and fwlinks.
* Update gitignore.
2020-09-29 13:36:19 -07:00
csigsandDevDiv Build Lab - Dev14 2136b84aae Localization - Translated Strings (#6227)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-09-29 10:23:11 -07:00
Colen Garoutte-Carson 9c835e5370 Add logging/warnings when compile probing alters explicit user configuration details (#6180) 2020-09-28 17:26:34 -07:00
csigsandDevDiv Build Lab - Dev14 0a09372f61 Localization - Translated Strings (#6219)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2020-09-28 10:06:11 -07:00
Sean McManus af1ab619e6 Merge pull request #6187 from microsoft/bobbrow/mergeToMaster
Merge changes made in release branch to master
2020-09-25 16:07:14 -07:00
Colen Garoutte-Carson d07c90b6aa Merge branch 'master' into bobbrow/mergeToMaster 2020-09-24 14:03:19 -07:00
csigs 1b8f652d97 Localization - Translated Strings (#6155) 2020-09-24 14:02:59 -07:00
Elaheh Rashedi 7817a10b5f remove extra telemtery (#6206) 2020-09-24 12:59:21 -07:00
Michelle Matias 6eeff1ab02 Disable Linux test (#6203) 2020-09-23 17:22:05 -07:00
Colen Garoutte-Carson bc0770aa9b Revert "Add showWarning message and output channel"
This reverts commit d737c07a10.
2020-09-22 17:54:06 -07:00
Colen Garoutte-Carson d737c07a10 Add showWarning message and output channel 2020-09-22 17:32:40 -07:00
40e28c2a85 Task Provider Feature (#5659)
* adding standard std version to clang_format_style

* add new cppBuildTaskProvider

* add Sean's changes  to tasks

* draft

* draft 2

* draft 3 - working

* windows version

* fix cwd path

* fix cwd

* change header and source file set

* minor changes

* make new instance

* create new instance

* remove compilerPath input

* review changes

* solving the error due to space in file name

* showing the error message

* fix lint

* add set timeout and setinterval from timers

* Rename cppbuildTaskProvider.ts to cppBuildTaskProvider.ts

* fire the events with zero

* delete filewatcher

* localize strings

* change changelog.md

* changelog

* changelog

* change format

* wait dobuild

* use checkFileExists

* after test

* after test2

* add properties

* change the doBuild

* this.closeEmitter.fire(result);

* change doBuild

* very minor change

* label vs name resolved

* draft

* draft for Sean

* before cleaning the code

* Stable, Clean, Before API proposal

* adding details to the tasks menue

* add TODO

* remove extra ",remove description,merge from local

* remove task rename in this versoin

* remove TODOs

* merge the "default" stuff

* remove some parts of proposals

* fix linter errors

* add import * as which from 'which';

* clean up the code after version 1.0.0

* add new line

* adapt to the new Vs Code API

* linter error

* revert changelog

Co-authored-by: Elaheh Rashedi <[email protected]>
Co-authored-by: Sean McManus <[email protected]>
2020-09-22 12:52:10 -07:00
Bob Brown (DEVDIV) 79d0b01722 Merge branch 'bobbrow/mergeToMaster' of https://github.com/Microsoft/vscode-cpptools into bobbrow/mergeToMaster 2020-09-22 10:25:24 -07:00
Bob Brown (DEVDIV) 8ad680b57b removing duplicate installation stage 2020-09-22 10:25:19 -07:00
Bob Brown 1822556dc2 Merge branch 'master' into bobbrow/mergeToMaster 2020-09-22 10:22:23 -07:00
Bob Brown (DEVDIV) f2ca7a2c03 update package.json 2020-09-22 10:20:27 -07:00
Sean McManusandColen Garoutte-Carson 0940fb709c Merge pull request #6177 from microsoft/1.0.1
* Fix issue with LSP process not getting shut down gracefully (#6141)
* Update version number and changelog
* Update changelog, fwlinks, and hashes.

Co-authored-by: Colen Garoutte-Carson <[email protected]>
Co-authored-by: Sean McManus <[email protected]>
2020-09-21 16:51:25 -07:00
Sean McManus 9d79f0ff2b Update changelog, fwlinks, and hashes. 2020-09-21 15:38:48 -07:00
Bob Brown (DEVDIV) c23d218403 Update version 2020-09-21 12:21:45 -07:00
Bob Brown (DEVDIV) 8dacea0cd5 Update changelog 2020-09-21 12:20:18 -07:00
Bob Brown (DEVDIV) 04e93a9bb4 update changelog 2020-09-16 15:55:32 -07:00
Bob Brown (DEVDIV) a17c8e6dd4 remove #6147 from the list of fixes 2020-09-16 15:27:10 -07:00
Bob Brown (DEVDIV) 4508c95dac one more changelog update 2020-09-16 13:30:15 -07:00
Bob Brown (DEVDIV) bcc45e5d60 Update version number and changelog 2020-09-16 13:28:29 -07:00
Colen Garoutte-Carson df83a38c61 Fix issue with LSP process not getting shut down gracefully (#6141) 2020-09-16 13:00:53 -07:00
csigs 348be98436 Localization - Translated Strings (#6146) 2020-09-15 14:37:24 -07:00
Colen Garoutte-Carson 927a0a8995 Fix casing of some loc strings (#6098) 2020-09-15 13:45:03 -07:00
Colen Garoutte-Carson 9f8a5ad797 Fix issue with LSP process not getting shut down gracefully (#6141) 2020-09-15 13:23:46 -07:00
Sean McManus 27b5faca11 Merge pull request #5998 from devabhishekpal/provider_5871
Refactored provider classes from client.ts to providers.ts
2020-09-14 18:07:08 -07:00
Sean McManus fc72913cb5 Merge branch 'master' into provider_5871 2020-09-14 14:44:58 -07:00
Sean McManus 857256b753 Update node-fetch. (#6119) 2020-09-14 14:35:29 -07:00
Sean McManus c2af2c9296 Fix jsonc handling for non-active c_cpp_properties.json. (#6133) 2020-09-14 14:15:02 -07:00
Abhishek Pal 6aab5a14f7 Merge branch 'master' into provider_5871 2020-09-10 20:23:52 +05:30
Abhishek Pal c1a5f25b5b Update renameProvider.ts 2020-09-10 17:08:23 +05:30
Abhishek Pal be06726777 Update onTypeFormattingEditProvider.ts 2020-09-10 17:07:55 +05:30
Abhishek Pal 888d38632a Update documentSymbolProvider.ts 2020-09-10 17:07:30 +05:30
Abhishek Pal 2f35092acf Update documentFormattingEditProvider.ts 2020-09-10 17:07:01 +05:30
Abhishek Pal 75b4240b3e Update client.ts 2020-09-10 17:06:09 +05:30
Abhishek Pal b5ac4e8515 Update .eslintrc.js
Updated .eslintrc.js
2020-09-10 15:47:00 +05:30
Abhishek Pal 99b956c319 Update client.ts
Fixed linter errors
2020-09-10 00:37:43 +05:30
Abhishek Pal dd1ab75d13 Fixed eror on line 1360 2020-09-09 14:36:33 +05:30
Sean McManus 58e60ac36a Merge branch 'master' into provider_5871 2020-09-08 12:14:47 -07:00
Abhishek Pal e1596fe3a9 Updated client with current master and fixed extra spaces 2020-09-06 00:27:06 +05:30
Abhishek Pal 66a9890551 Revert "Undo previous commit and changing variables to public static"
This reverts commit d04aa1c4a5.
2020-09-05 23:13:10 +05:30
Abhishek Pal d04aa1c4a5 Undo previous commit and changing variables to public static 2020-09-04 16:44:53 +05:30
Abhishek Pal 536a94ca3d Revert "Refactored the params into DefaultClient as static members"
This reverts commit ff24cdf33a.
2020-09-04 16:27:00 +05:30
devabhishekpal ff24cdf33a Refactored the params into DefaultClient as static members 2020-09-02 14:16:39 +05:30
Abhishek Pal babafd20d0 Merge branch 'master' into provider_5871 2020-08-26 14:18:23 +05:30
Abhishek Pal d688979d4f Moved all providers to Providers folder and removed holder classes 2020-08-26 14:17:35 +05:30
Abhishek Pal f9c1dec542 Deleted wrong commit 2020-08-25 22:53:23 +05:30
Abhishek Pal 834bfbc8eb Add localization title and changed sentence 2020-08-25 22:47:02 +05:30
Abhishek Pal 64cf9270ed Merge branch 'provider_5871' of https://github.com/devabhishekpal/vscode-cpptools into provider_5871 2020-08-22 16:46:58 +05:30
Abhishek Pal 02cc49b5ab Refixed spaces for linting 2020-08-22 16:46:37 +05:30
Abhishek Pal 742299309b Merge branch 'master' into provider_5871 2020-08-22 16:42:35 +05:30
Abhishek Pal 42664952a1 Fixed linting issues 2020-08-22 16:40:21 +05:30
Abhishek Pal 5aa64f156d Created individual files for providers 2020-08-22 16:16:43 +05:30
Abhishek Pal d390344167 Merge branch 'provider_5871' of https://github.com/devabhishekpal/vscode-cpptools into provider_5871 2020-08-21 23:41:19 +05:30
Abhishek Pal 8e2b2e67b7 Added comment lines for azure pipeline error 2020-08-21 23:40:46 +05:30
Sean McManus ea26e533c0 Merge branch 'master' into provider_5871 2020-08-21 10:08:05 -07:00
Abhishek Pal 18b7f8d8e4 Fixed lint errors in Azure pipeline 2020-08-21 16:16:55 +05:30
Abhishek Pal fa1b16293e Refactored provider classes from client.ts 2020-08-21 16:00:53 +05:30
305 changed files with 11634 additions and 3267 deletions
+5
View File
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Discussion or question
url: https://github.com/microsoft/vscode-cpptools/discussions/new
about: Please use our Discussions board to start a discussion or to ask a question.
+3
View File
@@ -0,0 +1,3 @@
# ignore dependency packages
node_modules
*.js.map
+43
View File
@@ -0,0 +1,43 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Locker = void 0;
const utils_1 = require("../common/utils");
const ActionBase_1 = require("../common/ActionBase");
class Locker extends ActionBase_1.ActionBase {
constructor(github, daysSinceClose, daysSinceUpdate, labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes) {
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
this.github = github;
this.daysSinceClose = daysSinceClose;
this.daysSinceUpdate = daysSinceUpdate;
}
async run() {
const closedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.daysSinceClose);
const updatedTimestamp = 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) => {
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();
}
else {
if (hydrated.locked) {
console.log(`Issue ${hydrated.number} is already locked. Ignoring`);
}
else if (hydrated.open) {
console.log(`Issue ${hydrated.number} is open. Ignoring`);
}
}
}));
}
}
}
exports.Locker = Locker;
//# sourceMappingURL=Locker.js.map
+55
View File
@@ -0,0 +1,55 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
export class Locker extends ActionBase {
constructor(
private github: GitHub,
private daysSinceClose: number,
private daysSinceUpdate: number,
labels?: string,
milestoneName?: string,
milestoneId?: string,
ignoreLabels?: string,
ignoreMilestoneNames?: string,
ignoreMilestoneIds?: string,
minimumVotes?: number,
maximumVotes?: number
)
{
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
}
async run() {
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()
if (!hydrated.locked && hydrated.open === false && this.validateIssue(hydrated)
// TODO: Verify closed and updated timestamps
) {
console.log(`Locking issue ${hydrated.number}`)
await issue.lockIssue()
} else {
if (hydrated.locked) {
console.log(`Issue ${hydrated.number} is already locked. Ignoring`)
} else if (hydrated.open) {
console.log(`Issue ${hydrated.number} is open. Ignoring`)
}
}
}),
)
}
}
}
+33
View File
@@ -0,0 +1,33 @@
name: Locker
description: Lock closed issues and PRs after some time has passed
inputs:
token:
description: GitHub token with issue, comment, and label read/write permissions
default: ${{ github.token }}
daysSinceClose:
description: Days to wait since closing before locking the item
required: true
daysSinceUpdate:
description: days to wait since the last interaction before locking the item
required: true
milestoneName:
description: items with these milestones will be considered (name only, must match ID)
milestoneId:
description: items with these milestones will be considered (id only, must match name)
labels:
description: items with these labels will not be considered. May be "*".
ignoreMilestoneNames:
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
ignoreMilestoneIds:
description: items with these milestones will not be considered (IDs only, must match names)
ignoreLabels:
description: items with these labels will not be considered
minimumVotes:
descriptions: Only issues with at least this many votes will be considered.
maximumVotes:
descriptions: Only issues fewer or equal to this many votes will be considered.
readonly:
description: If true, changes are not applied.
runs:
using: 'node12'
main: 'index.js'
+20
View File
@@ -0,0 +1,20 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../common/utils");
const Locker_1 = require("./Locker");
const Action_1 = require("../common/Action");
class LockerAction extends Action_1.Action {
constructor() {
super(...arguments);
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();
}
}
new LockerAction().run(); // eslint-disable-line
//# sourceMappingURL=index.js.map
+31
View File
@@ -0,0 +1,31 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
class LockerAction extends Action {
id = 'Locker'
async onTriggered(github: OctoKit) {
await new Locker(
github,
+getRequiredInput('daysSinceClose'),
+getRequiredInput('daysSinceUpdate'),
getInput('labels') || undefined,
getInput('milestoneName') || undefined,
getInput('milestoneId') || undefined,
getInput('ignoreLabels') || undefined,
getInput('ignoreMilestoneNames') || undefined,
getInput('ignoreMilestoneIds') || undefined,
+(getInput('minimumVotes') || 0),
+(getInput('maximumVotes') || 9999999)
).run()
}
}
new LockerAction().run() // eslint-disable-line
+72
View File
@@ -0,0 +1,72 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Reopener = void 0;
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) {
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
this.github = github;
this.alsoApplyToOpenIssues = alsoApplyToOpenIssues;
this.addLabels = addLabels;
this.removeLabels = removeLabels;
this.reopenComment = reopenComment;
this.setMilestoneId = setMilestoneId;
}
async run() {
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
console.log(`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();
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();
}
if (this.setMilestoneId != undefined) {
console.log(`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);
}
}
}
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);
}
}
}
if (this.reopenComment) {
console.log(`Posting comment to issue ${hydrated.number}.`);
await issue.postComment(this.reopenComment);
}
}
else {
if (hydrated.locked) {
console.log(`Issue ${hydrated.number} is locked. Ignoring`);
}
else if (!this.alsoApplyToOpenIssues && hydrated.open) {
console.log(`Issue ${hydrated.number} is open. Ignoring`);
}
}
}));
}
}
}
exports.Reopener = Reopener;
//# sourceMappingURL=Reopener.js.map
+84
View File
@@ -0,0 +1,84 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
export class Reopener extends ActionBase {
constructor(
private github: GitHub,
private alsoApplyToOpenIssues: boolean,
private addLabels?: string,
private removeLabels?: string,
private reopenComment?: string,
private setMilestoneId?: string,
labels?: string,
milestoneName?: string,
milestoneId?: string,
ignoreLabels?: string,
ignoreMilestoneNames?: string,
ignoreMilestoneIds?: string,
minimumVotes?: number,
maximumVotes?: number
)
{
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
}
async run() {
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
console.log(`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()
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()
}
if (this.setMilestoneId != undefined) {
console.log(`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)
}
}
}
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)
}
}
}
if (this.reopenComment) {
console.log(`Posting comment to issue ${hydrated.number}.`)
await issue.postComment(this.reopenComment)
}
} else {
if (hydrated.locked) {
console.log(`Issue ${hydrated.number} is locked. Ignoring`)
} else if (!this.alsoApplyToOpenIssues && hydrated.open) {
console.log(`Issue ${hydrated.number} is open. Ignoring`)
}
}
}),
)
}
}
}
+37
View File
@@ -0,0 +1,37 @@
name: Locker
description: Lock closed issues and PRs after some time has passed
inputs:
token:
description: GitHub token with issue, comment, and label read/write permissions
default: ${{ github.token }}
alsoApplyToOpenIssues:
description: If true, applies to issues that are already opened (to add/remove labels, etc., but not reopen).
addLabels:
description: Labels to add to issue as it is reopend.
reopenComment:
description: Comment to add upon reopening the issue.
setMilestoneId:
description: Milestone to set reopened issue to.
removeLabels:
description: Labels to remove from issue as it is reopened.
milestoneName:
description: items with these milestones will be considered (name only, must match ID)
milestoneId:
description: items with these milestones will be considered (id only, must match name)
labels:
description: items with these labels will not be considered. May be "*".
ignoreMilestoneNames:
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
ignoreMilestoneIds:
description: items with these milestones will not be considered (IDs only, must match names)
ignoreLabels:
description: items with these labels will not be considered
minimumVotes:
descriptions: Only issues with at least this many votes will be considered.
maximumVotes:
descriptions: Only issues fewer or equal to this many votes will be considered.
readonly:
description: If true, changes are not applied.
runs:
using: 'node12'
main: 'index.js'
+21
View File
@@ -0,0 +1,21 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../common/utils");
const Reopener_1 = require("./Reopener");
const Action_1 = require("../common/Action");
class ReopenerAction extends Action_1.Action {
constructor() {
super(...arguments);
this.id = 'Locker';
}
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();
}
}
new ReopenerAction().run(); // eslint-disable-line
//# sourceMappingURL=index.js.map
+35
View File
@@ -0,0 +1,35 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
class ReopenerAction extends Action {
id = 'Locker'
async onTriggered(github: OctoKit) {
const alsoApplyToOpenIssues: string | undefined = getInput('alsoApplyToOpenIssues');
await new Reopener(
github,
alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true',
getInput('addLabels') || undefined,
getInput('removeLabels') || undefined,
getInput('reopenComment') || '',
getInput('setMilestoneId') || undefined,
getInput('labels') || undefined,
getInput('milestoneName') || undefined,
getInput('milestoneId') || undefined,
getInput('ignoreLabels') || undefined,
getInput('ignoreMilestoneNames') || undefined,
getInput('ignoreMilestoneIds') || undefined,
+(getInput('minimumVotes') || 0),
+(getInput('maximumVotes') || 9999999)
).run()
}
}
new ReopenerAction().run() // eslint-disable-line
+106
View File
@@ -0,0 +1,106 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.StaleCloser = void 0;
const ActionBase_1 = require("../common/ActionBase");
const utils_1 = require("../common/utils");
class StaleCloser extends ActionBase_1.ActionBase {
constructor(github, closeDays, labels, closeComment, pingDays, pingComment, additionalTeam, addLabels, removeLabels, setMilestoneId, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves) {
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves);
this.github = github;
this.closeDays = closeDays;
this.closeComment = closeComment;
this.pingDays = pingDays;
this.pingComment = pingComment;
this.additionalTeam = additionalTeam;
this.addLabels = addLabels;
this.removeLabels = removeLabels;
this.setMilestoneId = setMilestoneId;
}
async run() {
const updatedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.closeDays);
const pingTimestamp = this.pingDays ? 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(',') : [];
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();
if (lastCommentIterator.done) {
throw Error('Unexpected comment data');
}
const lastComment = lastCommentIterator.value[0];
if (hydrated.open && this.validateIssue(hydrated)
// TODO: Verify updated timestamp
) {
if (!lastComment ||
lastComment.author.isGitHubApp ||
pingTimestamp == undefined ||
// TODO: List the collaborators once per go rather than checking a single user each issue
this.additionalTeam.includes(lastComment.author.name) ||
await issue.hasWriteAccess(lastComment.author)) {
if (pingTimestamp != undefined) {
if (lastComment) {
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`);
}
else {
console.log(`No comments on issue ${hydrated.number}. Closing.`);
}
}
if (this.closeComment) {
console.log(`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);
}
}
}
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);
}
}
}
await issue.closeIssue();
if (this.setMilestoneId != undefined) {
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
await issue.setMilestone(+this.setMilestoneId);
}
console.log(`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}`);
if (this.pingComment) {
await issue.postComment(this.pingComment
.replace('${assignee}', hydrated.assignee)
.replace('${author}', hydrated.author.name));
}
}
else {
console.log(`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`);
}
}
}
}
}
}
exports.StaleCloser = StaleCloser;
//# sourceMappingURL=StaleCloser.js.map
+128
View File
@@ -0,0 +1,128 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
export class StaleCloser extends ActionBase {
constructor(
private github: GitHub,
private closeDays: number,
labels: string,
private closeComment: string,
private pingDays: number,
private pingComment: string,
private additionalTeam: string[],
private addLabels?: string,
private removeLabels?: string,
private setMilestoneId?: string,
milestoneName?: string,
milestoneId?: string,
ignoreLabels?: string,
ignoreMilestoneNames?: string,
ignoreMilestoneIds?: string,
minimumVotes?: number,
maximumVotes?: number,
involves?: string
)
{
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves);
}
async run() {
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");
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
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()
if (lastCommentIterator.done) {
throw Error('Unexpected comment data')
}
const lastComment = lastCommentIterator.value[0]
if (hydrated.open && this.validateIssue(hydrated)
// TODO: Verify updated timestamp
) {
if (
!lastComment ||
lastComment.author.isGitHubApp ||
pingTimestamp == undefined ||
// TODO: List the collaborators once per go rather than checking a single user each issue
this.additionalTeam.includes(lastComment.author.name) ||
await issue.hasWriteAccess(lastComment.author)
) {
if (pingTimestamp != undefined) {
if (lastComment) {
console.log(
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`,
)
} else {
console.log(`No comments on issue ${hydrated.number}. Closing.`)
}
}
if (this.closeComment) {
console.log(`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)
}
}
}
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)
}
}
}
await issue.closeIssue()
if (this.setMilestoneId != undefined) {
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`)
await issue.setMilestone(+this.setMilestoneId)
}
console.log(`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}`,
)
if (this.pingComment) {
await issue.postComment(
this.pingComment
.replace('${assignee}', hydrated.assignee)
.replace('${author}', hydrated.author.name),
)
}
} else {
console.log(
`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`)
}
}
}
}
}
}
+47
View File
@@ -0,0 +1,47 @@
name: Stale Issue Closer
description: Close issues that are marked with a specified label and were last interacted with by a contributor or bot
inputs:
token:
description: GitHub token with issue, comment, and label read/write permissions
default: ${{ github.token }}
closeDays:
description: Days to wait before closing the issue
required: true
closeComment:
description: Comment to add upon closing the issue
pingDays:
description: Days to wait before pinging the assignee, if any. If set, issue is not closed if there is an assignee.
additionalTeam:
description: Pipe-separated list of additional users to treat as team members
pingComment:
description: Comment to add when pinging assignee. ${assignee} and ${author} are replaced.
milestoneName:
description: items with these milestones will be considered (name only, must match ID)
milestoneId:
description: items with these milestones will be considered (id only, must match name)
labels:
description: items with these labels will not be considered. May be "*".
required: true
ignoreMilestoneNames:
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
ignoreMilestoneIds:
description: items with these milestones will not be considered (IDs only, must match names)
ignoreLabels:
description: items with these labels will not be considered
addLabels:
description: Labels to add to issue as it is closed.
removeLabels:
description: Labels to remove from issue as it is closed.
setMilestoneId:
description: Milestone to set closed issue to.
minimumVotes:
descriptions: Only issues with at least this many votes will be considered.
maximumVotes:
descriptions: Only issues fewer or equal to this many votes will be considered.
involves:
descriptions: Qualifier to find issues that in some way involve a certain user either as an author, assignee, or mentions.
readonly:
description: If true, changes are not applied.
runs:
using: 'node12'
main: 'index.js'
+21
View File
@@ -0,0 +1,21 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../common/utils");
const StaleCloser_1 = require("./StaleCloser");
const Action_1 = require("../common/Action");
class StaleCloserAction extends Action_1.Action {
constructor() {
super(...arguments);
this.id = 'StaleCloser';
}
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();
}
}
new StaleCloserAction().run(); // eslint-disable-line
//# sourceMappingURL=index.js.map
+38
View File
@@ -0,0 +1,38 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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 { StaleCloser } from './StaleCloser'
import { Action } from '../common/Action'
class StaleCloserAction extends Action {
id = 'StaleCloser'
async onTriggered(github: OctoKit) {
await new StaleCloser(
github,
+getRequiredInput('closeDays'),
getRequiredInput('labels'),
getInput('closeComment') || '',
+(getInput('pingDays') || 0),
getInput('pingComment') || '',
(getInput('additionalTeam') ?? '').split(','),
getInput('addLabels') || undefined,
getInput('removeLabels') || undefined,
getInput('setMilestoneId') || undefined,
getInput('milestoneName') || undefined,
getInput('milestoneId') || undefined,
getInput('ignoreLabels') || undefined,
getInput('ignoreMilestoneNames') || undefined,
getInput('ignoreMilestoneIds') || undefined,
+(getInput('minimumVotes') || 0),
+(getInput('maximumVotes') || 9999999),
getInput('involves') || undefined
).run()
}
}
new StaleCloserAction().run() // eslint-disable-line
+7
View File
@@ -0,0 +1,7 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=api.js.map
+100
View File
@@ -0,0 +1,100 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export interface GitHub {
query(query: Query): AsyncIterableIterator<GitHubIssue[]>
hasWriteAccess(user: User): Promise<boolean>
repoHasLabel(label: string): Promise<boolean>
createLabel(label: string, color: string, description: string): Promise<void>
deleteLabel(label: string): Promise<void>
readConfig(path: string): Promise<any>
dispatch(title: string): Promise<void>
createIssue(owner: string, repo: string, title: string, body: string): Promise<void>
releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'>
}
export interface GitHubIssue extends GitHub {
getIssue(): Promise<Issue>
postComment(body: string): Promise<void>
deleteComment(id: number): Promise<void>
getComments(last?: boolean): AsyncIterableIterator<Comment[]>
closeIssue(): Promise<void>
lockIssue(): Promise<void>
reopenIssue(): Promise<void>
setMilestone(milestoneId: number): Promise<void>
addLabel(label: string): Promise<void>
removeLabel(label: string): Promise<void>
addAssignee(assignee: string): Promise<void>
removeAssignee(assignee: string): Promise<void>
getClosingInfo(): Promise<{ hash: string | undefined; timestamp: number } | undefined>
}
type SortVar =
| 'comments'
| 'reactions'
| 'reactions-+1'
| 'reactions--1'
| 'reactions-smile'
| 'reactions-thinking_face'
| 'reactions-heart'
| 'reactions-tada'
| 'interactions'
| 'created'
| 'updated'
type SortOrder = 'asc' | 'desc'
export type Reactions = {
'+1': number
'-1': number
laugh: number
hooray: number
confused: number
heart: number
rocket: number
eyes: number
}
export interface User {
name: string
isGitHubApp?: boolean
}
export interface Comment {
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
}
export interface Query {
q: string
sort?: SortVar
order?: SortOrder
}
+405
View File
@@ -0,0 +1,405 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
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");
let numRequests = 0;
exports.getNumRequests = () => numRequests;
class OctoKit {
constructor(token, params, options = { readonly: false }) {
this.token = token;
this.params = params;
this.options = options;
// 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);
}
get octokit() {
numRequests++;
return this._octokit;
}
// 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({
...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));
}
else {
await new Promise((resolve) => setTimeout(resolve, 30000));
}
};
for await (const pageResponse of this.octokit.paginate.iterator(options)) {
await timeout();
numRequests++;
const page = pageResponse.data;
console.log(`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}`);
if (!this.options.readonly)
await this.octokit.issues.create({ owner, repo, title, body });
}
octokitIssueToIssue(issue) {
var _a, _b, _c, _d, _e, _f;
return {
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
body: issue.body,
number: issue.number,
title: issue.title,
labels: issue.labels.map((label) => label.name),
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,
createdAt: +new Date(issue.created_at),
updatedAt: +new Date(issue.updated_at),
closedAt: issue.closed_at ? +new Date(issue.closed_at) : undefined,
};
}
async hasWriteAccess(user) {
if (user.name in this.writeAccessCache) {
core_1.debug('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({
...this.params,
username: user.name,
})).data.permission;
return (this.writeAccessCache[user.name] = permissions === 'admin' || permissions === 'write');
}
async repoHasLabel(name) {
try {
await this.octokit.issues.getLabel({ ...this.params, name });
return true;
}
catch (err) {
if (err.status === 404) {
return this.options.readonly && this.mockLabels.has(name);
}
throw err;
}
}
async createLabel(name, color, description) {
core_1.debug('Creating label ' + name);
if (!this.options.readonly)
await this.octokit.issues.createLabel({ ...this.params, color, description, name });
else
this.mockLabels.add(name);
}
async deleteLabel(name) {
core_1.debug('Deleting label ' + name);
try {
if (!this.options.readonly)
await this.octokit.issues.deleteLabel({ ...this.params, name });
}
catch (err) {
if (err.status === 404) {
return;
}
throw err;
}
}
async readConfig(path) {
core_1.debug('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') {
if (data.encoding === 'base64' && data.content) {
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('Found directory at config path when expecting file' + JSON.stringify(data));
}
catch (e) {
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e));
}
}
async releaseContainsCommit(release, commit) {
return new Promise((resolve, reject) => child_process_1.exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
if (!err || err.code === 1) {
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');
}
else if (err.message.includes(`Not a valid commit name ${commit}`)) {
// commit is probably in a different repo.
resolve('unknown');
}
else {
reject(err);
}
}));
}
async dispatch(title) {
core_1.debug('Dispatching ' + title);
if (!this.options.readonly)
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title });
}
}
exports.OctoKit = OctoKit;
class OctoKitIssue extends OctoKit {
constructor(token, params, issueData, options = { readonly: false }) {
super(token, params, options);
this.params = params;
this.issueData = issueData;
console.log('running bot on issue', issueData.number);
}
async addAssignee(assignee) {
core_1.debug('Adding assignee ' + assignee + ' to ' + this.issueData.number);
if (!this.options.readonly) {
await this.octokit.issues.addAssignees({
...this.params,
issue_number: this.issueData.number,
assignees: [assignee],
});
}
}
async removeAssignee(assignee) {
core_1.debug('Removing assignee ' + assignee + ' to ' + this.issueData.number);
if (!this.options.readonly) {
await this.octokit.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({
...this.params,
issue_number: this.issueData.number,
state: 'closed',
});
}
async reopenIssue() {
core_1.debug('Reopening issue ' + this.issueData.number);
if (!this.options.readonly)
await this.octokit.issues.update({
...this.params,
issue_number: this.issueData.number,
state: 'open',
});
}
async lockIssue() {
core_1.debug('Locking issue ' + this.issueData.number);
if (!this.options.readonly)
await this.octokit.issues.lock({ ...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);
return this.issueData;
}
console.log('Fetching issue ' + this.issueData.number);
const issue = (await this.octokit.issues.get({
...this.params,
issue_number: this.issueData.number,
mediaType: { previews: ['squirrel-girl'] },
})).data;
return (this.issueData = this.octokitIssueToIssue(issue));
}
async postComment(body) {
core_1.debug(`Posting comment ${body} on ${this.issueData.number}`);
if (!this.options.readonly)
await this.octokit.issues.createComment({
...this.params,
issue_number: this.issueData.number,
body,
});
}
async deleteComment(id) {
core_1.debug(`Deleting comment ${id} on ${this.issueData.number}`);
if (!this.options.readonly)
await this.octokit.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}`);
if (!this.options.readonly)
await this.octokit.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({
...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),
}));
}
}
async addLabel(name) {
core_1.debug(`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({
...this.params,
issue_number: this.issueData.number,
labels: [name],
});
}
async getAssigner(assignee) {
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
...this.params,
issue_number: this.issueData.number,
});
let assigner;
for await (const event of this.octokit.paginate.iterator(options)) {
numRequests++;
const timelineEvents = event.data;
for (const timelineEvent of timelineEvents) {
if (timelineEvent.event === 'assigned' &&
timelineEvent.assignee.login === assignee) {
assigner = timelineEvent.actor.login;
}
}
}
if (!assigner) {
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.');
}
return assigner;
}
async removeLabel(name) {
core_1.debug(`Removing label ${name} from ${this.issueData.number}`);
try {
if (!this.options.readonly)
await this.octokit.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;
}
throw err;
}
}
async getClosingInfo(alreadyChecked = []) {
var _a, _b, _c, _d, _e, _f, _g;
if (alreadyChecked.includes(this.issueData.number)) {
return undefined;
}
alreadyChecked.push(this.issueData.number);
if ((await this.getIssue()).open) {
return;
}
const closingHashComment = /(?:\\|\/)closedWith (\S*)/;
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
...this.params,
issue_number: this.issueData.number,
});
let closingCommit;
const crossReferencing = [];
for await (const event of this.octokit.paginate.iterator(options)) {
numRequests++;
const timelineEvents = event.data;
for (const timelineEvent of timelineEvents) {
if ((timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
timelineEvent.commit_id &&
timelineEvent.commit_url
.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;
}
if (timelineEvent.event === 'commented' &&
!((_a = timelineEvent.body) === null || _a === void 0 ? void 0 : _a.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()))) {
crossReferencing.push(timelineEvent.source.issue.number);
}
}
}
// If we dont have any closing info, try to get it from linked issues (PRs).
// If there's a linked issue that was closed at almost the same time, guess it was a PR that closed this.
if (!closingCommit) {
for (const id of crossReferencing.reverse()) {
const closed = await new OctoKitIssue(this.token, this.params, {
number: id,
}, this.options).getClosingInfo(alreadyChecked);
if (closed) {
if (Math.abs(closed.timestamp - ((_g = (await this.getIssue()).closedAt) !== null && _g !== void 0 ? _g : 0)) < 5000) {
closingCommit = closed;
break;
}
}
}
}
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`);
return closingCommit;
}
}
exports.OctoKitIssue = OctoKitIssue;
function isIssue(object) {
const isIssue = 'author' in object &&
'body' in object &&
'title' in object &&
'labels' in object &&
'open' in object &&
'locked' in object &&
'number' in object &&
'numComments' in object &&
'reactions' in object &&
'milestoneId' in object;
return isIssue;
}
//# sourceMappingURL=octokit.js.map
+470
View File
@@ -0,0 +1,470 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
let numRequests = 0
export const getNumRequests = () => numRequests
export class OctoKit implements GitHub {
private _octokit: GitHubAPI
protected get octokit(): GitHubAPI {
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()
constructor(
protected token: string,
protected params: { repo: string; owner: string },
protected options: { readonly: boolean } = { readonly: false },
) {
this._octokit = new GitHubAPI(token)
}
// 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 options = this.octokit.search.issuesAndPullRequests.endpoint.merge({
...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))
} else {
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(' ')}`)
yield page.map(
(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 })
}
protected octokitIssueToIssue(
issue: Octokit.IssuesGetResponse | Octokit.SearchIssuesAndPullRequestsResponseItemsItem,
): Issue {
return {
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
body: issue.body,
number: issue.number,
title: issue.title,
labels: (issue.labels as Octokit.IssuesGetLabelResponse[]).map((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,
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,
}
}
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]
}
debug('Fetching permissions for ' + user)
const permissions = (
await this.octokit.repos.getCollaboratorPermissionLevel({
...this.params,
username: user.name,
})
).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
} catch (err) {
if (err.status === 404) {
return this.options.readonly && this.mockLabels.has(name)
}
throw err
}
}
async createLabel(name: string, color: string, description: string): Promise<void> {
debug('Creating label ' + name)
if (!this.options.readonly)
await this.octokit.issues.createLabel({ ...this.params, color, description, name })
else this.mockLabels.add(name)
}
async deleteLabel(name: string): Promise<void> {
debug('Deleting label ' + name)
try {
if (!this.options.readonly) await this.octokit.issues.deleteLabel({ ...this.params, name })
} catch (err) {
if (err.status === 404) {
return
}
throw err
}
}
async readConfig(path: string): Promise<any> {
debug('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') {
if (data.encoding === 'base64' && data.content) {
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('Found directory at config path when expecting file' + JSON.stringify(data))
} catch (e) {
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e))
}
}
async releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | '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')
} else if (err.message.includes(`Not a valid commit name ${release}`)) {
// release branch is forked. Probably in endgame. Not released.
resolve('no')
} else if (err.message.includes(`Not a valid commit name ${commit}`)) {
// commit is probably in a different repo.
resolve('unknown')
} else {
reject(err)
}
}),
)
}
async dispatch(title: string): Promise<void> {
debug('Dispatching ' + title)
if (!this.options.readonly)
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title })
}
}
export class OctoKitIssue extends OctoKit implements GitHubIssue {
constructor(
token: string,
protected params: { repo: string; owner: string },
private issueData: { number: number } | Issue,
options: { readonly: boolean } = { readonly: false },
) {
super(token, params, options)
console.log('running bot on issue', issueData.number)
}
async addAssignee(assignee: string): Promise<void> {
debug('Adding assignee ' + assignee + ' to ' + this.issueData.number)
if (!this.options.readonly) {
await this.octokit.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)
if (!this.options.readonly) {
await this.octokit.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({
...this.params,
issue_number: this.issueData.number,
state: 'closed',
})
}
async reopenIssue(): Promise<void> {
debug('Reopening issue ' + this.issueData.number)
if (!this.options.readonly)
await this.octokit.issues.update({
...this.params,
issue_number: this.issueData.number,
state: 'open',
})
}
async lockIssue(): Promise<void> {
debug('Locking issue ' + this.issueData.number)
if (!this.options.readonly)
await this.octokit.issues.lock({ ...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
}
console.log('Fetching issue ' + this.issueData.number)
const issue = (
await this.octokit.issues.get({
...this.params,
issue_number: this.issueData.number,
mediaType: { previews: ['squirrel-girl'] },
})
).data
return (this.issueData = this.octokitIssueToIssue(issue))
}
async postComment(body: string): Promise<void> {
debug(`Posting comment ${body} on ${this.issueData.number}`)
if (!this.options.readonly)
await this.octokit.issues.createComment({
...this.params,
issue_number: this.issueData.number,
body,
})
}
async deleteComment(id: number): Promise<void> {
debug(`Deleting comment ${id} on ${this.issueData.number}`)
if (!this.options.readonly)
await this.octokit.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}`)
if (!this.options.readonly)
await this.octokit.issues.update({
...this.params,
issue_number: this.issueData.number,
milestone: milestoneId,
})
}
async *getComments(last?: boolean): AsyncIterableIterator<Comment[]> {
debug('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 } : {}),
}),
)
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,
id: comment.id,
timestamp: +new Date(comment.created_at),
}))
}
}
async addLabel(name: string): Promise<void> {
debug(`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({
...this.params,
issue_number: this.issueData.number,
labels: [name],
})
}
async getAssigner(assignee: string): Promise<string> {
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
...this.params,
issue_number: this.issueData.number,
})
let assigner: string | undefined
for await (const event of this.octokit.paginate.iterator(options)) {
numRequests++
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
for (const timelineEvent of timelineEvents) {
if (
timelineEvent.event === 'assigned' &&
(timelineEvent as any).assignee.login === assignee
) {
assigner = timelineEvent.actor.login
}
}
}
if (!assigner) {
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.')
}
return assigner
}
async removeLabel(name: string): Promise<void> {
debug(`Removing label ${name} from ${this.issueData.number}`)
try {
if (!this.options.readonly)
await this.octokit.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
}
throw err
}
}
async getClosingInfo(
alreadyChecked: number[] = [],
): Promise<{ hash: string | undefined; timestamp: number } | undefined> {
if (alreadyChecked.includes(this.issueData.number)) {
return undefined
}
alreadyChecked.push(this.issueData.number)
if ((await this.getIssue()).open) {
return
}
const closingHashComment = /(?:\\|\/)closedWith (\S*)/
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
...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++
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
for (const timelineEvent of timelineEvents) {
if (
(timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
timelineEvent.commit_id &&
timelineEvent.commit_url
.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
}
if (
timelineEvent.event === 'commented' &&
!((timelineEvent as any).body as string)?.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') &&
closingHashComment.test((timelineEvent as any).body)
) {
closingCommit = {
hash: closingHashComment.exec((timelineEvent as any).body)![1],
timestamp: +new Date(timelineEvent.created_at),
}
}
if (
timelineEvent.event === 'cross-referenced' &&
(timelineEvent as any).source?.issue?.number &&
(timelineEvent as any).source?.issue?.pull_request?.url.includes(
`/${this.params.owner}/${this.params.repo}/`.toLowerCase(),
)
) {
crossReferencing.push((timelineEvent as any).source.issue.number)
}
}
}
// If we dont have any closing info, try to get it from linked issues (PRs).
// If there's a linked issue that was closed at almost the same time, guess it was a PR that closed this.
if (!closingCommit) {
for (const id of crossReferencing.reverse()) {
const closed = await new OctoKitIssue(this.token, this.params, {
number: id,
}, this.options).getClosingInfo(alreadyChecked)
if (closed) {
if (Math.abs(closed.timestamp - ((await this.getIssue()).closedAt ?? 0)) < 5000) {
closingCommit = closed
break
}
}
}
}
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`)
return closingCommit
}
}
function isIssue(object: any): object is Issue {
const isIssue =
'author' in object &&
'body' in object &&
'title' in object &&
'labels' in object &&
'open' in object &&
'locked' in object &&
'number' in object &&
'numComments' in object &&
'reactions' in object &&
'milestoneId' in object
return isIssue
}
+129
View File
@@ -0,0 +1,129 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Action = void 0;
const octokit_1 = require("../api/octokit");
const github_1 = require("@actions/github");
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);
}
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,
},
});
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');
}
}
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;
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);
}
else if (github_1.context.eventName === 'issues') {
switch (github_1.context.payload.action) {
case 'opened':
await this.onOpened(octokit);
break;
case 'reopened':
await this.onReopened(octokit);
break;
case 'closed':
await this.onClosed(octokit);
break;
case 'labeled':
await this.onLabeled(octokit, github_1.context.payload.label.name);
break;
case 'unassigned':
await this.onUnassigned(octokit, github_1.context.payload.assignee.login);
break;
case 'edited':
await this.onEdited(octokit);
break;
case 'milestoned':
await this.onMilestoned(octokit);
break;
default:
throw Error('Unexpected action: ' + github_1.context.payload.action);
}
}
}
else {
await this.onTriggered(new octokit_1.OctoKit(token, github_1.context.repo, { readonly }));
}
}
catch (e) {
await this.error(e);
}
const usage = await utils_1.getRateLimit(this.token);
}
async error(error) {
const details = {
message: `${error.message}\n${error.stack}`,
id: this.id,
user: await this.username,
};
if (github_1.context.issue.number)
details.issue = github_1.context.issue.number;
const rendered = `
Message: ${details.message}
Actor: ${details.user}
ID: ${details.id}
`;
await utils_1.logErrorToIssue(rendered, true, this.token);
core_1.setFailed(error.message);
}
async onTriggered(_octokit) {
throw Error('not implemented');
}
async onEdited(_issue) {
throw Error('not implemented');
}
async onLabeled(_issue, _label) {
throw Error('not implemented');
}
async onUnassigned(_issue, _label) {
throw Error('not implemented');
}
async onOpened(_issue) {
throw Error('not implemented');
}
async onReopened(_issue) {
throw Error('not implemented');
}
async onClosed(_issue) {
throw Error('not implemented');
}
async onMilestoned(_issue) {
throw Error('not implemented');
}
async onCommented(_issue, _comment, _actor) {
throw Error('not implemented');
}
}
exports.Action = Action;
//# sourceMappingURL=Action.js.map
+137
View File
@@ -0,0 +1,137 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
export abstract class Action {
abstract id: string
private username: Promise<string>
private token = getRequiredInput('token')
constructor() {
this.username = new GitHub(this.token).users.getAuthenticated().then((v) => v.data.name)
}
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
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')
}
}
try {
const token = getRequiredInput('token')
const readonly = !!getInput('readonly')
const issue = context?.issue?.number
if (issue) {
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') {
switch (context.payload.action) {
case 'opened':
await this.onOpened(octokit)
break
case 'reopened':
await this.onReopened(octokit)
break
case 'closed':
await this.onClosed(octokit)
break
case 'labeled':
await this.onLabeled(octokit, context.payload.label.name)
break
case 'unassigned':
await this.onUnassigned(octokit, context.payload.assignee.login)
break
case 'edited':
await this.onEdited(octokit)
break
case 'milestoned':
await this.onMilestoned(octokit)
break
default:
throw Error('Unexpected action: ' + context.payload.action)
}
}
} else {
await this.onTriggered(new OctoKit(token, context.repo, { readonly }))
}
} catch (e) {
await this.error(e)
}
const usage = await getRateLimit(this.token)
}
private async error(error: Error) {
const details: any = {
message: `${error.message}\n${error.stack}`,
id: this.id,
user: await this.username,
}
if (context.issue.number) details.issue = context.issue.number
const rendered = `
Message: ${details.message}
Actor: ${details.user}
ID: ${details.id}
`
await logErrorToIssue(rendered, true, this.token)
setFailed(error.message)
}
protected async onTriggered(_octokit: OctoKit): Promise<void> {
throw Error('not implemented')
}
protected async onEdited(_issue: OctoKitIssue): Promise<void> {
throw Error('not implemented')
}
protected async onLabeled(_issue: OctoKitIssue, _label: string): Promise<void> {
throw Error('not implemented')
}
protected async onUnassigned(_issue: OctoKitIssue, _label: string): Promise<void> {
throw Error('not implemented')
}
protected async onOpened(_issue: OctoKitIssue): Promise<void> {
throw Error('not implemented')
}
protected async onReopened(_issue: OctoKitIssue): Promise<void> {
throw Error('not implemented')
}
protected async onClosed(_issue: OctoKitIssue): Promise<void> {
throw Error('not implemented')
}
protected async onMilestoned(_issue: OctoKitIssue): Promise<void> {
throw Error('not implemented')
}
protected async onCommented(_issue: OctoKitIssue, _comment: string, _actor: string): Promise<void> {
throw Error('not implemented')
}
}
+181
View File
@@ -0,0 +1,181 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActionBase = void 0;
class ActionBase {
constructor(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves) {
this.labels = labels;
this.milestoneName = milestoneName;
this.milestoneId = milestoneId;
this.ignoreLabels = ignoreLabels;
this.ignoreMilestoneNames = ignoreMilestoneNames;
this.ignoreMilestoneIds = ignoreMilestoneIds;
this.minimumVotes = minimumVotes;
this.maximumVotes = maximumVotes;
this.involves = involves;
this.labelsSet = [];
this.ignoreLabelsSet = [];
this.ignoreMilestoneNamesSet = [];
this.ignoreMilestoneIdsSet = [];
this.ignoreAllWithLabels = false;
this.ignoreAllWithMilestones = false;
this.involvesSet = [];
}
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}`);
// 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.
// TODO: Figure out a way to convert either from milestone name to ID, or vice versa.
// If label inclusion and exclusion are mixed, exclusion will take precedence.
// For example, an issue with both labels A and B will not match if B is excluded, even if A is included.
// If a milestoneName/milestoneId are set, ignoreMilenameName/ignoreMilestoneIds are ignored.
// GitHub does not appear to support searching for all issues with milestones (not lacking a milestone). "-no:milestone" does not work.
// GitHub does not appear to support searching for all issues with labels (not lacking a label). "-no:label" does not work.
// All indicated labels must be present
if (this.labels) {
if (((_a = this.labels) === null || _a === void 0 ? void 0 : _a.length) > 2 && ((_b = this.labels) === null || _b === void 0 ? void 0 : _b.startsWith('"')) && ((_c = this.labels) === null || _c === void 0 ? void 0 : _c.endsWith('"'))) {
this.labels = this.labels.substring(1, this.labels.length - 2);
}
this.labelsSet = (_d = this.labels) === null || _d === void 0 ? void 0 : _d.split(',');
for (const str of this.labelsSet) {
if (str != "") {
query = query.concat(` label:"${str}"`);
}
}
}
// The "involves" qualifier to find issues that in some way involve a certain user.
// It is a logical OR between the author, assignee, and mentions.
if (this.involves) {
this.involvesSet = (_e = this.involves) === null || _e === void 0 ? void 0 : _e.split(',');
for (const str of this.involvesSet) {
if (str != "") {
query = query.concat(` involves:"${str}"`);
}
}
}
if (this.ignoreLabels) {
if (this.ignoreLabels == "*" && !this.labels) { // only if unlabeled
query = query.concat(` no:label`);
this.ignoreAllWithLabels = true;
}
else {
this.ignoreLabelsSet = (_f = this.ignoreLabels) === null || _f === void 0 ? void 0 : _f.split(',');
for (const str of this.ignoreLabelsSet) {
if (str != "") {
query = query.concat(` -label:"${str}"`);
}
}
}
}
if (this.milestoneName) {
query = query.concat(` milestone:"${this.milestoneName}"`);
}
else if (this.ignoreMilestoneNames) {
if (this.ignoreMilestoneNames == "*") {
query = query.concat(` no:milestone`);
this.ignoreAllWithMilestones = true;
}
else if (this.ignoreMilestoneIds) {
this.ignoreMilestoneNamesSet = this.ignoreMilestoneNames.split(',');
this.ignoreMilestoneIdsSet = this.ignoreMilestoneIds.split(',');
for (const str of this.ignoreMilestoneNamesSet) {
if (str != "") {
query = query.concat(` -milestone:"${str}"`);
}
}
}
}
return query;
}
// This is necessary because GitHub sometimes returns incorrect results,
// and because issues may get modified while we are processing them.
validateIssue(issue) {
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.`);
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.`);
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.`);
return false;
}
}
// Make sure no labels we wanted to ignore are present.
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}`);
return false;
}
}
}
}
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.`);
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}`);
return false;
}
// Make sure a milestones we wanted to ignore is not present.
if (issue.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.`);
return false;
}
}
}
}
// Verify the issue has a sufficient number of upvotes
let upvotes = 0;
if (issue.reactions) {
upvotes = issue.reactions['+1'];
}
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}`);
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}`);
return false;
}
}
return true;
}
}
exports.ActionBase = ActionBase;
//# sourceMappingURL=ActionBase.js.map
+187
View File
@@ -0,0 +1,187 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Issue } from '../api/api'
export class ActionBase {
constructor(
private labels?: string,
private milestoneName?: string,
private milestoneId?: string,
private ignoreLabels?: string,
private ignoreMilestoneNames?: string,
private ignoreMilestoneIds?: string,
private minimumVotes?: number,
private maximumVotes?: number,
private involves?: string,
) {}
private labelsSet: string[] = [];
private ignoreLabelsSet: string[] = [];
private ignoreMilestoneNamesSet: string[] = [];
private ignoreMilestoneIdsSet: string[] = [];
private ignoreAllWithLabels: boolean = false;
private ignoreAllWithMilestones: boolean = false;
private involvesSet: string[] = [];
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}`);
// 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.
// TODO: Figure out a way to convert either from milestone name to ID, or vice versa.
// If label inclusion and exclusion are mixed, exclusion will take precedence.
// For example, an issue with both labels A and B will not match if B is excluded, even if A is included.
// If a milestoneName/milestoneId are set, ignoreMilenameName/ignoreMilestoneIds are ignored.
// GitHub does not appear to support searching for all issues with milestones (not lacking a milestone). "-no:milestone" does not work.
// GitHub does not appear to support searching for all issues with labels (not lacking a label). "-no:label" does not work.
// All indicated labels must be present
if (this.labels) {
if (this.labels?.length > 2 && this.labels?.startsWith('"') && this.labels?.endsWith('"')) {
this.labels = this.labels.substring(1, this.labels.length - 2);
}
this.labelsSet = this.labels?.split(',');
for (const str of this.labelsSet) {
if (str != "") {
query = query.concat(` label:"${str}"`);
}
}
}
// The "involves" qualifier to find issues that in some way involve a certain user.
// It is a logical OR between the author, assignee, and mentions.
if (this.involves) {
this.involvesSet = this.involves?.split(',');
for (const str of this.involvesSet) {
if (str != "") {
query = query.concat(` involves:"${str}"`)
}
}
}
if (this.ignoreLabels) {
if (this.ignoreLabels == "*" && !this.labels) { // only if unlabeled
query = query.concat(` no:label`)
this.ignoreAllWithLabels = true;
} else {
this.ignoreLabelsSet = this.ignoreLabels?.split(',');
for (const str of this.ignoreLabelsSet) {
if (str != "") {
query = query.concat(` -label:"${str}"`)
}
}
}
}
if (this.milestoneName) {
query = query.concat(` milestone:"${this.milestoneName}"`)
}
else if (this.ignoreMilestoneNames) {
if (this.ignoreMilestoneNames == "*") {
query = query.concat(` no:milestone`)
this.ignoreAllWithMilestones = true;
} else if (this.ignoreMilestoneIds) {
this.ignoreMilestoneNamesSet = this.ignoreMilestoneNames.split(',');
this.ignoreMilestoneIdsSet = this.ignoreMilestoneIds.split(',');
for (const str of this.ignoreMilestoneNamesSet) {
if (str != "") {
query = query.concat(` -milestone:"${str}"`)
}
}
}
}
return query;
}
// This is necessary because GitHub sometimes returns incorrect results,
// and because issues may get modified while we are processing them.
validateIssue(issue: Issue): boolean {
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.`);
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.`);
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.`);
return false;
}
}
// Make sure no labels we wanted to ignore are present.
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}`);
return false;
}
}
}
}
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.`);
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}`);
return false;
}
// Make sure a milestones we wanted to ignore is not present.
if (issue.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.`);
return false;
}
}
}
}
// Verify the issue has a sufficient number of upvotes
let upvotes = 0;
if (issue.reactions) {
upvotes = issue.reactions['+1'];
}
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}`);
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}`);
return false;
}
}
return true;
}
}
+99
View File
@@ -0,0 +1,99 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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;
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) => {
let { body, title } = issue;
body = body !== null && body !== void 0 ? body : '';
title = title !== null && title !== void 0 ? 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);
const cleanse = (str) => {
let out = str
.toLowerCase()
.replace(/<!--.*-->/gu, '')
.replace(/.* version: .*/gu, '')
.replace(/issue type: .*/gu, '')
.replace(/vs ?code/gu, '')
.replace(/we have written.*please paste./gu, '')
.replace(/steps to reproduce:/gu, '')
.replace(/does this issue occur when all extensions are disabled.*/gu, '')
.replace(/!?\[[^\]]*\]\([^)]*\)/gu, '')
.replace(/\s+/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);
}
return out;
};
return {
body: cleanse(body),
title: cleanse(title),
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;
const usage = {};
['core', 'graphql', 'search'].forEach(async (category) => {
usage[category] = 1 - usageData[category].remaining / usageData[category].limit;
});
return usage;
};
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 };
}
else if (exports.getInput('errorLogIssueNumber')) {
return { ...github_1.context.repo, issue: +exports.getRequiredInput('errorLogIssueNumber') };
}
else {
return undefined;
}
}
catch (e) {
console.error(e);
return undefined;
}
})();
exports.logErrorToIssue = async (message, ping, token) => {
// 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') })
.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}
Repo: ${github_1.context.repo.owner}/${github_1.context.repo.repo}
<!-- Context:
${JSON.stringify(github_1.context, null, 2)
.replace(/<!--/gu, '<@--')
.replace(/-->/gu, '--@>')
.replace(/\/|\\/gu, 'slash-')}
-->
`);
};
//# sourceMappingURL=utils.js.map
+119
View File
@@ -0,0 +1,119 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* 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'
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; 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)
const isFeatureRequest =
body.includes('feature_request_template') || /Issue Type:.*Feature Request.*/.test(body)
const cleanse = (str: string) => {
let out = str
.toLowerCase()
.replace(/<!--.*-->/gu, '')
.replace(/.* version: .*/gu, '')
.replace(/issue type: .*/gu, '')
.replace(/vs ?code/gu, '')
.replace(/we have written.*please paste./gu, '')
.replace(/steps to reproduce:/gu, '')
.replace(/does this issue occur when all extensions are disabled.*/gu, '')
.replace(/!?\[[^\]]*\]\([^)]*\)/gu, '')
.replace(/\s+/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)
}
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
}
export const loadLatestRelease = async (quality: 'stable' | 'insider'): Promise<Release | undefined> =>
(await axios.get(`https://vscode-update.azurewebsites.net/api/update/darwin/${quality}/latest`)).data
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$/, '')
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
}
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 }
} else if (getInput('errorLogIssueNumber')) {
return { ...context.repo, issue: +getRequiredInput('errorLogIssueNumber') }
} else {
return undefined
}
} catch (e) {
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)
return new OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue }, { readonly: !!getInput('readonly') })
.postComment(`
Workflow: ${context.workflow}
Error: ${message}
Issue: ${ping ? `${context.repo.owner}/${context.repo.repo}#` : ''}${context.issue.number}
Repo: ${context.repo.owner}/${context.repo.repo}
<!-- Context:
${JSON.stringify(context, null, 2)
.replace(/<!--/gu, '<@--')
.replace(/-->/gu, '--@>')
.replace(/\/|\\/gu, 'slash-')}
-->
`)
}
+1437
View File
File diff suppressed because it is too large Load Diff
+21
View File
@@ -0,0 +1,21 @@
{
"name": "vscode-cpptools-github-triage-actions",
"version": "1.0.0",
"description": "GitHub Actions used by VS Code cpptools for triaging issues",
"scripts": {
"build": "tsc",
"lint": "eslint -c .eslintrc --fix --ext .ts .",
"watch": "tsc --watch"
},
"keywords": [],
"author": "",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/github": "^2.1.1",
"axios": "^0.21.1"
},
"devDependencies": {
"eslint": "^6.8.0",
"typescript": "^3.8.3"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "es2019",
"strict": true,
"module": "commonjs",
"moduleResolution": "node",
"removeComments": false,
"resolveJsonModule": true,
"sourceMap": true,
"lib": [
"es2020"
]
},
"exclude": [
"**/*.test.ts",
"**/vm-filesystem/**"
]
}
@@ -0,0 +1,26 @@
name: By Design closer - debugger
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: by design,debugger
ignoreLabels: language service,internal
closeDays: 0
closeComment: "This issue has been closed automatically because it's labeled as 'by design'."
+28
View File
@@ -0,0 +1,28 @@
name: By Design Closer
on:
schedule:
- cron: 0 12 * * * # Run at 12:00 PM UTC (4:00 AM PST, 5:00 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: by design
ignoreLabels: debugger,Feature Request,more info needed,internal
closeDays: 60
closeComment: "This issue has been closed automatically because it's labeled as 'by design' and has not had recent activity."
pingDays: 80
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if it is no longer relevant."
+55
View File
@@ -0,0 +1,55 @@
name: CI (Linux)
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 10.16.x
uses: actions/setup-node@v1
with:
node-version: 10.16.x
- name: Install Dependencies
run: yarn install
working-directory: Extension
- name: Generate hashes for runtime dependency packages
run: yarn run generatePackageHashes
working-directory: Extension
- name: Compile Sources
run: yarn run compile
working-directory: Extension
- name: Validate Extension/package.json
run: yarn run pr-check
working-directory: Extension
- name: Run Linter
run: yarn run lint
working-directory: Extension
- name: Compile Test Sources
run: yarn run pretest
working-directory: Extension
- name: Run unit tests
uses: GabrielBB/[email protected]
with:
run: yarn run unitTests
working-directory: Extension
- name: Run languageServer integration tests
uses: GabrielBB/[email protected]
with:
run: yarn run integrationTests
working-directory: Extension
+55
View File
@@ -0,0 +1,55 @@
name: CI (Mac)
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 10.16.x
uses: actions/setup-node@v1
with:
node-version: 10.16.x
- name: Install Dependencies
run: yarn install
working-directory: Extension
- name: Generate hashes for runtime dependency packages
run: yarn run generatePackageHashes
working-directory: Extension
- name: Compile Sources
run: yarn run compile
working-directory: Extension
- name: Validate Extension/package.json
run: yarn run pr-check
working-directory: Extension
- name: Run Linter
run: yarn run lint
working-directory: Extension
- name: Compile Test Sources
run: yarn run pretest
working-directory: Extension
- name: Run unit tests
uses: GabrielBB/[email protected]
with:
run: yarn run unitTests
working-directory: Extension
- name: Run languageServer integration tests
uses: GabrielBB/[email protected]
with:
run: yarn run integrationTests
working-directory: Extension
+51
View File
@@ -0,0 +1,51 @@
name: CI (Windows)
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 10.16.x
uses: actions/setup-node@v1
with:
node-version: 10.16.x
- name: Install Dependencies
run: yarn install
working-directory: Extension
- name: Generate hashes for runtime dependency packages
run: yarn run generatePackageHashes
working-directory: Extension
- name: Compile Sources
run: yarn run compile
working-directory: Extension
- name: Validate Extension/package.json
run: yarn run pr-check
working-directory: Extension
- name: Run Linter
run: yarn run lint
working-directory: Extension
- name: Compile Test Sources
run: yarn run pretest
working-directory: Extension
- name: Run unit tests
run: yarn run unitTests
working-directory: Extension
- name: Run languageServer integration tests
run: yarn run integrationTests
working-directory: Extension
+28
View File
@@ -0,0 +1,28 @@
name: Duplicate Closer
on:
schedule:
- cron: 10 12 * * * # Run at 12:10 PM UTC (4:10 AM PST, 5:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: duplicate
ignoreLabels: debugger,Feature Request,more info needed,by design,internal
closeDays: 60
closeComment: "This issue has been closed automatically because it's labeled as a 'duplicate' and has not had recent activity."
pingDays: 80
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if it is no longer relevant."
@@ -0,0 +1,26 @@
name: External closer - debugger
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: external,debugger
ignoreLabels: language service,internal
closeDays: 0
closeComment: "This issue has been closed automatically because it's labeled as 'external'."
@@ -0,0 +1,30 @@
name: Feature Request Closer (no milestone)
on:
schedule:
- cron: 50 11 * * * # Run at 11:50 AM UTC (3:50 AM PST, 4:50 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: Feature Request
ignoreLabels: debugger,internal
addLabels: more votes needed
closeDays: 60
maximumVotes: 2
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
setMilestoneId: 30
ignoreMilestoneNames: "*"
@@ -0,0 +1,30 @@
name: Feature Request Closer (Triage)
on:
schedule:
- cron: 40 11 * * * # Run at 11:40 AM UTC (3:40 AM PST, 4:40 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: Feature Request
ignoreLabels: debugger,internal
addLabels: more votes needed
closeDays: 60
maximumVotes: 2
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
milestoneName: Triage
milestoneId: 30
@@ -0,0 +1,31 @@
name: Feature Request Reopener
on:
schedule:
- cron: 20 12 * * * # Run at 12:20 PM UTC (4:20 AM PST, 5:20 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Run Reopener
uses: ./.github/actions/Reopener
with:
readonly: ${{ github.event.inputs.readonly }}
alsoApplyToOpenIssues: true
reopenComment: This feature request has received enough votes to be added to our backlog.
labels: Feature Request
minimumVotes: 3
ignoreLabels: debugger,internal
milestoneId: 30
milestoneName: Triage
setMilestoneId: 28
removeLabels: more votes needed
@@ -0,0 +1,26 @@
name: Investigate closer - debugger
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: investigate,debugger
ignoreLabels: language service,internal
closeDays: 180
closeComment: "This issue has been closed automatically because it has not had recent activity."
@@ -0,0 +1,26 @@
name: Investigate Costing closer - debugger
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: "investigate: costing,debugger"
ignoreLabels: language service,internal
closeDays: 180
closeComment: "This issue has been closed automatically because it has not had recent activity."
+25
View File
@@ -0,0 +1,25 @@
name: Locker
on:
schedule:
- cron: 30 11 * * * # Run at 11:30 AM UTC (3:30 AM PST, 4:30 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Run Locker
uses: ./.github/actions/Locker
with:
readonly: ${{ github.event.inputs.readonly }}
daysSinceClose: 45
daysSinceUpdate: 3
ignoreLabels: more votes needed,debugger,internal
@@ -0,0 +1,29 @@
name: More Info Needed Closer - debugger
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: more info needed,debugger
ignoreLabels: language service,internal
involves: wardengnaw,pieandcakes,calgagi
closeDays: 14
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity."
pingDays: 7
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information."
@@ -0,0 +1,28 @@
name: More Info Needed Closer
on:
schedule:
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: more info needed
ignoreLabels: debugger,internal
closeDays: 60
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity."
pingDays: 80
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information."
@@ -0,0 +1,29 @@
name: Question Closer - debugger
on:
schedule:
- cron: 20 11 * * * # Run at 11:20 AM UTC (3:20 AM PST, 4:20 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: question,debugger
ignoreLabels: language service,internal
involves: wardengnaw,pieandcakes,calgagi
closeDays: 14
closeComment: "This issue has been closed automatically because it's labeled as a 'question' and has not had recent activity."
pingDays: 7
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the question has been answered."
+28
View File
@@ -0,0 +1,28 @@
name: Question Closer
on:
schedule:
- cron: 20 11 * * * # Run at 11:20 AM UTC (3:20 AM PST, 4:20 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: question
ignoreLabels: debugger,internal
closeDays: 60
closeComment: "This issue has been closed automatically because it's labeled as a 'question' and has not had recent activity."
pingDays: 80
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the question has been answered."
+1 -1
View File
@@ -6,7 +6,7 @@ variables:
llvm_additional_parameters: "-DLLDB_RELOCATABLE_PYTHON=1 -DLLDB_INCLUDE_TESTS=OFF -DLLDB_BUILD_FRAMEWORK=1"
# TODO: fix lldb_mi_repo and lldb_mi_branch (https://github.com/lldb-tools/lldb-mi/pull/37 and https://github.com/lldb-tools/lldb-mi/pull/39)
lldb_mi_repo: https://github.com/WardenGnaw/lldb-mi # TODO: Change to lldb-tools
lldb_mi_branch: release/cpptools # TODO: Change to master
lldb_mi_branch: release/cpptools # TODO: Change to main
lldb_mi_additional_parameters: "-DUSE_LLDB_FRAMEWORK=1"
jobs:
+2 -2
View File
@@ -6,14 +6,14 @@
* File an [issue](https://github.com/Microsoft/vscode-cpptools/issues) and a [pull request](https://github.com/Microsoft/vscode-cpptools/pulls) with the change and we will review it.
* If the change affects functionality, add a line describing the change to [**CHANGELOG.md**](Extension/CHANGELOG.md).
* Try and add a test in [**test/extension.test.ts**](Extension/test/unitTests/extension.test.ts).
* Run tests via opening the [**Extension**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension) folder in Visual Studio Code, selecting the "Launch Tests" configuration in the Debug pane, and choosing "Start Debugging".
* Run tests via opening the [**Extension**](https://github.com/Microsoft/vscode-cpptools/tree/main/Extension) folder in Visual Studio Code, selecting the "Launch Tests" configuration in the Debug pane, and choosing "Start Debugging".
## About the Code
* Execution starts in the `activate` method in [**main.ts**](Extension/src/main.ts).
* `processRuntimeDependencies` handles the downloading and installation of the OS-dependent files. Downloading code exists in [**packageManager.ts**](Extension/src/packageManager.ts).
* `downloadCpptoolsJsonPkg` handles the **cpptools.json**, which can be used to enable changes to occur mid-update, such as turning the `intelliSenseEngine` to `"Default"` for a certain percentage of users.
* The debugger code is in the [**Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension/src/Debugger) folder.
* The debugger code is in the [**Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/main/Extension/src/Debugger) folder.
* [**LanguageServer/client.ts**](Extension/src/LanguageServer/client.ts) handles various language server functionality.
* [**LanguageServer/configurations.ts**](Extension/src/LanguageServer/configurations.ts) handles functionality related to **c_cpp_properties.json**.
* [**telemetry.ts**](Extension/src/telemetry.ts): Telemetry data gets sent to either `logLanguageServerEvent` or `logDebuggerEvent`.
+1 -1
View File
@@ -71,7 +71,7 @@ module.exports = {
"no-fallthrough": "error",
"no-invalid-this": "error",
"no-irregular-whitespace": "error",
"no-multiple-empty-lines": "error",
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0}],
"no-new-wrappers": "error",
"no-redeclare": "error",
"no-return-await": "error",
+1
View File
@@ -12,6 +12,7 @@ LLVM
bin/cpptools*
bin/*.dll
bin/.vs
bin/LICENSE.txt
# ignore lock files
install.lock
+1 -1
View File
@@ -98,7 +98,7 @@
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject",
"${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace",
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer/index"
],
+3
View File
@@ -41,3 +41,6 @@ translations_auto_pr.js
# ignore i18n language files
i18n/**
# ignore node_modules
node_modules/
+192 -3
View File
@@ -1,5 +1,194 @@
# C/C++ for Visual Studio Code Change Log
## Version 1.2.2-insiders2: February 18, 2021
### Bug Fixes
* Fix an extension activation failure when a non-existent folder exists in the workspace. [#6981](https://github.com/microsoft/vscode-cpptools/issues/6981)
* Fix a regression with handling of -isysroot/--sysroot compiler arguments. [#6992](https://github.com/microsoft/vscode-cpptools/issues/6992)
## Version 1.2.2-insiders: February 17, 2021
### Bug Fixes
* Fix for random IntelliSense communication failures on Mac. Potentially fixes: [#6809](https://github.com/microsoft/vscode-cpptools/issues/6809), [#6958](https://github.com/microsoft/vscode-cpptools/issues/6958)
* Potential fix for an "Unable to start the C/C++ language server" error. [#6981](https://github.com/microsoft/vscode-cpptools/issues/6981)
## Version 1.2.1: February 16, 2021
### Bug Fixes
* Fix `Switch Header/Source` in two cases when symlinks are in the path. [#6855](https://github.com/microsoft/vscode-cpptools/issues/6855)
* Fix clang-format FixNamespaceComments default. [#6894](https://github.com/microsoft/vscode-cpptools/issues/6894)
* Fix an issue with querying certain compilers for system defines and system includes [#6898](https://github.com/microsoft/vscode-cpptools/issues/6898)
* Fix an issue preventing detection of default target and default language standard of Cygwin and WSL compilers. [#6902](https://github.com/microsoft/vscode-cpptools/issues/6902)
* Fix an issue with detection of Apple Clang. [#6916](https://github.com/microsoft/vscode-cpptools/issues/6916)
* Fix endless memory usage (or a crash) with certain code. [#6940](https://github.com/microsoft/vscode-cpptools/issues/6940)
* Fix "format after newline" with vcFormat. [#6942](https://github.com/microsoft/vscode-cpptools/issues/6942)
* Fix compiler querying with -Xclang and -include-pch arguments. [#6944](https://github.com/microsoft/vscode-cpptools/issues/6944)
* Switch to the signed LLDB-MI on Mac 10.14 or newer with the online vsix. [#6945](https://github.com/microsoft/vscode-cpptools/issues/6945)
## Version 1.2.0: February 2, 2021
### New Features
* Add support for cross-compilation configurations for IntelliSense. For example, `intelliSenseMode` value "linux-gcc-x64" could be used on a Mac host machine. [#1083](https://github.com/microsoft/vscode-cpptools/issues/1083)
### Enhancements
* Show configuration squiggles when configurations with the same name exist. [#3412](https://github.com/microsoft/vscode-cpptools/issues/3412)
* Add `C_Cpp.addNodeAddonIncludePaths` setting to add include paths from `nan` and `node-addon-api` when they're dependencies. [#4854](https://github.com/microsoft/vscode-cpptools/issues/4854)
* Bruce MacNaughton (@bmacnaughton) [PR #67331](https://github.com/microsoft/vscode-cpptools/pull/6731)
* Add command `Generate EditorConfig contents from VC Format settings`. [#6018](https://github.com/microsoft/vscode-cpptools/issues/6018)
* Update to clang-format 11.1. [#6326](https://github.com/microsoft/vscode-cpptools/issues/6326)
* Add clang-format built for Windows ARM64. [#6494](https://github.com/microsoft/vscode-cpptools/issues/6494)
* Add support for the `/await` flag with msvc IntelliSense. [#6596](https://github.com/microsoft/vscode-cpptools/issues/6596)
* Increase document/workspace symbol limit from 1000 to 10000. [#6766](https://github.com/microsoft/vscode-cpptools/issues/6766)
* Add new "console" launch config for cppvsdbg. [PR #6794](https://github.com/microsoft/vscode-cpptools/pull/6794)
### Bug Fixes
* Fix handling of `--sysroot` and `-isysroot` with `compileCommands`. [#1575](https://github.com/microsoft/vscode-cpptools/issues/1575)
* Fix IntelliSense not updating if a non-opened header is changed. [#1780](https://github.com/microsoft/vscode-cpptools/issues/1780)
* Fix IntelliSense involving overflow for unsigned int values. [#2202](https://github.com/microsoft/vscode-cpptools/issues/2202)
* Fix IntelliSense not switching the language mode after changing C versus C++ `files.associations`. [#2557](https://github.com/microsoft/vscode-cpptools/issues/2557)
* Fix Switch Header/Source not switching to an existing file in another column if it's not visible. [#2667](https://github.com/microsoft/vscode-cpptools/issues/2667), [#6749](https://github.com/microsoft/vscode-cpptools/issues/6749)
* Fix autocomplete not working with `for` loop variables with C code. [#2946](https://github.com/microsoft/vscode-cpptools/issues/2946)
* Fix `#include` completion not sorting _ last. [#3465](https://github.com/microsoft/vscode-cpptools/issues/3465)
* Fix completion not working for templates in gcc/clang mode. [#3501](https://github.com/microsoft/vscode-cpptools/issues/3501)
* Fix crash when certain JavaScript files are parsed as C++. [#3858](https://github.com/microsoft/vscode-cpptools/issues/3858)
* Fix IntelliSense squiggle about not being able to assign to an object of its own type. [#3883](https://github.com/microsoft/vscode-cpptools/issues/3883)
* Fix hover and Find All References for template function overloads. [#4044](https://github.com/microsoft/vscode-cpptools/issues/4044), [#4249](https://github.com/microsoft/vscode-cpptools/issues/4249)
* Fix the Outline view for nested namespaces. [#4456](https://github.com/microsoft/vscode-cpptools/issues/4456)
* Fix some IntelliSense parsing errors. [#4595](https://github.com/microsoft/vscode-cpptools/issues/4595), [#6362](https://github.com/microsoft/vscode-cpptools/issues/6362), [#6685](https://github.com/microsoft/vscode-cpptools/issues/6685)
* Fix Outline view with`"**/.*"` in `files.exclude`. [#4602](https://github.com/microsoft/vscode-cpptools/issues/4602)
* Fix build tasks errors in single file mode. [#4638](https://github.com/microsoft/vscode-cpptools/issues/4638), [#6764](https://github.com/microsoft/vscode-cpptools/issues/6764)
* Fix the Outline view for nested structs/classes. [#4781](https://github.com/microsoft/vscode-cpptools/issues/4871)
* Fix `files.exclude` not applying to watched files handlers. [#5141](https://github.com/microsoft/vscode-cpptools/issues/5141)
* Fix code folding incorrectly matching an inactive `}`. [#5429](https://github.com/microsoft/vscode-cpptools/issues/5429)
* Fix IntelliSense Clang version for Apple Clang. [#5500](https://github.com/microsoft/vscode-cpptools/issues/5500)
* Fix hover doc comments not working if there's a selection. [#5635](https://github.com/microsoft/vscode-cpptools/issues/5635), [#6583](https://github.com/microsoft/vscode-cpptools/issues/6583)
* Fix `#include` completion to include results for non-standard header file extensions. [#5698](https://github.com/microsoft/vscode-cpptools/issues/5698)
* Fix clang-format failing due to missing libtinfo5 on Linux ARM/ARM64. [#5958](https://github.com/microsoft/vscode-cpptools/issues/5958)
* Automatically configure to use a custom configuration provider if available and no other configuration exists. [#6150](https://github.com/microsoft/vscode-cpptools/issues/6150)
* Fix not being able to attach to cpptools and cpptools-srv on Mac (to get crash call stacks). [#6151](https://github.com/microsoft/vscode-cpptools/issues/6151), [#6736](https://github.com/microsoft/vscode-cpptools/issues/6736)
* Fix IntelliSense crashing with cl.exe with C++20 and span. [#6251](https://github.com/microsoft/vscode-cpptools/issues/6251)
* Stop querying unsupported compilers. [#6314](https://github.com/microsoft/vscode-cpptools/issues/6314)
* Fix an entry not found error for files in `compile_commands.json` that didn't initially exist. [#6311](https://github.com/microsoft/vscode-cpptools/issues/6311)
* Fix IntelliSense errors with C++20 std::ranges in gcc/clang modes. [#6342](https://github.com/microsoft/vscode-cpptools/issues/6342)
* Add a workaround for a missing compiler path for the `compile_commands.json` generated by Unreal Engine. [#6358](https://github.com/microsoft/vscode-cpptools/issues/6358)
* Fix IntelliSense crash with coroutines. [#6363](https://github.com/microsoft/vscode-cpptools/issues/6363)
* Add localized strings for `cppbuild` tasks. [#6436](https://github.com/microsoft/vscode-cpptools/issues/6436)
* Fix IntelliSense squiggle with C++20 non-type templates. [#6462](https://github.com/microsoft/vscode-cpptools/issues/6462)
* Fix `compilerArgs` processing with `-MF` and other multi-arg arguments. [#6478](https://github.com/microsoft/vscode-cpptools/issues/6478)
* Fix bug causing `Unable to read process.env.HOME`. [#6468](https://github.com/microsoft/vscode-cpptools/issues/6468)
* Fix gcc problem matcher when the column is missing.
* @guntern [PR #6490](https://github.com/microsoft/vscode-cpptools/pull/6490)
* Disable Insiders prompt for Codespaces. [#6491](https://github.com/microsoft/vscode-cpptools/issues/6491)
* Fix `compile_commands.json` not working correctly for `*.C` files. [#6497](https://github.com/microsoft/vscode-cpptools/issues/6497)
* Show an error message when gdb can't be found when generating a `launch.json` (instead of using an invalid `miDebuggerPath`). [#6511](https://github.com/microsoft/vscode-cpptools/issues/6511)
* Fix IntelliSense not supporting `__float128` (and `Q` literals) on x64 Linux. [#6574](https://github.com/microsoft/vscode-cpptools/issues/6574)
* Fix IntelliSense crash with a parenthesized type followed by an initializer list. [#6554](https://github.com/microsoft/vscode-cpptools/issues/6554), [#6624](https://github.com/microsoft/vscode-cpptools/issues/6624)
* Fix IntelliSense updating after pasting multi-line code. [#6565](https://github.com/microsoft/vscode-cpptools/issues/6565)
* Use "method" instead of "member" for semantic tokens. [#6569](https://github.com/microsoft/vscode-cpptools/issues/6569)
* Fix `__builtin_coro_*` methods not recognized by IntelliSense in gcc mode with `-fcoroutines`. [#6575](https://github.com/microsoft/vscode-cpptools/issues/6575)
* Fix the `else` snippet interfering with entering one line `else` statements. [#6582](https://github.com/microsoft/vscode-cpptools/issues/6582)
* Stop showing an "unknown error" message after canceling the creation of a `launch.json`. [#6608](https://github.com/microsoft/vscode-cpptools/issues/6608)
* Fix potential extension activation delay. [#6630](https://github.com/microsoft/vscode-cpptools/issues/6630)
* Fix the executed command not appearing with cppbuild tasks. [#6647](https://github.com/microsoft/vscode-cpptools/issues/6647)
* Fix IntelliSense crash on Mac due to IPCH file corruption. [#6673](https://github.com/microsoft/vscode-cpptools/issues/6673)
* Fix `_Debug` not being defined when `/MDd` or `/MTd` are used. [#6690](https://github.com/microsoft/vscode-cpptools/issues/6690)
* Fix infinite IntelliSense processing when C++20, gcc mode, and `-fcoroutines` and used. [#6709](https://github.com/microsoft/vscode-cpptools/issues/6709)
* Allow the extension to run on M1 Macs. [#6713](https://github.com/microsoft/vscode-cpptools/issues/6713)
* Xiangyi Meng (@xymeng16) [PR #6601](https://github.com/microsoft/vscode-cpptools/pull/6601)
* Fix IntelliSense errors when "module" is used as a variable name with C++20. [#6719](https://github.com/microsoft/vscode-cpptools/issues/6719)
* Fix `.` to `->` completion with multiple cursors. [#6720](https://github.com/microsoft/vscode-cpptools/issues/6720)
* Fix bug with configured cl.exe path not being used to choose appropriate system include paths, or cl.exe not being used at all if it's not also installed via the VS Installer. [#6746](https://github.com/microsoft/vscode-cpptools/issues/6746)
* Fix bugs with parsing of quotes and escape sequences in compiler args. [#6761](https://github.com/microsoft/vscode-cpptools/issues/6761)
* Fix the configuration not showing in the status bar when `c_cpp_properties.json` is active. [#6765](https://github.com/microsoft/vscode-cpptools/issues/6765)
* Fix compiler querying with compilers that do not output `__STD_VERSION__` by default (gcc <= 4.8.x). [#6792](https://github.com/microsoft/vscode-cpptools/issues/6792)
* Fix document symbols when nested symbols have the same name as a parent. [#6830](https://github.com/microsoft/vscode-cpptools/issues/6830)
* Fix automatic adding of header files to `files.associations` after `Go to Definition` on a `#include`. [#6845](https://github.com/microsoft/vscode-cpptools/issues/6845)
* Fix `"Insiders"` `updateChannel` for VS Code - Exploration. [#6875](https://github.com/microsoft/vscode-cpptools/issues/6875)
* Fix "D" command line warnings not appearing with cl.exe cppbuild build tasks.
* Fix cl.exe cppbuild tasks when `/nologo` is used (and make /nologo a default arg).
* Fix a cpptools crash and multiple deadlocks.
## Version 1.1.3: December 3, 2020
### Bug Fixes
* Disable the "join Insiders" prompt for Linux CodeSpaces. [#6491](https://github.com/microsoft/vscode-cpptools/issues/6491)
* Fix "shell" tasks giving error "Cannot read property `includes` of undefined". [#6538](https://github.com/microsoft/vscode-cpptools/issues/6538)
* Fix various task variables not getting resolved with `cppbuild` tasks. [#6538](https://github.com/microsoft/vscode-cpptools/issues/6538)
* Fix warnings not appearing with `cppbuild` tasks. [#6556](https://github.com/microsoft/vscode-cpptools/issues/6556)
* Fix endless CPU/memory usage if the cpptools process crashes. [#6603](https://github.com/microsoft/vscode-cpptools/issues/6603)
* Fix the default `cwd` for `cppbuild` tasks. [#6618](https://github.com/microsoft/vscode-cpptools/issues/6618)
## Version 1.1.2: November 17, 2020
### Bug Fix
* Fix resolution of `${fileDirname}` with `cppbuild` tasks. [#6386](https://github.com/microsoft/vscode-cpptools/issues/6386)
## Version 1.1.1: November 9, 2020
### Bug Fixes
* Fix cpptools binaries sometimes not getting installed on Windows. [#6453](https://github.com/microsoft/vscode-cpptools/issues/6453)
## Version 1.1.0: November 5, 2020
### New Features
* Add language server support for Windows ARM64 (no debugging yet). [#5583](https://github.com/microsoft/vscode-cpptools/issues/5583)
* [cppdbg] Debugger Protocol Updates:
* ReadMemoryRequest [PR MIEngine#1028](https://github.com/microsoft/MIEngine/pull/1028)
* ModulesRequest and ModuleEvent [PR MIEngine#1054](https://github.com/microsoft/MIEngine/pull/1054)
* [cppdbg] Support new SourceFileMap schema [PR #6319](https://github.com/microsoft/vscode-cpptools/pull/6319)
### Enhancements
* Add support to run c/cpp build tasks. [#3674](https://github.com/microsoft/vscode-cpptools/issues/3674), [#5270](https://github.com/microsoft/vscode-cpptools/issues/5270), [#5285](https://github.com/microsoft/vscode-cpptools/issues/5285)
* Tasks: Configure Task
* Tasks: Run Build Task
* C/C++: Build and debug active file.
* Add logging around compiler querying, and the "C/C++ Configuration Warnings" output channel. [#5259](https://github.com/microsoft/vscode-cpptools/issues/5259)
* Add compile commands info to Log Diagnostics. [#5761](https://github.com/microsoft/vscode-cpptools/issues/5761)
* Add `intelliSenseUpdateDelay` setting. [#6142](https://github.com/microsoft/vscode-cpptools/issues/6142)
* YuTengjing (@tjx666) [PR #6344](https://github.com/microsoft/vscode-cpptools/pull/6344)
* Enable support for specifying a compiler by only the filename if it's in the environment path. [#6179](https://github.com/microsoft/vscode-cpptools/issues/6179)
* Restart the IntelliSense process if its memory usage exceeds the `C_Cpp.intelliSenseMemoryLimit` setting. [#6230](https://github.com/microsoft/vscode-cpptools/issues/6230)
* [cppdbg] Stepping out of a function will display '$ReturnValue'.
* @Trass3r [PR MIEngine#1036](https://github.com/microsoft/MIEngine/pull/1036)
* [cppdbg] Support composite expressions in natvis ArrayItems
* @Trass3r [PR MIEngine#1044](https://github.com/microsoft/MIEngine/pull/1044)
* Add handling of the "-ansi" compiler arg when querying gcc/clang compilers.
* Add support for inferring the IntelliSenseMode based on the "--target" compiler arg.
* Add support for inferring the C standard based on new c11/c17 language standard args for cl.exe.
* Allow custom config providers to omit IntelliSenseMode and C/C++ language standard, enabling them to be inferred from the `compilerPath` and `compilerArgs`.
### Bug Fixes
* Change macOS Framework searching to only parse the "Current" framework folder when the "Headers" folder is not found. [#2046](https://github.com/microsoft/vscode-cpptools/issues/2046)
* Show the compiler path in the `Build and Debug Active File` dropdown. [#4278](https://github.com/microsoft/vscode-cpptools/issues/4278)
* Fix incorrect signature help active argument with multiple template parameters. [#4786](https://github.com/microsoft/vscode-cpptools/issues/4786)
* Fix bug with directories not getting created for browse.databaseFilename. [#5181](https://github.com/microsoft/vscode-cpptools/issues/5181)
* Allow the debug configuration to wait for the preLaunchTask to complete before continuing on and resolving environment variables or processes that may have been set in the 'tasks.json'. [#5287](https://github.com/microsoft/vscode-cpptools/issues/5287)
* Change the Windows SDK detection to require the shared, ucrt, and um folders. [#5817](https://github.com/microsoft/vscode-cpptools/issues/5817)
* Fix issues with IntelliSense for clang-cl.exe. [#6075](https://github.com/microsoft/vscode-cpptools/issues/6075)
* Fix "Comments are not permitted in JSON" error when `c_cpp_properties.json` is open but not active. [#6132](https://github.com/microsoft/vscode-cpptools/issues/6132)
* Rename the C language standard setting values from c18 and gnu18 to c17 and gnu17. [#6105](https://github.com/microsoft/vscode-cpptools/issues/6105)
* Add more IntelliSense support for std ranges, concepts, and modules exports (__cpp_lib_concepts is now enabled). [#6173](https://github.com/microsoft/vscode-cpptools/issues/6173)
* Add "-fnoblocks" when querying clang on Mac, as IntelliSense does not currently support blocks. [#6189](https://github.com/microsoft/vscode-cpptools/issues/6189)
* Fix clang-format on 32-bit Windows. [#6195](https://github.com/microsoft/vscode-cpptools/issues/6195)
* Fix incorrect formatting results when clang-format removes duplicate includes. [#6205](https://github.com/microsoft/vscode-cpptools/issues/6205)
* Fix a case where the main process could get stuck. [#6207](https://github.com/microsoft/vscode-cpptools/issues/6207)
* Fix C files being treated as C++ files with compile_commands.json. [#6279](https://github.com/microsoft/vscode-cpptools/issues/6279)
* Fix `Build and Debug Active File` race condition with EngineLogs. [#6304](https://github.com/microsoft/vscode-cpptools/pull/6304)
* Fix changes to some `c_cpp_properties.json` properties not taking effect (until a reload) if `compileCommands` is set. [#6332](https://github.com/microsoft/vscode-cpptools/issues/6332)
* Fix issue with compiler querying not handling various clang command line options correctly. [6359](https://github.com/microsoft/vscode-cpptools/issues/6356)
* Fix multiroot workspace tag parsing when `compileCommands` is set. [#6383](https://github.com/microsoft/vscode-cpptools/issues/6383)
* Fix mingw32 compilers not being detected. [#6394](https://github.com/microsoft/vscode-cpptools/issues/6394)
* Various bug fixes for vcFormat. [PR #6408](https://github.com/microsoft/vscode-cpptools/pull/6408)
* Fix issue causing zh-cn and zh-tw language files not to be used. [PR #6418](https://github.com/microsoft/vscode-cpptools/pull/6418)
* Fix the handling of various compiler arg pairs when querying compilers.
* Avoid parsing entries in compile_commands.json for file types that we do not support.
* Fixed an issue in which only C or C++ system headers were added to the browse path, rather than both.
* Fix issue causing some localized messages to be displayed incorrectly.
* Fixed issue with shipping an older version of vsdbg in offline packages.
### Other Contributions
* Refactoring provider classes.
* Abhishek Pal (@devabhishekpal) [PR #5998](https://github.com/microsoft/vscode-cpptools/pull/5998)
## Version 1.0.1: September 21, 2020
### Bug Fixes
* Fix "No IL available" IntelliSense error on Linux/macOS when `#error` directives are present in the source code. [#6009](https://github.com/microsoft/vscode-cpptools/issues/6009), [#6114](https://github.com/microsoft/vscode-cpptools/issues/6114)
* Fix issue on Windows with the language server not shutting down properly which causes the IntelliSense database to become corrupted. [PR #6141](https://github.com/microsoft/vscode-cpptools/issues/6141)
* Fix "No IL available" IntelliSense error when predefined macros are undefined. [#6147](https://github.com/microsoft/vscode-cpptools/issues/6147)
* Fix infinite loop IntelliSense regression. [#6166](https://github.com/microsoft/vscode-cpptools/issues/6166)
## Version 1.0.0: September 14, 2020
### New Features
* Support non-UTF-8 file encodings (GBK, UTF-16, etc.), excluding `files.autoGuessEncoding` support. [#414](https://github.com/microsoft/vscode-cpptools/issues/414)
@@ -38,7 +227,7 @@
* Fix bug with cl.exe flags /FU and /FI not being processed. [#5819](https://github.com/microsoft/vscode-cpptools/issues/5819)
* Fix `cStandard` being set to `c11` instead of `gnu18` with gcc. [#5834](https://github.com/microsoft/vscode-cpptools/issues/5834)
* Fix Doxygen parameterHint comment to display for a parameter name that is followed by colon. [#5836](https://github.com/microsoft/vscode-cpptools/issues/5836)
* Fix compiler probing when relative paths are used in `compile_commands.json`. [#5848](https://github.com/microsoft/vscode-cpptools/issues/5848)
* Fix compiler querying when relative paths are used in `compile_commands.json`. [#5848](https://github.com/microsoft/vscode-cpptools/issues/5848)
* Fix the compile commands compiler not being used if `C_Cpp.default.compilerPath` is set. [#5848](https://github.com/microsoft/vscode-cpptools/issues/5848)
* Fix Doxygen comment to escape markdown characters. [#5904](https://github.com/microsoft/vscode-cpptools/issues/5904)
* Remove keyword completion of C identifiers that are defined in headers and aren't keywords (e.g. `alignas`). [#6022](https://github.com/microsoft/vscode-cpptools/issues/6022)
@@ -131,7 +320,7 @@
## Version 0.28.0: May 12, 2020
### New Features
* Add C/C++ language-aware code folding. [#407](https://github.com/microsoft/vscode-cpptools/issues/407)
* Add GNU (and C18) language standard options. [#2782](https://github.com/microsoft/vscode-cpptools/issues/2782)
* Add GNU (and C17) language standard options. [#2782](https://github.com/microsoft/vscode-cpptools/issues/2782)
* Add ARM and ARM64 IntelliSense modes. [#4271](https://github.com/microsoft/vscode-cpptools/issues/4271), [PR #5250](https://github.com/microsoft/vscode-cpptools/pull/5250)
### Enhancements
@@ -372,7 +561,7 @@
## Version 0.24.0: July 3, 2019
### New Features
* Semantic colorization [Documentation](https://github.com/microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/colorization.md) [#230](https://github.com/microsoft/vscode-cpptools/issues/230)
* Semantic colorization [Documentation](https://github.com/microsoft/vscode-cpptools/blob/main/Documentation/LanguageServer/colorization.md) [#230](https://github.com/microsoft/vscode-cpptools/issues/230)
* Add `Rescan Workspace` command. [microsoft/vscode-cpptools-api#11](https://github.com/microsoft/vscode-cpptools-api/issues/11)
### Enhancements
-203
View File
@@ -1,203 +0,0 @@
MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS
MICROSOFT C/C++ EXTENSION FOR VISUAL STUDIO CODE
These license terms are an agreement between Microsoft Corporation (or
based on where you live, one of its affiliates) and you. They apply to
the pre-release software named above. The terms also apply to any
Microsoft services or updates for the software, except to the extent
those have additional terms.
IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW.
1. INSTALLATION AND USE RIGHTS. You may only use the C/C++ Extension
for Visual Studio Code with Visual Studio Code, Visual Studio or
Xamarin Studio software to help you develop and test your
applications.
2. TERMS FOR SPECIFIC COMPONENTS
a. Third Party Components. The software may include third party
components with separate legal notices or governed by other
agreements, as may be described in the ThirdPartyNotices file(s)
accompanying the software.
b. Package Managers. The software may include package managers, like
Nuget, that give you the option to download other Microsoft and third
party software packages to use with your application. Those packages
are under their own licenses, and not this agreement. Microsoft does
not distribute, license or provide any warranties for any of the third
party packages.
3. DATA.
a. Data Collection. The software may collect information about you and
your use of the software, and send that to Microsoft. Microsoft may
use this information to provide services and improve our products and
services. You may opt-out of many of these scenarios, but not all, as
described in the product documentation. There are also some features
in the software that may enable you and Microsoft to collect data from
users of your applications. If you use these features, you must comply
with applicable law, including providing appropriate notices to users
of your applications together with a copy of Microsofts privacy
statement. Our privacy statement is located at
https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more
about data collection and use in the help documentation and our
privacy statement. Your use of the software operates as your consent
to these practices.
b. Processing of Personal Data. To the extent Microsoft is a processor
or subprocessor of personal data in connection with the software,
Microsoft makes the commitments in the European Union General Data
Protection Regulation Terms of the Online Services Terms to all
customers effective May 25, 2018, at
http://go.microsoft.com/?linkid=9840733.
4. PRE-RELEASE SOFTWARE. This software is a pre-release version. It
may not work the way a final version of the software will. We may
change it for the final, commercial version. We also may not release a
commercial version.
5. FEEDBACK. If you give feedback about the software to Microsoft, you
give to Microsoft, without charge, the right to use, share and
commercialize your feedback in any way and for any purpose. You will
not give feedback that is subject to a license that requires Microsoft
to license its software or documentation to third parties because we
include your feedback in them. These rights survive this agreement.
6. SCOPE OF LICENSE. The software is licensed, not sold. This
agreement only gives you some rights to use the software. Microsoft
reserves all other rights. Unless applicable law gives you more rights
despite this limitation, you may use the software only as expressly
permitted in this agreement. In doing so, you must comply with any
technical limitations in the software that only allow you to use it in
certain ways. You may not
* work around any technical limitations in the software;
* reverse engineer, decompile or disassemble the software, or attempt
to derive the source code for the software, except and to the extent
required by third party licensing terms governing use of certain open
source components that may be included with the software;
* remove, minimize, block or modify any notices of Microsoft or its
suppliers in the software;
* use the software in any way that is against the law; or
* share, publish, rent, or lease the software, or provide the software
as a stand-alone hosted solution for others to use.
7. EXPORT RESTRICTIONS. You must comply with all domestic and
international export laws and regulations that apply to the software,
which include restrictions on destinations, end users and end use.
For further information on export restrictions, visit
(aka.ms/exporting).
8. SUPPORT SERVICES. Because this software is “as is,” we may not
provide support services for it.
9. ENTIRE AGREEMENT. This agreement, and the terms for supplements,
updates, Internet-based services and support services that you use,
are the entire agreement for the software and support services.
10. APPLICABLE LAW. If you acquired the software in the United
States, Washington law applies to interpretation of and claims for
breach of this agreement, and the laws of the state where you live
apply to all other claims. If you acquired the software in any other
country, its laws apply.
11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes
certain legal rights. You may have other rights, including consumer
rights, under the laws of your state or country. Separate and apart
from your relationship with Microsoft, you may also have rights with
respect to the party from which you acquired the software. This
agreement does not change those other rights if the laws of your state
or country do not permit it to do so. For example, if you acquired the
software in one of the below regions, or mandatory country law
applies, then the following provisions apply to you:
a. Australia. You have statutory guarantees under the Australian
Consumer Law and nothing in this agreement is intended to affect those
rights.
b. Canada. If you acquired this software in Canada, you may stop
receiving updates by turning off the automatic update feature,
disconnecting your device from the Internet (if and when you re-
connect to the Internet, however, the software will resume checking
for and installing updates), or uninstalling the software. The product
documentation, if any, may also specify how to turn off updates for
your specific device or software.
c. Germany and Austria.
(i) Warranty. The properly licensed software will perform
substantially as described in any Microsoft materials that accompany
the software. However, Microsoft gives no contractual guarantee in
relation to the licensed software.
(ii) Limitation of Liability. In case of intentional conduct, gross
negligence, claims based on the Product Liability Act, as well as, in
case of death or personal or physical injury, Microsoft is liable
according to the statutory law.
Subject to the foregoing clause (ii), Microsoft will only be liable
for slight negligence if Microsoft is in breach of such material
contractual obligations, the fulfillment of which facilitate the due
performance of this agreement, the breach of which would endanger the
purpose of this agreement and the compliance with which a party may
constantly trust in (so-called "cardinal obligations"). In other cases
of slight negligence, Microsoft will not be liable for slight
negligence.
12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU
BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES,
GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL
LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
13. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM
MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU
CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST
PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.
This limitation applies to (a) anything related to the software,
services, content (including code) on third party Internet sites, or
third party applications; and (b) claims for breach of contract,
breach of warranty, guarantee or condition, strict liability,
negligence, or other tort to the extent permitted by applicable law.
It also applies even if Microsoft knew or should have known about the
possibility of the damages. The above limitation or exclusion may not
apply to you because your country may not allow the exclusion or
limitation of incidental, consequential or other damages.
Please note: As this software is distributed in Quebec, Canada, some
of the clauses in this agreement are provided below in French.
Remarque : Ce logiciel étant distribué au Québec, Canada, certaines
des clauses dans ce contrat sont fournies ci-dessous en français.
EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert
« tel quel ». Toute utilisation de ce logiciel est à votre seule
risque et péril. Microsoft naccorde aucune autre garantie
expresse. Vous pouvez bénéficier de droits additionnels en vertu du
droit local sur la protection des consommateurs, que ce contrat ne
peut modifier. La ou elles sont permises par le droit locale, les
garanties implicites de qualité marchande, dadéquation à un
usage particulier et dabsence de contrefaçon sont exclues.
LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ
POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses
fournisseurs une indemnisation en cas de dommages directs uniquement
à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune
indemnisation pour les autres dommages, y compris les dommages
spéciaux, indirects ou accessoires et pertes de bénéfices.
Cette limitation concerne:
* tout ce qui est relié au logiciel, aux services ou au contenu (y
compris le code) figurant sur des sites Internet tiers ou dans des
programmes tiers ; et
* les réclamations au titre de violation de contrat ou de garantie,
ou au titre de responsabilité stricte, de négligence ou dune
autre faute dans la limite autorisée par la loi en vigueur.
Elle sapplique également, même si Microsoft connaissait ou
devrait connaître l’éventualité dun tel dommage. Si votre pays
nautorise pas lexclusion ou la limitation de responsabilité
pour les dommages indirects, accessoires ou de quelque nature que ce
soit, il se peut que la limitation ou lexclusion ci-dessus ne
sappliquera pas à votre égard.
EFFET JURIDIQUE. Le présent contrat décrit certains droits
juridiques. Vous pourriez avoir dautres droits prévus par les lois
de votre pays. Le présent contrat ne modifie pas les droits que vous
confèrent les lois de votre pays si celles-ci ne le permettent pas.
+2 -1
View File
@@ -1,6 +1,6 @@
# C/C++ for Visual Studio Code
#### [Repository](https://github.com/microsoft/vscode-cpptools)&nbsp;&nbsp;|&nbsp;&nbsp;[Issues](https://github.com/microsoft/vscode-cpptools/issues)&nbsp;&nbsp;|&nbsp;&nbsp;[Documentation](https://code.visualstudio.com/docs/languages/cpp)&nbsp;&nbsp;|&nbsp;&nbsp;[Code Samples](https://github.com/microsoft/vscode-cpptools/tree/master/Code%20Samples)&nbsp;&nbsp;|&nbsp;&nbsp;[Offline Installers](https://github.com/microsoft/vscode-cpptools/releases)
#### [Repository](https://github.com/microsoft/vscode-cpptools)&nbsp;&nbsp;|&nbsp;&nbsp;[Issues](https://github.com/microsoft/vscode-cpptools/issues)&nbsp;&nbsp;|&nbsp;&nbsp;[Documentation](https://code.visualstudio.com/docs/languages/cpp)&nbsp;&nbsp;|&nbsp;&nbsp;[Code Samples](https://github.com/microsoft/vscode-cpptools/tree/main/Code%20Samples)&nbsp;&nbsp;|&nbsp;&nbsp;[Offline Installers](https://github.com/microsoft/vscode-cpptools/releases)
[![Badge](https://aka.ms/vsls-badge)](https://aka.ms/vsls)
@@ -56,6 +56,7 @@ The extension has platform-specific binary dependencies, therefore installation
`cpptools-linux-aarch64.vsix` | Linux ARM 64-bit
`cpptools-osx.vsix` | macOS
`cpptools-win32.vsix` | Windows 64-bit & 32-bit
`cpptools-win-arm64.vsix` | Windows ARM64
`cpptools-linux32.vsix` | Linux 32-bit ([available up to version 0.27.0](https://github.com/microsoft/vscode-cpptools/issues/5346))
## Contribution
File diff suppressed because it is too large Load Diff
+33
View File
@@ -0,0 +1,33 @@
{
"defaults": [
"cpfe",
"--wchar_t_keyword",
"--no_warnings",
"--rtti",
"--edge",
"--exceptions",
"--error_limit",
"25000",
"-D_EDG_COMPILER",
"-D_USE_DECLSPECS_FOR_SAL=1"
],
"source_file_format": "-f %s",
"expressions": [
{
"match": "^/I(.*)",
"replace": "-I\n$1"
},
{
"match": "^/D(.*)",
"replace": "-D$1"
},
{
"match": "^/AI(.*)",
"replace": "--using_directory\n$1"
},
{
"match": "^/dE--header_only_fallback",
"replace": "--header_only_fallback"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__arm__=1",
"-D__ARM_32BIT_STATE=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__aarch64__=1",
"-D__ARM_64BIT_STATE=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__x86_64=1",
"-D__x86_64__=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__i386=1",
"-D__i386__=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__arm__=1",
"-D__ARM_32BIT_STATE=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__aarch64__=1",
"-D__ARM_64BIT_STATE=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__x86_64=1",
"-D__x86_64__=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+15
View File
@@ -0,0 +1,15 @@
{
"defaults": [
"--pack_alignment",
"8",
"-Dunix=1",
"-D__unix__=1",
"-D__linux__=1",
"-D__i386=1",
"-D__i386__=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__arm__=1",
"-D__ARM_32BIT_STATE=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__aarch64__=1",
"-D__ARM_64BIT_STATE=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__x86_64=1",
"-D__x86_64__=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__i386=1",
"-D__i386__=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__arm__=1",
"-D__ARM_32BIT_STATE=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__aarch64__=1",
"-D__ARM_64BIT_STATE=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__x86_64=1",
"-D__x86_64__=1",
"-D__PTRDIFF_TYPE__=long int",
"-D__SIZE_TYPE__=long unsigned int",
"-D__WCHAR_TYPE__=int"
],
"defaults_op" : "merge"
}
+14
View File
@@ -0,0 +1,14 @@
{
"defaults": [
"--pack_alignment",
"8",
"-D__APPLE__=1",
"-D__MACH__=1",
"-D__i386=1",
"-D__i386__=1",
"-D__PTRDIFF_TYPE__=int",
"-D__SIZE_TYPE__=unsigned int",
"-D__WCHAR_TYPE__=long int"
],
"defaults_op" : "merge"
}
+24 -2
View File
@@ -3300,7 +3300,7 @@
"Neplatné použití konceptu",
"Výchozí operátor porovnání členů nemůže být kvalifikovaný jako &&.",
"Výchozí funkce pro porovnání constexpr volá funkci %nd, která constexpr není.",
"Porovnání paměti constexpr se podporuje jen pro celé číslo nejvyšší úrovně nebo objekty polí celých čísel.",
"Porovnání paměti constexpr se podporuje jen pro celé číslo nebo objekty polí celých čísel.",
"Šablona konceptu nemůže mít přidružená omezení.",
"export se nepovoluje.",
"Export jednotlivých členů třídy se nepodporuje.",
@@ -3335,5 +3335,27 @@
"Porovnání je ve standardním C++20 nejednoznačné, protože implikovaný operátor porovnání se zaměněnými parametry je stejně dobrá shoda -- příčinou je obvykle chybějící kvalifikátor const u operátoru porovnání. Podívejte se na %nod.",
"Neplatné concept-id",
"Nepovedlo se nahradit argumenty %T pro klauzuli requires.",
"Omezení pro %nd se nesplnila."
"Omezení pro %nd se nesplnila.",
"typ proměnné %t ve funkci constexpr má virtuální základní třídy",
"konstantní výraz nemůže přidělit virtuální základní podobjekt (pro typ %t)",
"parametr šablony typu třídy musí být typu strukturální třídy",
"podpora pro literály UTF-8 vyžaduje podporu literálů u-literal.",
"mapování souborů modulu pro %s bylo zadané více než jednou",
"mapování jednotek záhlaví pro %s bylo zadané více než jednou",
"není zadané žádné mapování pro %s",
"mapování souborů modulu pro %s je neplatné",
"nejde najít záhlaví %s, které se má importovat",
"více než jeden soubor v seznamu souborů modulu odpovídá %s",
"soubor modulu, který se našel pro %s, je pro jiný modul",
"libovolný druh souboru modulu",
"nejde přečíst soubor modulu",
"předdefinovaná funkce není k dispozici, protože typ char8_t se nepodporuje s aktuálními možnostmi",
"možnost příkazového řádku --ms_await nejde zadat, pokud jsou povolené korutiny C++20",
"nestandardní použití explicitního konstruktoru %nod pro inicializaci výchozího agregačního elementu",
"zdroj nebo cíl vnitřní funkce memcpy-like neukazuje na objekt",
"vnitřní funkce memcpy-like se pokouší o kopírování reprezentačně odlišných typů %t1 a %t2",
"vnitřní funkce memcpy-like se pokouší o kopírování netriviálně kopírovatelného typu %t",
"vnitřní funkce memcpy-like se pokouší o kopírování částečného objektu",
"vnitřní funkce memcpy-like se pokouší o kopírování hranice za polem",
"vnitřní funkce memcpy-like se pokouší o kopírování překrývajících se bajtových rozsahů (místo toho se použije odpovídající operace memmove)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"Ungültige Verwendung von \"concept\".",
"Ein standardmäßiger Membervergleichsoperator kann nicht &&-qualifiziert sein.",
"Die constexpr-Standardvergleichsfunktion ruft die Nicht-constexpr-Funktion \"%nd\" auf.",
"Der constexpr-Speichervergleich wird nur für integer-Objekte oder array-of-integer-Objekte oberster Ebene unterstützt.",
"Der constexpr-Speichervergleich wird nur für integer-Objekte oder array-of-integer-Objekte unterstützt.",
"Einer Konzeptvorlage können keine Einschränkungen zugeordnet sein.",
"\"export\" ist nicht zulässig.",
"Das Exportieren einzelner Klassenmember ist nicht zulässig.",
@@ -3335,5 +3335,27 @@
"Der Vergleich ist in standardmäßigem C++20 mehrdeutig, weil der implizite Vergleichsoperator mit umgekehrten Parametern eine gleichwertige Übereinstimmung darstellt. Dies wird normalerweise durch einen fehlenden const-Qualifizierer für den Vergleichsoperator ausgelöst. Siehe \"%nod\".",
"Ungültige concept-id",
"Fehler beim Ersetzen von Argumenten \"%T\" für requires-Klausel.",
"Einschränkungen für \"%nd\" sind nicht erfüllt."
"Einschränkungen für \"%nd\" sind nicht erfüllt.",
"Der Variablentyp \"%t\" in der constexpr-Funktion weist virtuelle Basisklassen auf.",
"Ein konstanter Ausdruck kann kein virtuelles Basisteilobjekt zuordnen (für den Typ \"%t\").",
"Ein Vorlagenparameter des Klassentyps muss einen strukturellen Klassentyp aufweisen.",
"Die Unterstützung für UTF-8-Literale erfordert Unterstützung für u-Literale.",
"Die Moduldateizuordnung für \"%s\" wurde mehrmals angegeben.",
"Die Zuordnung der Headereinheit für \"%s\" wurde mehrmals angegeben.",
"Für \"%s\" wurde keine Zuordnung angegeben.",
"Die Moduldateizuordnung für \"%s\" ist ungültig.",
"Der zu importierende Header \"%s\" wurde nicht gefunden.",
"Mehrere Dateien in der Moduldateiliste stimmen mit \"%s\" überein.",
"Die für \"%s\" gefundene Moduldatei ist für ein anderes Modul bestimmt.",
"Beliebige Art von Moduldatei",
"Die Moduldatei kann nicht gelesen werden.",
"Die integrierte Funktion ist nicht verfügbar, weil der char8_t-Typ mit den aktuellen Optionen nicht unterstützt wird.",
"Die Befehlszeilenoption \"--ms_await\" kann nicht angegeben werden, wenn C++20-Coroutinen aktiviert sind.",
"Nicht standardmäßige Verwendung des expliziten Konstruktors \"%nod\" für die standardmäßige Aggregatelementinitialisierung",
"Die Quelle oder das Ziel des memcpy-ähnlichen systeminternen Objekts verweist nicht auf ein Objekt.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, die darstellerisch unterschiedlichen Typen %t1 und %t2 zu kopieren.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, den nicht trivial kopierbaren Typ %t zu kopieren.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, ein Teilobjekt zu kopieren.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, einen Kopiervorgang über die Arraygrenze hinaus durchzuführen.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, überlappende Bytebereiche (stattdessen mithilfe eines entsprechenden memmove-Vorgangs) zu kopieren."
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"uso no válido del concepto",
"un operador de comparación de miembros con valores predeterminados no puede estar calificado con \"&&\"",
"la función de comparación constexpr predeterminada llama a una función %nd que no es constexpr",
"la comparación de memoria de constexpr solo se admite para objetos de matriz de enteros o enteros de nivel superior",
"la comparación de memoria de constexpr solo se admite para objetos de matriz de enteros o enteros",
"una plantilla de concepto no puede tener restricciones asociadas",
"no se permite \"export\"",
"no se permite la exportación de miembros de clases individuales",
@@ -3335,5 +3335,27 @@
"la comparación es ambigua en C++ 20 estándar porque el operador de comparación implicado con los parámetros inversos es una coincidencia igualmente buena. Esto suele deberse a que falta un calificador \"const\" en el operador de comparación; vea %nod",
"identificador de concepto no válido",
"error de sustitución de los argumentos %T para la cláusula requires",
"no se cumplen las restricciones de %nd"
"no se cumplen las restricciones de %nd",
"el tipo de variable %t de la función constexpr tiene clases base virtuales",
"una expresión constante no puede asignar un subobjeto base virtual (para el tipo %t)",
"un parámetro de plantilla de tipo de clase debe ser un tipo de clase estructural",
"la compatibilidad con los literales UTF-8 requiere compatibilidad con u-literal.",
"la asignación de archivos de módulo para \"%s\" se especificó más de una vez",
"la asignación de unidades de encabezado para \"%s\" se especificó más de una vez",
"no se especificó ninguna asignación para \"%s\"",
"la asignación del archivo de módulo para \"%s\" no es válida",
"no se encuentra el encabezado \"%s\" para importar",
"hay más de un archivo de la lista de archivos de módulo que coincide con \"%s\"",
"el archivo de módulo que se encontró para \"%s\" es para otro módulo",
"cualquier tipo de archivo de módulo",
"no se puede leer el archivo de módulo",
"la función integrada no está disponible porque no se admite el tipo char8_t con las opciones actuales",
"no se puede especificar la opción de línea de comandos --ms_await si están habilitadas las corrutinas de C++ 20",
"uso no estándar de %nod de constructor explícito para la inicialización predeterminada del elemento de agregado",
"el origen o el destino del intento intrínseco de tipo memcpy no apunta a un objeto",
"intentos intrínsecos de tipo memcpy para copiar los tipos %t1 y %t2 diferentes de forma representativa",
"intentos intrínsecos de tipo memcpy para copiar el tipo %t que no se puede copiar de forma trivial",
"intentos intrínsecos de tipo memcpy para copiar el objeto parcial",
"intentos intrínsecos de tipo memcpy para copiar más allá del límite de matriz",
"intentos intrínsecos de tipo memcpy para copiar los intervalos de bytes solapados (con la operación memmove correspondiente en su lugar)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"utilisation non valide du concept",
"un opérateur de comparaison de membres par défaut ne peut pas être qualifié en tant que '&&'",
"la fonction de comparaison constexpr par défaut appelle la fonction non constexpr %nd",
"la comparaison de mémoire constexpr est prise en charge uniquement pour les objets d'entiers de niveau supérieur ou les objets de tableaux d'entiers",
"la comparaison de mémoire constexpr est prise en charge uniquement pour les objets d'entiers ou les objets de tableaux d'entiers",
"un modèle de concept ne peut pas avoir de contraintes associées",
"'export' n'est pas autorisé",
"l'exportation de membres de classe individuels n'est pas autorisée",
@@ -3335,5 +3335,27 @@
"la comparaison est ambiguë dans la norme C++20, car l'opérateur de comparaison implicite avec des paramètres inversés représente une correspondance tout aussi appropriée (cela est généralement dû à un qualificateur 'const' manquant sur l'opérateur de comparaison) ; consultez %nod",
"ID de concept non valide",
"échec de la substitution des arguments %T pour la clause requires",
"les contraintes pour %nd ne sont pas satisfaites"
"les contraintes pour %nd ne sont pas satisfaites",
"le type de variable %t dans la fonction constexpr a des classes de base virtuelles",
"une expression constante ne peut pas allouer un sous-objet de base virtuel (pour le type %t)",
"un paramètre de modèle de type classe doit être de type classe structurelle",
"la prise en charge des littéraux UTF-8 nécessite une prise en charge du littéral u.",
"mappage de fichier de module pour '%s' spécifié plusieurs fois",
"mappage d'unité d'en-tête pour '%s' spécifié plusieurs fois",
"aucun mappage spécifié pour '%s'",
"le mappage de fichier de module pour '%s' est non valide",
"l'en-tête '%s' à importer est introuvable",
"plusieurs fichiers dans la liste de fichiers de module correspondent à '%s'",
"le fichier de module trouvé pour '%s' est destiné à un autre module",
"n'importe quel genre de fichier de module",
"impossible de lire le fichier de module",
"la fonction intégrée n'est pas disponible, car le type char8_t n'est pas pris en charge avec les options actuelles",
"l'option de ligne de commande --ms_await ne peut pas être spécifiée si les coroutines C++20 sont activées",
"utilisation non standard du constructeur explicite %nod pour l'initialisation de l'élément d'agrégation par défaut",
"la source ou la destination de l'intrinsèque de type memcpy ne pointe pas vers un objet",
"l'intrinsèque de type memcpy tente de copier les types représentatifs distincts %t1 et %t2",
"l'intrinsèque de type memcpy tente de copier le type non trivialement copiable %t",
"l'intrinsèque de type memcpy tente de copier un objet partiel",
"l'intrinsèque de type memcpy tente de copier au-delà de la limite du tableau",
"l'intrinsèque de type memcpy tente de copier des plages d'octets qui se chevauchent (en utilisant plutôt l'opération memmove correspondante)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"uso del concetto non valido",
"un operatore di confronto membri impostato come predefinito non può essere qualificato con '&&'",
"la funzione di confronto constexpr predefinita chiama la funzione non constexpr %nd",
"il confronto di memoria constexpr è supportato solo per gli oggetti intero o matrice di intero di primo livello",
"il confronto di memoria constexpr è supportato solo per gli oggetti intero o matrice di interi",
"un modello di concetto non può avere vincoli associati",
"'export' non è consentito",
"l'esportazione di singoli membri di classe non è consentita",
@@ -3335,5 +3335,27 @@
"il confronto è ambiguo in C++20 standard perché l'operatore di confronto implicito con parametri invertiti è una corrispondenza altrettanto valida. In genere questo problema dipende dalla mancanza di un qualificatore 'const' nell'operatore di confronto. Vedere %nod",
"ID concetto non valido",
"la sostituzione degli argomenti %T per la clausola requires non è riuscita",
"i vincoli per %nd non sono soddisfatti"
"i vincoli per %nd non sono soddisfatti",
"il tipo di variabile %t nella funzione constexpr contiene classi di base virtuali",
"un'espressione costante non può allocare un sotto-oggetto di base virtuale (per il tipo %t)",
"un parametro di modello di tipo classe deve essere un tipo classe strutturale",
"per il supporto dei valori letterali UTF-8 è richiesto il supporto di valori letterali u",
"il mapping del file del modulo per '%s' è stato specificato più di una volta",
"il mapping dell'unità intestazione per '%s' è stato specificato più di una volta",
"non è stato specificato alcun mapping per '%s'",
"Il mapping del file del modulo per '%s' non è valido",
"non è possibile trovare l'intestazione '%s' da importare",
"più di un file nell'elenco file di modulo corrisponde a '%s'",
"il file di modulo trovato per '%s' è riferito a un modulo diverso",
"qualsiasi tipo di modulo",
"non è possibile leggere il file del modulo",
"la funzione predefinita non è disponibile perché il tipo char8_t non è supportato con le opzioni correnti",
"non è possibile specificare l'opzione della riga di comando --ms_await se le coroutine di C++20 sono abilitate",
"uso non standard del costruttore esplicito %nod per l'inizializzazione dell'elemento di aggregazione predefinito",
"l'origine o la destinazione dell'intrinseco simile a memcpy non punta a un oggetto",
"l'intrinseco simile a memcpy prova a copiare i tipi distinti dal punto di vista della rappresentazione %t1 e %t2",
"l'intrinseco simile a memcpy prova a copiare il tipo non facilmente copiabile %t",
"l'intrinseco simile a memcpy prova a copiare l'oggetto parziale",
"l'intrinseco simile a memcpy prova a copiare oltre il limite della matrice",
"l'intrinseco simile a memcpy prova a copiare intervalli di byte sovrapposti (usando invece l'operazione memmove corrispondente)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"概念が正しく使用されていません",
"既定のメンバー比較演算子を '&&' で修飾することはできません",
"既定の constexpr 比較関数は、constexpr ではない関数 %nd を呼び出します",
"constexpr のメモリ比較は、トップレベルの整数または整数の配列オブジェクトでのみサポートされています",
"constexpr のメモリ比較は、整数または整数の配列オブジェクトでのみサポートされています",
"概念テンプレートに関連する制約を持たせることはできません",
"[エクスポート] は許可されていません",
"個別のクラス メンバーのエクスポートは許可されていません",
@@ -3335,5 +3335,27 @@
"標準 C++ 20 では、パラメーターが反転した暗黙的な比較演算子が同程度に適合するため、比較はあいまいです。これは通常、比較演算子の 'const' 修飾子がない場合に発生します。%nod を参照してください",
"無効な概念 ID",
"Requires 句の引数 %T の置換に失敗しました",
"%nd の制約が満たされていません"
"%nd の制約が満たされていません",
"constexpr 関数の変数の型 %t に仮想基底クラスが含まれています",
"定数式では、仮想ベースのサブオブジェクト (型 %t) の割り当てを行うことはできません",
"クラス型のテンプレート パラメーターは、構造クラス型である必要があります",
"UTF-8 リテラルのサポートには、u リテラルのサポートが必要です。",
"'%s' のモジュール ファイル マッピングが 2 回以上指定されました",
"'%s' のヘッダー単位のマッピングが 2 回以上指定されました",
"'%s' にマッピングが指定されていません",
"'%s' のモジュール ファイル マッピングが無効です",
"インポートするヘッダー '%s' が見つかりません",
"モジュール ファイル リスト内の複数のファイルが '%s' と一致しています",
"'%s' に対して見つかったモジュール ファイルは別のモジュール用です",
"あらゆる種類のモジュール ファイル",
"モジュール ファイルを読み取れません",
"現在のオプションで char8_t 型がサポートされていないので、ビルトイン関数を使用できません",
"--ms_await コマンド ライン オプションは、C++20 コルーチンが有効になっている場合は指定できません",
"既定の集約要素の初期化における明示的なコンストラクター %nod の非標準的な使用",
"memcpy に似た組み込み関数のソースやターゲットでオブジェクトが指定されていません",
"memcpy に似た組み込み関数により、表現上個別の型である %t1 と %t2 のコピーが試行されます",
"memcpy に似た組み込み関数により、普通にコピーすることができない型 %t のコピーが試行されます",
"memcpy に似た組み込み関数により、部分的なオブジェクトのコピーが試行されます",
"memcpy に似た組み込み関数により、配列の境界を越えたコピーが試行されます",
"memcpy に似た組み込み関数により、重複しているバイト範囲のコピーが (対応する memmove 操作を代わりに使用して) 試行されます"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"잘못된 개념 사용",
"기본 멤버 비교 연산자는 '&&'-qualified일 수 없습니다.",
"기본 constexpr 비교 함수에서 비 constexpr 함수 %nd 호출",
"constexpr 메모리 비교는 최상위 정수 또는 정수 배열 개체에 대해서만 지원됩니다.",
"constexpr 메모리 비교는 정수 또는 정수 배열 개체에 대해서만 지원됩니다.",
"개념 템플릿에는 관련된 제약 조건이 있을 수 없습니다.",
"'export'는 허용되지 않습니다.",
"개별 클래스 멤버를 내보낼 수 없습니다.",
@@ -3335,5 +3335,27 @@
"역 매개 변수를 사용하는 암시적 비교 연산자는 동일하게 적절한 일치 항목이므로 표준 C++20에서 비교는 모호합니다. 이 문제는 일반적으로 비교 연산자에 'const' 한정자가 없어서 발생합니다. %nod를 참조하세요.",
"잘못된 개념 ID",
"requires 절의 %T 인수를 대체하지 못했습니다.",
"%nd에 대한 제약 조건을 충족하지 않습니다."
"%nd에 대한 제약 조건을 충족하지 않습니다.",
"constexpr 함수의 변수 형식 %t에는 가상 기본 클래스가 있습니다.",
"상수 식은 가상 기본 하위 개체(%t 형식)를 할당할 수 없습니다.",
"클래스 형식의 템플릿 매개 변수는 구조적 클래스 형식이어야 합니다.",
"UTF-8 리터럴에 대한 지원에는 u-리터럴 지원이 필요합니다.",
"'%s'에 대한 모듈 파일 매핑이 두 번 이상 지정되었습니다.",
"'%s'에 대한 헤더 단위 매핑이 두 번 이상 지정되었습니다.",
"'%s'에 대한 매핑이 지정되지 않았습니다.",
"'%s'에 대한 모듈 파일 매핑이 잘못되었습니다.",
"가져올 '%s' 헤더를 찾을 수 없습니다.",
"모듈 파일 목록에 있는 두 개 이상의 파일이 '%s'과(와) 일치합니다.",
"'%s'에 대해 찾은 모듈 파일이 다른 모듈에 대한 것입니다.",
"모든 종류의 모듈 파일",
"모듈 파일을 읽을 수 없음",
"char8_t 형식이 현재 옵션에서 지원되지 않기 때문에 기본 제공 함수를 사용할 수 없습니다.",
"C++20 코루틴을 사용하도록 설정한 경우 --ms_await 명령줄 옵션을 지정할 수 없습니다.",
"기본 집계 요소 초기화에 명시적 생성자 %nod의 비표준 사용",
"memcpy 유사 내장의 소스 또는 대상이 개체를 가리키지 않음",
"memcpy 유사 내장이 대표적으로 차별화된 형식 %t1 및 %t2을(를) 복사하려고 시도함",
"memcpy 유사 내장이 중요하게 복사 가능한 형식 %t을(를) 복사하려고 시도함",
"memcpy 유사 내장이 부분 개체를 복사하려고 시도함",
"memcpy 유사 내장이 과거 배열 경계를 복사하려고 시도함",
"memcpy 유사 내장이 겹치는 바이트 범위를 복사하려고 시도함(대신 해당 memmove 작업 사용)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"nieprawidłowe użycie koncepcji",
"domyślny operator porównania elementu członkowskiego nie może być kwalifikowany przez element „&&”",
"domyślna funkcja porównywania constexpr wywołuje funkcję non-constexpr %nd",
"Porównywanie pamięci constexpr jest obsługiwane tylko w przypadku obiektów najwyższego poziomu w postaci liczby całkowitej lub obiektów typu tablica liczb całkowitych",
"Porównywanie pamięci constexpr jest obsługiwane tylko w przypadku obiektów będących liczbami całkowitymi lub tablicami liczb całkowitych",
"z szablonem koncepcji nie mogą być skojarzone ograniczenia",
"Polecenie „export” jest niedozwolone",
"eksportowanie pojedynczych elementów członkowskich klasy jest niedozwolone",
@@ -3335,5 +3335,27 @@
"porównanie jest niejednoznaczne w standardowym języku C++20, ponieważ implikowany operator porównania z odwróconymi parametrami jest równie dobrym dopasowaniem — jest to zwykle spowodowane brakującym kwalifikatorem „const” w operatorze porównania; zobacz %nod",
"nieprawidłowy identyfikator koncepcji",
"podstawianie argumentów %T dla klauzuli requires nie powiodło się",
"ograniczenia dla %nd nie są spełnione"
"ograniczenia dla %nd nie są spełnione",
"typ zmiennej %t w funkcji constexpr ma wirtualne klasy podstawowe",
"wyrażenie stałe nie może przydzielić wirtualnego podobiektu podstawowego (dla typu %t)",
"parametr szablonu typu klasy musi być typu klasy strukturalnej",
"obsługa literałów UTF-8 wymaga obsługi literału z prefiksem u.",
"mapowanie pliku modułu dla elementu „%s” zostało określone więcej niż raz",
"mapowanie jednostki nagłówka dla elementu „%s” zostało określone więcej niż raz",
"nie określono mapowania dla elementu „%s”",
"mapowanie pliku modułu dla elementu „%s” jest nieprawidłowe",
"nie można odnaleźć nagłówka „%s” do zaimportowania",
"więcej niż jeden plik na liście plików modułu pasuje do elementu „%s”",
"plik modułu znaleziony dla elementu „%s” jest dla innego modułu",
"dowolny rodzaj pliku modułu",
"nie można odczytać pliku modułu",
"wbudowana funkcja jest niedostępna, ponieważ typ char8_t nie jest obsługiwany z bieżącymi opcjami",
"nie można określić opcji wiersza polecenia --ms_await, jeśli włączono koprocedury języka C++20",
"niestandardowe użycie konstruktora jawnego %nod dla domyślnej inicjalizacji elementu agregacji",
"element źródłowy lub docelowy funkcji wewnętrznej podobnej do memcpy nie wskazuje obiektu",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować reprezentacyjnie odrębne typy %t1 i %t2",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować typ %t, którego nie można skopiować w sposób trywialny",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować częściowy obiekt",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować dane spoza granicy tablicy",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować nakładające się na siebie zakresy bajtów (zamiast tego zostanie użyta odpowiednia operacja memmove)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"uso inválido do conceito",
"um operador de comparação de membros usado como padrão não pode ser qualificado por '&&'",
"a função de comparação constexpr padrão chama a função não constexpr %nd",
"só há suporte para a comparação de memória constexpr para os objetos inteiros de nível superior ou matriz de inteiro",
"Só há suporte para a comparação de memória constexpr para os objetos inteiros ou matriz de inteiro",
"um modelo de conceito não pode ter restrições associadas",
"'export' não é permitido",
"a exportação de membros de classe individuais não é permitida",
@@ -3335,5 +3335,27 @@
"a comparação é ambígua no padrão de C++20 porque o operador de comparação implícito com parâmetros invertidos é uma correspondência igualmente boa. Isso geralmente é causado por um qualificador 'const' ausente no operador de comparação. Confira %nod",
"ID do conceito inválida",
"falha na substituição de argumentos %T da cláusula requires",
"as restrições de %nd não estão satisfeitas"
"as restrições de %nd não estão satisfeitas",
"o tipo de variável %t na função constexpr tem classes base virtuais",
"uma expressão de constante não pode alocar um subobjeto base virtual (para o tipo %t)",
"um parâmetro de modelo de tipo de classe precisa ser do tipo de classe estrutural",
"o suporte para literais UTF-8 exige o suporte para o literal u.",
"o mapeamento de arquivo de módulo de '%s' foi especificado mais de uma vez",
"o mapeamento de unidade de cabeçalho de '%s' foi especificado mais de uma vez",
"não foi especificado nenhum mapeamento para '%s'",
"o mapeamento de arquivo de módulo de '%s' é inválido",
"não é possível localizar o cabeçalho '%s' a ser importado",
"mais de um arquivo na lista de arquivos de módulo corresponde a '%s'",
"o arquivo de módulo encontrado para '%s' é de um módulo diferente",
"qualquer tipo de arquivo de módulo",
"não é possível ler o arquivo de módulo",
"a função interna não está disponível porque não há suporte para o tipo char8_t com as opções atuais",
"a opção da linha de comando --ms_await não poderá ser especificada se as corrotinas do C++20 estiverem habilitadas",
"o uso não padrão do construtor explícito %nod para inicialização do elemento de agregação padrão",
"a origem ou o destino do intrínseco similar a memcpy não aponta para um objeto",
"tentativas intrínsecas similares a memcpy de copiar tipos representacionalmente distintos %t1 e %t2",
"tentativas intrínsecas similares a memcpy de copiar o tipo não trivialmente copiável %t",
"tentativas intrínsecas similares a memcpy de copiar objetos parciais",
"tentativas intrínsecas similares a memcpy de copiar o limite de matriz passado",
"tentativas intrínsecas similares a memcpy de copiar intervalos de bytes sobrepostos (usando a operação de memmove correspondente, em vez disso)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"недопустимое использование концепции",
"оператор сравнения элемента по умолчанию не может быть квалифицирован как \"&&\"",
"функция сравнения constexpr по умолчанию вызывает функцию %nd, не являющуюся constexpr",
"Сравнение памяти с помощью constexpr поддерживается только для целочисленных объектов верхнего уровня или массивов целых чисел",
"сравнение памяти с помощью constexpr поддерживается только для целых чисел и для массивов целых чисел",
"шаблон концепции не может иметь связанные ограничения",
"использование \"export\" запрещено",
"экспорт отдельных членов класса запрещен",
@@ -3335,5 +3335,27 @@
"cравнение является неоднозначным в стандартном C++ 20, поскольку подразумеваемый оператор сравнения с обратными параметрами является в той же степени подходящим соответствием — как правило, это вызвано отсутствием квалификатора \"const\" в операторе сравнения; см. %nod",
"недопустимый идентификатор концепции",
"не удалось подставить аргументы %T для предложения requires",
"ограничения для %nd не удовлетворены"
"ограничения для %nd не удовлетворены",
"тип переменной %t в функции constexpr содержит виртуальные базовые классы",
"константное выражение не может выделить виртуальный базовый подобъект (для типа %t)",
"параметр шаблона для типа класса должен иметь тип структурного класса",
"для поддержки литералов UTF-8 требуется поддержка u-literal.",
"сопоставление файла модуля для \"%s\" указано несколько раз",
"сопоставление блока заголовка для \"%s\" указано несколько раз",
"сопоставление для \"%s\" не указано",
"сопоставление файла модуля для \"%s\" является недопустимым",
"не удается найти заголовок \"%s\" для импорта",
"несколько файлов в списке файлов модулей соответствуют \"%s\"",
"файл модуля, обнаруженный для \"%s\", относится к другому модулю",
"любой тип файла модуля",
"не удалось прочитать файл модуля",
"встроенная функция недоступна, так как тип char8_t не поддерживается с текущими параметрами.",
"невозможно указать параметр командной строки --ms_await, если включены сопрограммы C++20.",
"нестандартное использование явного конструктора %nod для агрегатной инициализации элементов по умолчанию.",
"источник или назначение встроенной функции, похожей на memcpy, не указывает на объект",
"Встроенная функция, похожая на memcpy, пытается скопировать различные с точки зрения представления типы %t1 и %t2",
"Встроенная функция, похожая на memcpy, пытается скопировать нетривиально копируемый тип %t",
"Встроенная функция, похожая на memcpy, пытается скопировать частичный объект",
"Встроенная функция, похожая на memcpy, пытается выполнить копирование за границей массива",
"Встроенная функция, похожая на memcpy, пытается скопировать перекрывающиеся диапазоны байтов (вместо использования соответствующей операции memmove)"
]
+24 -2
View File
@@ -3300,7 +3300,7 @@
"kavram kullanımı geçersiz",
"varsayılan olarak ayarlanan üye karşılaştırma işleci tam '&&' ile nitelenemez",
"varsayılan constexpr karşılaştırma işlevi constexpr olmayan %nd işlevini çağırıyor",
"constexpr bellek karşılaştırması yalnızca üst düzey tamsayı veya tamsayı dizisi nesneleri için desteklenir",
"constexpr bellek karşılaştırması yalnızca tamsayı veya tamsayı dizisi nesneleri için desteklenir",
"kavram şablonunda ilişkili kısıtlamalar olamaz",
"'export'a izin verilmiyor",
"sınıf üyelerini tek tek dışarı aktarmaya izin verilmiyor",
@@ -3335,5 +3335,27 @@
"ters çevrilmiş parametrelere sahip örtük karşılaştırma işleci eşit olarak iyi bir eşleşme olduğundan karşılaştırma, standart C++20'de belirsizdir; bu genellikle karşılaştırma işlecinde eksik 'const' niteleyicisinden kaynaklanır; bkz. %nod",
"kavram kimliği geçersiz",
"requires yan tümcesi için %T bağımsız değişkenleri değiştirilemedi",
"%nd için kısıtlamalar karşılanmadı"
"%nd için kısıtlamalar karşılanmadı",
"constexpr işlevindeki %t değişken türü, sanal temel sınıflara sahip",
"sabit ifade bir sanal temel alt nesneyi ayıramaz (%t türü için)",
"sınıf türündeki bir şablon parametresi yapısal sınıf türünde olmalıdır",
"UTF-8 sabit değerleri desteği için u-literal desteği gerekir.",
"'%s' için modül dosyası eşlemesi birden çok kez belirtildi",
"'%s' için üst bilgi birimi eşlemesi birden çok kez belirtildi",
"'%s' için eşleme belirtilmedi",
"'%s' için modül dosyası eşlemesi geçersiz",
"içeri aktarılacak '%s' üst bilgisi bulunamıyor",
"modül dosyası listesinde birden fazla dosya '%s' ile eşleşiyor",
"'%s' için bulunan modül dosyası farklı bir modüle yönelik",
"herhangi bir türde modül dosyası",
"modül dosyası okunamıyor",
"char8_t türü geçerli seçeneklerle desteklenmediği için yerleşik işlev kullanılamıyor",
"C++20 eş yordamları etkinleştirilirse --ms_await komut satırı seçeneği belirtilemez",
"varsayılan toplama öğesi başlatma için açık oluşturucu %nod için standart olmayan kullanım",
"memcpy benzeri iç öğenin kaynağı veya hedefi bir nesneye işaret etmiyor",
"memcpy benzeri iç öğe, temsili olarak farklı %t1 ve %t2 türlerini kopyalamaya çalışıyor",
"memcpy benzeri iç öğe, önemsiz olarak kopyalanabilir %t türünü kopyalamaya çalışıyor",
"memcpy benzeri iç öğe, kısmi nesneyi kopyalamaya çalışıyor",
"memcpy benzeri iç öğe, geçmiş dizi sınırını kopyalamaya çalışıyor",
"memcpy benzeri iç öğe, çakışan bayt aralıklarını kopyalamaya çalışıyor (bunun yerine karşılık gelen memmove işlemini kullanarak)"
]
@@ -2790,7 +2790,7 @@
"矢量元素类型必须是整型、枚举或真浮点类型",
"内置函数无法使用,因为不支持 128 位整数",
"内置函数无法使用,因为不支持矢量类型",
"两个连续的左方括号始终引入一个属性列表,但此处不能出现属性列表",
"两个连续的左方括号必然会引入一个属性列表,但此处不能出现属性列表",
"无法识别的 \"target\" 特性将使解析程序例程无法使用此例程",
"%t 不是矢量类型",
"适量类型 %t1 和 %t2 长度必须相同",
@@ -3300,7 +3300,7 @@
"概念的使用无效",
"默认成员比较运算符不能是 \"&&\" 限定",
"默认的 constexpr 比较函数会调用非 constexpr 函数 %nd",
"只有顶级整数或数组整数对象支持 constexpr 内存比较",
"只有整数或数组整数对象支持 constexpr 内存比较",
"概念模板不能具有关联约束",
"不允许使用 \"export\"",
"不允许导出单个类成员",
@@ -3335,5 +3335,27 @@
"标准 C++20 中的比较不明确,因为连接反向参数的隐式比较运算符的比较结果表示了同等好的匹配--这通常是由于比较运算符中缺少 \"const\" 限定符造成的; 请参阅 %nod",
"concept-id 无效",
"requires-clause 的参数 %T 替换失败",
"不满足 %nd 的约束"
"不满足 %nd 的约束",
"constexpr 函数中变量类型 %t 具有虚拟基类",
"常数表达式无法为类型 %t 分配虚拟基子对象",
"类类型的模板参数必须是结构类类型",
"对 UTF-8 文本的支持需要 u 文本支持。",
"多次为“%s”指定了模块文件映射",
"多次为“%s”指定了标头单元映射",
"未为“%s”指定映射",
"“%s”的模块文件映射无效",
"找不到要导入的标头“%s”",
"模块文件列表中有多个文件与“%s”匹配",
"为“%s”找到的模块文件用于其他模块",
"任何类型的模块文件",
"无法读取模块文件",
"内置函数不可用,因为当前选项不支持 char8_t 类型",
"如果启用了 C++20 协同程序,则无法指定 --ms_await 命令行选项",
"对默认聚合元素初始化使用显式构造函数 %nod 不是标准做法",
"与 memcpy 类似的固有项的源或目标不指向对象",
"与 memcpy 类似的固有项尝试复制在表达上不同的类型 %t1 和 %t2",
"与 memcpy 类似的固有项尝试复制非平凡可复制类型 %t",
"与 memcpy 类似的固有项尝试复制部分对象",
"与 memcpy 类似的固有项尝试复制过去的数组边界",
"与 memcpy 类似的固有项尝试复制重叠的字节范围(改为使用相应的 memmove 操作)"
]
@@ -3300,7 +3300,7 @@
"概念使用無效",
"預設的成員比較運算子不可限定為 '&&'",
"預設 constexpr 比較函式會呼叫非 constexpr 函式 %nd",
"只有最上層整數或整數陣列物件支援 constexpr 記憶體比較",
"只有整數或整數陣列物件支援 constexpr 記憶體比較",
"概念範本不能具有已建立關聯的條件約束",
"不允許 'export'",
"不允許匯出個別類別成員",
@@ -3335,5 +3335,27 @@
"因為具有反轉參數的隱含比較運算子為均等相符,所以標準 C++20 中的比較會模稜兩可。這通常是比較運算子中遺漏 'const' 限定詞所致; 請參閱 %nod",
"概念識別碼無效",
"Requires 子句的引數 %T 替代失敗",
"未滿足 %nd 的條件約束"
"未滿足 %nd 的條件約束",
"constexpr 函式中的變數型別 %t 具有虛擬基底類別",
"常數運算式無法配置虛擬基底子物件 (針對型別 %t )",
"類別型別的範本參數必須為結構類別型別",
"UTF-8 常值的支援需要 u-literal 支援。",
"指定了多次 '%s' 的模組檔案對應",
"指定了多次 '%s' 的標頭單位對應",
"未指定 '%s' 的對應",
"'%s' 的模組檔案對應無效",
"找不到要匯入的標頭 '%s'",
"模組檔案清單中有多個檔案與 '%s' 相符",
"為 '%s' 找到的模組檔案會用於其他模組",
"任何類型的模組檔案",
"無法讀取模組檔案",
"因為目前的選項不支援 char8_t 類型,所以無法使用內建函式",
"如果啟用 C++ 20 協同程式,就不能指定 --ms_await 命令列選項",
"非標準地使用明確的建構函式 %nod 進行預設彙總元素初始化",
"內建類 memcpy 的來源或目的地未指向物件",
"內建類 memcpy 嘗試複製具象相異類型 %t1 與 %t2",
"內建類 memcpy 嘗試複製非一般可複製類型 %t",
"內建類 memcpy 嘗試複製部分物件",
"內建類 memcpy 嘗試複製過去陣列邊界",
"內建類 memcpy 嘗試複製重疊位元組範圍 (改用對應的 memmove 作業)"
]
-33
View File
@@ -1,33 +0,0 @@
{
"defaults": [
"cpfe",
"--wchar_t_keyword",
"--no_warnings",
"--rtti",
"--edge",
"--exceptions",
"--error_limit",
"25000",
"-D_EDG_COMPILER",
"-D_USE_DECLSPECS_FOR_SAL=1"
],
"source_file_format": "-f %s",
"expressions": [
{
"match": "^/I(.*)",
"replace": "-I\n$1"
},
{
"match": "^/D(.*)",
"replace": "-D$1"
},
{
"match": "^/AI(.*)",
"replace": "--using_directory\n$1"
},
{
"match": "^/dE--header_only_fallback",
"replace": "--header_only_fallback"
}
]
}
-7
View File
@@ -1,7 +0,0 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op" : "merge"
}
-7
View File
@@ -1,7 +0,0 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op" : "merge"
}
-7
View File
@@ -1,7 +0,0 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op" : "merge"
}
-7
View File
@@ -1,7 +0,0 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op" : "merge"
}
+7
View File
@@ -0,0 +1,7 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op": "merge"
}
+7
View File
@@ -0,0 +1,7 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op": "merge"
}
+7
View File
@@ -0,0 +1,7 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op": "merge"
}
+7
View File
@@ -0,0 +1,7 @@
{
"defaults": [
"--pack_alignment",
"8"
],
"defaults_op": "merge"
}

Some files were not shown because too many files have changed in this diff Show More