From 322fc0a2ffa3f20dfb86be73151940e98883682d Mon Sep 17 00:00:00 2001 From: Dmitrii Bobreshev <106314398+DmitriiBobreshev@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:46:33 +0200 Subject: [PATCH] [GitHubRelease] Update to Node16 (#18432) * [GitHubRelease] Update to Node16 -- Generated new task -- Added package.json and package-lock.json to original task for Node16 -- bump libs for node16 * [GitHubRelease] Migrate task to Node16 -- Bump task version --- .../FilesOverriddenForConfigGoHereREADME.txt | 1 + .../_buildConfigs/Node16/package-lock.json | 720 ++++++++++++++++++ Tasks/GitHubReleaseV0/make.json | 9 + Tasks/GitHubReleaseV0/task.json | 678 ++++++++--------- Tasks/GitHubReleaseV0/task.loc.json | 4 +- .../FilesOverriddenForConfigGoHereREADME.txt | 1 + .../_buildConfigs/Node16/package-lock.json | 657 ++++++++++++++++ .../_buildConfigs/Node16/package.json | 23 + Tasks/GitHubReleaseV1/task.json | 679 +++++++++-------- Tasks/GitHubReleaseV1/task.loc.json | 4 +- _generated/GitHubReleaseV0.versionmap.txt | 2 + _generated/GitHubReleaseV0/README.md | 63 ++ .../resources.resjson/de-DE/resources.resjson | 127 +++ .../resources.resjson/en-US/resources.resjson | 127 +++ .../resources.resjson/es-ES/resources.resjson | 127 +++ .../resources.resjson/fr-FR/resources.resjson | 127 +++ .../resources.resjson/it-IT/resources.resjson | 127 +++ .../resources.resjson/ja-JP/resources.resjson | 127 +++ .../resources.resjson/ko-KR/resources.resjson | 127 +++ .../resources.resjson/ru-RU/resources.resjson | 127 +++ .../resources.resjson/zh-CN/resources.resjson | 127 +++ .../resources.resjson/zh-TW/resources.resjson | 127 +++ .../GitHubReleaseV0/Tests/ActionL0Tests.ts | 25 + .../GitHubReleaseV0/Tests/ActionTests.ts | 63 ++ .../GitHubReleaseV0/Tests/ChangeLogL0Tests.ts | 61 ++ .../GitHubReleaseV0/Tests/ChangeLogTests.ts | 170 +++++ .../Tests/CreateAction2L0Tests.ts | 48 ++ .../Tests/CreateActionL0Tests.ts | 60 ++ .../Tests/DeleteAction2L0Tests.ts | 42 + .../Tests/DeleteActionL0Tests.ts | 42 + .../Tests/EditAction2L0Tests.ts | 60 ++ .../Tests/EditActionL0Tests.ts | 60 ++ .../GitHubReleaseV0/Tests/HelperL0Tests.ts | 47 ++ .../GitHubReleaseV0/Tests/HelperTests.ts | 67 ++ .../Tests/InvalidActionL0Tests.ts | 34 + _generated/GitHubReleaseV0/Tests/L0.ts | 136 ++++ .../GitHubReleaseV0/Tests/TestStrings.ts | 29 + .../GitHubReleaseV0/Tests/UtilityL0Tests.ts | 92 +++ .../GitHubReleaseV0/Tests/package-lock.json | 166 ++++ _generated/GitHubReleaseV0/Tests/package.json | 10 + .../GitHubReleaseV0/ThirdPartyNotices.txt | 668 ++++++++++++++++ _generated/GitHubReleaseV0/icon.png | Bin 0 -> 1094 bytes _generated/GitHubReleaseV0/icon.svg | 11 + _generated/GitHubReleaseV0/main.ts | 133 ++++ _generated/GitHubReleaseV0/make.json | 11 + .../GitHubReleaseV0/operations/Action.ts | 255 +++++++ .../GitHubReleaseV0/operations/ChangeLog.ts | 701 +++++++++++++++++ .../GitHubReleaseV0/operations/Constants.ts | 24 + .../GitHubReleaseV0/operations/Helper.ts | 283 +++++++ .../GitHubReleaseV0/operations/Release.ts | 259 +++++++ .../GitHubReleaseV0/operations/Utility.ts | 364 +++++++++ .../GitHubReleaseV0/operations/webClient.ts | 112 +++ _generated/GitHubReleaseV0/package-lock.json | 708 +++++++++++++++++ _generated/GitHubReleaseV0/package.json | 23 + _generated/GitHubReleaseV0/task.json | 348 +++++++++ _generated/GitHubReleaseV0/task.loc.json | 348 +++++++++ _generated/GitHubReleaseV0/tsconfig.json | 6 + _generated/GitHubReleaseV0_Node16/README.md | 63 ++ .../resources.resjson/de-DE/resources.resjson | 127 +++ .../resources.resjson/en-US/resources.resjson | 127 +++ .../resources.resjson/es-ES/resources.resjson | 127 +++ .../resources.resjson/fr-FR/resources.resjson | 127 +++ .../resources.resjson/it-IT/resources.resjson | 127 +++ .../resources.resjson/ja-JP/resources.resjson | 127 +++ .../resources.resjson/ko-KR/resources.resjson | 127 +++ .../resources.resjson/ru-RU/resources.resjson | 127 +++ .../resources.resjson/zh-CN/resources.resjson | 127 +++ .../resources.resjson/zh-TW/resources.resjson | 127 +++ .../Tests/ActionL0Tests.ts | 25 + .../Tests/ActionTests.ts | 63 ++ .../Tests/ChangeLogL0Tests.ts | 61 ++ .../Tests/ChangeLogTests.ts | 170 +++++ .../Tests/CreateAction2L0Tests.ts | 48 ++ .../Tests/CreateActionL0Tests.ts | 60 ++ .../Tests/DeleteAction2L0Tests.ts | 42 + .../Tests/DeleteActionL0Tests.ts | 42 + .../Tests/EditAction2L0Tests.ts | 60 ++ .../Tests/EditActionL0Tests.ts | 60 ++ .../Tests/HelperL0Tests.ts | 47 ++ .../Tests/HelperTests.ts | 67 ++ .../Tests/InvalidActionL0Tests.ts | 34 + _generated/GitHubReleaseV0_Node16/Tests/L0.ts | 136 ++++ .../Tests/TestStrings.ts | 29 + .../Tests/UtilityL0Tests.ts | 92 +++ .../Tests/package-lock.json | 166 ++++ .../GitHubReleaseV0_Node16/Tests/package.json | 10 + .../ThirdPartyNotices.txt | 668 ++++++++++++++++ _generated/GitHubReleaseV0_Node16/icon.png | Bin 0 -> 1094 bytes _generated/GitHubReleaseV0_Node16/icon.svg | 11 + _generated/GitHubReleaseV0_Node16/main.ts | 133 ++++ _generated/GitHubReleaseV0_Node16/make.json | 11 + .../operations/Action.ts | 255 +++++++ .../operations/ChangeLog.ts | 701 +++++++++++++++++ .../operations/Constants.ts | 24 + .../operations/Helper.ts | 283 +++++++ .../operations/Release.ts | 259 +++++++ .../operations/Utility.ts | 364 +++++++++ .../operations/webClient.ts | 112 +++ .../GitHubReleaseV0_Node16/package-lock.json | 720 ++++++++++++++++++ .../GitHubReleaseV0_Node16/package.json | 23 + _generated/GitHubReleaseV0_Node16/task.json | 352 +++++++++ .../GitHubReleaseV0_Node16/task.loc.json | 352 +++++++++ .../GitHubReleaseV0_Node16/tsconfig.json | 6 + _generated/GitHubReleaseV1.versionmap.txt | 2 + _generated/GitHubReleaseV1/README.md | 63 ++ .../resources.resjson/de-DE/resources.resjson | 127 +++ .../resources.resjson/en-US/resources.resjson | 127 +++ .../resources.resjson/es-ES/resources.resjson | 127 +++ .../resources.resjson/fr-FR/resources.resjson | 127 +++ .../resources.resjson/it-IT/resources.resjson | 127 +++ .../resources.resjson/ja-JP/resources.resjson | 127 +++ .../resources.resjson/ko-KR/resources.resjson | 127 +++ .../resources.resjson/ru-RU/resources.resjson | 127 +++ .../resources.resjson/zh-CN/resources.resjson | 127 +++ .../resources.resjson/zh-TW/resources.resjson | 127 +++ .../GitHubReleaseV1/Tests/ActionL0Tests.ts | 25 + .../GitHubReleaseV1/Tests/ActionTests.ts | 63 ++ .../GitHubReleaseV1/Tests/ChangeLogL0Tests.ts | 61 ++ .../GitHubReleaseV1/Tests/ChangeLogTests.ts | 170 +++++ .../Tests/CreateAction2L0Tests.ts | 48 ++ .../Tests/CreateActionL0Tests.ts | 60 ++ .../Tests/DeleteAction2L0Tests.ts | 42 + .../Tests/DeleteActionL0Tests.ts | 42 + .../Tests/EditAction2L0Tests.ts | 60 ++ .../Tests/EditActionL0Tests.ts | 60 ++ .../GitHubReleaseV1/Tests/HelperL0Tests.ts | 47 ++ .../GitHubReleaseV1/Tests/HelperTests.ts | 67 ++ .../Tests/InvalidActionL0Tests.ts | 34 + _generated/GitHubReleaseV1/Tests/L0.ts | 136 ++++ .../GitHubReleaseV1/Tests/TestStrings.ts | 29 + .../GitHubReleaseV1/Tests/UtilityL0Tests.ts | 92 +++ .../GitHubReleaseV1/Tests/package-lock.json | 182 +++++ _generated/GitHubReleaseV1/Tests/package.json | 10 + .../GitHubReleaseV1/ThirdPartyNotices.txt | 668 ++++++++++++++++ _generated/GitHubReleaseV1/icon.png | Bin 0 -> 1094 bytes _generated/GitHubReleaseV1/icon.svg | 11 + _generated/GitHubReleaseV1/main.ts | 133 ++++ _generated/GitHubReleaseV1/make.json | 11 + .../GitHubReleaseV1/operations/Action.ts | 255 +++++++ .../GitHubReleaseV1/operations/ChangeLog.ts | 701 +++++++++++++++++ .../GitHubReleaseV1/operations/Constants.ts | 24 + .../GitHubReleaseV1/operations/Helper.ts | 283 +++++++ .../GitHubReleaseV1/operations/Release.ts | 259 +++++++ .../GitHubReleaseV1/operations/Utility.ts | 364 +++++++++ .../GitHubReleaseV1/operations/webClient.ts | 112 +++ _generated/GitHubReleaseV1/package-lock.json | 657 ++++++++++++++++ _generated/GitHubReleaseV1/package.json | 23 + _generated/GitHubReleaseV1/task.json | 348 +++++++++ _generated/GitHubReleaseV1/task.loc.json | 348 +++++++++ _generated/GitHubReleaseV1/tsconfig.json | 6 + _generated/GitHubReleaseV1_Node16/README.md | 63 ++ .../resources.resjson/de-DE/resources.resjson | 127 +++ .../resources.resjson/en-US/resources.resjson | 127 +++ .../resources.resjson/es-ES/resources.resjson | 127 +++ .../resources.resjson/fr-FR/resources.resjson | 127 +++ .../resources.resjson/it-IT/resources.resjson | 127 +++ .../resources.resjson/ja-JP/resources.resjson | 127 +++ .../resources.resjson/ko-KR/resources.resjson | 127 +++ .../resources.resjson/ru-RU/resources.resjson | 127 +++ .../resources.resjson/zh-CN/resources.resjson | 127 +++ .../resources.resjson/zh-TW/resources.resjson | 127 +++ .../Tests/ActionL0Tests.ts | 25 + .../Tests/ActionTests.ts | 63 ++ .../Tests/ChangeLogL0Tests.ts | 61 ++ .../Tests/ChangeLogTests.ts | 170 +++++ .../Tests/CreateAction2L0Tests.ts | 48 ++ .../Tests/CreateActionL0Tests.ts | 60 ++ .../Tests/DeleteAction2L0Tests.ts | 42 + .../Tests/DeleteActionL0Tests.ts | 42 + .../Tests/EditAction2L0Tests.ts | 60 ++ .../Tests/EditActionL0Tests.ts | 60 ++ .../Tests/HelperL0Tests.ts | 47 ++ .../Tests/HelperTests.ts | 67 ++ .../Tests/InvalidActionL0Tests.ts | 34 + _generated/GitHubReleaseV1_Node16/Tests/L0.ts | 136 ++++ .../Tests/TestStrings.ts | 29 + .../Tests/UtilityL0Tests.ts | 92 +++ .../Tests/package-lock.json | 182 +++++ .../GitHubReleaseV1_Node16/Tests/package.json | 10 + .../ThirdPartyNotices.txt | 668 ++++++++++++++++ _generated/GitHubReleaseV1_Node16/icon.png | Bin 0 -> 1094 bytes _generated/GitHubReleaseV1_Node16/icon.svg | 11 + _generated/GitHubReleaseV1_Node16/main.ts | 133 ++++ _generated/GitHubReleaseV1_Node16/make.json | 11 + .../operations/Action.ts | 255 +++++++ .../operations/ChangeLog.ts | 701 +++++++++++++++++ .../operations/Constants.ts | 24 + .../operations/Helper.ts | 283 +++++++ .../operations/Release.ts | 259 +++++++ .../operations/Utility.ts | 364 +++++++++ .../operations/webClient.ts | 112 +++ .../GitHubReleaseV1_Node16/package-lock.json | 657 ++++++++++++++++ .../GitHubReleaseV1_Node16/package.json | 23 + _generated/GitHubReleaseV1_Node16/task.json | 352 +++++++++ .../GitHubReleaseV1_Node16/task.loc.json | 352 +++++++++ .../GitHubReleaseV1_Node16/tsconfig.json | 6 + make-options.json | 4 +- 197 files changed, 29254 insertions(+), 684 deletions(-) create mode 100644 Tasks/GitHubReleaseV0/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt create mode 100644 Tasks/GitHubReleaseV0/_buildConfigs/Node16/package-lock.json create mode 100644 Tasks/GitHubReleaseV1/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt create mode 100644 Tasks/GitHubReleaseV1/_buildConfigs/Node16/package-lock.json create mode 100644 Tasks/GitHubReleaseV1/_buildConfigs/Node16/package.json create mode 100644 _generated/GitHubReleaseV0.versionmap.txt create mode 100644 _generated/GitHubReleaseV0/README.md create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/GitHubReleaseV0/Tests/ActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/ActionTests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/ChangeLogL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/ChangeLogTests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/CreateAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/CreateActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/DeleteAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/DeleteActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/EditAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/EditActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/HelperL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/HelperTests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/InvalidActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/L0.ts create mode 100644 _generated/GitHubReleaseV0/Tests/TestStrings.ts create mode 100644 _generated/GitHubReleaseV0/Tests/UtilityL0Tests.ts create mode 100644 _generated/GitHubReleaseV0/Tests/package-lock.json create mode 100644 _generated/GitHubReleaseV0/Tests/package.json create mode 100644 _generated/GitHubReleaseV0/ThirdPartyNotices.txt create mode 100644 _generated/GitHubReleaseV0/icon.png create mode 100644 _generated/GitHubReleaseV0/icon.svg create mode 100644 _generated/GitHubReleaseV0/main.ts create mode 100644 _generated/GitHubReleaseV0/make.json create mode 100644 _generated/GitHubReleaseV0/operations/Action.ts create mode 100644 _generated/GitHubReleaseV0/operations/ChangeLog.ts create mode 100644 _generated/GitHubReleaseV0/operations/Constants.ts create mode 100644 _generated/GitHubReleaseV0/operations/Helper.ts create mode 100644 _generated/GitHubReleaseV0/operations/Release.ts create mode 100644 _generated/GitHubReleaseV0/operations/Utility.ts create mode 100644 _generated/GitHubReleaseV0/operations/webClient.ts create mode 100644 _generated/GitHubReleaseV0/package-lock.json create mode 100644 _generated/GitHubReleaseV0/package.json create mode 100644 _generated/GitHubReleaseV0/task.json create mode 100644 _generated/GitHubReleaseV0/task.loc.json create mode 100644 _generated/GitHubReleaseV0/tsconfig.json create mode 100644 _generated/GitHubReleaseV0_Node16/README.md create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/ActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/ActionTests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/ChangeLogL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/ChangeLogTests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/CreateAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/CreateActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/DeleteAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/DeleteActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/EditAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/EditActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/HelperL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/HelperTests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/InvalidActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/L0.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/TestStrings.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/UtilityL0Tests.ts create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/package-lock.json create mode 100644 _generated/GitHubReleaseV0_Node16/Tests/package.json create mode 100644 _generated/GitHubReleaseV0_Node16/ThirdPartyNotices.txt create mode 100644 _generated/GitHubReleaseV0_Node16/icon.png create mode 100644 _generated/GitHubReleaseV0_Node16/icon.svg create mode 100644 _generated/GitHubReleaseV0_Node16/main.ts create mode 100644 _generated/GitHubReleaseV0_Node16/make.json create mode 100644 _generated/GitHubReleaseV0_Node16/operations/Action.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/ChangeLog.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/Constants.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/Helper.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/Release.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/Utility.ts create mode 100644 _generated/GitHubReleaseV0_Node16/operations/webClient.ts create mode 100644 _generated/GitHubReleaseV0_Node16/package-lock.json create mode 100644 _generated/GitHubReleaseV0_Node16/package.json create mode 100644 _generated/GitHubReleaseV0_Node16/task.json create mode 100644 _generated/GitHubReleaseV0_Node16/task.loc.json create mode 100644 _generated/GitHubReleaseV0_Node16/tsconfig.json create mode 100644 _generated/GitHubReleaseV1.versionmap.txt create mode 100644 _generated/GitHubReleaseV1/README.md create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/GitHubReleaseV1/Tests/ActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/ActionTests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/ChangeLogL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/ChangeLogTests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/CreateAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/CreateActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/DeleteAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/DeleteActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/EditAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/EditActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/HelperL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/HelperTests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/InvalidActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/L0.ts create mode 100644 _generated/GitHubReleaseV1/Tests/TestStrings.ts create mode 100644 _generated/GitHubReleaseV1/Tests/UtilityL0Tests.ts create mode 100644 _generated/GitHubReleaseV1/Tests/package-lock.json create mode 100644 _generated/GitHubReleaseV1/Tests/package.json create mode 100644 _generated/GitHubReleaseV1/ThirdPartyNotices.txt create mode 100644 _generated/GitHubReleaseV1/icon.png create mode 100644 _generated/GitHubReleaseV1/icon.svg create mode 100644 _generated/GitHubReleaseV1/main.ts create mode 100644 _generated/GitHubReleaseV1/make.json create mode 100644 _generated/GitHubReleaseV1/operations/Action.ts create mode 100644 _generated/GitHubReleaseV1/operations/ChangeLog.ts create mode 100644 _generated/GitHubReleaseV1/operations/Constants.ts create mode 100644 _generated/GitHubReleaseV1/operations/Helper.ts create mode 100644 _generated/GitHubReleaseV1/operations/Release.ts create mode 100644 _generated/GitHubReleaseV1/operations/Utility.ts create mode 100644 _generated/GitHubReleaseV1/operations/webClient.ts create mode 100644 _generated/GitHubReleaseV1/package-lock.json create mode 100644 _generated/GitHubReleaseV1/package.json create mode 100644 _generated/GitHubReleaseV1/task.json create mode 100644 _generated/GitHubReleaseV1/task.loc.json create mode 100644 _generated/GitHubReleaseV1/tsconfig.json create mode 100644 _generated/GitHubReleaseV1_Node16/README.md create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/ActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/ActionTests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/ChangeLogL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/ChangeLogTests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/CreateAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/CreateActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/DeleteAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/DeleteActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/EditAction2L0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/EditActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/HelperL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/HelperTests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/InvalidActionL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/L0.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/TestStrings.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/UtilityL0Tests.ts create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/package-lock.json create mode 100644 _generated/GitHubReleaseV1_Node16/Tests/package.json create mode 100644 _generated/GitHubReleaseV1_Node16/ThirdPartyNotices.txt create mode 100644 _generated/GitHubReleaseV1_Node16/icon.png create mode 100644 _generated/GitHubReleaseV1_Node16/icon.svg create mode 100644 _generated/GitHubReleaseV1_Node16/main.ts create mode 100644 _generated/GitHubReleaseV1_Node16/make.json create mode 100644 _generated/GitHubReleaseV1_Node16/operations/Action.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/ChangeLog.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/Constants.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/Helper.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/Release.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/Utility.ts create mode 100644 _generated/GitHubReleaseV1_Node16/operations/webClient.ts create mode 100644 _generated/GitHubReleaseV1_Node16/package-lock.json create mode 100644 _generated/GitHubReleaseV1_Node16/package.json create mode 100644 _generated/GitHubReleaseV1_Node16/task.json create mode 100644 _generated/GitHubReleaseV1_Node16/task.loc.json create mode 100644 _generated/GitHubReleaseV1_Node16/tsconfig.json diff --git a/Tasks/GitHubReleaseV0/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt b/Tasks/GitHubReleaseV0/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt new file mode 100644 index 000000000000..b338e624afcd --- /dev/null +++ b/Tasks/GitHubReleaseV0/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt @@ -0,0 +1 @@ +Place files overridden for this config in this directory \ No newline at end of file diff --git a/Tasks/GitHubReleaseV0/_buildConfigs/Node16/package-lock.json b/Tasks/GitHubReleaseV0/_buildConfigs/Node16/package-lock.json new file mode 100644 index 000000000000..96965d95a5c2 --- /dev/null +++ b/Tasks/GitHubReleaseV0/_buildConfigs/Node16/package-lock.json @@ -0,0 +1,720 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "dependencies": { + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "http://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha1-RBprv5s8aNpiTbAeo1y6jwpMLKs=", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/Tasks/GitHubReleaseV0/make.json b/Tasks/GitHubReleaseV0/make.json index 7a73a41bfdf7..3df4ca171399 100644 --- a/Tasks/GitHubReleaseV0/make.json +++ b/Tasks/GitHubReleaseV0/make.json @@ -1,2 +1,11 @@ { + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] } \ No newline at end of file diff --git a/Tasks/GitHubReleaseV0/task.json b/Tasks/GitHubReleaseV0/task.json index 1aafae2fe865..236d35e10515 100644 --- a/Tasks/GitHubReleaseV0/task.json +++ b/Tasks/GitHubReleaseV0/task.json @@ -1,344 +1,344 @@ { - "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", - "name": "GitHubRelease", - "friendlyName": "GitHub Release", - "description": "Create, edit, or delete a GitHub release", - "helpUrl": "https://aka.ms/AA5vv5o", - "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", - "category": "Utility", - "visibility": [ - "Build", - "Release" - ], - "author": "Microsoft Corporation", - "preview": true, - "version": { - "Major": 0, - "Minor": 221, - "Patch": 0 + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 0, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "auto", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "auto": "Git tag", + "manual": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = auto", + "helpMarkDown": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = manual", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "file", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "file": "Release notes file", + "input": "Inline release notes" + } + }, + { + "name": "releaseNotesFile", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = file" }, - "demands": [], - "minimumAgentVersion": "2.0.0", - "groups": [ - { - "name": "changeLogConfiguration", - "displayName": "Changelog configuration", - "isExpanded": true, - "visibleRule": "addChangeLog = true" - } - ], - "inputs": [ - { - "name": "gitHubConnection", - "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", - "label": "GitHub connection (OAuth or PAT)", - "defaultValue": "", - "required": true, - "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." - }, - { - "name": "repositoryName", - "type": "githubRepositoryPicker", - "label": "Repository", - "defaultValue": "$(Build.Repository.Name)", - "required": true, - "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", - "properties": { - "DisableManageLink": "True", - "EditableOptions": "True" - } - }, - { - "name": "action", - "type": "pickList", - "label": "Action", - "defaultValue": "create", - "required": true, - "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", - "options": { - "create": "Create", - "edit": "Edit", - "delete": "Delete" - } - }, - { - "name": "target", - "type": "string", - "label": "Target", - "defaultValue": "$(Build.SourceVersion)", - "required": true, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." - }, - { - "name": "tagSource", - "type": "radio", - "label": "Tag source", - "required": true, - "defaultValue": "auto", - "visibleRule": "action = create", - "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", - "options": { - "auto": "Git tag", - "manual": "User specified tag" - } - }, - { - "name": "tagPattern", - "type": "string", - "label": "Tag Pattern", - "required": false, - "visibleRule": "tagSource = auto", - "helpMarkDown": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " - }, - { - "name": "tag", - "type": "string", - "label": "Tag", - "defaultValue": "", - "required": true, - "visibleRule": "action = edit || action = delete || tagSource = manual", - "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." - }, - { - "name": "title", - "type": "string", - "label": "Release title", - "defaultValue": "", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." - }, - { - "name": "releaseNotesSource", - "type": "radio", - "label": "Release notes source", - "required": false, - "defaultValue": "file", - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", - "options": { - "file": "Release notes file", - "input": "Inline release notes" - } - }, - { - "name": "releaseNotesFile", - "type": "filePath", - "label": "Release notes file path", - "required": false, - "helpMarkDown": "Select the file which contains the release notes.", - "visibleRule": "releaseNotesSource = file" - }, - { - "name": "releaseNotes", - "type": "multiLine", - "label": "Release notes", - "required": false, - "helpMarkDown": "Enter the release notes here. Markdown is supported.", - "visibleRule": "releaseNotesSource = input", - "properties": { - "resizable": "true", - "rows": "4", - "maxLength": "5000" - } - }, - { - "name": "assets", - "type": "multiLine", - "label": "Assets", - "defaultValue": "$(Build.ArtifactStagingDirectory)/*", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", - "properties": { - "resizable": "true", - "rows": "4" - } - }, - { - "name": "assetUploadMode", - "type": "radio", - "label": "Asset upload mode", - "required": false, - "defaultValue": "delete", - "visibleRule": "action = edit", - "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", - "options": { - "delete": "Delete exisiting assets", - "replace": "Replace existing assets" - } - }, - { - "name": "isDraft", - "type": "boolean", - "label": "Draft release", - "defaultValue": "false", - "required": false, - "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", - "visibleRule": "action = create || action = edit" - }, - { - "name": "isPreRelease", - "type": "boolean", - "label": "Pre-release", - "defaultValue": "false", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Indicate whether the release should be marked as a pre-release." - }, - { - "name": "addChangeLog", - "type": "boolean", - "label": "Add changelog", - "defaultValue": "true", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." - }, - { - "name": "changeLogCompareToRelease", - "type": "radio", - "label": "Compare to", - "required": true, - "defaultValue": "lastFullRelease", - "groupName": "changeLogConfiguration", - "visibleRule": "addChangeLog = true", - "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", - "options": { - "lastFullRelease": "Last full release", - "lastNonDraftRelease": "Last non-draft release", - "lastNonDraftReleaseByTag": "Last non-draft release by tag" - } - }, - { - "name": "changeLogCompareToReleaseTag", - "type": "string", - "label": "Release Tag", - "required": true, - "groupName": "changeLogConfiguration", - "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", - "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." - }, - { - "name": "changeLogType", - "type": "radio", - "label": "Changelog type", - "required": true, - "defaultValue": "commitBased", - "groupName": "changeLogConfiguration", - "visibleRule": "addChangeLog = true", - "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", - "options": { - "commitBased": "Commit based", - "issueBased": "Issue based" - } - }, - { - "name": "changeLogLabels", - "type": "multiLine", - "label": "Categories", - "required": false, - "visibleRule": "changeLogType = issueBased", - "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", - "groupName": "changeLogConfiguration", - "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." - } - ], - "dataSourceBindings": [ - { - "target": "repositoryName", - "endpointId": "$(gitHubConnection)", - "dataSourceName": "UserRepositories", - "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" - } - ], - "instanceNameFormat": "GitHub release ($(action))", - "execution": { - "Node10": { - "target": "main.js" - } + { + "name": "releaseNotes", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = input", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } }, - "messages": { - "GithubApiFailError": "An unexpected error occurred.", - "GetTagsError": "An unexpected error occurred while fetching tags.", - "GetReleasesError": "An unexpected error occurred while fetching releases.", - "CreateReleaseError": "An unexpected error occurred while creating the release.", - "EditReleaseError": "An unexpected error occurred while editing the release.", - "DeleteReleaseError": "An unexpected error occurred while deleting the release.", - "CreatingRelease": "Creating a release for tag: %s", - "CreateReleaseSuccess": "Release created successfully at %s", - "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", - "EditingRelease": "Editing the release with tag: %s", - "EditReleaseSuccess": "Release edited successfully", - "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", - "DeletingRelease": "Deleting the release for tag: %s", - "DeleteReleaseSuccess": "Release deleted successfully.", - "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", - "FetchReleaseForTag": "Fetching the release for tag: %s", - "FetchReleaseForTagSuccess": "Found a release for tag: %s", - "FetchTagForTarget": "Searching for tags associated with target commit: %s", - "FetchTagForTargetSuccess": "Found a tag for target commit: %s", - "MissingAssetError": "File not found: %s", - "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", - "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", - "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", - "DeleteAllExistingAssets": "Deleting all existing assets...", - "DuplicateAssetFound": "Duplicate asset found: %s", - "AssetsDeletedSuccessfully": "Assets deleted successfully.", - "DeletingDuplicateAsset": "Deleting duplicate asset: %s", - "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", - "AssetDeletedSuccessfully": "Asset %s deleted successfully", - "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", - "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", - "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", - "DeletingAsset": "Deleting asset: %s", - "NoAssetFoundToDelete": "No assets were found to delete.", - "UploadingAssets": "Uploading assets...", - "UploadingAsset": "Uploading file: '%s'.", - "UploadAssetError": "An unexpected error occurred while uploading the file: %s", - "UploadAssetSuccess": "Uploaded file successfully: '%s'", - "NoAssetFoundToUpload": "No assets were found to upload.", - "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", - "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", - "ComputingChangeLog": "Computing changes made in this release...", - "ComputingChangeLogSuccess": "Changes computed successfully.", - "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", - "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", - "FetchLatestPublishRelease": "Fetching the latest published release...", - "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", - "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", - "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", - "FetchMatchingReleaseSuccess": "Found the latest non-draft release", - "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", - "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", - "NoLatestPublishRelease": "No releases are published yet in the repository.", - "NoMatchingReleases": "No non-draft releases found.", - "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", - "FetchCommitDiff": "Fetching the list of commits since the last published release...", - "FetchCommitDiffSuccess": "Found the list of changes.", - "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", - "FetchInitialCommit": "Fetching the initial commit...", - "FetchInitialCommitSuccess": "Found the initial commit: %s", - "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", - "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", - "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", - "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", - "TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", - "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", - "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", - "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", - "IssuesFetchError": "Error fetching issues. Cannot generate change log.", - "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", - "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "ChangeLogTitle": "Changes", - "DefaultCategory": "Others", - "SeeMoreText": "See More" + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + } } \ No newline at end of file diff --git a/Tasks/GitHubReleaseV0/task.loc.json b/Tasks/GitHubReleaseV0/task.loc.json index f6c6dd6e7321..4fd6dd0e33c5 100644 --- a/Tasks/GitHubReleaseV0/task.loc.json +++ b/Tasks/GitHubReleaseV0/task.loc.json @@ -14,8 +14,8 @@ "preview": true, "version": { "Major": 0, - "Minor": 221, - "Patch": 0 + "Minor": 224, + "Patch": 1 }, "demands": [], "minimumAgentVersion": "2.0.0", diff --git a/Tasks/GitHubReleaseV1/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt new file mode 100644 index 000000000000..b338e624afcd --- /dev/null +++ b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/FilesOverriddenForConfigGoHereREADME.txt @@ -0,0 +1 @@ +Place files overridden for this config in this directory \ No newline at end of file diff --git a/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package-lock.json b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package-lock.json new file mode 100644 index 000000000000..a9f6bc1481d9 --- /dev/null +++ b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package-lock.json @@ -0,0 +1,657 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha512-JgOVmcJwa5Fw/deqBPC/lYG/D2duDIcv6V/u58bQhThOHAYFf6tYd+INHc/uaggWSnx5nxcKwjyHcMU1xweEWA==", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + }, + "dependencies": { + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha512-o9QYRJN5WgS8oCtqvwzzcfnzaTnDPr7HpUsQdSXscTyzXbjvl4wSHPTUKOKzEaDeQvOuyRtt3ui+ujM7x7TReQ==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package.json b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package.json new file mode 100644 index 000000000000..646b08f8f55c --- /dev/null +++ b/Tasks/GitHubReleaseV1/_buildConfigs/Node16/package.json @@ -0,0 +1,23 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^16.11.39", + "@types/q": "1.5.0", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^4.3.1", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "brace-expansion": "1.1.8", + "browserify-mime": "1.2.9", + "glob": "7.1.2", + "q": "1.4.1", + "semver": "5.4.1", + "typed-rest-client": "^1.8.9", + "vso-node-api": "6.0.1-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/Tasks/GitHubReleaseV1/task.json b/Tasks/GitHubReleaseV1/task.json index 129605e7516b..222f3535fc8f 100644 --- a/Tasks/GitHubReleaseV1/task.json +++ b/Tasks/GitHubReleaseV1/task.json @@ -1,345 +1,344 @@ { - "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", - "name": "GitHubRelease", - "friendlyName": "GitHub Release", - "description": "Create, edit, or delete a GitHub release", - "helpUrl": "https://aka.ms/AA5vv5o", - "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", - "category": "Utility", - "visibility": [ - "Build", - "Release" - ], - "author": "Microsoft Corporation", - "preview": false, - "version": { - "Major": 1, - "Minor": 218, - "Patch": 0 + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": false, + "version": { + "Major": 1, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "gitTag", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "gitTag": "Git tag", + "userSpecifiedTag": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = gitTag", + "helpMarkDown": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "filePath", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "filePath": "Release notes file", + "inline": "Inline release notes" + } + }, + { + "name": "releaseNotesFilePath", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = filePath" }, - "demands": [], - "minimumAgentVersion": "2.0.0", - "groups": [ - { - "name": "changeLogConfiguration", - "displayName": "Changelog configuration", - "isExpanded": true, - "visibleRule": "addChangeLog = true" - } - ], - "inputs": [ - { - "name": "gitHubConnection", - "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", - "label": "GitHub connection (OAuth or PAT)", - "defaultValue": "", - "required": true, - "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." - }, - { - "name": "repositoryName", - "type": "githubRepositoryPicker", - "label": "Repository", - "defaultValue": "$(Build.Repository.Name)", - "required": true, - "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", - "properties": { - "DisableManageLink": "True", - "EditableOptions": "True" - } - }, - { - "name": "action", - "type": "pickList", - "label": "Action", - "defaultValue": "create", - "required": true, - "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", - "options": { - "create": "Create", - "edit": "Edit", - "delete": "Delete" - } - }, - { - "name": "target", - "type": "string", - "label": "Target", - "defaultValue": "$(Build.SourceVersion)", - "required": true, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." - }, - { - "name": "tagSource", - "type": "radio", - "label": "Tag source", - "required": true, - "defaultValue": "gitTag", - "visibleRule": "action = create", - "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", - "options": { - "gitTag": "Git tag", - "userSpecifiedTag": "User specified tag" - } - }, - { - "name": "tagPattern", - "type": "string", - "label": "Tag Pattern", - "required": false, - "visibleRule": "tagSource = gitTag", - "helpMarkDown": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " - }, - { - "name": "tag", - "type": "string", - "label": "Tag", - "defaultValue": "", - "required": true, - "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", - "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." - }, - { - "name": "title", - "type": "string", - "label": "Release title", - "defaultValue": "", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." - }, - { - "name": "releaseNotesSource", - "type": "radio", - "label": "Release notes source", - "required": false, - "defaultValue": "filePath", - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", - "options": { - "filePath": "Release notes file", - "inline": "Inline release notes" - } - }, - { - "name": "releaseNotesFilePath", - "type": "filePath", - "label": "Release notes file path", - "required": false, - "helpMarkDown": "Select the file which contains the release notes.", - "visibleRule": "releaseNotesSource = filePath" - }, - { - "name": "releaseNotesInline", - "type": "multiLine", - "label": "Release notes", - "required": false, - "helpMarkDown": "Enter the release notes here. Markdown is supported.", - "visibleRule": "releaseNotesSource = inline", - "properties": { - "resizable": "true", - "rows": "4", - "maxLength": "5000" - } - }, - { - "name": "assets", - "type": "multiLine", - "label": "Assets", - "defaultValue": "$(Build.ArtifactStagingDirectory)/*", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", - "properties": { - "resizable": "true", - "rows": "4" - } - }, - { - "name": "assetUploadMode", - "type": "radio", - "label": "Asset upload mode", - "required": false, - "defaultValue": "delete", - "visibleRule": "action = edit", - "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", - "options": { - "delete": "Delete exisiting assets", - "replace": "Replace existing assets" - } - }, - { - "name": "isDraft", - "type": "boolean", - "label": "Draft release", - "defaultValue": "false", - "required": false, - "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", - "visibleRule": "action = create || action = edit" - }, - { - "name": "isPreRelease", - "type": "boolean", - "label": "Pre-release", - "defaultValue": "false", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "Indicate whether the release should be marked as a pre-release." - }, - { - "name": "addChangeLog", - "type": "boolean", - "label": "Add changelog", - "defaultValue": "true", - "required": false, - "visibleRule": "action = create || action = edit", - "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." - }, - { - "name": "changeLogCompareToRelease", - "type": "radio", - "label": "Compare to", - "required": true, - "defaultValue": "lastFullRelease", - "groupName": "changeLogConfiguration", - "visibleRule": "addChangeLog = true", - "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", - "options": { - "lastFullRelease": "Last full release", - "lastNonDraftRelease": "Last non-draft release", - "lastNonDraftReleaseByTag": "Last non-draft release by tag" - } - }, - { - "name": "changeLogCompareToReleaseTag", - "type": "string", - "label": "Release Tag", - "required": true, - "groupName": "changeLogConfiguration", - "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", - "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." - }, - { - "name": "changeLogType", - "type": "radio", - "label": "Changelog type", - "required": true, - "defaultValue": "commitBased", - "groupName": "changeLogConfiguration", - "visibleRule": "addChangeLog = true", - "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", - "options": { - "commitBased": "Commit based", - "issueBased": "Issue based" - } - }, - { - "name": "changeLogLabels", - "type": "multiLine", - "label": "Categories", - "required": false, - "visibleRule": "changeLogType = issueBased", - "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", - "groupName": "changeLogConfiguration", - "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." - } - ], - "dataSourceBindings": [ - { - "target": "repositoryName", - "endpointId": "$(gitHubConnection)", - "dataSourceName": "UserRepositories", - "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" - } - ], - "instanceNameFormat": "GitHub release ($(action))", - "execution": { - "Node10": { - "target": "main.js" - } - + { + "name": "releaseNotesInline", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = inline", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } }, - "messages": { - "GithubApiFailError": "An unexpected error occurred.", - "GetTagsError": "An unexpected error occurred while fetching tags.", - "GetReleasesError": "An unexpected error occurred while fetching releases.", - "CreateReleaseError": "An unexpected error occurred while creating the release.", - "EditReleaseError": "An unexpected error occurred while editing the release.", - "DeleteReleaseError": "An unexpected error occurred while deleting the release.", - "CreatingRelease": "Creating a release for tag: %s", - "CreateReleaseSuccess": "Release created successfully at %s", - "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", - "EditingRelease": "Editing the release with tag: %s", - "EditReleaseSuccess": "Release edited successfully", - "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", - "DeletingRelease": "Deleting the release for tag: %s", - "DeleteReleaseSuccess": "Release deleted successfully.", - "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", - "FetchReleaseForTag": "Fetching the release for tag: %s", - "FetchReleaseForTagSuccess": "Found a release for tag: %s", - "FetchTagForTarget": "Searching for tags associated with target commit: %s", - "FetchTagForTargetSuccess": "Found a tag for target commit: %s", - "MissingAssetError": "File not found: %s", - "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", - "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", - "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", - "DeleteAllExistingAssets": "Deleting all existing assets...", - "DuplicateAssetFound": "Duplicate asset found: %s", - "AssetsDeletedSuccessfully": "Assets deleted successfully.", - "DeletingDuplicateAsset": "Deleting duplicate asset: %s", - "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", - "AssetDeletedSuccessfully": "Asset %s deleted successfully", - "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", - "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", - "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", - "DeletingAsset": "Deleting asset: %s", - "NoAssetFoundToDelete": "No assets were found to delete.", - "UploadingAssets": "Uploading assets...", - "UploadingAsset": "Uploading file: '%s'.", - "UploadAssetError": "An unexpected error occurred while uploading the file: %s", - "UploadAssetSuccess": "Uploaded file successfully: '%s'", - "NoAssetFoundToUpload": "No assets were found to upload.", - "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", - "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", - "ComputingChangeLog": "Computing changes made in this release...", - "ComputingChangeLogSuccess": "Changes computed successfully.", - "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", - "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", - "FetchLatestPublishRelease": "Fetching the latest published release...", - "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", - "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", - "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", - "FetchMatchingReleaseSuccess": "Found the latest non-draft release", - "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", - "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", - "NoLatestPublishRelease": "No releases are published yet in the repository.", - "NoMatchingReleases": "No non-draft releases found.", - "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", - "FetchCommitDiff": "Fetching the list of commits since the last published release...", - "FetchCommitDiffSuccess": "Found the list of changes.", - "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", - "FetchInitialCommit": "Fetching the initial commit...", - "FetchInitialCommitSuccess": "Found the initial commit: %s", - "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", - "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", - "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", - "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", - "TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", - "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", - "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", - "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", - "IssuesFetchError": "Error fetching issues. Cannot generate change log.", - "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", - "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", - "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", - "ChangeLogTitle": "Changes", - "DefaultCategory": "Others", - "SeeMoreText": "See More" + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + } } \ No newline at end of file diff --git a/Tasks/GitHubReleaseV1/task.loc.json b/Tasks/GitHubReleaseV1/task.loc.json index dbb1a1f0ee91..c24db2f62b5f 100644 --- a/Tasks/GitHubReleaseV1/task.loc.json +++ b/Tasks/GitHubReleaseV1/task.loc.json @@ -14,8 +14,8 @@ "preview": false, "version": { "Major": 1, - "Minor": 218, - "Patch": 0 + "Minor": 224, + "Patch": 1 }, "demands": [], "minimumAgentVersion": "2.0.0", diff --git a/_generated/GitHubReleaseV0.versionmap.txt b/_generated/GitHubReleaseV0.versionmap.txt new file mode 100644 index 000000000000..2ea4f6d65c35 --- /dev/null +++ b/_generated/GitHubReleaseV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.224.1 +Node16-219|0.224.0 diff --git a/_generated/GitHubReleaseV0/README.md b/_generated/GitHubReleaseV0/README.md new file mode 100644 index 000000000000..05244f53a4fb --- /dev/null +++ b/_generated/GitHubReleaseV0/README.md @@ -0,0 +1,63 @@ +# GitHub Release + +## Overview + +The [GitHub Release task](https://aka.ms/AA3m1bq) can be used to create/edit/delete a GitHub release directly from your CI/CD pipeline. This task works on cross platform Azure Pipeline agents running Windows, Linux or Mac and uses GitHub APIs to manage GitHub releases. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task, like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites are required for the task to work properly: + +#### GitHub Service Connection + +In order to perform operations on the GitHub repository, the task needs a GitHub service connection with adequate permission. If it does not exist already, you can [create a GitHub service connection](https://aka.ms/AA3am5s) in your azure pipelines project. Once the service connection is created, all you need is the name of the service connection in this task. + +## Parameters of the task + +The GitHub Release task can run in 3 action types, viz. create, edit or delete. Based on the action chosen by the user certain parameters will be ignored. The following is the list of parameters required for this task. + +* **Service Connection:** This is the name of GitHub service connection which will be used to connect to target GitHub account. You can use an existing GitHub service connection or create a new one. Note that the service connection should use OAuth or PAT for authentication. + +* **GitHub Repository:** This is the name of the GitHub repository where GitHub releases will be managed. E.g. `microsoft/vscode`. + +* **Action:** Action is the type of release operation you want perform using this task. This task can perform 3 different actions - create, edit or delete. + + * Create: This action creates a GitHub release. Throws error if a published release already exists with the given tag. + + * Edit: This action modifies a existing GitHub release. Tag is used to identify the release to be edited. Throws error if more than 1 release(draft or published) is found with the given tag. + + * Delete: This action deletes a GitHub release. Tag is used to identify the release to be deleted. Throws error if more than 1 release(draft or published) is found with the given tag. + +* **Target:** This is the commit SHA for which the GitHub release will be created. By default, the value is $(Build.SourceVersion) which corresponds to the commit for which the build was run. If you specify a branch name here(E.g. *master* ), the latest commit from this branch will be used as target. This field is ignored when using edit and delete actions. + +* **Tag Source:** This parameter allows you to choose the source of tag to be used for a release action. This is available only for *create* action. It can be done in 2 ways: + + * Git tag: Choose this option if the tag to be used in release creation has been pushed to the repository. The release will be created using the git tag that is associated with this commit. If no tag is found for the given commit, the release will not be created. If multiple tags are found, the task will throw an error. + + * User specified tag: Choose this option if you want the task to create a new tag. The release will subsequently be created using the new tag provided in the 'tag' parameter. If the tag already exists in the repository, then the release will be created for the existing tag. + +* **Tag:** This is the tag to be used for the chosen release action. You can specify the tag directly or by using variables, Eg. v\$(MajorVersion).\$(MinorVersion).\$(PatchVersion). For *edit*, *delete* actions, the release having this tag will be acted upon. For *create* action, a new release will be created with this tag. Note that this is a mandatory field for *edit* and *delete* actions. + +* **Release Title:** This is the title that will be used for release creation. If left empty, the tag name will be used as the release title. + +* **Release Notes Source:** This field lets you specify the source for the description of your GitHub release. There are 2 ways for doing this: + * Release notes file: On selecting this, you will have to specify the path to the file. The contents of this file will be copied as release notes at the time of release creation. + * Inline release notes: On selecting this, you can manually type your release notes into a text area. The contents of this text area will be copied as release notes at the time of release creation. + +* **Assets** These are the files that will be uploaded as assets for the release. You can use wild card characters to specify a set of files. All the matching files shall be uploaded. You can also specify multiple patterns - one path per line. By default, it uploads the contents of $(Build.ArtifactStagingDirectory). If the specified folder is missing, it throws a warning. + +* **Asset Upload Mode** This option is used in case of editing a release. There are 2 ways in which assets can be uploaded. + + * Delete existing assets: When using this option, the task will first delete any existing assets in the release and upload all the assets once again. + + * Replace existing assets: When using this option, the task will replace any assets that have the same name* + +* **Draft Release** Check this option if the release has to be saved as a draft release. If kept unchecked, the created release will be published. This option is ignored in case of *delete* action. + +* **Pre Release** Check this option if the release has to be marked as a pre-release. This option is ignored in case of *delete* action. + +* **Add Changelog:** Using this option you can generate and append list of changes to release notes. The list of changes(commits and issues) between this and last published release will be generated and appended to release notes. Maximum number of changes shown is 250. diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c89b1691ca88 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub-Release", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/AA3aeiw)", + "loc.description": "Hiermit wird ein GitHub-Release erstellt, bearbeitet oder gelöscht.", + "loc.instanceNameFormat": "GitHub-Release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Konfiguration des Änderungsprotokolls", + "loc.input.label.gitHubConnection": "GitHub-Verbindung (OAuth oder PAT)", + "loc.input.help.gitHubConnection": "Geben Sie den Namen der GitHub-Dienstverbindung an, die zum Herstellen einer Verbindung mit dem GitHub-Repository verwendet werden soll. Die Verbindung muss auf einem OAuth-Token eines GitHub-Benutzers oder einem persönlichen GitHub-Zugriffstoken basieren. Weitere Informationen zu Dienstverbindungen finden Sie [hier](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Geben Sie den Namen des GitHub-Repositorys an, in dem das GitHub-Release erstellt, bearbeitet oder gelöscht wird.", + "loc.input.label.action": "Aktion", + "loc.input.help.action": "Geben Sie den Typ des auszuführenden Releasevorgangs an. Mit dieser Aufgabe kann ein GitHub-Release erstellt, bearbeitet oder gelöscht werden.", + "loc.input.label.target": "Ziel", + "loc.input.help.target": "Geben Sie den Commit-SHA an, für den das GitHub-Release erstellt wird, z. B. \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Sie können hier auch eine Variable verwenden, beispielsweise \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Tagquelle", + "loc.input.help.tagSource": "Geben Sie das Tag an, das für die Releaseerstellung verwendet werden soll. Die Option \"Git-Tag\" verwendet automatisch das Tag, das dem Git-Commit zugeordnet ist. Verwenden Sie die Option \"Benutzerdefiniertes Tag\", um manuell ein Tag anzugeben.", + "loc.input.label.tagPattern": "Tagmuster", + "loc.input.help.tagPattern": " Geben Sie das Git-Tagmuster mithilfe eines regulären Ausdrucks (z. B. \"release-v1.*\") an. Ein GitHub-Release wird nur für Commits mit übereinstimmendem Git-Tag erstellt. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Geben Sie das Tag an, für das ein Release erstellt, bearbeitet oder gelöscht werden soll. Sie können hier auch eine Variable verwenden, z. B. \"$(myTagName)\".", + "loc.input.label.title": "Releasetitel", + "loc.input.help.title": "Geben Sie den Titel für das GitHub-Release an. Wenn Sie keinen Titel angeben, wird das Tag als Releasetitel verwendet.", + "loc.input.label.releaseNotesSource": "Quelle für Versionshinweise", + "loc.input.help.releaseNotesSource": "Geben Sie die Beschreibung für das GitHub-Release an. Verwenden Sie die Option \"Datei mit Anmerkungen zu dieser Version\", um den Inhalt einer Datei als Versionshinweise zu verwenden. Verwenden Sie die Option \"Inline-Versionshinweise\", um Anmerkungen zu dieser Version manuell einzugeben.", + "loc.input.label.releaseNotesFile": "Dateipfad zu Versionsanmerkungen", + "loc.input.help.releaseNotesFile": "Wählen Sie die Datei aus, die die Versionshinweise enthält.", + "loc.input.label.releaseNotes": "Versionshinweise", + "loc.input.help.releaseNotes": "Geben Sie hier die Versionshinweise ein. Markdown wird unterstützt.", + "loc.input.label.assets": "Ressourcen", + "loc.input.help.assets": "Geben Sie die Dateien an, die als Ressourcen für das Release hochgeladen werden sollen. Sie können Platzhalterzeichen verwenden, um mehrere Dateien anzugeben. Beispielsweise können Sie für Buildpipelines \"$(Build.ArtifactStagingDirectory)/*.zip\" oder für Releasepipelines \"$(System.DefaultWorkingDirectory)/*.zip\" verwenden. Es ist auch möglich, mehrere Muster anzugeben – ein Muster pro Zeile. Standardmäßig werden alle Dateien im Verzeichnis \"$(Build.ArtifactStagingDirectory)\" hochgeladen. Weitere Informationen zur Liste der verfügbaren vordefinierten Variablen finden Sie unter [Buildvariablen](https://aka.ms/AA4449z) und [Releasevariablen](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Uploadmodus für Ressourcen", + "loc.input.help.assetUploadMode": "Verwenden Sie die Option \"Vorhandene Ressourcen löschen\", um zunächst alle vorhandenen Ressourcen im Release zu löschen und dann alle Ressourcen hochzuladen. Verwenden Sie die Option \"Vorhandene Ressourcen ersetzen\", um alle Ressourcen mit übereinstimmenden Namen zu ersetzen.", + "loc.input.label.isDraft": "Entwurfsrelease", + "loc.input.help.isDraft": "Geben Sie an, ob das Release als (nicht veröffentlichter) Entwurf gespeichert werden soll. Bei Festlegung auf FALSE wird das Release veröffentlicht.", + "loc.input.label.isPreRelease": "Vorabversion", + "loc.input.help.isPreRelease": "Geben Sie an, ob das Release als Vorabversion gekennzeichnet werden soll.", + "loc.input.label.addChangeLog": "Änderungsprotokoll hinzufügen", + "loc.input.help.addChangeLog": "Bei Festlegung auf TRUE wird eine Liste der Änderungen (Commits und Issues) zwischen dieser und dem zuletzt veröffentlichten Release generiert und an die Versionshinweise angefügt.", + "loc.input.label.changeLogCompareToRelease": "Vergleichen mit", + "loc.input.help.changeLogCompareToRelease": "Geben Sie an, mit welchem Release der Vergleich erfolgen soll, um das Änderungsprotokoll zu generieren: \nLetztes vollständiges Release: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen, das nicht als Vorabversion gekennzeichnet ist.\nLetztes Nicht-Entwurfsrelease: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen.\nLetztes Nicht-Entwurfsrelease nach Tag: Bei dieser Option wird das aktuelle Release mit dem letzten Nicht-Entwurfsrelease verglichen, das mit dem angegebenen Tag übereinstimmt. Sie können anstelle eines Tags auch einen regulären Ausdruck angeben.", + "loc.input.label.changeLogCompareToReleaseTag": "Releasetag", + "loc.input.help.changeLogCompareToReleaseTag": "Geben Sie den regulären Ausdruck für das Releasetag an. Das Release, das mit diesem Tag übereinstimmt, wird als Basis für die Berechnung des Änderungsprotokolls verwendet.", + "loc.input.label.changeLogType": "Typ des Änderungsprotokolls", + "loc.input.help.changeLogType": "Das Änderungsprotokoll kann auf Commits oder Issues basieren. Ein auf Commits basierendes Änderungsprotokoll listet alle in einem Release enthaltenen Commits auf, während in einem auf Issues basierenden Änderungsprotokoll alle Issues/Pull Requests im Release aufgelistet werden.", + "loc.input.label.changeLogLabels": "Kategorien", + "loc.input.help.changeLogLabels": "Hiermit können Sie Änderungen anhand der Bezeichnung kategorisieren, die dem Issue/Pull Request zugeordnet ist. Für eine Bezeichnung können Sie den Anzeigenamen für die Kategorie und den Status des Issues angeben. Beispiel: \"\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Wenn eine Änderung mehrere Bezeichnungen aufweist, hat die erste angegebene Bezeichnung Vorrang. Lassen Sie dieses Feld leer, um eine flache Liste mit Issues/Pull Requests anzuzeigen.", + "loc.messages.GithubApiFailError": "Ein unerwarteter Fehler ist aufgetreten.", + "loc.messages.GetTagsError": "Unerwarteter Fehler beim Abrufen von Tags.", + "loc.messages.GetReleasesError": "Unerwarteter Fehler beim Abrufen von Releases.", + "loc.messages.CreateReleaseError": "Unerwarteter Fehler beim Erstellen der Release.", + "loc.messages.EditReleaseError": "Unerwarteter Fehler beim Bearbeiten des Release.", + "loc.messages.DeleteReleaseError": "Unerwarteter Fehler beim Löschen des Release.", + "loc.messages.CreatingRelease": "Release für Tag wird erstellt: %s", + "loc.messages.CreateReleaseSuccess": "Das Release wurde erfolgreich in \"%s\" erstellt.", + "loc.messages.ReleaseAlreadyExists": "Fehler beim Erstellen des Release. Für das folgende Tag ist bereits ein Release vorhanden: %s", + "loc.messages.EditingRelease": "Das Release mit folgendem Tag wird bearbeitet: %s", + "loc.messages.EditReleaseSuccess": "Release erfolgreich bearbeitet", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Es wurde kein vorhandenes Release zum Bearbeiten gefunden. Es wird ein Release mit dem folgenden Tag erstellt: %s", + "loc.messages.DeletingRelease": "Das Release für folgendes Tag wird gelöscht: %s", + "loc.messages.DeleteReleaseSuccess": "Die Release wurde erfolgreich gelöscht.", + "loc.messages.NoReleaseFoundToDelete": "Für das Tag \"%s\" wurde kein Release gefunden. Fehler beim Löschen des Release.", + "loc.messages.FetchReleaseForTag": "Das Release für das folgende Tag wird abgerufen: %s", + "loc.messages.FetchReleaseForTagSuccess": "Für folgendes Tag wurde ein Release gefunden: %s", + "loc.messages.FetchTagForTarget": "Es wird nach Tags gesucht, die dem Zielcommit zugeordnet sind: %s", + "loc.messages.FetchTagForTargetSuccess": "Für folgenden Zielcommit wurde ein Tag gefunden: %s", + "loc.messages.MissingAssetError": "Datei nicht gefunden: %s", + "loc.messages.MultipleReleasesFoundError": "Es wurde nur 1 Release erwartet, aber für das Tag \"%s\" wurde mehr als 1 Release gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.MultipleTagFound": "Es wurde nur 1 Tag erwartet, aber für den angegebenen Commit \"%s\" wurde mehr als 1 Tag gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.NoTagFound": "Das Release wird nicht erstellt, weil die Tags für den Zielcommit nicht mit dem angegebenen Tagmuster übereinstimmen.", + "loc.messages.DeleteAllExistingAssets": "Alle vorhandenen Ressourcen werden gelöscht...", + "loc.messages.DuplicateAssetFound": "Doppelte Ressource gefunden: %s", + "loc.messages.AssetsDeletedSuccessfully": "Die Ressourcen wurden erfolgreich gelöscht.", + "loc.messages.DeletingDuplicateAsset": "Doppelte Ressource wird gelöscht: %s", + "loc.messages.SkipDuplicateAssetFound": "Doppelte Ressource gefunden: %s. Wird übersprungen...", + "loc.messages.AssetDeletedSuccessfully": "Die Ressource \"%s\" wurde erfolgreich gelöscht.", + "loc.messages.AllAssetsUploadedSuccessfully": "Alle Ressourcen wurden erfolgreich hochgeladen.", + "loc.messages.ErrorDeletingDuplicateAsset": "Unerwarteter Fehler beim Löschen der doppelten Ressource: %s", + "loc.messages.ErrorDeletingAsset": "Unerwarteter Fehler beim Löschen der Ressource: %s", + "loc.messages.DeletingAsset": "Ressource wird gelöscht: %s", + "loc.messages.NoAssetFoundToDelete": "Es wurden keine Ressourcen zum Löschen gefunden.", + "loc.messages.UploadingAssets": "Ressourcen werden hochgeladen...", + "loc.messages.UploadingAsset": "Datei wird hochgeladen: \"%s\"", + "loc.messages.UploadAssetError": "Unerwarteter Fehler beim Hochladen der Datei: %s", + "loc.messages.UploadAssetSuccess": "Datei erfolgreich hochgeladen: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Es wurden keine Ressourcen zum Hochladen gefunden.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Die Datei mit Versionshinweisen \"%s\" ist ein Verzeichnis und keine Datei.", + "loc.messages.AssetIsDirectoryError": "Die Ressource ist ein Verzeichnis und keine Datei. Der Upload des Verzeichnisses wird übersprungen: %s", + "loc.messages.ComputingChangeLog": "In diesem Release vorgenommene Änderungen werden berechnet...", + "loc.messages.ComputingChangeLogSuccess": "Die Änderungen wurden erfolgreich berechnet.", + "loc.messages.CommitDiffBehind": "Die Änderungen können nicht berechnet werden, weil der angegebene Zielcommit älter ist als der Commit für das neueste veröffentlichte Release.", + "loc.messages.CommitDiffEqual": "Es wurden keine Änderungen gefunden. Der angegebene Zielcommit ist mit dem Commit für das neueste veröffentlichte Release identisch.", + "loc.messages.FetchLatestPublishRelease": "Das neueste veröffentlichte Release wird abgerufen...", + "loc.messages.FetchLatestNonDraftRelease": "Das neueste Nicht-Entwurfsrelease wird abgerufen...", + "loc.messages.FetchLastReleaseByTag": "Das neueste Release mit übereinstimmendem Tagmuster wird abgerufen: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Das neueste veröffentlichte Release wurde gefunden: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Das neueste Nicht-Entwurfsrelease wurde gefunden.", + "loc.messages.FetchTagMatchingReleaseSuccess": "Das neueste Release mit übereinstimmendem Tagmuster wurde gefunden: %s", + "loc.messages.GetLatestReleaseError": "Unerwarteter Fehler beim Abrufen des neuesten veröffentlichten Release.", + "loc.messages.NoLatestPublishRelease": "Im Repository wurden noch keine Releases veröffentlicht.", + "loc.messages.NoMatchingReleases": "Keine Nicht-Entwurfsreleases gefunden.", + "loc.messages.NoTagMatchingReleases": "Es wurden keine Releases gefunden, die mit dem Tagmuster übereinstimmen: %s.", + "loc.messages.FetchCommitDiff": "Die Liste der Commits seit dem zuletzt veröffentlichten Release wird abgerufen...", + "loc.messages.FetchCommitDiffSuccess": "Die Liste der Änderungen wurde gefunden.", + "loc.messages.FetchCommitDiffError": "Unerwarteter Fehler beim Abrufen der Liste mit Änderungen.", + "loc.messages.FetchInitialCommit": "Der erste Commit wird abgerufen...", + "loc.messages.FetchInitialCommitSuccess": "Der erste Commit wurde gefunden: %s", + "loc.messages.InvalidGitHubEndpoint": "Ungültiger GitHub-Dienstendpunkt: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Ungültiges GitHub-Dienstverbindungsschema: %s. Es sind nur GitHub-Verbindungen zulässig, die auf einem OAuth-Token oder einem persönlichen Zugriffstoken basieren.", + "loc.messages.FetchInitialCommitError": "Unerwarteter Fehler beim Abrufen des ersten Commits.", + "loc.messages.InvalidActionSet": "Ungültige Aktion: %s. Es sind nur die Aktionen \"create\", \"edit\" oder \"delete\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Ungültige Tagquelle: %s. Es sind nur die Optionen \"auto\" oder \"manual\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Ungültige Quelle für Versionshinweise: %s. Es sind nur die Optionen \"file\" oder \"input\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Ungültiges compareWith-Attribut: %s. Es sind nur die Optionen \"lastFullRelease\", \"lastNonDraftRelease\" oder \"lastNonDraftReleaseByTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Ungültiger Modus für Ressourcenupload: %s. Es sind nur die Aktionen \"delete\" oder \"replace\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Für die Aktion \"%s\" ist ein Tag erforderlich. Geben Sie im Schritt ein Tag an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Die Tagquelle ist auf \"manual\" festgelegt. Geben Sie ein Tag für die Aktion zum Erstellen an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Es wurden keine Dateien gefunden, die mit \"%s\" übereinstimmen. Keine Elemente zum Upload vorhanden.", + "loc.messages.PatternIsADirectory": "\"%s\" kann nicht hochgeladen werden, weil es sich um ein Verzeichnis handelt. Geben Sie eine Datei an.", + "loc.messages.SearchingFileMatchingPattern": "Es wird nach Dateien gesucht, die mit \"%s\" übereinstimmen.", + "loc.messages.IssuesFetchError": "Fehler beim Abrufen von Issues. Das Änderungsprotokoll kann nicht generiert werden.", + "loc.messages.NoIssuesLinkedError": "Im angegebenen Commitvergleich sind keine Issues mit Commits verknüpft.", + "loc.messages.LabelsSyntaxError": "Fehler beim Analysieren der Bezeichnungen. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Ungültiges ChangeLogType-Attribut: %s. Es sind nur die Optionen \"commitBased\" oder \"issueBased\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Änderungen", + "loc.messages.DefaultCategory": "Andere", + "loc.messages.SeeMoreText": "Mehr anzeigen" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..5e6bf87d2f8c --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub Release", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "loc.description": "Create, edit, or delete a GitHub release", + "loc.instanceNameFormat": "GitHub release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog configuration", + "loc.input.label.gitHubConnection": "GitHub connection (OAuth or PAT)", + "loc.input.help.gitHubConnection": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "loc.input.label.target": "Target", + "loc.input.help.target": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Tag source", + "loc.input.help.tagSource": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "loc.input.label.tagPattern": "Tag Pattern", + "loc.input.help.tagPattern": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`.", + "loc.input.label.title": "Release title", + "loc.input.help.title": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title.", + "loc.input.label.releaseNotesSource": "Release notes source", + "loc.input.help.releaseNotesSource": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "loc.input.label.releaseNotesFile": "Release notes file path", + "loc.input.help.releaseNotesFile": "Select the file which contains the release notes.", + "loc.input.label.releaseNotes": "Release notes", + "loc.input.help.releaseNotes": "Enter the release notes here. Markdown is supported.", + "loc.input.label.assets": "Assets", + "loc.input.help.assets": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Asset upload mode", + "loc.input.help.assetUploadMode": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "loc.input.label.isDraft": "Draft release", + "loc.input.help.isDraft": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "loc.input.label.isPreRelease": "Pre-release", + "loc.input.help.isPreRelease": "Indicate whether the release should be marked as a pre-release.", + "loc.input.label.addChangeLog": "Add changelog", + "loc.input.help.addChangeLog": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes.", + "loc.input.label.changeLogCompareToRelease": "Compare to", + "loc.input.help.changeLogCompareToRelease": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "loc.input.label.changeLogCompareToReleaseTag": "Release Tag", + "loc.input.help.changeLogCompareToReleaseTag": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation.", + "loc.input.label.changeLogType": "Changelog type", + "loc.input.help.changeLogType": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "loc.input.label.changeLogLabels": "Categories", + "loc.input.help.changeLogLabels": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr.", + "loc.messages.GithubApiFailError": "An unexpected error occurred.", + "loc.messages.GetTagsError": "An unexpected error occurred while fetching tags.", + "loc.messages.GetReleasesError": "An unexpected error occurred while fetching releases.", + "loc.messages.CreateReleaseError": "An unexpected error occurred while creating the release.", + "loc.messages.EditReleaseError": "An unexpected error occurred while editing the release.", + "loc.messages.DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "loc.messages.CreatingRelease": "Creating a release for tag: %s", + "loc.messages.CreateReleaseSuccess": "Release created successfully at %s", + "loc.messages.ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "loc.messages.EditingRelease": "Editing the release with tag: %s", + "loc.messages.EditReleaseSuccess": "Release edited successfully", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "loc.messages.DeletingRelease": "Deleting the release for tag: %s", + "loc.messages.DeleteReleaseSuccess": "Release deleted successfully.", + "loc.messages.NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "loc.messages.FetchReleaseForTag": "Fetching the release for tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "Found a release for tag: %s", + "loc.messages.FetchTagForTarget": "Searching for tags associated with target commit: %s", + "loc.messages.FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "loc.messages.MissingAssetError": "File not found: %s", + "loc.messages.MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "loc.messages.MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "loc.messages.NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", + "loc.messages.DeleteAllExistingAssets": "Deleting all existing assets...", + "loc.messages.DuplicateAssetFound": "Duplicate asset found: %s", + "loc.messages.AssetsDeletedSuccessfully": "Assets deleted successfully.", + "loc.messages.DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "loc.messages.SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "loc.messages.AssetDeletedSuccessfully": "Asset %s deleted successfully", + "loc.messages.AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "loc.messages.ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "loc.messages.ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "loc.messages.DeletingAsset": "Deleting asset: %s", + "loc.messages.NoAssetFoundToDelete": "No assets were found to delete.", + "loc.messages.UploadingAssets": "Uploading assets...", + "loc.messages.UploadingAsset": "Uploading file: '%s'.", + "loc.messages.UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "loc.messages.UploadAssetSuccess": "Uploaded file successfully: '%s'", + "loc.messages.NoAssetFoundToUpload": "No assets were found to upload.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "loc.messages.AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "loc.messages.ComputingChangeLog": "Computing changes made in this release...", + "loc.messages.ComputingChangeLogSuccess": "Changes computed successfully.", + "loc.messages.CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "loc.messages.CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "loc.messages.FetchLatestPublishRelease": "Fetching the latest published release...", + "loc.messages.FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "loc.messages.FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "loc.messages.FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "loc.messages.GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "loc.messages.NoLatestPublishRelease": "No releases are published yet in the repository.", + "loc.messages.NoMatchingReleases": "No non-draft releases found.", + "loc.messages.NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "loc.messages.FetchCommitDiff": "Fetching the list of commits since the last published release...", + "loc.messages.FetchCommitDiffSuccess": "Found the list of changes.", + "loc.messages.FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "loc.messages.FetchInitialCommit": "Fetching the initial commit...", + "loc.messages.FetchInitialCommitSuccess": "Found the initial commit: %s", + "loc.messages.InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "loc.messages.FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "loc.messages.InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "loc.messages.PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "loc.messages.SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "loc.messages.IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "loc.messages.NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "loc.messages.LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changes", + "loc.messages.DefaultCategory": "Others", + "loc.messages.SeeMoreText": "See More" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..129df4fe5a46 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versión de GitHub", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/AA3aeiw)", + "loc.description": "Crea, edita o elimina una versión de GitHub.", + "loc.instanceNameFormat": "Versión de GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuración del registro de cambios", + "loc.input.label.gitHubConnection": "Conexión de GitHub (OAuth o PAT)", + "loc.input.help.gitHubConnection": "Especifique el nombre de la conexión de servicio de GitHub que se va a usar para conectarse al repositorio de GitHub. La conexión se debe basar en el valor OAuth del usuario de GitHub o en un token de acceso personal de GitHub. Obtenga más información sobre las conexiones de servicio [aquí](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repositorio", + "loc.input.help.repositoryName": "Especifique el nombre del repositorio de GitHub en el que se creará, editará o eliminará la versión de GitHub.", + "loc.input.label.action": "Acción", + "loc.input.help.action": "Especifique el tipo de operación de versión que se va a realizar. Esta tarea permite crear, editar o eliminar una versión de GitHub.", + "loc.input.label.target": "Destino", + "loc.input.help.target": "Especifique el SHA de \"commit\" para el que se creará la versión de GitHub. Por ejemplo, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". También puede usar una variable aquí; por ejemplo, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Origen de etiqueta", + "loc.input.help.tagSource": "Especifique la etiqueta que se va a usar para la creación de la versión. La opción \"Git tag\" obtiene automáticamente la etiqueta asociada al \"commit\" de GIT. Utilice la opción \"User specified tag\" para proporcionar una etiqueta de forma manual.", + "loc.input.label.tagPattern": "Patrón de etiqueta", + "loc.input.help.tagPattern": " Especifique el patrón de etiqueta GIT mediante una notación regex (por ejemplo, \"release-v1.*\"). La versión de GitHub solo se creará para los \"commits\" que tengan una etiqueta GIT coincidente. ", + "loc.input.label.tag": "Etiqueta", + "loc.input.help.tag": "Especifique la etiqueta para la que se va a crear, editar o eliminar una versión. También puede usar una variable aquí. Por ejemplo, \"$(myTagName)\".", + "loc.input.label.title": "Título de la versión", + "loc.input.help.title": "Especifique el título de la versión de GitHub. Si se deja en blanco, se usará la etiqueta como título de la versión.", + "loc.input.label.releaseNotesSource": "Origen de las notas de la versión", + "loc.input.help.releaseNotesSource": "Especifique la descripción de la versión de GitHub. Use la opción \"Archivo de notas de la versión\" para utilizar el contenido de un archivo como notas de la versión. Use la opción \"Inline release notes\" para escribir las notas de la versión de forma manual.", + "loc.input.label.releaseNotesFile": "Ruta de acceso al archivo de notas de la versión", + "loc.input.help.releaseNotesFile": "Seleccione el archivo que contiene las notas de la versión.", + "loc.input.label.releaseNotes": "Notas de la versión", + "loc.input.help.releaseNotes": "Especifique aquí las notas de la versión. Se admite Markdown.", + "loc.input.label.assets": "Recursos", + "loc.input.help.assets": "Especifique los archivos que se van a cargar como recursos de la versión. Puede usar caracteres comodín para especificar varios archivos. Por ejemplo, \"$(Build.ArtifactStagingDirectory)/*.zip\" para las canalizaciones de compilación o \"`$(System.DefaultWorkingDirectory)/*.zip\" en el caso de las canalizaciones de versión. También puede especificar varios patrones, uno por cada línea. De forma predeterminada, se cargarán todos los archivos del directorio $(Build.ArtifactStagingDirectory). Para obtener más información sobre la lista de variables predefinidas disponibles, consulte las [variables de compilación](https://aka.ms/AA4449z) y las [variables de versión] (https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modo de carga de recursos", + "loc.input.help.assetUploadMode": "Use la opción \"Delete existing assets\" para eliminar primero los recursos existentes en la versión y, después, cargar todos los recursos. Use la opción \"Replace existing assets\" para reemplazar los recursos que tengan el mismo nombre.", + "loc.input.label.isDraft": "Versión de borrador", + "loc.input.help.isDraft": "Indique si la versión debe guardarse como borrador (sin publicar). Si el valor es \"false\", la versión se publicará.", + "loc.input.label.isPreRelease": "Versión preliminar", + "loc.input.help.isPreRelease": "Indique si la versión se debe marcar como versión preliminar.", + "loc.input.label.addChangeLog": "Agregar registro de cambios", + "loc.input.help.addChangeLog": "Si se establece en \"true\", se generará una lista de los cambios (\"commits\" e \"issues\") entre esta y la última versión publicada y se anexará a las notas de la versión.", + "loc.input.label.changeLogCompareToRelease": "Comparar con", + "loc.input.help.changeLogCompareToRelease": "Indique la versión con la que debemos comparar para generar el registro de cambios: \nÚltima versión completa: compara la versión actual con la versión más reciente que no sea de borrador y que no esté marcada como versión preliminar.\nÚltima versión de no borrador: compara la versión actual con la versión más reciente que no sea de borrador.\nÚltima versión de no borrador por etiqueta: compara la versión actual con la última versión que no sea de borrador y que coincida con la etiqueta especificada. También puede especificar una notación regex en lugar de una etiqueta exacta.", + "loc.input.label.changeLogCompareToReleaseTag": "Etiqueta de versión", + "loc.input.help.changeLogCompareToReleaseTag": "Especifique la notación regex para la etiqueta de versión. La versión que coincida con esta etiqueta se usará como base para el cálculo del registro de cambios.", + "loc.input.label.changeLogType": "Tipo de registro de cambios", + "loc.input.help.changeLogType": "El registro de cambios puede basarse en \"commits\" o en incidencias. Un registro de cambios basado en \"commits\" enumera todos los \"commits\" incluidos en una versión, mientras que un registro de cambios basado en incidencias enumera todas las incidencias o solicitudes de incorporación de cambios que se incluyen en la versión. ", + "loc.input.label.changeLogLabels": "Categorías", + "loc.input.help.changeLogLabels": "Si usa esta opción, puede clasificar los cambios en función de la etiqueta asociada a la incidencia o a la solicitud de incorporación de cambios. Para una etiqueta, puede mencionar el nombre para mostrar de la categoría y el estado de la incidencia. Por ejemplo, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Si un cambio tiene varias etiquetas, la primera etiqueta que se especifique tiene prioridad. Deje este campo en blanco para ver una lista plana de las incidencias o solicitudes de incorporación de cambios.", + "loc.messages.GithubApiFailError": "Error inesperado.", + "loc.messages.GetTagsError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las etiquetas.", + "loc.messages.GetReleasesError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las versiones.", + "loc.messages.CreateReleaseError": "Error inesperado al crear la versión.", + "loc.messages.EditReleaseError": "Error inesperado al editar la versión.", + "loc.messages.DeleteReleaseError": "Error inesperado al eliminar la versión.", + "loc.messages.CreatingRelease": "Creando una versión para la etiqueta: %s", + "loc.messages.CreateReleaseSuccess": "La versión se ha creado correctamente en %s", + "loc.messages.ReleaseAlreadyExists": "No se pudo crear la versión. Ya existe una versión para la etiqueta: %s", + "loc.messages.EditingRelease": "Editando la versión con la etiqueta %s", + "loc.messages.EditReleaseSuccess": "La versión se ha editado correctamente.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No se ha encontrado ninguna versión existente para editar. Se va a crear una con la etiqueta %s", + "loc.messages.DeletingRelease": "Eliminando la versión de la etiqueta: %s", + "loc.messages.DeleteReleaseSuccess": "La versión se eliminó correctamente.", + "loc.messages.NoReleaseFoundToDelete": "No se encontró ninguna versión para la etiqueta %s. Error al eliminar la versión.", + "loc.messages.FetchReleaseForTag": "Usando \"fetch\" para recuperar cambios de la versión de la etiqueta: %s", + "loc.messages.FetchReleaseForTagSuccess": "Se ha encontrado una versión para la etiqueta: %s", + "loc.messages.FetchTagForTarget": "Buscando etiquetas asociadas al \"commit\" de destino: %s", + "loc.messages.FetchTagForTargetSuccess": "Se ha encontrado una etiqueta para el \"commit\" de destino: %s", + "loc.messages.MissingAssetError": "No se encuentra el archivo: %s", + "loc.messages.MultipleReleasesFoundError": "Se esperaba solo una versión, pero se ha encontrado más de una para la etiqueta: %s. No se puede realizar la acción.", + "loc.messages.MultipleTagFound": "Se esperaba solo una etiqueta, pero se ha encontrado más de una para el \"commit\" dado: %s. No se puede realizar la acción.", + "loc.messages.NoTagFound": "La versión no se creará porque las etiquetas del \"commit\" de destino no coinciden con el patrón de etiqueta dado.", + "loc.messages.DeleteAllExistingAssets": "Eliminando todos los recursos existentes...", + "loc.messages.DuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s", + "loc.messages.AssetsDeletedSuccessfully": "Los recursos se han eliminado correctamente.", + "loc.messages.DeletingDuplicateAsset": "Eliminando el recurso duplicado: %s", + "loc.messages.SkipDuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s. Omitiendo...", + "loc.messages.AssetDeletedSuccessfully": "El recurso %s se ha eliminado correctamente.", + "loc.messages.AllAssetsUploadedSuccessfully": "Todos los recursos se han cargado correctamente.", + "loc.messages.ErrorDeletingDuplicateAsset": "Error inesperado al eliminar el recurso duplicado: %s", + "loc.messages.ErrorDeletingAsset": "Error inesperado al eliminar el recurso: %s", + "loc.messages.DeletingAsset": "Eliminando el recurso: %s", + "loc.messages.NoAssetFoundToDelete": "No se han encontrado recursos para eliminar.", + "loc.messages.UploadingAssets": "Cargando los recursos...", + "loc.messages.UploadingAsset": "Cargando el archivo: \"%s\".", + "loc.messages.UploadAssetError": "Error inesperado al cargar el archivo: %s", + "loc.messages.UploadAssetSuccess": "El archivo se cargó correctamente: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "No se han encontrado recursos para cargar.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "El archivo de notas de la versión %s es un directorio y no un archivo.", + "loc.messages.AssetIsDirectoryError": "El recurso es un directorio y no un archivo. Omitiendo la carga del directorio: %s", + "loc.messages.ComputingChangeLog": "Calculando los cambios realizados en esta versión...", + "loc.messages.ComputingChangeLogSuccess": "Los cambios se han calculado correctamente.", + "loc.messages.CommitDiffBehind": "No se pueden calcular los cambios porque el \"commit\" de destino proporcionado es anterior al de la última versión publicada.", + "loc.messages.CommitDiffEqual": "No se han encontrado cambios. El \"commit\" de destino proporcionado es el mismo que el de la última versión publicada.", + "loc.messages.FetchLatestPublishRelease": "Usando \"fetch\" para recuperar cambios de la última versión publicada...", + "loc.messages.FetchLatestNonDraftRelease": "Capturando la última versión que no sea de borrador...", + "loc.messages.FetchLastReleaseByTag": "Captura de la última versión que coincida con el patrón de etiqueta: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Se ha encontrado la última versión publicada: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Se ha encontrado la última versión que no es un borrador", + "loc.messages.FetchTagMatchingReleaseSuccess": "Se ha encontrado la última versión que coincide con el patrón de etiqueta: %s", + "loc.messages.GetLatestReleaseError": "Error inesperado al aplicar \"fetch\" para recuperar cambios de la última versión publicada.", + "loc.messages.NoLatestPublishRelease": "No hay ninguna versión publicada aún en el repositorio.", + "loc.messages.NoMatchingReleases": "No se encontró ninguna versión que no sea de borrador.", + "loc.messages.NoTagMatchingReleases": "No se encontraron versiones que coincidan con el patrón de etiqueta: %s ", + "loc.messages.FetchCommitDiff": "Usando \"fetch\" para recuperar cambios de la lista de elementos \"commit\" desde la última versión publicada...", + "loc.messages.FetchCommitDiffSuccess": "Se ha encontrado la lista de cambios.", + "loc.messages.FetchCommitDiffError": "Error inesperado al aplicar \"fetch\" a la lista de cambios.", + "loc.messages.FetchInitialCommit": "Usando \"fetch\" para recuperar cambios del \"commit\" inicial...", + "loc.messages.FetchInitialCommitSuccess": "Se ha encontrado el \"commit\" inicial: %s", + "loc.messages.InvalidGitHubEndpoint": "Punto de conexión de servicio de GitHub no válido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Esquema de conexión del servicio de GitHub no válido: %s. Solo se permiten conexiones de token de acceso personal de GitHub y OAuth.", + "loc.messages.FetchInitialCommitError": "Error inesperado al aplicar \"fetch\" para la recuperación de cambios del \"commit\" inicial.", + "loc.messages.InvalidActionSet": "Acción no válida: %s. Solo se permiten las acciones \"create\", \"edit\" o \"delete\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origen de etiqueta no válido: %s. Solo se permiten las opciones \"auto\" o \"manual\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origen de notas de la versión no válido: %s. Solo se permiten las opciones \"file\" o \"input\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Atributo compareWith no válido: %s. Solo se permiten las opciones \"lastFullRelease\", \"lastNonDraftRelease\" o \"lastNonDraftReleaseByTag\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modo de carga de recursos no válido: %s. Solo se permiten las opciones \"delete\" o \"replace\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Se requiere una etiqueta para la acción \"%s\". Especifique una etiqueta en el paso. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "El origen de la etiqueta está establecido en manual; especifique una etiqueta para la acción \"create\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No se ha encontrado ningún archivo que coincida con \"%s\". No hay nada que cargar.", + "loc.messages.PatternIsADirectory": "No se puede cargar \"%s\" porque es un directorio. Especifique un archivo.", + "loc.messages.SearchingFileMatchingPattern": "Buscando archivos que coincidan con \"%s\".", + "loc.messages.IssuesFetchError": "Error al capturar las incidencias. No se puede generar el registro de cambios.", + "loc.messages.NoIssuesLinkedError": "No hay ninguna incidencia vinculada a los \"commits\" en la diferencia de \"commits\" especificada.", + "loc.messages.LabelsSyntaxError": "Error al analizar las etiquetas. Para ver la sintaxis YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Atributo ChangeLogType no válido: %s. Solo se permiten las opciones \"commitBased\" o \"issueBased\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Cambios", + "loc.messages.DefaultCategory": "Otra", + "loc.messages.SeeMoreText": "Ver más" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..365b19681859 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Mise en production GitHub", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/AA3aeiw)", + "loc.description": "Créer, modifier ou supprimer une mise en production GitHub", + "loc.instanceNameFormat": "Mise en production GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuration du journal des modifications", + "loc.input.label.gitHubConnection": "Connexion GitHub (OAuth ou PAT)", + "loc.input.help.gitHubConnection": "Spécifiez le nom de la connexion de service GitHub à utiliser pour la connexion au dépôt GitHub. La connexion doit être basée sur le jeton OAuth d'un utilisateur GitHub ou un jeton d'accès personnel GitHub. En savoir plus sur les connexions de service [ici](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Dépôt", + "loc.input.help.repositoryName": "Spécifiez le nom du dépôt GitHub dans lequel la mise en production GitHub est créée, modifiée ou supprimée.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Spécifiez le type d'opération de mise en production à effectuer. Cette tâche permet de créer, modifier ou supprimer une mise en production GitHub.", + "loc.input.label.target": "Cible", + "loc.input.help.target": "Spécifiez le SHA de validation pour lequel la mise en production GitHub doit être créée. Exemple : '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. Vous pouvez également utiliser une variable ici. Exemple : '$(myCommitSHA)'.", + "loc.input.label.tagSource": "Source de l'étiquette", + "loc.input.help.tagSource": "Spécifiez l'étiquette à utiliser pour la création de la mise en production. L'option Étiquette Git accepte automatiquement l'étiquette associée à la validation Git. Utilisez l'option Étiquette spécifiée par l'utilisateur pour fournir une étiquette manuellement.", + "loc.input.label.tagPattern": "Modèle d'étiquette", + "loc.input.help.tagPattern": " Spécifiez le modèle d'étiquette git à l'aide d'une notation regex (par exemple 'release-v1.*'). La mise en production GitHub est créée uniquement pour les commits qui ont une étiquette git correspondante. ", + "loc.input.label.tag": "Étiquette", + "loc.input.help.tag": "Spécifiez l'étiquette pour laquelle vous souhaitez créer, modifier ou supprimer une mise en production. Vous pouvez également utiliser une variable ici. Exemple : '$(myTagName)'.", + "loc.input.label.title": "Titre de la mise en production", + "loc.input.help.title": "Spécifiez le titre de la mise en production GitHub. Si rien n'est indiqué, l'étiquette est utilisée en tant que titre de la mise en production.", + "loc.input.label.releaseNotesSource": "Source des notes de publication", + "loc.input.help.releaseNotesSource": "Spécifiez la description de la mise en production GitHub. Utilisez l'option Fichier de notes de publication pour utiliser le contenu d'un fichier en tant que notes de publication. Utilisez l'option Notes de publication inline pour entrer manuellement les notes de publication.", + "loc.input.label.releaseNotesFile": "Chemin du fichier de notes de publication", + "loc.input.help.releaseNotesFile": "Sélectionnez le fichier qui contient les notes de publication.", + "loc.input.label.releaseNotes": "Notes de publication", + "loc.input.help.releaseNotes": "Entrez les notes de publication ici. Markdown est pris en charge.", + "loc.input.label.assets": "Ressources", + "loc.input.help.assets": "Spécifiez les fichiers à charger en tant que composants de la mise en production. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers. Exemple : '$(Build.ArtifactStagingDirectory)/*.zip' pour les pipelines de build ou '$(System.DefaultWorkingDirectory)/*.zip' pour les pipelines de mise en production. Vous pouvez également spécifier plusieurs modèles (un par ligne). Par défaut, tous les fichiers du répertoire $(Build.ArtifactStagingDirectory) sont chargés. Pour en savoir plus sur la liste des variables prédéfinies disponibles, consultez les informations relatives aux [variables de build](https://aka.ms/AA4449z) et aux [variables de mise en production](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Mode de chargement des composants", + "loc.input.help.assetUploadMode": "Utilisez l'option Supprimer les composants existants pour supprimer d'abord tous les composants existants de la mise en production avant de charger tous les composants. Utilisez l'option Remplacer les composants existants pour remplacer les composants qui portent le même nom.", + "loc.input.label.isDraft": "Version brouillon", + "loc.input.help.isDraft": "Indiquez si la mise en production doit être enregistrée en tant que brouillon (non publiée). Si la valeur est 'false', la mise en production est publiée.", + "loc.input.label.isPreRelease": "Préversion", + "loc.input.help.isPreRelease": "Indiquez si la mise en production doit être marquée en tant que préversion.", + "loc.input.label.addChangeLog": "Ajouter un journal des modifications", + "loc.input.help.addChangeLog": "Si la valeur est 'true', la liste des changements (validations et problèmes) survenus entre cette mise en production et la dernière mise en production publiée est générée et ajoutée aux notes de publication.", + "loc.input.label.changeLogCompareToRelease": "Comparer à", + "loc.input.help.changeLogCompareToRelease": "Indiquez la mise en production que nous devons comparer pour générer le journal des modifications : \nDernière mise en production complète : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente qui n'est pas marquée en tant que préversion.\nDernière mise en production non-brouillon : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente.\nDernière mise en production non-brouillon par étiquette : compare la mise en production actuelle avec la dernière mise en production non-brouillon correspondant à l'étiquette spécifiée. Vous pouvez également utiliser une notation regex à la place d'une étiquette exacte.", + "loc.input.label.changeLogCompareToReleaseTag": "Étiquette de mise en production", + "loc.input.help.changeLogCompareToReleaseTag": "Spécifiez la notation regex de l'étiquette de mise en production. La mise en production correspondant à cette étiquette sert de base au calcul du journal des modifications.", + "loc.input.label.changeLogType": "Type de journal des modifications", + "loc.input.help.changeLogType": "Le journal des modifications peut être basé sur les commits ou les problèmes. Le journal des modifications basé sur les commits liste tous les commits inclus dans une mise en production alors que le journal des modifications basé sur les problèmes liste la totalité des problèmes/demandes de tirage (pull requests) inclus dans la mise en production. ", + "loc.input.label.changeLogLabels": "Catégories", + "loc.input.help.changeLogLabels": "Ainsi, vous pouvez catégoriser les changements en fonction de l'étiquette associée au problème/à la demande de tirage (pull request). Pour une étiquette, vous pouvez mentionner le nom d'affichage de la catégorie et l'état du problème. Exemple : \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Dans le cas où un changement comporte plusieurs étiquettes, la première étiquette spécifiée est prioritaire. Laissez ce champ vide pour voir une liste plate des problèmes/demandes de tirage.", + "loc.messages.GithubApiFailError": "Une erreur inattendue s'est produite.", + "loc.messages.GetTagsError": "Une erreur inattendue s'est produite durant la récupération (fetch) des étiquettes.", + "loc.messages.GetReleasesError": "Une erreur inattendue s'est produite durant la récupération (fetch) des mises en production.", + "loc.messages.CreateReleaseError": "Une erreur inattendue s'est produite durant la création de la mise en production.", + "loc.messages.EditReleaseError": "Une erreur inattendue s'est produite durant la modification de la mise en production.", + "loc.messages.DeleteReleaseError": "Une erreur inattendue s'est produite durant la suppression de la mise en production.", + "loc.messages.CreatingRelease": "Création d'une mise en production pour l'étiquette : %s", + "loc.messages.CreateReleaseSuccess": "Création réussie de la mise en production à %s", + "loc.messages.ReleaseAlreadyExists": "Échec de la création de la mise en production. Il existe déjà une mise en production pour l'étiquette : %s", + "loc.messages.EditingRelease": "Modification de la mise en production avec l'étiquette : %s", + "loc.messages.EditReleaseSuccess": "Mise en production modifiée correctement", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Il n'existe aucune mise en production à modifier. Création d'une mise en production avec l'étiquette : %s", + "loc.messages.DeletingRelease": "Suppression de la mise en production pour l'étiquette : %s", + "loc.messages.DeleteReleaseSuccess": "Suppression réussie de la mise en production.", + "loc.messages.NoReleaseFoundToDelete": "Mise en production introuvable pour l'étiquette : %s. Échec de la suppression de la mise en production.", + "loc.messages.FetchReleaseForTag": "Récupération (fetch) de la mise en production pour l'étiquette : %s", + "loc.messages.FetchReleaseForTagSuccess": "Mise en production trouvée pour l'étiquette : %s", + "loc.messages.FetchTagForTarget": "Recherche d'étiquettes associées à la validation cible : %s", + "loc.messages.FetchTagForTargetSuccess": "Étiquette trouvée pour la validation cible : %s", + "loc.messages.MissingAssetError": "Fichier introuvable : %s", + "loc.messages.MultipleReleasesFoundError": "Une seule mise en production était attendue, mais plusieurs mises en production ont été trouvées pour l'étiquette : %s. Impossible d'effectuer l'action.", + "loc.messages.MultipleTagFound": "Une seule étiquette était attendue, mais plusieurs étiquettes ont été trouvées pour la validation spécifiée : %s. Impossible d'effectuer l'action.", + "loc.messages.NoTagFound": "La mise en production ne sera pas créée, car les étiquettes du commit cible ne correspondent pas au modèle d'étiquette donné.", + "loc.messages.DeleteAllExistingAssets": "Suppression de tous les composants existants...", + "loc.messages.DuplicateAssetFound": "Composant dupliqué trouvé : %s", + "loc.messages.AssetsDeletedSuccessfully": "Composants supprimés correctement.", + "loc.messages.DeletingDuplicateAsset": "Suppression du composant dupliqué : %s", + "loc.messages.SkipDuplicateAssetFound": "Composant dupliqué trouvé : %s. Ignoré...", + "loc.messages.AssetDeletedSuccessfully": "Composant %s supprimé correctement", + "loc.messages.AllAssetsUploadedSuccessfully": "Tous les composants ont été chargés correctement.", + "loc.messages.ErrorDeletingDuplicateAsset": "Une erreur inattendue s'est produite durant la suppression du composant dupliqué : %s", + "loc.messages.ErrorDeletingAsset": "Une erreur inattendue s'est produite durant la suppression du composant : %s", + "loc.messages.DeletingAsset": "Suppression du composant : %s", + "loc.messages.NoAssetFoundToDelete": "Les composants à supprimer sont introuvables.", + "loc.messages.UploadingAssets": "Chargement des composants...", + "loc.messages.UploadingAsset": "Chargement du fichier : '%s'.", + "loc.messages.UploadAssetError": "Une erreur inattendue s'est produite durant le chargement du fichier : %s", + "loc.messages.UploadAssetSuccess": "Chargement réussi du fichier : '%s'", + "loc.messages.NoAssetFoundToUpload": "Les composants à charger sont introuvables.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Fichier de notes de publication : %s est un répertoire et non un fichier.", + "loc.messages.AssetIsDirectoryError": "La composant est un répertoire et non un fichier. Chargement du répertoire ignoré : %s", + "loc.messages.ComputingChangeLog": "Calcul des changements apportés à cette mise en production...", + "loc.messages.ComputingChangeLogSuccess": "Changements calculés correctement.", + "loc.messages.CommitDiffBehind": "Impossible de calculer les modifications, car la validation cible fournie est antérieure à la validation de la dernière mise en production publiée.", + "loc.messages.CommitDiffEqual": "Changements introuvables. La validation cible fournie est la même que celle de la dernière mise en production publiée.", + "loc.messages.FetchLatestPublishRelease": "Récupération (fetch) de la dernière mise en production publiée...", + "loc.messages.FetchLatestNonDraftRelease": "Récupération (fetch) de la dernière mise en production non-brouillon...", + "loc.messages.FetchLastReleaseByTag": "Récupération (fetch) de la dernière mise en production correspondant au modèle d'étiquette %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "La dernière mise en production publiée a été trouvée : %s", + "loc.messages.FetchMatchingReleaseSuccess": "La dernière mise en production non-brouillon a été trouvée", + "loc.messages.FetchTagMatchingReleaseSuccess": "La dernière mise en production correspondant au modèle d'étiquette %s a été trouvée", + "loc.messages.GetLatestReleaseError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la dernière mise en production publiée.", + "loc.messages.NoLatestPublishRelease": "Aucune mise en production n'a encore été publiée dans le dépôt.", + "loc.messages.NoMatchingReleases": "Mises en production non-brouillon introuvables.", + "loc.messages.NoTagMatchingReleases": "Aucune mise en production ne correspond au modèle d'étiquette : %s ", + "loc.messages.FetchCommitDiff": "Récupération (fetch) de la liste des validations depuis la dernière mise en production publiée...", + "loc.messages.FetchCommitDiffSuccess": "La liste des changements a été trouvée.", + "loc.messages.FetchCommitDiffError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la liste des changements.", + "loc.messages.FetchInitialCommit": "Récupération (fetch) de la validation initiale...", + "loc.messages.FetchInitialCommitSuccess": "Validation initiale trouvée : %s", + "loc.messages.InvalidGitHubEndpoint": "Point de terminaison de service GitHub non valide : %s.", + "loc.messages.InvalidEndpointAuthScheme": "Mode de connexion de service GitHub non valide : %s. Seules les connexions par jeton d'accès personnel OAuth et GitHub sont autorisées.", + "loc.messages.FetchInitialCommitError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la validation initiale.", + "loc.messages.InvalidActionSet": "Action non valide : %s. Seules les actions 'create', 'edit' ou 'delete' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Source de l'étiquette non valide : %s. Seules les options 'auto' ou 'manual' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Source des notes de publication non valide : %s. Seules les options 'file' ou 'input' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Attribut compareWith non valide : %s. Seules les options 'lastFullRelease, 'lastNonDraftRelease' ou 'lastNonDraftReleaseByTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Mode de chargement de composant non valide : %s. Seules les options 'delete' ou 'replace' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Pour l'action '%s', une étiquette est nécessaire. Spécifiez une étiquette au cours de l'étape. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "La source de l'étiquette est définie pour être manuelle. Spécifiez une étiquette pour l'action de création. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Il n'existe aucun fichier correspondant à '%s'. Rien à charger.", + "loc.messages.PatternIsADirectory": "Impossible de charger '%s', car il s'agit d'un répertoire. Spécifiez un fichier.", + "loc.messages.SearchingFileMatchingPattern": "Recherche de fichier(s) correspondant à '%s'.", + "loc.messages.IssuesFetchError": "Erreur durant la récupération (fetch) des problèmes. Impossible de générer le journal des modifications.", + "loc.messages.NoIssuesLinkedError": "Aucun problème n'est lié aux commits dans la comparaison des différences de commit spécifiée.", + "loc.messages.LabelsSyntaxError": "Une erreur s'est produite durant l'analyse des étiquettes. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Attribut ChangeLogType non valide : %s. Seules les options 'commitBased' ou 'issueBased' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changements", + "loc.messages.DefaultCategory": "Autres", + "loc.messages.SeeMoreText": "Voir plus" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4e2b441a4c76 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versione di GitHub", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/AA3aeiw)", + "loc.description": "Consente di creare, modificare o eliminare una versione di GitHub", + "loc.instanceNameFormat": "Versione di GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configurazione del log delle modifiche", + "loc.input.label.gitHubConnection": "Connessione a GitHub (OAuth o token di accesso personale)", + "loc.input.help.gitHubConnection": "Specificare il nome della connessione al servizio GitHub da usare per la connessione al repository GitHub. La connessione deve essere basata su un OAuth dell'utente di GitHub o su un token di accesso personale GitHub. Per altre informazioni sulle connessioni al servizio, vedere [qui](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specificare il nome del repository GitHub in cui verrà creata, modificata o eliminata la versione GitHub.", + "loc.input.label.action": "Azione", + "loc.input.help.action": "Specificare il tipo di operazione da eseguire sulla versione. Questa attività consente di creare, modificare o eliminare una versione di GitHub.", + "loc.input.label.target": "Destinazione", + "loc.input.help.target": "Specificare il commit SHA per cui verrà creata la versione GitHub, ad esempio `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. È anche possibile usare una variabile, ad esempio `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Origine dei tag", + "loc.input.help.tagSource": "Specificare il tag da usare per la creazione della versione. L'opzione 'Tag GIT' accetta automaticamente il tag associato al commit GIT. Selezionare l'opzione 'Tag specificato dall'utente' per specificare manualmente un tag.", + "loc.input.label.tagPattern": "Criterio tag", + "loc.input.help.tagPattern": " Consente di specificare il criterio tag GIT con espressioni regolari, ad esempio `release-v1.*`. La versione GitHub verrà creata solo per i commit a cui è associato il tag GIT corrispondente. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specificare il tag per cui creare, modificare o eliminare una versione. È anche possibile usare una variabile, ad esempio `$(myTagName)`.", + "loc.input.label.title": "Titolo della versione", + "loc.input.help.title": "Specificare il titolo della versione GitHub. Se viene lasciato vuoto, come titolo della versione verrà usato il tag.", + "loc.input.label.releaseNotesSource": "Origine delle note sulla versione", + "loc.input.help.releaseNotesSource": "Specificare la descrizione della versione di GitHub. Selezionare l'opzione 'File delle note sulla versione' per usare il contenuto di un file come note sulla versione. Selezionare l'opzione 'Note sulla versione online' per immettere manualmente le note sulla versione.", + "loc.input.label.releaseNotesFile": "Percorso del file delle note sulla versione", + "loc.input.help.releaseNotesFile": "Selezionare il file che contiene le note sulla versione.", + "loc.input.label.releaseNotes": "Note sulla versione", + "loc.input.help.releaseNotes": "Immettere qui le note sulla versione. Markdown è supportato.", + "loc.input.label.assets": "Asset", + "loc.input.help.assets": "Specificare i file da caricare come asset della versione. È possibile usare caratteri jolly per specificare più file. Ad esempio, specificare `$(Build.ArtifactStagingDirectory)/*.zip` per le pipeline di compilazione oppure `$(System.DefaultWorkingDirectory)/*.zip` per le pipeline di versione. È anche possibile specificare più criteri, uno per riga. Per impostazione predefinita, tutti i file verranno caricati nella directory $(Build.ArtifactStagingDirectory). Per altre informazioni sull'elenco delle variabili predefinite disponibili, vedere le [variabili di compilazione](https://aka.ms/AA4449z) e le [variabili di versione](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modalità di caricamento degli asset", + "loc.input.help.assetUploadMode": "Usare l'opzione 'Elimina asset esistenti' per eliminare prima tutti gli asset esistenti nella versione, quindi caricare tutti gli asset. Usare l'opzione 'Sostituisci asset esistenti' per sostituire gli asset con lo stesso nome.", + "loc.input.label.isDraft": "Versione bozza", + "loc.input.help.isDraft": "Indica se la versione deve essere salvata come bozza (non pubblicata). Se è `false`, la versione verrà pubblicata.", + "loc.input.label.isPreRelease": "Versione non definitiva", + "loc.input.help.isPreRelease": "Indica se la versione deve essere contrassegnata come versione non definitiva.", + "loc.input.label.addChangeLog": "Aggiungi log delle modifiche", + "loc.input.help.addChangeLog": "Se è impostato su `true`, verrà generato un elenco di modifiche (commit e problemi) relativo alla versione corrente e all'ultima versione pubblicata e tale elenco verrà aggiunto alle note sulla versione.", + "loc.input.label.changeLogCompareToRelease": "Confronta con", + "loc.input.help.changeLogCompareToRelease": "Indica la versione con cui eseguire il confronto per generare il log delle modifiche: \nUltima versione completa: confronta la versione corrente con la versione non bozza più recente che non è contrassegnata come versione non definitiva.\nUltima versione non bozza: confronta la versione corrente con la versione non bozza più recente.\nUltima versione non bozza per tag: confronta la versione corrente con l'ultima versione non bozza corrispondente al tag specificato. È anche possibile specificare un'espressione regolare invece di un tag esatto.", + "loc.input.label.changeLogCompareToReleaseTag": "Tag di versione", + "loc.input.help.changeLogCompareToReleaseTag": "Consente di specificare l'espressione regolare per il tag di versione. La versione corrispondente a questo tag verrà usata come base per il calcolo del log delle modifiche.", + "loc.input.label.changeLogType": "Tipo di log delle modifiche", + "loc.input.help.changeLogType": "Il log delle modifiche può essere basato su commit o su problemi. Il log delle modifiche basato su commit elenca tutti i commit inclusi in una versione, mentre quello basato su problemi elenca tutti i problemi o le richieste pull inclusi nella versione. ", + "loc.input.label.changeLogLabels": "Categorie", + "loc.input.help.changeLogLabels": "Consente di categorizzare le modifiche in base all'etichetta associata al problema o alla richiesta pull. Per un'etichetta è possibile menzionare il nome visualizzato per la categoria e lo stato del problema, ad esempio `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. Nel caso in cui a una modifica siano associate più etichette, la priorità viene assegnata alla prima etichetta specificata. Lasciare vuoto questo campo per visualizzare un elenco semplice di problemi/richieste pull.", + "loc.messages.GithubApiFailError": "Si è verificato un errore imprevisto.", + "loc.messages.GetTagsError": "Si è verificato un errore imprevisto durante il recupero dei tag.", + "loc.messages.GetReleasesError": "Si è verificato un errore imprevisto durante il recupero delle versioni.", + "loc.messages.CreateReleaseError": "Si è verificato un errore imprevisto durante la creazione della versione.", + "loc.messages.EditReleaseError": "Si è verificato un errore imprevisto durante la modifica della versione.", + "loc.messages.DeleteReleaseError": "Si è verificato un errore imprevisto durante l'eliminazione della versione.", + "loc.messages.CreatingRelease": "Creazione di una versione per il tag: %s", + "loc.messages.CreateReleaseSuccess": "La versione è stata creata in %s", + "loc.messages.ReleaseAlreadyExists": "Non è stato possibile creare la versione. Esiste già una versione per il tag: %s", + "loc.messages.EditingRelease": "Modifica della versione con il tag: %s", + "loc.messages.EditReleaseSuccess": "La versione è stata modificata", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Non sono state trovate versioni esistenti da modificare. Ne verrà creata una con tag: %s", + "loc.messages.DeletingRelease": "Eliminazione della versione per il tag: %s", + "loc.messages.DeleteReleaseSuccess": "La versione è stata eliminata.", + "loc.messages.NoReleaseFoundToDelete": "Non è stata trovata alcuna versione per il tag: %s. L'eliminazione della versione non è riuscita.", + "loc.messages.FetchReleaseForTag": "Recupero della versione per il tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "È stata trovata una versione per il tag: %s", + "loc.messages.FetchTagForTarget": "Ricerca dei tag associati al commit di destinazione: %s", + "loc.messages.FetchTagForTargetSuccess": "È stato trovato un tag per il commit di destinazione: %s", + "loc.messages.MissingAssetError": "File non trovato: %s", + "loc.messages.MultipleReleasesFoundError": "È prevista una sola versione, ma ne è stata trovata più di una per il tag: %s. Non è possibile eseguire l'azione.", + "loc.messages.MultipleTagFound": "È previsto un solo tag, ma ne è stato trovato più di uno per il commit specificato: %s. Non è possibile eseguire l'azione.", + "loc.messages.NoTagFound": "La versione non verrà creata perché i tag per il commit di destinazione non corrispondono al criterio tag specificato.", + "loc.messages.DeleteAllExistingAssets": "Eliminazione di tutti gli asset esistenti...", + "loc.messages.DuplicateAssetFound": "È stato trovato un asset duplicato: %s", + "loc.messages.AssetsDeletedSuccessfully": "Gli asset sono stati eliminati.", + "loc.messages.DeletingDuplicateAsset": "Eliminazione dell'asset duplicato: %s", + "loc.messages.SkipDuplicateAssetFound": "È stato trovato un asset duplicato: %s. Verrà ignorato...", + "loc.messages.AssetDeletedSuccessfully": "L'asset %s è stato eliminato", + "loc.messages.AllAssetsUploadedSuccessfully": "Tutti gli asset sono stati caricati.", + "loc.messages.ErrorDeletingDuplicateAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset duplicato: %s", + "loc.messages.ErrorDeletingAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset: %s", + "loc.messages.DeletingAsset": "Eliminazione dell'asset: %s", + "loc.messages.NoAssetFoundToDelete": "Non sono stati trovati asset da eliminare.", + "loc.messages.UploadingAssets": "Caricamento degli asset...", + "loc.messages.UploadingAsset": "Caricamento del file: '%s'.", + "loc.messages.UploadAssetError": "Si è verificato un errore imprevisto durante il caricamento del file: %s", + "loc.messages.UploadAssetSuccess": "Il file è stato caricato: '%s'", + "loc.messages.NoAssetFoundToUpload": "Non sono stati trovati asset da caricare.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Il file delle note sulla versione %s è una directory e non un file.", + "loc.messages.AssetIsDirectoryError": "L'asset è una directory e non un file. La directory di caricamento verrà ignorata: %s", + "loc.messages.ComputingChangeLog": "Calcolo delle modifiche apportate in questa versione...", + "loc.messages.ComputingChangeLogSuccess": "Le modifiche sono state calcolate.", + "loc.messages.CommitDiffBehind": "Non è possibile calcolare le modifiche perché il commit di destinazione specificato è meno recente del commit dell'ultima versione pubblicata.", + "loc.messages.CommitDiffEqual": "Non sono state trovate modifiche. Il commit di destinazione specificato è uguale a quello dell'ultima versione pubblicata.", + "loc.messages.FetchLatestPublishRelease": "Recupero dell'ultima versione pubblicata...", + "loc.messages.FetchLatestNonDraftRelease": "Recupero della versione non bozza più recente...", + "loc.messages.FetchLastReleaseByTag": "Recupero della versione più recente corrispondente al criterio tag %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "L'ultima versione pubblicata è stata trovata: %s", + "loc.messages.FetchMatchingReleaseSuccess": "La versione non bozza più recente è stata trovata", + "loc.messages.FetchTagMatchingReleaseSuccess": "La versione più recente corrispondente al criterio tag %s è stata trovata", + "loc.messages.GetLatestReleaseError": "Si è verificato un errore imprevisto durante il recupero dell'ultima versione pubblicata.", + "loc.messages.NoLatestPublishRelease": "Non sono ancora state pubblicate versioni nel repository.", + "loc.messages.NoMatchingReleases": "Non sono state trovate versioni non bozza.", + "loc.messages.NoTagMatchingReleases": "Non sono state trovate versioni corrispondenti al criterio tag %s ", + "loc.messages.FetchCommitDiff": "Recupero dell'elenco di commit eseguiti dall'ultima versione pubblicata...", + "loc.messages.FetchCommitDiffSuccess": "L'elenco di modifiche è stato trovato.", + "loc.messages.FetchCommitDiffError": "Si è verificato un errore imprevisto durante il recupero dell'elenco di modifiche.", + "loc.messages.FetchInitialCommit": "Recupero del commit iniziale...", + "loc.messages.FetchInitialCommitSuccess": "Il commit iniziale è stato trovato: %s", + "loc.messages.InvalidGitHubEndpoint": "Endpoint servizio GitHub non valido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Schema di connessione al servizio GitHub non valido: %s. Sono consentite solo le connessioni OAuth o con token di accesso personale GitHub.", + "loc.messages.FetchInitialCommitError": "Si è verificato un errore imprevisto durante il recupero del commit iniziale.", + "loc.messages.InvalidActionSet": "Azione non valida: %s. Sono consentite solo le azioni 'create', 'edit' e 'delete'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origine dei tag non valida: %s. Sono consentite solo le opzioni 'auto' e 'manual'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origine delle note sulla versione non valida: %s. Sono consentite solo le opzioni 'file' e 'input'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "L'attributo di compareWith non è valido: %s. Sono consentite solo le opzioni 'lastFullRelease, 'lastNonDraftRelease' o 'lastNonDraftReleaseByTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modalità di caricamento degli asset non valida: %s. Sono consentite solo le opzioni 'delete' e 'replace'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Per l'azione '%s' è richiesto un tag. Specificare un tag nel passaggio. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "L'origine del tag è impostata su manual. Specificare un tag per l'azione create. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Non sono stati trovati file corrispondenti a '%s'. Non c'è nulla da caricare.", + "loc.messages.PatternIsADirectory": "Non è possibile caricare '%s' perché è una directory. Specificare un file.", + "loc.messages.SearchingFileMatchingPattern": "Ricerca dei file corrispondenti a '%s'.", + "loc.messages.IssuesFetchError": "Si è verificato un errore durante il recupero dei problemi. Non è possibile generare il log delle modifiche.", + "loc.messages.NoIssuesLinkedError": "Non è stato collegato alcun problema ai commit nel Diff di commit specificato.", + "loc.messages.LabelsSyntaxError": "Si è verificato un errore durante l'analisi delle etichette. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "L'attributo di ChangeLogType non è valido: %s. Sono consentite solo le opzioni 'commitBased' o 'issueBased'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Modifiche", + "loc.messages.DefaultCategory": "Altri tipi", + "loc.messages.SeeMoreText": "Visualizza dettagli" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..03009f6805b6 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub リリース", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub リリースを作成、編集、または削除します", + "loc.instanceNameFormat": "GitHub リリース ($(action))", + "loc.group.displayName.changeLogConfiguration": "変更ログの構成", + "loc.input.label.gitHubConnection": "GitHub 接続 (OAuth または PAT)", + "loc.input.help.gitHubConnection": "GitHub リポジトリへの接続に使用する GitHub サービス接続の名前を指定します。この接続は、GitHub ユーザーの OAuth または GitHub 個人用アクセス トークンに基づいている必要があります。サービス接続については、[こちら](https://aka.ms/AA3am5s)を参照してください。", + "loc.input.label.repositoryName": "リポジトリ", + "loc.input.help.repositoryName": "GitHub リリースが作成、編集、または削除される GitHub リポジトリの名前を指定します。", + "loc.input.label.action": "アクション", + "loc.input.help.action": "実行するリリース操作の種類を指定します。このタスクでは、GitHub リリースを作成、編集、または削除できます。", + "loc.input.label.target": "ターゲット", + "loc.input.help.target": "GitHub リリースを作成するためのコミット SHA を指定します。例: `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。ここで変数を使用することもできます。例: '$(myCommitSHA)'。", + "loc.input.label.tagSource": "タグ ソース", + "loc.input.help.tagSource": "リリースの作成に使用するタグを指定します。[Git タグ] オプションを使用する場合、Git コミットと関連付けられているタグが自動的に取得されます。[ユーザー指定のタグ] オプションを使用する場合、手動でタグを指定します。", + "loc.input.label.tagPattern": "タグ パターン", + "loc.input.help.tagPattern": " 正規表現を使用して Git タグ パターンを指定します (例: `release-v1.*`)。GitHub リリースは、一致する Git タグがあるコミットに対してのみ作成されます。", + "loc.input.label.tag": "タグ", + "loc.input.help.tag": "リリースを作成、編集、または削除するためのタグを指定します。ここで変数を使用することもできます。例: `$(myTagName)`。", + "loc.input.label.title": "リリース タイトル", + "loc.input.help.title": "GitHub リリースのタイトルを指定します。空のままにすると、タグはリリース タイトルとして使用されます。", + "loc.input.label.releaseNotesSource": "リリース ノートのソース", + "loc.input.help.releaseNotesSource": "GitHub リリースの説明を指定します。ファイルの内容をリリース ノートとして使用するには、[リリース ノート ファイル] オプションを使用します。手動でリリース ノートを入力するには、[インライン リリース ノート] オプションを使用します。", + "loc.input.label.releaseNotesFile": "リリース ノート ファイル パス", + "loc.input.help.releaseNotesFile": "リリース ノートを含むファイルを選択します。", + "loc.input.label.releaseNotes": "リリース ノート", + "loc.input.help.releaseNotes": "リリース ノートをこちらに入力してください。マークダウンがサポートされています。", + "loc.input.label.assets": "資産", + "loc.input.help.assets": "リリース アセットとしてアップロードするファイルを指定します。ワイルドカード文字を使用して複数のファイルを指定できます。例: ビルド パイプラインの場合は `$(Build.ArtifactStagingDirectory)/*.zip`、リリース パイプラインの場合は `$(System.DefaultWorkingDirectory)/*.zip` とします。1 行に 1 つずつ、複数のパターンを指定することもできます。既定では、$(Build.ArtifactStagingDirectory) ディレクトリ内のすべてのファイルがアップロードされます。利用可能な事前定義済み変数のリストについて詳しくは、[ビルド変数](https://aka.ms/AA4449z)および[リリース変数](https://aka.ms/AA43wws)を参照してください。", + "loc.input.label.assetUploadMode": "アセット アップロード モード", + "loc.input.help.assetUploadMode": "最初にリリース内の既存のアセットを削除してからすべてのアセットをアップロードするには、[既存のアセットを削除] オプションを使用します。同じ名前のアセットを置換するには、[既存のアセットを置換] オプションを使用します。", + "loc.input.label.isDraft": "ドラフト リリース", + "loc.input.help.isDraft": "リリースを下書き (未公開) として保存する必要があるかどうかを示します。[false] の場合、リリースは公開されます。", + "loc.input.label.isPreRelease": "プレリリース", + "loc.input.help.isPreRelease": "リリースをプレリリースとしてマークする必要があるかどうかを示します。", + "loc.input.label.addChangeLog": "変更ログの追加", + "loc.input.help.addChangeLog": "[true] に設定されている場合、これと公開された最新リリースの間の変更 (コミットと公開) の一覧が生成され、リリース ノートに追加されます。", + "loc.input.label.changeLogCompareToRelease": "比較対象", + "loc.input.help.changeLogCompareToRelease": "変更ログを生成するために比較するリリースを指定します。\n最後の完全リリース: 現在のリリースを、プレリリースとしてマークされていない、ドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース: 現在のリリースをドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース (タグによる): 現在のリリースを、指定されたタグと一致する最後のドラフト以外のリリースと比較します。正確なタグの代わりに正規表現を指定することもできます。", + "loc.input.label.changeLogCompareToReleaseTag": "リリース タグ", + "loc.input.help.changeLogCompareToReleaseTag": "リリース タグの正規表現を指定します。このタグに一致するリリースは、変更ログの計算のベースとして使用されます。", + "loc.input.label.changeLogType": "変更ログの種類", + "loc.input.help.changeLogType": "変更ログは、コミット ベースまたはイシュー ベースにすることができます。コミット ベースの変更ログにはリリースに含まれているすべてのコミットが一覧表示されるのに対し、イシュー ベースの変更ログにはリリースに含まれるすべてのイシューまたは pull request が一覧表示されます。", + "loc.input.label.changeLogLabels": "カテゴリ", + "loc.input.help.changeLogLabels": "これを使用すると、イシューまたは PR に関連付けられているラベルに基づいて変更を分類できます。ラベルにはカテゴリの表示名とイシューの状態を含めることができます。例: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。1 つの変更に複数のラベルがある場合、最初に指定したラベルが優先されます。イシューまたは PR のフラットな一覧を表示するには、このフィールドを空のままにします。", + "loc.messages.GithubApiFailError": "予期しないエラーが発生しました。", + "loc.messages.GetTagsError": "タグのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.GetReleasesError": "リリースのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.CreateReleaseError": "リリースの作成中に予期しないエラーが発生しました。", + "loc.messages.EditReleaseError": "リリースの編集中に予期しないエラーが発生しました。", + "loc.messages.DeleteReleaseError": "リリースの削除中に予期しないエラーが発生しました。", + "loc.messages.CreatingRelease": "タグのリリースを作成しています: %s", + "loc.messages.CreateReleaseSuccess": "%s でリリースが正常に作成されました", + "loc.messages.ReleaseAlreadyExists": "リリースを作成できませんでした。次のタグのリリースが既に存在します: %s", + "loc.messages.EditingRelease": "タグ付きのリリースを編集しています: %s", + "loc.messages.EditReleaseSuccess": "リリースが正常に編集されました", + "loc.messages.NoReleaseFoundToEditCreateRelease": "編集対象の既存のリリースは見つかりませんでした。タグを使用して作成しています: %s", + "loc.messages.DeletingRelease": "タグのリリースを削除しています: %s", + "loc.messages.DeleteReleaseSuccess": "リリースが正常に削除されました。", + "loc.messages.NoReleaseFoundToDelete": "タグのリリースが見つかりませんでした: %s。リリースの削除に失敗しました。", + "loc.messages.FetchReleaseForTag": "タグのリリースをフェッチしています: %s", + "loc.messages.FetchReleaseForTagSuccess": "タグのリリースが見つかりました: %s", + "loc.messages.FetchTagForTarget": "ターゲットのコミットに関連付けられたタグを検索しています: %s", + "loc.messages.FetchTagForTargetSuccess": "ターゲット コミットのタグが見つかりました: %s", + "loc.messages.MissingAssetError": "ファイルが見つかりませんでした: %s", + "loc.messages.MultipleReleasesFoundError": "必要なリリースは 1 つだけですが、タグには複数のリリースが見つかりました: %s。操作を実行できません。", + "loc.messages.MultipleTagFound": "必要なタグは 1 つのみですが、指定されたコミットに複数のタグが見つかりました: %s。操作を実行できません。", + "loc.messages.NoTagFound": "ターゲット コミットのタグが指定されたタグ パターンと一致しないため、リリースは作成されません。", + "loc.messages.DeleteAllExistingAssets": "既存のすべてのアセットを削除しています...", + "loc.messages.DuplicateAssetFound": "重複するアセットが見つかりました: %s", + "loc.messages.AssetsDeletedSuccessfully": "アセットが正常に削除されました。", + "loc.messages.DeletingDuplicateAsset": "重複するアセットを削除しています: %s", + "loc.messages.SkipDuplicateAssetFound": "重複するアセットが見つかりました: %s。スキップしています...", + "loc.messages.AssetDeletedSuccessfully": "アセット %s が正常に削除されました", + "loc.messages.AllAssetsUploadedSuccessfully": "すべてのアセットが正常にアップロードされました。", + "loc.messages.ErrorDeletingDuplicateAsset": "重複するアセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.ErrorDeletingAsset": "アセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.DeletingAsset": "アセットを削除しています: %s", + "loc.messages.NoAssetFoundToDelete": "削除するアセットが見つかりませんでした。", + "loc.messages.UploadingAssets": "アセットをアップロードしています...", + "loc.messages.UploadingAsset": "ファイルをアップロードしています: '%s'。", + "loc.messages.UploadAssetError": "次のファイルのアップロード中に予期しないエラーが発生しました: %s", + "loc.messages.UploadAssetSuccess": "ファイルが正常にアップロードされました: '%s'", + "loc.messages.NoAssetFoundToUpload": "アップロードするアセットが見つかりませんでした。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "リリース ノート ファイル: %s はディレクトリであり、ファイルではありません。", + "loc.messages.AssetIsDirectoryError": "このアセットはディレクトリであり、ファイルではありません。ディレクトリのアップロードをスキップしています: %s", + "loc.messages.ComputingChangeLog": "このリリースで行われた変更を計算しています...", + "loc.messages.ComputingChangeLogSuccess": "変更が正常に計算されました。", + "loc.messages.CommitDiffBehind": "指定されたターゲット コミットが、公開された最新リリースのコミットより古いため、変更を計算できません。", + "loc.messages.CommitDiffEqual": "変更は見つかりませんでした。指定されたターゲットのコミットは、公開された最新リリースのコミットと同じです。", + "loc.messages.FetchLatestPublishRelease": "公開された最新リリースをフェッチしています...", + "loc.messages.FetchLatestNonDraftRelease": "ドラフト以外の最新リリースをフェッチしています...", + "loc.messages.FetchLastReleaseByTag": "タグ パターンに一致する最新リリースをフェッチしています: %s", + "loc.messages.FetchLatestPublishReleaseSuccess": "公開された最新のリリースが見つかりました: %s", + "loc.messages.FetchMatchingReleaseSuccess": "ドラフト以外の最新リリースが見つかりました", + "loc.messages.FetchTagMatchingReleaseSuccess": "タグ パターンに一致する最新リリースが見つかりました: %s", + "loc.messages.GetLatestReleaseError": "公開された最新リリースのフェッチ中に予期しないエラーが発生しました。 ", + "loc.messages.NoLatestPublishRelease": "リポジトリに公開されているリリースはまだありません。", + "loc.messages.NoMatchingReleases": "ドラフト以外のリリースが見つかりません。", + "loc.messages.NoTagMatchingReleases": "タグ パターン %s に一致するリリースが見つかりませんでした", + "loc.messages.FetchCommitDiff": "公開された最新リリース以降のコミットの一覧をフェッチしています...", + "loc.messages.FetchCommitDiffSuccess": "変更の一覧が見つかりました。", + "loc.messages.FetchCommitDiffError": "変更の一覧のフェッチ中に予期しないエラーが発生しました。", + "loc.messages.FetchInitialCommit": "初期コミットをフェッチしています...", + "loc.messages.FetchInitialCommitSuccess": "初期コミットが見つかりました: %s", + "loc.messages.InvalidGitHubEndpoint": "無効な GitHub サービス エンドポイント: %s。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub サービス接続スキームが無効です: %s。使用できるのは OAuth と GitHub の個人用アクセス トークン接続のみです。", + "loc.messages.FetchInitialCommitError": "初期コミットのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.InvalidActionSet": "無効なアクション: %s。'作成'、'編集'、または '削除' の操作のみが許可されています。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "タグのソースが無効です: %s。'自動' または '手動' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "無効なリリース ノート ソース: %s。'ファイル' または '入力' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 属性 %s が無効です。'lastFullRelease'、'lastNonDraftRelease'、'lastNonDraftReleaseByTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidAssetUploadMode": "アセットのアップロード モードが無効です: %s。'削除'、または '置換' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' アクションには、タグが必要です。手順でタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "タグ ソースが手動に設定されています。作成アクション用のタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "'%s' と一致するファイルが見つかりませんでした。アップロードするものがありません。", + "loc.messages.PatternIsADirectory": "'%s' はディレクトリであるため、アップロードできません。ファイルを指定してください。", + "loc.messages.SearchingFileMatchingPattern": "'%s' と一致するファイルを検索しています。", + "loc.messages.IssuesFetchError": "イシューのフェッチでエラーが発生しました。変更ログを生成できません。", + "loc.messages.NoIssuesLinkedError": "指定されたコミットの差分には、コミットにリンクされているイシューはありません。", + "loc.messages.LabelsSyntaxError": "ラベルの解析中にエラーが発生しました。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 属性 %s が無効です。'commitBased' または 'issueBased' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.ChangeLogTitle": "変更", + "loc.messages.DefaultCategory": "その他", + "loc.messages.SeeMoreText": "さらに表示" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..1838a9ffe6c3 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 릴리스", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub 릴리스를 만들거나, 편집하거나, 삭제합니다.", + "loc.instanceNameFormat": "GitHub 릴리스($(action))", + "loc.group.displayName.changeLogConfiguration": "변경 로그 구성", + "loc.input.label.gitHubConnection": "GitHub 연결(OAuth 또는 PAT)", + "loc.input.help.gitHubConnection": "GitHub 리포지토리에 연결하는 데 사용할 GitHub 서비스 연결의 이름을 지정합니다. 이 연결은 GitHub 사용자의 OAuth 또는 GitHub 개인용 액세스 토큰을 기반으로 해야 합니다. [여기](https://aka.ms/AA3am5s)서 서비스 연결에 대해 자세히 알아보세요.", + "loc.input.label.repositoryName": "리포지토리", + "loc.input.help.repositoryName": "GitHub 릴리스를 만들거나, 편집하거나, 삭제할 GitHub 리포지토리의 이름을 지정합니다.", + "loc.input.label.action": "작업", + "loc.input.help.action": "수행할 릴리스 작업 유형을 지정합니다. 이 작업은 GitHub 릴리스를 만들거나, 편집하거나, 삭제할 수 있습니다.", + "loc.input.label.target": "대상", + "loc.input.help.target": "GitHub 릴리스를 만들 커밋 SHA를 지정합니다. 예: '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. 여기서 변수를 사용할 수도 있습니다. 예: '$(myCommitSHA)'", + "loc.input.label.tagSource": "태그 소스", + "loc.input.help.tagSource": "릴리스 생성에 사용할 태그를 지정합니다. 'Git tag' 옵션은 Git 커밋에 연결된 태그를 자동으로 사용합니다. 태그를 수동으로 지정하려면 '사용자 지정 태그' 옵션을 사용합니다.", + "loc.input.label.tagPattern": "태그 패턴", + "loc.input.help.tagPattern": " regex를 사용하여 git 태그 패턴을 지정합니다(예: `release-v1.*`). GitHub 릴리스는 일치하는 git 태그가 있는 커밋에 대해서만 생성됩니다. ", + "loc.input.label.tag": "태그", + "loc.input.help.tag": "릴리스를 만들거나, 편집하거나, 삭제할 태그를 지정합니다. 여기서 변수를 사용할 수도 있습니다. 예: '$(myTagName)'", + "loc.input.label.title": "릴리스 제목", + "loc.input.help.title": "GitHub 릴리스의 제목을 지정합니다. 비워 두면, 태그가 릴리스 제목으로 사용됩니다.", + "loc.input.label.releaseNotesSource": "릴리스 정보 소스", + "loc.input.help.releaseNotesSource": "GitHub 릴리스에 대한 설명을 지정합니다. 파일 내용을 릴리스 정보로 사용하려면 '릴리스 정보 파일' 옵션을 사용합니다. 릴리스 정보를 수동으로 입력하려면 '인라인 릴리스 정보' 옵션을 사용합니다.", + "loc.input.label.releaseNotesFile": "릴리스 정보 파일 경로", + "loc.input.help.releaseNotesFile": "릴리스 정보가 포함된 파일을 선택합니다.", + "loc.input.label.releaseNotes": "릴리스 정보", + "loc.input.help.releaseNotes": "여기에 릴리스 정보를 입력합니다. Markdown이 지원됩니다.", + "loc.input.label.assets": "자산", + "loc.input.help.assets": "릴리스의 자산으로 업로드할 파일을 지정합니다. 와일드카드 문자를 사용하여 여러 파일을 지정할 수 있습니다. 예를 들어 빌드 파이프라인의 경우 '$(Build.ArtifactStagingDirectory)/*.zip', 릴리스 파이프라인의 경우 '$(System.DefaultWorkingDirectory)/*.zip'입니다. 한 줄에 하나씩, 여러 개의 패턴을 지정할 수도 있습니다. 기본적으로 $(Build.ArtifactStagingDirectory) 디렉터리에 있는 모든 파일이 업로드됩니다. 사용 가능한 미리 정의된 변수 목록에 대한 자세한 내용은 [빌드 변수](https://aka.ms/AA4449z) 및 [릴리스 변수](https://aka.ms/AA43wws)를 참조하세요.", + "loc.input.label.assetUploadMode": "자산 업로드 모드", + "loc.input.help.assetUploadMode": "릴리스의 기존 자산을 먼저 삭제한 후 모든 자산을 업로드하려면 '기존 자산 삭제' 옵션을 사용합니다. 동일한 이름의 자산을 모두 바꾸려면 '기존 자산 바꾸기' 옵션을 사용합니다.", + "loc.input.label.isDraft": "초안 릴리스", + "loc.input.help.isDraft": "릴리스를 초안(게시되지 않음)으로 저장해야 하는지 여부를 나타냅니다. 'false'이면, 릴리스가 게시됩니다.", + "loc.input.label.isPreRelease": "시험판", + "loc.input.help.isPreRelease": "릴리스를 시험판으로 표시해야 하는지 여부를 나타냅니다.", + "loc.input.label.addChangeLog": "changelog 추가", + "loc.input.help.addChangeLog": "'true'로 설정하면, 이 릴리스와 마지막으로 게시된 릴리스 사이의 변경 내용(커밋 및 문제) 목록이 생성되어 릴리스 정보에 추가됩니다.", + "loc.input.label.changeLogCompareToRelease": "비교 대상", + "loc.input.help.changeLogCompareToRelease": "변경 로그를 생성하기 위해 비교할 릴리스를 나타냅니다. \n마지막 전체 릴리스: 현재 릴리스와 시험판으로 표시되어 있지 않은 초안이 아닌 최신 릴리스를 비교합니다.\n초안이 아닌 마지막 릴리스: 현재 릴리스를 초안이 아닌 최신 릴리스와 비교합니다.\n태그 기준 초안이 아닌 마지막 릴리스: 지정한 태그와 일치하는 초안이 아닌 마지막 릴리스를 현재 릴리스와 비교합니다. 정확한 태그 대신 regex를 지정할 수도 있습니다.", + "loc.input.label.changeLogCompareToReleaseTag": "릴리스 태그", + "loc.input.help.changeLogCompareToReleaseTag": "릴리스 태그에 대한 regex를 지정합니다. 이 태그와 일치하는 릴리스가 변경 로그 계산의 기본으로 사용됩니다.", + "loc.input.label.changeLogType": "변경 로그 유형", + "loc.input.help.changeLogType": "변경 로그는 커밋 기반 또는 문제 기반일 수 있습니다. 문제 기반 변경 로그는 릴리스에 포함된 모든 문제/끌어오기 요청을 나열하지만 커밋 기반 변경 로그는 릴리스에 포함된 모든 커밋을 나열합니다. ", + "loc.input.label.changeLogLabels": "범주", + "loc.input.help.changeLogLabels": "문제/PR과 연결된 레이블을 기준으로 변경 내용을 분류하는 데 사용할 수 있습니다. 레이블의 경우 범주 및 문제 상태에 대해 해당 표시 이름을 언급할 수 있습니다. 예: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. 변경 내용에 레이블이 여러 개 있는 경우 처음 지정한 레이블이 우선 순위를 갖습니다. 문제/PR의 단순 목록을 보려면 이 필드를 비워 두세요.", + "loc.messages.GithubApiFailError": "예기치 않은 오류가 발생했습니다.", + "loc.messages.GetTagsError": "태그를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.GetReleasesError": "릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreateReleaseError": "릴리스를 만드는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.EditReleaseError": "릴리스를 편집하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeleteReleaseError": "릴리스를 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreatingRelease": "%s 태그의 릴리스를 만드는 중", + "loc.messages.CreateReleaseSuccess": "%s에 릴리스를 만들었습니다.", + "loc.messages.ReleaseAlreadyExists": "릴리스를 만들지 못했습니다. %s 태그의 릴리스가 이미 있습니다.", + "loc.messages.EditingRelease": "%s 태그가 있는 릴리스를 편집하는 중", + "loc.messages.EditReleaseSuccess": "릴리스를 편집했습니다.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "편집할 기존 릴리스가 없습니다. %s 태그를 사용하여 만드는 중입니다.", + "loc.messages.DeletingRelease": "%s 태그의 릴리스를 삭제하는 중", + "loc.messages.DeleteReleaseSuccess": "릴리스를 삭제했습니다.", + "loc.messages.NoReleaseFoundToDelete": "%s 태그의 릴리스를 찾을 수 없습니다. 릴리스를 삭제하지 못했습니다.", + "loc.messages.FetchReleaseForTag": "%s 태그의 릴리스를 페치하는 중", + "loc.messages.FetchReleaseForTagSuccess": "%s 태그의 릴리스를 찾았습니다.", + "loc.messages.FetchTagForTarget": "대상 커밋 %s에 연결된 태그를 검색하는 중", + "loc.messages.FetchTagForTargetSuccess": "대상 커밋 %s의 태그를 찾았습니다.", + "loc.messages.MissingAssetError": "%s 파일을 찾을 수 없습니다.", + "loc.messages.MultipleReleasesFoundError": "릴리스가 1개만 필요한데, %s 태그의 릴리스를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.MultipleTagFound": "태그가 1개만 필요한데, 지정된 %s 커밋의 태그를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.NoTagFound": "대상 커밋에 대한 태그가 지정된 태그 패턴과 일치하지 않으므로 릴리스가 만들어지지 않습니다.", + "loc.messages.DeleteAllExistingAssets": "기존 자산을 모두 삭제하는 중...", + "loc.messages.DuplicateAssetFound": "중복된 %s 자산을 찾았습니다.", + "loc.messages.AssetsDeletedSuccessfully": "자산을 삭제했습니다.", + "loc.messages.DeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중", + "loc.messages.SkipDuplicateAssetFound": "중복된 %s 자산을 찾았습니다. 건너뛰는 중...", + "loc.messages.AssetDeletedSuccessfully": "%s 자산을 삭제했습니다.", + "loc.messages.AllAssetsUploadedSuccessfully": "모든 자산을 업로드했습니다.", + "loc.messages.ErrorDeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.ErrorDeletingAsset": "%s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeletingAsset": "%s 자산을 삭제하는 중", + "loc.messages.NoAssetFoundToDelete": "삭제할 자산이 없습니다.", + "loc.messages.UploadingAssets": "자산을 업로드하는 중...", + "loc.messages.UploadingAsset": "'%s' 파일을 업로드하는 중입니다.", + "loc.messages.UploadAssetError": "%s 파일을 업로드하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.UploadAssetSuccess": "'%s' 파일을 업로드했습니다.", + "loc.messages.NoAssetFoundToUpload": "업로드할 자산이 없습니다.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "릴리스 정보 파일 %s은(는) 파일이 아닌 디렉터리입니다.", + "loc.messages.AssetIsDirectoryError": "이 자산은 파일이 아닌 디렉터리입니다. %s 디렉터리 업로드를 건너뜁니다.", + "loc.messages.ComputingChangeLog": "이 릴리스의 변경 내용을 컴퓨팅하는 중...", + "loc.messages.ComputingChangeLogSuccess": "변경 내용을 컴퓨팅했습니다.", + "loc.messages.CommitDiffBehind": "지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋보다 이전이므로 변경 내용을 컴퓨팅할 수 없습니다.", + "loc.messages.CommitDiffEqual": "변경 내용을 찾을 수 없습니다. 지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋과 같습니다.", + "loc.messages.FetchLatestPublishRelease": "게시된 최신 릴리스를 페치하는 중...", + "loc.messages.FetchLatestNonDraftRelease": "초안이 아닌 최신 릴리스를 가져오는 중...", + "loc.messages.FetchLastReleaseByTag": "태그 패턴과 일치하는 최신 릴리스를 가져오는 중: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "게시된 최신 릴리스 %s을(를) 찾았습니다.", + "loc.messages.FetchMatchingReleaseSuccess": "초안이 아닌 최신 릴리스를 찾음", + "loc.messages.FetchTagMatchingReleaseSuccess": "태그 패턴과 일치하는 최신 릴리스를 찾음: %s", + "loc.messages.GetLatestReleaseError": "게시된 최신 릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.NoLatestPublishRelease": "리포지토리에 게시된 릴리스가 아직 없습니다.", + "loc.messages.NoMatchingReleases": "초안이 아닌 릴리스를 찾을 수 없습니다.", + "loc.messages.NoTagMatchingReleases": "태그 패턴 %s과(와) 일치하는 릴리스를 찾을 수 없습니다. ", + "loc.messages.FetchCommitDiff": "마지막으로 게시된 릴리스 이후 커밋 목록을 페치하는 중...", + "loc.messages.FetchCommitDiffSuccess": "변경 내용 목록을 찾았습니다.", + "loc.messages.FetchCommitDiffError": "변경 내용 목록을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.FetchInitialCommit": "초기 커밋을 페치하는 중...", + "loc.messages.FetchInitialCommitSuccess": "초기 커밋 %s을(를) 찾았습니다.", + "loc.messages.InvalidGitHubEndpoint": "GitHub 서비스 엔드포인트 %s이(가) 잘못되었습니다.", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 서비스 연결 체계 %s이(가) 잘못되었습니다. OAuth 및 GitHub 개인용 액세스 토큰 연결만 허용됩니다.", + "loc.messages.FetchInitialCommitError": "초기 커밋을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.InvalidActionSet": "%s 작업이 잘못되었습니다. 'create', 'edit' 또는 'delete' 작업만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidTagSource": "태그 소스 %s이(가) 잘못되었습니다. 'auto' 또는 'manual' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidReleaseNotesSource": "릴리스 정보 소스 %s이(가) 잘못되었습니다. 'file' 또는 'input' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidCompareWithAttribute": "compareWith 특성 %s이(가) 잘못되었습니다. 'lastFullRelease, 'lastNonDraftRelease' 또는 'lastNonDraftReleaseByTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidAssetUploadMode": "자산 업로드 모드 %s이(가) 잘못되었습니다. 'delete' 또는 'replace' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 작업에는 태그가 필요합니다. 단계에서 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredCreateAction": "태그 소스가 'manual'로 설정되었습니다. 'create' 작업의 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.NoFileFoundMatchingPattern": "'%s'과(와) 일치하는 파일이 없습니다. 업로드할 파일이 없습니다.", + "loc.messages.PatternIsADirectory": "'%s'은(는) 디렉터리이므로 업로드할 수 없습니다. 파일을 지정하세요.", + "loc.messages.SearchingFileMatchingPattern": "'%s'과(와) 일치하는 파일을 검색 중입니다.", + "loc.messages.IssuesFetchError": "문제를 가져오는 동안 오류가 발생했습니다. 변경 로그를 생성할 수 없습니다.", + "loc.messages.NoIssuesLinkedError": "지정된 커밋 Diff에서 커밋에 연결된 문제가 없습니다.", + "loc.messages.LabelsSyntaxError": "레이블의 구문을 분석하는 동안 오류가 발생했습니다. Yaml 구문에 대해서는 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 특성 %s이(가) 잘못되었습니다. 'commitBased' 또는 'issueBased' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.ChangeLogTitle": "변경 내용", + "loc.messages.DefaultCategory": "기타", + "loc.messages.SeeMoreText": "자세히 보기" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..a7459bfd47c4 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Выпуск GitHub", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/AA3aeiw)", + "loc.description": "Создание, изменение или удаление выпуска GitHub", + "loc.instanceNameFormat": "Выпуск GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Конфигурация журнала изменений", + "loc.input.label.gitHubConnection": "Подключение GitHub (OAuth или личный маркер доступа)", + "loc.input.help.gitHubConnection": "Укажите имя подключения службы GitHub, которое будет использоваться для подключения к репозиторию GitHub. Подключение должно быть основано на личном маркере доступа или OAuth пользователя GitHub. Дополнительные сведения о подключениях служб см. [здесь](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Репозиторий", + "loc.input.help.repositoryName": "Укажите имя репозитория GitHub, в котором будет создан, изменен или удален выпуск GitHub.", + "loc.input.label.action": "Действие", + "loc.input.help.action": "Укажите тип выполняемой операции выпуска. Эта задача может создавать, изменять или удалять выпуск GitHub.", + "loc.input.label.target": "Целевой объект", + "loc.input.help.target": "Укажите SHA фиксации, для которого будет создан выпуск GitHub. Например, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Здесь также можно использовать переменную. Например, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Источник тегов", + "loc.input.help.tagSource": "Укажите тег, который будет использоваться для создания выпуска. Параметр \"Тег Git\" автоматически принимает тег, связанный с фиксацией Git. Для указания тега вручную используйте параметр \"Тег, указанный пользователем\".", + "loc.input.label.tagPattern": "Шаблон тега", + "loc.input.help.tagPattern": " Укажите шаблон тега Git с помощью регулярного выражения (например, release-v1.*). Выпуск GitHub будет создан только для фиксаций с соответствующим тегом Git. ", + "loc.input.label.tag": "Тег", + "loc.input.help.tag": "Укажите тег, для которого требуется создать, изменить или удалить выпуск. Здесь также можно использовать переменную. Например, \"$(myTagName)\".", + "loc.input.label.title": "Название выпуска", + "loc.input.help.title": "Укажите название выпуска GitHub. Если оставить параметр пустым, в качестве названия выпуска будет использоваться тег.", + "loc.input.label.releaseNotesSource": "Источник заметок о выпуске", + "loc.input.help.releaseNotesSource": "Укажите описание выпуска GitHub. Используйте параметр \"Файл заметок о выпуске\", чтобы использовать содержимое файла в качестве заметок о выпуске. Используйте параметр \"Встроенные заметки о выпуске\", чтобы вручную ввести заметки о выпуске.", + "loc.input.label.releaseNotesFile": "Путь к файлу заметок о выпуске", + "loc.input.help.releaseNotesFile": "Выберите файл, содержащий заметки о выпуске.", + "loc.input.label.releaseNotes": "Заметки о выпуске", + "loc.input.help.releaseNotes": "Введите здесь примечания к выпуску. Markdown поддерживается.", + "loc.input.label.assets": "Ресурсы", + "loc.input.help.assets": "Укажите файлы, которые будут отправлены в качестве ресурсов выпуска. Для указания нескольких файлов можно использовать подстановочные знаки. Например, для конвейеров сборки, \"$(Build.ArtifactStagingDirectory)/*.zip\" или в случае конвейеров выпуска \"$(System.DefaultWorkingDirectory)/*.zip\". Также можно указать несколько шаблонов — по одному на строку. По умолчанию будут отправлены все файлы в каталоге $(Build.ArtifactStagingDirectory). Чтобы получить дополнительные сведения о списке доступных предварительно заданных переменных, см. [переменные сборки](https://aka.ms/AA4449z) и [переменные выпуска](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Режим отправки активов", + "loc.input.help.assetUploadMode": "Используйте параметр \"Удалить существующие ресурсы\", чтобы сначала удалить все существующие ресурсы в выпуске, а затем отправить все ресурсы. Используйте параметр \"Заменить существующие ресурсы\", чтобы заменить все ресурсы с одинаковыми именами.", + "loc.input.label.isDraft": "Черновик выпуска", + "loc.input.help.isDraft": "Укажите, следует ли сохранять выпуск в виде черновика (неопубликованным). Если задано значение false, выпуск будет опубликован.", + "loc.input.label.isPreRelease": "Предварительный выпуск", + "loc.input.help.isPreRelease": "Укажите, следует ли помечать выпуск как предварительную версию.", + "loc.input.label.addChangeLog": "Добавить журнал изменений", + "loc.input.help.addChangeLog": "Если задано значение \"true\", будет создан список изменений (фиксации и проблемы) между этим и последним опубликованным выпуском, который будет добавлен к заметкам о выпуске.", + "loc.input.label.changeLogCompareToRelease": "Сравнить с", + "loc.input.help.changeLogCompareToRelease": "Укажите, с каким выпуском следует проводить сравнение, чтобы создать журнал изменений. \n\"Последний полный выпуск\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, который не помечен как предварительный.\n\"Последний выпуск, отличный от чернового\": сравнивает текущий выпуск с самым последним выпуском, отличным от чернового.\n\"Последний выпуск по тегу, отличный от чернового\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, соответствующим указанному тегу. Кроме того, вместо точного тега можно указать регулярное выражение.", + "loc.input.label.changeLogCompareToReleaseTag": "Тег выпуска", + "loc.input.help.changeLogCompareToReleaseTag": "Укажите регулярное выражение для тега выпуска. Выпуск, соответствующий этому тегу, будет использоваться в качестве основы для расчета журнала изменений.", + "loc.input.label.changeLogType": "Тип журнала изменений", + "loc.input.help.changeLogType": "Журнал изменений может быть основан на фиксациях или вопросах. Журнал изменений на основе фиксаций содержит все фиксации, включенные в выпуск, а журнал изменений на основе вопросов содержит список всех вопросов или запросов на вытягивание, включенных в выпуск. ", + "loc.input.label.changeLogLabels": "Категории", + "loc.input.help.changeLogLabels": "С помощью этого можно классифицировать изменения на основе метки, связанной с вопросом или запросом на вытягивание. Для метки можно указать отображаемое имя категории и состояние вопроса. Например, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Если изменение имеет несколько меток, приоритет имеет первая указанная метка. Оставьте это поле пустым, чтобы просмотреть плоский список вопросов или запросов на вытягивание.", + "loc.messages.GithubApiFailError": "Произошла непредвиденная ошибка.", + "loc.messages.GetTagsError": "При получении тегов произошла непредвиденная ошибка.", + "loc.messages.GetReleasesError": "При получении выпусков произошла непредвиденная ошибка.", + "loc.messages.CreateReleaseError": "При создании выпуска произошла непредвиденная ошибка.", + "loc.messages.EditReleaseError": "При изменении выпуска произошла непредвиденная ошибка.", + "loc.messages.DeleteReleaseError": "При удалении выпуска произошла непредвиденная ошибка.", + "loc.messages.CreatingRelease": "Создание выпуска для тега: %s", + "loc.messages.CreateReleaseSuccess": "Выпуск успешно создан в %s", + "loc.messages.ReleaseAlreadyExists": "Не удалось создать выпуск. Выпуск уже существует для тега: %s", + "loc.messages.EditingRelease": "Редактирование выпуска с тегом: %s", + "loc.messages.EditReleaseSuccess": "Выпуск успешно изменен", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Не найден существующий выпуск для изменения. Создание ресурса с тегом: %s", + "loc.messages.DeletingRelease": "Удаление выпуска для тега: %s", + "loc.messages.DeleteReleaseSuccess": "Выпуск успешно удален.", + "loc.messages.NoReleaseFoundToDelete": "Не найден выпуск для тега: %s. Не удалось удалить выпуск.", + "loc.messages.FetchReleaseForTag": "Получение выпуска для тега: %s", + "loc.messages.FetchReleaseForTagSuccess": "Найден выпуск для тега: %s", + "loc.messages.FetchTagForTarget": "Поиск тегов, связанных с целевой фиксацией: %s", + "loc.messages.FetchTagForTargetSuccess": "Найден тег для целевой фиксации: %s", + "loc.messages.MissingAssetError": "Файл не найден: %s", + "loc.messages.MultipleReleasesFoundError": "Ожидался только 1 выпуск, но обнаружено больше 1 выпуска для тега: %s. Не удалось выполнить действие.", + "loc.messages.MultipleTagFound": "Ожидался только 1 тег, но обнаружено больше 1 тега для заданной фиксации: %s. Не удалось выполнить действие.", + "loc.messages.NoTagFound": "Выпуск не будет создан, так как теги для целевой фиксации не совпадают с заданным шаблоном тега.", + "loc.messages.DeleteAllExistingAssets": "Идет удаление всех существующих ресурсов...", + "loc.messages.DuplicateAssetFound": "Обнаружен повторяющийся ресурс: %s", + "loc.messages.AssetsDeletedSuccessfully": "Ресурсы успешно удалены.", + "loc.messages.DeletingDuplicateAsset": "Удаление повторяющегося ресурса: %s", + "loc.messages.SkipDuplicateAssetFound": "Обнаружен дублирующийся ресурс: %s. Пропуск...", + "loc.messages.AssetDeletedSuccessfully": "Ресурс %s успешно удален", + "loc.messages.AllAssetsUploadedSuccessfully": "Все активы успешно отправлены.", + "loc.messages.ErrorDeletingDuplicateAsset": "При удалении повторяющегося ресурса произошла непредвиденная ошибка: %s", + "loc.messages.ErrorDeletingAsset": "Произошла непредвиденная ошибка при удалении ресурса: %s", + "loc.messages.DeletingAsset": "Удаление ресурса: %s", + "loc.messages.NoAssetFoundToDelete": "Не найдены ресурсы для удаления.", + "loc.messages.UploadingAssets": "Идет отправка ресурсов...", + "loc.messages.UploadingAsset": "Идет отправка файла: \"%s\".", + "loc.messages.UploadAssetError": "При загрузке файла сертификата возникла непредвиденная ошибка: %s", + "loc.messages.UploadAssetSuccess": "Файл успешно отправлен: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Не найдены ресурсы для отправки.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Файл заметок о выпуске %s является каталогом, а не файлом.", + "loc.messages.AssetIsDirectoryError": "Ресурс является каталогом, а не файлом. Пропуск отправки каталога: %s", + "loc.messages.ComputingChangeLog": "Вычисление изменений, внесенных в этом выпуске...", + "loc.messages.ComputingChangeLogSuccess": "Изменения успешно вычислены.", + "loc.messages.CommitDiffBehind": "Не удается вычислить изменения, так как указанная целевая фиксация старше фиксации последнего опубликованного выпуска.", + "loc.messages.CommitDiffEqual": "Изменения не найдены. Указанная целевая фиксация совпадает с фиксацией последнего опубликованного выпуска.", + "loc.messages.FetchLatestPublishRelease": "Получение последнего опубликованного выпуска...", + "loc.messages.FetchLatestNonDraftRelease": "Получение последнего выпуска, отличного от чернового...", + "loc.messages.FetchLastReleaseByTag": "Получение последнего выпуска, соответствующего шаблону тега: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Найден последний опубликованный выпуск: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Найден последний выпуск, отличный от чернового", + "loc.messages.FetchTagMatchingReleaseSuccess": "Найдена последняя версия, соответствующая шаблону тега: %s", + "loc.messages.GetLatestReleaseError": "При получении последнего опубликованного выпуска произошла непредвиденная ошибка.", + "loc.messages.NoLatestPublishRelease": "Пока нет выпусков, опубликованных в репозитории.", + "loc.messages.NoMatchingReleases": "Выпуски, отличные от черновых, не найдены.", + "loc.messages.NoTagMatchingReleases": "Не найдены выпуски, соответствующие шаблону тега: %s ", + "loc.messages.FetchCommitDiff": "Получение списка фиксаций со времени последнего опубликованного выпуска...", + "loc.messages.FetchCommitDiffSuccess": "Найден список изменений.", + "loc.messages.FetchCommitDiffError": "При получении списка изменений произошла непредвиденная ошибка.", + "loc.messages.FetchInitialCommit": "Получение начальной фиксации...", + "loc.messages.FetchInitialCommitSuccess": "Найдена начальная фиксация: %s", + "loc.messages.InvalidGitHubEndpoint": "Недопустимая конечная точка службы GitHub: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Недопустимая схема подключения службы GitHub: %s. Разрешены только соединения с личным маркером доступа GitHub и OAuth.", + "loc.messages.FetchInitialCommitError": "При получении начальной фиксации произошла непредвиденная ошибка.", + "loc.messages.InvalidActionSet": "Недопустимое действие: %s. Разрешены только действия \"create\", \"edit\" или \"delete\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Недопустимый источник тегов: %s. Разрешены только параметры \"auto\" или \"manual\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Недопустимый источник заметок о выпуске: %s. Разрешены только параметры \"file\" и \"input\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Недопустимый атрибут compareWith: %s. Разрешены только параметры lastFullRelease, lastNonDraftRelease или lastNonDraftReleaseByTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Недопустимый режим отправки ресурса: %s. Разрешены только параметры \"delete\" и \"replace\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Для действия \"%s\" требуется тег. Укажите тег в шаге. Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Для источника тегов задан параметр \"manual\", укажите тег для действия \"create\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Не найдены файлы, соответствующие \"%s\". Нет элементов для отправки.", + "loc.messages.PatternIsADirectory": "Не удается отправить \"%s\", так как это каталог. Укажите файл.", + "loc.messages.SearchingFileMatchingPattern": "Поиск файлов, соответствующих \"%s\".", + "loc.messages.IssuesFetchError": "Ошибка при получении вопросов. Не удается создать журнал изменений.", + "loc.messages.NoIssuesLinkedError": "Нет вопросов, связанных с фиксациями в указанном инструменте сравнения фиксаций.", + "loc.messages.LabelsSyntaxError": "При синтаксическом анализе меток произошла ошибка. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Недопустимый атрибут ChangeLogType: %s. Разрешены только параметры commitBased или issueBased. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Изменения", + "loc.messages.DefaultCategory": "Другие", + "loc.messages.SeeMoreText": "Дополнительные сведения" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..d994b6691e5a --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 发布", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/AA3aeiw)", + "loc.description": "创建、编辑或删除 GitHub 发布", + "loc.instanceNameFormat": "GitHub 发布($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog 配置", + "loc.input.label.gitHubConnection": "GitHub 连接(OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定要用于连接到 GitHub 存储库的 GitHub 服务连接的名称。该连接必须基于 GitHub 用户的 OAuth 或 GitHub 个人访问令牌。可在[此处](https://aka.ms/AA3am5s)详细了解服务连接。", + "loc.input.label.repositoryName": "存储库", + "loc.input.help.repositoryName": "指定将在其中创建、编辑或删除 GitHub 发布的 GitHub 存储库的名称。", + "loc.input.label.action": "操作", + "loc.input.help.action": "指定要执行的发布操作的类型。此任务可以创建、编辑或删除 GitHub 发布。", + "loc.input.label.target": "目标", + "loc.input.help.target": "指定将为其创建 GitHub 发布的提交 SHA。例如 `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。还可以在此处使用变量。例如 `$(myCommitSHA)`。", + "loc.input.label.tagSource": "标记源", + "loc.input.help.tagSource": "指定要用于发布创建的标记。“Git 标记”选项会自动接受与 Git 提交关联的标记。使用“用户指定的标记”选项手动提供标记。", + "loc.input.label.tagPattern": "标记模式", + "loc.input.help.tagPattern": " 使用正则表达式(如 `release-v1.*`)指定 git 标记模式。仅将针对具有匹配的 git 标记的提交创建 GitHub 发布。", + "loc.input.label.tag": "标记", + "loc.input.help.tag": "指定要为其创建、编辑或删除发布的标记。还可以在此处使用变量。例如 `$(myTagName)`。", + "loc.input.label.title": "发布标题", + "loc.input.help.title": "指定 GitHub 发布的标题。如果留空,则将使用标记作为发布标题。", + "loc.input.label.releaseNotesSource": "发行说明源", + "loc.input.help.releaseNotesSource": "指定 GitHub 发布的说明。使用“发行说明文件”选项将文件内容用作发行说明。使用“内联发行说明”选项手动输入发行说明。", + "loc.input.label.releaseNotesFile": "发行说明文件路径", + "loc.input.help.releaseNotesFile": "选择包含发行说明的文件。", + "loc.input.label.releaseNotes": "发行说明", + "loc.input.help.releaseNotes": "在此处输入发行说明。支持 Markdown。", + "loc.input.label.assets": "资产", + "loc.input.help.assets": "指定要作为发布的资产进行上传的文件。可以使用通配符指定多个文件。例如,对于生成管道,可以指定 `$(Build.ArtifactStagingDirectory)/*.zip`,对于发布管道,可以指定 `$(System.DefaultWorkingDirectory)/*.zip`。还可以指定多个模式 - 每行一个。默认情况下,将上传 $(Build.ArtifactStagingDirectory) 目录中的所有文件。若要了解有关可用预定义变量列表的详细信息,请参阅[生成变量](https://aka.ms/AA4449z)和[发布变量](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "资产上传模式", + "loc.input.help.assetUploadMode": "使用“删除现有资产”选项首先删除发布中的任何现有资产,然后上传所有资产。使用“替换现有资产”选项替换具有相同名称的任何资产。", + "loc.input.label.isDraft": "草稿发布", + "loc.input.help.isDraft": "指示是否应将发布另存为草稿(未发布)。如果为 `false`,则发布此发布。", + "loc.input.label.isPreRelease": "预发布", + "loc.input.help.isPreRelease": "指示是否应将发布标记为预发布。", + "loc.input.label.addChangeLog": "添加更改日志", + "loc.input.help.addChangeLog": "如果设置为 `true`,则将生成此发布与上次发布的发布之间的更改(提交和问题)列表,并追加到发行说明。", + "loc.input.label.changeLogCompareToRelease": "比较对象", + "loc.input.help.changeLogCompareToRelease": "指示应与哪个版本比较以生成更改日志: \n最新完整版本: 将当前版本与未标记为预发布的最新非草稿版本进行比较。\n最新非草稿版本: 将当前版本与最新非草稿版本进行比较。\n按标记排序的最新非草稿版本: 将当前版本与最新非草稿版本(与指定标记匹配)进行比较。还可以指定一个正则表达式而非确切的标记。", + "loc.input.label.changeLogCompareToReleaseTag": "发布标记", + "loc.input.help.changeLogCompareToReleaseTag": "指定发布标记的正则表达式。与此标记匹配的版本将用作 changelog 计算的基础。", + "loc.input.label.changeLogType": "Changelog 类型", + "loc.input.help.changeLogType": "Changelog 可以基于提交或基于问题。基于提交的 changelog 列出版本中包含的所有提交,而基于问题的 changelog 列出该版本中包含的所有问题/拉取请求。", + "loc.input.label.changeLogLabels": "类别", + "loc.input.help.changeLogLabels": "使用此项,可根据与问题/PR 相关的标签对更改进行分类。对于标签,可提及类别的显示名称和问题状态。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果某更改具有多个标签,则优先采用第一个指定的标签。将此字段留空,以查看问题/PR 的简单列表。", + "loc.messages.GithubApiFailError": "发生意外错误。", + "loc.messages.GetTagsError": "提取标记时出现意外错误。", + "loc.messages.GetReleasesError": "提取发布时出现意外错误。", + "loc.messages.CreateReleaseError": "创建发布时出现意外错误。", + "loc.messages.EditReleaseError": "编辑发布时出现意外错误。", + "loc.messages.DeleteReleaseError": "删除发布时出现意外错误。", + "loc.messages.CreatingRelease": "正在创建标记的发布: %s", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功创建发布", + "loc.messages.ReleaseAlreadyExists": "未能创建发布。已存在以下标记的发布: %s", + "loc.messages.EditingRelease": "正在使用以下标记编辑发布: %s", + "loc.messages.EditReleaseSuccess": "已成功编辑发布", + "loc.messages.NoReleaseFoundToEditCreateRelease": "未找到要编辑的现有发布。请使用以下标记创建一个发布: %s", + "loc.messages.DeletingRelease": "正在删除标记的发布: %s", + "loc.messages.DeleteReleaseSuccess": "已成功删除版本。", + "loc.messages.NoReleaseFoundToDelete": "未找到以下标记的任何发布: %s。删除发布失败。", + "loc.messages.FetchReleaseForTag": "正在提取以下标记的发布: %s", + "loc.messages.FetchReleaseForTagSuccess": "已找到以下标记的发布: %s", + "loc.messages.FetchTagForTarget": "正在搜索与目标提交相关的标记: %s", + "loc.messages.FetchTagForTargetSuccess": "已找到目标提交的标记: %s", + "loc.messages.MissingAssetError": "找不到文件: %s", + "loc.messages.MultipleReleasesFoundError": "应仅为 1 个发布,但为标记 %s 找到多个发布。无法执行该操作。", + "loc.messages.MultipleTagFound": "应仅为 1 个标记,但为给定提交 %s 找到多个标记。无法执行该操作。", + "loc.messages.NoTagFound": "将不会创建发布,因为目标提交的标记与给定的标记模式不匹配。", + "loc.messages.DeleteAllExistingAssets": "正在删除所有现有资产...", + "loc.messages.DuplicateAssetFound": "找到重复资产: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功删除资产。", + "loc.messages.DeletingDuplicateAsset": "正在删除重复资产: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重复资产: %s。正在跳过...", + "loc.messages.AssetDeletedSuccessfully": "资产 %s 已成功删除", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上传所有资产。", + "loc.messages.ErrorDeletingDuplicateAsset": "删除重复资产时出现意外错误: %s", + "loc.messages.ErrorDeletingAsset": "删除资产时出现意外错误: %s", + "loc.messages.DeletingAsset": "正在删除资产: %s", + "loc.messages.NoAssetFoundToDelete": "未找到要删除的资产。", + "loc.messages.UploadingAssets": "正在上传资产...", + "loc.messages.UploadingAsset": "正在上传文件:“%s”。", + "loc.messages.UploadAssetError": "上传文件时出现意外错误: %s", + "loc.messages.UploadAssetSuccess": "已成功上传文件:“%s”", + "loc.messages.NoAssetFoundToUpload": "未找到要上传的资产。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "发行说明文件 %s 是目录,而不是文件。", + "loc.messages.AssetIsDirectoryError": "资产是目录,而不是文件。正在跳过上传目录: %s", + "loc.messages.ComputingChangeLog": "正在计算此发布中所做的更改...", + "loc.messages.ComputingChangeLogSuccess": "已成功计算更改。", + "loc.messages.CommitDiffBehind": "无法计算更改,因为所提供的目标提交早于上次发行版的提交。", + "loc.messages.CommitDiffEqual": "未找到任何更改。提供的目标提交与上次发行版的提交相同。", + "loc.messages.FetchLatestPublishRelease": "正在提取最新发布的发布...", + "loc.messages.FetchLatestNonDraftRelease": "正在提取最新非草稿版本…", + "loc.messages.FetchLastReleaseByTag": "正在提取与标记模式匹配的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "已找到最新发布的发布: %s", + "loc.messages.FetchMatchingReleaseSuccess": "已找到最新非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "已找到与标记模式匹配的最新版本: %s", + "loc.messages.GetLatestReleaseError": "提取最新发布的发布时出现意外错误。", + "loc.messages.NoLatestPublishRelease": "存储库中尚未发布任何发布。", + "loc.messages.NoMatchingReleases": "未找到非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到与标记模式匹配的版本: %s", + "loc.messages.FetchCommitDiff": "正在提取自上次发布的发布以来的提交列表...", + "loc.messages.FetchCommitDiffSuccess": "已找到更改列表。", + "loc.messages.FetchCommitDiffError": "提取更改列表时出现意外错误。", + "loc.messages.FetchInitialCommit": "正在提取初始提交...", + "loc.messages.FetchInitialCommitSuccess": "已找到初始提交: %s", + "loc.messages.InvalidGitHubEndpoint": "无效的 GitHub 服务终结点: %s。", + "loc.messages.InvalidEndpointAuthScheme": "无效的 GitHub 服务连接方案: %s。仅允许 OAuth 和 GitHub 个人访问令牌连接。", + "loc.messages.FetchInitialCommitError": "提取初始提交时出现意外错误。", + "loc.messages.InvalidActionSet": "无效的操作: %s。仅允许“创建”、“编辑”或“删除”操作。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "无效的标记源: %s。仅允许“自动”或“手动”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "无效的发行说明源: %s。仅允许“文件”或“输入”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "无效的 compareWith 属性: %s。仅允许 \"lastFullRelease\"、\"lastNonDraftRelease\" 或 \"lastNonDraftReleaseByTag\" 选项。对于 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "无效的资产上传模式: %s。仅允许“删除”或“替换”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "对于“%s”操作,标记是必需的。请在步骤中指定一个标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "标记源设置为手动- 请指定创建操作的标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "未找到与“%s”匹配的文件。没有要上传的内容。", + "loc.messages.PatternIsADirectory": "无法上传“%s”,因为它是一个目录。请指定一个文件。", + "loc.messages.SearchingFileMatchingPattern": "正在搜索匹配“%s”的文件。", + "loc.messages.IssuesFetchError": "提取问题时出错。无法生成更改日志。", + "loc.messages.NoIssuesLinkedError": "在指定提交差异中,未将任何问题链接到提交。", + "loc.messages.LabelsSyntaxError": "分析标签时出错。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "无效的 ChangeLogType 属性: %s。仅允许 \"commitBased\" 或 \"issueBased\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "更改", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..13558636c169 --- /dev/null +++ b/_generated/GitHubReleaseV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 版本", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/AA3aeiw)", + "loc.description": "建立、編輯或刪除 GitHub 版本", + "loc.instanceNameFormat": "GitHub 版本 ($(action))", + "loc.group.displayName.changeLogConfiguration": "變更記錄組態", + "loc.input.label.gitHubConnection": "GitHub 連線 (OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定用來連線到 GitHub 存放庫的 GitHub 服務連線名稱。該連線必須根據 GitHub 使用者的 OAuth 或 GitHub 個人存取權杖來進行。若要深入了解服務連線,請前往 [這裡](https://aka.ms/AA3am5s)。", + "loc.input.label.repositoryName": "存放庫", + "loc.input.help.repositoryName": "指定建立、編輯或刪除 GitHub 版本所在的 GitHub 存放庫名稱。", + "loc.input.label.action": "動作", + "loc.input.help.action": "指定要執行的版本作業類型。這項工作可以建立、編輯或刪除 GitHub 版本。", + "loc.input.label.target": "目標", + "loc.input.help.target": "指定要建立 GitHub 版本的認可 SHA。例如 '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'。您也可以在這裡使用變數。例如 '$(myCommitSHA)'。", + "loc.input.label.tagSource": "標籤來源", + "loc.input.help.tagSource": "指定要用來建立版本的標籤。[Git 標籤] 選項會自動使用與 Git 認可建立關聯的標籤。使用 [使用者指定的標籤] 可手動提供標籤。", + "loc.input.label.tagPattern": "標籤模式", + "loc.input.help.tagPattern": " 使用 Regex (例如 `release-v1.*`) 指定 git 標籤模式。僅針對具有相符 git 標籤的認可建立 GitHub 版本。", + "loc.input.label.tag": "標籤", + "loc.input.help.tag": "指定要建立、編輯或刪除版本的標籤。您也可以在這裡使用變數。例如 '$(myTagName)'。", + "loc.input.label.title": "版本標題", + "loc.input.help.title": "指定 GitHub 版本的標題。如果保留空白,將使用標籤作為版本標題。", + "loc.input.label.releaseNotesSource": "版本資訊來源", + "loc.input.help.releaseNotesSource": "指定 GitHub 版本的描述。使用 [版本資訊檔案] 選項可使用檔案內容作為版本資訊。使用 [內嵌版本資訊] 選項可手動輸入版本資訊。", + "loc.input.label.releaseNotesFile": "版本資訊檔案路徑", + "loc.input.help.releaseNotesFile": "選取包含版本資訊的檔案。", + "loc.input.label.releaseNotes": "版本資訊", + "loc.input.help.releaseNotes": "請在這裡輸入版本資訊。支援 Markdown。", + "loc.input.label.assets": "資產", + "loc.input.help.assets": "指定要上傳為版本資產的檔案。您可以使用萬用字元來指定多個檔案。例如若為建置管線,請使用 `$(Build.ArtifactStagingDirectory)/*.zip`; 若為發行管線,請使用 `$(System.DefaultWorkingDirectory)/*.zip`。您也可以指定多個模式,每行指定一個。根據預設會上傳 $(Build.ArtifactStagingDirectory) 目錄中的所有檔案。若要深入了解可用預先定義變數的清單,請參閱 [建置變數](https://aka.ms/AA4449z) 和 [發行變數](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "資產上傳模式", + "loc.input.help.assetUploadMode": "使用 [刪除現有的資產] 選項可先刪除版本中任何現有的資產,再上傳所有資產。使用 [取代現有的資產] 選項可取代同名的所有資產。", + "loc.input.label.isDraft": "草稿版本", + "loc.input.help.isDraft": "指出是否應將版本儲存為草稿 (未發佈)。如果是 'false',將會發佈版本。", + "loc.input.label.isPreRelease": "發行前版本", + "loc.input.help.isPreRelease": "指出是否應將版本標記為發行前版本。", + "loc.input.label.addChangeLog": "新增變更記錄", + "loc.input.help.addChangeLog": "如果設定為 'true',將會產生此版本和上次所發佈版本間變更 (認可和問題) 的清單,並附加到版本資訊。", + "loc.input.label.changeLogCompareToRelease": "比較對象", + "loc.input.help.changeLogCompareToRelease": "指出應比較的版本以產生變更記錄: \n最後完整版本: 比較目前版本與未標示為發行前版本的最新非草稿版本。\n最後非草稿版本: 比較目前版本與最新的非草稿版本。\n依標籤決定的最後非草稿版本: 比較目前版本與符合指定標籤的最後非草稿版本。您也可以指定 Regex,而不指定具體的標籤。", + "loc.input.label.changeLogCompareToReleaseTag": "版本標籤", + "loc.input.help.changeLogCompareToReleaseTag": "指定 Regex 為版本標籤。符合此標籤的版本會用作變更記錄計算的基底。", + "loc.input.label.changeLogType": "變更記錄類型", + "loc.input.help.changeLogType": "變更記錄可依據認可或問題來進行記錄。以認可為依據的變更記錄,會列出版本內含的所有認可,而以問題為依據的變更記錄,則會列出版本內含的所有問題/提取要求。", + "loc.input.label.changeLogLabels": "類別", + "loc.input.help.changeLogLabels": "使用此項即可依據與問題/pr 建立關聯的標籤將變更分類。針對標籤,您可以提及類別的顯示名稱及問題的狀態。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果變更有多個標籤,則優先使用第一個指定的標籤。此欄位請保留空白,以查看問題/pr 的簡單列表。", + "loc.messages.GithubApiFailError": "發生未預期的錯誤。", + "loc.messages.GetTagsError": "擷取標籤時發生未預期的錯誤。", + "loc.messages.GetReleasesError": "擷取版本時發生未預期的錯誤。", + "loc.messages.CreateReleaseError": "建立版本時發生未預期的錯誤。", + "loc.messages.EditReleaseError": "編輯版本時發生未預期的錯誤。", + "loc.messages.DeleteReleaseError": "刪除版本時發生未預期的錯誤。", + "loc.messages.CreatingRelease": "正在建立標籤 %s 的版本", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功建立版本", + "loc.messages.ReleaseAlreadyExists": "無法建立版本。已有標籤 %s 的版本", + "loc.messages.EditingRelease": "正在編輯標籤為 %s 的版本", + "loc.messages.EditReleaseSuccess": "已成功編輯版本", + "loc.messages.NoReleaseFoundToEditCreateRelease": "找不到任何要編輯的現有版本。正在使用標籤 %s 建立一個", + "loc.messages.DeletingRelease": "正在刪除標籤 %s 的版本", + "loc.messages.DeleteReleaseSuccess": "已成功刪除版本。", + "loc.messages.NoReleaseFoundToDelete": "找不到標籤 %s 的版本。刪除版本失敗。", + "loc.messages.FetchReleaseForTag": "正在擷取標籤 %s 的版本", + "loc.messages.FetchReleaseForTagSuccess": "找到標籤 %s 的版本", + "loc.messages.FetchTagForTarget": "正在搜尋與目標認可 %s 建立關聯的標籤", + "loc.messages.FetchTagForTargetSuccess": "找到目標認可 %s 的標籤", + "loc.messages.MissingAssetError": "找不到檔案: %s", + "loc.messages.MultipleReleasesFoundError": "標籤 %s 只應有 1 個版本,但卻找到多個版本。無法執行此動作。", + "loc.messages.MultipleTagFound": "指定的認可 %s 只應有 1 個標籤,但卻找到多個標籤。無法執行此動作。", + "loc.messages.NoTagFound": "因為目標認可與指定的標籤模式不符,所以不會將版本建立為標籤。", + "loc.messages.DeleteAllExistingAssets": "正在刪除所有現有的資產...", + "loc.messages.DuplicateAssetFound": "找到重複的資產: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功刪除資產。", + "loc.messages.DeletingDuplicateAsset": "正在刪除重複的資產: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重複的資產 %s。正在跳過...", + "loc.messages.AssetDeletedSuccessfully": "已成功刪除資產 %s", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上傳所有資產。", + "loc.messages.ErrorDeletingDuplicateAsset": "刪除重複的資產 %s 時發生未預期的錯誤", + "loc.messages.ErrorDeletingAsset": "刪除資產 %s 時發生未預期的錯誤", + "loc.messages.DeletingAsset": "正在刪除資產: %s", + "loc.messages.NoAssetFoundToDelete": "找不到任何要刪除的資產。", + "loc.messages.UploadingAssets": "正在上傳資產...", + "loc.messages.UploadingAsset": "正在上傳檔案: '%s'。", + "loc.messages.UploadAssetError": "上傳檔案 %s 時發生未預期的錯誤", + "loc.messages.UploadAssetSuccess": "已成功上傳檔案: '%s'", + "loc.messages.NoAssetFoundToUpload": "找不到任何要上傳的資產。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "版本資訊檔案 %s 是目錄,而不是檔案。", + "loc.messages.AssetIsDirectoryError": "資產是目錄,而不是檔案。正在跳過目錄的上傳: %s", + "loc.messages.ComputingChangeLog": "正在計算此版本中所做的變更...", + "loc.messages.ComputingChangeLogSuccess": "已成功計算變更。", + "loc.messages.CommitDiffBehind": "因為提供的目標認可比上次所發佈版本的認可舊,所以無法計算變更。", + "loc.messages.CommitDiffEqual": "找不到任何變更。提供的目標認可與上次所發佈版本的認可相同。", + "loc.messages.FetchLatestPublishRelease": "正在擷取最新發佈的版本...", + "loc.messages.FetchLatestNonDraftRelease": "正在擷取最新的非草稿版本...", + "loc.messages.FetchLastReleaseByTag": "正在擷取符合標籤模式的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "找到最新發佈的版本: %s", + "loc.messages.FetchMatchingReleaseSuccess": "找到最新的非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "找到符合標籤模式的最新版本: %s", + "loc.messages.GetLatestReleaseError": "擷取最新發佈的版本時發生未預期的錯誤。", + "loc.messages.NoLatestPublishRelease": "尚未在存放庫中發佈任何版本。", + "loc.messages.NoMatchingReleases": "找不到任何非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到符合標籤模式的版本: %s ", + "loc.messages.FetchCommitDiff": "正在擷取自上次所發佈版本之後的認可清單...", + "loc.messages.FetchCommitDiffSuccess": "找到變更清單。", + "loc.messages.FetchCommitDiffError": "擷取變更清單時發生未預期的錯誤。", + "loc.messages.FetchInitialCommit": "正在擷取初始認可...", + "loc.messages.FetchInitialCommitSuccess": "找到初始認可: %s", + "loc.messages.InvalidGitHubEndpoint": "GitHub 服務端點 %s 無效。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 服務連線配置 %s 無效。僅允許 OAuth 和 GitHub 個人存取權杖連線。", + "loc.messages.FetchInitialCommitError": "擷取初始認可時發生未預期的錯誤。", + "loc.messages.InvalidActionSet": "動作 %s 無效。僅允許 'create'、'edit' 或 'delete' 動作。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "標籤來源 %s 無效。僅允許 'auto' 或 'manual' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "版本資訊來源 %s 無效。僅允許 'file' 或 'input' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 屬性無效: %s。僅允許 'lastFullRelease'、'lastNonDraftRelease' 或 'lastNonDraftReleaseByTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "資產上傳模式 %s 無效。僅允許 'delete' 或 'replace' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 動作需有標籤。請在此步驟中指定標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "標籤來源已設定為 manual-,請指定建立動作的標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "找不到符合 '%s' 的檔案。沒有要上傳的項目。", + "loc.messages.PatternIsADirectory": "因為 '%s' 是目錄,所以無法予以上傳。請指定檔案。", + "loc.messages.SearchingFileMatchingPattern": "正在搜尋符合 '%s' 的檔案。", + "loc.messages.IssuesFetchError": "擷取問題時發生錯誤。無法產生變更記錄。", + "loc.messages.NoIssuesLinkedError": "沒有任何問題連結到指定認可 Diff 中的認可。", + "loc.messages.LabelsSyntaxError": "剖析標籤時發生錯誤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 屬性無效: %s。僅允許 'commitBased' 或 'issueBased' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "變更", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多內容" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/ActionL0Tests.ts b/_generated/GitHubReleaseV0/Tests/ActionL0Tests.ts new file mode 100644 index 000000000000..04ff1bf404cf --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/ActionL0Tests.ts @@ -0,0 +1,25 @@ +import { Action } from "../operations/Action"; + +export class ActionL0Tests { + + public static async startTests() { + await this.validateCreateReleaseAction(); + await this.validateEditReleaseAction(); + await this.validateDeleteReleaseAction(); + } + + public static async validateCreateReleaseAction() { + await new Action().createReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, []); + } + + public static async validateEditReleaseAction() { + await new Action().editReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, [], "id"); + } + + public static async validateDeleteReleaseAction() { + await new Action().deleteReleaseAction("endpoint", "repo", "tag"); + } + +} + +ActionL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/ActionTests.ts b/_generated/GitHubReleaseV0/Tests/ActionTests.ts new file mode 100644 index 000000000000..519bef69bc0f --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/ActionTests.ts @@ -0,0 +1,63 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import * as sinon from 'sinon'; +import { Inputs } from '../operations/Constants'; + +export class ActionTests { + + public static startTest() { + let tp = path.join(__dirname, 'ActionL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.assetUploadMode, "replace"); + + this.stub(tr); + + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + createRelease: async function() { + return { + statusCode: 201, + body: { "upload_url": "url" } + } + }, + editRelease: function() { + return { + statusCode: 200, + body: { "html_url": "url" } + } + }, + deleteRelease: function() { + return { + statusCode: 204 + } + }, + uploadReleaseAsset: function() { + return { + statusCode: 201 + } + } + } + } + }); + + tr.registerMock("./Helper", { + Helper: function () { + return { + getReleaseIdForTag: function() { + return "id"; + } + } + } + }); + } + +} + +ActionTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/ChangeLogL0Tests.ts b/_generated/GitHubReleaseV0/Tests/ChangeLogL0Tests.ts new file mode 100644 index 000000000000..2e6e8057ddde --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/ChangeLogL0Tests.ts @@ -0,0 +1,61 @@ +import { ChangeLog } from "../operations/ChangeLog"; +import { TestString } from "./TestStrings"; +import { ChangeLogStartCommit } from "../operations/Utility"; + +export class ChangeLogL0Tests { + public static async startTests() { + await this.validateGetChangeLog1(); + await this.validateGetChangeLog2(); + await this.validateGetChangeLog3(); + await this.validateGetChangeLog4(); + await this.validateGetChangeLog5(); + await this.validateGetChangeLog6(); + } + + public static async validateGetChangeLog1() { + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "commitBased"); + + if (changes === this.expectedCommitBasedChanges) { + console.log(TestString.getChangeLogKeyword); + } + } + + public static async validateGetChangeLog2() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftRelease, "commitBased"); + } + + public static async validateGetChangeLog3() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftReleaseByTag, "commitBased", "v1.*"); + } + + public static async validateGetChangeLog4(){ + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, []); + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.allIssuesChangeLog); + } + } + + public static async validateGetChangeLog5(){ + let changeLogLabels = `[{"label": "ux", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "bug", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + if (changes === this.expectedIssueBasedChanges) { + console.log(TestString.issueBasedChangeLog); + } + } + + public static async validateGetChangeLog6(){ + let changeLogLabels = `[{"label": "hello", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "nope", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.noCategoryChangeLog); + } + } + + public static readonly expectedCommitBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* xyz Fixing issue #56. [ #9 ]\n* abc Fixing issue #2 #3. [ #4, #5 ]\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedAllIssuesChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* #1: Incorrect color contrast in control panel\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedIssueBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n\n### Closed UX Issues/PRs:\n\n\n* #1: Incorrect color contrast in control panel\n\n### Open Bugs:\n\n\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + +} + +ChangeLogL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/ChangeLogTests.ts b/_generated/GitHubReleaseV0/Tests/ChangeLogTests.ts new file mode 100644 index 000000000000..57020cde2f6c --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/ChangeLogTests.ts @@ -0,0 +1,170 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class ChangeLogTests { + + public static startTest() { + let tp = path.join(__dirname, 'ChangeLogL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + process.env["RELEASE_RELEASEWEBURL"] = "MOCK_RELEASE_URL"; + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Helper", { + Helper: function () { + return { + getCommitShaFromTarget: function() { + return "abc"; + }, + filterTag: function(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]) { + console.log("Tag Name: "+ filterValue); + return { commit: { sha: "abc" } }; + } + } + } + }); + + tr.registerMock("./Release", { + Release: function () { + return { + getLatestRelease: function() { + return { + statusCode: 200, + body: { "tag_name": "tagName" } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + { + "tag_name": "pre_rel", + "prerelease": true, + "draft": false + }, + { + "tag_name": "v1.2", + "prerelease": false, + "draft": false + } + ] + } + }, + getCommitsList: function() { + return { + statusCode: 200, + body: { "commits": [ + {"sha": "abc", "commit": { "message": "Fixing issue #2 #3.\n\n desc #4 GH-5" } }, + {"sha": "xyz", "commit": { "message": "Fixing issue #56.\n\n desc Gh-9" } } + ] } + }; + }, + getIssuesList: function (githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + if (includeLabels) { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + "labels": { + "edges": [ + { + "node": { + "name": "nit" + } + }, + { + "node": { + "name": "bug" + } + } + ] + } + } + } + } + } + } + } + else { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + } + } + } + } + } + } + } + } + } + }); + } +} + +ChangeLogTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/CreateAction2L0Tests.ts b/_generated/GitHubReleaseV0/Tests/CreateAction2L0Tests.ts new file mode 100644 index 000000000000..55d1137747b4 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/CreateAction2L0Tests.ts @@ -0,0 +1,48 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "auto"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCommitTarget: function() { + return null; + }, + publishTelemetry: function() { + + } + } + } + }); + } + + public static sandbox; +} + +CreateAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/CreateActionL0Tests.ts b/_generated/GitHubReleaseV0/Tests/CreateActionL0Tests.ts new file mode 100644 index 000000000000..cfdafc98460e --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/CreateActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "tag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCreateAction: function() { + return "v1.0.1"; + }, + publishTelemetry: function() { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called"); // = this.createActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +CreateActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/DeleteAction2L0Tests.ts b/_generated/GitHubReleaseV0/Tests/DeleteAction2L0Tests.ts new file mode 100644 index 000000000000..e32bf396eaae --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/DeleteAction2L0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "Delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteAction2KeyWord) }); + } + + public static sandbox; +} + +DeleteAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/DeleteActionL0Tests.ts b/_generated/GitHubReleaseV0/Tests/DeleteActionL0Tests.ts new file mode 100644 index 000000000000..8c692e965ce8 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/DeleteActionL0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteActionKeyWord) }); + } + + public static sandbox; +} + +DeleteActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/EditAction2L0Tests.ts b/_generated/GitHubReleaseV0/Tests/EditAction2L0Tests.ts new file mode 100644 index 000000000000..5720d1c3f268 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/EditAction2L0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return "123"; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + editReleaseAction: () => { + console.log("L0Test: edit release action method should be called when a release is present for given tag"); // = this.editAction2KeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/EditActionL0Tests.ts b/_generated/GitHubReleaseV0/Tests/EditActionL0Tests.ts new file mode 100644 index 000000000000..8b366d15e3c1 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/EditActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return null; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called when no release is present for given tag"); // = this.editActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/HelperL0Tests.ts b/_generated/GitHubReleaseV0/Tests/HelperL0Tests.ts new file mode 100644 index 000000000000..07dace6e6eb8 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/HelperL0Tests.ts @@ -0,0 +1,47 @@ +import { Helper } from "../operations/Helper"; +import { TestString } from "./TestStrings"; + +export class HelperL0Tests { + public static async startTests() { + await this.validateGetTagForCreateAction(); + await this.validateGetTagForCreateActionWithTagPattern(); + await this.validateGetCommitShaFromTarget(); + await this.validateGetReleaseIdForTag(); + } + + public static async validateGetTagForCreateAction() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "abc"); + + if (tag === "tagName") { + console.log(TestString.getTagForCreateActionKeyword); + } + } + + public static async validateGetTagForCreateActionWithTagPattern() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "bcd", "v1.*"); + + if (tag === "v1.12") { + console.log(TestString.getTagForCreateActionWithTagPatternKeyword); + } + } + + public static async validateGetCommitShaFromTarget() { + let target = "master"; + let sha = await new Helper().getCommitShaFromTarget("endpoint", "repo", target); + + if (sha === "abc") { + console.log(TestString.getCommitShaFromTargetKeyword); + } + } + + public static async validateGetReleaseIdForTag() { + let releaseId = await new Helper().getReleaseIdForTag("endpoint", "repo", "tagName"); + + if (releaseId === 456) { + console.log(TestString.getReleaseIdForTagKeyword); + } + } + +} + +HelperL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/HelperTests.ts b/_generated/GitHubReleaseV0/Tests/HelperTests.ts new file mode 100644 index 000000000000..d04fb89eb0d5 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/HelperTests.ts @@ -0,0 +1,67 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class HelperTests { + + public static startTest() { + let tp = path.join(__dirname, 'HelperL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + getTags: function() { + return { + statusCode: 200, + headers: { "link": ""}, + body: [ + { + "commit": { "sha": "abc" }, + "name": "tagName" + }, + { + "commit": { "sha": "bcd" }, + "name": "test" + }, + { + "commit": { "sha": "bcd" }, + "name": "v1.12" + } + ] + } + }, + getBranch: function(githubEndpointToken: string, repositoryName: string, target: string) { + + return { + statusCode: 200, + body: { commit: { sha: target === "master"? "abc":target } } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + {"tag_name": "abc", "id": 123}, + {"tag_name": "tagName", "id": 456} + ], + headers: {} + } + } + } + } + }); + } +} + +HelperTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/InvalidActionL0Tests.ts b/_generated/GitHubReleaseV0/Tests/InvalidActionL0Tests.ts new file mode 100644 index 000000000000..7bf27ba512fc --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/InvalidActionL0Tests.ts @@ -0,0 +1,34 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class InvalidActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "creadte"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tag, "tag"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + } + + public static sandbox; +} + +InvalidActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/L0.ts b/_generated/GitHubReleaseV0/Tests/L0.ts new file mode 100644 index 000000000000..2c065aa90f4e --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/L0.ts @@ -0,0 +1,136 @@ +import * as path from 'path'; +import * as assert from 'assert'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { TestString } from './TestStrings'; + +describe('GitHubReleaseTaskTests Suite', function() { + this.timeout(60000); + + it('Validate delete action is called when action = delete.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteActionKeyWord) >= 0, 'should have printed: ' + TestString.deleteActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = create', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createActionKeyWord) >= 0, 'should have printed: ' + TestString.createActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = edit but no release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editActionKeyWord) >= 0, 'should have printed: ' + TestString.editActionKeyWord); + + done(); + }); + + it('Validate edit action is called when action = edit but a release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editAction2KeyWord) >= 0, 'should have printed: ' + TestString.editAction2KeyWord); + + done(); + }); + + it('Validate delete action is called when action = Delete. Validating if action is case insensitive or not.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteAction2KeyWord) >= 0, 'should have printed: ' + TestString.deleteAction2KeyWord); + + done(); + }); + + it('Validate task fails with correct error when action = create and no tag is present.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.NoTagFoundKeyword) >= 0, 'should have printed: ' + TestString.NoTagFoundKeyword); + + done(); + }); + + it('Validate task fails with correct error when action input is invalid', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'InvalidActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.InvalidActionKeyword) >= 0, 'should have printed: ' + TestString.InvalidActionKeyword); + + done(); + }); + + it('Validate Utility class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'UtilityL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getReleaseNoteKeyword) >= 0, 'should have printed: ' + TestString.getReleaseNoteKeyword); + assert(tr.stdout.search(TestString.validBranchNameKeyword) >= 0, 'should have printed: ' + TestString.validBranchNameKeyword); + assert(tr.stdout.search(TestString.invalidBranchNameKeyword) >= 0, 'should have printed: ' + TestString.invalidBranchNameKeyword); + assert(tr.stdout.search(TestString.tagMatchingKeyword) >= 0, 'should have printed: ' + TestString.tagMatchingKeyword); + assert(tr.stdout.search(TestString.parseHTTPHeaderLinkKeyword) >= 0, 'should have printed: ' + TestString.parseHTTPHeaderLinkKeyword); + assert(tr.stdout.search(TestString.extractRepositoryOwnerAndNameKeyword) >= 0, 'should have printed: ' + TestString.extractRepositoryOwnerAndNameKeyword); + assert(tr.stdout.search(TestString.extractRepoAndIssueIdKeyword) >= 0, 'should have printed: ' + TestString.extractRepoAndIssueIdKeyword); + assert(tr.stdout.search(TestString.getFirstLineKeyword) >= 0, 'should have printed: ' + TestString.getFirstLineKeyword); + + done(); + }); + + it('Validate Helper class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'HelperTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getTagForCreateActionKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionKeyword); + assert(tr.stdout.search(TestString.getTagForCreateActionWithTagPatternKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionWithTagPatternKeyword); + assert(tr.stdout.search(TestString.getCommitShaFromTargetKeyword) >= 0, 'should have printed: ' + TestString.getCommitShaFromTargetKeyword); + assert(tr.stdout.search(TestString.getReleaseIdForTagKeyword) >= 0, 'should have printed: ' + TestString.getReleaseIdForTagKeyword); + + done(); + }); + + it('Validate ChangeLog class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ChangeLogTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.stdout.search(TestString.getChangeLogKeyword) >= 0, 'should have printed: ' + TestString.getChangeLogKeyword); + assert(tr.stdout.search(TestString.allIssuesChangeLog) >= 0, 'should have printed: ' + TestString.allIssuesChangeLog); + assert(tr.stdout.search(TestString.issueBasedChangeLog) >= 0, 'should have printed: ' + TestString.issueBasedChangeLog); + assert(tr.stdout.search(TestString.noCategoryChangeLog) >= 0, 'should have printed: ' + TestString.noCategoryChangeLog); + assert(tr.stdout.search("Tag Name: v1.2") >=0, 'should have printed: TagName: v1.2'); + assert(tr.stdout.search("Tag Name: pre_rel") >=0, 'should have printed: TagName: pre_rel'); + assert(tr.stdout.search("Tag Name: tagName") >=0, 'should have printed: TagName: tagName'); + + done(); + }); + + it('Validate Action class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ActionTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.createReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.editReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.editReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.deleteReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.deleteReleaseSuccessKeyword); + + done(); + }); + +}); diff --git a/_generated/GitHubReleaseV0/Tests/TestStrings.ts b/_generated/GitHubReleaseV0/Tests/TestStrings.ts new file mode 100644 index 000000000000..afad94c3cd22 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/TestStrings.ts @@ -0,0 +1,29 @@ + +export class TestString { + public static readonly createReleaseSuccessKeyword: string = "CreateReleaseSuccess"; + public static readonly editReleaseSuccessKeyword: string = "EditReleaseSuccess"; + public static readonly deleteReleaseSuccessKeyword: string = "DeleteReleaseSuccess"; + public static readonly getChangeLogKeyword: string = "getChangeLog method should work properly"; + public static readonly NoTagFoundKeyword: string = "No tag found"; + public static readonly createActionKeyWord: string = "L0Test: create release action method should be called"; + public static readonly deleteActionKeyWord: string = "L0Test: delete action called when action = delete"; + public static readonly deleteAction2KeyWord: string = "L0Test: delete action should be called when action = Delete"; + public static readonly editAction2KeyWord: string = "L0Test: edit release action method should be called when a release is present for given tag"; + public static readonly editActionKeyWord: string = "L0Test: create release action method should be called when no release is present for given tag"; + public static readonly getTagForCreateActionKeyword: string = "getTagForCreateAction method should work properly"; + public static readonly getTagForCreateActionWithTagPatternKeyword: string = "getTagForCreateAction method should work properly when tagPattern is specified"; + public static readonly getCommitShaFromTargetKeyword: string = "getCommitShaFromTarget method should work properly"; + public static readonly getReleaseIdForTagKeyword: string = "getReleaseIdForTag method should work properly"; + public static readonly InvalidActionKeyword: string = "Invalid action input"; + public static readonly getReleaseNoteKeyword: string = "getReleaseNote method should work properly"; + public static readonly validBranchNameKeyword: string = "normalizeBranchName method should return tag name when branch = refs/tags/tagname"; + public static readonly invalidBranchNameKeyword: string = "normalizeBranchName method should return undefined when branch = refs/heads/tagname"; + public static readonly parseHTTPHeaderLinkKeyword: string = "parseHTTPHeaderLink method should work properly"; + public static readonly extractRepositoryOwnerAndNameKeyword: string = "extractRepositoryOwnerAndName method should work properly"; + public static readonly extractRepoAndIssueIdKeyword: string = "extractRepoAndIssueId method should work properly"; + public static readonly getFirstLineKeyword: string = "getFirstLine method should work properly"; + public static readonly tagMatchingKeyword: string = "isTagMatching method should work properly"; + public static readonly allIssuesChangeLog: string = "getChangeLog should generate All Issues ChangeLog"; + public static readonly issueBasedChangeLog: string = "getChangeLog should generate Issue Based ChangeLog"; + public static readonly noCategoryChangeLog: string = "ChangeLog generated should be a flatlist of issues."; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/UtilityL0Tests.ts b/_generated/GitHubReleaseV0/Tests/UtilityL0Tests.ts new file mode 100644 index 000000000000..9ee3a7a7d368 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/UtilityL0Tests.ts @@ -0,0 +1,92 @@ +import { Utility } from "../operations/Utility"; +import { TestString } from "./TestStrings"; + +export class UtilityL0Tests { + + public static startTests() { + this.validateGetReleaseNote(); + this.validateNormalizeBranchName(); + this.validateIsTagMatching(); + this.validateParseHTTPHeaderLink(); + this.validateExtractRepositoryOwnerAndName(); + this.validateExtractRepoAndIssueId(); + this.validateGetFirstLine(); + } + + public static validateGetReleaseNote() { + let releaseNoteInput = "release_note_input"; + let changeLog = "change_log"; + + let releaseNote = Utility.getReleaseNote("input", null, releaseNoteInput, changeLog); + if (releaseNote === (releaseNoteInput + changeLog)) { + console.log(TestString.getReleaseNoteKeyword); + } + } + + public static validateNormalizeBranchName() { + let normalizedBranchName = ""; + + normalizedBranchName = Utility.normalizeBranchName("refs/tags/tagName"); + if (normalizedBranchName === "tagName") { + console.log(TestString.validBranchNameKeyword); + } + + normalizedBranchName = Utility.normalizeBranchName("refs/heads/tagName"); + if (!normalizedBranchName) { + console.log(TestString.invalidBranchNameKeyword); + } + } + + public static validateIsTagMatching() { + let tag = "v1.1"; + let tagPattern = "v1.*"; + if (Utility.isTagMatching(tag, tagPattern)) { + console.log(TestString.tagMatchingKeyword); + } + } + + public static validateParseHTTPHeaderLink() { + let parsedHttpHeaderLink = {}; + let headerLink = '; rel="next", ; rel="last"'; + let expectedParsedHeaderLink = { + "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + } + parsedHttpHeaderLink = Utility.parseHTTPHeaderLink(headerLink); + + if (JSON.stringify(parsedHttpHeaderLink) === JSON.stringify(expectedParsedHeaderLink)) { + console.log(TestString.parseHTTPHeaderLinkKeyword); + } + } + + public static validateExtractRepositoryOwnerAndName() { + let repoName = "owner_name/repo_name"; + let repoInfo = Utility.extractRepositoryOwnerAndName(repoName); + + if (repoInfo.owner === "owner_name" && repoInfo.name === "repo_name") { + console.log(TestString.extractRepositoryOwnerAndNameKeyword); + } + + } + + public static validateExtractRepoAndIssueId() { + let repoIssueId = "repo#26"; + let info = Utility.extractRepoAndIssueId(repoIssueId); + + if (info.repository === "repo" && info.issueId === "26") { + console.log(TestString.extractRepoAndIssueIdKeyword); + } + } + + public static validateGetFirstLine() { + let message = "Fixing issue #25.\n Description #23"; + let firstLine = Utility.getFirstLine(message); + + if (firstLine === "Fixing issue #25.") { + console.log(TestString.getFirstLineKeyword); + } + } + +} + +UtilityL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/Tests/package-lock.json b/_generated/GitHubReleaseV0/Tests/package-lock.json new file mode 100644 index 000000000000..fba73c6345b8 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/package-lock.json @@ -0,0 +1,166 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sinonjs/commons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", + "integrity": "sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "array-from": "^2.1.1", + "lodash.get": "^4.4.2" + } + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/sinon": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz", + "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "nise": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", + "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "just-extend": "^4.0.2", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "dev": true, + "requires": { + "@sinonjs/samsam": "^2 || ^3" + } + } + } + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sinon": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } + } +} diff --git a/_generated/GitHubReleaseV0/Tests/package.json b/_generated/GitHubReleaseV0/Tests/package.json new file mode 100644 index 000000000000..d56d0b905d13 --- /dev/null +++ b/_generated/GitHubReleaseV0/Tests/package.json @@ -0,0 +1,10 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "devDependencies": { + "@types/sinon": "^4.3.1", + "sinon": "^4.5.0", + "@types/mocha": "2.2.48" + } +} diff --git a/_generated/GitHubReleaseV0/ThirdPartyNotices.txt b/_generated/GitHubReleaseV0/ThirdPartyNotices.txt new file mode 100644 index 000000000000..2f2f1cc1664a --- /dev/null +++ b/_generated/GitHubReleaseV0/ThirdPartyNotices.txt @@ -0,0 +1,668 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +GitHub Release Task incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. browserify-mime (git+https://github.com/broofa/node-mime.git) +4. concat-map (https://github.com/substack/node-concat-map) +5. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +6. inflight (https://github.com/npm/inflight) +7. inherits (https://github.com/isaacs/inherits) +8. glob (git://github.com/isaacs/node-glob.git) +9. minimatch (https://github.com/isaacs/minimatch) +10. Mockery (https://github.com/mfncooper/mockery) +11. once (https://github.com/isaacs/once) +12. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +13. q (https://github.com/kriskowal/q) +14. semver (https://github.com/npm/node-semver/) +15. semver-compare (https://github.com/substack/semver-compare) +16. ShellJS (https://github.com/shelljs/shelljs) +17. tunnel (https://github.com/koichik/node-tunnel) +18. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +19. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +20. uuid (git+https://github.com/kelektiv/node-uuid.git) +21. vso-node-api (https://github.com/Microsoft/vsts-node-api) +22. azure-pipelines-task-lib (https://github.com/Microsoft/azure-pipelines-task-lib) +23. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +24. wrappy (https://github.com/npm/wrappy) +25. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +26. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/icon.png b/_generated/GitHubReleaseV0/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96e6b70c499d6b624878201c3f81424b0982054c GIT binary patch literal 1094 zcmV-M1iAZ(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00Xv3L_t(oN3B;)Xj4HDer*%{10~7+yjQ9b ztsqtuR76x1l|m6z5LB=Q5f!~u58k{K(Szv0qn>(E6#M}Z6qFu3C{(3hyi`=YNwq)z zRZB^e`pv#+OkOt6*Svf%kheSY&F<{X&c>MywAM>iMs+Hou0ZZ;A)jiYo+zpA;QKP> z4!f?KW%c^N^St@4ltH(zlA8C2=xL-l4dt{q|@nzIO_o` zK^=s+$p^cuKmt2|SY{;DFP!5ren&~ZpinXn6Gz#&Q1{`h(RWz_B;3g|MF`IBIHnSA zCbPkmU9_CYV}}hv0yr8fRFPwALQFXSv(I;V8s(S8o~ClK@AGLxu75NjRnXd%ftuR&F=mVN29qDD*VVH zgvYWnsot<*-9VeN_{q@%f`fErzGJ(3p@C}O=F6dM4-R5%By#tP0J?O*`P<@W+`(=K zgA^dOzhJ=-J_ivvu65*Mkdz?9H2JhaM z=n&cMppmS=hqc{e5nrjvFxRX>S2=N5xuu$HPBkw!iuia|oHR!wZ^G~okL3`hUY*t( zqdYRHx0ucd4%ki=d4nQkADft!c3{wSEG%Y#dO7uMeE%pKm^nEL;#)AWT~bMqK7ii0 zQkyE0M<3Y1b_Pu#?kg$?_1?S2+ zQG)Ltlwz9_;vA0SE#G91!`^hX=o$NJ0?vecPHa^!<`?LgR1K+(?!Ax9C3vv9taB1Fjrm8wlDo6XK;M>d(#LLXz* zaA1}A|5tf+l8_Tts{mDr%?9!l`EiidqJgerB+Kg{Sy(CB7J!YsjPtTeP}opjA3;XP zQV3fBHLw{ysw7m_Q4A;i*?34I2ihT>{9P5$>B152!q22X5(dZl3#0r-xPpe0SpWb4 M07*qoM6N<$f*rl~Jpcdz literal 0 HcmV?d00001 diff --git a/_generated/GitHubReleaseV0/icon.svg b/_generated/GitHubReleaseV0/icon.svg new file mode 100644 index 000000000000..f9aea8bf7966 --- /dev/null +++ b/_generated/GitHubReleaseV0/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/_generated/GitHubReleaseV0/main.ts b/_generated/GitHubReleaseV0/main.ts new file mode 100644 index 000000000000..94dc380d32df --- /dev/null +++ b/_generated/GitHubReleaseV0/main.ts @@ -0,0 +1,133 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import { Action } from "./operations/Action"; +import { Utility, ActionType, Delimiters, ChangeLogStartCommit, ChangeLogType } from './operations/Utility'; +import { Inputs} from "./operations/Constants"; +import { ChangeLog } from "./operations/ChangeLog"; +import { Helper } from "./operations/Helper"; + +class Main { + + public static async run(): Promise { + try { + var taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + + let actions = new Action(); + let helper = new Helper() + + // Get basic task inputs + const githubEndpoint = tl.getInput(Inputs.gitHubConnection, true); + const githubEndpointToken = Utility.getGithubEndPointToken(githubEndpoint); + + const repositoryName = tl.getInput(Inputs.repositoryName, true); + + const action = tl.getInput(Inputs.action, true).toLowerCase(); + Utility.validateAction(action); + + let tagSource = tl.getInput(Inputs.tagSource); + Utility.validateTagSource(tagSource, action); + + let tag = tl.getInput(Inputs.tag); + Utility.validateTag(tag, tagSource, action); + + if (action === ActionType.delete) { + helper.publishTelemetry(); + await actions.deleteReleaseAction(githubEndpointToken, repositoryName, tag); + } + else { + // Get task inputs specific to create and edit release + const target = tl.getInput(Inputs.target, true); + const releaseTitle = tl.getInput(Inputs.title) || undefined; + + const isPrerelease = tl.getBoolInput(Inputs.isPreRelease) || false; + const isDraft = tl.getBoolInput(Inputs.isDraft) || false; + const githubReleaseAssetInputPatterns = tl.getDelimitedInput(Inputs.assets, Delimiters.newLine); + + if (action === ActionType.create) { + //Get task inputs specific to create release + const tagPattern = tl.getInput(Inputs.tagPattern) || undefined; + + // Get tag to create release if tag source is gitTag/auto + if (Utility.isTagSourceAuto(tagSource)) { + tag = await helper.getTagForCommitTarget(githubEndpointToken, repositoryName, target, tagPattern); + } + + if (!!tag) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + else { + // If no tag found, then give warning. + // Doing this because commits without associated tag will fail continuosly if we throw error. + // Other option is to have some task condition, which user can specify in task. + tl.warning(tl.loc("NoTagFound")); + tl.debug("No tag found"); // for purpose of L0 test only. + } + } + else if (action === ActionType.edit) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + // Get the release id of the release to edit. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: any = await helper.getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + // If a release is found, then edit it. + // Else create a new release. + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await actions.editReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns, releaseId); + } + else { + tl.warning(tl.loc("NoReleaseFoundToEditCreateRelease", tag)); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + } + } + + tl.setResult(tl.TaskResult.Succeeded, ""); + } + catch(error) { + tl.setResult(tl.TaskResult.Failed, error); + } + } + + private static async _getReleaseNote(githubEndpointToken: string, repositoryName: string, target: string): Promise { + const releaseNotesSource = tl.getInput(Inputs.releaseNotesSource, true); + Utility.validateReleaseNotesSource(releaseNotesSource); + const releaseNotesFile = tl.getPathInput(Inputs.releaseNotesFile, false, true); + const releaseNoteInput = tl.getInput(Inputs.releaseNotes); + const showChangeLog: boolean = tl.getBoolInput(Inputs.addChangeLog); + let changeLog: string = ""; + if (showChangeLog){ + let changeLogLabels: any = null; + const changeLogCompareToRelease = tl.getInput(Inputs.changeLogCompareToRelease); + Utility.validateStartCommitSpecification(changeLogCompareToRelease); + const changeLogType = tl.getInput(Inputs.changeLogType); + Utility.validateChangeLogType(changeLogType); + if (changeLogType === ChangeLogType.issueBased){ + const changeLogLabelsInput = tl.getInput(Inputs.changeLogLabels); + try{ + changeLogLabels = JSON.parse(changeLogLabelsInput); + } + catch(error){ + changeLogLabels = []; + tl.warning(tl.loc("LabelsSyntaxError")); + } + } + + const changeLogCompareToReleaseTag = tl.getInput(Inputs.changeLogCompareToReleaseTag) || undefined; + // Generate the change log + // Get change log for top 250 commits only + changeLog = await new ChangeLog().getChangeLog(githubEndpointToken, repositoryName, target, 250, ChangeLogStartCommit[changeLogCompareToRelease], changeLogType, changeLogCompareToReleaseTag, changeLogLabels); + } + // Append change log to release note + const releaseNote: string = Utility.getReleaseNote(releaseNotesSource, releaseNotesFile, releaseNoteInput, changeLog) || undefined; + + return releaseNote; + } +} + +Main.run(); diff --git a/_generated/GitHubReleaseV0/make.json b/_generated/GitHubReleaseV0/make.json new file mode 100644 index 000000000000..3df4ca171399 --- /dev/null +++ b/_generated/GitHubReleaseV0/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/Action.ts b/_generated/GitHubReleaseV0/operations/Action.ts new file mode 100644 index 000000000000..f4d849317b75 --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/Action.ts @@ -0,0 +1,255 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import fs = require('fs'); +import { WebResponse } from "./webClient"; +import { Release } from "./Release"; +import { Utility, AssetUploadMode, GitHubAttributes } from "./Utility"; +import { Inputs } from "./Constants"; +import { Helper } from "./Helper"; + +export class Action { + + /** + * Creating a release and uploading assets are 2 different process. First we create a release and when it is successful, we upload assets to it. + * But in our scenario, we assume it to be a single process, means if upload assets step fail then we say release is in dirty state and we would want it to be deleted as it is without assets yet. + * So, we delete the created release as assets are not uploaded to it. And will want user to run the task again to create release with assets. + * The delete release step is only reachable if user has specified any assets to upload and the upload step failed. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + */ + public async createReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[]): Promise { + console.log(tl.loc("CreatingRelease", tag)); + + // Create release + let response: WebResponse = await new Release().createRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease); + tl.debug("Create release response: " + JSON.stringify(response)); + + if (response.statusCode === 201) { + try { + // Upload the assets + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, [], false); + console.log(tl.loc("CreateReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + catch (error) { + console.log(tl.loc("CreateReleaseFailed")); + + try { + // If upload asets fail, then delete the release + let releaseId: string = response.body[GitHubAttributes.id]; + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + catch (error) { + tl.debug("Failed to delete the release which is in dirty state currently. Assets were expected to be uploaded but it failed. Delete the release manually.") + } + + throw error; + } + } + else if (response.statusCode === 422 && response.body.errors && response.body.errors.length > 0 && response.body.errors[0].code === this._alreadyExistErrorCode) { + tl.error(tl.loc("ReleaseAlreadyExists", tag)); + throw new Error(response.body[GitHubAttributes.message]); + } + else { + tl.error(tl.loc("CreateReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Edits an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + * @param releaseId + */ + public async editReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[], releaseId: string): Promise { + console.log(tl.loc("EditingRelease", tag)); + + let response: WebResponse = await new Release().editRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, releaseId); + tl.debug("Edit release response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, response.body[GitHubAttributes.assets], true); + console.log(tl.loc("EditReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + else { + tl.error(tl.loc("EditReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Deletes a release if it exists. + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async deleteReleaseAction(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + // Get the release id of the release with corresponding tag to delete. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: string = await new Helper().getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + else { + throw new Error(tl.loc("NoReleaseFoundToDelete", tag)); + } + } + + /** + * Deletes an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param releaseId + * @param tag + */ + private async _deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string, tag: string): Promise { + console.log(tl.loc("DeletingRelease", tag)); + let response: WebResponse = await new Release().deleteRelease(githubEndpointToken, repositoryName, releaseId); + tl.debug("Delete release response: " + JSON.stringify(response)); + + if (response.statusCode === 204) { + console.log(tl.loc("DeleteReleaseSuccess")); + } + else { + tl.error(tl.loc("DeleteReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Upload assets to the release. + * @param githubEndpointToken + * @param repositoryName + * @param githubReleaseAssetInputPatterns + * @param uploadUrl + * @param existingAssets + */ + private async _uploadAssets(githubEndpointToken: string, repositoryName: string, githubReleaseAssetInputPatterns: string[], uploadUrl: string, existingAssets: any[], editMode: boolean): Promise { + const assetUploadMode = tl.getInput(Inputs.assetUploadMode); + Utility.validateAssetUploadMode(assetUploadMode); + + // Delete all assets in case of edit release before uploading new assets. + if (editMode && !!assetUploadMode && assetUploadMode === AssetUploadMode.delete) { + console.log(tl.loc("DeleteAllExistingAssets")); + await this._deleteAssets(githubEndpointToken, repositoryName, existingAssets); + } + + if (githubReleaseAssetInputPatterns && githubReleaseAssetInputPatterns.length > 0) { + console.log(tl.loc("UploadingAssets")); + } + else { + console.log(tl.loc("NoAssetFoundToUpload")); + return; + } + + for (let pattern of (githubReleaseAssetInputPatterns || [])) { + await this._uploadAssetsForGivenPattern(githubEndpointToken, repositoryName, uploadUrl, existingAssets, pattern, assetUploadMode); + } + + console.log(tl.loc("AllAssetsUploadedSuccessfully")); + } + + private async _uploadAssetsForGivenPattern(githubEndpointToken: string, repositoryName: string, uploadUrl: string, existingAssets: any[], pattern: string, assetUploadMode: string): Promise { + console.log(tl.loc("SearchingFileMatchingPattern", pattern)); + + let assets: string[] = Utility.getUploadAssets(pattern) || []; + + if (Utility.isPatternADirectory(assets, pattern)) { + console.log(tl.loc("PatternIsADirectory", pattern)); + return; + } + + assets = assets.filter(asset => Utility.isFile(asset)); + + if (assets.length === 0) { + console.log(tl.loc("NoFileFoundMatchingPattern", pattern)); + return; + } + + Utility.validateUploadAssets(assets); + + for (let index = 0; index < assets.length; index++) { + const asset = assets[index]; + console.log(tl.loc("UploadingAsset", asset)); + + let uploadResponse = await new Release().uploadReleaseAsset(githubEndpointToken, asset, uploadUrl); + tl.debug("Upload asset response: " + JSON.stringify(uploadResponse)); + + if (uploadResponse.statusCode === 201) { + console.log(tl.loc("UploadAssetSuccess", asset)); + } + else if (uploadResponse.statusCode === 422 && uploadResponse.body.errors && uploadResponse.body.errors.length > 0 && uploadResponse.body.errors[0].code === this._alreadyExistErrorCode) { + + if (assetUploadMode === AssetUploadMode.replace) { + console.log(tl.loc("DuplicateAssetFound", asset)); + console.log(tl.loc("DeletingDuplicateAsset", asset)); + + const fileName = path.basename(asset); + + for (let existingAsset of existingAssets) { + if (fileName === existingAsset.name) { + await this._deleteAssets(githubEndpointToken, repositoryName, [existingAsset]); + index--; + break; + } + } + } + else { + console.log(tl.loc("SkipDuplicateAssetFound", asset)); + } + } + else { + tl.error(tl.loc("UploadAssetError")) + throw new Error(uploadResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Delete assets. + * @param githubEndpointToken + * @param repositoryName + * @param assets + */ + private async _deleteAssets(githubEndpointToken: string, repositoryName: string, assets: any[]): Promise { + if (assets && assets.length === 0) { + console.log(tl.loc("NoAssetFoundToDelete")); + return; + } + + for (let asset of assets) { + console.log(tl.loc("DeletingAsset", asset[GitHubAttributes.nameAttribute])); + let deleteAssetResponse = await new Release().deleteReleaseAsset(githubEndpointToken, repositoryName, asset.id); + tl.debug("Delete asset response: " + JSON.stringify(deleteAssetResponse)); + + if (deleteAssetResponse.statusCode === 204) { + console.log(tl.loc("AssetDeletedSuccessfully", asset[GitHubAttributes.nameAttribute])); + } + else { + tl.error(tl.loc("ErrorDeletingAsset", asset[GitHubAttributes.nameAttribute])); + throw new Error(deleteAssetResponse.body[GitHubAttributes.message]); + } + } + console.log(tl.loc("AssetsDeletedSuccessfully")); + } + + private readonly _alreadyExistErrorCode: string = "already_exists"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/ChangeLog.ts b/_generated/GitHubReleaseV0/operations/ChangeLog.ts new file mode 100644 index 000000000000..0608268b0737 --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/ChangeLog.ts @@ -0,0 +1,701 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import { Utility, GitHubAttributes, IRepositoryIssueId, Delimiters, AzureDevOpsVariables, ChangeLogStartCommit, GitHubIssueState, ChangeLogType } from "./Utility"; +import { Release } from "./Release"; +import { Helper } from "./Helper"; + +export class ChangeLog { + + /** + * Returns the change log. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param top + * @param compareWithRelease + * @param changeLogType + * @param changeLogCompareToReleaseTag + * @param changeLogLabels + */ + public async getChangeLog(githubEndpointToken: string, repositoryName: string, target: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogType: string, changeLogCompareToReleaseTag?: string, changeLogLabels?: any[]): Promise { + console.log(tl.loc("ComputingChangeLog")); + + let release = new Release(); + // We will be fetching changes between startCommitSha...endCommitSha. + // endCommitSha: It is the current commit + // startCommitSha: It is the commit for which previous release was created + // If no previous release found, then it will be the first commit. + + // Get the curent commit. + let endCommitSha: string = await new Helper().getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + //Get the start commit. + let startCommitSha: string = await this.getStartCommitSha(githubEndpointToken, repositoryName, endCommitSha, top,compareWithRelease, changeLogCompareToReleaseTag); + // Compare the diff between 2 commits. + tl.debug("start commit: "+ startCommitSha + "; end commit: "+ endCommitSha); + console.log(tl.loc("FetchCommitDiff")); + let commitsListResponse = await release.getCommitsList(githubEndpointToken, repositoryName, startCommitSha, endCommitSha); + tl.debug("Get commits list response: " + JSON.stringify(commitsListResponse)); + + if (commitsListResponse.statusCode === 200) { + // If end commit is older than start commit i.e. Rollback scenario, we will not show any change log. + if (commitsListResponse.body[GitHubAttributes.status] === GitHubAttributes.behind) { + tl.warning(tl.loc("CommitDiffBehind")); + return ""; + } + else { + let commits: any[] = commitsListResponse.body[GitHubAttributes.commits] || []; + + // If endCommit and startCommit are same then also we will not show any change log. + if (commits.length === 0) { + console.log(tl.loc("CommitDiffEqual")); + return ""; + } + + console.log(tl.loc("FetchCommitDiffSuccess")); + // Reversing commits as commits retrieved are in oldest first order + commits = commits.reverse(); + + // Only show changeLog for top X commits, where X = top + // Form the commitId to issues dictionary + let commitIdToMessageDictionary: { [key: string]: string } = this._getCommitIdToMessageDictionary(commits.length > top ? commits.slice(0, top) : commits); + tl.debug("commitIdToMessageDictionary: " + JSON.stringify(commitIdToMessageDictionary)); + + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = this._getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary, repositoryName); + tl.debug("commitIdToRepoIssueIdsDictionary: " + JSON.stringify(commitIdToRepoIssueIdsDictionary)); + if (changeLogType === ChangeLogType.commitBased) { + return this._getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary, commitIdToMessageDictionary, repositoryName); + } + else { + let issues = new Set([]); + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string) => { + if (issues.size >= top) { + return; + } + commitIdToRepoIssueIdsDictionary[commitId].forEach(repoIssueId => { + if (issues.size >= top) { + return; + } + let issueDetails = Utility.extractRepoAndIssueId(repoIssueId); + let issueId = Number(issueDetails.issueId); + if (!!issueId && issueDetails.repository === repositoryName) { + issues.add(issueId); + } + }); + }); + + if (!!changeLogLabels && !!changeLogLabels.length) { + return this._getIssueBasedChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken, changeLogLabels); + } + else { + return this._getAllIssuesChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken); + } + } + } + } + else{ + tl.error(tl.loc("FetchCommitDiffError")); + throw new Error(commitsListResponse.body[GitHubAttributes.message]); + } + } + /** + * Generate issue based ChangeLog + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + * @param labels + */ + private async _getIssueBasedChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string, labels: any[]) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, true); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let index = 0; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + let labelsRankDictionary = this._getLabelsRankDictionary(labels); + tl.debug("labelsRankDictionary: " + JSON.stringify(labelsRankDictionary)); + let groupedIssuesDictionary = this._getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels); + tl.debug("Group wise issues : " + JSON.stringify(groupedIssuesDictionary)); + Object.keys(groupedIssuesDictionary).forEach((group: string) => { + if (groupedIssuesDictionary[group].length === 0) return; + //If the only category is the default cateogry, don't add the category title. + if (index > 0 || group!= this._defaultGroup){ + let changeLogGroupTitle = util.format(this._groupTitleFormat, group); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogGroupTitle + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogGroupTitle + Delimiters.newLine; + index++; + } + } + groupedIssuesDictionary[group].forEach(issueDetails => { + let changeLogPerIssue: string = this._getChangeLogPerIssue(issueDetails.id, issueDetails.issue); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + index++; + } + }); + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate all issue based ChangeLog without labels + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + */ + private async _getAllIssuesChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, false); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + Object.keys(issuesList).forEach((key: string, index: number) => { + let changeLogPerIssue = this._getChangeLogPerIssue(key.substr(1), issuesList[key].title); + // See more functionality + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate commit based ChangeLog + * @param commitIdToRepoIssueIdsDictionary + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private async _getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary: { [key: string]: Set }, commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string){ + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + // Evaluate change log + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string, index: number) => { + let changeLogPerCommit: string = this._getChangeLogPerCommit(commitId, commitIdToMessageDictionary[commitId], commitIdToRepoIssueIdsDictionary[commitId], repositoryName); + //See more functionality + // If changes are more than 10, then we will show See more button which will be collapsible. + // And under that seeMoreChangeLog will be shown + // topXChangeLog will be visible to user. + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerCommit + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerCommit + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + /** + * Returns the start commit needed to compute ChangeLog. + * @param githubEndpointToken + * @param repositoryName + * @param endCommitSha + * @param top + * @param compareWithRelease + * @param changeLogCompareToReleaseTag + */ + + public async getStartCommitSha(githubEndpointToken: string, repositoryName: string, endCommitSha: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogCompareToReleaseTag?: string): Promise { + let release = new Release(); + let startCommitSha: string; + if (compareWithRelease === ChangeLogStartCommit.lastFullRelease) { + // Get the latest published release to compare the changes with. + console.log(tl.loc("FetchLatestPublishRelease")); + let latestReleaseResponse = await release.getLatestRelease(githubEndpointToken, repositoryName); + tl.debug("Get latest release response: " + JSON.stringify(latestReleaseResponse)); + // Get the start commit. + // Release has target_commitsh property but it can be branch name also. + // Hence if a release is present, then get the tag and find its corresponding commit. + // Else get the first commit. + if (latestReleaseResponse.statusCode !== 200 && latestReleaseResponse.statusCode !== 404) { + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(latestReleaseResponse.body[GitHubAttributes.message]); + } + else if (latestReleaseResponse.statusCode !== 404 && latestReleaseResponse.body && !!latestReleaseResponse.body[GitHubAttributes.tagName]) { + let latestReleaseTag: string = latestReleaseResponse.body[GitHubAttributes.tagName]; + tl.debug("latest release tag: " + latestReleaseTag); + + let latestReleaseUrl: string = latestReleaseResponse.body[GitHubAttributes.htmlUrl]; + console.log(tl.loc("FetchLatestPublishReleaseSuccess", latestReleaseUrl)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, latestReleaseTag); + } + else { + console.log(tl.loc("NoLatestPublishRelease")); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + + return startCommitSha; + } + + let comparer; + if (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) { + //Latest non-draft Release + console.log(tl.loc("FetchLatestNonDraftRelease")); + comparer = release => !release[GitHubAttributes.draft]; + } + else { + //Latest release with the given tag or matching the given regex. + console.log(tl.loc("FetchLastReleaseByTag", changeLogCompareToReleaseTag)); + comparer = release => !release[GitHubAttributes.draft] && Utility.isTagMatching(release[GitHubAttributes.tagName], changeLogCompareToReleaseTag); + + } + + let initialTag = await this.getLastReleaseTag(githubEndpointToken, repositoryName, comparer); + + //If no such release exists, get the start commit + //else get the commit for that tag. + if (!initialTag) { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("NoMatchingReleases")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("NoTagMatchingReleases", changeLogCompareToReleaseTag)); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + else { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("FetchMatchingReleaseSuccess")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("FetchTagMatchingReleaseSuccess", changeLogCompareToReleaseTag)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, initialTag); + } + + return startCommitSha; + } + + /** + * Returns latest release satisfying the given comparer. + * @param githubEndpointToken + * @param repositoryName + * @param comparer + */ + public async getLastReleaseTag(githubEndpointToken: string, repositoryName: string, comparer:(release: any)=> boolean): Promise { + let release = new Release(); + + // Fetching all releases in the repository. Sorted in descending order according to 'created_at' attribute. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + let startRelease: any; + //404 is returned when there are no releases. + if (releasesResponse.statusCode !== 200 && releasesResponse.statusCode !== 404){ + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + else if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + startRelease = (releasesResponse.body || []).find(comparer); + if (!!startRelease) { + return startRelease[GitHubAttributes.tagName]; + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + } + //If status code is 404 or there are no releases satisfying the constraints return null. + return null; + } + } + + /** + * Returns the commit for provided tag + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + private async _getCommitForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let filteredTag: any = await new Helper().filterTag(githubEndpointToken, repositoryName, tag, this._filterTagsByTagName); + + return filteredTag && filteredTag[GitHubAttributes.commit][GitHubAttributes.sha]; + } + + /** + * Returns a commit which is 'X' (top) commits older than the provided commit sha. + * @param githubEndpointToken + * @param repositoryName + * @param sha + */ + private async _getInitialCommit(githubEndpointToken: string, repositoryName: string, sha: string, top: number): Promise { + let release = new Release(); + + // No api available to get first commit directly. + // So, fetching all commits before the current commit sha. + // Returning last commit or 250th commit which ever is smaller. + let commitsForGivenShaResponse = await release.getCommitsBeforeGivenSha(githubEndpointToken, repositoryName, sha); + let links: { [key: string]: string } = {}; + let commits: any[] = []; + + while(true) { + tl.debug("Get initial commit response: " + JSON.stringify(commitsForGivenShaResponse)); + + if (commitsForGivenShaResponse.statusCode === 200) { + // Returned commits are in latest first order and first commit is the commit queried itself. + (commitsForGivenShaResponse.body || []).forEach(commit => { + commits.push(commit); + }); + + if (commits.length >= top) { + // Return 250th commit + return commits[top - 1][GitHubAttributes.sha]; + } + + links = Utility.parseHTTPHeaderLink(commitsForGivenShaResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + commitsForGivenShaResponse = paginatedResponse; + continue; + } + else { + // Return last commit. + return commits[commits.length - 1][GitHubAttributes.sha]; + } + } + else { + tl.error(tl.loc("FetchInitialCommitError")); + throw new Error(commitsForGivenShaResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns a dictionary of { commitId to commit message }. + * @param commits + */ + private _getCommitIdToMessageDictionary(commits: any[]): { [key: string]: string } { + let commitIdToMessageDictionary: { [key: string]: string } = {}; + + for (let commit of (commits || [])) { + commitIdToMessageDictionary[commit[GitHubAttributes.sha]] = commit[GitHubAttributes.commit][GitHubAttributes.message]; + } + + return commitIdToMessageDictionary; + } + + /** + * Returns a dictionary of { commitId to repoIssueIds }. + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private _getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string): { [key: string]: Set } { + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = {}; + + Object.keys(commitIdToMessageDictionary).forEach((commitId: string) => { + commitIdToRepoIssueIdsDictionary[commitId] = this._getRepoIssueIdFromCommitMessage(commitIdToMessageDictionary[commitId], repositoryName); + + }); + + return commitIdToRepoIssueIdsDictionary; + } + + /** + * Returns a dictionary of { key to displayname, rank }. + * Key is labelname#issuestate + * This dictionary is used to find the label with highest priority. + * @param labels + */ + private _getLabelsRankDictionary(labels: any[]){ + let labelsRankDictionary = {}; + for (let index = 0; index < labels.length; index++){ + if (!labels[index].label || !labels[index].displayName) continue; + let label = labels[index].label; + let issueState = labels[index].state || this._noStateSpecified; + let key = (label+ Delimiters.hash +issueState).toLowerCase(); + if (!labelsRankDictionary[key]){ + labelsRankDictionary[key] = {displayName: labels[index].displayName, rank: index}; + } + } + return labelsRankDictionary; + } + + /** + * Returns a dictionary of { groupname to issues }. + * This dictionary is used to find all the issues under a display name. + * @param labelsRankDictionary + * @param issuesList + */ + private _getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels){ + let labelsIssuesDictionary = {}; + labels.forEach(label => { + if (!label.displayName) return; + labelsIssuesDictionary[label.displayName] = []; + }); + labelsIssuesDictionary[this._defaultGroup] = []; + Object.keys(issuesList).forEach((issue: string) => { + let group: string = null; + let currentLabelRank: number = Number.MAX_SAFE_INTEGER; + let issueState = issuesList[issue].state; + //For Pull Requests, show only Merged PRs, Ignore Closed PRs + if (!!issuesList[issue].changedFiles){ + if(issueState.toLowerCase() === GitHubIssueState.merged.toLowerCase()){ + issueState = GitHubIssueState.closed; + } + else if (issueState.toLowerCase() === GitHubIssueState.closed.toLowerCase()){ + return; + } + } + issuesList[issue].labels.edges && issuesList[issue].labels.edges.forEach(labelDetails => { + let key = (labelDetails.node.name + Delimiters.hash + issueState).toLowerCase(); + if(!labelsRankDictionary[key]) { + key = (labelDetails.node.name + Delimiters.hash + this._noStateSpecified).toLowerCase(); + } + + if (labelsRankDictionary[key] && labelsRankDictionary[key].rank < currentLabelRank){ + group = labelsRankDictionary[key].displayName; + currentLabelRank = labelsRankDictionary[key].rank; + } + }); + if (currentLabelRank === Number.MAX_SAFE_INTEGER){ + group = this._defaultGroup; //Default category + } + labelsIssuesDictionary[group].push({"issue": issuesList[issue].title, "id": issue.substr(1)}); + }); + return labelsIssuesDictionary; + } + + /** + * Returns the log for a single issue. + * Log format: * #issueId: issueTitle + * @param issueId + * @param issueTitle + */ + private _getChangeLogPerIssue(issueId: number | string, issueTitle: string){ + return Delimiters.star + Delimiters.space + Delimiters.hash + issueId + Delimiters.colon + Delimiters.space + issueTitle; + } + + /** + * Filter tags by tag name. + * Returns tag object. + */ + private _filterTagsByTagName = (tagsList: any[], tagName: string): any[] => { + let filteredTags: any[] = []; + + (tagsList || []).forEach((tag: any) => { + if (tag[GitHubAttributes.nameAttribute] === tagName) { + filteredTags.push(tag); + } + }); + + return filteredTags; + } + + /** + * Returns a unique set of repository#issueId string for each issue mentioned in the commit. + * repository#issueId string is needed as issues can be of cross repository. + * @param message + * @param repositoryName + */ + private _getRepoIssueIdFromCommitMessage(message: string, repositoryName: string): Set { + let match = undefined; + let repoIssueIdSet: Set = new Set(); + + // regex.exec(message) will return one match at a time. + // Multiple execution will yield all matches. + // Returns undefined if no further match found. + // match is an array, where match[0] is the complete match + // and other match[i] gives the captured strings in order. + // In our regex, we have captured repository name and issueId resp. + while (match = this._issueRegex.exec(message)) { + tl.debug("match: " + match[0]); + tl.debug("match1: " + match[1]); + tl.debug("match2: " + match[2]); + tl.debug("repositoryName: " + repositoryName); + + // If no repository name found before an issue, then use user provided repository name to link it to issue + let repo: string = match[1] ? match[1] : repositoryName; + let issueId: string = match[2]; + + // Using # as separator as neither repoName nor issueId will have #. + let uniqueRepoIssueId: string = repo + Delimiters.hash + issueId; + tl.debug("uniqueRepoIssueId: " + uniqueRepoIssueId); + + // Message can contain same issue linked multiple times. + // Do not add an issue if its already added. + if (!repoIssueIdSet.has(uniqueRepoIssueId)) { + repoIssueIdSet.add(uniqueRepoIssueId); + } + } + + return repoIssueIdSet; + } + + /** + * Returns the log for a single commit. + * Log format: * commitId commitMessageTitle, [ #issueId1, #issueId2 ] + * @param commitId + * @param commitMessage + * @param repoIssueIdSet + * @param repositoryName + */ + private _getChangeLogPerCommit(commitId: string, commitMessage: string, repoIssueIdSet: Set, repositoryName: string): string { + // GitHub commit messages have description as well alongwith title. + // Parsing the commit title and showing to user. + let commitMessageFirstLine: string = Utility.getFirstLine(commitMessage); + // Log format without issues: * commitId commitMessageTitle + let log: string = Delimiters.star + Delimiters.space + commitId + Delimiters.space + commitMessageFirstLine; + let issuesText: string = ""; + + // Appending each issue mentioned in the commit message. + // Ignoring issue which is present in commit title, to avoid duplicates. + if (!!repoIssueIdSet && repoIssueIdSet.size > 0) { + + (repoIssueIdSet).forEach((repoIssueId: string) => { + // Extract repository information for issue as cross repository issues can also be present. + let repoIssueIdInfo: IRepositoryIssueId = Utility.extractRepoAndIssueId(repoIssueId); + let issueIdText: string = ""; + + // If issue belongs to cross repository, then prefix repository name to issueId so that it can be linked correctly in GitHub. + if (repoIssueIdInfo.repository !== repositoryName) { + issueIdText += repoIssueIdInfo.repository; + } + // # is required before issueId for referencing purpose in GitHub. + issueIdText = issueIdText + Delimiters.hash + repoIssueIdInfo.issueId; + + // If this issue is not present in commit title, then append to issues text. + if (!commitMessageFirstLine.includes(issueIdText)) { + if (!!issuesText) { + // Append comma after every issue + issuesText += Delimiters.comma; + } + issuesText = issuesText + Delimiters.space + issueIdText; + } + }); + } + + // If issues are present, then enclose it in brackets and append to log. + if (!!issuesText) { + log = log + Delimiters.openingBracketWithSpace + issuesText + Delimiters.closingBracketWithSpace; + } + + return log; + } + + private _getAutoGeneratedText(): string { + let autoGeneratedUrl: string = encodeURI(this._getAutoGeneratedUrl()); + + if (!!autoGeneratedUrl) { + return util.format(this._autoGeneratedTextFormat, autoGeneratedUrl); + } + + return ""; + } + + private _generateChangeLog(topXChangeLog: string, seeMoreChangeLog: string): string { + let changeLog: string = ""; + if (topXChangeLog) { + changeLog = util.format(this._changeLogTitleFormat, this._changeLogTitle) + topXChangeLog; + + if(!seeMoreChangeLog) { + changeLog = changeLog + Delimiters.newLine + this._getAutoGeneratedText(); + } + else { + changeLog = changeLog + util.format(this._seeMoreChangeLogFormat, this._seeMoreText, seeMoreChangeLog, this._getAutoGeneratedText()); + } + } + return changeLog; + } + + private _getAutoGeneratedUrl(): string { + let releaseUrl: string = tl.getVariable(AzureDevOpsVariables.releaseWebUrl); + + if (!!releaseUrl) { + tl.debug("release web url: " + releaseUrl); + return releaseUrl; + } + else { + let collectionUri: string = tl.getVariable(AzureDevOpsVariables.collectionUri); + + // Make sure collection uri does not end with slash + if (collectionUri.endsWith(Delimiters.slash)) { + collectionUri = collectionUri.slice(0, collectionUri.length - 1); + } + + let teamProject: string = tl.getVariable(AzureDevOpsVariables.teamProject); + let buildId: string = tl.getVariable(AzureDevOpsVariables.buildId); + + tl.debug("Build url: " + util.format(this._buildUrlFormat, collectionUri, teamProject, buildId)); + return util.format(this._buildUrlFormat, collectionUri, teamProject, buildId); + } + } + + // https://github.com/moby/moby/commit/df23a1e675c7e3cbad617374d85c48103541ee14?short_path=6206c94#diff-6206c94cde21ec0a5563c8369b71e609 + // Supported format for GitHub issues: #26 GH-26 repositoryName#26 repositoryNameGH-26, where GH is case in-sensitive. + private readonly _issueRegex = new RegExp("(?:^|[^A-Za-z0-9_]?)([a-z0-9_]+/[a-zA-Z0-9-_.]+)?(?:#|[G|g][H|h]-)([0-9]+)(?:[^A-Za-z_]|$)", "gm"); + private readonly _changeLogTitle: string = tl.loc("ChangeLogTitle"); + private readonly _seeMoreText: string = tl.loc("SeeMoreText"); + private readonly _noStateSpecified: string = "none"; + private readonly _defaultGroup: string = tl.loc("DefaultCategory"); + private readonly _changeLogVisibleLimit: number = 10; + private readonly _changeLogTitleFormat: string = "\n\n## %s:\n\n"; + private readonly _groupTitleFormat: string = "\n### %s:\n\n"; + private readonly _buildUrlFormat: string = "%s/%s/_build/results?buildId=%s&view=logs"; + private readonly _autoGeneratedTextFormat: string = "This list of changes was [auto generated](%s)."; + private readonly _seeMoreChangeLogFormat: string = "
%s\n\n%s\n%s
"; // For showing See more button if more than 10 commits message are to be shown to user. +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/Constants.ts b/_generated/GitHubReleaseV0/operations/Constants.ts new file mode 100644 index 000000000000..4e3ac311d4ef --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/Constants.ts @@ -0,0 +1,24 @@ + +export class Inputs { + public static readonly action = "action"; + public static readonly repositoryName = "repositoryName"; + public static readonly tag = "tag"; + public static readonly tagSource = "tagSource"; + public static readonly target = "target"; + public static readonly title = "title"; + public static readonly isDraft = "isDraft"; + public static readonly isPreRelease = "isPreRelease"; + public static readonly gitHubConnection = "gitHubConnection"; + public static readonly assets = "assets"; + public static readonly assetUploadMode = "assetUploadMode"; + public static readonly releaseNotesSource = "releaseNotesSource"; + public static readonly releaseNotesFile = "releaseNotesFile"; + public static readonly releaseNotes = "releaseNotes"; + public static readonly addChangeLog = "addChangeLog"; + public static readonly changeLogLabels = "changeLogLabels"; + public static readonly deleteExistingAssets = "deleteExistingAssets"; + public static readonly tagPattern = "tagPattern"; + public static readonly changeLogCompareToRelease = "changeLogCompareToRelease"; + public static readonly changeLogCompareToReleaseTag = "changeLogCompareToReleaseTag"; + public static readonly changeLogType = "changeLogType"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/Helper.ts b/_generated/GitHubReleaseV0/operations/Helper.ts new file mode 100644 index 000000000000..fcaa3d38cabc --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/Helper.ts @@ -0,0 +1,283 @@ +import tl = require("azure-pipelines-task-lib/task"); +import * as telemetry from "azure-pipelines-tasks-utility-common/telemetry"; +import { Utility, GitHubAttributes, AzureDevOpsVariables, ActionType} from "./Utility"; +import { Inputs } from "./Constants"; +import { Release } from "./Release"; +import * as crypto from "crypto"; + +interface IRelease { + tagName: string; + id: number; +} + +interface ITelemetryData { + area: string; + action: string; + repository: string; + tagSource: string; + isDraft: boolean; + isPreRelease: boolean; + addChangeLog: boolean; +} + +export class Helper { + + /** + * Returns tag name to be used for creating a release. + * If tagPattern is specified, returns tag matching the given pattern + * If user has specified tag, then use it + * else if $(Build.SourceBranch) is referencing to a tag, then parse tag name and use it + * else fetch tag from the target specified by user + * if no tag found for that target commit, then return undefined + * else if more than 1 tag found, then throw error + * else return the found tag name + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param tagPattern + */ + public async getTagForCommitTarget(githubEndpointToken: string, repositoryName: string, target: string, tagPattern: string = null): Promise { + console.log(tl.loc("FetchTagForTarget", target)); + let tag = undefined; + + let commit_sha: string = await this.getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + tl.debug("commit sha for target: " + commit_sha); + let buildSourceVersion = tl.getVariable(AzureDevOpsVariables.buildSourceVersion); + + // If the buildSourceVersion and user specified target does not match, then prefer user specified target + if (commit_sha !== buildSourceVersion) { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + else { + let buildSourceBranch = tl.getVariable(AzureDevOpsVariables.buildSourceBranch); + let normalizedBranch = Utility.normalizeBranchName(buildSourceBranch); + + // Check if branch is referencing to tag, if yes, then parse tag from branch name e.g. refs/tags/v1.0.1 + // Else fetch tag from commit + if (!!normalizedBranch) { + tag = normalizedBranch; + if (!!tagPattern && !Utility.isTagMatching(tag, tagPattern)) { + tag = null; + } + } + else { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + } + + if (!!tag) { + console.log(tl.loc("FetchTagForTargetSuccess", target)); + } + + return tag; + } + + /** + * Returns latest commit on the target if target is branch else returns target. + * Target can be branch as well e.g. 'master' and in this scenario we need to fetch commit associated to that branch + * @param githubEndpointToken + * @param repositoryName + * @param target + */ + public async getCommitShaFromTarget(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let commit_sha: string = undefined; + let response = await new Release().getBranch(githubEndpointToken, repositoryName, target); + tl.debug("Get branch response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + commit_sha = response.body[GitHubAttributes.commit][GitHubAttributes.sha]; + } + else if (response.statusCode === 404) { + commit_sha = target; + } + else { + tl.error(tl.loc("GithubApiFailError")); + throw new Error(response.body[GitHubAttributes.message]); + } + + return commit_sha; + } + + /** + * Returns releaseId associated with the tag. + * If 0 release found return undefined + * else if 1 release found return releaseId + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async getReleaseIdForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let release = new Release(); + + // Fetching all releases in the repository. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let releasesWithGivenTag: IRelease[] = []; + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + (releasesResponse.body || []).forEach(release => { + tl.debug("release[GitHubAttributes.tagName]: " + release[GitHubAttributes.tagName] + " " + "tag: " + tag); + // Push release if tag matches + if (release[GitHubAttributes.tagName] === tag) { + releasesWithGivenTag.push({ + tagName: release[GitHubAttributes.tagName], + id: release[GitHubAttributes.id] + } as IRelease); + } + }); + + // Throw error in case of ambiguity as we do not know which release to pick for editing or deleting release. + if (releasesWithGivenTag.length >= 2) { + throw new Error(tl.loc("MultipleReleasesFoundError", tag)); + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + else { + return releasesWithGivenTag.length === 0 ? null : releasesWithGivenTag[0].id; + } + } + else { + tl.error(tl.loc("GetReleasesError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns tag object associated with the commit. + * If 0 tag found return undefined + * else if 1 tag found return tag object + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param filterValue + * @param filterTagsCallback Callback to filter the tags + */ + public async filterTag(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]): Promise { + let release = new Release(); + + // Fetching the tags in the repository + let tagsResponse = await release.getTags(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + let filteredTags: any[] = []; + + // Fetching tags api call may end up in paginated results. + // So, traversing pages one by one and throwing error if more than 1 tag found. + while (true) { + tl.debug("Get tags response: " + JSON.stringify(tagsResponse)); + + if (tagsResponse.statusCode === 200) { + // Parse header link and get links to different pages + links = Utility.parseHTTPHeaderLink(tagsResponse.headers[GitHubAttributes.link]); + + // Filter the tags returned in current page + let tags: any[] = filterTagsCallback(tagsResponse.body, filterValue); + + if (!!tags && tags.length > 0) { + // Push returned tags in filtered tags. + tags.forEach((tag: any) => { + filteredTags.push(tag); + }) + + // Throw error in case of ambiguity as we do not know which tag to pick for creating release. + if (filteredTags.length >= 2 ) { + throw new Error(tl.loc("MultipleTagFound", filterValue)); + } + } + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + tagsResponse = paginatedResponse; + continue; + } + else { + return filteredTags.length === 0 ? undefined : filteredTags[0]; + } + } + else{ + tl.error(tl.loc("GetTagsError")); + throw new Error(tagsResponse.body[GitHubAttributes.message]); + } + } + } + + public publishTelemetry(): void { + let telemetryData = {} as ITelemetryData; + + const releaseId: string = tl.getVariable(AzureDevOpsVariables.releaseId); + + telemetryData.area = !!releaseId ? "release" : "build"; + telemetryData.action = tl.getInput(Inputs.action, true).toLowerCase(); + let repositoryName = tl.getInput(Inputs.repositoryName, true); + telemetryData.repository = crypto.createHash('sha256').update(repositoryName).digest('hex'); + + if (telemetryData.action !== ActionType.delete) { + + if (telemetryData.action === ActionType.create) { + telemetryData.tagSource = tl.getInput(Inputs.tagSource); + } + + telemetryData.isDraft = tl.getBoolInput(Inputs.isDraft); + telemetryData.isPreRelease = tl.getBoolInput(Inputs.isPreRelease); + telemetryData.addChangeLog = tl.getBoolInput(Inputs.addChangeLog); + } + + telemetry.emitTelemetry("TaskHub", "GitHubRelease", telemetryData); + } + + /** + * Returns tag name associated with the commit. + * If tagPattern is specified returns tag name + * If 0 tag found return undefined + * else if 1 tag found return tag name + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param commit_sha + */ + private async _getTagForCommit(githubEndpointToken: string, repositoryName: string, commit_sha: string, tagPattern: string = null): Promise { + let filteredTag: any; + let filterTagsCallback = (tagsList: any[], commit_sha: string): any[] => { + tagsList = this._filterTagsByCommitSha(tagsList, commit_sha); + if (!tagPattern) { + return tagsList; + } + return tagsList.filter((tag: any) => Utility.isTagMatching(tag[GitHubAttributes.nameAttribute], tagPattern)); + } + + filteredTag = await this.filterTag(githubEndpointToken, repositoryName, commit_sha, filterTagsCallback); + + return filteredTag && filteredTag[GitHubAttributes.nameAttribute]; + } + + /** + * Returns an array of matched tags, filtering on basis of commit sha + */ + private _filterTagsByCommitSha = (tagsList: any[], commit_sha: string): any[] => { + let filteredTags: any[] = []; + + for (let tag of (tagsList || [])) { + if (tag[GitHubAttributes.commit][GitHubAttributes.sha] === commit_sha) { + filteredTags.push(tag); + } + } + + return filteredTags; + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/Release.ts b/_generated/GitHubReleaseV0/operations/Release.ts new file mode 100644 index 000000000000..b1441f98f12c --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/Release.ts @@ -0,0 +1,259 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import path = require("path"); +import fs = require('fs'); +import mime = require('browserify-mime'); +import { Utility } from "./Utility"; +import { WebRequest, sendRequest, WebResponse } from "./webClient"; + +export class Release { + + public async createRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._createReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "POST"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Create release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async editRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "PATCH"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Edit release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteReleaseAsset(githubEndpointToken: string, repositoryName: string, asset_id: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._deleteReleaseAssetApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, asset_id); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release asset request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + + public async uploadReleaseAsset(githubEndpointToken: string, filePath: string, uploadUrl: string): Promise { + let fileName = path.basename(filePath); + tl.debug("Filename: " + fileName); + + let rd = fs.createReadStream(filePath); + var stats = fs.statSync(filePath); + + let request = new WebRequest(); + request.uri = util.format(this._uploadReleaseAssetApiUrlFormat, uploadUrl.split('{')[0], fileName); + request.method = "POST"; + request.headers = { + "Content-Type": mime.lookup(fileName), + 'Content-Length': stats.size, + 'Authorization': 'token ' + githubEndpointToken + }; + request.body = rd; + tl.debug("Upload release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getBranch(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getBranchApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, target); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get branch request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getTags(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getTagsApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get tags request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getReleases(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get releases request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getLatestRelease(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getLatestReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get latest release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getPaginatedResult(githubEndpointToken: string, nextPageLink: string): Promise { + let request = new WebRequest(); + + request.uri = nextPageLink; + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get paginated request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsList(githubEndpointToken: string,repositoryName: string, startCommitSha: string, endCommitSha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsListApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, startCommitSha, endCommitSha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits list request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsBeforeGivenSha(githubEndpointToken: string,repositoryName: string, sha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsBeforeGivenShaApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, sha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits before given sha request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getIssuesList(githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + let request = new WebRequest(); + request.uri = util.format(this._graphQLUrlFormat, Utility.getGitHubApiUrl()); + request.method = "POST"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Fetching labels for issues: " + issues); + let issuesQuery = issues.map(issue => `_${issue}: issueOrPullRequest(number: ${issue}){ ...labelsForIssue ...labelsForPullRequest }`).join(", "); + let repositoryDetails = repositoryName.split("/"); + let labelsFragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let labelsFragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + changedFiles + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let fragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + }`; + let fragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + }`; + + let query = `query{ + repository(owner: "${repositoryDetails[0]}", name: "${repositoryDetails[1]}"){ + ${issuesQuery} + } + } + ${includeLabels ? labelsFragmentForIssue : fragmentForIssue} + ${includeLabels ? labelsFragmentForPullRequest : fragmentForPullRequest}`; + request.body = JSON.stringify({ query }); + tl.debug("Get issues along with labels: " + JSON.stringify(request)); + return await sendRequest(request); + } + + private readonly _createReleaseApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _editOrDeleteReleaseApiUrlFormat: string = "%s/repos/%s/releases/%s"; + private readonly _deleteReleaseAssetApiUrlFormat: string = "%s/repos/%s/releases/assets/%s"; + private readonly _uploadReleaseAssetApiUrlFormat: string = "%s?name=%s"; + private readonly _getReleasesApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _getLatestReleasesApiUrlFormat: string = "%s/repos/%s/releases/latest"; + private readonly _getBranchApiUrlFormat: string = "%s/repos/%s/branches/%s"; + private readonly _getTagsApiUrlFormat: string = "%s/repos/%s/tags"; + private readonly _getCommitsListApiUrlFormat: string = "%s/repos/%s/compare/%s...%s"; + private readonly _getCommitsBeforeGivenShaApiUrlFormat: string = "%s/repos/%s/commits?sha=%s&per_page=100"; + private readonly _graphQLUrlFormat: string = "%s/graphql"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/operations/Utility.ts b/_generated/GitHubReleaseV0/operations/Utility.ts new file mode 100644 index 000000000000..b2557afa579c --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/Utility.ts @@ -0,0 +1,364 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import glob = require('glob'); +import fs = require('fs'); + +export class Utility { + + public static getGithubEndPointToken(githubEndpoint: string): string { + const githubEndpointObject = tl.getEndpointAuthorization(githubEndpoint, false); + let githubEndpointToken: string = null; + + if (!!githubEndpointObject) { + tl.debug("Endpoint scheme: " + githubEndpointObject.scheme); + + if (githubEndpointObject.scheme === 'PersonalAccessToken') { + githubEndpointToken = githubEndpointObject.parameters.accessToken + } else if (githubEndpointObject.scheme === 'OAuth'){ + // scheme: 'OAuth' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme === 'Token'){ + // scheme: 'Token' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme) { + throw new Error(tl.loc("InvalidEndpointAuthScheme", githubEndpointObject.scheme)); + } + } + + if (!githubEndpointToken) { + throw new Error(tl.loc("InvalidGitHubEndpoint", githubEndpoint)); + } + + return githubEndpointToken; + } + + public static getUploadAssets(pattern: string): string[] { + let githubReleaseAssets: Set = new Set(); + + /** Check for one or multiples files into array + * Accept wildcards to look for files + */ + let filePaths: string[] = glob.sync(pattern); + + (filePaths || []).forEach((filePath) => { + if (!githubReleaseAssets.has(filePath)) { + githubReleaseAssets.add(filePath) + } + }) + + return Array.from(githubReleaseAssets); + } + + public static isFile(asset: string): boolean { + return fs.lstatSync(path.resolve(asset)).isFile(); + } + + public static isPatternADirectory(assets: string[], pattern: string): boolean { + if (assets && assets.length === 1 && pattern) { + if ((path.resolve(assets[0]) === path.resolve(pattern)) && tl.exist(path.resolve(pattern)) && tl.stats(path.resolve(pattern)).isDirectory()) { + tl.debug("Pattern is a directory " + pattern); + return true; + } + } + return false; + } + + public static validateUploadAssets(assets: string[]): void { + if (assets && assets.length > 0) { + try { + assets.forEach(function (asset) { + fs.accessSync(path.resolve(asset)); + }) + } catch (err) { + tl.warning(tl.loc("MissingAssetError", err.path)); + } + } + } + + public static getReleaseNote(releaseNotesSource: string, releaseNotesFile: any, releaseNoteInput: string, changeLog: string): string { + let releaseNote: string = ""; + + if (releaseNotesSource === ReleaseNotesSelectionMode.file) { + + if (fs.lstatSync(path.resolve(releaseNotesFile)).isDirectory()) { + console.log(tl.loc("ReleaseNotesFileIsDirectoryError", releaseNotesFile)); + } + else { + releaseNote = fs.readFileSync(releaseNotesFile).toString(); + } + } + else { + releaseNote = releaseNoteInput; + } + tl.debug("ReleaseNote:\n" + releaseNote); + + if (!releaseNote) { + releaseNote = ""; + } + + // Append commits and issues to release note. + if (changeLog){ + releaseNote = releaseNote + changeLog; + } + + return releaseNote; + } + + public static getGitHubApiUrl(): string { + let githubApiUrlInput: string = undefined; // Todo: mdakbar: get GHE url + return githubApiUrlInput ? githubApiUrlInput : this._githubApiUrl; // url without slash at end + } + + public static normalizeBranchName(branchName: string): string { + if (!!branchName && branchName.startsWith(this._tagRef)) { + return branchName.substring(this._tagRef.length); + } + return undefined; + } + + /** + * Returns the parsed HTTP header link if it exists. + * E.g. Link: '; rel="next", ; rel="last"' + * Returned object would be like { + * "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + * "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + * } + * @param headerLink + */ + public static parseHTTPHeaderLink(headerLink: string): { [key: string]: string } { + if (!headerLink) { + // No paginated results found + return null; + } + + // Split pages by comma as pages are separated by comma + let pages = headerLink.split(Delimiters.comma); + let links: { [key: string]: string } = {}; + + // Parse each page to get link and rel + (pages || []).forEach((page) => { + let section: string[] = page.split(Delimiters.semiColon); + + // Atleast link and rel should be present else header link format has changed + if (section.length < 2) { + throw new Error("section could not be split on ';'"); + } + + // Reference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n + // Get link + let urlMatch = section[0].trim().match(this._githubPaginatedLinkRegex); // If it didn't match, it will return null, else it will return match at first position + let relMatch = null; + + // Get rel, there can be other attributes like rel. So for loop is needed to filter rel attribute. + for (let i = 1; i < section.length; i++) { + relMatch = section[i].trim().match(this._githubPaginatedRelRegex); // If it didn't match, it will return null, else it will return match at first position + + // Break as soon as rel attribute is found + if (!!relMatch) { + break; + } + } + + // If both link and rel are found, append it to dictionary + if (urlMatch && relMatch) { + links[relMatch[1]] = urlMatch[1]; + } + + }) + + tl.debug("Parsed link: " + JSON.stringify(links)); + return links; + } + + public static extractRepositoryOwnerAndName(repositoryName: string): IGitHubRepositoryInfo { + let repositoryInfo = repositoryName.split(Delimiters.slash); + + return { + owner: repositoryInfo[0], + name: repositoryInfo[1] + } + } + + public static extractRepoAndIssueId(repoIssueId: string): IRepositoryIssueId { + let repoIssueIdInfo: string[] = repoIssueId.split(Delimiters.hash); + let repo: string = repoIssueIdInfo[0]; + let issueId: string = repoIssueIdInfo[1]; + + return { + repository: repo, + issueId: issueId + } + } + + public static getFirstLine(commitMessage: string): string { + commitMessage = (commitMessage || "").trim(); + const match = commitMessage.match(this._onlyFirstLine); + + tl.debug("Commit message: " + commitMessage); + tl.debug("match: " + match); + + return match[0]; + } + + public static isTagSourceAuto(tagSource: string) { + return (tagSource === TagSelectionMode.auto); + } + + public static validateTagSource(tagSource: string, action: string) { + if (action === ActionType.create && tagSource !== TagSelectionMode.auto && tagSource !== TagSelectionMode.manual) { + throw new Error(tl.loc("InvalidTagSource", tagSource)); + } + } + + public static validateAction(action: string) { + if (action !== ActionType.create && action !== ActionType.edit && action !== ActionType.delete) { + tl.debug("Invalid action input"); // for purpose of L0 test only. + throw new Error(tl.loc("InvalidActionSet", action)); + } + } + + public static validateReleaseNotesSource(releaseNotesSource: string) { + if (releaseNotesSource !== ReleaseNotesSelectionMode.file && releaseNotesSource !== ReleaseNotesSelectionMode.input) { + throw new Error(tl.loc("InvalidReleaseNotesSource", releaseNotesSource)); + } + } + + public static validateStartCommitSpecification(compareWith: string) { + if (compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastFullRelease.toUpperCase() + && compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastNonDraftRelease.toUpperCase() + && compareWith.toUpperCase() != changeLogStartCommitSpecification.lastNonDraftReleaseByTag.toUpperCase()) { + throw new Error(tl.loc("InvalidCompareWithAttribute", compareWith)); + } + } + + public static validateChangeLogType(changeLogType: string) { + if (changeLogType.toUpperCase() !== ChangeLogType.issueBased.toUpperCase() + && changeLogType.toUpperCase() !== ChangeLogType.commitBased.toUpperCase() ) { + throw new Error(tl.loc("InvalidChangeLogTypeAttribute", changeLogType)); + } + } + public static validateAssetUploadMode(assetUploadMode: string) { + if (assetUploadMode !== AssetUploadMode.delete && assetUploadMode !== AssetUploadMode.replace) { + throw new Error(tl.loc("InvalidAssetUploadMode", assetUploadMode)); + } + } + + public static validateTag(tag: string, tagSource: string, action: string) { + if (!tag) { + if (action === ActionType.edit || action === ActionType.delete) { + throw new Error(tl.loc("TagRequiredEditDeleteAction", action)); + } + else if (action === ActionType.create && !this.isTagSourceAuto(tagSource)) { + throw new Error(tl.loc("TagRequiredCreateAction")); + } + } + + } + + public static isTagMatching(tag: string, tagPattern: string): boolean { + let tagPatternRegex = new RegExp("^" + tagPattern + "$"); + return tagPatternRegex.test(tag); + } + + private static readonly _onlyFirstLine = new RegExp("^.*$", "m"); + private static readonly _githubPaginatedLinkRegex = new RegExp("^<(.*)>$"); + private static readonly _githubPaginatedRelRegex = new RegExp('^rel="(.*)"$'); + private static readonly _tagRef: string = "refs/tags/"; + private static readonly _githubApiUrl: string = "https://api.github.com"; // url without slash at end +} + +export class TagSelectionMode { + public static readonly auto: string = "auto"; + public static readonly manual: string = "manual"; +} + +export class AssetUploadMode { + public static readonly delete = "delete"; + public static readonly replace = "replace"; +} + +export class changeLogStartCommitSpecification { + public static readonly lastFullRelease = "lastFullRelease"; + public static readonly lastNonDraftRelease = "lastNonDraftRelease"; + public static readonly lastNonDraftReleaseByTag = "lastNonDraftReleaseByTag"; +} + +export enum ChangeLogStartCommit{ + lastFullRelease = 0, + lastNonDraftRelease, + lastNonDraftReleaseByTag +} + +export class ChangeLogType{ + public static readonly issueBased = "issueBased"; + public static readonly commitBased = "commitBased"; +} +class ReleaseNotesSelectionMode { + public static readonly input = "input"; + public static readonly file = "file"; +} + +export class GitHubIssueState{ + public static readonly closed = "CLOSED"; + public static readonly merged = "MERGED"; +} + +export class GitHubAttributes { + public static readonly id: string = "id"; + public static readonly nameAttribute: string = "name"; + public static readonly tagName: string = "tag_name"; + public static readonly uploadUrl: string = "upload_url"; + public static readonly htmlUrl: string = "html_url"; + public static readonly assets: string = "assets"; + public static readonly commit: string = "commit"; + public static readonly message: string = "message"; + public static readonly state: string = "state"; + public static readonly title: string = "title"; + public static readonly commits: string = "commits"; + public static readonly sha: string = "sha"; + public static readonly behind: string = "behind"; + public static readonly status: string = "status"; + public static readonly link: string = "link"; + public static readonly next: string = "next"; + public static readonly draft: string = "draft"; + public static readonly preRelease: string = "prerelease"; +} + +export class ActionType { + public static readonly create = "create"; + public static readonly edit = "edit"; + public static readonly delete = "delete"; +} + +export class AzureDevOpsVariables { + public static readonly buildSourceVersion: string = "Build.SourceVersion"; + public static readonly buildSourceBranch: string = "Build.SourceBranch"; + public static readonly releaseWebUrl: string = "Release.ReleaseWebURL"; + public static readonly collectionUri: string = "System.TeamFoundationCollectionUri"; + public static readonly teamProject: string = "System.TeamProject"; + public static readonly buildId: string = "Build.BuildId"; + public static readonly releaseId: string = "Release.ReleaseId"; +} + +export interface IGitHubRepositoryInfo { + owner: string; + name: string; +} + +export interface IRepositoryIssueId { + repository: string; + issueId: string; +} + +export class Delimiters { + public static readonly newLine: string = "\n"; + public static readonly hash: string = "#"; + public static readonly slash: string = "/"; + public static readonly semiColon: string = ";"; + public static readonly comma: string = ","; + public static readonly space: string = " "; + public static readonly openingBracketWithSpace: string = " ["; + public static readonly closingBracketWithSpace: string = " ]"; + public static readonly star: string = "*"; + public static readonly colon: string = ":"; +} diff --git a/_generated/GitHubReleaseV0/operations/webClient.ts b/_generated/GitHubReleaseV0/operations/webClient.ts new file mode 100644 index 000000000000..19c509790deb --- /dev/null +++ b/_generated/GitHubReleaseV0/operations/webClient.ts @@ -0,0 +1,112 @@ +import tl = require('azure-pipelines-task-lib/task'); +import httpClient = require("typed-rest-client/HttpClient"); +import httpInterfaces = require("typed-rest-client/Interfaces"); +import util = require("util"); + +let proxyUrl: string = tl.getVariable("agent.proxyurl"); +var requestOptions: httpInterfaces.IRequestOptions = proxyUrl ? { + proxy: { + proxyUrl: proxyUrl, + proxyUsername: tl.getVariable("agent.proxyusername"), + proxyPassword: tl.getVariable("agent.proxypassword"), + proxyBypassHosts: tl.getVariable("agent.proxybypasslist") ? JSON.parse(tl.getVariable("agent.proxybypasslist")) : null + } +} : {}; + +let ignoreSslErrors: string = tl.getVariable("VSTS_ARM_REST_IGNORE_SSL_ERRORS"); +requestOptions.ignoreSslError = ignoreSslErrors && ignoreSslErrors.toLowerCase() == "true"; + +var httpCallbackClient = new httpClient.HttpClient(tl.getVariable("AZURE_HTTP_USER_AGENT"), null, requestOptions); + +export class WebRequest { + public method: string; + public uri: string; + // body can be string or ReadableStream + public body: string | NodeJS.ReadableStream; + public headers: any; +} + +export class WebResponse { + public statusCode: number; + public statusMessage: string; + public headers: any; + public body: any; +} + +export class WebRequestOptions { + public retriableErrorCodes: string[]; + public retryCount: number; + public retryIntervalInSeconds: number; + public retriableStatusCodes: number[]; + public retryRequestTimedout: boolean; +} + +export async function sendRequest(request: WebRequest, options?: WebRequestOptions): Promise { + let i = 0; + let retryCount = options && options.retryCount ? options.retryCount : 5; + let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2; + let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"]; + let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504]; + let timeToWait: number = retryIntervalInSeconds; + while (true) { + try { + let response: WebResponse = await sendRequestInternal(request); + if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + continue; + } + + return response; + } + catch (error) { + if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + } + else { + if (error.code) { + console.log("##vso[task.logissue type=error;code=" + error.code + ";]"); + } + + throw error; + } + } + } +} + +export function sleepFor(sleepDurationInSeconds): Promise { + return new Promise((resolve, reject) => { + setTimeout(resolve, sleepDurationInSeconds * 1000); + }); +} + +async function sendRequestInternal(request: WebRequest): Promise { + tl.debug(util.format("[%s]%s", request.method, request.uri)); + var response: httpClient.HttpClientResponse = await httpCallbackClient.request(request.method, request.uri, request.body, request.headers); + return await toWebResponse(response); +} + +async function toWebResponse(response: httpClient.HttpClientResponse): Promise { + var res = new WebResponse(); + if (response) { + res.statusCode = response.message.statusCode; + res.statusMessage = response.message.statusMessage; + res.headers = response.message.headers; + var body = await response.readBody(); + if (body) { + try { + res.body = JSON.parse(body); + } + catch (error) { + tl.debug("Could not parse response: " + JSON.stringify(error, null, 2)); + tl.debug("Response: " + JSON.stringify(res.body)); + res.body = body; + } + } + } + + return res; +} diff --git a/_generated/GitHubReleaseV0/package-lock.json b/_generated/GitHubReleaseV0/package-lock.json new file mode 100644 index 000000000000..15aff7b63e40 --- /dev/null +++ b/_generated/GitHubReleaseV0/package-lock.json @@ -0,0 +1,708 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz", + "integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "dependencies": { + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "http://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha1-RBprv5s8aNpiTbAeo1y6jwpMLKs=", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/_generated/GitHubReleaseV0/package.json b/_generated/GitHubReleaseV0/package.json new file mode 100644 index 000000000000..862da427c958 --- /dev/null +++ b/_generated/GitHubReleaseV0/package.json @@ -0,0 +1,23 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.0", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "4.3.1", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "brace-expansion": "1.1.8", + "browserify-mime": "1.2.9", + "glob": "7.1.2", + "q": "1.4.1", + "semver": "5.4.1", + "typed-rest-client": "^1.8.9", + "vso-node-api": "6.0.1-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GitHubReleaseV0/task.json b/_generated/GitHubReleaseV0/task.json new file mode 100644 index 000000000000..e290f4746dee --- /dev/null +++ b/_generated/GitHubReleaseV0/task.json @@ -0,0 +1,348 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 0, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "auto", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "auto": "Git tag", + "manual": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = auto", + "helpMarkDown": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = manual", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "file", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "file": "Release notes file", + "input": "Inline release notes" + } + }, + { + "name": "releaseNotesFile", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = file" + }, + { + "name": "releaseNotes", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = input", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" + } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + }, + "_buildConfigMapping": { + "Default": "0.224.1", + "Node16-219": "0.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/task.loc.json b/_generated/GitHubReleaseV0/task.loc.json new file mode 100644 index 000000000000..9a08549242fa --- /dev/null +++ b/_generated/GitHubReleaseV0/task.loc.json @@ -0,0 +1,348 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 0, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "ms-resource:loc.group.displayName.changeLogConfiguration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "ms-resource:loc.input.label.gitHubConnection", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gitHubConnection" + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "ms-resource:loc.input.label.repositoryName", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.repositoryName", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "ms-resource:loc.input.label.action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.action", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "ms-resource:loc.input.label.target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.target" + }, + { + "name": "tagSource", + "type": "radio", + "label": "ms-resource:loc.input.label.tagSource", + "required": true, + "defaultValue": "auto", + "visibleRule": "action = create", + "helpMarkDown": "ms-resource:loc.input.help.tagSource", + "options": { + "auto": "Git tag", + "manual": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "ms-resource:loc.input.label.tagPattern", + "required": false, + "visibleRule": "tagSource = auto", + "helpMarkDown": "ms-resource:loc.input.help.tagPattern" + }, + { + "name": "tag", + "type": "string", + "label": "ms-resource:loc.input.label.tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = manual", + "helpMarkDown": "ms-resource:loc.input.help.tag" + }, + { + "name": "title", + "type": "string", + "label": "ms-resource:loc.input.label.title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.title" + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "ms-resource:loc.input.label.releaseNotesSource", + "required": false, + "defaultValue": "file", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesSource", + "options": { + "file": "Release notes file", + "input": "Inline release notes" + } + }, + { + "name": "releaseNotesFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.releaseNotesFile", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesFile", + "visibleRule": "releaseNotesSource = file" + }, + { + "name": "releaseNotes", + "type": "multiLine", + "label": "ms-resource:loc.input.label.releaseNotes", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotes", + "visibleRule": "releaseNotesSource = input", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "ms-resource:loc.input.label.assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assets", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "ms-resource:loc.input.label.assetUploadMode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assetUploadMode", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "ms-resource:loc.input.label.isDraft", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isDraft", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "ms-resource:loc.input.label.isPreRelease", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.isPreRelease" + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "ms-resource:loc.input.label.addChangeLog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.addChangeLog" + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogCompareToRelease", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToRelease", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "ms-resource:loc.input.label.changeLogCompareToReleaseTag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToReleaseTag" + }, + { + "name": "changeLogType", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogType", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogType", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "ms-resource:loc.input.label.changeLogLabels", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "ms-resource:loc.input.help.changeLogLabels" + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "main.js" + } + }, + "messages": { + "GithubApiFailError": "ms-resource:loc.messages.GithubApiFailError", + "GetTagsError": "ms-resource:loc.messages.GetTagsError", + "GetReleasesError": "ms-resource:loc.messages.GetReleasesError", + "CreateReleaseError": "ms-resource:loc.messages.CreateReleaseError", + "EditReleaseError": "ms-resource:loc.messages.EditReleaseError", + "DeleteReleaseError": "ms-resource:loc.messages.DeleteReleaseError", + "CreatingRelease": "ms-resource:loc.messages.CreatingRelease", + "CreateReleaseSuccess": "ms-resource:loc.messages.CreateReleaseSuccess", + "ReleaseAlreadyExists": "ms-resource:loc.messages.ReleaseAlreadyExists", + "EditingRelease": "ms-resource:loc.messages.EditingRelease", + "EditReleaseSuccess": "ms-resource:loc.messages.EditReleaseSuccess", + "NoReleaseFoundToEditCreateRelease": "ms-resource:loc.messages.NoReleaseFoundToEditCreateRelease", + "DeletingRelease": "ms-resource:loc.messages.DeletingRelease", + "DeleteReleaseSuccess": "ms-resource:loc.messages.DeleteReleaseSuccess", + "NoReleaseFoundToDelete": "ms-resource:loc.messages.NoReleaseFoundToDelete", + "FetchReleaseForTag": "ms-resource:loc.messages.FetchReleaseForTag", + "FetchReleaseForTagSuccess": "ms-resource:loc.messages.FetchReleaseForTagSuccess", + "FetchTagForTarget": "ms-resource:loc.messages.FetchTagForTarget", + "FetchTagForTargetSuccess": "ms-resource:loc.messages.FetchTagForTargetSuccess", + "MissingAssetError": "ms-resource:loc.messages.MissingAssetError", + "MultipleReleasesFoundError": "ms-resource:loc.messages.MultipleReleasesFoundError", + "MultipleTagFound": "ms-resource:loc.messages.MultipleTagFound", + "NoTagFound": "ms-resource:loc.messages.NoTagFound", + "DeleteAllExistingAssets": "ms-resource:loc.messages.DeleteAllExistingAssets", + "DuplicateAssetFound": "ms-resource:loc.messages.DuplicateAssetFound", + "AssetsDeletedSuccessfully": "ms-resource:loc.messages.AssetsDeletedSuccessfully", + "DeletingDuplicateAsset": "ms-resource:loc.messages.DeletingDuplicateAsset", + "SkipDuplicateAssetFound": "ms-resource:loc.messages.SkipDuplicateAssetFound", + "AssetDeletedSuccessfully": "ms-resource:loc.messages.AssetDeletedSuccessfully", + "AllAssetsUploadedSuccessfully": "ms-resource:loc.messages.AllAssetsUploadedSuccessfully", + "ErrorDeletingDuplicateAsset": "ms-resource:loc.messages.ErrorDeletingDuplicateAsset", + "ErrorDeletingAsset": "ms-resource:loc.messages.ErrorDeletingAsset", + "DeletingAsset": "ms-resource:loc.messages.DeletingAsset", + "NoAssetFoundToDelete": "ms-resource:loc.messages.NoAssetFoundToDelete", + "UploadingAssets": "ms-resource:loc.messages.UploadingAssets", + "UploadingAsset": "ms-resource:loc.messages.UploadingAsset", + "UploadAssetError": "ms-resource:loc.messages.UploadAssetError", + "UploadAssetSuccess": "ms-resource:loc.messages.UploadAssetSuccess", + "NoAssetFoundToUpload": "ms-resource:loc.messages.NoAssetFoundToUpload", + "ReleaseNotesFileIsDirectoryError": "ms-resource:loc.messages.ReleaseNotesFileIsDirectoryError", + "AssetIsDirectoryError": "ms-resource:loc.messages.AssetIsDirectoryError", + "ComputingChangeLog": "ms-resource:loc.messages.ComputingChangeLog", + "ComputingChangeLogSuccess": "ms-resource:loc.messages.ComputingChangeLogSuccess", + "CommitDiffBehind": "ms-resource:loc.messages.CommitDiffBehind", + "CommitDiffEqual": "ms-resource:loc.messages.CommitDiffEqual", + "FetchLatestPublishRelease": "ms-resource:loc.messages.FetchLatestPublishRelease", + "FetchLatestNonDraftRelease": "ms-resource:loc.messages.FetchLatestNonDraftRelease", + "FetchLastReleaseByTag": "ms-resource:loc.messages.FetchLastReleaseByTag", + "FetchLatestPublishReleaseSuccess": "ms-resource:loc.messages.FetchLatestPublishReleaseSuccess", + "FetchMatchingReleaseSuccess": "ms-resource:loc.messages.FetchMatchingReleaseSuccess", + "FetchTagMatchingReleaseSuccess": "ms-resource:loc.messages.FetchTagMatchingReleaseSuccess", + "GetLatestReleaseError": "ms-resource:loc.messages.GetLatestReleaseError", + "NoLatestPublishRelease": "ms-resource:loc.messages.NoLatestPublishRelease", + "NoMatchingReleases": "ms-resource:loc.messages.NoMatchingReleases", + "NoTagMatchingReleases": "ms-resource:loc.messages.NoTagMatchingReleases", + "FetchCommitDiff": "ms-resource:loc.messages.FetchCommitDiff", + "FetchCommitDiffSuccess": "ms-resource:loc.messages.FetchCommitDiffSuccess", + "FetchCommitDiffError": "ms-resource:loc.messages.FetchCommitDiffError", + "FetchInitialCommit": "ms-resource:loc.messages.FetchInitialCommit", + "FetchInitialCommitSuccess": "ms-resource:loc.messages.FetchInitialCommitSuccess", + "InvalidGitHubEndpoint": "ms-resource:loc.messages.InvalidGitHubEndpoint", + "InvalidEndpointAuthScheme": "ms-resource:loc.messages.InvalidEndpointAuthScheme", + "FetchInitialCommitError": "ms-resource:loc.messages.FetchInitialCommitError", + "InvalidActionSet": "ms-resource:loc.messages.InvalidActionSet", + "InvalidTagSource": "ms-resource:loc.messages.InvalidTagSource", + "InvalidReleaseNotesSource": "ms-resource:loc.messages.InvalidReleaseNotesSource", + "InvalidCompareWithAttribute": "ms-resource:loc.messages.InvalidCompareWithAttribute", + "InvalidAssetUploadMode": "ms-resource:loc.messages.InvalidAssetUploadMode", + "TagRequiredEditDeleteAction": "ms-resource:loc.messages.TagRequiredEditDeleteAction", + "TagRequiredCreateAction": "ms-resource:loc.messages.TagRequiredCreateAction", + "NoFileFoundMatchingPattern": "ms-resource:loc.messages.NoFileFoundMatchingPattern", + "PatternIsADirectory": "ms-resource:loc.messages.PatternIsADirectory", + "SearchingFileMatchingPattern": "ms-resource:loc.messages.SearchingFileMatchingPattern", + "IssuesFetchError": "ms-resource:loc.messages.IssuesFetchError", + "NoIssuesLinkedError": "ms-resource:loc.messages.NoIssuesLinkedError", + "LabelsSyntaxError": "ms-resource:loc.messages.LabelsSyntaxError", + "InvalidChangeLogTypeAttribute": "ms-resource:loc.messages.InvalidChangeLogTypeAttribute", + "ChangeLogTitle": "ms-resource:loc.messages.ChangeLogTitle", + "DefaultCategory": "ms-resource:loc.messages.DefaultCategory", + "SeeMoreText": "ms-resource:loc.messages.SeeMoreText" + }, + "_buildConfigMapping": { + "Default": "0.224.1", + "Node16-219": "0.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0/tsconfig.json b/_generated/GitHubReleaseV0/tsconfig.json new file mode 100644 index 000000000000..875bb90cd697 --- /dev/null +++ b/_generated/GitHubReleaseV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} diff --git a/_generated/GitHubReleaseV0_Node16/README.md b/_generated/GitHubReleaseV0_Node16/README.md new file mode 100644 index 000000000000..05244f53a4fb --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/README.md @@ -0,0 +1,63 @@ +# GitHub Release + +## Overview + +The [GitHub Release task](https://aka.ms/AA3m1bq) can be used to create/edit/delete a GitHub release directly from your CI/CD pipeline. This task works on cross platform Azure Pipeline agents running Windows, Linux or Mac and uses GitHub APIs to manage GitHub releases. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task, like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites are required for the task to work properly: + +#### GitHub Service Connection + +In order to perform operations on the GitHub repository, the task needs a GitHub service connection with adequate permission. If it does not exist already, you can [create a GitHub service connection](https://aka.ms/AA3am5s) in your azure pipelines project. Once the service connection is created, all you need is the name of the service connection in this task. + +## Parameters of the task + +The GitHub Release task can run in 3 action types, viz. create, edit or delete. Based on the action chosen by the user certain parameters will be ignored. The following is the list of parameters required for this task. + +* **Service Connection:** This is the name of GitHub service connection which will be used to connect to target GitHub account. You can use an existing GitHub service connection or create a new one. Note that the service connection should use OAuth or PAT for authentication. + +* **GitHub Repository:** This is the name of the GitHub repository where GitHub releases will be managed. E.g. `microsoft/vscode`. + +* **Action:** Action is the type of release operation you want perform using this task. This task can perform 3 different actions - create, edit or delete. + + * Create: This action creates a GitHub release. Throws error if a published release already exists with the given tag. + + * Edit: This action modifies a existing GitHub release. Tag is used to identify the release to be edited. Throws error if more than 1 release(draft or published) is found with the given tag. + + * Delete: This action deletes a GitHub release. Tag is used to identify the release to be deleted. Throws error if more than 1 release(draft or published) is found with the given tag. + +* **Target:** This is the commit SHA for which the GitHub release will be created. By default, the value is $(Build.SourceVersion) which corresponds to the commit for which the build was run. If you specify a branch name here(E.g. *master* ), the latest commit from this branch will be used as target. This field is ignored when using edit and delete actions. + +* **Tag Source:** This parameter allows you to choose the source of tag to be used for a release action. This is available only for *create* action. It can be done in 2 ways: + + * Git tag: Choose this option if the tag to be used in release creation has been pushed to the repository. The release will be created using the git tag that is associated with this commit. If no tag is found for the given commit, the release will not be created. If multiple tags are found, the task will throw an error. + + * User specified tag: Choose this option if you want the task to create a new tag. The release will subsequently be created using the new tag provided in the 'tag' parameter. If the tag already exists in the repository, then the release will be created for the existing tag. + +* **Tag:** This is the tag to be used for the chosen release action. You can specify the tag directly or by using variables, Eg. v\$(MajorVersion).\$(MinorVersion).\$(PatchVersion). For *edit*, *delete* actions, the release having this tag will be acted upon. For *create* action, a new release will be created with this tag. Note that this is a mandatory field for *edit* and *delete* actions. + +* **Release Title:** This is the title that will be used for release creation. If left empty, the tag name will be used as the release title. + +* **Release Notes Source:** This field lets you specify the source for the description of your GitHub release. There are 2 ways for doing this: + * Release notes file: On selecting this, you will have to specify the path to the file. The contents of this file will be copied as release notes at the time of release creation. + * Inline release notes: On selecting this, you can manually type your release notes into a text area. The contents of this text area will be copied as release notes at the time of release creation. + +* **Assets** These are the files that will be uploaded as assets for the release. You can use wild card characters to specify a set of files. All the matching files shall be uploaded. You can also specify multiple patterns - one path per line. By default, it uploads the contents of $(Build.ArtifactStagingDirectory). If the specified folder is missing, it throws a warning. + +* **Asset Upload Mode** This option is used in case of editing a release. There are 2 ways in which assets can be uploaded. + + * Delete existing assets: When using this option, the task will first delete any existing assets in the release and upload all the assets once again. + + * Replace existing assets: When using this option, the task will replace any assets that have the same name* + +* **Draft Release** Check this option if the release has to be saved as a draft release. If kept unchecked, the created release will be published. This option is ignored in case of *delete* action. + +* **Pre Release** Check this option if the release has to be marked as a pre-release. This option is ignored in case of *delete* action. + +* **Add Changelog:** Using this option you can generate and append list of changes to release notes. The list of changes(commits and issues) between this and last published release will be generated and appended to release notes. Maximum number of changes shown is 250. diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c89b1691ca88 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub-Release", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/AA3aeiw)", + "loc.description": "Hiermit wird ein GitHub-Release erstellt, bearbeitet oder gelöscht.", + "loc.instanceNameFormat": "GitHub-Release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Konfiguration des Änderungsprotokolls", + "loc.input.label.gitHubConnection": "GitHub-Verbindung (OAuth oder PAT)", + "loc.input.help.gitHubConnection": "Geben Sie den Namen der GitHub-Dienstverbindung an, die zum Herstellen einer Verbindung mit dem GitHub-Repository verwendet werden soll. Die Verbindung muss auf einem OAuth-Token eines GitHub-Benutzers oder einem persönlichen GitHub-Zugriffstoken basieren. Weitere Informationen zu Dienstverbindungen finden Sie [hier](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Geben Sie den Namen des GitHub-Repositorys an, in dem das GitHub-Release erstellt, bearbeitet oder gelöscht wird.", + "loc.input.label.action": "Aktion", + "loc.input.help.action": "Geben Sie den Typ des auszuführenden Releasevorgangs an. Mit dieser Aufgabe kann ein GitHub-Release erstellt, bearbeitet oder gelöscht werden.", + "loc.input.label.target": "Ziel", + "loc.input.help.target": "Geben Sie den Commit-SHA an, für den das GitHub-Release erstellt wird, z. B. \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Sie können hier auch eine Variable verwenden, beispielsweise \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Tagquelle", + "loc.input.help.tagSource": "Geben Sie das Tag an, das für die Releaseerstellung verwendet werden soll. Die Option \"Git-Tag\" verwendet automatisch das Tag, das dem Git-Commit zugeordnet ist. Verwenden Sie die Option \"Benutzerdefiniertes Tag\", um manuell ein Tag anzugeben.", + "loc.input.label.tagPattern": "Tagmuster", + "loc.input.help.tagPattern": " Geben Sie das Git-Tagmuster mithilfe eines regulären Ausdrucks (z. B. \"release-v1.*\") an. Ein GitHub-Release wird nur für Commits mit übereinstimmendem Git-Tag erstellt. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Geben Sie das Tag an, für das ein Release erstellt, bearbeitet oder gelöscht werden soll. Sie können hier auch eine Variable verwenden, z. B. \"$(myTagName)\".", + "loc.input.label.title": "Releasetitel", + "loc.input.help.title": "Geben Sie den Titel für das GitHub-Release an. Wenn Sie keinen Titel angeben, wird das Tag als Releasetitel verwendet.", + "loc.input.label.releaseNotesSource": "Quelle für Versionshinweise", + "loc.input.help.releaseNotesSource": "Geben Sie die Beschreibung für das GitHub-Release an. Verwenden Sie die Option \"Datei mit Anmerkungen zu dieser Version\", um den Inhalt einer Datei als Versionshinweise zu verwenden. Verwenden Sie die Option \"Inline-Versionshinweise\", um Anmerkungen zu dieser Version manuell einzugeben.", + "loc.input.label.releaseNotesFile": "Dateipfad zu Versionsanmerkungen", + "loc.input.help.releaseNotesFile": "Wählen Sie die Datei aus, die die Versionshinweise enthält.", + "loc.input.label.releaseNotes": "Versionshinweise", + "loc.input.help.releaseNotes": "Geben Sie hier die Versionshinweise ein. Markdown wird unterstützt.", + "loc.input.label.assets": "Ressourcen", + "loc.input.help.assets": "Geben Sie die Dateien an, die als Ressourcen für das Release hochgeladen werden sollen. Sie können Platzhalterzeichen verwenden, um mehrere Dateien anzugeben. Beispielsweise können Sie für Buildpipelines \"$(Build.ArtifactStagingDirectory)/*.zip\" oder für Releasepipelines \"$(System.DefaultWorkingDirectory)/*.zip\" verwenden. Es ist auch möglich, mehrere Muster anzugeben – ein Muster pro Zeile. Standardmäßig werden alle Dateien im Verzeichnis \"$(Build.ArtifactStagingDirectory)\" hochgeladen. Weitere Informationen zur Liste der verfügbaren vordefinierten Variablen finden Sie unter [Buildvariablen](https://aka.ms/AA4449z) und [Releasevariablen](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Uploadmodus für Ressourcen", + "loc.input.help.assetUploadMode": "Verwenden Sie die Option \"Vorhandene Ressourcen löschen\", um zunächst alle vorhandenen Ressourcen im Release zu löschen und dann alle Ressourcen hochzuladen. Verwenden Sie die Option \"Vorhandene Ressourcen ersetzen\", um alle Ressourcen mit übereinstimmenden Namen zu ersetzen.", + "loc.input.label.isDraft": "Entwurfsrelease", + "loc.input.help.isDraft": "Geben Sie an, ob das Release als (nicht veröffentlichter) Entwurf gespeichert werden soll. Bei Festlegung auf FALSE wird das Release veröffentlicht.", + "loc.input.label.isPreRelease": "Vorabversion", + "loc.input.help.isPreRelease": "Geben Sie an, ob das Release als Vorabversion gekennzeichnet werden soll.", + "loc.input.label.addChangeLog": "Änderungsprotokoll hinzufügen", + "loc.input.help.addChangeLog": "Bei Festlegung auf TRUE wird eine Liste der Änderungen (Commits und Issues) zwischen dieser und dem zuletzt veröffentlichten Release generiert und an die Versionshinweise angefügt.", + "loc.input.label.changeLogCompareToRelease": "Vergleichen mit", + "loc.input.help.changeLogCompareToRelease": "Geben Sie an, mit welchem Release der Vergleich erfolgen soll, um das Änderungsprotokoll zu generieren: \nLetztes vollständiges Release: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen, das nicht als Vorabversion gekennzeichnet ist.\nLetztes Nicht-Entwurfsrelease: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen.\nLetztes Nicht-Entwurfsrelease nach Tag: Bei dieser Option wird das aktuelle Release mit dem letzten Nicht-Entwurfsrelease verglichen, das mit dem angegebenen Tag übereinstimmt. Sie können anstelle eines Tags auch einen regulären Ausdruck angeben.", + "loc.input.label.changeLogCompareToReleaseTag": "Releasetag", + "loc.input.help.changeLogCompareToReleaseTag": "Geben Sie den regulären Ausdruck für das Releasetag an. Das Release, das mit diesem Tag übereinstimmt, wird als Basis für die Berechnung des Änderungsprotokolls verwendet.", + "loc.input.label.changeLogType": "Typ des Änderungsprotokolls", + "loc.input.help.changeLogType": "Das Änderungsprotokoll kann auf Commits oder Issues basieren. Ein auf Commits basierendes Änderungsprotokoll listet alle in einem Release enthaltenen Commits auf, während in einem auf Issues basierenden Änderungsprotokoll alle Issues/Pull Requests im Release aufgelistet werden.", + "loc.input.label.changeLogLabels": "Kategorien", + "loc.input.help.changeLogLabels": "Hiermit können Sie Änderungen anhand der Bezeichnung kategorisieren, die dem Issue/Pull Request zugeordnet ist. Für eine Bezeichnung können Sie den Anzeigenamen für die Kategorie und den Status des Issues angeben. Beispiel: \"\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Wenn eine Änderung mehrere Bezeichnungen aufweist, hat die erste angegebene Bezeichnung Vorrang. Lassen Sie dieses Feld leer, um eine flache Liste mit Issues/Pull Requests anzuzeigen.", + "loc.messages.GithubApiFailError": "Ein unerwarteter Fehler ist aufgetreten.", + "loc.messages.GetTagsError": "Unerwarteter Fehler beim Abrufen von Tags.", + "loc.messages.GetReleasesError": "Unerwarteter Fehler beim Abrufen von Releases.", + "loc.messages.CreateReleaseError": "Unerwarteter Fehler beim Erstellen der Release.", + "loc.messages.EditReleaseError": "Unerwarteter Fehler beim Bearbeiten des Release.", + "loc.messages.DeleteReleaseError": "Unerwarteter Fehler beim Löschen des Release.", + "loc.messages.CreatingRelease": "Release für Tag wird erstellt: %s", + "loc.messages.CreateReleaseSuccess": "Das Release wurde erfolgreich in \"%s\" erstellt.", + "loc.messages.ReleaseAlreadyExists": "Fehler beim Erstellen des Release. Für das folgende Tag ist bereits ein Release vorhanden: %s", + "loc.messages.EditingRelease": "Das Release mit folgendem Tag wird bearbeitet: %s", + "loc.messages.EditReleaseSuccess": "Release erfolgreich bearbeitet", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Es wurde kein vorhandenes Release zum Bearbeiten gefunden. Es wird ein Release mit dem folgenden Tag erstellt: %s", + "loc.messages.DeletingRelease": "Das Release für folgendes Tag wird gelöscht: %s", + "loc.messages.DeleteReleaseSuccess": "Die Release wurde erfolgreich gelöscht.", + "loc.messages.NoReleaseFoundToDelete": "Für das Tag \"%s\" wurde kein Release gefunden. Fehler beim Löschen des Release.", + "loc.messages.FetchReleaseForTag": "Das Release für das folgende Tag wird abgerufen: %s", + "loc.messages.FetchReleaseForTagSuccess": "Für folgendes Tag wurde ein Release gefunden: %s", + "loc.messages.FetchTagForTarget": "Es wird nach Tags gesucht, die dem Zielcommit zugeordnet sind: %s", + "loc.messages.FetchTagForTargetSuccess": "Für folgenden Zielcommit wurde ein Tag gefunden: %s", + "loc.messages.MissingAssetError": "Datei nicht gefunden: %s", + "loc.messages.MultipleReleasesFoundError": "Es wurde nur 1 Release erwartet, aber für das Tag \"%s\" wurde mehr als 1 Release gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.MultipleTagFound": "Es wurde nur 1 Tag erwartet, aber für den angegebenen Commit \"%s\" wurde mehr als 1 Tag gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.NoTagFound": "Das Release wird nicht erstellt, weil die Tags für den Zielcommit nicht mit dem angegebenen Tagmuster übereinstimmen.", + "loc.messages.DeleteAllExistingAssets": "Alle vorhandenen Ressourcen werden gelöscht...", + "loc.messages.DuplicateAssetFound": "Doppelte Ressource gefunden: %s", + "loc.messages.AssetsDeletedSuccessfully": "Die Ressourcen wurden erfolgreich gelöscht.", + "loc.messages.DeletingDuplicateAsset": "Doppelte Ressource wird gelöscht: %s", + "loc.messages.SkipDuplicateAssetFound": "Doppelte Ressource gefunden: %s. Wird übersprungen...", + "loc.messages.AssetDeletedSuccessfully": "Die Ressource \"%s\" wurde erfolgreich gelöscht.", + "loc.messages.AllAssetsUploadedSuccessfully": "Alle Ressourcen wurden erfolgreich hochgeladen.", + "loc.messages.ErrorDeletingDuplicateAsset": "Unerwarteter Fehler beim Löschen der doppelten Ressource: %s", + "loc.messages.ErrorDeletingAsset": "Unerwarteter Fehler beim Löschen der Ressource: %s", + "loc.messages.DeletingAsset": "Ressource wird gelöscht: %s", + "loc.messages.NoAssetFoundToDelete": "Es wurden keine Ressourcen zum Löschen gefunden.", + "loc.messages.UploadingAssets": "Ressourcen werden hochgeladen...", + "loc.messages.UploadingAsset": "Datei wird hochgeladen: \"%s\"", + "loc.messages.UploadAssetError": "Unerwarteter Fehler beim Hochladen der Datei: %s", + "loc.messages.UploadAssetSuccess": "Datei erfolgreich hochgeladen: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Es wurden keine Ressourcen zum Hochladen gefunden.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Die Datei mit Versionshinweisen \"%s\" ist ein Verzeichnis und keine Datei.", + "loc.messages.AssetIsDirectoryError": "Die Ressource ist ein Verzeichnis und keine Datei. Der Upload des Verzeichnisses wird übersprungen: %s", + "loc.messages.ComputingChangeLog": "In diesem Release vorgenommene Änderungen werden berechnet...", + "loc.messages.ComputingChangeLogSuccess": "Die Änderungen wurden erfolgreich berechnet.", + "loc.messages.CommitDiffBehind": "Die Änderungen können nicht berechnet werden, weil der angegebene Zielcommit älter ist als der Commit für das neueste veröffentlichte Release.", + "loc.messages.CommitDiffEqual": "Es wurden keine Änderungen gefunden. Der angegebene Zielcommit ist mit dem Commit für das neueste veröffentlichte Release identisch.", + "loc.messages.FetchLatestPublishRelease": "Das neueste veröffentlichte Release wird abgerufen...", + "loc.messages.FetchLatestNonDraftRelease": "Das neueste Nicht-Entwurfsrelease wird abgerufen...", + "loc.messages.FetchLastReleaseByTag": "Das neueste Release mit übereinstimmendem Tagmuster wird abgerufen: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Das neueste veröffentlichte Release wurde gefunden: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Das neueste Nicht-Entwurfsrelease wurde gefunden.", + "loc.messages.FetchTagMatchingReleaseSuccess": "Das neueste Release mit übereinstimmendem Tagmuster wurde gefunden: %s", + "loc.messages.GetLatestReleaseError": "Unerwarteter Fehler beim Abrufen des neuesten veröffentlichten Release.", + "loc.messages.NoLatestPublishRelease": "Im Repository wurden noch keine Releases veröffentlicht.", + "loc.messages.NoMatchingReleases": "Keine Nicht-Entwurfsreleases gefunden.", + "loc.messages.NoTagMatchingReleases": "Es wurden keine Releases gefunden, die mit dem Tagmuster übereinstimmen: %s.", + "loc.messages.FetchCommitDiff": "Die Liste der Commits seit dem zuletzt veröffentlichten Release wird abgerufen...", + "loc.messages.FetchCommitDiffSuccess": "Die Liste der Änderungen wurde gefunden.", + "loc.messages.FetchCommitDiffError": "Unerwarteter Fehler beim Abrufen der Liste mit Änderungen.", + "loc.messages.FetchInitialCommit": "Der erste Commit wird abgerufen...", + "loc.messages.FetchInitialCommitSuccess": "Der erste Commit wurde gefunden: %s", + "loc.messages.InvalidGitHubEndpoint": "Ungültiger GitHub-Dienstendpunkt: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Ungültiges GitHub-Dienstverbindungsschema: %s. Es sind nur GitHub-Verbindungen zulässig, die auf einem OAuth-Token oder einem persönlichen Zugriffstoken basieren.", + "loc.messages.FetchInitialCommitError": "Unerwarteter Fehler beim Abrufen des ersten Commits.", + "loc.messages.InvalidActionSet": "Ungültige Aktion: %s. Es sind nur die Aktionen \"create\", \"edit\" oder \"delete\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Ungültige Tagquelle: %s. Es sind nur die Optionen \"auto\" oder \"manual\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Ungültige Quelle für Versionshinweise: %s. Es sind nur die Optionen \"file\" oder \"input\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Ungültiges compareWith-Attribut: %s. Es sind nur die Optionen \"lastFullRelease\", \"lastNonDraftRelease\" oder \"lastNonDraftReleaseByTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Ungültiger Modus für Ressourcenupload: %s. Es sind nur die Aktionen \"delete\" oder \"replace\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Für die Aktion \"%s\" ist ein Tag erforderlich. Geben Sie im Schritt ein Tag an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Die Tagquelle ist auf \"manual\" festgelegt. Geben Sie ein Tag für die Aktion zum Erstellen an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Es wurden keine Dateien gefunden, die mit \"%s\" übereinstimmen. Keine Elemente zum Upload vorhanden.", + "loc.messages.PatternIsADirectory": "\"%s\" kann nicht hochgeladen werden, weil es sich um ein Verzeichnis handelt. Geben Sie eine Datei an.", + "loc.messages.SearchingFileMatchingPattern": "Es wird nach Dateien gesucht, die mit \"%s\" übereinstimmen.", + "loc.messages.IssuesFetchError": "Fehler beim Abrufen von Issues. Das Änderungsprotokoll kann nicht generiert werden.", + "loc.messages.NoIssuesLinkedError": "Im angegebenen Commitvergleich sind keine Issues mit Commits verknüpft.", + "loc.messages.LabelsSyntaxError": "Fehler beim Analysieren der Bezeichnungen. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Ungültiges ChangeLogType-Attribut: %s. Es sind nur die Optionen \"commitBased\" oder \"issueBased\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Änderungen", + "loc.messages.DefaultCategory": "Andere", + "loc.messages.SeeMoreText": "Mehr anzeigen" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/en-US/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..5e6bf87d2f8c --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub Release", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "loc.description": "Create, edit, or delete a GitHub release", + "loc.instanceNameFormat": "GitHub release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog configuration", + "loc.input.label.gitHubConnection": "GitHub connection (OAuth or PAT)", + "loc.input.help.gitHubConnection": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "loc.input.label.target": "Target", + "loc.input.help.target": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Tag source", + "loc.input.help.tagSource": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "loc.input.label.tagPattern": "Tag Pattern", + "loc.input.help.tagPattern": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`.", + "loc.input.label.title": "Release title", + "loc.input.help.title": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title.", + "loc.input.label.releaseNotesSource": "Release notes source", + "loc.input.help.releaseNotesSource": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "loc.input.label.releaseNotesFile": "Release notes file path", + "loc.input.help.releaseNotesFile": "Select the file which contains the release notes.", + "loc.input.label.releaseNotes": "Release notes", + "loc.input.help.releaseNotes": "Enter the release notes here. Markdown is supported.", + "loc.input.label.assets": "Assets", + "loc.input.help.assets": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Asset upload mode", + "loc.input.help.assetUploadMode": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "loc.input.label.isDraft": "Draft release", + "loc.input.help.isDraft": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "loc.input.label.isPreRelease": "Pre-release", + "loc.input.help.isPreRelease": "Indicate whether the release should be marked as a pre-release.", + "loc.input.label.addChangeLog": "Add changelog", + "loc.input.help.addChangeLog": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes.", + "loc.input.label.changeLogCompareToRelease": "Compare to", + "loc.input.help.changeLogCompareToRelease": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "loc.input.label.changeLogCompareToReleaseTag": "Release Tag", + "loc.input.help.changeLogCompareToReleaseTag": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation.", + "loc.input.label.changeLogType": "Changelog type", + "loc.input.help.changeLogType": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "loc.input.label.changeLogLabels": "Categories", + "loc.input.help.changeLogLabels": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr.", + "loc.messages.GithubApiFailError": "An unexpected error occurred.", + "loc.messages.GetTagsError": "An unexpected error occurred while fetching tags.", + "loc.messages.GetReleasesError": "An unexpected error occurred while fetching releases.", + "loc.messages.CreateReleaseError": "An unexpected error occurred while creating the release.", + "loc.messages.EditReleaseError": "An unexpected error occurred while editing the release.", + "loc.messages.DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "loc.messages.CreatingRelease": "Creating a release for tag: %s", + "loc.messages.CreateReleaseSuccess": "Release created successfully at %s", + "loc.messages.ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "loc.messages.EditingRelease": "Editing the release with tag: %s", + "loc.messages.EditReleaseSuccess": "Release edited successfully", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "loc.messages.DeletingRelease": "Deleting the release for tag: %s", + "loc.messages.DeleteReleaseSuccess": "Release deleted successfully.", + "loc.messages.NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "loc.messages.FetchReleaseForTag": "Fetching the release for tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "Found a release for tag: %s", + "loc.messages.FetchTagForTarget": "Searching for tags associated with target commit: %s", + "loc.messages.FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "loc.messages.MissingAssetError": "File not found: %s", + "loc.messages.MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "loc.messages.MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "loc.messages.NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", + "loc.messages.DeleteAllExistingAssets": "Deleting all existing assets...", + "loc.messages.DuplicateAssetFound": "Duplicate asset found: %s", + "loc.messages.AssetsDeletedSuccessfully": "Assets deleted successfully.", + "loc.messages.DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "loc.messages.SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "loc.messages.AssetDeletedSuccessfully": "Asset %s deleted successfully", + "loc.messages.AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "loc.messages.ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "loc.messages.ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "loc.messages.DeletingAsset": "Deleting asset: %s", + "loc.messages.NoAssetFoundToDelete": "No assets were found to delete.", + "loc.messages.UploadingAssets": "Uploading assets...", + "loc.messages.UploadingAsset": "Uploading file: '%s'.", + "loc.messages.UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "loc.messages.UploadAssetSuccess": "Uploaded file successfully: '%s'", + "loc.messages.NoAssetFoundToUpload": "No assets were found to upload.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "loc.messages.AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "loc.messages.ComputingChangeLog": "Computing changes made in this release...", + "loc.messages.ComputingChangeLogSuccess": "Changes computed successfully.", + "loc.messages.CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "loc.messages.CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "loc.messages.FetchLatestPublishRelease": "Fetching the latest published release...", + "loc.messages.FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "loc.messages.FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "loc.messages.FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "loc.messages.GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "loc.messages.NoLatestPublishRelease": "No releases are published yet in the repository.", + "loc.messages.NoMatchingReleases": "No non-draft releases found.", + "loc.messages.NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "loc.messages.FetchCommitDiff": "Fetching the list of commits since the last published release...", + "loc.messages.FetchCommitDiffSuccess": "Found the list of changes.", + "loc.messages.FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "loc.messages.FetchInitialCommit": "Fetching the initial commit...", + "loc.messages.FetchInitialCommitSuccess": "Found the initial commit: %s", + "loc.messages.InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "loc.messages.FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "loc.messages.InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "loc.messages.PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "loc.messages.SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "loc.messages.IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "loc.messages.NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "loc.messages.LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changes", + "loc.messages.DefaultCategory": "Others", + "loc.messages.SeeMoreText": "See More" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..129df4fe5a46 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versión de GitHub", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/AA3aeiw)", + "loc.description": "Crea, edita o elimina una versión de GitHub.", + "loc.instanceNameFormat": "Versión de GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuración del registro de cambios", + "loc.input.label.gitHubConnection": "Conexión de GitHub (OAuth o PAT)", + "loc.input.help.gitHubConnection": "Especifique el nombre de la conexión de servicio de GitHub que se va a usar para conectarse al repositorio de GitHub. La conexión se debe basar en el valor OAuth del usuario de GitHub o en un token de acceso personal de GitHub. Obtenga más información sobre las conexiones de servicio [aquí](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repositorio", + "loc.input.help.repositoryName": "Especifique el nombre del repositorio de GitHub en el que se creará, editará o eliminará la versión de GitHub.", + "loc.input.label.action": "Acción", + "loc.input.help.action": "Especifique el tipo de operación de versión que se va a realizar. Esta tarea permite crear, editar o eliminar una versión de GitHub.", + "loc.input.label.target": "Destino", + "loc.input.help.target": "Especifique el SHA de \"commit\" para el que se creará la versión de GitHub. Por ejemplo, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". También puede usar una variable aquí; por ejemplo, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Origen de etiqueta", + "loc.input.help.tagSource": "Especifique la etiqueta que se va a usar para la creación de la versión. La opción \"Git tag\" obtiene automáticamente la etiqueta asociada al \"commit\" de GIT. Utilice la opción \"User specified tag\" para proporcionar una etiqueta de forma manual.", + "loc.input.label.tagPattern": "Patrón de etiqueta", + "loc.input.help.tagPattern": " Especifique el patrón de etiqueta GIT mediante una notación regex (por ejemplo, \"release-v1.*\"). La versión de GitHub solo se creará para los \"commits\" que tengan una etiqueta GIT coincidente. ", + "loc.input.label.tag": "Etiqueta", + "loc.input.help.tag": "Especifique la etiqueta para la que se va a crear, editar o eliminar una versión. También puede usar una variable aquí. Por ejemplo, \"$(myTagName)\".", + "loc.input.label.title": "Título de la versión", + "loc.input.help.title": "Especifique el título de la versión de GitHub. Si se deja en blanco, se usará la etiqueta como título de la versión.", + "loc.input.label.releaseNotesSource": "Origen de las notas de la versión", + "loc.input.help.releaseNotesSource": "Especifique la descripción de la versión de GitHub. Use la opción \"Archivo de notas de la versión\" para utilizar el contenido de un archivo como notas de la versión. Use la opción \"Inline release notes\" para escribir las notas de la versión de forma manual.", + "loc.input.label.releaseNotesFile": "Ruta de acceso al archivo de notas de la versión", + "loc.input.help.releaseNotesFile": "Seleccione el archivo que contiene las notas de la versión.", + "loc.input.label.releaseNotes": "Notas de la versión", + "loc.input.help.releaseNotes": "Especifique aquí las notas de la versión. Se admite Markdown.", + "loc.input.label.assets": "Recursos", + "loc.input.help.assets": "Especifique los archivos que se van a cargar como recursos de la versión. Puede usar caracteres comodín para especificar varios archivos. Por ejemplo, \"$(Build.ArtifactStagingDirectory)/*.zip\" para las canalizaciones de compilación o \"`$(System.DefaultWorkingDirectory)/*.zip\" en el caso de las canalizaciones de versión. También puede especificar varios patrones, uno por cada línea. De forma predeterminada, se cargarán todos los archivos del directorio $(Build.ArtifactStagingDirectory). Para obtener más información sobre la lista de variables predefinidas disponibles, consulte las [variables de compilación](https://aka.ms/AA4449z) y las [variables de versión] (https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modo de carga de recursos", + "loc.input.help.assetUploadMode": "Use la opción \"Delete existing assets\" para eliminar primero los recursos existentes en la versión y, después, cargar todos los recursos. Use la opción \"Replace existing assets\" para reemplazar los recursos que tengan el mismo nombre.", + "loc.input.label.isDraft": "Versión de borrador", + "loc.input.help.isDraft": "Indique si la versión debe guardarse como borrador (sin publicar). Si el valor es \"false\", la versión se publicará.", + "loc.input.label.isPreRelease": "Versión preliminar", + "loc.input.help.isPreRelease": "Indique si la versión se debe marcar como versión preliminar.", + "loc.input.label.addChangeLog": "Agregar registro de cambios", + "loc.input.help.addChangeLog": "Si se establece en \"true\", se generará una lista de los cambios (\"commits\" e \"issues\") entre esta y la última versión publicada y se anexará a las notas de la versión.", + "loc.input.label.changeLogCompareToRelease": "Comparar con", + "loc.input.help.changeLogCompareToRelease": "Indique la versión con la que debemos comparar para generar el registro de cambios: \nÚltima versión completa: compara la versión actual con la versión más reciente que no sea de borrador y que no esté marcada como versión preliminar.\nÚltima versión de no borrador: compara la versión actual con la versión más reciente que no sea de borrador.\nÚltima versión de no borrador por etiqueta: compara la versión actual con la última versión que no sea de borrador y que coincida con la etiqueta especificada. También puede especificar una notación regex en lugar de una etiqueta exacta.", + "loc.input.label.changeLogCompareToReleaseTag": "Etiqueta de versión", + "loc.input.help.changeLogCompareToReleaseTag": "Especifique la notación regex para la etiqueta de versión. La versión que coincida con esta etiqueta se usará como base para el cálculo del registro de cambios.", + "loc.input.label.changeLogType": "Tipo de registro de cambios", + "loc.input.help.changeLogType": "El registro de cambios puede basarse en \"commits\" o en incidencias. Un registro de cambios basado en \"commits\" enumera todos los \"commits\" incluidos en una versión, mientras que un registro de cambios basado en incidencias enumera todas las incidencias o solicitudes de incorporación de cambios que se incluyen en la versión. ", + "loc.input.label.changeLogLabels": "Categorías", + "loc.input.help.changeLogLabels": "Si usa esta opción, puede clasificar los cambios en función de la etiqueta asociada a la incidencia o a la solicitud de incorporación de cambios. Para una etiqueta, puede mencionar el nombre para mostrar de la categoría y el estado de la incidencia. Por ejemplo, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Si un cambio tiene varias etiquetas, la primera etiqueta que se especifique tiene prioridad. Deje este campo en blanco para ver una lista plana de las incidencias o solicitudes de incorporación de cambios.", + "loc.messages.GithubApiFailError": "Error inesperado.", + "loc.messages.GetTagsError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las etiquetas.", + "loc.messages.GetReleasesError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las versiones.", + "loc.messages.CreateReleaseError": "Error inesperado al crear la versión.", + "loc.messages.EditReleaseError": "Error inesperado al editar la versión.", + "loc.messages.DeleteReleaseError": "Error inesperado al eliminar la versión.", + "loc.messages.CreatingRelease": "Creando una versión para la etiqueta: %s", + "loc.messages.CreateReleaseSuccess": "La versión se ha creado correctamente en %s", + "loc.messages.ReleaseAlreadyExists": "No se pudo crear la versión. Ya existe una versión para la etiqueta: %s", + "loc.messages.EditingRelease": "Editando la versión con la etiqueta %s", + "loc.messages.EditReleaseSuccess": "La versión se ha editado correctamente.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No se ha encontrado ninguna versión existente para editar. Se va a crear una con la etiqueta %s", + "loc.messages.DeletingRelease": "Eliminando la versión de la etiqueta: %s", + "loc.messages.DeleteReleaseSuccess": "La versión se eliminó correctamente.", + "loc.messages.NoReleaseFoundToDelete": "No se encontró ninguna versión para la etiqueta %s. Error al eliminar la versión.", + "loc.messages.FetchReleaseForTag": "Usando \"fetch\" para recuperar cambios de la versión de la etiqueta: %s", + "loc.messages.FetchReleaseForTagSuccess": "Se ha encontrado una versión para la etiqueta: %s", + "loc.messages.FetchTagForTarget": "Buscando etiquetas asociadas al \"commit\" de destino: %s", + "loc.messages.FetchTagForTargetSuccess": "Se ha encontrado una etiqueta para el \"commit\" de destino: %s", + "loc.messages.MissingAssetError": "No se encuentra el archivo: %s", + "loc.messages.MultipleReleasesFoundError": "Se esperaba solo una versión, pero se ha encontrado más de una para la etiqueta: %s. No se puede realizar la acción.", + "loc.messages.MultipleTagFound": "Se esperaba solo una etiqueta, pero se ha encontrado más de una para el \"commit\" dado: %s. No se puede realizar la acción.", + "loc.messages.NoTagFound": "La versión no se creará porque las etiquetas del \"commit\" de destino no coinciden con el patrón de etiqueta dado.", + "loc.messages.DeleteAllExistingAssets": "Eliminando todos los recursos existentes...", + "loc.messages.DuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s", + "loc.messages.AssetsDeletedSuccessfully": "Los recursos se han eliminado correctamente.", + "loc.messages.DeletingDuplicateAsset": "Eliminando el recurso duplicado: %s", + "loc.messages.SkipDuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s. Omitiendo...", + "loc.messages.AssetDeletedSuccessfully": "El recurso %s se ha eliminado correctamente.", + "loc.messages.AllAssetsUploadedSuccessfully": "Todos los recursos se han cargado correctamente.", + "loc.messages.ErrorDeletingDuplicateAsset": "Error inesperado al eliminar el recurso duplicado: %s", + "loc.messages.ErrorDeletingAsset": "Error inesperado al eliminar el recurso: %s", + "loc.messages.DeletingAsset": "Eliminando el recurso: %s", + "loc.messages.NoAssetFoundToDelete": "No se han encontrado recursos para eliminar.", + "loc.messages.UploadingAssets": "Cargando los recursos...", + "loc.messages.UploadingAsset": "Cargando el archivo: \"%s\".", + "loc.messages.UploadAssetError": "Error inesperado al cargar el archivo: %s", + "loc.messages.UploadAssetSuccess": "El archivo se cargó correctamente: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "No se han encontrado recursos para cargar.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "El archivo de notas de la versión %s es un directorio y no un archivo.", + "loc.messages.AssetIsDirectoryError": "El recurso es un directorio y no un archivo. Omitiendo la carga del directorio: %s", + "loc.messages.ComputingChangeLog": "Calculando los cambios realizados en esta versión...", + "loc.messages.ComputingChangeLogSuccess": "Los cambios se han calculado correctamente.", + "loc.messages.CommitDiffBehind": "No se pueden calcular los cambios porque el \"commit\" de destino proporcionado es anterior al de la última versión publicada.", + "loc.messages.CommitDiffEqual": "No se han encontrado cambios. El \"commit\" de destino proporcionado es el mismo que el de la última versión publicada.", + "loc.messages.FetchLatestPublishRelease": "Usando \"fetch\" para recuperar cambios de la última versión publicada...", + "loc.messages.FetchLatestNonDraftRelease": "Capturando la última versión que no sea de borrador...", + "loc.messages.FetchLastReleaseByTag": "Captura de la última versión que coincida con el patrón de etiqueta: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Se ha encontrado la última versión publicada: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Se ha encontrado la última versión que no es un borrador", + "loc.messages.FetchTagMatchingReleaseSuccess": "Se ha encontrado la última versión que coincide con el patrón de etiqueta: %s", + "loc.messages.GetLatestReleaseError": "Error inesperado al aplicar \"fetch\" para recuperar cambios de la última versión publicada.", + "loc.messages.NoLatestPublishRelease": "No hay ninguna versión publicada aún en el repositorio.", + "loc.messages.NoMatchingReleases": "No se encontró ninguna versión que no sea de borrador.", + "loc.messages.NoTagMatchingReleases": "No se encontraron versiones que coincidan con el patrón de etiqueta: %s ", + "loc.messages.FetchCommitDiff": "Usando \"fetch\" para recuperar cambios de la lista de elementos \"commit\" desde la última versión publicada...", + "loc.messages.FetchCommitDiffSuccess": "Se ha encontrado la lista de cambios.", + "loc.messages.FetchCommitDiffError": "Error inesperado al aplicar \"fetch\" a la lista de cambios.", + "loc.messages.FetchInitialCommit": "Usando \"fetch\" para recuperar cambios del \"commit\" inicial...", + "loc.messages.FetchInitialCommitSuccess": "Se ha encontrado el \"commit\" inicial: %s", + "loc.messages.InvalidGitHubEndpoint": "Punto de conexión de servicio de GitHub no válido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Esquema de conexión del servicio de GitHub no válido: %s. Solo se permiten conexiones de token de acceso personal de GitHub y OAuth.", + "loc.messages.FetchInitialCommitError": "Error inesperado al aplicar \"fetch\" para la recuperación de cambios del \"commit\" inicial.", + "loc.messages.InvalidActionSet": "Acción no válida: %s. Solo se permiten las acciones \"create\", \"edit\" o \"delete\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origen de etiqueta no válido: %s. Solo se permiten las opciones \"auto\" o \"manual\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origen de notas de la versión no válido: %s. Solo se permiten las opciones \"file\" o \"input\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Atributo compareWith no válido: %s. Solo se permiten las opciones \"lastFullRelease\", \"lastNonDraftRelease\" o \"lastNonDraftReleaseByTag\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modo de carga de recursos no válido: %s. Solo se permiten las opciones \"delete\" o \"replace\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Se requiere una etiqueta para la acción \"%s\". Especifique una etiqueta en el paso. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "El origen de la etiqueta está establecido en manual; especifique una etiqueta para la acción \"create\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No se ha encontrado ningún archivo que coincida con \"%s\". No hay nada que cargar.", + "loc.messages.PatternIsADirectory": "No se puede cargar \"%s\" porque es un directorio. Especifique un archivo.", + "loc.messages.SearchingFileMatchingPattern": "Buscando archivos que coincidan con \"%s\".", + "loc.messages.IssuesFetchError": "Error al capturar las incidencias. No se puede generar el registro de cambios.", + "loc.messages.NoIssuesLinkedError": "No hay ninguna incidencia vinculada a los \"commits\" en la diferencia de \"commits\" especificada.", + "loc.messages.LabelsSyntaxError": "Error al analizar las etiquetas. Para ver la sintaxis YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Atributo ChangeLogType no válido: %s. Solo se permiten las opciones \"commitBased\" o \"issueBased\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Cambios", + "loc.messages.DefaultCategory": "Otra", + "loc.messages.SeeMoreText": "Ver más" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..365b19681859 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Mise en production GitHub", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/AA3aeiw)", + "loc.description": "Créer, modifier ou supprimer une mise en production GitHub", + "loc.instanceNameFormat": "Mise en production GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuration du journal des modifications", + "loc.input.label.gitHubConnection": "Connexion GitHub (OAuth ou PAT)", + "loc.input.help.gitHubConnection": "Spécifiez le nom de la connexion de service GitHub à utiliser pour la connexion au dépôt GitHub. La connexion doit être basée sur le jeton OAuth d'un utilisateur GitHub ou un jeton d'accès personnel GitHub. En savoir plus sur les connexions de service [ici](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Dépôt", + "loc.input.help.repositoryName": "Spécifiez le nom du dépôt GitHub dans lequel la mise en production GitHub est créée, modifiée ou supprimée.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Spécifiez le type d'opération de mise en production à effectuer. Cette tâche permet de créer, modifier ou supprimer une mise en production GitHub.", + "loc.input.label.target": "Cible", + "loc.input.help.target": "Spécifiez le SHA de validation pour lequel la mise en production GitHub doit être créée. Exemple : '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. Vous pouvez également utiliser une variable ici. Exemple : '$(myCommitSHA)'.", + "loc.input.label.tagSource": "Source de l'étiquette", + "loc.input.help.tagSource": "Spécifiez l'étiquette à utiliser pour la création de la mise en production. L'option Étiquette Git accepte automatiquement l'étiquette associée à la validation Git. Utilisez l'option Étiquette spécifiée par l'utilisateur pour fournir une étiquette manuellement.", + "loc.input.label.tagPattern": "Modèle d'étiquette", + "loc.input.help.tagPattern": " Spécifiez le modèle d'étiquette git à l'aide d'une notation regex (par exemple 'release-v1.*'). La mise en production GitHub est créée uniquement pour les commits qui ont une étiquette git correspondante. ", + "loc.input.label.tag": "Étiquette", + "loc.input.help.tag": "Spécifiez l'étiquette pour laquelle vous souhaitez créer, modifier ou supprimer une mise en production. Vous pouvez également utiliser une variable ici. Exemple : '$(myTagName)'.", + "loc.input.label.title": "Titre de la mise en production", + "loc.input.help.title": "Spécifiez le titre de la mise en production GitHub. Si rien n'est indiqué, l'étiquette est utilisée en tant que titre de la mise en production.", + "loc.input.label.releaseNotesSource": "Source des notes de publication", + "loc.input.help.releaseNotesSource": "Spécifiez la description de la mise en production GitHub. Utilisez l'option Fichier de notes de publication pour utiliser le contenu d'un fichier en tant que notes de publication. Utilisez l'option Notes de publication inline pour entrer manuellement les notes de publication.", + "loc.input.label.releaseNotesFile": "Chemin du fichier de notes de publication", + "loc.input.help.releaseNotesFile": "Sélectionnez le fichier qui contient les notes de publication.", + "loc.input.label.releaseNotes": "Notes de publication", + "loc.input.help.releaseNotes": "Entrez les notes de publication ici. Markdown est pris en charge.", + "loc.input.label.assets": "Ressources", + "loc.input.help.assets": "Spécifiez les fichiers à charger en tant que composants de la mise en production. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers. Exemple : '$(Build.ArtifactStagingDirectory)/*.zip' pour les pipelines de build ou '$(System.DefaultWorkingDirectory)/*.zip' pour les pipelines de mise en production. Vous pouvez également spécifier plusieurs modèles (un par ligne). Par défaut, tous les fichiers du répertoire $(Build.ArtifactStagingDirectory) sont chargés. Pour en savoir plus sur la liste des variables prédéfinies disponibles, consultez les informations relatives aux [variables de build](https://aka.ms/AA4449z) et aux [variables de mise en production](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Mode de chargement des composants", + "loc.input.help.assetUploadMode": "Utilisez l'option Supprimer les composants existants pour supprimer d'abord tous les composants existants de la mise en production avant de charger tous les composants. Utilisez l'option Remplacer les composants existants pour remplacer les composants qui portent le même nom.", + "loc.input.label.isDraft": "Version brouillon", + "loc.input.help.isDraft": "Indiquez si la mise en production doit être enregistrée en tant que brouillon (non publiée). Si la valeur est 'false', la mise en production est publiée.", + "loc.input.label.isPreRelease": "Préversion", + "loc.input.help.isPreRelease": "Indiquez si la mise en production doit être marquée en tant que préversion.", + "loc.input.label.addChangeLog": "Ajouter un journal des modifications", + "loc.input.help.addChangeLog": "Si la valeur est 'true', la liste des changements (validations et problèmes) survenus entre cette mise en production et la dernière mise en production publiée est générée et ajoutée aux notes de publication.", + "loc.input.label.changeLogCompareToRelease": "Comparer à", + "loc.input.help.changeLogCompareToRelease": "Indiquez la mise en production que nous devons comparer pour générer le journal des modifications : \nDernière mise en production complète : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente qui n'est pas marquée en tant que préversion.\nDernière mise en production non-brouillon : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente.\nDernière mise en production non-brouillon par étiquette : compare la mise en production actuelle avec la dernière mise en production non-brouillon correspondant à l'étiquette spécifiée. Vous pouvez également utiliser une notation regex à la place d'une étiquette exacte.", + "loc.input.label.changeLogCompareToReleaseTag": "Étiquette de mise en production", + "loc.input.help.changeLogCompareToReleaseTag": "Spécifiez la notation regex de l'étiquette de mise en production. La mise en production correspondant à cette étiquette sert de base au calcul du journal des modifications.", + "loc.input.label.changeLogType": "Type de journal des modifications", + "loc.input.help.changeLogType": "Le journal des modifications peut être basé sur les commits ou les problèmes. Le journal des modifications basé sur les commits liste tous les commits inclus dans une mise en production alors que le journal des modifications basé sur les problèmes liste la totalité des problèmes/demandes de tirage (pull requests) inclus dans la mise en production. ", + "loc.input.label.changeLogLabels": "Catégories", + "loc.input.help.changeLogLabels": "Ainsi, vous pouvez catégoriser les changements en fonction de l'étiquette associée au problème/à la demande de tirage (pull request). Pour une étiquette, vous pouvez mentionner le nom d'affichage de la catégorie et l'état du problème. Exemple : \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Dans le cas où un changement comporte plusieurs étiquettes, la première étiquette spécifiée est prioritaire. Laissez ce champ vide pour voir une liste plate des problèmes/demandes de tirage.", + "loc.messages.GithubApiFailError": "Une erreur inattendue s'est produite.", + "loc.messages.GetTagsError": "Une erreur inattendue s'est produite durant la récupération (fetch) des étiquettes.", + "loc.messages.GetReleasesError": "Une erreur inattendue s'est produite durant la récupération (fetch) des mises en production.", + "loc.messages.CreateReleaseError": "Une erreur inattendue s'est produite durant la création de la mise en production.", + "loc.messages.EditReleaseError": "Une erreur inattendue s'est produite durant la modification de la mise en production.", + "loc.messages.DeleteReleaseError": "Une erreur inattendue s'est produite durant la suppression de la mise en production.", + "loc.messages.CreatingRelease": "Création d'une mise en production pour l'étiquette : %s", + "loc.messages.CreateReleaseSuccess": "Création réussie de la mise en production à %s", + "loc.messages.ReleaseAlreadyExists": "Échec de la création de la mise en production. Il existe déjà une mise en production pour l'étiquette : %s", + "loc.messages.EditingRelease": "Modification de la mise en production avec l'étiquette : %s", + "loc.messages.EditReleaseSuccess": "Mise en production modifiée correctement", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Il n'existe aucune mise en production à modifier. Création d'une mise en production avec l'étiquette : %s", + "loc.messages.DeletingRelease": "Suppression de la mise en production pour l'étiquette : %s", + "loc.messages.DeleteReleaseSuccess": "Suppression réussie de la mise en production.", + "loc.messages.NoReleaseFoundToDelete": "Mise en production introuvable pour l'étiquette : %s. Échec de la suppression de la mise en production.", + "loc.messages.FetchReleaseForTag": "Récupération (fetch) de la mise en production pour l'étiquette : %s", + "loc.messages.FetchReleaseForTagSuccess": "Mise en production trouvée pour l'étiquette : %s", + "loc.messages.FetchTagForTarget": "Recherche d'étiquettes associées à la validation cible : %s", + "loc.messages.FetchTagForTargetSuccess": "Étiquette trouvée pour la validation cible : %s", + "loc.messages.MissingAssetError": "Fichier introuvable : %s", + "loc.messages.MultipleReleasesFoundError": "Une seule mise en production était attendue, mais plusieurs mises en production ont été trouvées pour l'étiquette : %s. Impossible d'effectuer l'action.", + "loc.messages.MultipleTagFound": "Une seule étiquette était attendue, mais plusieurs étiquettes ont été trouvées pour la validation spécifiée : %s. Impossible d'effectuer l'action.", + "loc.messages.NoTagFound": "La mise en production ne sera pas créée, car les étiquettes du commit cible ne correspondent pas au modèle d'étiquette donné.", + "loc.messages.DeleteAllExistingAssets": "Suppression de tous les composants existants...", + "loc.messages.DuplicateAssetFound": "Composant dupliqué trouvé : %s", + "loc.messages.AssetsDeletedSuccessfully": "Composants supprimés correctement.", + "loc.messages.DeletingDuplicateAsset": "Suppression du composant dupliqué : %s", + "loc.messages.SkipDuplicateAssetFound": "Composant dupliqué trouvé : %s. Ignoré...", + "loc.messages.AssetDeletedSuccessfully": "Composant %s supprimé correctement", + "loc.messages.AllAssetsUploadedSuccessfully": "Tous les composants ont été chargés correctement.", + "loc.messages.ErrorDeletingDuplicateAsset": "Une erreur inattendue s'est produite durant la suppression du composant dupliqué : %s", + "loc.messages.ErrorDeletingAsset": "Une erreur inattendue s'est produite durant la suppression du composant : %s", + "loc.messages.DeletingAsset": "Suppression du composant : %s", + "loc.messages.NoAssetFoundToDelete": "Les composants à supprimer sont introuvables.", + "loc.messages.UploadingAssets": "Chargement des composants...", + "loc.messages.UploadingAsset": "Chargement du fichier : '%s'.", + "loc.messages.UploadAssetError": "Une erreur inattendue s'est produite durant le chargement du fichier : %s", + "loc.messages.UploadAssetSuccess": "Chargement réussi du fichier : '%s'", + "loc.messages.NoAssetFoundToUpload": "Les composants à charger sont introuvables.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Fichier de notes de publication : %s est un répertoire et non un fichier.", + "loc.messages.AssetIsDirectoryError": "La composant est un répertoire et non un fichier. Chargement du répertoire ignoré : %s", + "loc.messages.ComputingChangeLog": "Calcul des changements apportés à cette mise en production...", + "loc.messages.ComputingChangeLogSuccess": "Changements calculés correctement.", + "loc.messages.CommitDiffBehind": "Impossible de calculer les modifications, car la validation cible fournie est antérieure à la validation de la dernière mise en production publiée.", + "loc.messages.CommitDiffEqual": "Changements introuvables. La validation cible fournie est la même que celle de la dernière mise en production publiée.", + "loc.messages.FetchLatestPublishRelease": "Récupération (fetch) de la dernière mise en production publiée...", + "loc.messages.FetchLatestNonDraftRelease": "Récupération (fetch) de la dernière mise en production non-brouillon...", + "loc.messages.FetchLastReleaseByTag": "Récupération (fetch) de la dernière mise en production correspondant au modèle d'étiquette %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "La dernière mise en production publiée a été trouvée : %s", + "loc.messages.FetchMatchingReleaseSuccess": "La dernière mise en production non-brouillon a été trouvée", + "loc.messages.FetchTagMatchingReleaseSuccess": "La dernière mise en production correspondant au modèle d'étiquette %s a été trouvée", + "loc.messages.GetLatestReleaseError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la dernière mise en production publiée.", + "loc.messages.NoLatestPublishRelease": "Aucune mise en production n'a encore été publiée dans le dépôt.", + "loc.messages.NoMatchingReleases": "Mises en production non-brouillon introuvables.", + "loc.messages.NoTagMatchingReleases": "Aucune mise en production ne correspond au modèle d'étiquette : %s ", + "loc.messages.FetchCommitDiff": "Récupération (fetch) de la liste des validations depuis la dernière mise en production publiée...", + "loc.messages.FetchCommitDiffSuccess": "La liste des changements a été trouvée.", + "loc.messages.FetchCommitDiffError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la liste des changements.", + "loc.messages.FetchInitialCommit": "Récupération (fetch) de la validation initiale...", + "loc.messages.FetchInitialCommitSuccess": "Validation initiale trouvée : %s", + "loc.messages.InvalidGitHubEndpoint": "Point de terminaison de service GitHub non valide : %s.", + "loc.messages.InvalidEndpointAuthScheme": "Mode de connexion de service GitHub non valide : %s. Seules les connexions par jeton d'accès personnel OAuth et GitHub sont autorisées.", + "loc.messages.FetchInitialCommitError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la validation initiale.", + "loc.messages.InvalidActionSet": "Action non valide : %s. Seules les actions 'create', 'edit' ou 'delete' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Source de l'étiquette non valide : %s. Seules les options 'auto' ou 'manual' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Source des notes de publication non valide : %s. Seules les options 'file' ou 'input' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Attribut compareWith non valide : %s. Seules les options 'lastFullRelease, 'lastNonDraftRelease' ou 'lastNonDraftReleaseByTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Mode de chargement de composant non valide : %s. Seules les options 'delete' ou 'replace' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Pour l'action '%s', une étiquette est nécessaire. Spécifiez une étiquette au cours de l'étape. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "La source de l'étiquette est définie pour être manuelle. Spécifiez une étiquette pour l'action de création. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Il n'existe aucun fichier correspondant à '%s'. Rien à charger.", + "loc.messages.PatternIsADirectory": "Impossible de charger '%s', car il s'agit d'un répertoire. Spécifiez un fichier.", + "loc.messages.SearchingFileMatchingPattern": "Recherche de fichier(s) correspondant à '%s'.", + "loc.messages.IssuesFetchError": "Erreur durant la récupération (fetch) des problèmes. Impossible de générer le journal des modifications.", + "loc.messages.NoIssuesLinkedError": "Aucun problème n'est lié aux commits dans la comparaison des différences de commit spécifiée.", + "loc.messages.LabelsSyntaxError": "Une erreur s'est produite durant l'analyse des étiquettes. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Attribut ChangeLogType non valide : %s. Seules les options 'commitBased' ou 'issueBased' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changements", + "loc.messages.DefaultCategory": "Autres", + "loc.messages.SeeMoreText": "Voir plus" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4e2b441a4c76 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versione di GitHub", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/AA3aeiw)", + "loc.description": "Consente di creare, modificare o eliminare una versione di GitHub", + "loc.instanceNameFormat": "Versione di GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configurazione del log delle modifiche", + "loc.input.label.gitHubConnection": "Connessione a GitHub (OAuth o token di accesso personale)", + "loc.input.help.gitHubConnection": "Specificare il nome della connessione al servizio GitHub da usare per la connessione al repository GitHub. La connessione deve essere basata su un OAuth dell'utente di GitHub o su un token di accesso personale GitHub. Per altre informazioni sulle connessioni al servizio, vedere [qui](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specificare il nome del repository GitHub in cui verrà creata, modificata o eliminata la versione GitHub.", + "loc.input.label.action": "Azione", + "loc.input.help.action": "Specificare il tipo di operazione da eseguire sulla versione. Questa attività consente di creare, modificare o eliminare una versione di GitHub.", + "loc.input.label.target": "Destinazione", + "loc.input.help.target": "Specificare il commit SHA per cui verrà creata la versione GitHub, ad esempio `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. È anche possibile usare una variabile, ad esempio `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Origine dei tag", + "loc.input.help.tagSource": "Specificare il tag da usare per la creazione della versione. L'opzione 'Tag GIT' accetta automaticamente il tag associato al commit GIT. Selezionare l'opzione 'Tag specificato dall'utente' per specificare manualmente un tag.", + "loc.input.label.tagPattern": "Criterio tag", + "loc.input.help.tagPattern": " Consente di specificare il criterio tag GIT con espressioni regolari, ad esempio `release-v1.*`. La versione GitHub verrà creata solo per i commit a cui è associato il tag GIT corrispondente. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specificare il tag per cui creare, modificare o eliminare una versione. È anche possibile usare una variabile, ad esempio `$(myTagName)`.", + "loc.input.label.title": "Titolo della versione", + "loc.input.help.title": "Specificare il titolo della versione GitHub. Se viene lasciato vuoto, come titolo della versione verrà usato il tag.", + "loc.input.label.releaseNotesSource": "Origine delle note sulla versione", + "loc.input.help.releaseNotesSource": "Specificare la descrizione della versione di GitHub. Selezionare l'opzione 'File delle note sulla versione' per usare il contenuto di un file come note sulla versione. Selezionare l'opzione 'Note sulla versione online' per immettere manualmente le note sulla versione.", + "loc.input.label.releaseNotesFile": "Percorso del file delle note sulla versione", + "loc.input.help.releaseNotesFile": "Selezionare il file che contiene le note sulla versione.", + "loc.input.label.releaseNotes": "Note sulla versione", + "loc.input.help.releaseNotes": "Immettere qui le note sulla versione. Markdown è supportato.", + "loc.input.label.assets": "Asset", + "loc.input.help.assets": "Specificare i file da caricare come asset della versione. È possibile usare caratteri jolly per specificare più file. Ad esempio, specificare `$(Build.ArtifactStagingDirectory)/*.zip` per le pipeline di compilazione oppure `$(System.DefaultWorkingDirectory)/*.zip` per le pipeline di versione. È anche possibile specificare più criteri, uno per riga. Per impostazione predefinita, tutti i file verranno caricati nella directory $(Build.ArtifactStagingDirectory). Per altre informazioni sull'elenco delle variabili predefinite disponibili, vedere le [variabili di compilazione](https://aka.ms/AA4449z) e le [variabili di versione](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modalità di caricamento degli asset", + "loc.input.help.assetUploadMode": "Usare l'opzione 'Elimina asset esistenti' per eliminare prima tutti gli asset esistenti nella versione, quindi caricare tutti gli asset. Usare l'opzione 'Sostituisci asset esistenti' per sostituire gli asset con lo stesso nome.", + "loc.input.label.isDraft": "Versione bozza", + "loc.input.help.isDraft": "Indica se la versione deve essere salvata come bozza (non pubblicata). Se è `false`, la versione verrà pubblicata.", + "loc.input.label.isPreRelease": "Versione non definitiva", + "loc.input.help.isPreRelease": "Indica se la versione deve essere contrassegnata come versione non definitiva.", + "loc.input.label.addChangeLog": "Aggiungi log delle modifiche", + "loc.input.help.addChangeLog": "Se è impostato su `true`, verrà generato un elenco di modifiche (commit e problemi) relativo alla versione corrente e all'ultima versione pubblicata e tale elenco verrà aggiunto alle note sulla versione.", + "loc.input.label.changeLogCompareToRelease": "Confronta con", + "loc.input.help.changeLogCompareToRelease": "Indica la versione con cui eseguire il confronto per generare il log delle modifiche: \nUltima versione completa: confronta la versione corrente con la versione non bozza più recente che non è contrassegnata come versione non definitiva.\nUltima versione non bozza: confronta la versione corrente con la versione non bozza più recente.\nUltima versione non bozza per tag: confronta la versione corrente con l'ultima versione non bozza corrispondente al tag specificato. È anche possibile specificare un'espressione regolare invece di un tag esatto.", + "loc.input.label.changeLogCompareToReleaseTag": "Tag di versione", + "loc.input.help.changeLogCompareToReleaseTag": "Consente di specificare l'espressione regolare per il tag di versione. La versione corrispondente a questo tag verrà usata come base per il calcolo del log delle modifiche.", + "loc.input.label.changeLogType": "Tipo di log delle modifiche", + "loc.input.help.changeLogType": "Il log delle modifiche può essere basato su commit o su problemi. Il log delle modifiche basato su commit elenca tutti i commit inclusi in una versione, mentre quello basato su problemi elenca tutti i problemi o le richieste pull inclusi nella versione. ", + "loc.input.label.changeLogLabels": "Categorie", + "loc.input.help.changeLogLabels": "Consente di categorizzare le modifiche in base all'etichetta associata al problema o alla richiesta pull. Per un'etichetta è possibile menzionare il nome visualizzato per la categoria e lo stato del problema, ad esempio `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. Nel caso in cui a una modifica siano associate più etichette, la priorità viene assegnata alla prima etichetta specificata. Lasciare vuoto questo campo per visualizzare un elenco semplice di problemi/richieste pull.", + "loc.messages.GithubApiFailError": "Si è verificato un errore imprevisto.", + "loc.messages.GetTagsError": "Si è verificato un errore imprevisto durante il recupero dei tag.", + "loc.messages.GetReleasesError": "Si è verificato un errore imprevisto durante il recupero delle versioni.", + "loc.messages.CreateReleaseError": "Si è verificato un errore imprevisto durante la creazione della versione.", + "loc.messages.EditReleaseError": "Si è verificato un errore imprevisto durante la modifica della versione.", + "loc.messages.DeleteReleaseError": "Si è verificato un errore imprevisto durante l'eliminazione della versione.", + "loc.messages.CreatingRelease": "Creazione di una versione per il tag: %s", + "loc.messages.CreateReleaseSuccess": "La versione è stata creata in %s", + "loc.messages.ReleaseAlreadyExists": "Non è stato possibile creare la versione. Esiste già una versione per il tag: %s", + "loc.messages.EditingRelease": "Modifica della versione con il tag: %s", + "loc.messages.EditReleaseSuccess": "La versione è stata modificata", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Non sono state trovate versioni esistenti da modificare. Ne verrà creata una con tag: %s", + "loc.messages.DeletingRelease": "Eliminazione della versione per il tag: %s", + "loc.messages.DeleteReleaseSuccess": "La versione è stata eliminata.", + "loc.messages.NoReleaseFoundToDelete": "Non è stata trovata alcuna versione per il tag: %s. L'eliminazione della versione non è riuscita.", + "loc.messages.FetchReleaseForTag": "Recupero della versione per il tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "È stata trovata una versione per il tag: %s", + "loc.messages.FetchTagForTarget": "Ricerca dei tag associati al commit di destinazione: %s", + "loc.messages.FetchTagForTargetSuccess": "È stato trovato un tag per il commit di destinazione: %s", + "loc.messages.MissingAssetError": "File non trovato: %s", + "loc.messages.MultipleReleasesFoundError": "È prevista una sola versione, ma ne è stata trovata più di una per il tag: %s. Non è possibile eseguire l'azione.", + "loc.messages.MultipleTagFound": "È previsto un solo tag, ma ne è stato trovato più di uno per il commit specificato: %s. Non è possibile eseguire l'azione.", + "loc.messages.NoTagFound": "La versione non verrà creata perché i tag per il commit di destinazione non corrispondono al criterio tag specificato.", + "loc.messages.DeleteAllExistingAssets": "Eliminazione di tutti gli asset esistenti...", + "loc.messages.DuplicateAssetFound": "È stato trovato un asset duplicato: %s", + "loc.messages.AssetsDeletedSuccessfully": "Gli asset sono stati eliminati.", + "loc.messages.DeletingDuplicateAsset": "Eliminazione dell'asset duplicato: %s", + "loc.messages.SkipDuplicateAssetFound": "È stato trovato un asset duplicato: %s. Verrà ignorato...", + "loc.messages.AssetDeletedSuccessfully": "L'asset %s è stato eliminato", + "loc.messages.AllAssetsUploadedSuccessfully": "Tutti gli asset sono stati caricati.", + "loc.messages.ErrorDeletingDuplicateAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset duplicato: %s", + "loc.messages.ErrorDeletingAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset: %s", + "loc.messages.DeletingAsset": "Eliminazione dell'asset: %s", + "loc.messages.NoAssetFoundToDelete": "Non sono stati trovati asset da eliminare.", + "loc.messages.UploadingAssets": "Caricamento degli asset...", + "loc.messages.UploadingAsset": "Caricamento del file: '%s'.", + "loc.messages.UploadAssetError": "Si è verificato un errore imprevisto durante il caricamento del file: %s", + "loc.messages.UploadAssetSuccess": "Il file è stato caricato: '%s'", + "loc.messages.NoAssetFoundToUpload": "Non sono stati trovati asset da caricare.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Il file delle note sulla versione %s è una directory e non un file.", + "loc.messages.AssetIsDirectoryError": "L'asset è una directory e non un file. La directory di caricamento verrà ignorata: %s", + "loc.messages.ComputingChangeLog": "Calcolo delle modifiche apportate in questa versione...", + "loc.messages.ComputingChangeLogSuccess": "Le modifiche sono state calcolate.", + "loc.messages.CommitDiffBehind": "Non è possibile calcolare le modifiche perché il commit di destinazione specificato è meno recente del commit dell'ultima versione pubblicata.", + "loc.messages.CommitDiffEqual": "Non sono state trovate modifiche. Il commit di destinazione specificato è uguale a quello dell'ultima versione pubblicata.", + "loc.messages.FetchLatestPublishRelease": "Recupero dell'ultima versione pubblicata...", + "loc.messages.FetchLatestNonDraftRelease": "Recupero della versione non bozza più recente...", + "loc.messages.FetchLastReleaseByTag": "Recupero della versione più recente corrispondente al criterio tag %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "L'ultima versione pubblicata è stata trovata: %s", + "loc.messages.FetchMatchingReleaseSuccess": "La versione non bozza più recente è stata trovata", + "loc.messages.FetchTagMatchingReleaseSuccess": "La versione più recente corrispondente al criterio tag %s è stata trovata", + "loc.messages.GetLatestReleaseError": "Si è verificato un errore imprevisto durante il recupero dell'ultima versione pubblicata.", + "loc.messages.NoLatestPublishRelease": "Non sono ancora state pubblicate versioni nel repository.", + "loc.messages.NoMatchingReleases": "Non sono state trovate versioni non bozza.", + "loc.messages.NoTagMatchingReleases": "Non sono state trovate versioni corrispondenti al criterio tag %s ", + "loc.messages.FetchCommitDiff": "Recupero dell'elenco di commit eseguiti dall'ultima versione pubblicata...", + "loc.messages.FetchCommitDiffSuccess": "L'elenco di modifiche è stato trovato.", + "loc.messages.FetchCommitDiffError": "Si è verificato un errore imprevisto durante il recupero dell'elenco di modifiche.", + "loc.messages.FetchInitialCommit": "Recupero del commit iniziale...", + "loc.messages.FetchInitialCommitSuccess": "Il commit iniziale è stato trovato: %s", + "loc.messages.InvalidGitHubEndpoint": "Endpoint servizio GitHub non valido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Schema di connessione al servizio GitHub non valido: %s. Sono consentite solo le connessioni OAuth o con token di accesso personale GitHub.", + "loc.messages.FetchInitialCommitError": "Si è verificato un errore imprevisto durante il recupero del commit iniziale.", + "loc.messages.InvalidActionSet": "Azione non valida: %s. Sono consentite solo le azioni 'create', 'edit' e 'delete'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origine dei tag non valida: %s. Sono consentite solo le opzioni 'auto' e 'manual'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origine delle note sulla versione non valida: %s. Sono consentite solo le opzioni 'file' e 'input'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "L'attributo di compareWith non è valido: %s. Sono consentite solo le opzioni 'lastFullRelease, 'lastNonDraftRelease' o 'lastNonDraftReleaseByTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modalità di caricamento degli asset non valida: %s. Sono consentite solo le opzioni 'delete' e 'replace'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Per l'azione '%s' è richiesto un tag. Specificare un tag nel passaggio. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "L'origine del tag è impostata su manual. Specificare un tag per l'azione create. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Non sono stati trovati file corrispondenti a '%s'. Non c'è nulla da caricare.", + "loc.messages.PatternIsADirectory": "Non è possibile caricare '%s' perché è una directory. Specificare un file.", + "loc.messages.SearchingFileMatchingPattern": "Ricerca dei file corrispondenti a '%s'.", + "loc.messages.IssuesFetchError": "Si è verificato un errore durante il recupero dei problemi. Non è possibile generare il log delle modifiche.", + "loc.messages.NoIssuesLinkedError": "Non è stato collegato alcun problema ai commit nel Diff di commit specificato.", + "loc.messages.LabelsSyntaxError": "Si è verificato un errore durante l'analisi delle etichette. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "L'attributo di ChangeLogType non è valido: %s. Sono consentite solo le opzioni 'commitBased' o 'issueBased'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Modifiche", + "loc.messages.DefaultCategory": "Altri tipi", + "loc.messages.SeeMoreText": "Visualizza dettagli" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..03009f6805b6 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub リリース", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub リリースを作成、編集、または削除します", + "loc.instanceNameFormat": "GitHub リリース ($(action))", + "loc.group.displayName.changeLogConfiguration": "変更ログの構成", + "loc.input.label.gitHubConnection": "GitHub 接続 (OAuth または PAT)", + "loc.input.help.gitHubConnection": "GitHub リポジトリへの接続に使用する GitHub サービス接続の名前を指定します。この接続は、GitHub ユーザーの OAuth または GitHub 個人用アクセス トークンに基づいている必要があります。サービス接続については、[こちら](https://aka.ms/AA3am5s)を参照してください。", + "loc.input.label.repositoryName": "リポジトリ", + "loc.input.help.repositoryName": "GitHub リリースが作成、編集、または削除される GitHub リポジトリの名前を指定します。", + "loc.input.label.action": "アクション", + "loc.input.help.action": "実行するリリース操作の種類を指定します。このタスクでは、GitHub リリースを作成、編集、または削除できます。", + "loc.input.label.target": "ターゲット", + "loc.input.help.target": "GitHub リリースを作成するためのコミット SHA を指定します。例: `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。ここで変数を使用することもできます。例: '$(myCommitSHA)'。", + "loc.input.label.tagSource": "タグ ソース", + "loc.input.help.tagSource": "リリースの作成に使用するタグを指定します。[Git タグ] オプションを使用する場合、Git コミットと関連付けられているタグが自動的に取得されます。[ユーザー指定のタグ] オプションを使用する場合、手動でタグを指定します。", + "loc.input.label.tagPattern": "タグ パターン", + "loc.input.help.tagPattern": " 正規表現を使用して Git タグ パターンを指定します (例: `release-v1.*`)。GitHub リリースは、一致する Git タグがあるコミットに対してのみ作成されます。", + "loc.input.label.tag": "タグ", + "loc.input.help.tag": "リリースを作成、編集、または削除するためのタグを指定します。ここで変数を使用することもできます。例: `$(myTagName)`。", + "loc.input.label.title": "リリース タイトル", + "loc.input.help.title": "GitHub リリースのタイトルを指定します。空のままにすると、タグはリリース タイトルとして使用されます。", + "loc.input.label.releaseNotesSource": "リリース ノートのソース", + "loc.input.help.releaseNotesSource": "GitHub リリースの説明を指定します。ファイルの内容をリリース ノートとして使用するには、[リリース ノート ファイル] オプションを使用します。手動でリリース ノートを入力するには、[インライン リリース ノート] オプションを使用します。", + "loc.input.label.releaseNotesFile": "リリース ノート ファイル パス", + "loc.input.help.releaseNotesFile": "リリース ノートを含むファイルを選択します。", + "loc.input.label.releaseNotes": "リリース ノート", + "loc.input.help.releaseNotes": "リリース ノートをこちらに入力してください。マークダウンがサポートされています。", + "loc.input.label.assets": "資産", + "loc.input.help.assets": "リリース アセットとしてアップロードするファイルを指定します。ワイルドカード文字を使用して複数のファイルを指定できます。例: ビルド パイプラインの場合は `$(Build.ArtifactStagingDirectory)/*.zip`、リリース パイプラインの場合は `$(System.DefaultWorkingDirectory)/*.zip` とします。1 行に 1 つずつ、複数のパターンを指定することもできます。既定では、$(Build.ArtifactStagingDirectory) ディレクトリ内のすべてのファイルがアップロードされます。利用可能な事前定義済み変数のリストについて詳しくは、[ビルド変数](https://aka.ms/AA4449z)および[リリース変数](https://aka.ms/AA43wws)を参照してください。", + "loc.input.label.assetUploadMode": "アセット アップロード モード", + "loc.input.help.assetUploadMode": "最初にリリース内の既存のアセットを削除してからすべてのアセットをアップロードするには、[既存のアセットを削除] オプションを使用します。同じ名前のアセットを置換するには、[既存のアセットを置換] オプションを使用します。", + "loc.input.label.isDraft": "ドラフト リリース", + "loc.input.help.isDraft": "リリースを下書き (未公開) として保存する必要があるかどうかを示します。[false] の場合、リリースは公開されます。", + "loc.input.label.isPreRelease": "プレリリース", + "loc.input.help.isPreRelease": "リリースをプレリリースとしてマークする必要があるかどうかを示します。", + "loc.input.label.addChangeLog": "変更ログの追加", + "loc.input.help.addChangeLog": "[true] に設定されている場合、これと公開された最新リリースの間の変更 (コミットと公開) の一覧が生成され、リリース ノートに追加されます。", + "loc.input.label.changeLogCompareToRelease": "比較対象", + "loc.input.help.changeLogCompareToRelease": "変更ログを生成するために比較するリリースを指定します。\n最後の完全リリース: 現在のリリースを、プレリリースとしてマークされていない、ドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース: 現在のリリースをドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース (タグによる): 現在のリリースを、指定されたタグと一致する最後のドラフト以外のリリースと比較します。正確なタグの代わりに正規表現を指定することもできます。", + "loc.input.label.changeLogCompareToReleaseTag": "リリース タグ", + "loc.input.help.changeLogCompareToReleaseTag": "リリース タグの正規表現を指定します。このタグに一致するリリースは、変更ログの計算のベースとして使用されます。", + "loc.input.label.changeLogType": "変更ログの種類", + "loc.input.help.changeLogType": "変更ログは、コミット ベースまたはイシュー ベースにすることができます。コミット ベースの変更ログにはリリースに含まれているすべてのコミットが一覧表示されるのに対し、イシュー ベースの変更ログにはリリースに含まれるすべてのイシューまたは pull request が一覧表示されます。", + "loc.input.label.changeLogLabels": "カテゴリ", + "loc.input.help.changeLogLabels": "これを使用すると、イシューまたは PR に関連付けられているラベルに基づいて変更を分類できます。ラベルにはカテゴリの表示名とイシューの状態を含めることができます。例: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。1 つの変更に複数のラベルがある場合、最初に指定したラベルが優先されます。イシューまたは PR のフラットな一覧を表示するには、このフィールドを空のままにします。", + "loc.messages.GithubApiFailError": "予期しないエラーが発生しました。", + "loc.messages.GetTagsError": "タグのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.GetReleasesError": "リリースのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.CreateReleaseError": "リリースの作成中に予期しないエラーが発生しました。", + "loc.messages.EditReleaseError": "リリースの編集中に予期しないエラーが発生しました。", + "loc.messages.DeleteReleaseError": "リリースの削除中に予期しないエラーが発生しました。", + "loc.messages.CreatingRelease": "タグのリリースを作成しています: %s", + "loc.messages.CreateReleaseSuccess": "%s でリリースが正常に作成されました", + "loc.messages.ReleaseAlreadyExists": "リリースを作成できませんでした。次のタグのリリースが既に存在します: %s", + "loc.messages.EditingRelease": "タグ付きのリリースを編集しています: %s", + "loc.messages.EditReleaseSuccess": "リリースが正常に編集されました", + "loc.messages.NoReleaseFoundToEditCreateRelease": "編集対象の既存のリリースは見つかりませんでした。タグを使用して作成しています: %s", + "loc.messages.DeletingRelease": "タグのリリースを削除しています: %s", + "loc.messages.DeleteReleaseSuccess": "リリースが正常に削除されました。", + "loc.messages.NoReleaseFoundToDelete": "タグのリリースが見つかりませんでした: %s。リリースの削除に失敗しました。", + "loc.messages.FetchReleaseForTag": "タグのリリースをフェッチしています: %s", + "loc.messages.FetchReleaseForTagSuccess": "タグのリリースが見つかりました: %s", + "loc.messages.FetchTagForTarget": "ターゲットのコミットに関連付けられたタグを検索しています: %s", + "loc.messages.FetchTagForTargetSuccess": "ターゲット コミットのタグが見つかりました: %s", + "loc.messages.MissingAssetError": "ファイルが見つかりませんでした: %s", + "loc.messages.MultipleReleasesFoundError": "必要なリリースは 1 つだけですが、タグには複数のリリースが見つかりました: %s。操作を実行できません。", + "loc.messages.MultipleTagFound": "必要なタグは 1 つのみですが、指定されたコミットに複数のタグが見つかりました: %s。操作を実行できません。", + "loc.messages.NoTagFound": "ターゲット コミットのタグが指定されたタグ パターンと一致しないため、リリースは作成されません。", + "loc.messages.DeleteAllExistingAssets": "既存のすべてのアセットを削除しています...", + "loc.messages.DuplicateAssetFound": "重複するアセットが見つかりました: %s", + "loc.messages.AssetsDeletedSuccessfully": "アセットが正常に削除されました。", + "loc.messages.DeletingDuplicateAsset": "重複するアセットを削除しています: %s", + "loc.messages.SkipDuplicateAssetFound": "重複するアセットが見つかりました: %s。スキップしています...", + "loc.messages.AssetDeletedSuccessfully": "アセット %s が正常に削除されました", + "loc.messages.AllAssetsUploadedSuccessfully": "すべてのアセットが正常にアップロードされました。", + "loc.messages.ErrorDeletingDuplicateAsset": "重複するアセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.ErrorDeletingAsset": "アセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.DeletingAsset": "アセットを削除しています: %s", + "loc.messages.NoAssetFoundToDelete": "削除するアセットが見つかりませんでした。", + "loc.messages.UploadingAssets": "アセットをアップロードしています...", + "loc.messages.UploadingAsset": "ファイルをアップロードしています: '%s'。", + "loc.messages.UploadAssetError": "次のファイルのアップロード中に予期しないエラーが発生しました: %s", + "loc.messages.UploadAssetSuccess": "ファイルが正常にアップロードされました: '%s'", + "loc.messages.NoAssetFoundToUpload": "アップロードするアセットが見つかりませんでした。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "リリース ノート ファイル: %s はディレクトリであり、ファイルではありません。", + "loc.messages.AssetIsDirectoryError": "このアセットはディレクトリであり、ファイルではありません。ディレクトリのアップロードをスキップしています: %s", + "loc.messages.ComputingChangeLog": "このリリースで行われた変更を計算しています...", + "loc.messages.ComputingChangeLogSuccess": "変更が正常に計算されました。", + "loc.messages.CommitDiffBehind": "指定されたターゲット コミットが、公開された最新リリースのコミットより古いため、変更を計算できません。", + "loc.messages.CommitDiffEqual": "変更は見つかりませんでした。指定されたターゲットのコミットは、公開された最新リリースのコミットと同じです。", + "loc.messages.FetchLatestPublishRelease": "公開された最新リリースをフェッチしています...", + "loc.messages.FetchLatestNonDraftRelease": "ドラフト以外の最新リリースをフェッチしています...", + "loc.messages.FetchLastReleaseByTag": "タグ パターンに一致する最新リリースをフェッチしています: %s", + "loc.messages.FetchLatestPublishReleaseSuccess": "公開された最新のリリースが見つかりました: %s", + "loc.messages.FetchMatchingReleaseSuccess": "ドラフト以外の最新リリースが見つかりました", + "loc.messages.FetchTagMatchingReleaseSuccess": "タグ パターンに一致する最新リリースが見つかりました: %s", + "loc.messages.GetLatestReleaseError": "公開された最新リリースのフェッチ中に予期しないエラーが発生しました。 ", + "loc.messages.NoLatestPublishRelease": "リポジトリに公開されているリリースはまだありません。", + "loc.messages.NoMatchingReleases": "ドラフト以外のリリースが見つかりません。", + "loc.messages.NoTagMatchingReleases": "タグ パターン %s に一致するリリースが見つかりませんでした", + "loc.messages.FetchCommitDiff": "公開された最新リリース以降のコミットの一覧をフェッチしています...", + "loc.messages.FetchCommitDiffSuccess": "変更の一覧が見つかりました。", + "loc.messages.FetchCommitDiffError": "変更の一覧のフェッチ中に予期しないエラーが発生しました。", + "loc.messages.FetchInitialCommit": "初期コミットをフェッチしています...", + "loc.messages.FetchInitialCommitSuccess": "初期コミットが見つかりました: %s", + "loc.messages.InvalidGitHubEndpoint": "無効な GitHub サービス エンドポイント: %s。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub サービス接続スキームが無効です: %s。使用できるのは OAuth と GitHub の個人用アクセス トークン接続のみです。", + "loc.messages.FetchInitialCommitError": "初期コミットのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.InvalidActionSet": "無効なアクション: %s。'作成'、'編集'、または '削除' の操作のみが許可されています。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "タグのソースが無効です: %s。'自動' または '手動' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "無効なリリース ノート ソース: %s。'ファイル' または '入力' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 属性 %s が無効です。'lastFullRelease'、'lastNonDraftRelease'、'lastNonDraftReleaseByTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidAssetUploadMode": "アセットのアップロード モードが無効です: %s。'削除'、または '置換' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' アクションには、タグが必要です。手順でタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "タグ ソースが手動に設定されています。作成アクション用のタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "'%s' と一致するファイルが見つかりませんでした。アップロードするものがありません。", + "loc.messages.PatternIsADirectory": "'%s' はディレクトリであるため、アップロードできません。ファイルを指定してください。", + "loc.messages.SearchingFileMatchingPattern": "'%s' と一致するファイルを検索しています。", + "loc.messages.IssuesFetchError": "イシューのフェッチでエラーが発生しました。変更ログを生成できません。", + "loc.messages.NoIssuesLinkedError": "指定されたコミットの差分には、コミットにリンクされているイシューはありません。", + "loc.messages.LabelsSyntaxError": "ラベルの解析中にエラーが発生しました。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 属性 %s が無効です。'commitBased' または 'issueBased' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.ChangeLogTitle": "変更", + "loc.messages.DefaultCategory": "その他", + "loc.messages.SeeMoreText": "さらに表示" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..1838a9ffe6c3 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 릴리스", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub 릴리스를 만들거나, 편집하거나, 삭제합니다.", + "loc.instanceNameFormat": "GitHub 릴리스($(action))", + "loc.group.displayName.changeLogConfiguration": "변경 로그 구성", + "loc.input.label.gitHubConnection": "GitHub 연결(OAuth 또는 PAT)", + "loc.input.help.gitHubConnection": "GitHub 리포지토리에 연결하는 데 사용할 GitHub 서비스 연결의 이름을 지정합니다. 이 연결은 GitHub 사용자의 OAuth 또는 GitHub 개인용 액세스 토큰을 기반으로 해야 합니다. [여기](https://aka.ms/AA3am5s)서 서비스 연결에 대해 자세히 알아보세요.", + "loc.input.label.repositoryName": "리포지토리", + "loc.input.help.repositoryName": "GitHub 릴리스를 만들거나, 편집하거나, 삭제할 GitHub 리포지토리의 이름을 지정합니다.", + "loc.input.label.action": "작업", + "loc.input.help.action": "수행할 릴리스 작업 유형을 지정합니다. 이 작업은 GitHub 릴리스를 만들거나, 편집하거나, 삭제할 수 있습니다.", + "loc.input.label.target": "대상", + "loc.input.help.target": "GitHub 릴리스를 만들 커밋 SHA를 지정합니다. 예: '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. 여기서 변수를 사용할 수도 있습니다. 예: '$(myCommitSHA)'", + "loc.input.label.tagSource": "태그 소스", + "loc.input.help.tagSource": "릴리스 생성에 사용할 태그를 지정합니다. 'Git tag' 옵션은 Git 커밋에 연결된 태그를 자동으로 사용합니다. 태그를 수동으로 지정하려면 '사용자 지정 태그' 옵션을 사용합니다.", + "loc.input.label.tagPattern": "태그 패턴", + "loc.input.help.tagPattern": " regex를 사용하여 git 태그 패턴을 지정합니다(예: `release-v1.*`). GitHub 릴리스는 일치하는 git 태그가 있는 커밋에 대해서만 생성됩니다. ", + "loc.input.label.tag": "태그", + "loc.input.help.tag": "릴리스를 만들거나, 편집하거나, 삭제할 태그를 지정합니다. 여기서 변수를 사용할 수도 있습니다. 예: '$(myTagName)'", + "loc.input.label.title": "릴리스 제목", + "loc.input.help.title": "GitHub 릴리스의 제목을 지정합니다. 비워 두면, 태그가 릴리스 제목으로 사용됩니다.", + "loc.input.label.releaseNotesSource": "릴리스 정보 소스", + "loc.input.help.releaseNotesSource": "GitHub 릴리스에 대한 설명을 지정합니다. 파일 내용을 릴리스 정보로 사용하려면 '릴리스 정보 파일' 옵션을 사용합니다. 릴리스 정보를 수동으로 입력하려면 '인라인 릴리스 정보' 옵션을 사용합니다.", + "loc.input.label.releaseNotesFile": "릴리스 정보 파일 경로", + "loc.input.help.releaseNotesFile": "릴리스 정보가 포함된 파일을 선택합니다.", + "loc.input.label.releaseNotes": "릴리스 정보", + "loc.input.help.releaseNotes": "여기에 릴리스 정보를 입력합니다. Markdown이 지원됩니다.", + "loc.input.label.assets": "자산", + "loc.input.help.assets": "릴리스의 자산으로 업로드할 파일을 지정합니다. 와일드카드 문자를 사용하여 여러 파일을 지정할 수 있습니다. 예를 들어 빌드 파이프라인의 경우 '$(Build.ArtifactStagingDirectory)/*.zip', 릴리스 파이프라인의 경우 '$(System.DefaultWorkingDirectory)/*.zip'입니다. 한 줄에 하나씩, 여러 개의 패턴을 지정할 수도 있습니다. 기본적으로 $(Build.ArtifactStagingDirectory) 디렉터리에 있는 모든 파일이 업로드됩니다. 사용 가능한 미리 정의된 변수 목록에 대한 자세한 내용은 [빌드 변수](https://aka.ms/AA4449z) 및 [릴리스 변수](https://aka.ms/AA43wws)를 참조하세요.", + "loc.input.label.assetUploadMode": "자산 업로드 모드", + "loc.input.help.assetUploadMode": "릴리스의 기존 자산을 먼저 삭제한 후 모든 자산을 업로드하려면 '기존 자산 삭제' 옵션을 사용합니다. 동일한 이름의 자산을 모두 바꾸려면 '기존 자산 바꾸기' 옵션을 사용합니다.", + "loc.input.label.isDraft": "초안 릴리스", + "loc.input.help.isDraft": "릴리스를 초안(게시되지 않음)으로 저장해야 하는지 여부를 나타냅니다. 'false'이면, 릴리스가 게시됩니다.", + "loc.input.label.isPreRelease": "시험판", + "loc.input.help.isPreRelease": "릴리스를 시험판으로 표시해야 하는지 여부를 나타냅니다.", + "loc.input.label.addChangeLog": "changelog 추가", + "loc.input.help.addChangeLog": "'true'로 설정하면, 이 릴리스와 마지막으로 게시된 릴리스 사이의 변경 내용(커밋 및 문제) 목록이 생성되어 릴리스 정보에 추가됩니다.", + "loc.input.label.changeLogCompareToRelease": "비교 대상", + "loc.input.help.changeLogCompareToRelease": "변경 로그를 생성하기 위해 비교할 릴리스를 나타냅니다. \n마지막 전체 릴리스: 현재 릴리스와 시험판으로 표시되어 있지 않은 초안이 아닌 최신 릴리스를 비교합니다.\n초안이 아닌 마지막 릴리스: 현재 릴리스를 초안이 아닌 최신 릴리스와 비교합니다.\n태그 기준 초안이 아닌 마지막 릴리스: 지정한 태그와 일치하는 초안이 아닌 마지막 릴리스를 현재 릴리스와 비교합니다. 정확한 태그 대신 regex를 지정할 수도 있습니다.", + "loc.input.label.changeLogCompareToReleaseTag": "릴리스 태그", + "loc.input.help.changeLogCompareToReleaseTag": "릴리스 태그에 대한 regex를 지정합니다. 이 태그와 일치하는 릴리스가 변경 로그 계산의 기본으로 사용됩니다.", + "loc.input.label.changeLogType": "변경 로그 유형", + "loc.input.help.changeLogType": "변경 로그는 커밋 기반 또는 문제 기반일 수 있습니다. 문제 기반 변경 로그는 릴리스에 포함된 모든 문제/끌어오기 요청을 나열하지만 커밋 기반 변경 로그는 릴리스에 포함된 모든 커밋을 나열합니다. ", + "loc.input.label.changeLogLabels": "범주", + "loc.input.help.changeLogLabels": "문제/PR과 연결된 레이블을 기준으로 변경 내용을 분류하는 데 사용할 수 있습니다. 레이블의 경우 범주 및 문제 상태에 대해 해당 표시 이름을 언급할 수 있습니다. 예: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. 변경 내용에 레이블이 여러 개 있는 경우 처음 지정한 레이블이 우선 순위를 갖습니다. 문제/PR의 단순 목록을 보려면 이 필드를 비워 두세요.", + "loc.messages.GithubApiFailError": "예기치 않은 오류가 발생했습니다.", + "loc.messages.GetTagsError": "태그를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.GetReleasesError": "릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreateReleaseError": "릴리스를 만드는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.EditReleaseError": "릴리스를 편집하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeleteReleaseError": "릴리스를 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreatingRelease": "%s 태그의 릴리스를 만드는 중", + "loc.messages.CreateReleaseSuccess": "%s에 릴리스를 만들었습니다.", + "loc.messages.ReleaseAlreadyExists": "릴리스를 만들지 못했습니다. %s 태그의 릴리스가 이미 있습니다.", + "loc.messages.EditingRelease": "%s 태그가 있는 릴리스를 편집하는 중", + "loc.messages.EditReleaseSuccess": "릴리스를 편집했습니다.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "편집할 기존 릴리스가 없습니다. %s 태그를 사용하여 만드는 중입니다.", + "loc.messages.DeletingRelease": "%s 태그의 릴리스를 삭제하는 중", + "loc.messages.DeleteReleaseSuccess": "릴리스를 삭제했습니다.", + "loc.messages.NoReleaseFoundToDelete": "%s 태그의 릴리스를 찾을 수 없습니다. 릴리스를 삭제하지 못했습니다.", + "loc.messages.FetchReleaseForTag": "%s 태그의 릴리스를 페치하는 중", + "loc.messages.FetchReleaseForTagSuccess": "%s 태그의 릴리스를 찾았습니다.", + "loc.messages.FetchTagForTarget": "대상 커밋 %s에 연결된 태그를 검색하는 중", + "loc.messages.FetchTagForTargetSuccess": "대상 커밋 %s의 태그를 찾았습니다.", + "loc.messages.MissingAssetError": "%s 파일을 찾을 수 없습니다.", + "loc.messages.MultipleReleasesFoundError": "릴리스가 1개만 필요한데, %s 태그의 릴리스를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.MultipleTagFound": "태그가 1개만 필요한데, 지정된 %s 커밋의 태그를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.NoTagFound": "대상 커밋에 대한 태그가 지정된 태그 패턴과 일치하지 않으므로 릴리스가 만들어지지 않습니다.", + "loc.messages.DeleteAllExistingAssets": "기존 자산을 모두 삭제하는 중...", + "loc.messages.DuplicateAssetFound": "중복된 %s 자산을 찾았습니다.", + "loc.messages.AssetsDeletedSuccessfully": "자산을 삭제했습니다.", + "loc.messages.DeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중", + "loc.messages.SkipDuplicateAssetFound": "중복된 %s 자산을 찾았습니다. 건너뛰는 중...", + "loc.messages.AssetDeletedSuccessfully": "%s 자산을 삭제했습니다.", + "loc.messages.AllAssetsUploadedSuccessfully": "모든 자산을 업로드했습니다.", + "loc.messages.ErrorDeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.ErrorDeletingAsset": "%s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeletingAsset": "%s 자산을 삭제하는 중", + "loc.messages.NoAssetFoundToDelete": "삭제할 자산이 없습니다.", + "loc.messages.UploadingAssets": "자산을 업로드하는 중...", + "loc.messages.UploadingAsset": "'%s' 파일을 업로드하는 중입니다.", + "loc.messages.UploadAssetError": "%s 파일을 업로드하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.UploadAssetSuccess": "'%s' 파일을 업로드했습니다.", + "loc.messages.NoAssetFoundToUpload": "업로드할 자산이 없습니다.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "릴리스 정보 파일 %s은(는) 파일이 아닌 디렉터리입니다.", + "loc.messages.AssetIsDirectoryError": "이 자산은 파일이 아닌 디렉터리입니다. %s 디렉터리 업로드를 건너뜁니다.", + "loc.messages.ComputingChangeLog": "이 릴리스의 변경 내용을 컴퓨팅하는 중...", + "loc.messages.ComputingChangeLogSuccess": "변경 내용을 컴퓨팅했습니다.", + "loc.messages.CommitDiffBehind": "지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋보다 이전이므로 변경 내용을 컴퓨팅할 수 없습니다.", + "loc.messages.CommitDiffEqual": "변경 내용을 찾을 수 없습니다. 지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋과 같습니다.", + "loc.messages.FetchLatestPublishRelease": "게시된 최신 릴리스를 페치하는 중...", + "loc.messages.FetchLatestNonDraftRelease": "초안이 아닌 최신 릴리스를 가져오는 중...", + "loc.messages.FetchLastReleaseByTag": "태그 패턴과 일치하는 최신 릴리스를 가져오는 중: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "게시된 최신 릴리스 %s을(를) 찾았습니다.", + "loc.messages.FetchMatchingReleaseSuccess": "초안이 아닌 최신 릴리스를 찾음", + "loc.messages.FetchTagMatchingReleaseSuccess": "태그 패턴과 일치하는 최신 릴리스를 찾음: %s", + "loc.messages.GetLatestReleaseError": "게시된 최신 릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.NoLatestPublishRelease": "리포지토리에 게시된 릴리스가 아직 없습니다.", + "loc.messages.NoMatchingReleases": "초안이 아닌 릴리스를 찾을 수 없습니다.", + "loc.messages.NoTagMatchingReleases": "태그 패턴 %s과(와) 일치하는 릴리스를 찾을 수 없습니다. ", + "loc.messages.FetchCommitDiff": "마지막으로 게시된 릴리스 이후 커밋 목록을 페치하는 중...", + "loc.messages.FetchCommitDiffSuccess": "변경 내용 목록을 찾았습니다.", + "loc.messages.FetchCommitDiffError": "변경 내용 목록을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.FetchInitialCommit": "초기 커밋을 페치하는 중...", + "loc.messages.FetchInitialCommitSuccess": "초기 커밋 %s을(를) 찾았습니다.", + "loc.messages.InvalidGitHubEndpoint": "GitHub 서비스 엔드포인트 %s이(가) 잘못되었습니다.", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 서비스 연결 체계 %s이(가) 잘못되었습니다. OAuth 및 GitHub 개인용 액세스 토큰 연결만 허용됩니다.", + "loc.messages.FetchInitialCommitError": "초기 커밋을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.InvalidActionSet": "%s 작업이 잘못되었습니다. 'create', 'edit' 또는 'delete' 작업만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidTagSource": "태그 소스 %s이(가) 잘못되었습니다. 'auto' 또는 'manual' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidReleaseNotesSource": "릴리스 정보 소스 %s이(가) 잘못되었습니다. 'file' 또는 'input' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidCompareWithAttribute": "compareWith 특성 %s이(가) 잘못되었습니다. 'lastFullRelease, 'lastNonDraftRelease' 또는 'lastNonDraftReleaseByTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidAssetUploadMode": "자산 업로드 모드 %s이(가) 잘못되었습니다. 'delete' 또는 'replace' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 작업에는 태그가 필요합니다. 단계에서 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredCreateAction": "태그 소스가 'manual'로 설정되었습니다. 'create' 작업의 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.NoFileFoundMatchingPattern": "'%s'과(와) 일치하는 파일이 없습니다. 업로드할 파일이 없습니다.", + "loc.messages.PatternIsADirectory": "'%s'은(는) 디렉터리이므로 업로드할 수 없습니다. 파일을 지정하세요.", + "loc.messages.SearchingFileMatchingPattern": "'%s'과(와) 일치하는 파일을 검색 중입니다.", + "loc.messages.IssuesFetchError": "문제를 가져오는 동안 오류가 발생했습니다. 변경 로그를 생성할 수 없습니다.", + "loc.messages.NoIssuesLinkedError": "지정된 커밋 Diff에서 커밋에 연결된 문제가 없습니다.", + "loc.messages.LabelsSyntaxError": "레이블의 구문을 분석하는 동안 오류가 발생했습니다. Yaml 구문에 대해서는 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 특성 %s이(가) 잘못되었습니다. 'commitBased' 또는 'issueBased' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.ChangeLogTitle": "변경 내용", + "loc.messages.DefaultCategory": "기타", + "loc.messages.SeeMoreText": "자세히 보기" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..a7459bfd47c4 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Выпуск GitHub", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/AA3aeiw)", + "loc.description": "Создание, изменение или удаление выпуска GitHub", + "loc.instanceNameFormat": "Выпуск GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Конфигурация журнала изменений", + "loc.input.label.gitHubConnection": "Подключение GitHub (OAuth или личный маркер доступа)", + "loc.input.help.gitHubConnection": "Укажите имя подключения службы GitHub, которое будет использоваться для подключения к репозиторию GitHub. Подключение должно быть основано на личном маркере доступа или OAuth пользователя GitHub. Дополнительные сведения о подключениях служб см. [здесь](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Репозиторий", + "loc.input.help.repositoryName": "Укажите имя репозитория GitHub, в котором будет создан, изменен или удален выпуск GitHub.", + "loc.input.label.action": "Действие", + "loc.input.help.action": "Укажите тип выполняемой операции выпуска. Эта задача может создавать, изменять или удалять выпуск GitHub.", + "loc.input.label.target": "Целевой объект", + "loc.input.help.target": "Укажите SHA фиксации, для которого будет создан выпуск GitHub. Например, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Здесь также можно использовать переменную. Например, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Источник тегов", + "loc.input.help.tagSource": "Укажите тег, который будет использоваться для создания выпуска. Параметр \"Тег Git\" автоматически принимает тег, связанный с фиксацией Git. Для указания тега вручную используйте параметр \"Тег, указанный пользователем\".", + "loc.input.label.tagPattern": "Шаблон тега", + "loc.input.help.tagPattern": " Укажите шаблон тега Git с помощью регулярного выражения (например, release-v1.*). Выпуск GitHub будет создан только для фиксаций с соответствующим тегом Git. ", + "loc.input.label.tag": "Тег", + "loc.input.help.tag": "Укажите тег, для которого требуется создать, изменить или удалить выпуск. Здесь также можно использовать переменную. Например, \"$(myTagName)\".", + "loc.input.label.title": "Название выпуска", + "loc.input.help.title": "Укажите название выпуска GitHub. Если оставить параметр пустым, в качестве названия выпуска будет использоваться тег.", + "loc.input.label.releaseNotesSource": "Источник заметок о выпуске", + "loc.input.help.releaseNotesSource": "Укажите описание выпуска GitHub. Используйте параметр \"Файл заметок о выпуске\", чтобы использовать содержимое файла в качестве заметок о выпуске. Используйте параметр \"Встроенные заметки о выпуске\", чтобы вручную ввести заметки о выпуске.", + "loc.input.label.releaseNotesFile": "Путь к файлу заметок о выпуске", + "loc.input.help.releaseNotesFile": "Выберите файл, содержащий заметки о выпуске.", + "loc.input.label.releaseNotes": "Заметки о выпуске", + "loc.input.help.releaseNotes": "Введите здесь примечания к выпуску. Markdown поддерживается.", + "loc.input.label.assets": "Ресурсы", + "loc.input.help.assets": "Укажите файлы, которые будут отправлены в качестве ресурсов выпуска. Для указания нескольких файлов можно использовать подстановочные знаки. Например, для конвейеров сборки, \"$(Build.ArtifactStagingDirectory)/*.zip\" или в случае конвейеров выпуска \"$(System.DefaultWorkingDirectory)/*.zip\". Также можно указать несколько шаблонов — по одному на строку. По умолчанию будут отправлены все файлы в каталоге $(Build.ArtifactStagingDirectory). Чтобы получить дополнительные сведения о списке доступных предварительно заданных переменных, см. [переменные сборки](https://aka.ms/AA4449z) и [переменные выпуска](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Режим отправки активов", + "loc.input.help.assetUploadMode": "Используйте параметр \"Удалить существующие ресурсы\", чтобы сначала удалить все существующие ресурсы в выпуске, а затем отправить все ресурсы. Используйте параметр \"Заменить существующие ресурсы\", чтобы заменить все ресурсы с одинаковыми именами.", + "loc.input.label.isDraft": "Черновик выпуска", + "loc.input.help.isDraft": "Укажите, следует ли сохранять выпуск в виде черновика (неопубликованным). Если задано значение false, выпуск будет опубликован.", + "loc.input.label.isPreRelease": "Предварительный выпуск", + "loc.input.help.isPreRelease": "Укажите, следует ли помечать выпуск как предварительную версию.", + "loc.input.label.addChangeLog": "Добавить журнал изменений", + "loc.input.help.addChangeLog": "Если задано значение \"true\", будет создан список изменений (фиксации и проблемы) между этим и последним опубликованным выпуском, который будет добавлен к заметкам о выпуске.", + "loc.input.label.changeLogCompareToRelease": "Сравнить с", + "loc.input.help.changeLogCompareToRelease": "Укажите, с каким выпуском следует проводить сравнение, чтобы создать журнал изменений. \n\"Последний полный выпуск\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, который не помечен как предварительный.\n\"Последний выпуск, отличный от чернового\": сравнивает текущий выпуск с самым последним выпуском, отличным от чернового.\n\"Последний выпуск по тегу, отличный от чернового\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, соответствующим указанному тегу. Кроме того, вместо точного тега можно указать регулярное выражение.", + "loc.input.label.changeLogCompareToReleaseTag": "Тег выпуска", + "loc.input.help.changeLogCompareToReleaseTag": "Укажите регулярное выражение для тега выпуска. Выпуск, соответствующий этому тегу, будет использоваться в качестве основы для расчета журнала изменений.", + "loc.input.label.changeLogType": "Тип журнала изменений", + "loc.input.help.changeLogType": "Журнал изменений может быть основан на фиксациях или вопросах. Журнал изменений на основе фиксаций содержит все фиксации, включенные в выпуск, а журнал изменений на основе вопросов содержит список всех вопросов или запросов на вытягивание, включенных в выпуск. ", + "loc.input.label.changeLogLabels": "Категории", + "loc.input.help.changeLogLabels": "С помощью этого можно классифицировать изменения на основе метки, связанной с вопросом или запросом на вытягивание. Для метки можно указать отображаемое имя категории и состояние вопроса. Например, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Если изменение имеет несколько меток, приоритет имеет первая указанная метка. Оставьте это поле пустым, чтобы просмотреть плоский список вопросов или запросов на вытягивание.", + "loc.messages.GithubApiFailError": "Произошла непредвиденная ошибка.", + "loc.messages.GetTagsError": "При получении тегов произошла непредвиденная ошибка.", + "loc.messages.GetReleasesError": "При получении выпусков произошла непредвиденная ошибка.", + "loc.messages.CreateReleaseError": "При создании выпуска произошла непредвиденная ошибка.", + "loc.messages.EditReleaseError": "При изменении выпуска произошла непредвиденная ошибка.", + "loc.messages.DeleteReleaseError": "При удалении выпуска произошла непредвиденная ошибка.", + "loc.messages.CreatingRelease": "Создание выпуска для тега: %s", + "loc.messages.CreateReleaseSuccess": "Выпуск успешно создан в %s", + "loc.messages.ReleaseAlreadyExists": "Не удалось создать выпуск. Выпуск уже существует для тега: %s", + "loc.messages.EditingRelease": "Редактирование выпуска с тегом: %s", + "loc.messages.EditReleaseSuccess": "Выпуск успешно изменен", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Не найден существующий выпуск для изменения. Создание ресурса с тегом: %s", + "loc.messages.DeletingRelease": "Удаление выпуска для тега: %s", + "loc.messages.DeleteReleaseSuccess": "Выпуск успешно удален.", + "loc.messages.NoReleaseFoundToDelete": "Не найден выпуск для тега: %s. Не удалось удалить выпуск.", + "loc.messages.FetchReleaseForTag": "Получение выпуска для тега: %s", + "loc.messages.FetchReleaseForTagSuccess": "Найден выпуск для тега: %s", + "loc.messages.FetchTagForTarget": "Поиск тегов, связанных с целевой фиксацией: %s", + "loc.messages.FetchTagForTargetSuccess": "Найден тег для целевой фиксации: %s", + "loc.messages.MissingAssetError": "Файл не найден: %s", + "loc.messages.MultipleReleasesFoundError": "Ожидался только 1 выпуск, но обнаружено больше 1 выпуска для тега: %s. Не удалось выполнить действие.", + "loc.messages.MultipleTagFound": "Ожидался только 1 тег, но обнаружено больше 1 тега для заданной фиксации: %s. Не удалось выполнить действие.", + "loc.messages.NoTagFound": "Выпуск не будет создан, так как теги для целевой фиксации не совпадают с заданным шаблоном тега.", + "loc.messages.DeleteAllExistingAssets": "Идет удаление всех существующих ресурсов...", + "loc.messages.DuplicateAssetFound": "Обнаружен повторяющийся ресурс: %s", + "loc.messages.AssetsDeletedSuccessfully": "Ресурсы успешно удалены.", + "loc.messages.DeletingDuplicateAsset": "Удаление повторяющегося ресурса: %s", + "loc.messages.SkipDuplicateAssetFound": "Обнаружен дублирующийся ресурс: %s. Пропуск...", + "loc.messages.AssetDeletedSuccessfully": "Ресурс %s успешно удален", + "loc.messages.AllAssetsUploadedSuccessfully": "Все активы успешно отправлены.", + "loc.messages.ErrorDeletingDuplicateAsset": "При удалении повторяющегося ресурса произошла непредвиденная ошибка: %s", + "loc.messages.ErrorDeletingAsset": "Произошла непредвиденная ошибка при удалении ресурса: %s", + "loc.messages.DeletingAsset": "Удаление ресурса: %s", + "loc.messages.NoAssetFoundToDelete": "Не найдены ресурсы для удаления.", + "loc.messages.UploadingAssets": "Идет отправка ресурсов...", + "loc.messages.UploadingAsset": "Идет отправка файла: \"%s\".", + "loc.messages.UploadAssetError": "При загрузке файла сертификата возникла непредвиденная ошибка: %s", + "loc.messages.UploadAssetSuccess": "Файл успешно отправлен: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Не найдены ресурсы для отправки.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Файл заметок о выпуске %s является каталогом, а не файлом.", + "loc.messages.AssetIsDirectoryError": "Ресурс является каталогом, а не файлом. Пропуск отправки каталога: %s", + "loc.messages.ComputingChangeLog": "Вычисление изменений, внесенных в этом выпуске...", + "loc.messages.ComputingChangeLogSuccess": "Изменения успешно вычислены.", + "loc.messages.CommitDiffBehind": "Не удается вычислить изменения, так как указанная целевая фиксация старше фиксации последнего опубликованного выпуска.", + "loc.messages.CommitDiffEqual": "Изменения не найдены. Указанная целевая фиксация совпадает с фиксацией последнего опубликованного выпуска.", + "loc.messages.FetchLatestPublishRelease": "Получение последнего опубликованного выпуска...", + "loc.messages.FetchLatestNonDraftRelease": "Получение последнего выпуска, отличного от чернового...", + "loc.messages.FetchLastReleaseByTag": "Получение последнего выпуска, соответствующего шаблону тега: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Найден последний опубликованный выпуск: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Найден последний выпуск, отличный от чернового", + "loc.messages.FetchTagMatchingReleaseSuccess": "Найдена последняя версия, соответствующая шаблону тега: %s", + "loc.messages.GetLatestReleaseError": "При получении последнего опубликованного выпуска произошла непредвиденная ошибка.", + "loc.messages.NoLatestPublishRelease": "Пока нет выпусков, опубликованных в репозитории.", + "loc.messages.NoMatchingReleases": "Выпуски, отличные от черновых, не найдены.", + "loc.messages.NoTagMatchingReleases": "Не найдены выпуски, соответствующие шаблону тега: %s ", + "loc.messages.FetchCommitDiff": "Получение списка фиксаций со времени последнего опубликованного выпуска...", + "loc.messages.FetchCommitDiffSuccess": "Найден список изменений.", + "loc.messages.FetchCommitDiffError": "При получении списка изменений произошла непредвиденная ошибка.", + "loc.messages.FetchInitialCommit": "Получение начальной фиксации...", + "loc.messages.FetchInitialCommitSuccess": "Найдена начальная фиксация: %s", + "loc.messages.InvalidGitHubEndpoint": "Недопустимая конечная точка службы GitHub: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Недопустимая схема подключения службы GitHub: %s. Разрешены только соединения с личным маркером доступа GitHub и OAuth.", + "loc.messages.FetchInitialCommitError": "При получении начальной фиксации произошла непредвиденная ошибка.", + "loc.messages.InvalidActionSet": "Недопустимое действие: %s. Разрешены только действия \"create\", \"edit\" или \"delete\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Недопустимый источник тегов: %s. Разрешены только параметры \"auto\" или \"manual\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Недопустимый источник заметок о выпуске: %s. Разрешены только параметры \"file\" и \"input\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Недопустимый атрибут compareWith: %s. Разрешены только параметры lastFullRelease, lastNonDraftRelease или lastNonDraftReleaseByTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Недопустимый режим отправки ресурса: %s. Разрешены только параметры \"delete\" и \"replace\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Для действия \"%s\" требуется тег. Укажите тег в шаге. Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Для источника тегов задан параметр \"manual\", укажите тег для действия \"create\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Не найдены файлы, соответствующие \"%s\". Нет элементов для отправки.", + "loc.messages.PatternIsADirectory": "Не удается отправить \"%s\", так как это каталог. Укажите файл.", + "loc.messages.SearchingFileMatchingPattern": "Поиск файлов, соответствующих \"%s\".", + "loc.messages.IssuesFetchError": "Ошибка при получении вопросов. Не удается создать журнал изменений.", + "loc.messages.NoIssuesLinkedError": "Нет вопросов, связанных с фиксациями в указанном инструменте сравнения фиксаций.", + "loc.messages.LabelsSyntaxError": "При синтаксическом анализе меток произошла ошибка. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Недопустимый атрибут ChangeLogType: %s. Разрешены только параметры commitBased или issueBased. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Изменения", + "loc.messages.DefaultCategory": "Другие", + "loc.messages.SeeMoreText": "Дополнительные сведения" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..d994b6691e5a --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 发布", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/AA3aeiw)", + "loc.description": "创建、编辑或删除 GitHub 发布", + "loc.instanceNameFormat": "GitHub 发布($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog 配置", + "loc.input.label.gitHubConnection": "GitHub 连接(OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定要用于连接到 GitHub 存储库的 GitHub 服务连接的名称。该连接必须基于 GitHub 用户的 OAuth 或 GitHub 个人访问令牌。可在[此处](https://aka.ms/AA3am5s)详细了解服务连接。", + "loc.input.label.repositoryName": "存储库", + "loc.input.help.repositoryName": "指定将在其中创建、编辑或删除 GitHub 发布的 GitHub 存储库的名称。", + "loc.input.label.action": "操作", + "loc.input.help.action": "指定要执行的发布操作的类型。此任务可以创建、编辑或删除 GitHub 发布。", + "loc.input.label.target": "目标", + "loc.input.help.target": "指定将为其创建 GitHub 发布的提交 SHA。例如 `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。还可以在此处使用变量。例如 `$(myCommitSHA)`。", + "loc.input.label.tagSource": "标记源", + "loc.input.help.tagSource": "指定要用于发布创建的标记。“Git 标记”选项会自动接受与 Git 提交关联的标记。使用“用户指定的标记”选项手动提供标记。", + "loc.input.label.tagPattern": "标记模式", + "loc.input.help.tagPattern": " 使用正则表达式(如 `release-v1.*`)指定 git 标记模式。仅将针对具有匹配的 git 标记的提交创建 GitHub 发布。", + "loc.input.label.tag": "标记", + "loc.input.help.tag": "指定要为其创建、编辑或删除发布的标记。还可以在此处使用变量。例如 `$(myTagName)`。", + "loc.input.label.title": "发布标题", + "loc.input.help.title": "指定 GitHub 发布的标题。如果留空,则将使用标记作为发布标题。", + "loc.input.label.releaseNotesSource": "发行说明源", + "loc.input.help.releaseNotesSource": "指定 GitHub 发布的说明。使用“发行说明文件”选项将文件内容用作发行说明。使用“内联发行说明”选项手动输入发行说明。", + "loc.input.label.releaseNotesFile": "发行说明文件路径", + "loc.input.help.releaseNotesFile": "选择包含发行说明的文件。", + "loc.input.label.releaseNotes": "发行说明", + "loc.input.help.releaseNotes": "在此处输入发行说明。支持 Markdown。", + "loc.input.label.assets": "资产", + "loc.input.help.assets": "指定要作为发布的资产进行上传的文件。可以使用通配符指定多个文件。例如,对于生成管道,可以指定 `$(Build.ArtifactStagingDirectory)/*.zip`,对于发布管道,可以指定 `$(System.DefaultWorkingDirectory)/*.zip`。还可以指定多个模式 - 每行一个。默认情况下,将上传 $(Build.ArtifactStagingDirectory) 目录中的所有文件。若要了解有关可用预定义变量列表的详细信息,请参阅[生成变量](https://aka.ms/AA4449z)和[发布变量](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "资产上传模式", + "loc.input.help.assetUploadMode": "使用“删除现有资产”选项首先删除发布中的任何现有资产,然后上传所有资产。使用“替换现有资产”选项替换具有相同名称的任何资产。", + "loc.input.label.isDraft": "草稿发布", + "loc.input.help.isDraft": "指示是否应将发布另存为草稿(未发布)。如果为 `false`,则发布此发布。", + "loc.input.label.isPreRelease": "预发布", + "loc.input.help.isPreRelease": "指示是否应将发布标记为预发布。", + "loc.input.label.addChangeLog": "添加更改日志", + "loc.input.help.addChangeLog": "如果设置为 `true`,则将生成此发布与上次发布的发布之间的更改(提交和问题)列表,并追加到发行说明。", + "loc.input.label.changeLogCompareToRelease": "比较对象", + "loc.input.help.changeLogCompareToRelease": "指示应与哪个版本比较以生成更改日志: \n最新完整版本: 将当前版本与未标记为预发布的最新非草稿版本进行比较。\n最新非草稿版本: 将当前版本与最新非草稿版本进行比较。\n按标记排序的最新非草稿版本: 将当前版本与最新非草稿版本(与指定标记匹配)进行比较。还可以指定一个正则表达式而非确切的标记。", + "loc.input.label.changeLogCompareToReleaseTag": "发布标记", + "loc.input.help.changeLogCompareToReleaseTag": "指定发布标记的正则表达式。与此标记匹配的版本将用作 changelog 计算的基础。", + "loc.input.label.changeLogType": "Changelog 类型", + "loc.input.help.changeLogType": "Changelog 可以基于提交或基于问题。基于提交的 changelog 列出版本中包含的所有提交,而基于问题的 changelog 列出该版本中包含的所有问题/拉取请求。", + "loc.input.label.changeLogLabels": "类别", + "loc.input.help.changeLogLabels": "使用此项,可根据与问题/PR 相关的标签对更改进行分类。对于标签,可提及类别的显示名称和问题状态。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果某更改具有多个标签,则优先采用第一个指定的标签。将此字段留空,以查看问题/PR 的简单列表。", + "loc.messages.GithubApiFailError": "发生意外错误。", + "loc.messages.GetTagsError": "提取标记时出现意外错误。", + "loc.messages.GetReleasesError": "提取发布时出现意外错误。", + "loc.messages.CreateReleaseError": "创建发布时出现意外错误。", + "loc.messages.EditReleaseError": "编辑发布时出现意外错误。", + "loc.messages.DeleteReleaseError": "删除发布时出现意外错误。", + "loc.messages.CreatingRelease": "正在创建标记的发布: %s", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功创建发布", + "loc.messages.ReleaseAlreadyExists": "未能创建发布。已存在以下标记的发布: %s", + "loc.messages.EditingRelease": "正在使用以下标记编辑发布: %s", + "loc.messages.EditReleaseSuccess": "已成功编辑发布", + "loc.messages.NoReleaseFoundToEditCreateRelease": "未找到要编辑的现有发布。请使用以下标记创建一个发布: %s", + "loc.messages.DeletingRelease": "正在删除标记的发布: %s", + "loc.messages.DeleteReleaseSuccess": "已成功删除版本。", + "loc.messages.NoReleaseFoundToDelete": "未找到以下标记的任何发布: %s。删除发布失败。", + "loc.messages.FetchReleaseForTag": "正在提取以下标记的发布: %s", + "loc.messages.FetchReleaseForTagSuccess": "已找到以下标记的发布: %s", + "loc.messages.FetchTagForTarget": "正在搜索与目标提交相关的标记: %s", + "loc.messages.FetchTagForTargetSuccess": "已找到目标提交的标记: %s", + "loc.messages.MissingAssetError": "找不到文件: %s", + "loc.messages.MultipleReleasesFoundError": "应仅为 1 个发布,但为标记 %s 找到多个发布。无法执行该操作。", + "loc.messages.MultipleTagFound": "应仅为 1 个标记,但为给定提交 %s 找到多个标记。无法执行该操作。", + "loc.messages.NoTagFound": "将不会创建发布,因为目标提交的标记与给定的标记模式不匹配。", + "loc.messages.DeleteAllExistingAssets": "正在删除所有现有资产...", + "loc.messages.DuplicateAssetFound": "找到重复资产: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功删除资产。", + "loc.messages.DeletingDuplicateAsset": "正在删除重复资产: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重复资产: %s。正在跳过...", + "loc.messages.AssetDeletedSuccessfully": "资产 %s 已成功删除", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上传所有资产。", + "loc.messages.ErrorDeletingDuplicateAsset": "删除重复资产时出现意外错误: %s", + "loc.messages.ErrorDeletingAsset": "删除资产时出现意外错误: %s", + "loc.messages.DeletingAsset": "正在删除资产: %s", + "loc.messages.NoAssetFoundToDelete": "未找到要删除的资产。", + "loc.messages.UploadingAssets": "正在上传资产...", + "loc.messages.UploadingAsset": "正在上传文件:“%s”。", + "loc.messages.UploadAssetError": "上传文件时出现意外错误: %s", + "loc.messages.UploadAssetSuccess": "已成功上传文件:“%s”", + "loc.messages.NoAssetFoundToUpload": "未找到要上传的资产。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "发行说明文件 %s 是目录,而不是文件。", + "loc.messages.AssetIsDirectoryError": "资产是目录,而不是文件。正在跳过上传目录: %s", + "loc.messages.ComputingChangeLog": "正在计算此发布中所做的更改...", + "loc.messages.ComputingChangeLogSuccess": "已成功计算更改。", + "loc.messages.CommitDiffBehind": "无法计算更改,因为所提供的目标提交早于上次发行版的提交。", + "loc.messages.CommitDiffEqual": "未找到任何更改。提供的目标提交与上次发行版的提交相同。", + "loc.messages.FetchLatestPublishRelease": "正在提取最新发布的发布...", + "loc.messages.FetchLatestNonDraftRelease": "正在提取最新非草稿版本…", + "loc.messages.FetchLastReleaseByTag": "正在提取与标记模式匹配的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "已找到最新发布的发布: %s", + "loc.messages.FetchMatchingReleaseSuccess": "已找到最新非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "已找到与标记模式匹配的最新版本: %s", + "loc.messages.GetLatestReleaseError": "提取最新发布的发布时出现意外错误。", + "loc.messages.NoLatestPublishRelease": "存储库中尚未发布任何发布。", + "loc.messages.NoMatchingReleases": "未找到非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到与标记模式匹配的版本: %s", + "loc.messages.FetchCommitDiff": "正在提取自上次发布的发布以来的提交列表...", + "loc.messages.FetchCommitDiffSuccess": "已找到更改列表。", + "loc.messages.FetchCommitDiffError": "提取更改列表时出现意外错误。", + "loc.messages.FetchInitialCommit": "正在提取初始提交...", + "loc.messages.FetchInitialCommitSuccess": "已找到初始提交: %s", + "loc.messages.InvalidGitHubEndpoint": "无效的 GitHub 服务终结点: %s。", + "loc.messages.InvalidEndpointAuthScheme": "无效的 GitHub 服务连接方案: %s。仅允许 OAuth 和 GitHub 个人访问令牌连接。", + "loc.messages.FetchInitialCommitError": "提取初始提交时出现意外错误。", + "loc.messages.InvalidActionSet": "无效的操作: %s。仅允许“创建”、“编辑”或“删除”操作。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "无效的标记源: %s。仅允许“自动”或“手动”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "无效的发行说明源: %s。仅允许“文件”或“输入”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "无效的 compareWith 属性: %s。仅允许 \"lastFullRelease\"、\"lastNonDraftRelease\" 或 \"lastNonDraftReleaseByTag\" 选项。对于 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "无效的资产上传模式: %s。仅允许“删除”或“替换”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "对于“%s”操作,标记是必需的。请在步骤中指定一个标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "标记源设置为手动- 请指定创建操作的标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "未找到与“%s”匹配的文件。没有要上传的内容。", + "loc.messages.PatternIsADirectory": "无法上传“%s”,因为它是一个目录。请指定一个文件。", + "loc.messages.SearchingFileMatchingPattern": "正在搜索匹配“%s”的文件。", + "loc.messages.IssuesFetchError": "提取问题时出错。无法生成更改日志。", + "loc.messages.NoIssuesLinkedError": "在指定提交差异中,未将任何问题链接到提交。", + "loc.messages.LabelsSyntaxError": "分析标签时出错。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "无效的 ChangeLogType 属性: %s。仅允许 \"commitBased\" 或 \"issueBased\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "更改", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..13558636c169 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 版本", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/AA3aeiw)", + "loc.description": "建立、編輯或刪除 GitHub 版本", + "loc.instanceNameFormat": "GitHub 版本 ($(action))", + "loc.group.displayName.changeLogConfiguration": "變更記錄組態", + "loc.input.label.gitHubConnection": "GitHub 連線 (OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定用來連線到 GitHub 存放庫的 GitHub 服務連線名稱。該連線必須根據 GitHub 使用者的 OAuth 或 GitHub 個人存取權杖來進行。若要深入了解服務連線,請前往 [這裡](https://aka.ms/AA3am5s)。", + "loc.input.label.repositoryName": "存放庫", + "loc.input.help.repositoryName": "指定建立、編輯或刪除 GitHub 版本所在的 GitHub 存放庫名稱。", + "loc.input.label.action": "動作", + "loc.input.help.action": "指定要執行的版本作業類型。這項工作可以建立、編輯或刪除 GitHub 版本。", + "loc.input.label.target": "目標", + "loc.input.help.target": "指定要建立 GitHub 版本的認可 SHA。例如 '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'。您也可以在這裡使用變數。例如 '$(myCommitSHA)'。", + "loc.input.label.tagSource": "標籤來源", + "loc.input.help.tagSource": "指定要用來建立版本的標籤。[Git 標籤] 選項會自動使用與 Git 認可建立關聯的標籤。使用 [使用者指定的標籤] 可手動提供標籤。", + "loc.input.label.tagPattern": "標籤模式", + "loc.input.help.tagPattern": " 使用 Regex (例如 `release-v1.*`) 指定 git 標籤模式。僅針對具有相符 git 標籤的認可建立 GitHub 版本。", + "loc.input.label.tag": "標籤", + "loc.input.help.tag": "指定要建立、編輯或刪除版本的標籤。您也可以在這裡使用變數。例如 '$(myTagName)'。", + "loc.input.label.title": "版本標題", + "loc.input.help.title": "指定 GitHub 版本的標題。如果保留空白,將使用標籤作為版本標題。", + "loc.input.label.releaseNotesSource": "版本資訊來源", + "loc.input.help.releaseNotesSource": "指定 GitHub 版本的描述。使用 [版本資訊檔案] 選項可使用檔案內容作為版本資訊。使用 [內嵌版本資訊] 選項可手動輸入版本資訊。", + "loc.input.label.releaseNotesFile": "版本資訊檔案路徑", + "loc.input.help.releaseNotesFile": "選取包含版本資訊的檔案。", + "loc.input.label.releaseNotes": "版本資訊", + "loc.input.help.releaseNotes": "請在這裡輸入版本資訊。支援 Markdown。", + "loc.input.label.assets": "資產", + "loc.input.help.assets": "指定要上傳為版本資產的檔案。您可以使用萬用字元來指定多個檔案。例如若為建置管線,請使用 `$(Build.ArtifactStagingDirectory)/*.zip`; 若為發行管線,請使用 `$(System.DefaultWorkingDirectory)/*.zip`。您也可以指定多個模式,每行指定一個。根據預設會上傳 $(Build.ArtifactStagingDirectory) 目錄中的所有檔案。若要深入了解可用預先定義變數的清單,請參閱 [建置變數](https://aka.ms/AA4449z) 和 [發行變數](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "資產上傳模式", + "loc.input.help.assetUploadMode": "使用 [刪除現有的資產] 選項可先刪除版本中任何現有的資產,再上傳所有資產。使用 [取代現有的資產] 選項可取代同名的所有資產。", + "loc.input.label.isDraft": "草稿版本", + "loc.input.help.isDraft": "指出是否應將版本儲存為草稿 (未發佈)。如果是 'false',將會發佈版本。", + "loc.input.label.isPreRelease": "發行前版本", + "loc.input.help.isPreRelease": "指出是否應將版本標記為發行前版本。", + "loc.input.label.addChangeLog": "新增變更記錄", + "loc.input.help.addChangeLog": "如果設定為 'true',將會產生此版本和上次所發佈版本間變更 (認可和問題) 的清單,並附加到版本資訊。", + "loc.input.label.changeLogCompareToRelease": "比較對象", + "loc.input.help.changeLogCompareToRelease": "指出應比較的版本以產生變更記錄: \n最後完整版本: 比較目前版本與未標示為發行前版本的最新非草稿版本。\n最後非草稿版本: 比較目前版本與最新的非草稿版本。\n依標籤決定的最後非草稿版本: 比較目前版本與符合指定標籤的最後非草稿版本。您也可以指定 Regex,而不指定具體的標籤。", + "loc.input.label.changeLogCompareToReleaseTag": "版本標籤", + "loc.input.help.changeLogCompareToReleaseTag": "指定 Regex 為版本標籤。符合此標籤的版本會用作變更記錄計算的基底。", + "loc.input.label.changeLogType": "變更記錄類型", + "loc.input.help.changeLogType": "變更記錄可依據認可或問題來進行記錄。以認可為依據的變更記錄,會列出版本內含的所有認可,而以問題為依據的變更記錄,則會列出版本內含的所有問題/提取要求。", + "loc.input.label.changeLogLabels": "類別", + "loc.input.help.changeLogLabels": "使用此項即可依據與問題/pr 建立關聯的標籤將變更分類。針對標籤,您可以提及類別的顯示名稱及問題的狀態。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果變更有多個標籤,則優先使用第一個指定的標籤。此欄位請保留空白,以查看問題/pr 的簡單列表。", + "loc.messages.GithubApiFailError": "發生未預期的錯誤。", + "loc.messages.GetTagsError": "擷取標籤時發生未預期的錯誤。", + "loc.messages.GetReleasesError": "擷取版本時發生未預期的錯誤。", + "loc.messages.CreateReleaseError": "建立版本時發生未預期的錯誤。", + "loc.messages.EditReleaseError": "編輯版本時發生未預期的錯誤。", + "loc.messages.DeleteReleaseError": "刪除版本時發生未預期的錯誤。", + "loc.messages.CreatingRelease": "正在建立標籤 %s 的版本", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功建立版本", + "loc.messages.ReleaseAlreadyExists": "無法建立版本。已有標籤 %s 的版本", + "loc.messages.EditingRelease": "正在編輯標籤為 %s 的版本", + "loc.messages.EditReleaseSuccess": "已成功編輯版本", + "loc.messages.NoReleaseFoundToEditCreateRelease": "找不到任何要編輯的現有版本。正在使用標籤 %s 建立一個", + "loc.messages.DeletingRelease": "正在刪除標籤 %s 的版本", + "loc.messages.DeleteReleaseSuccess": "已成功刪除版本。", + "loc.messages.NoReleaseFoundToDelete": "找不到標籤 %s 的版本。刪除版本失敗。", + "loc.messages.FetchReleaseForTag": "正在擷取標籤 %s 的版本", + "loc.messages.FetchReleaseForTagSuccess": "找到標籤 %s 的版本", + "loc.messages.FetchTagForTarget": "正在搜尋與目標認可 %s 建立關聯的標籤", + "loc.messages.FetchTagForTargetSuccess": "找到目標認可 %s 的標籤", + "loc.messages.MissingAssetError": "找不到檔案: %s", + "loc.messages.MultipleReleasesFoundError": "標籤 %s 只應有 1 個版本,但卻找到多個版本。無法執行此動作。", + "loc.messages.MultipleTagFound": "指定的認可 %s 只應有 1 個標籤,但卻找到多個標籤。無法執行此動作。", + "loc.messages.NoTagFound": "因為目標認可與指定的標籤模式不符,所以不會將版本建立為標籤。", + "loc.messages.DeleteAllExistingAssets": "正在刪除所有現有的資產...", + "loc.messages.DuplicateAssetFound": "找到重複的資產: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功刪除資產。", + "loc.messages.DeletingDuplicateAsset": "正在刪除重複的資產: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重複的資產 %s。正在跳過...", + "loc.messages.AssetDeletedSuccessfully": "已成功刪除資產 %s", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上傳所有資產。", + "loc.messages.ErrorDeletingDuplicateAsset": "刪除重複的資產 %s 時發生未預期的錯誤", + "loc.messages.ErrorDeletingAsset": "刪除資產 %s 時發生未預期的錯誤", + "loc.messages.DeletingAsset": "正在刪除資產: %s", + "loc.messages.NoAssetFoundToDelete": "找不到任何要刪除的資產。", + "loc.messages.UploadingAssets": "正在上傳資產...", + "loc.messages.UploadingAsset": "正在上傳檔案: '%s'。", + "loc.messages.UploadAssetError": "上傳檔案 %s 時發生未預期的錯誤", + "loc.messages.UploadAssetSuccess": "已成功上傳檔案: '%s'", + "loc.messages.NoAssetFoundToUpload": "找不到任何要上傳的資產。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "版本資訊檔案 %s 是目錄,而不是檔案。", + "loc.messages.AssetIsDirectoryError": "資產是目錄,而不是檔案。正在跳過目錄的上傳: %s", + "loc.messages.ComputingChangeLog": "正在計算此版本中所做的變更...", + "loc.messages.ComputingChangeLogSuccess": "已成功計算變更。", + "loc.messages.CommitDiffBehind": "因為提供的目標認可比上次所發佈版本的認可舊,所以無法計算變更。", + "loc.messages.CommitDiffEqual": "找不到任何變更。提供的目標認可與上次所發佈版本的認可相同。", + "loc.messages.FetchLatestPublishRelease": "正在擷取最新發佈的版本...", + "loc.messages.FetchLatestNonDraftRelease": "正在擷取最新的非草稿版本...", + "loc.messages.FetchLastReleaseByTag": "正在擷取符合標籤模式的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "找到最新發佈的版本: %s", + "loc.messages.FetchMatchingReleaseSuccess": "找到最新的非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "找到符合標籤模式的最新版本: %s", + "loc.messages.GetLatestReleaseError": "擷取最新發佈的版本時發生未預期的錯誤。", + "loc.messages.NoLatestPublishRelease": "尚未在存放庫中發佈任何版本。", + "loc.messages.NoMatchingReleases": "找不到任何非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到符合標籤模式的版本: %s ", + "loc.messages.FetchCommitDiff": "正在擷取自上次所發佈版本之後的認可清單...", + "loc.messages.FetchCommitDiffSuccess": "找到變更清單。", + "loc.messages.FetchCommitDiffError": "擷取變更清單時發生未預期的錯誤。", + "loc.messages.FetchInitialCommit": "正在擷取初始認可...", + "loc.messages.FetchInitialCommitSuccess": "找到初始認可: %s", + "loc.messages.InvalidGitHubEndpoint": "GitHub 服務端點 %s 無效。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 服務連線配置 %s 無效。僅允許 OAuth 和 GitHub 個人存取權杖連線。", + "loc.messages.FetchInitialCommitError": "擷取初始認可時發生未預期的錯誤。", + "loc.messages.InvalidActionSet": "動作 %s 無效。僅允許 'create'、'edit' 或 'delete' 動作。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "標籤來源 %s 無效。僅允許 'auto' 或 'manual' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "版本資訊來源 %s 無效。僅允許 'file' 或 'input' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 屬性無效: %s。僅允許 'lastFullRelease'、'lastNonDraftRelease' 或 'lastNonDraftReleaseByTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "資產上傳模式 %s 無效。僅允許 'delete' 或 'replace' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 動作需有標籤。請在此步驟中指定標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "標籤來源已設定為 manual-,請指定建立動作的標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "找不到符合 '%s' 的檔案。沒有要上傳的項目。", + "loc.messages.PatternIsADirectory": "因為 '%s' 是目錄,所以無法予以上傳。請指定檔案。", + "loc.messages.SearchingFileMatchingPattern": "正在搜尋符合 '%s' 的檔案。", + "loc.messages.IssuesFetchError": "擷取問題時發生錯誤。無法產生變更記錄。", + "loc.messages.NoIssuesLinkedError": "沒有任何問題連結到指定認可 Diff 中的認可。", + "loc.messages.LabelsSyntaxError": "剖析標籤時發生錯誤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 屬性無效: %s。僅允許 'commitBased' 或 'issueBased' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "變更", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多內容" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/ActionL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/ActionL0Tests.ts new file mode 100644 index 000000000000..04ff1bf404cf --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/ActionL0Tests.ts @@ -0,0 +1,25 @@ +import { Action } from "../operations/Action"; + +export class ActionL0Tests { + + public static async startTests() { + await this.validateCreateReleaseAction(); + await this.validateEditReleaseAction(); + await this.validateDeleteReleaseAction(); + } + + public static async validateCreateReleaseAction() { + await new Action().createReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, []); + } + + public static async validateEditReleaseAction() { + await new Action().editReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, [], "id"); + } + + public static async validateDeleteReleaseAction() { + await new Action().deleteReleaseAction("endpoint", "repo", "tag"); + } + +} + +ActionL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/ActionTests.ts b/_generated/GitHubReleaseV0_Node16/Tests/ActionTests.ts new file mode 100644 index 000000000000..519bef69bc0f --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/ActionTests.ts @@ -0,0 +1,63 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import * as sinon from 'sinon'; +import { Inputs } from '../operations/Constants'; + +export class ActionTests { + + public static startTest() { + let tp = path.join(__dirname, 'ActionL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.assetUploadMode, "replace"); + + this.stub(tr); + + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + createRelease: async function() { + return { + statusCode: 201, + body: { "upload_url": "url" } + } + }, + editRelease: function() { + return { + statusCode: 200, + body: { "html_url": "url" } + } + }, + deleteRelease: function() { + return { + statusCode: 204 + } + }, + uploadReleaseAsset: function() { + return { + statusCode: 201 + } + } + } + } + }); + + tr.registerMock("./Helper", { + Helper: function () { + return { + getReleaseIdForTag: function() { + return "id"; + } + } + } + }); + } + +} + +ActionTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogL0Tests.ts new file mode 100644 index 000000000000..2e6e8057ddde --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogL0Tests.ts @@ -0,0 +1,61 @@ +import { ChangeLog } from "../operations/ChangeLog"; +import { TestString } from "./TestStrings"; +import { ChangeLogStartCommit } from "../operations/Utility"; + +export class ChangeLogL0Tests { + public static async startTests() { + await this.validateGetChangeLog1(); + await this.validateGetChangeLog2(); + await this.validateGetChangeLog3(); + await this.validateGetChangeLog4(); + await this.validateGetChangeLog5(); + await this.validateGetChangeLog6(); + } + + public static async validateGetChangeLog1() { + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "commitBased"); + + if (changes === this.expectedCommitBasedChanges) { + console.log(TestString.getChangeLogKeyword); + } + } + + public static async validateGetChangeLog2() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftRelease, "commitBased"); + } + + public static async validateGetChangeLog3() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftReleaseByTag, "commitBased", "v1.*"); + } + + public static async validateGetChangeLog4(){ + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, []); + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.allIssuesChangeLog); + } + } + + public static async validateGetChangeLog5(){ + let changeLogLabels = `[{"label": "ux", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "bug", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + if (changes === this.expectedIssueBasedChanges) { + console.log(TestString.issueBasedChangeLog); + } + } + + public static async validateGetChangeLog6(){ + let changeLogLabels = `[{"label": "hello", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "nope", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.noCategoryChangeLog); + } + } + + public static readonly expectedCommitBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* xyz Fixing issue #56. [ #9 ]\n* abc Fixing issue #2 #3. [ #4, #5 ]\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedAllIssuesChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* #1: Incorrect color contrast in control panel\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedIssueBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n\n### Closed UX Issues/PRs:\n\n\n* #1: Incorrect color contrast in control panel\n\n### Open Bugs:\n\n\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + +} + +ChangeLogL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogTests.ts b/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogTests.ts new file mode 100644 index 000000000000..57020cde2f6c --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/ChangeLogTests.ts @@ -0,0 +1,170 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class ChangeLogTests { + + public static startTest() { + let tp = path.join(__dirname, 'ChangeLogL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + process.env["RELEASE_RELEASEWEBURL"] = "MOCK_RELEASE_URL"; + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Helper", { + Helper: function () { + return { + getCommitShaFromTarget: function() { + return "abc"; + }, + filterTag: function(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]) { + console.log("Tag Name: "+ filterValue); + return { commit: { sha: "abc" } }; + } + } + } + }); + + tr.registerMock("./Release", { + Release: function () { + return { + getLatestRelease: function() { + return { + statusCode: 200, + body: { "tag_name": "tagName" } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + { + "tag_name": "pre_rel", + "prerelease": true, + "draft": false + }, + { + "tag_name": "v1.2", + "prerelease": false, + "draft": false + } + ] + } + }, + getCommitsList: function() { + return { + statusCode: 200, + body: { "commits": [ + {"sha": "abc", "commit": { "message": "Fixing issue #2 #3.\n\n desc #4 GH-5" } }, + {"sha": "xyz", "commit": { "message": "Fixing issue #56.\n\n desc Gh-9" } } + ] } + }; + }, + getIssuesList: function (githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + if (includeLabels) { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + "labels": { + "edges": [ + { + "node": { + "name": "nit" + } + }, + { + "node": { + "name": "bug" + } + } + ] + } + } + } + } + } + } + } + else { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + } + } + } + } + } + } + } + } + } + }); + } +} + +ChangeLogTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/CreateAction2L0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/CreateAction2L0Tests.ts new file mode 100644 index 000000000000..55d1137747b4 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/CreateAction2L0Tests.ts @@ -0,0 +1,48 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "auto"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCommitTarget: function() { + return null; + }, + publishTelemetry: function() { + + } + } + } + }); + } + + public static sandbox; +} + +CreateAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/CreateActionL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/CreateActionL0Tests.ts new file mode 100644 index 000000000000..cfdafc98460e --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/CreateActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "tag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCreateAction: function() { + return "v1.0.1"; + }, + publishTelemetry: function() { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called"); // = this.createActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +CreateActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/DeleteAction2L0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/DeleteAction2L0Tests.ts new file mode 100644 index 000000000000..e32bf396eaae --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/DeleteAction2L0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "Delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteAction2KeyWord) }); + } + + public static sandbox; +} + +DeleteAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/DeleteActionL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/DeleteActionL0Tests.ts new file mode 100644 index 000000000000..8c692e965ce8 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/DeleteActionL0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteActionKeyWord) }); + } + + public static sandbox; +} + +DeleteActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/EditAction2L0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/EditAction2L0Tests.ts new file mode 100644 index 000000000000..5720d1c3f268 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/EditAction2L0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return "123"; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + editReleaseAction: () => { + console.log("L0Test: edit release action method should be called when a release is present for given tag"); // = this.editAction2KeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/EditActionL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/EditActionL0Tests.ts new file mode 100644 index 000000000000..8b366d15e3c1 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/EditActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "input"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return null; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called when no release is present for given tag"); // = this.editActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/HelperL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/HelperL0Tests.ts new file mode 100644 index 000000000000..07dace6e6eb8 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/HelperL0Tests.ts @@ -0,0 +1,47 @@ +import { Helper } from "../operations/Helper"; +import { TestString } from "./TestStrings"; + +export class HelperL0Tests { + public static async startTests() { + await this.validateGetTagForCreateAction(); + await this.validateGetTagForCreateActionWithTagPattern(); + await this.validateGetCommitShaFromTarget(); + await this.validateGetReleaseIdForTag(); + } + + public static async validateGetTagForCreateAction() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "abc"); + + if (tag === "tagName") { + console.log(TestString.getTagForCreateActionKeyword); + } + } + + public static async validateGetTagForCreateActionWithTagPattern() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "bcd", "v1.*"); + + if (tag === "v1.12") { + console.log(TestString.getTagForCreateActionWithTagPatternKeyword); + } + } + + public static async validateGetCommitShaFromTarget() { + let target = "master"; + let sha = await new Helper().getCommitShaFromTarget("endpoint", "repo", target); + + if (sha === "abc") { + console.log(TestString.getCommitShaFromTargetKeyword); + } + } + + public static async validateGetReleaseIdForTag() { + let releaseId = await new Helper().getReleaseIdForTag("endpoint", "repo", "tagName"); + + if (releaseId === 456) { + console.log(TestString.getReleaseIdForTagKeyword); + } + } + +} + +HelperL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/HelperTests.ts b/_generated/GitHubReleaseV0_Node16/Tests/HelperTests.ts new file mode 100644 index 000000000000..d04fb89eb0d5 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/HelperTests.ts @@ -0,0 +1,67 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class HelperTests { + + public static startTest() { + let tp = path.join(__dirname, 'HelperL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + getTags: function() { + return { + statusCode: 200, + headers: { "link": ""}, + body: [ + { + "commit": { "sha": "abc" }, + "name": "tagName" + }, + { + "commit": { "sha": "bcd" }, + "name": "test" + }, + { + "commit": { "sha": "bcd" }, + "name": "v1.12" + } + ] + } + }, + getBranch: function(githubEndpointToken: string, repositoryName: string, target: string) { + + return { + statusCode: 200, + body: { commit: { sha: target === "master"? "abc":target } } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + {"tag_name": "abc", "id": 123}, + {"tag_name": "tagName", "id": 456} + ], + headers: {} + } + } + } + } + }); + } +} + +HelperTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/InvalidActionL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/InvalidActionL0Tests.ts new file mode 100644 index 000000000000..7bf27ba512fc --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/InvalidActionL0Tests.ts @@ -0,0 +1,34 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class InvalidActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "creadte"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tag, "tag"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + } + + public static sandbox; +} + +InvalidActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/L0.ts b/_generated/GitHubReleaseV0_Node16/Tests/L0.ts new file mode 100644 index 000000000000..2c065aa90f4e --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/L0.ts @@ -0,0 +1,136 @@ +import * as path from 'path'; +import * as assert from 'assert'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { TestString } from './TestStrings'; + +describe('GitHubReleaseTaskTests Suite', function() { + this.timeout(60000); + + it('Validate delete action is called when action = delete.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteActionKeyWord) >= 0, 'should have printed: ' + TestString.deleteActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = create', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createActionKeyWord) >= 0, 'should have printed: ' + TestString.createActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = edit but no release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editActionKeyWord) >= 0, 'should have printed: ' + TestString.editActionKeyWord); + + done(); + }); + + it('Validate edit action is called when action = edit but a release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editAction2KeyWord) >= 0, 'should have printed: ' + TestString.editAction2KeyWord); + + done(); + }); + + it('Validate delete action is called when action = Delete. Validating if action is case insensitive or not.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteAction2KeyWord) >= 0, 'should have printed: ' + TestString.deleteAction2KeyWord); + + done(); + }); + + it('Validate task fails with correct error when action = create and no tag is present.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.NoTagFoundKeyword) >= 0, 'should have printed: ' + TestString.NoTagFoundKeyword); + + done(); + }); + + it('Validate task fails with correct error when action input is invalid', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'InvalidActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.InvalidActionKeyword) >= 0, 'should have printed: ' + TestString.InvalidActionKeyword); + + done(); + }); + + it('Validate Utility class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'UtilityL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getReleaseNoteKeyword) >= 0, 'should have printed: ' + TestString.getReleaseNoteKeyword); + assert(tr.stdout.search(TestString.validBranchNameKeyword) >= 0, 'should have printed: ' + TestString.validBranchNameKeyword); + assert(tr.stdout.search(TestString.invalidBranchNameKeyword) >= 0, 'should have printed: ' + TestString.invalidBranchNameKeyword); + assert(tr.stdout.search(TestString.tagMatchingKeyword) >= 0, 'should have printed: ' + TestString.tagMatchingKeyword); + assert(tr.stdout.search(TestString.parseHTTPHeaderLinkKeyword) >= 0, 'should have printed: ' + TestString.parseHTTPHeaderLinkKeyword); + assert(tr.stdout.search(TestString.extractRepositoryOwnerAndNameKeyword) >= 0, 'should have printed: ' + TestString.extractRepositoryOwnerAndNameKeyword); + assert(tr.stdout.search(TestString.extractRepoAndIssueIdKeyword) >= 0, 'should have printed: ' + TestString.extractRepoAndIssueIdKeyword); + assert(tr.stdout.search(TestString.getFirstLineKeyword) >= 0, 'should have printed: ' + TestString.getFirstLineKeyword); + + done(); + }); + + it('Validate Helper class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'HelperTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getTagForCreateActionKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionKeyword); + assert(tr.stdout.search(TestString.getTagForCreateActionWithTagPatternKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionWithTagPatternKeyword); + assert(tr.stdout.search(TestString.getCommitShaFromTargetKeyword) >= 0, 'should have printed: ' + TestString.getCommitShaFromTargetKeyword); + assert(tr.stdout.search(TestString.getReleaseIdForTagKeyword) >= 0, 'should have printed: ' + TestString.getReleaseIdForTagKeyword); + + done(); + }); + + it('Validate ChangeLog class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ChangeLogTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.stdout.search(TestString.getChangeLogKeyword) >= 0, 'should have printed: ' + TestString.getChangeLogKeyword); + assert(tr.stdout.search(TestString.allIssuesChangeLog) >= 0, 'should have printed: ' + TestString.allIssuesChangeLog); + assert(tr.stdout.search(TestString.issueBasedChangeLog) >= 0, 'should have printed: ' + TestString.issueBasedChangeLog); + assert(tr.stdout.search(TestString.noCategoryChangeLog) >= 0, 'should have printed: ' + TestString.noCategoryChangeLog); + assert(tr.stdout.search("Tag Name: v1.2") >=0, 'should have printed: TagName: v1.2'); + assert(tr.stdout.search("Tag Name: pre_rel") >=0, 'should have printed: TagName: pre_rel'); + assert(tr.stdout.search("Tag Name: tagName") >=0, 'should have printed: TagName: tagName'); + + done(); + }); + + it('Validate Action class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ActionTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.createReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.editReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.editReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.deleteReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.deleteReleaseSuccessKeyword); + + done(); + }); + +}); diff --git a/_generated/GitHubReleaseV0_Node16/Tests/TestStrings.ts b/_generated/GitHubReleaseV0_Node16/Tests/TestStrings.ts new file mode 100644 index 000000000000..afad94c3cd22 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/TestStrings.ts @@ -0,0 +1,29 @@ + +export class TestString { + public static readonly createReleaseSuccessKeyword: string = "CreateReleaseSuccess"; + public static readonly editReleaseSuccessKeyword: string = "EditReleaseSuccess"; + public static readonly deleteReleaseSuccessKeyword: string = "DeleteReleaseSuccess"; + public static readonly getChangeLogKeyword: string = "getChangeLog method should work properly"; + public static readonly NoTagFoundKeyword: string = "No tag found"; + public static readonly createActionKeyWord: string = "L0Test: create release action method should be called"; + public static readonly deleteActionKeyWord: string = "L0Test: delete action called when action = delete"; + public static readonly deleteAction2KeyWord: string = "L0Test: delete action should be called when action = Delete"; + public static readonly editAction2KeyWord: string = "L0Test: edit release action method should be called when a release is present for given tag"; + public static readonly editActionKeyWord: string = "L0Test: create release action method should be called when no release is present for given tag"; + public static readonly getTagForCreateActionKeyword: string = "getTagForCreateAction method should work properly"; + public static readonly getTagForCreateActionWithTagPatternKeyword: string = "getTagForCreateAction method should work properly when tagPattern is specified"; + public static readonly getCommitShaFromTargetKeyword: string = "getCommitShaFromTarget method should work properly"; + public static readonly getReleaseIdForTagKeyword: string = "getReleaseIdForTag method should work properly"; + public static readonly InvalidActionKeyword: string = "Invalid action input"; + public static readonly getReleaseNoteKeyword: string = "getReleaseNote method should work properly"; + public static readonly validBranchNameKeyword: string = "normalizeBranchName method should return tag name when branch = refs/tags/tagname"; + public static readonly invalidBranchNameKeyword: string = "normalizeBranchName method should return undefined when branch = refs/heads/tagname"; + public static readonly parseHTTPHeaderLinkKeyword: string = "parseHTTPHeaderLink method should work properly"; + public static readonly extractRepositoryOwnerAndNameKeyword: string = "extractRepositoryOwnerAndName method should work properly"; + public static readonly extractRepoAndIssueIdKeyword: string = "extractRepoAndIssueId method should work properly"; + public static readonly getFirstLineKeyword: string = "getFirstLine method should work properly"; + public static readonly tagMatchingKeyword: string = "isTagMatching method should work properly"; + public static readonly allIssuesChangeLog: string = "getChangeLog should generate All Issues ChangeLog"; + public static readonly issueBasedChangeLog: string = "getChangeLog should generate Issue Based ChangeLog"; + public static readonly noCategoryChangeLog: string = "ChangeLog generated should be a flatlist of issues."; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/UtilityL0Tests.ts b/_generated/GitHubReleaseV0_Node16/Tests/UtilityL0Tests.ts new file mode 100644 index 000000000000..9ee3a7a7d368 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/UtilityL0Tests.ts @@ -0,0 +1,92 @@ +import { Utility } from "../operations/Utility"; +import { TestString } from "./TestStrings"; + +export class UtilityL0Tests { + + public static startTests() { + this.validateGetReleaseNote(); + this.validateNormalizeBranchName(); + this.validateIsTagMatching(); + this.validateParseHTTPHeaderLink(); + this.validateExtractRepositoryOwnerAndName(); + this.validateExtractRepoAndIssueId(); + this.validateGetFirstLine(); + } + + public static validateGetReleaseNote() { + let releaseNoteInput = "release_note_input"; + let changeLog = "change_log"; + + let releaseNote = Utility.getReleaseNote("input", null, releaseNoteInput, changeLog); + if (releaseNote === (releaseNoteInput + changeLog)) { + console.log(TestString.getReleaseNoteKeyword); + } + } + + public static validateNormalizeBranchName() { + let normalizedBranchName = ""; + + normalizedBranchName = Utility.normalizeBranchName("refs/tags/tagName"); + if (normalizedBranchName === "tagName") { + console.log(TestString.validBranchNameKeyword); + } + + normalizedBranchName = Utility.normalizeBranchName("refs/heads/tagName"); + if (!normalizedBranchName) { + console.log(TestString.invalidBranchNameKeyword); + } + } + + public static validateIsTagMatching() { + let tag = "v1.1"; + let tagPattern = "v1.*"; + if (Utility.isTagMatching(tag, tagPattern)) { + console.log(TestString.tagMatchingKeyword); + } + } + + public static validateParseHTTPHeaderLink() { + let parsedHttpHeaderLink = {}; + let headerLink = '; rel="next", ; rel="last"'; + let expectedParsedHeaderLink = { + "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + } + parsedHttpHeaderLink = Utility.parseHTTPHeaderLink(headerLink); + + if (JSON.stringify(parsedHttpHeaderLink) === JSON.stringify(expectedParsedHeaderLink)) { + console.log(TestString.parseHTTPHeaderLinkKeyword); + } + } + + public static validateExtractRepositoryOwnerAndName() { + let repoName = "owner_name/repo_name"; + let repoInfo = Utility.extractRepositoryOwnerAndName(repoName); + + if (repoInfo.owner === "owner_name" && repoInfo.name === "repo_name") { + console.log(TestString.extractRepositoryOwnerAndNameKeyword); + } + + } + + public static validateExtractRepoAndIssueId() { + let repoIssueId = "repo#26"; + let info = Utility.extractRepoAndIssueId(repoIssueId); + + if (info.repository === "repo" && info.issueId === "26") { + console.log(TestString.extractRepoAndIssueIdKeyword); + } + } + + public static validateGetFirstLine() { + let message = "Fixing issue #25.\n Description #23"; + let firstLine = Utility.getFirstLine(message); + + if (firstLine === "Fixing issue #25.") { + console.log(TestString.getFirstLineKeyword); + } + } + +} + +UtilityL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/Tests/package-lock.json b/_generated/GitHubReleaseV0_Node16/Tests/package-lock.json new file mode 100644 index 000000000000..fba73c6345b8 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/package-lock.json @@ -0,0 +1,166 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sinonjs/commons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", + "integrity": "sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "array-from": "^2.1.1", + "lodash.get": "^4.4.2" + } + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/sinon": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz", + "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "nise": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", + "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "just-extend": "^4.0.2", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "dev": true, + "requires": { + "@sinonjs/samsam": "^2 || ^3" + } + } + } + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sinon": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } + } +} diff --git a/_generated/GitHubReleaseV0_Node16/Tests/package.json b/_generated/GitHubReleaseV0_Node16/Tests/package.json new file mode 100644 index 000000000000..d56d0b905d13 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/Tests/package.json @@ -0,0 +1,10 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "devDependencies": { + "@types/sinon": "^4.3.1", + "sinon": "^4.5.0", + "@types/mocha": "2.2.48" + } +} diff --git a/_generated/GitHubReleaseV0_Node16/ThirdPartyNotices.txt b/_generated/GitHubReleaseV0_Node16/ThirdPartyNotices.txt new file mode 100644 index 000000000000..2f2f1cc1664a --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/ThirdPartyNotices.txt @@ -0,0 +1,668 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +GitHub Release Task incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. browserify-mime (git+https://github.com/broofa/node-mime.git) +4. concat-map (https://github.com/substack/node-concat-map) +5. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +6. inflight (https://github.com/npm/inflight) +7. inherits (https://github.com/isaacs/inherits) +8. glob (git://github.com/isaacs/node-glob.git) +9. minimatch (https://github.com/isaacs/minimatch) +10. Mockery (https://github.com/mfncooper/mockery) +11. once (https://github.com/isaacs/once) +12. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +13. q (https://github.com/kriskowal/q) +14. semver (https://github.com/npm/node-semver/) +15. semver-compare (https://github.com/substack/semver-compare) +16. ShellJS (https://github.com/shelljs/shelljs) +17. tunnel (https://github.com/koichik/node-tunnel) +18. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +19. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +20. uuid (git+https://github.com/kelektiv/node-uuid.git) +21. vso-node-api (https://github.com/Microsoft/vsts-node-api) +22. azure-pipelines-task-lib (https://github.com/Microsoft/azure-pipelines-task-lib) +23. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +24. wrappy (https://github.com/npm/wrappy) +25. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +26. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/icon.png b/_generated/GitHubReleaseV0_Node16/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96e6b70c499d6b624878201c3f81424b0982054c GIT binary patch literal 1094 zcmV-M1iAZ(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00Xv3L_t(oN3B;)Xj4HDer*%{10~7+yjQ9b ztsqtuR76x1l|m6z5LB=Q5f!~u58k{K(Szv0qn>(E6#M}Z6qFu3C{(3hyi`=YNwq)z zRZB^e`pv#+OkOt6*Svf%kheSY&F<{X&c>MywAM>iMs+Hou0ZZ;A)jiYo+zpA;QKP> z4!f?KW%c^N^St@4ltH(zlA8C2=xL-l4dt{q|@nzIO_o` zK^=s+$p^cuKmt2|SY{;DFP!5ren&~ZpinXn6Gz#&Q1{`h(RWz_B;3g|MF`IBIHnSA zCbPkmU9_CYV}}hv0yr8fRFPwALQFXSv(I;V8s(S8o~ClK@AGLxu75NjRnXd%ftuR&F=mVN29qDD*VVH zgvYWnsot<*-9VeN_{q@%f`fErzGJ(3p@C}O=F6dM4-R5%By#tP0J?O*`P<@W+`(=K zgA^dOzhJ=-J_ivvu65*Mkdz?9H2JhaM z=n&cMppmS=hqc{e5nrjvFxRX>S2=N5xuu$HPBkw!iuia|oHR!wZ^G~okL3`hUY*t( zqdYRHx0ucd4%ki=d4nQkADft!c3{wSEG%Y#dO7uMeE%pKm^nEL;#)AWT~bMqK7ii0 zQkyE0M<3Y1b_Pu#?kg$?_1?S2+ zQG)Ltlwz9_;vA0SE#G91!`^hX=o$NJ0?vecPHa^!<`?LgR1K+(?!Ax9C3vv9taB1Fjrm8wlDo6XK;M>d(#LLXz* zaA1}A|5tf+l8_Tts{mDr%?9!l`EiidqJgerB+Kg{Sy(CB7J!YsjPtTeP}opjA3;XP zQV3fBHLw{ysw7m_Q4A;i*?34I2ihT>{9P5$>B152!q22X5(dZl3#0r-xPpe0SpWb4 M07*qoM6N<$f*rl~Jpcdz literal 0 HcmV?d00001 diff --git a/_generated/GitHubReleaseV0_Node16/icon.svg b/_generated/GitHubReleaseV0_Node16/icon.svg new file mode 100644 index 000000000000..f9aea8bf7966 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/_generated/GitHubReleaseV0_Node16/main.ts b/_generated/GitHubReleaseV0_Node16/main.ts new file mode 100644 index 000000000000..94dc380d32df --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/main.ts @@ -0,0 +1,133 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import { Action } from "./operations/Action"; +import { Utility, ActionType, Delimiters, ChangeLogStartCommit, ChangeLogType } from './operations/Utility'; +import { Inputs} from "./operations/Constants"; +import { ChangeLog } from "./operations/ChangeLog"; +import { Helper } from "./operations/Helper"; + +class Main { + + public static async run(): Promise { + try { + var taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + + let actions = new Action(); + let helper = new Helper() + + // Get basic task inputs + const githubEndpoint = tl.getInput(Inputs.gitHubConnection, true); + const githubEndpointToken = Utility.getGithubEndPointToken(githubEndpoint); + + const repositoryName = tl.getInput(Inputs.repositoryName, true); + + const action = tl.getInput(Inputs.action, true).toLowerCase(); + Utility.validateAction(action); + + let tagSource = tl.getInput(Inputs.tagSource); + Utility.validateTagSource(tagSource, action); + + let tag = tl.getInput(Inputs.tag); + Utility.validateTag(tag, tagSource, action); + + if (action === ActionType.delete) { + helper.publishTelemetry(); + await actions.deleteReleaseAction(githubEndpointToken, repositoryName, tag); + } + else { + // Get task inputs specific to create and edit release + const target = tl.getInput(Inputs.target, true); + const releaseTitle = tl.getInput(Inputs.title) || undefined; + + const isPrerelease = tl.getBoolInput(Inputs.isPreRelease) || false; + const isDraft = tl.getBoolInput(Inputs.isDraft) || false; + const githubReleaseAssetInputPatterns = tl.getDelimitedInput(Inputs.assets, Delimiters.newLine); + + if (action === ActionType.create) { + //Get task inputs specific to create release + const tagPattern = tl.getInput(Inputs.tagPattern) || undefined; + + // Get tag to create release if tag source is gitTag/auto + if (Utility.isTagSourceAuto(tagSource)) { + tag = await helper.getTagForCommitTarget(githubEndpointToken, repositoryName, target, tagPattern); + } + + if (!!tag) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + else { + // If no tag found, then give warning. + // Doing this because commits without associated tag will fail continuosly if we throw error. + // Other option is to have some task condition, which user can specify in task. + tl.warning(tl.loc("NoTagFound")); + tl.debug("No tag found"); // for purpose of L0 test only. + } + } + else if (action === ActionType.edit) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + // Get the release id of the release to edit. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: any = await helper.getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + // If a release is found, then edit it. + // Else create a new release. + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await actions.editReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns, releaseId); + } + else { + tl.warning(tl.loc("NoReleaseFoundToEditCreateRelease", tag)); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + } + } + + tl.setResult(tl.TaskResult.Succeeded, ""); + } + catch(error) { + tl.setResult(tl.TaskResult.Failed, error); + } + } + + private static async _getReleaseNote(githubEndpointToken: string, repositoryName: string, target: string): Promise { + const releaseNotesSource = tl.getInput(Inputs.releaseNotesSource, true); + Utility.validateReleaseNotesSource(releaseNotesSource); + const releaseNotesFile = tl.getPathInput(Inputs.releaseNotesFile, false, true); + const releaseNoteInput = tl.getInput(Inputs.releaseNotes); + const showChangeLog: boolean = tl.getBoolInput(Inputs.addChangeLog); + let changeLog: string = ""; + if (showChangeLog){ + let changeLogLabels: any = null; + const changeLogCompareToRelease = tl.getInput(Inputs.changeLogCompareToRelease); + Utility.validateStartCommitSpecification(changeLogCompareToRelease); + const changeLogType = tl.getInput(Inputs.changeLogType); + Utility.validateChangeLogType(changeLogType); + if (changeLogType === ChangeLogType.issueBased){ + const changeLogLabelsInput = tl.getInput(Inputs.changeLogLabels); + try{ + changeLogLabels = JSON.parse(changeLogLabelsInput); + } + catch(error){ + changeLogLabels = []; + tl.warning(tl.loc("LabelsSyntaxError")); + } + } + + const changeLogCompareToReleaseTag = tl.getInput(Inputs.changeLogCompareToReleaseTag) || undefined; + // Generate the change log + // Get change log for top 250 commits only + changeLog = await new ChangeLog().getChangeLog(githubEndpointToken, repositoryName, target, 250, ChangeLogStartCommit[changeLogCompareToRelease], changeLogType, changeLogCompareToReleaseTag, changeLogLabels); + } + // Append change log to release note + const releaseNote: string = Utility.getReleaseNote(releaseNotesSource, releaseNotesFile, releaseNoteInput, changeLog) || undefined; + + return releaseNote; + } +} + +Main.run(); diff --git a/_generated/GitHubReleaseV0_Node16/make.json b/_generated/GitHubReleaseV0_Node16/make.json new file mode 100644 index 000000000000..3df4ca171399 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/Action.ts b/_generated/GitHubReleaseV0_Node16/operations/Action.ts new file mode 100644 index 000000000000..f4d849317b75 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/Action.ts @@ -0,0 +1,255 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import fs = require('fs'); +import { WebResponse } from "./webClient"; +import { Release } from "./Release"; +import { Utility, AssetUploadMode, GitHubAttributes } from "./Utility"; +import { Inputs } from "./Constants"; +import { Helper } from "./Helper"; + +export class Action { + + /** + * Creating a release and uploading assets are 2 different process. First we create a release and when it is successful, we upload assets to it. + * But in our scenario, we assume it to be a single process, means if upload assets step fail then we say release is in dirty state and we would want it to be deleted as it is without assets yet. + * So, we delete the created release as assets are not uploaded to it. And will want user to run the task again to create release with assets. + * The delete release step is only reachable if user has specified any assets to upload and the upload step failed. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + */ + public async createReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[]): Promise { + console.log(tl.loc("CreatingRelease", tag)); + + // Create release + let response: WebResponse = await new Release().createRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease); + tl.debug("Create release response: " + JSON.stringify(response)); + + if (response.statusCode === 201) { + try { + // Upload the assets + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, [], false); + console.log(tl.loc("CreateReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + catch (error) { + console.log(tl.loc("CreateReleaseFailed")); + + try { + // If upload asets fail, then delete the release + let releaseId: string = response.body[GitHubAttributes.id]; + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + catch (error) { + tl.debug("Failed to delete the release which is in dirty state currently. Assets were expected to be uploaded but it failed. Delete the release manually.") + } + + throw error; + } + } + else if (response.statusCode === 422 && response.body.errors && response.body.errors.length > 0 && response.body.errors[0].code === this._alreadyExistErrorCode) { + tl.error(tl.loc("ReleaseAlreadyExists", tag)); + throw new Error(response.body[GitHubAttributes.message]); + } + else { + tl.error(tl.loc("CreateReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Edits an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + * @param releaseId + */ + public async editReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[], releaseId: string): Promise { + console.log(tl.loc("EditingRelease", tag)); + + let response: WebResponse = await new Release().editRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, releaseId); + tl.debug("Edit release response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, response.body[GitHubAttributes.assets], true); + console.log(tl.loc("EditReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + else { + tl.error(tl.loc("EditReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Deletes a release if it exists. + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async deleteReleaseAction(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + // Get the release id of the release with corresponding tag to delete. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: string = await new Helper().getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + else { + throw new Error(tl.loc("NoReleaseFoundToDelete", tag)); + } + } + + /** + * Deletes an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param releaseId + * @param tag + */ + private async _deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string, tag: string): Promise { + console.log(tl.loc("DeletingRelease", tag)); + let response: WebResponse = await new Release().deleteRelease(githubEndpointToken, repositoryName, releaseId); + tl.debug("Delete release response: " + JSON.stringify(response)); + + if (response.statusCode === 204) { + console.log(tl.loc("DeleteReleaseSuccess")); + } + else { + tl.error(tl.loc("DeleteReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Upload assets to the release. + * @param githubEndpointToken + * @param repositoryName + * @param githubReleaseAssetInputPatterns + * @param uploadUrl + * @param existingAssets + */ + private async _uploadAssets(githubEndpointToken: string, repositoryName: string, githubReleaseAssetInputPatterns: string[], uploadUrl: string, existingAssets: any[], editMode: boolean): Promise { + const assetUploadMode = tl.getInput(Inputs.assetUploadMode); + Utility.validateAssetUploadMode(assetUploadMode); + + // Delete all assets in case of edit release before uploading new assets. + if (editMode && !!assetUploadMode && assetUploadMode === AssetUploadMode.delete) { + console.log(tl.loc("DeleteAllExistingAssets")); + await this._deleteAssets(githubEndpointToken, repositoryName, existingAssets); + } + + if (githubReleaseAssetInputPatterns && githubReleaseAssetInputPatterns.length > 0) { + console.log(tl.loc("UploadingAssets")); + } + else { + console.log(tl.loc("NoAssetFoundToUpload")); + return; + } + + for (let pattern of (githubReleaseAssetInputPatterns || [])) { + await this._uploadAssetsForGivenPattern(githubEndpointToken, repositoryName, uploadUrl, existingAssets, pattern, assetUploadMode); + } + + console.log(tl.loc("AllAssetsUploadedSuccessfully")); + } + + private async _uploadAssetsForGivenPattern(githubEndpointToken: string, repositoryName: string, uploadUrl: string, existingAssets: any[], pattern: string, assetUploadMode: string): Promise { + console.log(tl.loc("SearchingFileMatchingPattern", pattern)); + + let assets: string[] = Utility.getUploadAssets(pattern) || []; + + if (Utility.isPatternADirectory(assets, pattern)) { + console.log(tl.loc("PatternIsADirectory", pattern)); + return; + } + + assets = assets.filter(asset => Utility.isFile(asset)); + + if (assets.length === 0) { + console.log(tl.loc("NoFileFoundMatchingPattern", pattern)); + return; + } + + Utility.validateUploadAssets(assets); + + for (let index = 0; index < assets.length; index++) { + const asset = assets[index]; + console.log(tl.loc("UploadingAsset", asset)); + + let uploadResponse = await new Release().uploadReleaseAsset(githubEndpointToken, asset, uploadUrl); + tl.debug("Upload asset response: " + JSON.stringify(uploadResponse)); + + if (uploadResponse.statusCode === 201) { + console.log(tl.loc("UploadAssetSuccess", asset)); + } + else if (uploadResponse.statusCode === 422 && uploadResponse.body.errors && uploadResponse.body.errors.length > 0 && uploadResponse.body.errors[0].code === this._alreadyExistErrorCode) { + + if (assetUploadMode === AssetUploadMode.replace) { + console.log(tl.loc("DuplicateAssetFound", asset)); + console.log(tl.loc("DeletingDuplicateAsset", asset)); + + const fileName = path.basename(asset); + + for (let existingAsset of existingAssets) { + if (fileName === existingAsset.name) { + await this._deleteAssets(githubEndpointToken, repositoryName, [existingAsset]); + index--; + break; + } + } + } + else { + console.log(tl.loc("SkipDuplicateAssetFound", asset)); + } + } + else { + tl.error(tl.loc("UploadAssetError")) + throw new Error(uploadResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Delete assets. + * @param githubEndpointToken + * @param repositoryName + * @param assets + */ + private async _deleteAssets(githubEndpointToken: string, repositoryName: string, assets: any[]): Promise { + if (assets && assets.length === 0) { + console.log(tl.loc("NoAssetFoundToDelete")); + return; + } + + for (let asset of assets) { + console.log(tl.loc("DeletingAsset", asset[GitHubAttributes.nameAttribute])); + let deleteAssetResponse = await new Release().deleteReleaseAsset(githubEndpointToken, repositoryName, asset.id); + tl.debug("Delete asset response: " + JSON.stringify(deleteAssetResponse)); + + if (deleteAssetResponse.statusCode === 204) { + console.log(tl.loc("AssetDeletedSuccessfully", asset[GitHubAttributes.nameAttribute])); + } + else { + tl.error(tl.loc("ErrorDeletingAsset", asset[GitHubAttributes.nameAttribute])); + throw new Error(deleteAssetResponse.body[GitHubAttributes.message]); + } + } + console.log(tl.loc("AssetsDeletedSuccessfully")); + } + + private readonly _alreadyExistErrorCode: string = "already_exists"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/ChangeLog.ts b/_generated/GitHubReleaseV0_Node16/operations/ChangeLog.ts new file mode 100644 index 000000000000..0608268b0737 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/ChangeLog.ts @@ -0,0 +1,701 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import { Utility, GitHubAttributes, IRepositoryIssueId, Delimiters, AzureDevOpsVariables, ChangeLogStartCommit, GitHubIssueState, ChangeLogType } from "./Utility"; +import { Release } from "./Release"; +import { Helper } from "./Helper"; + +export class ChangeLog { + + /** + * Returns the change log. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param top + * @param compareWithRelease + * @param changeLogType + * @param changeLogCompareToReleaseTag + * @param changeLogLabels + */ + public async getChangeLog(githubEndpointToken: string, repositoryName: string, target: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogType: string, changeLogCompareToReleaseTag?: string, changeLogLabels?: any[]): Promise { + console.log(tl.loc("ComputingChangeLog")); + + let release = new Release(); + // We will be fetching changes between startCommitSha...endCommitSha. + // endCommitSha: It is the current commit + // startCommitSha: It is the commit for which previous release was created + // If no previous release found, then it will be the first commit. + + // Get the curent commit. + let endCommitSha: string = await new Helper().getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + //Get the start commit. + let startCommitSha: string = await this.getStartCommitSha(githubEndpointToken, repositoryName, endCommitSha, top,compareWithRelease, changeLogCompareToReleaseTag); + // Compare the diff between 2 commits. + tl.debug("start commit: "+ startCommitSha + "; end commit: "+ endCommitSha); + console.log(tl.loc("FetchCommitDiff")); + let commitsListResponse = await release.getCommitsList(githubEndpointToken, repositoryName, startCommitSha, endCommitSha); + tl.debug("Get commits list response: " + JSON.stringify(commitsListResponse)); + + if (commitsListResponse.statusCode === 200) { + // If end commit is older than start commit i.e. Rollback scenario, we will not show any change log. + if (commitsListResponse.body[GitHubAttributes.status] === GitHubAttributes.behind) { + tl.warning(tl.loc("CommitDiffBehind")); + return ""; + } + else { + let commits: any[] = commitsListResponse.body[GitHubAttributes.commits] || []; + + // If endCommit and startCommit are same then also we will not show any change log. + if (commits.length === 0) { + console.log(tl.loc("CommitDiffEqual")); + return ""; + } + + console.log(tl.loc("FetchCommitDiffSuccess")); + // Reversing commits as commits retrieved are in oldest first order + commits = commits.reverse(); + + // Only show changeLog for top X commits, where X = top + // Form the commitId to issues dictionary + let commitIdToMessageDictionary: { [key: string]: string } = this._getCommitIdToMessageDictionary(commits.length > top ? commits.slice(0, top) : commits); + tl.debug("commitIdToMessageDictionary: " + JSON.stringify(commitIdToMessageDictionary)); + + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = this._getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary, repositoryName); + tl.debug("commitIdToRepoIssueIdsDictionary: " + JSON.stringify(commitIdToRepoIssueIdsDictionary)); + if (changeLogType === ChangeLogType.commitBased) { + return this._getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary, commitIdToMessageDictionary, repositoryName); + } + else { + let issues = new Set([]); + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string) => { + if (issues.size >= top) { + return; + } + commitIdToRepoIssueIdsDictionary[commitId].forEach(repoIssueId => { + if (issues.size >= top) { + return; + } + let issueDetails = Utility.extractRepoAndIssueId(repoIssueId); + let issueId = Number(issueDetails.issueId); + if (!!issueId && issueDetails.repository === repositoryName) { + issues.add(issueId); + } + }); + }); + + if (!!changeLogLabels && !!changeLogLabels.length) { + return this._getIssueBasedChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken, changeLogLabels); + } + else { + return this._getAllIssuesChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken); + } + } + } + } + else{ + tl.error(tl.loc("FetchCommitDiffError")); + throw new Error(commitsListResponse.body[GitHubAttributes.message]); + } + } + /** + * Generate issue based ChangeLog + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + * @param labels + */ + private async _getIssueBasedChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string, labels: any[]) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, true); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let index = 0; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + let labelsRankDictionary = this._getLabelsRankDictionary(labels); + tl.debug("labelsRankDictionary: " + JSON.stringify(labelsRankDictionary)); + let groupedIssuesDictionary = this._getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels); + tl.debug("Group wise issues : " + JSON.stringify(groupedIssuesDictionary)); + Object.keys(groupedIssuesDictionary).forEach((group: string) => { + if (groupedIssuesDictionary[group].length === 0) return; + //If the only category is the default cateogry, don't add the category title. + if (index > 0 || group!= this._defaultGroup){ + let changeLogGroupTitle = util.format(this._groupTitleFormat, group); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogGroupTitle + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogGroupTitle + Delimiters.newLine; + index++; + } + } + groupedIssuesDictionary[group].forEach(issueDetails => { + let changeLogPerIssue: string = this._getChangeLogPerIssue(issueDetails.id, issueDetails.issue); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + index++; + } + }); + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate all issue based ChangeLog without labels + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + */ + private async _getAllIssuesChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, false); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + Object.keys(issuesList).forEach((key: string, index: number) => { + let changeLogPerIssue = this._getChangeLogPerIssue(key.substr(1), issuesList[key].title); + // See more functionality + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate commit based ChangeLog + * @param commitIdToRepoIssueIdsDictionary + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private async _getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary: { [key: string]: Set }, commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string){ + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + // Evaluate change log + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string, index: number) => { + let changeLogPerCommit: string = this._getChangeLogPerCommit(commitId, commitIdToMessageDictionary[commitId], commitIdToRepoIssueIdsDictionary[commitId], repositoryName); + //See more functionality + // If changes are more than 10, then we will show See more button which will be collapsible. + // And under that seeMoreChangeLog will be shown + // topXChangeLog will be visible to user. + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerCommit + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerCommit + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + /** + * Returns the start commit needed to compute ChangeLog. + * @param githubEndpointToken + * @param repositoryName + * @param endCommitSha + * @param top + * @param compareWithRelease + * @param changeLogCompareToReleaseTag + */ + + public async getStartCommitSha(githubEndpointToken: string, repositoryName: string, endCommitSha: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogCompareToReleaseTag?: string): Promise { + let release = new Release(); + let startCommitSha: string; + if (compareWithRelease === ChangeLogStartCommit.lastFullRelease) { + // Get the latest published release to compare the changes with. + console.log(tl.loc("FetchLatestPublishRelease")); + let latestReleaseResponse = await release.getLatestRelease(githubEndpointToken, repositoryName); + tl.debug("Get latest release response: " + JSON.stringify(latestReleaseResponse)); + // Get the start commit. + // Release has target_commitsh property but it can be branch name also. + // Hence if a release is present, then get the tag and find its corresponding commit. + // Else get the first commit. + if (latestReleaseResponse.statusCode !== 200 && latestReleaseResponse.statusCode !== 404) { + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(latestReleaseResponse.body[GitHubAttributes.message]); + } + else if (latestReleaseResponse.statusCode !== 404 && latestReleaseResponse.body && !!latestReleaseResponse.body[GitHubAttributes.tagName]) { + let latestReleaseTag: string = latestReleaseResponse.body[GitHubAttributes.tagName]; + tl.debug("latest release tag: " + latestReleaseTag); + + let latestReleaseUrl: string = latestReleaseResponse.body[GitHubAttributes.htmlUrl]; + console.log(tl.loc("FetchLatestPublishReleaseSuccess", latestReleaseUrl)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, latestReleaseTag); + } + else { + console.log(tl.loc("NoLatestPublishRelease")); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + + return startCommitSha; + } + + let comparer; + if (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) { + //Latest non-draft Release + console.log(tl.loc("FetchLatestNonDraftRelease")); + comparer = release => !release[GitHubAttributes.draft]; + } + else { + //Latest release with the given tag or matching the given regex. + console.log(tl.loc("FetchLastReleaseByTag", changeLogCompareToReleaseTag)); + comparer = release => !release[GitHubAttributes.draft] && Utility.isTagMatching(release[GitHubAttributes.tagName], changeLogCompareToReleaseTag); + + } + + let initialTag = await this.getLastReleaseTag(githubEndpointToken, repositoryName, comparer); + + //If no such release exists, get the start commit + //else get the commit for that tag. + if (!initialTag) { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("NoMatchingReleases")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("NoTagMatchingReleases", changeLogCompareToReleaseTag)); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + else { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("FetchMatchingReleaseSuccess")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("FetchTagMatchingReleaseSuccess", changeLogCompareToReleaseTag)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, initialTag); + } + + return startCommitSha; + } + + /** + * Returns latest release satisfying the given comparer. + * @param githubEndpointToken + * @param repositoryName + * @param comparer + */ + public async getLastReleaseTag(githubEndpointToken: string, repositoryName: string, comparer:(release: any)=> boolean): Promise { + let release = new Release(); + + // Fetching all releases in the repository. Sorted in descending order according to 'created_at' attribute. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + let startRelease: any; + //404 is returned when there are no releases. + if (releasesResponse.statusCode !== 200 && releasesResponse.statusCode !== 404){ + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + else if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + startRelease = (releasesResponse.body || []).find(comparer); + if (!!startRelease) { + return startRelease[GitHubAttributes.tagName]; + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + } + //If status code is 404 or there are no releases satisfying the constraints return null. + return null; + } + } + + /** + * Returns the commit for provided tag + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + private async _getCommitForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let filteredTag: any = await new Helper().filterTag(githubEndpointToken, repositoryName, tag, this._filterTagsByTagName); + + return filteredTag && filteredTag[GitHubAttributes.commit][GitHubAttributes.sha]; + } + + /** + * Returns a commit which is 'X' (top) commits older than the provided commit sha. + * @param githubEndpointToken + * @param repositoryName + * @param sha + */ + private async _getInitialCommit(githubEndpointToken: string, repositoryName: string, sha: string, top: number): Promise { + let release = new Release(); + + // No api available to get first commit directly. + // So, fetching all commits before the current commit sha. + // Returning last commit or 250th commit which ever is smaller. + let commitsForGivenShaResponse = await release.getCommitsBeforeGivenSha(githubEndpointToken, repositoryName, sha); + let links: { [key: string]: string } = {}; + let commits: any[] = []; + + while(true) { + tl.debug("Get initial commit response: " + JSON.stringify(commitsForGivenShaResponse)); + + if (commitsForGivenShaResponse.statusCode === 200) { + // Returned commits are in latest first order and first commit is the commit queried itself. + (commitsForGivenShaResponse.body || []).forEach(commit => { + commits.push(commit); + }); + + if (commits.length >= top) { + // Return 250th commit + return commits[top - 1][GitHubAttributes.sha]; + } + + links = Utility.parseHTTPHeaderLink(commitsForGivenShaResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + commitsForGivenShaResponse = paginatedResponse; + continue; + } + else { + // Return last commit. + return commits[commits.length - 1][GitHubAttributes.sha]; + } + } + else { + tl.error(tl.loc("FetchInitialCommitError")); + throw new Error(commitsForGivenShaResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns a dictionary of { commitId to commit message }. + * @param commits + */ + private _getCommitIdToMessageDictionary(commits: any[]): { [key: string]: string } { + let commitIdToMessageDictionary: { [key: string]: string } = {}; + + for (let commit of (commits || [])) { + commitIdToMessageDictionary[commit[GitHubAttributes.sha]] = commit[GitHubAttributes.commit][GitHubAttributes.message]; + } + + return commitIdToMessageDictionary; + } + + /** + * Returns a dictionary of { commitId to repoIssueIds }. + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private _getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string): { [key: string]: Set } { + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = {}; + + Object.keys(commitIdToMessageDictionary).forEach((commitId: string) => { + commitIdToRepoIssueIdsDictionary[commitId] = this._getRepoIssueIdFromCommitMessage(commitIdToMessageDictionary[commitId], repositoryName); + + }); + + return commitIdToRepoIssueIdsDictionary; + } + + /** + * Returns a dictionary of { key to displayname, rank }. + * Key is labelname#issuestate + * This dictionary is used to find the label with highest priority. + * @param labels + */ + private _getLabelsRankDictionary(labels: any[]){ + let labelsRankDictionary = {}; + for (let index = 0; index < labels.length; index++){ + if (!labels[index].label || !labels[index].displayName) continue; + let label = labels[index].label; + let issueState = labels[index].state || this._noStateSpecified; + let key = (label+ Delimiters.hash +issueState).toLowerCase(); + if (!labelsRankDictionary[key]){ + labelsRankDictionary[key] = {displayName: labels[index].displayName, rank: index}; + } + } + return labelsRankDictionary; + } + + /** + * Returns a dictionary of { groupname to issues }. + * This dictionary is used to find all the issues under a display name. + * @param labelsRankDictionary + * @param issuesList + */ + private _getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels){ + let labelsIssuesDictionary = {}; + labels.forEach(label => { + if (!label.displayName) return; + labelsIssuesDictionary[label.displayName] = []; + }); + labelsIssuesDictionary[this._defaultGroup] = []; + Object.keys(issuesList).forEach((issue: string) => { + let group: string = null; + let currentLabelRank: number = Number.MAX_SAFE_INTEGER; + let issueState = issuesList[issue].state; + //For Pull Requests, show only Merged PRs, Ignore Closed PRs + if (!!issuesList[issue].changedFiles){ + if(issueState.toLowerCase() === GitHubIssueState.merged.toLowerCase()){ + issueState = GitHubIssueState.closed; + } + else if (issueState.toLowerCase() === GitHubIssueState.closed.toLowerCase()){ + return; + } + } + issuesList[issue].labels.edges && issuesList[issue].labels.edges.forEach(labelDetails => { + let key = (labelDetails.node.name + Delimiters.hash + issueState).toLowerCase(); + if(!labelsRankDictionary[key]) { + key = (labelDetails.node.name + Delimiters.hash + this._noStateSpecified).toLowerCase(); + } + + if (labelsRankDictionary[key] && labelsRankDictionary[key].rank < currentLabelRank){ + group = labelsRankDictionary[key].displayName; + currentLabelRank = labelsRankDictionary[key].rank; + } + }); + if (currentLabelRank === Number.MAX_SAFE_INTEGER){ + group = this._defaultGroup; //Default category + } + labelsIssuesDictionary[group].push({"issue": issuesList[issue].title, "id": issue.substr(1)}); + }); + return labelsIssuesDictionary; + } + + /** + * Returns the log for a single issue. + * Log format: * #issueId: issueTitle + * @param issueId + * @param issueTitle + */ + private _getChangeLogPerIssue(issueId: number | string, issueTitle: string){ + return Delimiters.star + Delimiters.space + Delimiters.hash + issueId + Delimiters.colon + Delimiters.space + issueTitle; + } + + /** + * Filter tags by tag name. + * Returns tag object. + */ + private _filterTagsByTagName = (tagsList: any[], tagName: string): any[] => { + let filteredTags: any[] = []; + + (tagsList || []).forEach((tag: any) => { + if (tag[GitHubAttributes.nameAttribute] === tagName) { + filteredTags.push(tag); + } + }); + + return filteredTags; + } + + /** + * Returns a unique set of repository#issueId string for each issue mentioned in the commit. + * repository#issueId string is needed as issues can be of cross repository. + * @param message + * @param repositoryName + */ + private _getRepoIssueIdFromCommitMessage(message: string, repositoryName: string): Set { + let match = undefined; + let repoIssueIdSet: Set = new Set(); + + // regex.exec(message) will return one match at a time. + // Multiple execution will yield all matches. + // Returns undefined if no further match found. + // match is an array, where match[0] is the complete match + // and other match[i] gives the captured strings in order. + // In our regex, we have captured repository name and issueId resp. + while (match = this._issueRegex.exec(message)) { + tl.debug("match: " + match[0]); + tl.debug("match1: " + match[1]); + tl.debug("match2: " + match[2]); + tl.debug("repositoryName: " + repositoryName); + + // If no repository name found before an issue, then use user provided repository name to link it to issue + let repo: string = match[1] ? match[1] : repositoryName; + let issueId: string = match[2]; + + // Using # as separator as neither repoName nor issueId will have #. + let uniqueRepoIssueId: string = repo + Delimiters.hash + issueId; + tl.debug("uniqueRepoIssueId: " + uniqueRepoIssueId); + + // Message can contain same issue linked multiple times. + // Do not add an issue if its already added. + if (!repoIssueIdSet.has(uniqueRepoIssueId)) { + repoIssueIdSet.add(uniqueRepoIssueId); + } + } + + return repoIssueIdSet; + } + + /** + * Returns the log for a single commit. + * Log format: * commitId commitMessageTitle, [ #issueId1, #issueId2 ] + * @param commitId + * @param commitMessage + * @param repoIssueIdSet + * @param repositoryName + */ + private _getChangeLogPerCommit(commitId: string, commitMessage: string, repoIssueIdSet: Set, repositoryName: string): string { + // GitHub commit messages have description as well alongwith title. + // Parsing the commit title and showing to user. + let commitMessageFirstLine: string = Utility.getFirstLine(commitMessage); + // Log format without issues: * commitId commitMessageTitle + let log: string = Delimiters.star + Delimiters.space + commitId + Delimiters.space + commitMessageFirstLine; + let issuesText: string = ""; + + // Appending each issue mentioned in the commit message. + // Ignoring issue which is present in commit title, to avoid duplicates. + if (!!repoIssueIdSet && repoIssueIdSet.size > 0) { + + (repoIssueIdSet).forEach((repoIssueId: string) => { + // Extract repository information for issue as cross repository issues can also be present. + let repoIssueIdInfo: IRepositoryIssueId = Utility.extractRepoAndIssueId(repoIssueId); + let issueIdText: string = ""; + + // If issue belongs to cross repository, then prefix repository name to issueId so that it can be linked correctly in GitHub. + if (repoIssueIdInfo.repository !== repositoryName) { + issueIdText += repoIssueIdInfo.repository; + } + // # is required before issueId for referencing purpose in GitHub. + issueIdText = issueIdText + Delimiters.hash + repoIssueIdInfo.issueId; + + // If this issue is not present in commit title, then append to issues text. + if (!commitMessageFirstLine.includes(issueIdText)) { + if (!!issuesText) { + // Append comma after every issue + issuesText += Delimiters.comma; + } + issuesText = issuesText + Delimiters.space + issueIdText; + } + }); + } + + // If issues are present, then enclose it in brackets and append to log. + if (!!issuesText) { + log = log + Delimiters.openingBracketWithSpace + issuesText + Delimiters.closingBracketWithSpace; + } + + return log; + } + + private _getAutoGeneratedText(): string { + let autoGeneratedUrl: string = encodeURI(this._getAutoGeneratedUrl()); + + if (!!autoGeneratedUrl) { + return util.format(this._autoGeneratedTextFormat, autoGeneratedUrl); + } + + return ""; + } + + private _generateChangeLog(topXChangeLog: string, seeMoreChangeLog: string): string { + let changeLog: string = ""; + if (topXChangeLog) { + changeLog = util.format(this._changeLogTitleFormat, this._changeLogTitle) + topXChangeLog; + + if(!seeMoreChangeLog) { + changeLog = changeLog + Delimiters.newLine + this._getAutoGeneratedText(); + } + else { + changeLog = changeLog + util.format(this._seeMoreChangeLogFormat, this._seeMoreText, seeMoreChangeLog, this._getAutoGeneratedText()); + } + } + return changeLog; + } + + private _getAutoGeneratedUrl(): string { + let releaseUrl: string = tl.getVariable(AzureDevOpsVariables.releaseWebUrl); + + if (!!releaseUrl) { + tl.debug("release web url: " + releaseUrl); + return releaseUrl; + } + else { + let collectionUri: string = tl.getVariable(AzureDevOpsVariables.collectionUri); + + // Make sure collection uri does not end with slash + if (collectionUri.endsWith(Delimiters.slash)) { + collectionUri = collectionUri.slice(0, collectionUri.length - 1); + } + + let teamProject: string = tl.getVariable(AzureDevOpsVariables.teamProject); + let buildId: string = tl.getVariable(AzureDevOpsVariables.buildId); + + tl.debug("Build url: " + util.format(this._buildUrlFormat, collectionUri, teamProject, buildId)); + return util.format(this._buildUrlFormat, collectionUri, teamProject, buildId); + } + } + + // https://github.com/moby/moby/commit/df23a1e675c7e3cbad617374d85c48103541ee14?short_path=6206c94#diff-6206c94cde21ec0a5563c8369b71e609 + // Supported format for GitHub issues: #26 GH-26 repositoryName#26 repositoryNameGH-26, where GH is case in-sensitive. + private readonly _issueRegex = new RegExp("(?:^|[^A-Za-z0-9_]?)([a-z0-9_]+/[a-zA-Z0-9-_.]+)?(?:#|[G|g][H|h]-)([0-9]+)(?:[^A-Za-z_]|$)", "gm"); + private readonly _changeLogTitle: string = tl.loc("ChangeLogTitle"); + private readonly _seeMoreText: string = tl.loc("SeeMoreText"); + private readonly _noStateSpecified: string = "none"; + private readonly _defaultGroup: string = tl.loc("DefaultCategory"); + private readonly _changeLogVisibleLimit: number = 10; + private readonly _changeLogTitleFormat: string = "\n\n## %s:\n\n"; + private readonly _groupTitleFormat: string = "\n### %s:\n\n"; + private readonly _buildUrlFormat: string = "%s/%s/_build/results?buildId=%s&view=logs"; + private readonly _autoGeneratedTextFormat: string = "This list of changes was [auto generated](%s)."; + private readonly _seeMoreChangeLogFormat: string = "
%s\n\n%s\n%s
"; // For showing See more button if more than 10 commits message are to be shown to user. +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/Constants.ts b/_generated/GitHubReleaseV0_Node16/operations/Constants.ts new file mode 100644 index 000000000000..4e3ac311d4ef --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/Constants.ts @@ -0,0 +1,24 @@ + +export class Inputs { + public static readonly action = "action"; + public static readonly repositoryName = "repositoryName"; + public static readonly tag = "tag"; + public static readonly tagSource = "tagSource"; + public static readonly target = "target"; + public static readonly title = "title"; + public static readonly isDraft = "isDraft"; + public static readonly isPreRelease = "isPreRelease"; + public static readonly gitHubConnection = "gitHubConnection"; + public static readonly assets = "assets"; + public static readonly assetUploadMode = "assetUploadMode"; + public static readonly releaseNotesSource = "releaseNotesSource"; + public static readonly releaseNotesFile = "releaseNotesFile"; + public static readonly releaseNotes = "releaseNotes"; + public static readonly addChangeLog = "addChangeLog"; + public static readonly changeLogLabels = "changeLogLabels"; + public static readonly deleteExistingAssets = "deleteExistingAssets"; + public static readonly tagPattern = "tagPattern"; + public static readonly changeLogCompareToRelease = "changeLogCompareToRelease"; + public static readonly changeLogCompareToReleaseTag = "changeLogCompareToReleaseTag"; + public static readonly changeLogType = "changeLogType"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/Helper.ts b/_generated/GitHubReleaseV0_Node16/operations/Helper.ts new file mode 100644 index 000000000000..fcaa3d38cabc --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/Helper.ts @@ -0,0 +1,283 @@ +import tl = require("azure-pipelines-task-lib/task"); +import * as telemetry from "azure-pipelines-tasks-utility-common/telemetry"; +import { Utility, GitHubAttributes, AzureDevOpsVariables, ActionType} from "./Utility"; +import { Inputs } from "./Constants"; +import { Release } from "./Release"; +import * as crypto from "crypto"; + +interface IRelease { + tagName: string; + id: number; +} + +interface ITelemetryData { + area: string; + action: string; + repository: string; + tagSource: string; + isDraft: boolean; + isPreRelease: boolean; + addChangeLog: boolean; +} + +export class Helper { + + /** + * Returns tag name to be used for creating a release. + * If tagPattern is specified, returns tag matching the given pattern + * If user has specified tag, then use it + * else if $(Build.SourceBranch) is referencing to a tag, then parse tag name and use it + * else fetch tag from the target specified by user + * if no tag found for that target commit, then return undefined + * else if more than 1 tag found, then throw error + * else return the found tag name + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param tagPattern + */ + public async getTagForCommitTarget(githubEndpointToken: string, repositoryName: string, target: string, tagPattern: string = null): Promise { + console.log(tl.loc("FetchTagForTarget", target)); + let tag = undefined; + + let commit_sha: string = await this.getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + tl.debug("commit sha for target: " + commit_sha); + let buildSourceVersion = tl.getVariable(AzureDevOpsVariables.buildSourceVersion); + + // If the buildSourceVersion and user specified target does not match, then prefer user specified target + if (commit_sha !== buildSourceVersion) { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + else { + let buildSourceBranch = tl.getVariable(AzureDevOpsVariables.buildSourceBranch); + let normalizedBranch = Utility.normalizeBranchName(buildSourceBranch); + + // Check if branch is referencing to tag, if yes, then parse tag from branch name e.g. refs/tags/v1.0.1 + // Else fetch tag from commit + if (!!normalizedBranch) { + tag = normalizedBranch; + if (!!tagPattern && !Utility.isTagMatching(tag, tagPattern)) { + tag = null; + } + } + else { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + } + + if (!!tag) { + console.log(tl.loc("FetchTagForTargetSuccess", target)); + } + + return tag; + } + + /** + * Returns latest commit on the target if target is branch else returns target. + * Target can be branch as well e.g. 'master' and in this scenario we need to fetch commit associated to that branch + * @param githubEndpointToken + * @param repositoryName + * @param target + */ + public async getCommitShaFromTarget(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let commit_sha: string = undefined; + let response = await new Release().getBranch(githubEndpointToken, repositoryName, target); + tl.debug("Get branch response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + commit_sha = response.body[GitHubAttributes.commit][GitHubAttributes.sha]; + } + else if (response.statusCode === 404) { + commit_sha = target; + } + else { + tl.error(tl.loc("GithubApiFailError")); + throw new Error(response.body[GitHubAttributes.message]); + } + + return commit_sha; + } + + /** + * Returns releaseId associated with the tag. + * If 0 release found return undefined + * else if 1 release found return releaseId + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async getReleaseIdForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let release = new Release(); + + // Fetching all releases in the repository. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let releasesWithGivenTag: IRelease[] = []; + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + (releasesResponse.body || []).forEach(release => { + tl.debug("release[GitHubAttributes.tagName]: " + release[GitHubAttributes.tagName] + " " + "tag: " + tag); + // Push release if tag matches + if (release[GitHubAttributes.tagName] === tag) { + releasesWithGivenTag.push({ + tagName: release[GitHubAttributes.tagName], + id: release[GitHubAttributes.id] + } as IRelease); + } + }); + + // Throw error in case of ambiguity as we do not know which release to pick for editing or deleting release. + if (releasesWithGivenTag.length >= 2) { + throw new Error(tl.loc("MultipleReleasesFoundError", tag)); + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + else { + return releasesWithGivenTag.length === 0 ? null : releasesWithGivenTag[0].id; + } + } + else { + tl.error(tl.loc("GetReleasesError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns tag object associated with the commit. + * If 0 tag found return undefined + * else if 1 tag found return tag object + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param filterValue + * @param filterTagsCallback Callback to filter the tags + */ + public async filterTag(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]): Promise { + let release = new Release(); + + // Fetching the tags in the repository + let tagsResponse = await release.getTags(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + let filteredTags: any[] = []; + + // Fetching tags api call may end up in paginated results. + // So, traversing pages one by one and throwing error if more than 1 tag found. + while (true) { + tl.debug("Get tags response: " + JSON.stringify(tagsResponse)); + + if (tagsResponse.statusCode === 200) { + // Parse header link and get links to different pages + links = Utility.parseHTTPHeaderLink(tagsResponse.headers[GitHubAttributes.link]); + + // Filter the tags returned in current page + let tags: any[] = filterTagsCallback(tagsResponse.body, filterValue); + + if (!!tags && tags.length > 0) { + // Push returned tags in filtered tags. + tags.forEach((tag: any) => { + filteredTags.push(tag); + }) + + // Throw error in case of ambiguity as we do not know which tag to pick for creating release. + if (filteredTags.length >= 2 ) { + throw new Error(tl.loc("MultipleTagFound", filterValue)); + } + } + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + tagsResponse = paginatedResponse; + continue; + } + else { + return filteredTags.length === 0 ? undefined : filteredTags[0]; + } + } + else{ + tl.error(tl.loc("GetTagsError")); + throw new Error(tagsResponse.body[GitHubAttributes.message]); + } + } + } + + public publishTelemetry(): void { + let telemetryData = {} as ITelemetryData; + + const releaseId: string = tl.getVariable(AzureDevOpsVariables.releaseId); + + telemetryData.area = !!releaseId ? "release" : "build"; + telemetryData.action = tl.getInput(Inputs.action, true).toLowerCase(); + let repositoryName = tl.getInput(Inputs.repositoryName, true); + telemetryData.repository = crypto.createHash('sha256').update(repositoryName).digest('hex'); + + if (telemetryData.action !== ActionType.delete) { + + if (telemetryData.action === ActionType.create) { + telemetryData.tagSource = tl.getInput(Inputs.tagSource); + } + + telemetryData.isDraft = tl.getBoolInput(Inputs.isDraft); + telemetryData.isPreRelease = tl.getBoolInput(Inputs.isPreRelease); + telemetryData.addChangeLog = tl.getBoolInput(Inputs.addChangeLog); + } + + telemetry.emitTelemetry("TaskHub", "GitHubRelease", telemetryData); + } + + /** + * Returns tag name associated with the commit. + * If tagPattern is specified returns tag name + * If 0 tag found return undefined + * else if 1 tag found return tag name + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param commit_sha + */ + private async _getTagForCommit(githubEndpointToken: string, repositoryName: string, commit_sha: string, tagPattern: string = null): Promise { + let filteredTag: any; + let filterTagsCallback = (tagsList: any[], commit_sha: string): any[] => { + tagsList = this._filterTagsByCommitSha(tagsList, commit_sha); + if (!tagPattern) { + return tagsList; + } + return tagsList.filter((tag: any) => Utility.isTagMatching(tag[GitHubAttributes.nameAttribute], tagPattern)); + } + + filteredTag = await this.filterTag(githubEndpointToken, repositoryName, commit_sha, filterTagsCallback); + + return filteredTag && filteredTag[GitHubAttributes.nameAttribute]; + } + + /** + * Returns an array of matched tags, filtering on basis of commit sha + */ + private _filterTagsByCommitSha = (tagsList: any[], commit_sha: string): any[] => { + let filteredTags: any[] = []; + + for (let tag of (tagsList || [])) { + if (tag[GitHubAttributes.commit][GitHubAttributes.sha] === commit_sha) { + filteredTags.push(tag); + } + } + + return filteredTags; + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/Release.ts b/_generated/GitHubReleaseV0_Node16/operations/Release.ts new file mode 100644 index 000000000000..b1441f98f12c --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/Release.ts @@ -0,0 +1,259 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import path = require("path"); +import fs = require('fs'); +import mime = require('browserify-mime'); +import { Utility } from "./Utility"; +import { WebRequest, sendRequest, WebResponse } from "./webClient"; + +export class Release { + + public async createRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._createReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "POST"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Create release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async editRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "PATCH"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Edit release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteReleaseAsset(githubEndpointToken: string, repositoryName: string, asset_id: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._deleteReleaseAssetApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, asset_id); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release asset request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + + public async uploadReleaseAsset(githubEndpointToken: string, filePath: string, uploadUrl: string): Promise { + let fileName = path.basename(filePath); + tl.debug("Filename: " + fileName); + + let rd = fs.createReadStream(filePath); + var stats = fs.statSync(filePath); + + let request = new WebRequest(); + request.uri = util.format(this._uploadReleaseAssetApiUrlFormat, uploadUrl.split('{')[0], fileName); + request.method = "POST"; + request.headers = { + "Content-Type": mime.lookup(fileName), + 'Content-Length': stats.size, + 'Authorization': 'token ' + githubEndpointToken + }; + request.body = rd; + tl.debug("Upload release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getBranch(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getBranchApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, target); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get branch request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getTags(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getTagsApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get tags request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getReleases(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get releases request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getLatestRelease(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getLatestReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get latest release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getPaginatedResult(githubEndpointToken: string, nextPageLink: string): Promise { + let request = new WebRequest(); + + request.uri = nextPageLink; + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get paginated request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsList(githubEndpointToken: string,repositoryName: string, startCommitSha: string, endCommitSha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsListApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, startCommitSha, endCommitSha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits list request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsBeforeGivenSha(githubEndpointToken: string,repositoryName: string, sha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsBeforeGivenShaApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, sha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits before given sha request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getIssuesList(githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + let request = new WebRequest(); + request.uri = util.format(this._graphQLUrlFormat, Utility.getGitHubApiUrl()); + request.method = "POST"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Fetching labels for issues: " + issues); + let issuesQuery = issues.map(issue => `_${issue}: issueOrPullRequest(number: ${issue}){ ...labelsForIssue ...labelsForPullRequest }`).join(", "); + let repositoryDetails = repositoryName.split("/"); + let labelsFragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let labelsFragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + changedFiles + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let fragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + }`; + let fragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + }`; + + let query = `query{ + repository(owner: "${repositoryDetails[0]}", name: "${repositoryDetails[1]}"){ + ${issuesQuery} + } + } + ${includeLabels ? labelsFragmentForIssue : fragmentForIssue} + ${includeLabels ? labelsFragmentForPullRequest : fragmentForPullRequest}`; + request.body = JSON.stringify({ query }); + tl.debug("Get issues along with labels: " + JSON.stringify(request)); + return await sendRequest(request); + } + + private readonly _createReleaseApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _editOrDeleteReleaseApiUrlFormat: string = "%s/repos/%s/releases/%s"; + private readonly _deleteReleaseAssetApiUrlFormat: string = "%s/repos/%s/releases/assets/%s"; + private readonly _uploadReleaseAssetApiUrlFormat: string = "%s?name=%s"; + private readonly _getReleasesApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _getLatestReleasesApiUrlFormat: string = "%s/repos/%s/releases/latest"; + private readonly _getBranchApiUrlFormat: string = "%s/repos/%s/branches/%s"; + private readonly _getTagsApiUrlFormat: string = "%s/repos/%s/tags"; + private readonly _getCommitsListApiUrlFormat: string = "%s/repos/%s/compare/%s...%s"; + private readonly _getCommitsBeforeGivenShaApiUrlFormat: string = "%s/repos/%s/commits?sha=%s&per_page=100"; + private readonly _graphQLUrlFormat: string = "%s/graphql"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/operations/Utility.ts b/_generated/GitHubReleaseV0_Node16/operations/Utility.ts new file mode 100644 index 000000000000..b2557afa579c --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/Utility.ts @@ -0,0 +1,364 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import glob = require('glob'); +import fs = require('fs'); + +export class Utility { + + public static getGithubEndPointToken(githubEndpoint: string): string { + const githubEndpointObject = tl.getEndpointAuthorization(githubEndpoint, false); + let githubEndpointToken: string = null; + + if (!!githubEndpointObject) { + tl.debug("Endpoint scheme: " + githubEndpointObject.scheme); + + if (githubEndpointObject.scheme === 'PersonalAccessToken') { + githubEndpointToken = githubEndpointObject.parameters.accessToken + } else if (githubEndpointObject.scheme === 'OAuth'){ + // scheme: 'OAuth' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme === 'Token'){ + // scheme: 'Token' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme) { + throw new Error(tl.loc("InvalidEndpointAuthScheme", githubEndpointObject.scheme)); + } + } + + if (!githubEndpointToken) { + throw new Error(tl.loc("InvalidGitHubEndpoint", githubEndpoint)); + } + + return githubEndpointToken; + } + + public static getUploadAssets(pattern: string): string[] { + let githubReleaseAssets: Set = new Set(); + + /** Check for one or multiples files into array + * Accept wildcards to look for files + */ + let filePaths: string[] = glob.sync(pattern); + + (filePaths || []).forEach((filePath) => { + if (!githubReleaseAssets.has(filePath)) { + githubReleaseAssets.add(filePath) + } + }) + + return Array.from(githubReleaseAssets); + } + + public static isFile(asset: string): boolean { + return fs.lstatSync(path.resolve(asset)).isFile(); + } + + public static isPatternADirectory(assets: string[], pattern: string): boolean { + if (assets && assets.length === 1 && pattern) { + if ((path.resolve(assets[0]) === path.resolve(pattern)) && tl.exist(path.resolve(pattern)) && tl.stats(path.resolve(pattern)).isDirectory()) { + tl.debug("Pattern is a directory " + pattern); + return true; + } + } + return false; + } + + public static validateUploadAssets(assets: string[]): void { + if (assets && assets.length > 0) { + try { + assets.forEach(function (asset) { + fs.accessSync(path.resolve(asset)); + }) + } catch (err) { + tl.warning(tl.loc("MissingAssetError", err.path)); + } + } + } + + public static getReleaseNote(releaseNotesSource: string, releaseNotesFile: any, releaseNoteInput: string, changeLog: string): string { + let releaseNote: string = ""; + + if (releaseNotesSource === ReleaseNotesSelectionMode.file) { + + if (fs.lstatSync(path.resolve(releaseNotesFile)).isDirectory()) { + console.log(tl.loc("ReleaseNotesFileIsDirectoryError", releaseNotesFile)); + } + else { + releaseNote = fs.readFileSync(releaseNotesFile).toString(); + } + } + else { + releaseNote = releaseNoteInput; + } + tl.debug("ReleaseNote:\n" + releaseNote); + + if (!releaseNote) { + releaseNote = ""; + } + + // Append commits and issues to release note. + if (changeLog){ + releaseNote = releaseNote + changeLog; + } + + return releaseNote; + } + + public static getGitHubApiUrl(): string { + let githubApiUrlInput: string = undefined; // Todo: mdakbar: get GHE url + return githubApiUrlInput ? githubApiUrlInput : this._githubApiUrl; // url without slash at end + } + + public static normalizeBranchName(branchName: string): string { + if (!!branchName && branchName.startsWith(this._tagRef)) { + return branchName.substring(this._tagRef.length); + } + return undefined; + } + + /** + * Returns the parsed HTTP header link if it exists. + * E.g. Link: '; rel="next", ; rel="last"' + * Returned object would be like { + * "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + * "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + * } + * @param headerLink + */ + public static parseHTTPHeaderLink(headerLink: string): { [key: string]: string } { + if (!headerLink) { + // No paginated results found + return null; + } + + // Split pages by comma as pages are separated by comma + let pages = headerLink.split(Delimiters.comma); + let links: { [key: string]: string } = {}; + + // Parse each page to get link and rel + (pages || []).forEach((page) => { + let section: string[] = page.split(Delimiters.semiColon); + + // Atleast link and rel should be present else header link format has changed + if (section.length < 2) { + throw new Error("section could not be split on ';'"); + } + + // Reference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n + // Get link + let urlMatch = section[0].trim().match(this._githubPaginatedLinkRegex); // If it didn't match, it will return null, else it will return match at first position + let relMatch = null; + + // Get rel, there can be other attributes like rel. So for loop is needed to filter rel attribute. + for (let i = 1; i < section.length; i++) { + relMatch = section[i].trim().match(this._githubPaginatedRelRegex); // If it didn't match, it will return null, else it will return match at first position + + // Break as soon as rel attribute is found + if (!!relMatch) { + break; + } + } + + // If both link and rel are found, append it to dictionary + if (urlMatch && relMatch) { + links[relMatch[1]] = urlMatch[1]; + } + + }) + + tl.debug("Parsed link: " + JSON.stringify(links)); + return links; + } + + public static extractRepositoryOwnerAndName(repositoryName: string): IGitHubRepositoryInfo { + let repositoryInfo = repositoryName.split(Delimiters.slash); + + return { + owner: repositoryInfo[0], + name: repositoryInfo[1] + } + } + + public static extractRepoAndIssueId(repoIssueId: string): IRepositoryIssueId { + let repoIssueIdInfo: string[] = repoIssueId.split(Delimiters.hash); + let repo: string = repoIssueIdInfo[0]; + let issueId: string = repoIssueIdInfo[1]; + + return { + repository: repo, + issueId: issueId + } + } + + public static getFirstLine(commitMessage: string): string { + commitMessage = (commitMessage || "").trim(); + const match = commitMessage.match(this._onlyFirstLine); + + tl.debug("Commit message: " + commitMessage); + tl.debug("match: " + match); + + return match[0]; + } + + public static isTagSourceAuto(tagSource: string) { + return (tagSource === TagSelectionMode.auto); + } + + public static validateTagSource(tagSource: string, action: string) { + if (action === ActionType.create && tagSource !== TagSelectionMode.auto && tagSource !== TagSelectionMode.manual) { + throw new Error(tl.loc("InvalidTagSource", tagSource)); + } + } + + public static validateAction(action: string) { + if (action !== ActionType.create && action !== ActionType.edit && action !== ActionType.delete) { + tl.debug("Invalid action input"); // for purpose of L0 test only. + throw new Error(tl.loc("InvalidActionSet", action)); + } + } + + public static validateReleaseNotesSource(releaseNotesSource: string) { + if (releaseNotesSource !== ReleaseNotesSelectionMode.file && releaseNotesSource !== ReleaseNotesSelectionMode.input) { + throw new Error(tl.loc("InvalidReleaseNotesSource", releaseNotesSource)); + } + } + + public static validateStartCommitSpecification(compareWith: string) { + if (compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastFullRelease.toUpperCase() + && compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastNonDraftRelease.toUpperCase() + && compareWith.toUpperCase() != changeLogStartCommitSpecification.lastNonDraftReleaseByTag.toUpperCase()) { + throw new Error(tl.loc("InvalidCompareWithAttribute", compareWith)); + } + } + + public static validateChangeLogType(changeLogType: string) { + if (changeLogType.toUpperCase() !== ChangeLogType.issueBased.toUpperCase() + && changeLogType.toUpperCase() !== ChangeLogType.commitBased.toUpperCase() ) { + throw new Error(tl.loc("InvalidChangeLogTypeAttribute", changeLogType)); + } + } + public static validateAssetUploadMode(assetUploadMode: string) { + if (assetUploadMode !== AssetUploadMode.delete && assetUploadMode !== AssetUploadMode.replace) { + throw new Error(tl.loc("InvalidAssetUploadMode", assetUploadMode)); + } + } + + public static validateTag(tag: string, tagSource: string, action: string) { + if (!tag) { + if (action === ActionType.edit || action === ActionType.delete) { + throw new Error(tl.loc("TagRequiredEditDeleteAction", action)); + } + else if (action === ActionType.create && !this.isTagSourceAuto(tagSource)) { + throw new Error(tl.loc("TagRequiredCreateAction")); + } + } + + } + + public static isTagMatching(tag: string, tagPattern: string): boolean { + let tagPatternRegex = new RegExp("^" + tagPattern + "$"); + return tagPatternRegex.test(tag); + } + + private static readonly _onlyFirstLine = new RegExp("^.*$", "m"); + private static readonly _githubPaginatedLinkRegex = new RegExp("^<(.*)>$"); + private static readonly _githubPaginatedRelRegex = new RegExp('^rel="(.*)"$'); + private static readonly _tagRef: string = "refs/tags/"; + private static readonly _githubApiUrl: string = "https://api.github.com"; // url without slash at end +} + +export class TagSelectionMode { + public static readonly auto: string = "auto"; + public static readonly manual: string = "manual"; +} + +export class AssetUploadMode { + public static readonly delete = "delete"; + public static readonly replace = "replace"; +} + +export class changeLogStartCommitSpecification { + public static readonly lastFullRelease = "lastFullRelease"; + public static readonly lastNonDraftRelease = "lastNonDraftRelease"; + public static readonly lastNonDraftReleaseByTag = "lastNonDraftReleaseByTag"; +} + +export enum ChangeLogStartCommit{ + lastFullRelease = 0, + lastNonDraftRelease, + lastNonDraftReleaseByTag +} + +export class ChangeLogType{ + public static readonly issueBased = "issueBased"; + public static readonly commitBased = "commitBased"; +} +class ReleaseNotesSelectionMode { + public static readonly input = "input"; + public static readonly file = "file"; +} + +export class GitHubIssueState{ + public static readonly closed = "CLOSED"; + public static readonly merged = "MERGED"; +} + +export class GitHubAttributes { + public static readonly id: string = "id"; + public static readonly nameAttribute: string = "name"; + public static readonly tagName: string = "tag_name"; + public static readonly uploadUrl: string = "upload_url"; + public static readonly htmlUrl: string = "html_url"; + public static readonly assets: string = "assets"; + public static readonly commit: string = "commit"; + public static readonly message: string = "message"; + public static readonly state: string = "state"; + public static readonly title: string = "title"; + public static readonly commits: string = "commits"; + public static readonly sha: string = "sha"; + public static readonly behind: string = "behind"; + public static readonly status: string = "status"; + public static readonly link: string = "link"; + public static readonly next: string = "next"; + public static readonly draft: string = "draft"; + public static readonly preRelease: string = "prerelease"; +} + +export class ActionType { + public static readonly create = "create"; + public static readonly edit = "edit"; + public static readonly delete = "delete"; +} + +export class AzureDevOpsVariables { + public static readonly buildSourceVersion: string = "Build.SourceVersion"; + public static readonly buildSourceBranch: string = "Build.SourceBranch"; + public static readonly releaseWebUrl: string = "Release.ReleaseWebURL"; + public static readonly collectionUri: string = "System.TeamFoundationCollectionUri"; + public static readonly teamProject: string = "System.TeamProject"; + public static readonly buildId: string = "Build.BuildId"; + public static readonly releaseId: string = "Release.ReleaseId"; +} + +export interface IGitHubRepositoryInfo { + owner: string; + name: string; +} + +export interface IRepositoryIssueId { + repository: string; + issueId: string; +} + +export class Delimiters { + public static readonly newLine: string = "\n"; + public static readonly hash: string = "#"; + public static readonly slash: string = "/"; + public static readonly semiColon: string = ";"; + public static readonly comma: string = ","; + public static readonly space: string = " "; + public static readonly openingBracketWithSpace: string = " ["; + public static readonly closingBracketWithSpace: string = " ]"; + public static readonly star: string = "*"; + public static readonly colon: string = ":"; +} diff --git a/_generated/GitHubReleaseV0_Node16/operations/webClient.ts b/_generated/GitHubReleaseV0_Node16/operations/webClient.ts new file mode 100644 index 000000000000..19c509790deb --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/operations/webClient.ts @@ -0,0 +1,112 @@ +import tl = require('azure-pipelines-task-lib/task'); +import httpClient = require("typed-rest-client/HttpClient"); +import httpInterfaces = require("typed-rest-client/Interfaces"); +import util = require("util"); + +let proxyUrl: string = tl.getVariable("agent.proxyurl"); +var requestOptions: httpInterfaces.IRequestOptions = proxyUrl ? { + proxy: { + proxyUrl: proxyUrl, + proxyUsername: tl.getVariable("agent.proxyusername"), + proxyPassword: tl.getVariable("agent.proxypassword"), + proxyBypassHosts: tl.getVariable("agent.proxybypasslist") ? JSON.parse(tl.getVariable("agent.proxybypasslist")) : null + } +} : {}; + +let ignoreSslErrors: string = tl.getVariable("VSTS_ARM_REST_IGNORE_SSL_ERRORS"); +requestOptions.ignoreSslError = ignoreSslErrors && ignoreSslErrors.toLowerCase() == "true"; + +var httpCallbackClient = new httpClient.HttpClient(tl.getVariable("AZURE_HTTP_USER_AGENT"), null, requestOptions); + +export class WebRequest { + public method: string; + public uri: string; + // body can be string or ReadableStream + public body: string | NodeJS.ReadableStream; + public headers: any; +} + +export class WebResponse { + public statusCode: number; + public statusMessage: string; + public headers: any; + public body: any; +} + +export class WebRequestOptions { + public retriableErrorCodes: string[]; + public retryCount: number; + public retryIntervalInSeconds: number; + public retriableStatusCodes: number[]; + public retryRequestTimedout: boolean; +} + +export async function sendRequest(request: WebRequest, options?: WebRequestOptions): Promise { + let i = 0; + let retryCount = options && options.retryCount ? options.retryCount : 5; + let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2; + let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"]; + let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504]; + let timeToWait: number = retryIntervalInSeconds; + while (true) { + try { + let response: WebResponse = await sendRequestInternal(request); + if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + continue; + } + + return response; + } + catch (error) { + if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + } + else { + if (error.code) { + console.log("##vso[task.logissue type=error;code=" + error.code + ";]"); + } + + throw error; + } + } + } +} + +export function sleepFor(sleepDurationInSeconds): Promise { + return new Promise((resolve, reject) => { + setTimeout(resolve, sleepDurationInSeconds * 1000); + }); +} + +async function sendRequestInternal(request: WebRequest): Promise { + tl.debug(util.format("[%s]%s", request.method, request.uri)); + var response: httpClient.HttpClientResponse = await httpCallbackClient.request(request.method, request.uri, request.body, request.headers); + return await toWebResponse(response); +} + +async function toWebResponse(response: httpClient.HttpClientResponse): Promise { + var res = new WebResponse(); + if (response) { + res.statusCode = response.message.statusCode; + res.statusMessage = response.message.statusMessage; + res.headers = response.message.headers; + var body = await response.readBody(); + if (body) { + try { + res.body = JSON.parse(body); + } + catch (error) { + tl.debug("Could not parse response: " + JSON.stringify(error, null, 2)); + tl.debug("Response: " + JSON.stringify(res.body)); + res.body = body; + } + } + } + + return res; +} diff --git a/_generated/GitHubReleaseV0_Node16/package-lock.json b/_generated/GitHubReleaseV0_Node16/package-lock.json new file mode 100644 index 000000000000..96965d95a5c2 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/package-lock.json @@ -0,0 +1,720 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "dependencies": { + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "http://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha1-RBprv5s8aNpiTbAeo1y6jwpMLKs=", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/_generated/GitHubReleaseV0_Node16/package.json b/_generated/GitHubReleaseV0_Node16/package.json new file mode 100644 index 000000000000..8e99c7355a37 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/package.json @@ -0,0 +1,23 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^16.11.39", + "@types/q": "1.5.0", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "4.3.1", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "brace-expansion": "1.1.8", + "browserify-mime": "1.2.9", + "glob": "7.1.2", + "q": "1.4.1", + "semver": "5.4.1", + "typed-rest-client": "^1.8.9", + "vso-node-api": "6.0.1-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GitHubReleaseV0_Node16/task.json b/_generated/GitHubReleaseV0_Node16/task.json new file mode 100644 index 000000000000..781b35601bc1 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/task.json @@ -0,0 +1,352 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 0, + "Minor": 224, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "auto", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "auto": "Git tag", + "manual": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = auto", + "helpMarkDown": " Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = manual", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "file", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "file": "Release notes file", + "input": "Inline release notes" + } + }, + { + "name": "releaseNotesFile", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = file" + }, + { + "name": "releaseNotes", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = input", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" + }, + "Node16": { + "target": "main.js", + "argumentFormat": "" + } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern.", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'auto', or 'manual' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'file', or 'input' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to manual- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + }, + "_buildConfigMapping": { + "Default": "0.224.1", + "Node16-219": "0.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/task.loc.json b/_generated/GitHubReleaseV0_Node16/task.loc.json new file mode 100644 index 000000000000..eef1c3a59159 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/task.loc.json @@ -0,0 +1,352 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 0, + "Minor": 224, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "ms-resource:loc.group.displayName.changeLogConfiguration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "ms-resource:loc.input.label.gitHubConnection", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gitHubConnection" + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "ms-resource:loc.input.label.repositoryName", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.repositoryName", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "ms-resource:loc.input.label.action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.action", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "ms-resource:loc.input.label.target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.target" + }, + { + "name": "tagSource", + "type": "radio", + "label": "ms-resource:loc.input.label.tagSource", + "required": true, + "defaultValue": "auto", + "visibleRule": "action = create", + "helpMarkDown": "ms-resource:loc.input.help.tagSource", + "options": { + "auto": "Git tag", + "manual": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "ms-resource:loc.input.label.tagPattern", + "required": false, + "visibleRule": "tagSource = auto", + "helpMarkDown": "ms-resource:loc.input.help.tagPattern" + }, + { + "name": "tag", + "type": "string", + "label": "ms-resource:loc.input.label.tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = manual", + "helpMarkDown": "ms-resource:loc.input.help.tag" + }, + { + "name": "title", + "type": "string", + "label": "ms-resource:loc.input.label.title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.title" + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "ms-resource:loc.input.label.releaseNotesSource", + "required": false, + "defaultValue": "file", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesSource", + "options": { + "file": "Release notes file", + "input": "Inline release notes" + } + }, + { + "name": "releaseNotesFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.releaseNotesFile", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesFile", + "visibleRule": "releaseNotesSource = file" + }, + { + "name": "releaseNotes", + "type": "multiLine", + "label": "ms-resource:loc.input.label.releaseNotes", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotes", + "visibleRule": "releaseNotesSource = input", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "ms-resource:loc.input.label.assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assets", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "ms-resource:loc.input.label.assetUploadMode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assetUploadMode", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "ms-resource:loc.input.label.isDraft", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isDraft", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "ms-resource:loc.input.label.isPreRelease", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.isPreRelease" + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "ms-resource:loc.input.label.addChangeLog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.addChangeLog" + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogCompareToRelease", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToRelease", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "ms-resource:loc.input.label.changeLogCompareToReleaseTag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToReleaseTag" + }, + { + "name": "changeLogType", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogType", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogType", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "ms-resource:loc.input.label.changeLogLabels", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "ms-resource:loc.input.help.changeLogLabels" + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "main.js" + }, + "Node16": { + "target": "main.js", + "argumentFormat": "" + } + }, + "messages": { + "GithubApiFailError": "ms-resource:loc.messages.GithubApiFailError", + "GetTagsError": "ms-resource:loc.messages.GetTagsError", + "GetReleasesError": "ms-resource:loc.messages.GetReleasesError", + "CreateReleaseError": "ms-resource:loc.messages.CreateReleaseError", + "EditReleaseError": "ms-resource:loc.messages.EditReleaseError", + "DeleteReleaseError": "ms-resource:loc.messages.DeleteReleaseError", + "CreatingRelease": "ms-resource:loc.messages.CreatingRelease", + "CreateReleaseSuccess": "ms-resource:loc.messages.CreateReleaseSuccess", + "ReleaseAlreadyExists": "ms-resource:loc.messages.ReleaseAlreadyExists", + "EditingRelease": "ms-resource:loc.messages.EditingRelease", + "EditReleaseSuccess": "ms-resource:loc.messages.EditReleaseSuccess", + "NoReleaseFoundToEditCreateRelease": "ms-resource:loc.messages.NoReleaseFoundToEditCreateRelease", + "DeletingRelease": "ms-resource:loc.messages.DeletingRelease", + "DeleteReleaseSuccess": "ms-resource:loc.messages.DeleteReleaseSuccess", + "NoReleaseFoundToDelete": "ms-resource:loc.messages.NoReleaseFoundToDelete", + "FetchReleaseForTag": "ms-resource:loc.messages.FetchReleaseForTag", + "FetchReleaseForTagSuccess": "ms-resource:loc.messages.FetchReleaseForTagSuccess", + "FetchTagForTarget": "ms-resource:loc.messages.FetchTagForTarget", + "FetchTagForTargetSuccess": "ms-resource:loc.messages.FetchTagForTargetSuccess", + "MissingAssetError": "ms-resource:loc.messages.MissingAssetError", + "MultipleReleasesFoundError": "ms-resource:loc.messages.MultipleReleasesFoundError", + "MultipleTagFound": "ms-resource:loc.messages.MultipleTagFound", + "NoTagFound": "ms-resource:loc.messages.NoTagFound", + "DeleteAllExistingAssets": "ms-resource:loc.messages.DeleteAllExistingAssets", + "DuplicateAssetFound": "ms-resource:loc.messages.DuplicateAssetFound", + "AssetsDeletedSuccessfully": "ms-resource:loc.messages.AssetsDeletedSuccessfully", + "DeletingDuplicateAsset": "ms-resource:loc.messages.DeletingDuplicateAsset", + "SkipDuplicateAssetFound": "ms-resource:loc.messages.SkipDuplicateAssetFound", + "AssetDeletedSuccessfully": "ms-resource:loc.messages.AssetDeletedSuccessfully", + "AllAssetsUploadedSuccessfully": "ms-resource:loc.messages.AllAssetsUploadedSuccessfully", + "ErrorDeletingDuplicateAsset": "ms-resource:loc.messages.ErrorDeletingDuplicateAsset", + "ErrorDeletingAsset": "ms-resource:loc.messages.ErrorDeletingAsset", + "DeletingAsset": "ms-resource:loc.messages.DeletingAsset", + "NoAssetFoundToDelete": "ms-resource:loc.messages.NoAssetFoundToDelete", + "UploadingAssets": "ms-resource:loc.messages.UploadingAssets", + "UploadingAsset": "ms-resource:loc.messages.UploadingAsset", + "UploadAssetError": "ms-resource:loc.messages.UploadAssetError", + "UploadAssetSuccess": "ms-resource:loc.messages.UploadAssetSuccess", + "NoAssetFoundToUpload": "ms-resource:loc.messages.NoAssetFoundToUpload", + "ReleaseNotesFileIsDirectoryError": "ms-resource:loc.messages.ReleaseNotesFileIsDirectoryError", + "AssetIsDirectoryError": "ms-resource:loc.messages.AssetIsDirectoryError", + "ComputingChangeLog": "ms-resource:loc.messages.ComputingChangeLog", + "ComputingChangeLogSuccess": "ms-resource:loc.messages.ComputingChangeLogSuccess", + "CommitDiffBehind": "ms-resource:loc.messages.CommitDiffBehind", + "CommitDiffEqual": "ms-resource:loc.messages.CommitDiffEqual", + "FetchLatestPublishRelease": "ms-resource:loc.messages.FetchLatestPublishRelease", + "FetchLatestNonDraftRelease": "ms-resource:loc.messages.FetchLatestNonDraftRelease", + "FetchLastReleaseByTag": "ms-resource:loc.messages.FetchLastReleaseByTag", + "FetchLatestPublishReleaseSuccess": "ms-resource:loc.messages.FetchLatestPublishReleaseSuccess", + "FetchMatchingReleaseSuccess": "ms-resource:loc.messages.FetchMatchingReleaseSuccess", + "FetchTagMatchingReleaseSuccess": "ms-resource:loc.messages.FetchTagMatchingReleaseSuccess", + "GetLatestReleaseError": "ms-resource:loc.messages.GetLatestReleaseError", + "NoLatestPublishRelease": "ms-resource:loc.messages.NoLatestPublishRelease", + "NoMatchingReleases": "ms-resource:loc.messages.NoMatchingReleases", + "NoTagMatchingReleases": "ms-resource:loc.messages.NoTagMatchingReleases", + "FetchCommitDiff": "ms-resource:loc.messages.FetchCommitDiff", + "FetchCommitDiffSuccess": "ms-resource:loc.messages.FetchCommitDiffSuccess", + "FetchCommitDiffError": "ms-resource:loc.messages.FetchCommitDiffError", + "FetchInitialCommit": "ms-resource:loc.messages.FetchInitialCommit", + "FetchInitialCommitSuccess": "ms-resource:loc.messages.FetchInitialCommitSuccess", + "InvalidGitHubEndpoint": "ms-resource:loc.messages.InvalidGitHubEndpoint", + "InvalidEndpointAuthScheme": "ms-resource:loc.messages.InvalidEndpointAuthScheme", + "FetchInitialCommitError": "ms-resource:loc.messages.FetchInitialCommitError", + "InvalidActionSet": "ms-resource:loc.messages.InvalidActionSet", + "InvalidTagSource": "ms-resource:loc.messages.InvalidTagSource", + "InvalidReleaseNotesSource": "ms-resource:loc.messages.InvalidReleaseNotesSource", + "InvalidCompareWithAttribute": "ms-resource:loc.messages.InvalidCompareWithAttribute", + "InvalidAssetUploadMode": "ms-resource:loc.messages.InvalidAssetUploadMode", + "TagRequiredEditDeleteAction": "ms-resource:loc.messages.TagRequiredEditDeleteAction", + "TagRequiredCreateAction": "ms-resource:loc.messages.TagRequiredCreateAction", + "NoFileFoundMatchingPattern": "ms-resource:loc.messages.NoFileFoundMatchingPattern", + "PatternIsADirectory": "ms-resource:loc.messages.PatternIsADirectory", + "SearchingFileMatchingPattern": "ms-resource:loc.messages.SearchingFileMatchingPattern", + "IssuesFetchError": "ms-resource:loc.messages.IssuesFetchError", + "NoIssuesLinkedError": "ms-resource:loc.messages.NoIssuesLinkedError", + "LabelsSyntaxError": "ms-resource:loc.messages.LabelsSyntaxError", + "InvalidChangeLogTypeAttribute": "ms-resource:loc.messages.InvalidChangeLogTypeAttribute", + "ChangeLogTitle": "ms-resource:loc.messages.ChangeLogTitle", + "DefaultCategory": "ms-resource:loc.messages.DefaultCategory", + "SeeMoreText": "ms-resource:loc.messages.SeeMoreText" + }, + "_buildConfigMapping": { + "Default": "0.224.1", + "Node16-219": "0.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV0_Node16/tsconfig.json b/_generated/GitHubReleaseV0_Node16/tsconfig.json new file mode 100644 index 000000000000..875bb90cd697 --- /dev/null +++ b/_generated/GitHubReleaseV0_Node16/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} diff --git a/_generated/GitHubReleaseV1.versionmap.txt b/_generated/GitHubReleaseV1.versionmap.txt new file mode 100644 index 000000000000..c9b4c158bbd6 --- /dev/null +++ b/_generated/GitHubReleaseV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.224.1 +Node16-219|1.224.0 diff --git a/_generated/GitHubReleaseV1/README.md b/_generated/GitHubReleaseV1/README.md new file mode 100644 index 000000000000..05244f53a4fb --- /dev/null +++ b/_generated/GitHubReleaseV1/README.md @@ -0,0 +1,63 @@ +# GitHub Release + +## Overview + +The [GitHub Release task](https://aka.ms/AA3m1bq) can be used to create/edit/delete a GitHub release directly from your CI/CD pipeline. This task works on cross platform Azure Pipeline agents running Windows, Linux or Mac and uses GitHub APIs to manage GitHub releases. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task, like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites are required for the task to work properly: + +#### GitHub Service Connection + +In order to perform operations on the GitHub repository, the task needs a GitHub service connection with adequate permission. If it does not exist already, you can [create a GitHub service connection](https://aka.ms/AA3am5s) in your azure pipelines project. Once the service connection is created, all you need is the name of the service connection in this task. + +## Parameters of the task + +The GitHub Release task can run in 3 action types, viz. create, edit or delete. Based on the action chosen by the user certain parameters will be ignored. The following is the list of parameters required for this task. + +* **Service Connection:** This is the name of GitHub service connection which will be used to connect to target GitHub account. You can use an existing GitHub service connection or create a new one. Note that the service connection should use OAuth or PAT for authentication. + +* **GitHub Repository:** This is the name of the GitHub repository where GitHub releases will be managed. E.g. `microsoft/vscode`. + +* **Action:** Action is the type of release operation you want perform using this task. This task can perform 3 different actions - create, edit or delete. + + * Create: This action creates a GitHub release. Throws error if a published release already exists with the given tag. + + * Edit: This action modifies a existing GitHub release. Tag is used to identify the release to be edited. Throws error if more than 1 release(draft or published) is found with the given tag. + + * Delete: This action deletes a GitHub release. Tag is used to identify the release to be deleted. Throws error if more than 1 release(draft or published) is found with the given tag. + +* **Target:** This is the commit SHA for which the GitHub release will be created. By default, the value is $(Build.SourceVersion) which corresponds to the commit for which the build was run. If you specify a branch name here(E.g. *master* ), the latest commit from this branch will be used as target. This field is ignored when using edit and delete actions. + +* **Tag Source:** This parameter allows you to choose the source of tag to be used for a release action. This is available only for *create* action. It can be done in 2 ways: + + * Git tag: Choose this option if the tag to be used in release creation has been pushed to the repository. The release will be created using the git tag that is associated with this commit. If no tag is found for the given commit, the release will not be created. If multiple tags are found, the task will throw an error. + + * User specified tag: Choose this option if you want the task to create a new tag. The release will subsequently be created using the new tag provided in the 'tag' parameter. If the tag already exists in the repository, then the release will be created for the existing tag. + +* **Tag:** This is the tag to be used for the chosen release action. You can specify the tag directly or by using variables, Eg. v\$(MajorVersion).\$(MinorVersion).\$(PatchVersion). For *edit*, *delete* actions, the release having this tag will be acted upon. For *create* action, a new release will be created with this tag. Note that this is a mandatory field for *edit* and *delete* actions. + +* **Release Title:** This is the title that will be used for release creation. If left empty, the tag name will be used as the release title. + +* **Release Notes Source:** This field lets you specify the source for the description of your GitHub release. There are 2 ways for doing this: + * Release notes file: On selecting this, you will have to specify the path to the file. The contents of this file will be copied as release notes at the time of release creation. + * Inline release notes: On selecting this, you can manually type your release notes into a text area. The contents of this text area will be copied as release notes at the time of release creation. + +* **Assets** These are the files that will be uploaded as assets for the release. You can use wild card characters to specify a set of files. All the matching files shall be uploaded. You can also specify multiple patterns - one path per line. By default, it uploads the contents of $(Build.ArtifactStagingDirectory). If the specified folder is missing, it throws a warning. + +* **Asset Upload Mode** This option is used in case of editing a release. There are 2 ways in which assets can be uploaded. + + * Delete existing assets: When using this option, the task will first delete any existing assets in the release and upload all the assets once again. + + * Replace existing assets: When using this option, the task will replace any assets that have the same name* + +* **Draft Release** Check this option if the release has to be saved as a draft release. If kept unchecked, the created release will be published. This option is ignored in case of *delete* action. + +* **Pre Release** Check this option if the release has to be marked as a pre-release. This option is ignored in case of *delete* action. + +* **Add Changelog:** Using this option you can generate and append list of changes to release notes. The list of changes(commits and issues) between this and last published release will be generated and appended to release notes. Maximum number of changes shown is 250. diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..9adf446ec67d --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub-Release", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/AA3aeiw)", + "loc.description": "Hiermit wird ein GitHub-Release erstellt, bearbeitet oder gelöscht.", + "loc.instanceNameFormat": "GitHub-Release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Konfiguration des Änderungsprotokolls", + "loc.input.label.gitHubConnection": "GitHub-Verbindung (OAuth oder PAT)", + "loc.input.help.gitHubConnection": "Geben Sie den Namen der GitHub-Dienstverbindung an, die zum Herstellen einer Verbindung mit dem GitHub-Repository verwendet werden soll. Die Verbindung muss auf einem OAuth-Token eines GitHub-Benutzers oder einem persönlichen GitHub-Zugriffstoken basieren. Weitere Informationen zu Dienstverbindungen finden Sie [hier](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Geben Sie den Namen des GitHub-Repositorys an, in dem das GitHub-Release erstellt, bearbeitet oder gelöscht wird.", + "loc.input.label.action": "Aktion", + "loc.input.help.action": "Geben Sie den Typ des auszuführenden Releasevorgangs an. Mit dieser Aufgabe kann ein GitHub-Release erstellt, bearbeitet oder gelöscht werden.", + "loc.input.label.target": "Ziel", + "loc.input.help.target": "Geben Sie den Commit-SHA an, für den das GitHub-Release erstellt wird, z. B. \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Sie können hier auch eine Variable verwenden, beispielsweise \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Tagquelle", + "loc.input.help.tagSource": "Geben Sie das Tag an, das für die Releaseerstellung verwendet werden soll. Die Option \"Git-Tag\" verwendet automatisch das Tag, das dem Git-Commit zugeordnet ist. Verwenden Sie die Option \"Benutzerdefiniertes Tag\", um manuell ein Tag anzugeben.", + "loc.input.label.tagPattern": "Tagmuster", + "loc.input.help.tagPattern": "Geben Sie das Git-Tagmuster mithilfe eines regulären Ausdrucks (z. B. \"release-v1.*\") an. Ein GitHub-Release wird nur für Commits mit übereinstimmendem Git-Tag erstellt.", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Geben Sie das Tag an, für das ein Release erstellt, bearbeitet oder gelöscht werden soll. Sie können hier auch eine Variable verwenden, z. B. \"$(myTagName)\".", + "loc.input.label.title": "Releasetitel", + "loc.input.help.title": "Geben Sie den Titel für das GitHub-Release an. Wenn Sie keinen Titel angeben, wird das Tag als Releasetitel verwendet.", + "loc.input.label.releaseNotesSource": "Quelle für Versionshinweise", + "loc.input.help.releaseNotesSource": "Geben Sie die Beschreibung für das GitHub-Release an. Verwenden Sie die Option \"Datei mit Anmerkungen zu dieser Version\", um den Inhalt einer Datei als Versionshinweise zu verwenden. Verwenden Sie die Option \"Inline-Versionshinweise\", um Anmerkungen zu dieser Version manuell einzugeben.", + "loc.input.label.releaseNotesFilePath": "Dateipfad zu Versionsanmerkungen", + "loc.input.help.releaseNotesFilePath": "Wählen Sie die Datei aus, die die Versionshinweise enthält.", + "loc.input.label.releaseNotesInline": "Versionshinweise", + "loc.input.help.releaseNotesInline": "Geben Sie hier die Versionshinweise ein. Markdown wird unterstützt.", + "loc.input.label.assets": "Ressourcen", + "loc.input.help.assets": "Geben Sie die Dateien an, die als Ressourcen für das Release hochgeladen werden sollen. Sie können Platzhalterzeichen verwenden, um mehrere Dateien anzugeben. Beispielsweise können Sie für Buildpipelines \"$(Build.ArtifactStagingDirectory)/*.zip\" oder für Releasepipelines \"$(System.DefaultWorkingDirectory)/*.zip\" verwenden. Es ist auch möglich, mehrere Muster anzugeben – ein Muster pro Zeile. Standardmäßig werden alle Dateien im Verzeichnis \"$(Build.ArtifactStagingDirectory)\" hochgeladen. Weitere Informationen zur Liste der verfügbaren vordefinierten Variablen finden Sie unter [Buildvariablen](https://aka.ms/AA4449z) und [Releasevariablen](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Uploadmodus für Ressourcen", + "loc.input.help.assetUploadMode": "Verwenden Sie die Option \"Vorhandene Ressourcen löschen\", um zunächst alle vorhandenen Ressourcen im Release zu löschen und dann alle Ressourcen hochzuladen. Verwenden Sie die Option \"Vorhandene Ressourcen ersetzen\", um alle Ressourcen mit übereinstimmenden Namen zu ersetzen.", + "loc.input.label.isDraft": "Entwurfsrelease", + "loc.input.help.isDraft": "Geben Sie an, ob das Release als (nicht veröffentlichter) Entwurf gespeichert werden soll. Bei Festlegung auf FALSE wird das Release veröffentlicht.", + "loc.input.label.isPreRelease": "Vorabversion", + "loc.input.help.isPreRelease": "Geben Sie an, ob das Release als Vorabversion gekennzeichnet werden soll.", + "loc.input.label.addChangeLog": "Änderungsprotokoll hinzufügen", + "loc.input.help.addChangeLog": "Bei Festlegung auf TRUE wird eine Liste der Änderungen (Commits und Issues) zwischen dieser und dem zuletzt veröffentlichten Release generiert und an die Versionshinweise angefügt.", + "loc.input.label.changeLogCompareToRelease": "Vergleichen mit", + "loc.input.help.changeLogCompareToRelease": "Geben Sie an, mit welchem Release der Vergleich erfolgen soll, um das Änderungsprotokoll zu generieren: \nLetztes vollständiges Release: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen, das nicht als Vorabversion gekennzeichnet ist.\nLetztes Nicht-Entwurfsrelease: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen.\nLetztes Nicht-Entwurfsrelease nach Tag: Bei dieser Option wird das aktuelle Release mit dem letzten Nicht-Entwurfsrelease verglichen, das mit dem angegebenen Tag übereinstimmt. Sie können anstelle eines Tags auch einen regulären Ausdruck angeben.", + "loc.input.label.changeLogCompareToReleaseTag": "Releasetag", + "loc.input.help.changeLogCompareToReleaseTag": "Geben Sie den regulären Ausdruck für das Releasetag an. Das Release, das mit diesem Tag übereinstimmt, wird als Basis für die Berechnung des Änderungsprotokolls verwendet.", + "loc.input.label.changeLogType": "Typ des Änderungsprotokolls", + "loc.input.help.changeLogType": "Das Änderungsprotokoll kann auf Commits oder Issues basieren. Ein auf Commits basierendes Änderungsprotokoll listet alle in einem Release enthaltenen Commits auf, während in einem auf Issues basierenden Änderungsprotokoll alle Issues/Pull Requests im Release aufgelistet werden.", + "loc.input.label.changeLogLabels": "Kategorien", + "loc.input.help.changeLogLabels": "Hiermit können Sie Änderungen anhand der Bezeichnung kategorisieren, die dem Issue/Pull Request zugeordnet ist. Für eine Bezeichnung können Sie den Anzeigenamen für die Kategorie und den Status des Issues angeben. Beispiel: \"\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Wenn eine Änderung mehrere Bezeichnungen aufweist, hat die erste angegebene Bezeichnung Vorrang. Lassen Sie dieses Feld leer, um eine flache Liste mit Issues/Pull Requests anzuzeigen.", + "loc.messages.GithubApiFailError": "Ein unerwarteter Fehler ist aufgetreten.", + "loc.messages.GetTagsError": "Unerwarteter Fehler beim Abrufen von Tags.", + "loc.messages.GetReleasesError": "Unerwarteter Fehler beim Abrufen von Releases.", + "loc.messages.CreateReleaseError": "Unerwarteter Fehler beim Erstellen der Release.", + "loc.messages.EditReleaseError": "Unerwarteter Fehler beim Bearbeiten des Release.", + "loc.messages.DeleteReleaseError": "Unerwarteter Fehler beim Löschen des Release.", + "loc.messages.CreatingRelease": "Release für Tag wird erstellt: %s", + "loc.messages.CreateReleaseSuccess": "Das Release wurde erfolgreich in \"%s\" erstellt.", + "loc.messages.ReleaseAlreadyExists": "Fehler beim Erstellen des Release. Für das folgende Tag ist bereits ein Release vorhanden: %s", + "loc.messages.EditingRelease": "Das Release mit folgendem Tag wird bearbeitet: %s", + "loc.messages.EditReleaseSuccess": "Release erfolgreich bearbeitet", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Es wurde kein vorhandenes Release zum Bearbeiten gefunden. Es wird ein Release mit dem folgenden Tag erstellt: %s", + "loc.messages.DeletingRelease": "Das Release für folgendes Tag wird gelöscht: %s", + "loc.messages.DeleteReleaseSuccess": "Die Release wurde erfolgreich gelöscht.", + "loc.messages.NoReleaseFoundToDelete": "Für das Tag \"%s\" wurde kein Release gefunden. Fehler beim Löschen des Release.", + "loc.messages.FetchReleaseForTag": "Das Release für das folgende Tag wird abgerufen: %s", + "loc.messages.FetchReleaseForTagSuccess": "Für folgendes Tag wurde ein Release gefunden: %s", + "loc.messages.FetchTagForTarget": "Es wird nach Tags gesucht, die dem Zielcommit zugeordnet sind: %s", + "loc.messages.FetchTagForTargetSuccess": "Für folgenden Zielcommit wurde ein Tag gefunden: %s", + "loc.messages.MissingAssetError": "Datei nicht gefunden: %s", + "loc.messages.MultipleReleasesFoundError": "Es wurde nur 1 Release erwartet, aber für das Tag \"%s\" wurde mehr als 1 Release gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.MultipleTagFound": "Es wurde nur 1 Tag erwartet, aber für den angegebenen Commit \"%s\" wurde mehr als 1 Tag gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.NoTagFound": "Das Release wird nicht erstellt, weil die Tags für den Zielcommit nicht mit dem angegebenen Tagmuster übereinstimmen.", + "loc.messages.DeleteAllExistingAssets": "Alle vorhandenen Ressourcen werden gelöscht...", + "loc.messages.DuplicateAssetFound": "Doppelte Ressource gefunden: %s", + "loc.messages.AssetsDeletedSuccessfully": "Die Ressourcen wurden erfolgreich gelöscht.", + "loc.messages.DeletingDuplicateAsset": "Doppelte Ressource wird gelöscht: %s", + "loc.messages.SkipDuplicateAssetFound": "Doppelte Ressource gefunden: %s. Wird übersprungen...", + "loc.messages.AssetDeletedSuccessfully": "Die Ressource \"%s\" wurde erfolgreich gelöscht.", + "loc.messages.AllAssetsUploadedSuccessfully": "Alle Ressourcen wurden erfolgreich hochgeladen.", + "loc.messages.ErrorDeletingDuplicateAsset": "Unerwarteter Fehler beim Löschen der doppelten Ressource: %s", + "loc.messages.ErrorDeletingAsset": "Unerwarteter Fehler beim Löschen der Ressource: %s", + "loc.messages.DeletingAsset": "Ressource wird gelöscht: %s", + "loc.messages.NoAssetFoundToDelete": "Es wurden keine Ressourcen zum Löschen gefunden.", + "loc.messages.UploadingAssets": "Ressourcen werden hochgeladen...", + "loc.messages.UploadingAsset": "Datei wird hochgeladen: \"%s\"", + "loc.messages.UploadAssetError": "Unerwarteter Fehler beim Hochladen der Datei: %s", + "loc.messages.UploadAssetSuccess": "Datei erfolgreich hochgeladen: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Es wurden keine Ressourcen zum Hochladen gefunden.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Die Datei mit Versionshinweisen \"%s\" ist ein Verzeichnis und keine Datei.", + "loc.messages.AssetIsDirectoryError": "Die Ressource ist ein Verzeichnis und keine Datei. Der Upload des Verzeichnisses wird übersprungen: %s", + "loc.messages.ComputingChangeLog": "In diesem Release vorgenommene Änderungen werden berechnet...", + "loc.messages.ComputingChangeLogSuccess": "Die Änderungen wurden erfolgreich berechnet.", + "loc.messages.CommitDiffBehind": "Die Änderungen können nicht berechnet werden, weil der angegebene Zielcommit älter ist als der Commit für das neueste veröffentlichte Release.", + "loc.messages.CommitDiffEqual": "Es wurden keine Änderungen gefunden. Der angegebene Zielcommit ist mit dem Commit für das neueste veröffentlichte Release identisch.", + "loc.messages.FetchLatestPublishRelease": "Das neueste veröffentlichte Release wird abgerufen...", + "loc.messages.FetchLatestNonDraftRelease": "Das neueste Nicht-Entwurfsrelease wird abgerufen...", + "loc.messages.FetchLastReleaseByTag": "Das neueste Release mit übereinstimmendem Tagmuster wird abgerufen: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Das neueste veröffentlichte Release wurde gefunden: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Das neueste Nicht-Entwurfsrelease wurde gefunden.", + "loc.messages.FetchTagMatchingReleaseSuccess": "Das neueste Release mit übereinstimmendem Tagmuster wurde gefunden: %s", + "loc.messages.GetLatestReleaseError": "Unerwarteter Fehler beim Abrufen des neuesten veröffentlichten Release.", + "loc.messages.NoLatestPublishRelease": "Im Repository wurden noch keine Releases veröffentlicht.", + "loc.messages.NoMatchingReleases": "Keine Nicht-Entwurfsreleases gefunden.", + "loc.messages.NoTagMatchingReleases": "Es wurden keine Releases gefunden, die mit dem Tagmuster übereinstimmen: %s.", + "loc.messages.FetchCommitDiff": "Die Liste der Commits seit dem zuletzt veröffentlichten Release wird abgerufen...", + "loc.messages.FetchCommitDiffSuccess": "Die Liste der Änderungen wurde gefunden.", + "loc.messages.FetchCommitDiffError": "Unerwarteter Fehler beim Abrufen der Liste mit Änderungen.", + "loc.messages.FetchInitialCommit": "Der erste Commit wird abgerufen...", + "loc.messages.FetchInitialCommitSuccess": "Der erste Commit wurde gefunden: %s", + "loc.messages.InvalidGitHubEndpoint": "Ungültiger GitHub-Dienstendpunkt: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Ungültiges GitHub-Dienstverbindungsschema: %s. Es sind nur GitHub-Verbindungen zulässig, die auf einem OAuth-Token oder einem persönlichen Zugriffstoken basieren.", + "loc.messages.FetchInitialCommitError": "Unerwarteter Fehler beim Abrufen des ersten Commits.", + "loc.messages.InvalidActionSet": "Ungültige Aktion: %s. Es sind nur die Aktionen \"create\", \"edit\" oder \"delete\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Ungültige Tagquelle: %s. Es sind nur die Optionen \"gitTag\" oder \"userSpecifiedTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Ungültige Quelle für Versionshinweise: %s. Es sind nur die Optionen \"filePath\" oder \"inline\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Ungültiges compareWith-Attribut: %s. Es sind nur die Optionen \"lastFullRelease\", \"lastNonDraftRelease\" oder \"lastNonDraftReleaseByTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Ungültiger Modus für Ressourcenupload: %s. Es sind nur die Aktionen \"delete\" oder \"replace\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Für die Aktion \"%s\" ist ein Tag erforderlich. Geben Sie im Schritt ein Tag an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Die Tagquelle ist auf \"userSpecifiedTag\" festgelegt. Geben Sie ein Tag für die Aktion zum Erstellen an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Es wurden keine Dateien gefunden, die mit \"%s\" übereinstimmen. Keine Elemente zum Upload vorhanden.", + "loc.messages.PatternIsADirectory": "\"%s\" kann nicht hochgeladen werden, weil es sich um ein Verzeichnis handelt. Geben Sie eine Datei an.", + "loc.messages.SearchingFileMatchingPattern": "Es wird nach Dateien gesucht, die mit \"%s\" übereinstimmen.", + "loc.messages.IssuesFetchError": "Fehler beim Abrufen von Issues. Das Änderungsprotokoll kann nicht generiert werden.", + "loc.messages.NoIssuesLinkedError": "Im angegebenen Commitvergleich sind keine Issues mit Commits verknüpft.", + "loc.messages.LabelsSyntaxError": "Fehler beim Analysieren der Bezeichnungen. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Ungültiges ChangeLogType-Attribut: %s. Es sind nur die Optionen \"commitBased\" oder \"issueBased\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Änderungen", + "loc.messages.DefaultCategory": "Andere", + "loc.messages.SeeMoreText": "Mehr anzeigen" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..dc4a14bce873 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub Release", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "loc.description": "Create, edit, or delete a GitHub release", + "loc.instanceNameFormat": "GitHub release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog configuration", + "loc.input.label.gitHubConnection": "GitHub connection (OAuth or PAT)", + "loc.input.help.gitHubConnection": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "loc.input.label.target": "Target", + "loc.input.help.target": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Tag source", + "loc.input.help.tagSource": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "loc.input.label.tagPattern": "Tag Pattern", + "loc.input.help.tagPattern": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`.", + "loc.input.label.title": "Release title", + "loc.input.help.title": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title.", + "loc.input.label.releaseNotesSource": "Release notes source", + "loc.input.help.releaseNotesSource": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "loc.input.label.releaseNotesFilePath": "Release notes file path", + "loc.input.help.releaseNotesFilePath": "Select the file which contains the release notes.", + "loc.input.label.releaseNotesInline": "Release notes", + "loc.input.help.releaseNotesInline": "Enter the release notes here. Markdown is supported.", + "loc.input.label.assets": "Assets", + "loc.input.help.assets": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Asset upload mode", + "loc.input.help.assetUploadMode": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "loc.input.label.isDraft": "Draft release", + "loc.input.help.isDraft": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "loc.input.label.isPreRelease": "Pre-release", + "loc.input.help.isPreRelease": "Indicate whether the release should be marked as a pre-release.", + "loc.input.label.addChangeLog": "Add changelog", + "loc.input.help.addChangeLog": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes.", + "loc.input.label.changeLogCompareToRelease": "Compare to", + "loc.input.help.changeLogCompareToRelease": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "loc.input.label.changeLogCompareToReleaseTag": "Release Tag", + "loc.input.help.changeLogCompareToReleaseTag": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation.", + "loc.input.label.changeLogType": "Changelog type", + "loc.input.help.changeLogType": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "loc.input.label.changeLogLabels": "Categories", + "loc.input.help.changeLogLabels": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr.", + "loc.messages.GithubApiFailError": "An unexpected error occurred.", + "loc.messages.GetTagsError": "An unexpected error occurred while fetching tags.", + "loc.messages.GetReleasesError": "An unexpected error occurred while fetching releases.", + "loc.messages.CreateReleaseError": "An unexpected error occurred while creating the release.", + "loc.messages.EditReleaseError": "An unexpected error occurred while editing the release.", + "loc.messages.DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "loc.messages.CreatingRelease": "Creating a release for tag: %s", + "loc.messages.CreateReleaseSuccess": "Release created successfully at %s", + "loc.messages.ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "loc.messages.EditingRelease": "Editing the release with tag: %s", + "loc.messages.EditReleaseSuccess": "Release edited successfully", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "loc.messages.DeletingRelease": "Deleting the release for tag: %s", + "loc.messages.DeleteReleaseSuccess": "Release deleted successfully.", + "loc.messages.NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "loc.messages.FetchReleaseForTag": "Fetching the release for tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "Found a release for tag: %s", + "loc.messages.FetchTagForTarget": "Searching for tags associated with target commit: %s", + "loc.messages.FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "loc.messages.MissingAssetError": "File not found: %s", + "loc.messages.MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "loc.messages.MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "loc.messages.NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", + "loc.messages.DeleteAllExistingAssets": "Deleting all existing assets...", + "loc.messages.DuplicateAssetFound": "Duplicate asset found: %s", + "loc.messages.AssetsDeletedSuccessfully": "Assets deleted successfully.", + "loc.messages.DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "loc.messages.SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "loc.messages.AssetDeletedSuccessfully": "Asset %s deleted successfully", + "loc.messages.AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "loc.messages.ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "loc.messages.ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "loc.messages.DeletingAsset": "Deleting asset: %s", + "loc.messages.NoAssetFoundToDelete": "No assets were found to delete.", + "loc.messages.UploadingAssets": "Uploading assets...", + "loc.messages.UploadingAsset": "Uploading file: '%s'.", + "loc.messages.UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "loc.messages.UploadAssetSuccess": "Uploaded file successfully: '%s'", + "loc.messages.NoAssetFoundToUpload": "No assets were found to upload.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "loc.messages.AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "loc.messages.ComputingChangeLog": "Computing changes made in this release...", + "loc.messages.ComputingChangeLogSuccess": "Changes computed successfully.", + "loc.messages.CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "loc.messages.CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "loc.messages.FetchLatestPublishRelease": "Fetching the latest published release...", + "loc.messages.FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "loc.messages.FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "loc.messages.FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "loc.messages.GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "loc.messages.NoLatestPublishRelease": "No releases are published yet in the repository.", + "loc.messages.NoMatchingReleases": "No non-draft releases found.", + "loc.messages.NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "loc.messages.FetchCommitDiff": "Fetching the list of commits since the last published release...", + "loc.messages.FetchCommitDiffSuccess": "Found the list of changes.", + "loc.messages.FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "loc.messages.FetchInitialCommit": "Fetching the initial commit...", + "loc.messages.FetchInitialCommitSuccess": "Found the initial commit: %s", + "loc.messages.InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "loc.messages.FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "loc.messages.InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "loc.messages.PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "loc.messages.SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "loc.messages.IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "loc.messages.NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "loc.messages.LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changes", + "loc.messages.DefaultCategory": "Others", + "loc.messages.SeeMoreText": "See More" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..4391ba157eb3 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versión de GitHub", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/AA3aeiw)", + "loc.description": "Crea, edita o elimina una versión de GitHub.", + "loc.instanceNameFormat": "Versión de GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuración del registro de cambios", + "loc.input.label.gitHubConnection": "Conexión de GitHub (OAuth o PAT)", + "loc.input.help.gitHubConnection": "Especifique el nombre de la conexión de servicio de GitHub que se va a usar para conectarse al repositorio de GitHub. La conexión se debe basar en el valor OAuth del usuario de GitHub o en un token de acceso personal de GitHub. Obtenga más información sobre las conexiones de servicio [aquí](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repositorio", + "loc.input.help.repositoryName": "Especifique el nombre del repositorio de GitHub en el que se creará, editará o eliminará la versión de GitHub.", + "loc.input.label.action": "Acción", + "loc.input.help.action": "Especifique el tipo de operación de versión que se va a realizar. Esta tarea permite crear, editar o eliminar una versión de GitHub.", + "loc.input.label.target": "Destino", + "loc.input.help.target": "Especifique el SHA de \"commit\" para el que se creará la versión de GitHub. Por ejemplo, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". También puede usar una variable aquí; por ejemplo, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Origen de etiqueta", + "loc.input.help.tagSource": "Especifique la etiqueta que se va a usar para la creación de la versión. La opción \"Git tag\" obtiene automáticamente la etiqueta asociada al \"commit\" de GIT. Utilice la opción \"User specified tag\" para proporcionar una etiqueta de forma manual.", + "loc.input.label.tagPattern": "Patrón de etiqueta", + "loc.input.help.tagPattern": "Especifique el patrón de etiqueta GIT mediante una notación regex (por ejemplo, \"release-v1.*\"). La versión de GitHub solo se creará para los \"commits\" que tengan una etiqueta GIT coincidente. ", + "loc.input.label.tag": "Etiqueta", + "loc.input.help.tag": "Especifique la etiqueta para la que se va a crear, editar o eliminar una versión. También puede usar una variable aquí. Por ejemplo, \"$(myTagName)\".", + "loc.input.label.title": "Título de la versión", + "loc.input.help.title": "Especifique el título de la versión de GitHub. Si se deja en blanco, se usará la etiqueta como título de la versión.", + "loc.input.label.releaseNotesSource": "Origen de las notas de la versión", + "loc.input.help.releaseNotesSource": "Especifique la descripción de la versión de GitHub. Use la opción \"Archivo de notas de la versión\" para utilizar el contenido de un archivo como notas de la versión. Use la opción \"Inline release notes\" para escribir las notas de la versión de forma manual.", + "loc.input.label.releaseNotesFilePath": "Ruta de acceso al archivo de notas de la versión", + "loc.input.help.releaseNotesFilePath": "Seleccione el archivo que contiene las notas de la versión.", + "loc.input.label.releaseNotesInline": "Notas de la versión", + "loc.input.help.releaseNotesInline": "Especifique aquí las notas de la versión. Se admite Markdown.", + "loc.input.label.assets": "Recursos", + "loc.input.help.assets": "Especifique los archivos que se van a cargar como recursos de la versión. Puede usar caracteres comodín para especificar varios archivos. Por ejemplo, \"$(Build.ArtifactStagingDirectory)/*.zip\" para las canalizaciones de compilación o \"`$(System.DefaultWorkingDirectory)/*.zip\" en el caso de las canalizaciones de versión. También puede especificar varios patrones, uno por cada línea. De forma predeterminada, se cargarán todos los archivos del directorio $(Build.ArtifactStagingDirectory). Para obtener más información sobre la lista de variables predefinidas disponibles, consulte las [variables de compilación](https://aka.ms/AA4449z) y las [variables de versión] (https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modo de carga de recursos", + "loc.input.help.assetUploadMode": "Use la opción \"Delete existing assets\" para eliminar primero los recursos existentes en la versión y, después, cargar todos los recursos. Use la opción \"Replace existing assets\" para reemplazar los recursos que tengan el mismo nombre.", + "loc.input.label.isDraft": "Versión de borrador", + "loc.input.help.isDraft": "Indique si la versión debe guardarse como borrador (sin publicar). Si el valor es \"false\", la versión se publicará.", + "loc.input.label.isPreRelease": "Versión preliminar", + "loc.input.help.isPreRelease": "Indique si la versión se debe marcar como versión preliminar.", + "loc.input.label.addChangeLog": "Agregar registro de cambios", + "loc.input.help.addChangeLog": "Si se establece en \"true\", se generará una lista de los cambios (\"commits\" e \"issues\") entre esta y la última versión publicada y se anexará a las notas de la versión.", + "loc.input.label.changeLogCompareToRelease": "Comparar con", + "loc.input.help.changeLogCompareToRelease": "Indique la versión con la que debemos comparar para generar el registro de cambios: \nÚltima versión completa: compara la versión actual con la versión más reciente que no sea de borrador y que no esté marcada como versión preliminar.\nÚltima versión de no borrador: compara la versión actual con la versión más reciente que no sea de borrador.\nÚltima versión de no borrador por etiqueta: compara la versión actual con la última versión que no sea de borrador y que coincida con la etiqueta especificada. También puede especificar una notación regex en lugar de una etiqueta exacta.", + "loc.input.label.changeLogCompareToReleaseTag": "Etiqueta de versión", + "loc.input.help.changeLogCompareToReleaseTag": "Especifique la notación regex para la etiqueta de versión. La versión que coincida con esta etiqueta se usará como base para el cálculo del registro de cambios.", + "loc.input.label.changeLogType": "Tipo de registro de cambios", + "loc.input.help.changeLogType": "El registro de cambios puede basarse en \"commits\" o en incidencias. Un registro de cambios basado en \"commits\" enumera todos los \"commits\" incluidos en una versión, mientras que un registro de cambios basado en incidencias enumera todas las incidencias o solicitudes de incorporación de cambios que se incluyen en la versión. ", + "loc.input.label.changeLogLabels": "Categorías", + "loc.input.help.changeLogLabels": "Si usa esta opción, puede clasificar los cambios en función de la etiqueta asociada a la incidencia o a la solicitud de incorporación de cambios. Para una etiqueta, puede mencionar el nombre para mostrar de la categoría y el estado de la incidencia. Por ejemplo, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Si un cambio tiene varias etiquetas, la primera etiqueta que se especifique tiene prioridad. Deje este campo en blanco para ver una lista plana de las incidencias o solicitudes de incorporación de cambios.", + "loc.messages.GithubApiFailError": "Error inesperado.", + "loc.messages.GetTagsError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las etiquetas.", + "loc.messages.GetReleasesError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las versiones.", + "loc.messages.CreateReleaseError": "Error inesperado al crear la versión.", + "loc.messages.EditReleaseError": "Error inesperado al editar la versión.", + "loc.messages.DeleteReleaseError": "Error inesperado al eliminar la versión.", + "loc.messages.CreatingRelease": "Creando una versión para la etiqueta: %s", + "loc.messages.CreateReleaseSuccess": "La versión se ha creado correctamente en %s", + "loc.messages.ReleaseAlreadyExists": "No se pudo crear la versión. Ya existe una versión para la etiqueta: %s", + "loc.messages.EditingRelease": "Editando la versión con la etiqueta %s", + "loc.messages.EditReleaseSuccess": "La versión se ha editado correctamente.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No se ha encontrado ninguna versión existente para editar. Se va a crear una con la etiqueta %s", + "loc.messages.DeletingRelease": "Eliminando la versión de la etiqueta: %s", + "loc.messages.DeleteReleaseSuccess": "La versión se eliminó correctamente.", + "loc.messages.NoReleaseFoundToDelete": "No se encontró ninguna versión para la etiqueta %s. Error al eliminar la versión.", + "loc.messages.FetchReleaseForTag": "Usando \"fetch\" para recuperar cambios de la versión de la etiqueta: %s", + "loc.messages.FetchReleaseForTagSuccess": "Se ha encontrado una versión para la etiqueta: %s", + "loc.messages.FetchTagForTarget": "Buscando etiquetas asociadas al \"commit\" de destino: %s", + "loc.messages.FetchTagForTargetSuccess": "Se ha encontrado una etiqueta para el \"commit\" de destino: %s", + "loc.messages.MissingAssetError": "No se encuentra el archivo: %s", + "loc.messages.MultipleReleasesFoundError": "Se esperaba solo una versión, pero se ha encontrado más de una para la etiqueta: %s. No se puede realizar la acción.", + "loc.messages.MultipleTagFound": "Se esperaba solo una etiqueta, pero se ha encontrado más de una para el \"commit\" dado: %s. No se puede realizar la acción.", + "loc.messages.NoTagFound": "No se creará la versión porque las etiquetas del \"commit\" de destino no coinciden con el patrón de etiqueta dado.", + "loc.messages.DeleteAllExistingAssets": "Eliminando todos los recursos existentes...", + "loc.messages.DuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s", + "loc.messages.AssetsDeletedSuccessfully": "Los recursos se han eliminado correctamente.", + "loc.messages.DeletingDuplicateAsset": "Eliminando el recurso duplicado: %s", + "loc.messages.SkipDuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s. Omitiendo...", + "loc.messages.AssetDeletedSuccessfully": "El recurso %s se ha eliminado correctamente.", + "loc.messages.AllAssetsUploadedSuccessfully": "Todos los recursos se han cargado correctamente.", + "loc.messages.ErrorDeletingDuplicateAsset": "Error inesperado al eliminar el recurso duplicado: %s", + "loc.messages.ErrorDeletingAsset": "Error inesperado al eliminar el recurso: %s", + "loc.messages.DeletingAsset": "Eliminando el recurso: %s", + "loc.messages.NoAssetFoundToDelete": "No se han encontrado recursos para eliminar.", + "loc.messages.UploadingAssets": "Cargando los recursos...", + "loc.messages.UploadingAsset": "Cargando el archivo: \"%s\".", + "loc.messages.UploadAssetError": "Error inesperado al cargar el archivo: %s", + "loc.messages.UploadAssetSuccess": "El archivo se cargó correctamente: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "No se han encontrado recursos para cargar.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "El archivo de notas de la versión %s es un directorio y no un archivo.", + "loc.messages.AssetIsDirectoryError": "El recurso es un directorio y no un archivo. Omitiendo la carga del directorio: %s", + "loc.messages.ComputingChangeLog": "Calculando los cambios realizados en esta versión...", + "loc.messages.ComputingChangeLogSuccess": "Los cambios se han calculado correctamente.", + "loc.messages.CommitDiffBehind": "No se pueden calcular los cambios porque el \"commit\" de destino proporcionado es anterior al de la última versión publicada.", + "loc.messages.CommitDiffEqual": "No se han encontrado cambios. El \"commit\" de destino proporcionado es el mismo que el de la última versión publicada.", + "loc.messages.FetchLatestPublishRelease": "Usando \"fetch\" para recuperar cambios de la última versión publicada...", + "loc.messages.FetchLatestNonDraftRelease": "Capturando la última versión que no sea de borrador...", + "loc.messages.FetchLastReleaseByTag": "Captura de la última versión que coincida con el patrón de etiqueta: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Se ha encontrado la última versión publicada: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Se ha encontrado la última versión que no es un borrador", + "loc.messages.FetchTagMatchingReleaseSuccess": "Se ha encontrado la última versión que coincide con el patrón de etiqueta: %s", + "loc.messages.GetLatestReleaseError": "Error inesperado al aplicar \"fetch\" para recuperar cambios de la última versión publicada.", + "loc.messages.NoLatestPublishRelease": "No hay ninguna versión publicada aún en el repositorio.", + "loc.messages.NoMatchingReleases": "No se encontró ninguna versión que no sea de borrador.", + "loc.messages.NoTagMatchingReleases": "No se encontraron versiones que coincidan con el patrón de etiqueta: %s ", + "loc.messages.FetchCommitDiff": "Usando \"fetch\" para recuperar cambios de la lista de elementos \"commit\" desde la última versión publicada...", + "loc.messages.FetchCommitDiffSuccess": "Se ha encontrado la lista de cambios.", + "loc.messages.FetchCommitDiffError": "Error inesperado al aplicar \"fetch\" a la lista de cambios.", + "loc.messages.FetchInitialCommit": "Usando \"fetch\" para recuperar cambios del \"commit\" inicial...", + "loc.messages.FetchInitialCommitSuccess": "Se ha encontrado el \"commit\" inicial: %s", + "loc.messages.InvalidGitHubEndpoint": "Punto de conexión de servicio de GitHub no válido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Esquema de conexión del servicio de GitHub no válido: %s. Solo se permiten conexiones de token de acceso personal de GitHub y OAuth.", + "loc.messages.FetchInitialCommitError": "Error inesperado al aplicar \"fetch\" para la recuperación de cambios del \"commit\" inicial.", + "loc.messages.InvalidActionSet": "Acción no válida: %s. Solo se permiten las acciones \"create\", \"edit\" o \"delete\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origen de etiqueta no válido: %s. Solo se permiten las opciones \"gitTag\" o \"userSpecifiedTag\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origen de notas de la versión no válido: %s. Solo se permiten las opciones \"filePath\" o \"inline\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Atributo compareWith no válido: %s. Solo se permiten las opciones \"lastFullRelease\", \"lastNonDraftRelease\" o \"lastNonDraftReleaseByTag\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modo de carga de recursos no válido: %s. Solo se permiten las opciones \"delete\" o \"replace\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Se requiere una etiqueta para la acción \"%s\". Especifique una etiqueta en el paso. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "El origen de la etiqueta está establecido en userSpecifiedTag; especifique una etiqueta para la acción create. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No se ha encontrado ningún archivo que coincida con \"%s\". No hay nada que cargar.", + "loc.messages.PatternIsADirectory": "No se puede cargar \"%s\" porque es un directorio. Especifique un archivo.", + "loc.messages.SearchingFileMatchingPattern": "Buscando archivos que coincidan con \"%s\".", + "loc.messages.IssuesFetchError": "Error al capturar las incidencias. No se puede generar el registro de cambios.", + "loc.messages.NoIssuesLinkedError": "No hay ninguna incidencia vinculada a los \"commits\" en la diferencia de \"commits\" especificada.", + "loc.messages.LabelsSyntaxError": "Error al analizar las etiquetas. Para ver la sintaxis YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Atributo ChangeLogType no válido: %s. Solo se permiten las opciones \"commitBased\" o \"issueBased\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Cambios", + "loc.messages.DefaultCategory": "Otra", + "loc.messages.SeeMoreText": "Ver más" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..a1ef1dfe2a82 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Mise en production GitHub", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/AA3aeiw)", + "loc.description": "Créer, modifier ou supprimer une mise en production GitHub", + "loc.instanceNameFormat": "Mise en production GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuration du journal des modifications", + "loc.input.label.gitHubConnection": "Connexion GitHub (OAuth ou PAT)", + "loc.input.help.gitHubConnection": "Spécifiez le nom de la connexion de service GitHub à utiliser pour la connexion au dépôt GitHub. La connexion doit être basée sur le jeton OAuth d'un utilisateur GitHub ou un jeton d'accès personnel GitHub. En savoir plus sur les connexions de service [ici](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Dépôt", + "loc.input.help.repositoryName": "Spécifiez le nom du dépôt GitHub dans lequel la mise en production GitHub est créée, modifiée ou supprimée.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Spécifiez le type d'opération de mise en production à effectuer. Cette tâche permet de créer, modifier ou supprimer une mise en production GitHub.", + "loc.input.label.target": "Cible", + "loc.input.help.target": "Spécifiez le SHA de validation pour lequel la mise en production GitHub doit être créée. Exemple : '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. Vous pouvez également utiliser une variable ici. Exemple : '$(myCommitSHA)'.", + "loc.input.label.tagSource": "Source de l'étiquette", + "loc.input.help.tagSource": "Spécifiez l'étiquette à utiliser pour la création de la mise en production. L'option Étiquette Git accepte automatiquement l'étiquette associée à la validation Git. Utilisez l'option Étiquette spécifiée par l'utilisateur pour fournir une étiquette manuellement.", + "loc.input.label.tagPattern": "Modèle d'étiquette", + "loc.input.help.tagPattern": "Spécifiez le modèle d'étiquette git à l'aide d'une notation regex (par exemple 'release-v1.*'). La mise en production GitHub est créée uniquement pour les commits qui ont une étiquette git correspondante. ", + "loc.input.label.tag": "Étiquette", + "loc.input.help.tag": "Spécifiez l'étiquette pour laquelle vous souhaitez créer, modifier ou supprimer une mise en production. Vous pouvez également utiliser une variable ici. Exemple : '$(myTagName)'.", + "loc.input.label.title": "Titre de la mise en production", + "loc.input.help.title": "Spécifiez le titre de la mise en production GitHub. Si rien n'est indiqué, l'étiquette est utilisée en tant que titre de la mise en production.", + "loc.input.label.releaseNotesSource": "Source des notes de publication", + "loc.input.help.releaseNotesSource": "Spécifiez la description de la mise en production GitHub. Utilisez l'option Fichier de notes de publication pour utiliser le contenu d'un fichier en tant que notes de publication. Utilisez l'option Notes de publication inline pour entrer manuellement les notes de publication.", + "loc.input.label.releaseNotesFilePath": "Chemin du fichier de notes de publication", + "loc.input.help.releaseNotesFilePath": "Sélectionnez le fichier qui contient les notes de publication.", + "loc.input.label.releaseNotesInline": "Notes de publication", + "loc.input.help.releaseNotesInline": "Entrez les notes de publication ici. Markdown est pris en charge.", + "loc.input.label.assets": "Ressources", + "loc.input.help.assets": "Spécifiez les fichiers à charger en tant que composants de la mise en production. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers. Exemple : '$(Build.ArtifactStagingDirectory)/*.zip' pour les pipelines de build ou '$(System.DefaultWorkingDirectory)/*.zip' pour les pipelines de mise en production. Vous pouvez également spécifier plusieurs modèles (un par ligne). Par défaut, tous les fichiers du répertoire $(Build.ArtifactStagingDirectory) sont chargés. Pour en savoir plus sur la liste des variables prédéfinies disponibles, consultez les informations relatives aux [variables de build](https://aka.ms/AA4449z) et aux [variables de mise en production](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Mode de chargement des composants", + "loc.input.help.assetUploadMode": "Utilisez l'option Supprimer les composants existants pour supprimer d'abord tous les composants existants de la mise en production avant de charger tous les composants. Utilisez l'option Remplacer les composants existants pour remplacer les composants qui portent le même nom.", + "loc.input.label.isDraft": "Version brouillon", + "loc.input.help.isDraft": "Indiquez si la mise en production doit être enregistrée en tant que brouillon (non publiée). Si la valeur est 'false', la mise en production est publiée.", + "loc.input.label.isPreRelease": "Préversion", + "loc.input.help.isPreRelease": "Indiquez si la mise en production doit être marquée en tant que préversion.", + "loc.input.label.addChangeLog": "Ajouter un journal des modifications", + "loc.input.help.addChangeLog": "Si la valeur est 'true', la liste des changements (validations et problèmes) survenus entre cette mise en production et la dernière mise en production publiée est générée et ajoutée aux notes de publication.", + "loc.input.label.changeLogCompareToRelease": "Comparer à", + "loc.input.help.changeLogCompareToRelease": "Indiquez la mise en production que nous devons comparer pour générer le journal des modifications : \nDernière mise en production complète : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente qui n'est pas marquée en tant que préversion.\nDernière mise en production non-brouillon : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente.\nDernière mise en production non-brouillon par étiquette : compare la mise en production actuelle avec la dernière mise en production non-brouillon correspondant à l'étiquette spécifiée. Vous pouvez également utiliser une notation regex à la place d'une étiquette exacte.", + "loc.input.label.changeLogCompareToReleaseTag": "Étiquette de mise en production", + "loc.input.help.changeLogCompareToReleaseTag": "Spécifiez la notation regex de l'étiquette de mise en production. La mise en production correspondant à cette étiquette sert de base au calcul du journal des modifications.", + "loc.input.label.changeLogType": "Type de journal des modifications", + "loc.input.help.changeLogType": "Le journal des modifications peut être basé sur les commits ou les problèmes. Le journal des modifications basé sur les commits liste tous les commits inclus dans une mise en production alors que le journal des modifications basé sur les problèmes liste la totalité des problèmes/demandes de tirage (pull requests) inclus dans la mise en production. ", + "loc.input.label.changeLogLabels": "Catégories", + "loc.input.help.changeLogLabels": "Ainsi, vous pouvez catégoriser les changements en fonction de l'étiquette associée au problème/à la demande de tirage (pull request). Pour une étiquette, vous pouvez mentionner le nom d'affichage de la catégorie et l'état du problème. Exemple : \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Dans le cas où un changement comporte plusieurs étiquettes, la première étiquette spécifiée est prioritaire. Laissez ce champ vide pour voir une liste plate des problèmes/demandes de tirage.", + "loc.messages.GithubApiFailError": "Une erreur inattendue s'est produite.", + "loc.messages.GetTagsError": "Une erreur inattendue s'est produite durant la récupération (fetch) des étiquettes.", + "loc.messages.GetReleasesError": "Une erreur inattendue s'est produite durant la récupération (fetch) des mises en production.", + "loc.messages.CreateReleaseError": "Une erreur inattendue s'est produite durant la création de la mise en production.", + "loc.messages.EditReleaseError": "Une erreur inattendue s'est produite durant la modification de la mise en production.", + "loc.messages.DeleteReleaseError": "Une erreur inattendue s'est produite durant la suppression de la mise en production.", + "loc.messages.CreatingRelease": "Création d'une mise en production pour l'étiquette : %s", + "loc.messages.CreateReleaseSuccess": "Création réussie de la mise en production à %s", + "loc.messages.ReleaseAlreadyExists": "Échec de la création de la mise en production. Il existe déjà une mise en production pour l'étiquette : %s", + "loc.messages.EditingRelease": "Modification de la mise en production avec l'étiquette : %s", + "loc.messages.EditReleaseSuccess": "Mise en production modifiée correctement", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Il n'existe aucune mise en production à modifier. Création d'une mise en production avec l'étiquette : %s", + "loc.messages.DeletingRelease": "Suppression de la mise en production pour l'étiquette : %s", + "loc.messages.DeleteReleaseSuccess": "Suppression réussie de la mise en production.", + "loc.messages.NoReleaseFoundToDelete": "Mise en production introuvable pour l'étiquette : %s. Échec de la suppression de la mise en production.", + "loc.messages.FetchReleaseForTag": "Récupération (fetch) de la mise en production pour l'étiquette : %s", + "loc.messages.FetchReleaseForTagSuccess": "Mise en production trouvée pour l'étiquette : %s", + "loc.messages.FetchTagForTarget": "Recherche d'étiquettes associées à la validation cible : %s", + "loc.messages.FetchTagForTargetSuccess": "Étiquette trouvée pour la validation cible : %s", + "loc.messages.MissingAssetError": "Fichier introuvable : %s", + "loc.messages.MultipleReleasesFoundError": "Une seule mise en production était attendue, mais plusieurs mises en production ont été trouvées pour l'étiquette : %s. Impossible d'effectuer l'action.", + "loc.messages.MultipleTagFound": "Une seule étiquette était attendue, mais plusieurs étiquettes ont été trouvées pour la validation spécifiée : %s. Impossible d'effectuer l'action.", + "loc.messages.NoTagFound": "La mise en production ne sera pas créée, car les étiquettes du commit cible ne correspondent pas au modèle d'étiquette donné", + "loc.messages.DeleteAllExistingAssets": "Suppression de tous les composants existants...", + "loc.messages.DuplicateAssetFound": "Composant dupliqué trouvé : %s", + "loc.messages.AssetsDeletedSuccessfully": "Composants supprimés correctement.", + "loc.messages.DeletingDuplicateAsset": "Suppression du composant dupliqué : %s", + "loc.messages.SkipDuplicateAssetFound": "Composant dupliqué trouvé : %s. Ignoré...", + "loc.messages.AssetDeletedSuccessfully": "Composant %s supprimé correctement", + "loc.messages.AllAssetsUploadedSuccessfully": "Tous les composants ont été chargés correctement.", + "loc.messages.ErrorDeletingDuplicateAsset": "Une erreur inattendue s'est produite durant la suppression du composant dupliqué : %s", + "loc.messages.ErrorDeletingAsset": "Une erreur inattendue s'est produite durant la suppression du composant : %s", + "loc.messages.DeletingAsset": "Suppression du composant : %s", + "loc.messages.NoAssetFoundToDelete": "Les composants à supprimer sont introuvables.", + "loc.messages.UploadingAssets": "Chargement des composants...", + "loc.messages.UploadingAsset": "Chargement du fichier : '%s'.", + "loc.messages.UploadAssetError": "Une erreur inattendue s'est produite durant le chargement du fichier : %s", + "loc.messages.UploadAssetSuccess": "Chargement réussi du fichier : '%s'", + "loc.messages.NoAssetFoundToUpload": "Les composants à charger sont introuvables.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Fichier de notes de publication : %s est un répertoire et non un fichier.", + "loc.messages.AssetIsDirectoryError": "La composant est un répertoire et non un fichier. Chargement du répertoire ignoré : %s", + "loc.messages.ComputingChangeLog": "Calcul des changements apportés à cette mise en production...", + "loc.messages.ComputingChangeLogSuccess": "Changements calculés correctement.", + "loc.messages.CommitDiffBehind": "Impossible de calculer les modifications, car la validation cible fournie est antérieure à la validation de la dernière mise en production publiée.", + "loc.messages.CommitDiffEqual": "Changements introuvables. La validation cible fournie est la même que celle de la dernière mise en production publiée.", + "loc.messages.FetchLatestPublishRelease": "Récupération (fetch) de la dernière mise en production publiée...", + "loc.messages.FetchLatestNonDraftRelease": "Récupération (fetch) de la dernière mise en production non-brouillon...", + "loc.messages.FetchLastReleaseByTag": "Récupération (fetch) de la dernière mise en production correspondant au modèle d'étiquette %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "La dernière mise en production publiée a été trouvée : %s", + "loc.messages.FetchMatchingReleaseSuccess": "La dernière mise en production non-brouillon a été trouvée", + "loc.messages.FetchTagMatchingReleaseSuccess": "La dernière mise en production correspondant au modèle d'étiquette %s a été trouvée", + "loc.messages.GetLatestReleaseError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la dernière mise en production publiée.", + "loc.messages.NoLatestPublishRelease": "Aucune mise en production n'a encore été publiée dans le dépôt.", + "loc.messages.NoMatchingReleases": "Mises en production non-brouillon introuvables.", + "loc.messages.NoTagMatchingReleases": "Aucune mise en production ne correspond au modèle d'étiquette : %s ", + "loc.messages.FetchCommitDiff": "Récupération (fetch) de la liste des validations depuis la dernière mise en production publiée...", + "loc.messages.FetchCommitDiffSuccess": "La liste des changements a été trouvée.", + "loc.messages.FetchCommitDiffError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la liste des changements.", + "loc.messages.FetchInitialCommit": "Récupération (fetch) de la validation initiale...", + "loc.messages.FetchInitialCommitSuccess": "Validation initiale trouvée : %s", + "loc.messages.InvalidGitHubEndpoint": "Point de terminaison de service GitHub non valide : %s.", + "loc.messages.InvalidEndpointAuthScheme": "Mode de connexion de service GitHub non valide : %s. Seules les connexions par jeton d'accès personnel OAuth et GitHub sont autorisées.", + "loc.messages.FetchInitialCommitError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la validation initiale.", + "loc.messages.InvalidActionSet": "Action non valide : %s. Seules les actions 'create', 'edit' ou 'delete' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Source étiquette non valide : %s. Seules les options 'gitTag' ou 'userSpecifiedTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Source des notes de publication non valide : %s. Seules les options 'filePath' ou 'inline' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Attribut compareWith non valide : %s. Seules les options 'lastFullRelease, 'lastNonDraftRelease' ou 'lastNonDraftReleaseByTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Mode de chargement de composant non valide : %s. Seules les options 'delete' ou 'replace' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Pour l'action '%s', une étiquette est nécessaire. Spécifiez une étiquette au cours de l'étape. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "La source de l'étiquette a la valeur userSpecifiedTag. Spécifiez une étiquette pour l'action de création. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Il n'existe aucun fichier correspondant à '%s'. Rien à charger.", + "loc.messages.PatternIsADirectory": "Impossible de charger '%s', car il s'agit d'un répertoire. Spécifiez un fichier.", + "loc.messages.SearchingFileMatchingPattern": "Recherche de fichier(s) correspondant à '%s'.", + "loc.messages.IssuesFetchError": "Erreur durant la récupération (fetch) des problèmes. Impossible de générer le journal des modifications.", + "loc.messages.NoIssuesLinkedError": "Aucun problème n'est lié aux commits dans la comparaison des différences de commit spécifiée.", + "loc.messages.LabelsSyntaxError": "Une erreur s'est produite durant l'analyse des étiquettes. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Attribut ChangeLogType non valide : %s. Seules les options 'commitBased' ou 'issueBased' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changements", + "loc.messages.DefaultCategory": "Autres", + "loc.messages.SeeMoreText": "Voir plus" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..42f2e14dbe1a --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versione di GitHub", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/AA3aeiw)", + "loc.description": "Consente di creare, modificare o eliminare una versione di GitHub", + "loc.instanceNameFormat": "Versione di GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configurazione del log delle modifiche", + "loc.input.label.gitHubConnection": "Connessione a GitHub (OAuth o token di accesso personale)", + "loc.input.help.gitHubConnection": "Specificare il nome della connessione al servizio GitHub da usare per la connessione al repository GitHub. La connessione deve essere basata su un OAuth dell'utente di GitHub o su un token di accesso personale GitHub. Per altre informazioni sulle connessioni al servizio, vedere [qui](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specificare il nome del repository GitHub in cui verrà creata, modificata o eliminata la versione GitHub.", + "loc.input.label.action": "Azione", + "loc.input.help.action": "Specificare il tipo di operazione da eseguire sulla versione. Questa attività consente di creare, modificare o eliminare una versione di GitHub.", + "loc.input.label.target": "Destinazione", + "loc.input.help.target": "Specificare il commit SHA per cui verrà creata la versione GitHub, ad esempio `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. È anche possibile usare una variabile, ad esempio `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Origine dei tag", + "loc.input.help.tagSource": "Specificare il tag da usare per la creazione della versione. L'opzione 'Tag GIT' accetta automaticamente il tag associato al commit GIT. Selezionare l'opzione 'Tag specificato dall'utente' per specificare manualmente un tag.", + "loc.input.label.tagPattern": "Criterio tag", + "loc.input.help.tagPattern": "Consente di specificare il criterio tag GIT con espressioni regolari, ad esempio `release-v1.*`. La versione GitHub verrà creata solo per i commit a cui è associato il tag GIT corrispondente. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specificare il tag per cui creare, modificare o eliminare una versione. È anche possibile usare una variabile, ad esempio `$(myTagName)`.", + "loc.input.label.title": "Titolo della versione", + "loc.input.help.title": "Specificare il titolo della versione GitHub. Se viene lasciato vuoto, come titolo della versione verrà usato il tag.", + "loc.input.label.releaseNotesSource": "Origine delle note sulla versione", + "loc.input.help.releaseNotesSource": "Specificare la descrizione della versione di GitHub. Selezionare l'opzione 'File delle note sulla versione' per usare il contenuto di un file come note sulla versione. Selezionare l'opzione 'Note sulla versione online' per immettere manualmente le note sulla versione.", + "loc.input.label.releaseNotesFilePath": "Percorso del file delle note sulla versione", + "loc.input.help.releaseNotesFilePath": "Selezionare il file che contiene le note sulla versione.", + "loc.input.label.releaseNotesInline": "Note sulla versione", + "loc.input.help.releaseNotesInline": "Immettere qui le note sulla versione. Markdown è supportato.", + "loc.input.label.assets": "Asset", + "loc.input.help.assets": "Specificare i file da caricare come asset della versione. È possibile usare caratteri jolly per specificare più file. Ad esempio, specificare `$(Build.ArtifactStagingDirectory)/*.zip` per le pipeline di compilazione oppure `$(System.DefaultWorkingDirectory)/*.zip` per le pipeline di versione. È anche possibile specificare più criteri, uno per riga. Per impostazione predefinita, tutti i file verranno caricati nella directory $(Build.ArtifactStagingDirectory). Per altre informazioni sull'elenco delle variabili predefinite disponibili, vedere le [variabili di compilazione](https://aka.ms/AA4449z) e le [variabili di versione](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modalità di caricamento degli asset", + "loc.input.help.assetUploadMode": "Usare l'opzione 'Elimina asset esistenti' per eliminare prima tutti gli asset esistenti nella versione, quindi caricare tutti gli asset. Usare l'opzione 'Sostituisci asset esistenti' per sostituire gli asset con lo stesso nome.", + "loc.input.label.isDraft": "Versione bozza", + "loc.input.help.isDraft": "Indica se la versione deve essere salvata come bozza (non pubblicata). Se è `false`, la versione verrà pubblicata.", + "loc.input.label.isPreRelease": "Versione non definitiva", + "loc.input.help.isPreRelease": "Indica se la versione deve essere contrassegnata come versione non definitiva.", + "loc.input.label.addChangeLog": "Aggiungi log delle modifiche", + "loc.input.help.addChangeLog": "Se è impostato su `true`, verrà generato un elenco di modifiche (commit e problemi) relativo alla versione corrente e all'ultima versione pubblicata e tale elenco verrà aggiunto alle note sulla versione.", + "loc.input.label.changeLogCompareToRelease": "Confronta con", + "loc.input.help.changeLogCompareToRelease": "Indica la versione con cui eseguire il confronto per generare il log delle modifiche: \nUltima versione completa: confronta la versione corrente con la versione non bozza più recente che non è contrassegnata come versione non definitiva.\nUltima versione non bozza: confronta la versione corrente con la versione non bozza più recente.\nUltima versione non bozza per tag: confronta la versione corrente con l'ultima versione non bozza corrispondente al tag specificato. È anche possibile specificare un'espressione regolare invece di un tag esatto.", + "loc.input.label.changeLogCompareToReleaseTag": "Tag di versione", + "loc.input.help.changeLogCompareToReleaseTag": "Consente di specificare l'espressione regolare per il tag di versione. La versione corrispondente a questo tag verrà usata come base per il calcolo del log delle modifiche.", + "loc.input.label.changeLogType": "Tipo di log delle modifiche", + "loc.input.help.changeLogType": "Il log delle modifiche può essere basato su commit o su problemi. Il log delle modifiche basato su commit elenca tutti i commit inclusi in una versione, mentre quello basato su problemi elenca tutti i problemi o le richieste pull inclusi nella versione. ", + "loc.input.label.changeLogLabels": "Categorie", + "loc.input.help.changeLogLabels": "Consente di categorizzare le modifiche in base all'etichetta associata al problema o alla richiesta pull. Per un'etichetta è possibile menzionare il nome visualizzato per la categoria e lo stato del problema, ad esempio `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. Nel caso in cui a una modifica siano associate più etichette, la priorità viene assegnata alla prima etichetta specificata. Lasciare vuoto questo campo per visualizzare un elenco semplice di problemi/richieste pull.", + "loc.messages.GithubApiFailError": "Si è verificato un errore imprevisto.", + "loc.messages.GetTagsError": "Si è verificato un errore imprevisto durante il recupero dei tag.", + "loc.messages.GetReleasesError": "Si è verificato un errore imprevisto durante il recupero delle versioni.", + "loc.messages.CreateReleaseError": "Si è verificato un errore imprevisto durante la creazione della versione.", + "loc.messages.EditReleaseError": "Si è verificato un errore imprevisto durante la modifica della versione.", + "loc.messages.DeleteReleaseError": "Si è verificato un errore imprevisto durante l'eliminazione della versione.", + "loc.messages.CreatingRelease": "Creazione di una versione per il tag: %s", + "loc.messages.CreateReleaseSuccess": "La versione è stata creata in %s", + "loc.messages.ReleaseAlreadyExists": "Non è stato possibile creare la versione. Esiste già una versione per il tag: %s", + "loc.messages.EditingRelease": "Modifica della versione con il tag: %s", + "loc.messages.EditReleaseSuccess": "La versione è stata modificata", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Non sono state trovate versioni esistenti da modificare. Ne verrà creata una con tag: %s", + "loc.messages.DeletingRelease": "Eliminazione della versione per il tag: %s", + "loc.messages.DeleteReleaseSuccess": "La versione è stata eliminata.", + "loc.messages.NoReleaseFoundToDelete": "Non è stata trovata alcuna versione per il tag: %s. L'eliminazione della versione non è riuscita.", + "loc.messages.FetchReleaseForTag": "Recupero della versione per il tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "È stata trovata una versione per il tag: %s", + "loc.messages.FetchTagForTarget": "Ricerca dei tag associati al commit di destinazione: %s", + "loc.messages.FetchTagForTargetSuccess": "È stato trovato un tag per il commit di destinazione: %s", + "loc.messages.MissingAssetError": "File non trovato: %s", + "loc.messages.MultipleReleasesFoundError": "È prevista una sola versione, ma ne è stata trovata più di una per il tag: %s. Non è possibile eseguire l'azione.", + "loc.messages.MultipleTagFound": "È previsto un solo tag, ma ne è stato trovato più di uno per il commit specificato: %s. Non è possibile eseguire l'azione.", + "loc.messages.NoTagFound": "La versione non verrà creata perché i tag per il commit di destinazione non corrispondono al criterio tag specificato", + "loc.messages.DeleteAllExistingAssets": "Eliminazione di tutti gli asset esistenti...", + "loc.messages.DuplicateAssetFound": "È stato trovato un asset duplicato: %s", + "loc.messages.AssetsDeletedSuccessfully": "Gli asset sono stati eliminati.", + "loc.messages.DeletingDuplicateAsset": "Eliminazione dell'asset duplicato: %s", + "loc.messages.SkipDuplicateAssetFound": "È stato trovato un asset duplicato: %s. Verrà ignorato...", + "loc.messages.AssetDeletedSuccessfully": "L'asset %s è stato eliminato", + "loc.messages.AllAssetsUploadedSuccessfully": "Tutti gli asset sono stati caricati.", + "loc.messages.ErrorDeletingDuplicateAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset duplicato: %s", + "loc.messages.ErrorDeletingAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset: %s", + "loc.messages.DeletingAsset": "Eliminazione dell'asset: %s", + "loc.messages.NoAssetFoundToDelete": "Non sono stati trovati asset da eliminare.", + "loc.messages.UploadingAssets": "Caricamento degli asset...", + "loc.messages.UploadingAsset": "Caricamento del file: '%s'.", + "loc.messages.UploadAssetError": "Si è verificato un errore imprevisto durante il caricamento del file: %s", + "loc.messages.UploadAssetSuccess": "Il file è stato caricato: '%s'", + "loc.messages.NoAssetFoundToUpload": "Non sono stati trovati asset da caricare.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Il file delle note sulla versione %s è una directory e non un file.", + "loc.messages.AssetIsDirectoryError": "L'asset è una directory e non un file. La directory di caricamento verrà ignorata: %s", + "loc.messages.ComputingChangeLog": "Calcolo delle modifiche apportate in questa versione...", + "loc.messages.ComputingChangeLogSuccess": "Le modifiche sono state calcolate.", + "loc.messages.CommitDiffBehind": "Non è possibile calcolare le modifiche perché il commit di destinazione specificato è meno recente del commit dell'ultima versione pubblicata.", + "loc.messages.CommitDiffEqual": "Non sono state trovate modifiche. Il commit di destinazione specificato è uguale a quello dell'ultima versione pubblicata.", + "loc.messages.FetchLatestPublishRelease": "Recupero dell'ultima versione pubblicata...", + "loc.messages.FetchLatestNonDraftRelease": "Recupero della versione non bozza più recente...", + "loc.messages.FetchLastReleaseByTag": "Recupero della versione più recente corrispondente al criterio tag %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "L'ultima versione pubblicata è stata trovata: %s", + "loc.messages.FetchMatchingReleaseSuccess": "La versione non bozza più recente è stata trovata", + "loc.messages.FetchTagMatchingReleaseSuccess": "La versione più recente corrispondente al criterio tag %s è stata trovata", + "loc.messages.GetLatestReleaseError": "Si è verificato un errore imprevisto durante il recupero dell'ultima versione pubblicata.", + "loc.messages.NoLatestPublishRelease": "Non sono ancora state pubblicate versioni nel repository.", + "loc.messages.NoMatchingReleases": "Non sono state trovate versioni non bozza.", + "loc.messages.NoTagMatchingReleases": "Non sono state trovate versioni corrispondenti al criterio tag %s ", + "loc.messages.FetchCommitDiff": "Recupero dell'elenco di commit eseguiti dall'ultima versione pubblicata...", + "loc.messages.FetchCommitDiffSuccess": "L'elenco di modifiche è stato trovato.", + "loc.messages.FetchCommitDiffError": "Si è verificato un errore imprevisto durante il recupero dell'elenco di modifiche.", + "loc.messages.FetchInitialCommit": "Recupero del commit iniziale...", + "loc.messages.FetchInitialCommitSuccess": "Il commit iniziale è stato trovato: %s", + "loc.messages.InvalidGitHubEndpoint": "Endpoint servizio GitHub non valido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Schema di connessione al servizio GitHub non valido: %s. Sono consentite solo le connessioni OAuth o con token di accesso personale GitHub.", + "loc.messages.FetchInitialCommitError": "Si è verificato un errore imprevisto durante il recupero del commit iniziale.", + "loc.messages.InvalidActionSet": "Azione non valida: %s. Sono consentite solo le azioni 'create', 'edit' e 'delete'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "L'origine dei tag non è valida: %s. Sono consentite solo le opzioni 'gitTag' o 'userSpecifiedTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "L'origine delle note sulla versione non è valida: %s. Sono consentite solo le opzioni 'filePath' o 'inline'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "L'attributo di compareWith non è valido: %s. Sono consentite solo le opzioni 'lastFullRelease, 'lastNonDraftRelease' o 'lastNonDraftReleaseByTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modalità di caricamento degli asset non valida: %s. Sono consentite solo le opzioni 'delete' e 'replace'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Per l'azione '%s' è richiesto un tag. Specificare un tag nel passaggio. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "L'origine del tag è impostata su userSpecifiedTag. Specificare un tag per l'azione create. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Non sono stati trovati file corrispondenti a '%s'. Non c'è nulla da caricare.", + "loc.messages.PatternIsADirectory": "Non è possibile caricare '%s' perché è una directory. Specificare un file.", + "loc.messages.SearchingFileMatchingPattern": "Ricerca dei file corrispondenti a '%s'.", + "loc.messages.IssuesFetchError": "Si è verificato un errore durante il recupero dei problemi. Non è possibile generare il log delle modifiche.", + "loc.messages.NoIssuesLinkedError": "Non è stato collegato alcun problema ai commit nel Diff di commit specificato.", + "loc.messages.LabelsSyntaxError": "Si è verificato un errore durante l'analisi delle etichette. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "L'attributo di ChangeLogType non è valido: %s. Sono consentite solo le opzioni 'commitBased' o 'issueBased'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Modifiche", + "loc.messages.DefaultCategory": "Altri tipi", + "loc.messages.SeeMoreText": "Visualizza dettagli" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..d7c9a9b43ab5 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub リリース", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub リリースを作成、編集、または削除します", + "loc.instanceNameFormat": "GitHub リリース ($(action))", + "loc.group.displayName.changeLogConfiguration": "変更ログの構成", + "loc.input.label.gitHubConnection": "GitHub 接続 (OAuth または PAT)", + "loc.input.help.gitHubConnection": "GitHub リポジトリへの接続に使用する GitHub サービス接続の名前を指定します。この接続は、GitHub ユーザーの OAuth または GitHub 個人用アクセス トークンに基づいている必要があります。サービス接続については、[こちら](https://aka.ms/AA3am5s)を参照してください。", + "loc.input.label.repositoryName": "リポジトリ", + "loc.input.help.repositoryName": "GitHub リリースが作成、編集、または削除される GitHub リポジトリの名前を指定します。", + "loc.input.label.action": "アクション", + "loc.input.help.action": "実行するリリース操作の種類を指定します。このタスクでは、GitHub リリースを作成、編集、または削除できます。", + "loc.input.label.target": "ターゲット", + "loc.input.help.target": "GitHub リリースを作成するためのコミット SHA を指定します。例: `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。ここで変数を使用することもできます。例: '$(myCommitSHA)'。", + "loc.input.label.tagSource": "タグ ソース", + "loc.input.help.tagSource": "リリースの作成に使用するタグを指定します。[Git タグ] オプションを使用する場合、Git コミットと関連付けられているタグが自動的に取得されます。[ユーザー指定のタグ] オプションを使用する場合、手動でタグを指定します。", + "loc.input.label.tagPattern": "タグ パターン", + "loc.input.help.tagPattern": "正規表現を使用して Git タグ パターンを指定します (例: `release-v1.*`)。GitHub リリースは、一致する Git タグがあるコミットに対してのみ作成されます。", + "loc.input.label.tag": "タグ", + "loc.input.help.tag": "リリースを作成、編集、または削除するためのタグを指定します。ここで変数を使用することもできます。例: `$(myTagName)`。", + "loc.input.label.title": "リリース タイトル", + "loc.input.help.title": "GitHub リリースのタイトルを指定します。空のままにすると、タグはリリース タイトルとして使用されます。", + "loc.input.label.releaseNotesSource": "リリース ノートのソース", + "loc.input.help.releaseNotesSource": "GitHub リリースの説明を指定します。ファイルの内容をリリース ノートとして使用するには、[リリース ノート ファイル] オプションを使用します。手動でリリース ノートを入力するには、[インライン リリース ノート] オプションを使用します。", + "loc.input.label.releaseNotesFilePath": "リリース ノート ファイル パス", + "loc.input.help.releaseNotesFilePath": "リリース ノートを含むファイルを選択します。", + "loc.input.label.releaseNotesInline": "リリース ノート", + "loc.input.help.releaseNotesInline": "リリース ノートをこちらに入力してください。マークダウンがサポートされています。", + "loc.input.label.assets": "資産", + "loc.input.help.assets": "リリース アセットとしてアップロードするファイルを指定します。ワイルドカード文字を使用して複数のファイルを指定できます。例: ビルド パイプラインの場合は `$(Build.ArtifactStagingDirectory)/*.zip`、リリース パイプラインの場合は `$(System.DefaultWorkingDirectory)/*.zip` とします。1 行に 1 つずつ、複数のパターンを指定することもできます。既定では、$(Build.ArtifactStagingDirectory) ディレクトリ内のすべてのファイルがアップロードされます。利用可能な事前定義済み変数のリストについて詳しくは、[ビルド変数](https://aka.ms/AA4449z)および[リリース変数](https://aka.ms/AA43wws)を参照してください。", + "loc.input.label.assetUploadMode": "アセット アップロード モード", + "loc.input.help.assetUploadMode": "最初にリリース内の既存のアセットを削除してからすべてのアセットをアップロードするには、[既存のアセットを削除] オプションを使用します。同じ名前のアセットを置換するには、[既存のアセットを置換] オプションを使用します。", + "loc.input.label.isDraft": "ドラフト リリース", + "loc.input.help.isDraft": "リリースを下書き (未公開) として保存する必要があるかどうかを示します。[false] の場合、リリースは公開されます。", + "loc.input.label.isPreRelease": "プレリリース", + "loc.input.help.isPreRelease": "リリースをプレリリースとしてマークする必要があるかどうかを示します。", + "loc.input.label.addChangeLog": "変更ログの追加", + "loc.input.help.addChangeLog": "[true] に設定されている場合、これと公開された最新リリースの間の変更 (コミットと公開) の一覧が生成され、リリース ノートに追加されます。", + "loc.input.label.changeLogCompareToRelease": "比較対象", + "loc.input.help.changeLogCompareToRelease": "変更ログを生成するために比較するリリースを指定します。\n最後の完全リリース: 現在のリリースを、プレリリースとしてマークされていない、ドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース: 現在のリリースをドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース (タグによる): 現在のリリースを、指定されたタグと一致する最後のドラフト以外のリリースと比較します。正確なタグの代わりに正規表現を指定することもできます。", + "loc.input.label.changeLogCompareToReleaseTag": "リリース タグ", + "loc.input.help.changeLogCompareToReleaseTag": "リリース タグの正規表現を指定します。このタグに一致するリリースは、変更ログの計算のベースとして使用されます。", + "loc.input.label.changeLogType": "変更ログの種類", + "loc.input.help.changeLogType": "変更ログは、コミット ベースまたはイシュー ベースにすることができます。コミット ベースの変更ログにはリリースに含まれているすべてのコミットが一覧表示されるのに対し、イシュー ベースの変更ログにはリリースに含まれるすべてのイシューまたは pull request が一覧表示されます。", + "loc.input.label.changeLogLabels": "カテゴリ", + "loc.input.help.changeLogLabels": "これを使用すると、イシューまたは PR に関連付けられているラベルに基づいて変更を分類できます。ラベルにはカテゴリの表示名とイシューの状態を含めることができます。例: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。1 つの変更に複数のラベルがある場合、最初に指定したラベルが優先されます。イシューまたは PR のフラットな一覧を表示するには、このフィールドを空のままにします。", + "loc.messages.GithubApiFailError": "予期しないエラーが発生しました。", + "loc.messages.GetTagsError": "タグのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.GetReleasesError": "リリースのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.CreateReleaseError": "リリースの作成中に予期しないエラーが発生しました。", + "loc.messages.EditReleaseError": "リリースの編集中に予期しないエラーが発生しました。", + "loc.messages.DeleteReleaseError": "リリースの削除中に予期しないエラーが発生しました。", + "loc.messages.CreatingRelease": "タグのリリースを作成しています: %s", + "loc.messages.CreateReleaseSuccess": "%s でリリースが正常に作成されました", + "loc.messages.ReleaseAlreadyExists": "リリースを作成できませんでした。次のタグのリリースが既に存在します: %s", + "loc.messages.EditingRelease": "タグ付きのリリースを編集しています: %s", + "loc.messages.EditReleaseSuccess": "リリースが正常に編集されました", + "loc.messages.NoReleaseFoundToEditCreateRelease": "編集対象の既存のリリースは見つかりませんでした。タグを使用して作成しています: %s", + "loc.messages.DeletingRelease": "タグのリリースを削除しています: %s", + "loc.messages.DeleteReleaseSuccess": "リリースが正常に削除されました。", + "loc.messages.NoReleaseFoundToDelete": "タグのリリースが見つかりませんでした: %s。リリースの削除に失敗しました。", + "loc.messages.FetchReleaseForTag": "タグのリリースをフェッチしています: %s", + "loc.messages.FetchReleaseForTagSuccess": "タグのリリースが見つかりました: %s", + "loc.messages.FetchTagForTarget": "ターゲットのコミットに関連付けられたタグを検索しています: %s", + "loc.messages.FetchTagForTargetSuccess": "ターゲット コミットのタグが見つかりました: %s", + "loc.messages.MissingAssetError": "ファイルが見つかりませんでした: %s", + "loc.messages.MultipleReleasesFoundError": "必要なリリースは 1 つだけですが、タグには複数のリリースが見つかりました: %s。操作を実行できません。", + "loc.messages.MultipleTagFound": "必要なタグは 1 つのみですが、指定されたコミットに複数のタグが見つかりました: %s。操作を実行できません。", + "loc.messages.NoTagFound": "ターゲット コミットのタグが指定されたタグ パターンと一致しないため、リリースは作成されません", + "loc.messages.DeleteAllExistingAssets": "既存のすべてのアセットを削除しています...", + "loc.messages.DuplicateAssetFound": "重複するアセットが見つかりました: %s", + "loc.messages.AssetsDeletedSuccessfully": "アセットが正常に削除されました。", + "loc.messages.DeletingDuplicateAsset": "重複するアセットを削除しています: %s", + "loc.messages.SkipDuplicateAssetFound": "重複するアセットが見つかりました: %s。スキップしています...", + "loc.messages.AssetDeletedSuccessfully": "アセット %s が正常に削除されました", + "loc.messages.AllAssetsUploadedSuccessfully": "すべてのアセットが正常にアップロードされました。", + "loc.messages.ErrorDeletingDuplicateAsset": "重複するアセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.ErrorDeletingAsset": "アセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.DeletingAsset": "アセットを削除しています: %s", + "loc.messages.NoAssetFoundToDelete": "削除するアセットが見つかりませんでした。", + "loc.messages.UploadingAssets": "アセットをアップロードしています...", + "loc.messages.UploadingAsset": "ファイルをアップロードしています: '%s'。", + "loc.messages.UploadAssetError": "次のファイルのアップロード中に予期しないエラーが発生しました: %s", + "loc.messages.UploadAssetSuccess": "ファイルが正常にアップロードされました: '%s'", + "loc.messages.NoAssetFoundToUpload": "アップロードするアセットが見つかりませんでした。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "リリース ノート ファイル: %s はディレクトリであり、ファイルではありません。", + "loc.messages.AssetIsDirectoryError": "このアセットはディレクトリであり、ファイルではありません。ディレクトリのアップロードをスキップしています: %s", + "loc.messages.ComputingChangeLog": "このリリースで行われた変更を計算しています...", + "loc.messages.ComputingChangeLogSuccess": "変更が正常に計算されました。", + "loc.messages.CommitDiffBehind": "指定されたターゲット コミットが、公開された最新リリースのコミットより古いため、変更を計算できません。", + "loc.messages.CommitDiffEqual": "変更は見つかりませんでした。指定されたターゲットのコミットは、公開された最新リリースのコミットと同じです。", + "loc.messages.FetchLatestPublishRelease": "公開された最新リリースをフェッチしています...", + "loc.messages.FetchLatestNonDraftRelease": "ドラフト以外の最新リリースをフェッチしています...", + "loc.messages.FetchLastReleaseByTag": "タグ パターンに一致する最新リリースをフェッチしています: %s", + "loc.messages.FetchLatestPublishReleaseSuccess": "公開された最新のリリースが見つかりました: %s", + "loc.messages.FetchMatchingReleaseSuccess": "ドラフト以外の最新リリースが見つかりました", + "loc.messages.FetchTagMatchingReleaseSuccess": "タグ パターンに一致する最新リリースが見つかりました: %s", + "loc.messages.GetLatestReleaseError": "公開された最新リリースのフェッチ中に予期しないエラーが発生しました。 ", + "loc.messages.NoLatestPublishRelease": "リポジトリに公開されているリリースはまだありません。", + "loc.messages.NoMatchingReleases": "ドラフト以外のリリースが見つかりません。", + "loc.messages.NoTagMatchingReleases": "タグ パターン %s に一致するリリースが見つかりませんでした", + "loc.messages.FetchCommitDiff": "公開された最新リリース以降のコミットの一覧をフェッチしています...", + "loc.messages.FetchCommitDiffSuccess": "変更の一覧が見つかりました。", + "loc.messages.FetchCommitDiffError": "変更の一覧のフェッチ中に予期しないエラーが発生しました。", + "loc.messages.FetchInitialCommit": "初期コミットをフェッチしています...", + "loc.messages.FetchInitialCommitSuccess": "初期コミットが見つかりました: %s", + "loc.messages.InvalidGitHubEndpoint": "無効な GitHub サービス エンドポイント: %s。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub サービス接続スキームが無効です: %s。使用できるのは OAuth と GitHub の個人用アクセス トークン接続のみです。", + "loc.messages.FetchInitialCommitError": "初期コミットのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.InvalidActionSet": "無効なアクション: %s。'作成'、'編集'、または '削除' の操作のみが許可されています。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "タグ ソース %s が無効です。'gitTag' または 'userSpecifiedTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidReleaseNotesSource": "リリース ノート ソース %s が無効です。'filePath' または 'inline' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidCompareWithAttribute": "compareWith 属性 %s が無効です。'lastFullRelease'、'lastNonDraftRelease'、'lastNonDraftReleaseByTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidAssetUploadMode": "アセットのアップロード モードが無効です: %s。'削除'、または '置換' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' アクションには、タグが必要です。手順でタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "タグ ソースが userSpecifiedTag に設定されています。作成アクション用のタグを指定してください。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.NoFileFoundMatchingPattern": "'%s' と一致するファイルが見つかりませんでした。アップロードするものがありません。", + "loc.messages.PatternIsADirectory": "'%s' はディレクトリであるため、アップロードできません。ファイルを指定してください。", + "loc.messages.SearchingFileMatchingPattern": "'%s' と一致するファイルを検索しています。", + "loc.messages.IssuesFetchError": "イシューのフェッチでエラーが発生しました。変更ログを生成できません。", + "loc.messages.NoIssuesLinkedError": "指定されたコミットの差分には、コミットにリンクされているイシューはありません。", + "loc.messages.LabelsSyntaxError": "ラベルの解析中にエラーが発生しました。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 属性 %s が無効です。'commitBased' または 'issueBased' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.ChangeLogTitle": "変更", + "loc.messages.DefaultCategory": "その他", + "loc.messages.SeeMoreText": "さらに表示" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..ab518df16a65 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 릴리스", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub 릴리스를 만들거나, 편집하거나, 삭제합니다.", + "loc.instanceNameFormat": "GitHub 릴리스($(action))", + "loc.group.displayName.changeLogConfiguration": "변경 로그 구성", + "loc.input.label.gitHubConnection": "GitHub 연결(OAuth 또는 PAT)", + "loc.input.help.gitHubConnection": "GitHub 리포지토리에 연결하는 데 사용할 GitHub 서비스 연결의 이름을 지정합니다. 이 연결은 GitHub 사용자의 OAuth 또는 GitHub 개인용 액세스 토큰을 기반으로 해야 합니다. [여기](https://aka.ms/AA3am5s)서 서비스 연결에 대해 자세히 알아보세요.", + "loc.input.label.repositoryName": "리포지토리", + "loc.input.help.repositoryName": "GitHub 릴리스를 만들거나, 편집하거나, 삭제할 GitHub 리포지토리의 이름을 지정합니다.", + "loc.input.label.action": "작업", + "loc.input.help.action": "수행할 릴리스 작업 유형을 지정합니다. 이 작업은 GitHub 릴리스를 만들거나, 편집하거나, 삭제할 수 있습니다.", + "loc.input.label.target": "대상", + "loc.input.help.target": "GitHub 릴리스를 만들 커밋 SHA를 지정합니다. 예: '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. 여기서 변수를 사용할 수도 있습니다. 예: '$(myCommitSHA)'", + "loc.input.label.tagSource": "태그 소스", + "loc.input.help.tagSource": "릴리스 생성에 사용할 태그를 지정합니다. 'Git tag' 옵션은 Git 커밋에 연결된 태그를 자동으로 사용합니다. 태그를 수동으로 지정하려면 '사용자 지정 태그' 옵션을 사용합니다.", + "loc.input.label.tagPattern": "태그 패턴", + "loc.input.help.tagPattern": "regex를 사용하여 git 태그 패턴을 지정합니다(예: `release-v1.*`). GitHub 릴리스는 일치하는 git 태그가 있는 커밋에 대해서만 생성됩니다. ", + "loc.input.label.tag": "태그", + "loc.input.help.tag": "릴리스를 만들거나, 편집하거나, 삭제할 태그를 지정합니다. 여기서 변수를 사용할 수도 있습니다. 예: '$(myTagName)'", + "loc.input.label.title": "릴리스 제목", + "loc.input.help.title": "GitHub 릴리스의 제목을 지정합니다. 비워 두면, 태그가 릴리스 제목으로 사용됩니다.", + "loc.input.label.releaseNotesSource": "릴리스 정보 소스", + "loc.input.help.releaseNotesSource": "GitHub 릴리스에 대한 설명을 지정합니다. 파일 내용을 릴리스 정보로 사용하려면 '릴리스 정보 파일' 옵션을 사용합니다. 릴리스 정보를 수동으로 입력하려면 '인라인 릴리스 정보' 옵션을 사용합니다.", + "loc.input.label.releaseNotesFilePath": "릴리스 정보 파일 경로", + "loc.input.help.releaseNotesFilePath": "릴리스 정보가 포함된 파일을 선택합니다.", + "loc.input.label.releaseNotesInline": "릴리스 정보", + "loc.input.help.releaseNotesInline": "여기에 릴리스 정보를 입력합니다. Markdown이 지원됩니다.", + "loc.input.label.assets": "자산", + "loc.input.help.assets": "릴리스의 자산으로 업로드할 파일을 지정합니다. 와일드카드 문자를 사용하여 여러 파일을 지정할 수 있습니다. 예를 들어 빌드 파이프라인의 경우 '$(Build.ArtifactStagingDirectory)/*.zip', 릴리스 파이프라인의 경우 '$(System.DefaultWorkingDirectory)/*.zip'입니다. 한 줄에 하나씩, 여러 개의 패턴을 지정할 수도 있습니다. 기본적으로 $(Build.ArtifactStagingDirectory) 디렉터리에 있는 모든 파일이 업로드됩니다. 사용 가능한 미리 정의된 변수 목록에 대한 자세한 내용은 [빌드 변수](https://aka.ms/AA4449z) 및 [릴리스 변수](https://aka.ms/AA43wws)를 참조하세요.", + "loc.input.label.assetUploadMode": "자산 업로드 모드", + "loc.input.help.assetUploadMode": "릴리스의 기존 자산을 먼저 삭제한 후 모든 자산을 업로드하려면 '기존 자산 삭제' 옵션을 사용합니다. 동일한 이름의 자산을 모두 바꾸려면 '기존 자산 바꾸기' 옵션을 사용합니다.", + "loc.input.label.isDraft": "초안 릴리스", + "loc.input.help.isDraft": "릴리스를 초안(게시되지 않음)으로 저장해야 하는지 여부를 나타냅니다. 'false'이면, 릴리스가 게시됩니다.", + "loc.input.label.isPreRelease": "시험판", + "loc.input.help.isPreRelease": "릴리스를 시험판으로 표시해야 하는지 여부를 나타냅니다.", + "loc.input.label.addChangeLog": "changelog 추가", + "loc.input.help.addChangeLog": "'true'로 설정하면, 이 릴리스와 마지막으로 게시된 릴리스 사이의 변경 내용(커밋 및 문제) 목록이 생성되어 릴리스 정보에 추가됩니다.", + "loc.input.label.changeLogCompareToRelease": "비교 대상", + "loc.input.help.changeLogCompareToRelease": "변경 로그를 생성하기 위해 비교할 릴리스를 나타냅니다. \n마지막 전체 릴리스: 현재 릴리스와 시험판으로 표시되어 있지 않은 초안이 아닌 최신 릴리스를 비교합니다.\n초안이 아닌 마지막 릴리스: 현재 릴리스를 초안이 아닌 최신 릴리스와 비교합니다.\n태그 기준 초안이 아닌 마지막 릴리스: 지정한 태그와 일치하는 초안이 아닌 마지막 릴리스를 현재 릴리스와 비교합니다. 정확한 태그 대신 regex를 지정할 수도 있습니다.", + "loc.input.label.changeLogCompareToReleaseTag": "릴리스 태그", + "loc.input.help.changeLogCompareToReleaseTag": "릴리스 태그에 대한 regex를 지정합니다. 이 태그와 일치하는 릴리스가 변경 로그 계산의 기본으로 사용됩니다.", + "loc.input.label.changeLogType": "변경 로그 유형", + "loc.input.help.changeLogType": "변경 로그는 커밋 기반 또는 문제 기반일 수 있습니다. 문제 기반 변경 로그는 릴리스에 포함된 모든 문제/끌어오기 요청을 나열하지만 커밋 기반 변경 로그는 릴리스에 포함된 모든 커밋을 나열합니다. ", + "loc.input.label.changeLogLabels": "범주", + "loc.input.help.changeLogLabels": "문제/PR과 연결된 레이블을 기준으로 변경 내용을 분류하는 데 사용할 수 있습니다. 레이블의 경우 범주 및 문제 상태에 대해 해당 표시 이름을 언급할 수 있습니다. 예: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. 변경 내용에 레이블이 여러 개 있는 경우 처음 지정한 레이블이 우선 순위를 갖습니다. 문제/PR의 단순 목록을 보려면 이 필드를 비워 두세요.", + "loc.messages.GithubApiFailError": "예기치 않은 오류가 발생했습니다.", + "loc.messages.GetTagsError": "태그를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.GetReleasesError": "릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreateReleaseError": "릴리스를 만드는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.EditReleaseError": "릴리스를 편집하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeleteReleaseError": "릴리스를 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreatingRelease": "%s 태그의 릴리스를 만드는 중", + "loc.messages.CreateReleaseSuccess": "%s에 릴리스를 만들었습니다.", + "loc.messages.ReleaseAlreadyExists": "릴리스를 만들지 못했습니다. %s 태그의 릴리스가 이미 있습니다.", + "loc.messages.EditingRelease": "%s 태그가 있는 릴리스를 편집하는 중", + "loc.messages.EditReleaseSuccess": "릴리스를 편집했습니다.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "편집할 기존 릴리스가 없습니다. %s 태그를 사용하여 만드는 중입니다.", + "loc.messages.DeletingRelease": "%s 태그의 릴리스를 삭제하는 중", + "loc.messages.DeleteReleaseSuccess": "릴리스를 삭제했습니다.", + "loc.messages.NoReleaseFoundToDelete": "%s 태그의 릴리스를 찾을 수 없습니다. 릴리스를 삭제하지 못했습니다.", + "loc.messages.FetchReleaseForTag": "%s 태그의 릴리스를 페치하는 중", + "loc.messages.FetchReleaseForTagSuccess": "%s 태그의 릴리스를 찾았습니다.", + "loc.messages.FetchTagForTarget": "대상 커밋 %s에 연결된 태그를 검색하는 중", + "loc.messages.FetchTagForTargetSuccess": "대상 커밋 %s의 태그를 찾았습니다.", + "loc.messages.MissingAssetError": "%s 파일을 찾을 수 없습니다.", + "loc.messages.MultipleReleasesFoundError": "릴리스가 1개만 필요한데, %s 태그의 릴리스를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.MultipleTagFound": "태그가 1개만 필요한데, 지정된 %s 커밋의 태그를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.NoTagFound": "대상 커밋에 대한 태그가 지정된 태그 패턴과 일치하지 않으므로 릴리스가 만들어지지 않습니다.", + "loc.messages.DeleteAllExistingAssets": "기존 자산을 모두 삭제하는 중...", + "loc.messages.DuplicateAssetFound": "중복된 %s 자산을 찾았습니다.", + "loc.messages.AssetsDeletedSuccessfully": "자산을 삭제했습니다.", + "loc.messages.DeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중", + "loc.messages.SkipDuplicateAssetFound": "중복된 %s 자산을 찾았습니다. 건너뛰는 중...", + "loc.messages.AssetDeletedSuccessfully": "%s 자산을 삭제했습니다.", + "loc.messages.AllAssetsUploadedSuccessfully": "모든 자산을 업로드했습니다.", + "loc.messages.ErrorDeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.ErrorDeletingAsset": "%s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeletingAsset": "%s 자산을 삭제하는 중", + "loc.messages.NoAssetFoundToDelete": "삭제할 자산이 없습니다.", + "loc.messages.UploadingAssets": "자산을 업로드하는 중...", + "loc.messages.UploadingAsset": "'%s' 파일을 업로드하는 중입니다.", + "loc.messages.UploadAssetError": "%s 파일을 업로드하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.UploadAssetSuccess": "'%s' 파일을 업로드했습니다.", + "loc.messages.NoAssetFoundToUpload": "업로드할 자산이 없습니다.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "릴리스 정보 파일 %s은(는) 파일이 아닌 디렉터리입니다.", + "loc.messages.AssetIsDirectoryError": "이 자산은 파일이 아닌 디렉터리입니다. %s 디렉터리 업로드를 건너뜁니다.", + "loc.messages.ComputingChangeLog": "이 릴리스의 변경 내용을 컴퓨팅하는 중...", + "loc.messages.ComputingChangeLogSuccess": "변경 내용을 컴퓨팅했습니다.", + "loc.messages.CommitDiffBehind": "지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋보다 이전이므로 변경 내용을 컴퓨팅할 수 없습니다.", + "loc.messages.CommitDiffEqual": "변경 내용을 찾을 수 없습니다. 지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋과 같습니다.", + "loc.messages.FetchLatestPublishRelease": "게시된 최신 릴리스를 페치하는 중...", + "loc.messages.FetchLatestNonDraftRelease": "초안이 아닌 최신 릴리스를 가져오는 중...", + "loc.messages.FetchLastReleaseByTag": "태그 패턴과 일치하는 최신 릴리스를 가져오는 중: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "게시된 최신 릴리스 %s을(를) 찾았습니다.", + "loc.messages.FetchMatchingReleaseSuccess": "초안이 아닌 최신 릴리스를 찾음", + "loc.messages.FetchTagMatchingReleaseSuccess": "태그 패턴과 일치하는 최신 릴리스를 찾음: %s", + "loc.messages.GetLatestReleaseError": "게시된 최신 릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.NoLatestPublishRelease": "리포지토리에 게시된 릴리스가 아직 없습니다.", + "loc.messages.NoMatchingReleases": "초안이 아닌 릴리스를 찾을 수 없습니다.", + "loc.messages.NoTagMatchingReleases": "태그 패턴 %s과(와) 일치하는 릴리스를 찾을 수 없습니다. ", + "loc.messages.FetchCommitDiff": "마지막으로 게시된 릴리스 이후 커밋 목록을 페치하는 중...", + "loc.messages.FetchCommitDiffSuccess": "변경 내용 목록을 찾았습니다.", + "loc.messages.FetchCommitDiffError": "변경 내용 목록을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.FetchInitialCommit": "초기 커밋을 페치하는 중...", + "loc.messages.FetchInitialCommitSuccess": "초기 커밋 %s을(를) 찾았습니다.", + "loc.messages.InvalidGitHubEndpoint": "GitHub 서비스 엔드포인트 %s이(가) 잘못되었습니다.", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 서비스 연결 체계 %s이(가) 잘못되었습니다. OAuth 및 GitHub 개인용 액세스 토큰 연결만 허용됩니다.", + "loc.messages.FetchInitialCommitError": "초기 커밋을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.InvalidActionSet": "%s 작업이 잘못되었습니다. 'create', 'edit' 또는 'delete' 작업만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidTagSource": "태그 소스 %s이(가) 잘못되었습니다. 'gitTag' 또는 'userSpecifiedTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidReleaseNotesSource": "릴리스 정보 소스 %s이(가) 잘못되었습니다. 'filePath' 또는 'inline' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidCompareWithAttribute": "compareWith 특성 %s이(가) 잘못되었습니다. 'lastFullRelease, 'lastNonDraftRelease' 또는 'lastNonDraftReleaseByTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidAssetUploadMode": "자산 업로드 모드 %s이(가) 잘못되었습니다. 'delete' 또는 'replace' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 작업에는 태그가 필요합니다. 단계에서 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredCreateAction": "태그 소스가 userSpecifiedTag로 설정되었습니다. create 작업의 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.NoFileFoundMatchingPattern": "'%s'과(와) 일치하는 파일이 없습니다. 업로드할 파일이 없습니다.", + "loc.messages.PatternIsADirectory": "'%s'은(는) 디렉터리이므로 업로드할 수 없습니다. 파일을 지정하세요.", + "loc.messages.SearchingFileMatchingPattern": "'%s'과(와) 일치하는 파일을 검색 중입니다.", + "loc.messages.IssuesFetchError": "문제를 가져오는 동안 오류가 발생했습니다. 변경 로그를 생성할 수 없습니다.", + "loc.messages.NoIssuesLinkedError": "지정된 커밋 Diff에서 커밋에 연결된 문제가 없습니다.", + "loc.messages.LabelsSyntaxError": "레이블의 구문을 분석하는 동안 오류가 발생했습니다. Yaml 구문에 대해서는 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 특성 %s이(가) 잘못되었습니다. 'commitBased' 또는 'issueBased' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.ChangeLogTitle": "변경 내용", + "loc.messages.DefaultCategory": "기타", + "loc.messages.SeeMoreText": "자세히 보기" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..dea78196147e --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Выпуск GitHub", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/AA3aeiw)", + "loc.description": "Создание, изменение или удаление выпуска GitHub", + "loc.instanceNameFormat": "Выпуск GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Конфигурация журнала изменений", + "loc.input.label.gitHubConnection": "Подключение GitHub (OAuth или личный маркер доступа)", + "loc.input.help.gitHubConnection": "Укажите имя подключения службы GitHub, которое будет использоваться для подключения к репозиторию GitHub. Подключение должно быть основано на личном маркере доступа или OAuth пользователя GitHub. Дополнительные сведения о подключениях служб см. [здесь](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Репозиторий", + "loc.input.help.repositoryName": "Укажите имя репозитория GitHub, в котором будет создан, изменен или удален выпуск GitHub.", + "loc.input.label.action": "Действие", + "loc.input.help.action": "Укажите тип выполняемой операции выпуска. Эта задача может создавать, изменять или удалять выпуск GitHub.", + "loc.input.label.target": "Целевой объект", + "loc.input.help.target": "Укажите SHA фиксации, для которого будет создан выпуск GitHub. Например, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Здесь также можно использовать переменную. Например, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Источник тегов", + "loc.input.help.tagSource": "Укажите тег, который будет использоваться для создания выпуска. Параметр \"Тег Git\" автоматически принимает тег, связанный с фиксацией Git. Для указания тега вручную используйте параметр \"Тег, указанный пользователем\".", + "loc.input.label.tagPattern": "Шаблон тега", + "loc.input.help.tagPattern": "Укажите шаблон тега Git с помощью регулярного выражения (например, release-v1.*). Выпуск GitHub будет создан только для фиксаций с соответствующим тегом Git. ", + "loc.input.label.tag": "Тег", + "loc.input.help.tag": "Укажите тег, для которого требуется создать, изменить или удалить выпуск. Здесь также можно использовать переменную. Например, \"$(myTagName)\".", + "loc.input.label.title": "Название выпуска", + "loc.input.help.title": "Укажите название выпуска GitHub. Если оставить параметр пустым, в качестве названия выпуска будет использоваться тег.", + "loc.input.label.releaseNotesSource": "Источник заметок о выпуске", + "loc.input.help.releaseNotesSource": "Укажите описание выпуска GitHub. Используйте параметр \"Файл заметок о выпуске\", чтобы использовать содержимое файла в качестве заметок о выпуске. Используйте параметр \"Встроенные заметки о выпуске\", чтобы вручную ввести заметки о выпуске.", + "loc.input.label.releaseNotesFilePath": "Путь к файлу заметок о выпуске", + "loc.input.help.releaseNotesFilePath": "Выберите файл, содержащий заметки о выпуске.", + "loc.input.label.releaseNotesInline": "Заметки о выпуске", + "loc.input.help.releaseNotesInline": "Введите здесь примечания к выпуску. Markdown поддерживается.", + "loc.input.label.assets": "Ресурсы", + "loc.input.help.assets": "Укажите файлы, которые будут отправлены в качестве ресурсов выпуска. Для указания нескольких файлов можно использовать подстановочные знаки. Например, для конвейеров сборки, \"$(Build.ArtifactStagingDirectory)/*.zip\" или в случае конвейеров выпуска \"$(System.DefaultWorkingDirectory)/*.zip\". Также можно указать несколько шаблонов — по одному на строку. По умолчанию будут отправлены все файлы в каталоге $(Build.ArtifactStagingDirectory). Чтобы получить дополнительные сведения о списке доступных предварительно заданных переменных, см. [переменные сборки](https://aka.ms/AA4449z) и [переменные выпуска](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Режим отправки активов", + "loc.input.help.assetUploadMode": "Используйте параметр \"Удалить существующие ресурсы\", чтобы сначала удалить все существующие ресурсы в выпуске, а затем отправить все ресурсы. Используйте параметр \"Заменить существующие ресурсы\", чтобы заменить все ресурсы с одинаковыми именами.", + "loc.input.label.isDraft": "Черновик выпуска", + "loc.input.help.isDraft": "Укажите, следует ли сохранять выпуск в виде черновика (неопубликованным). Если задано значение false, выпуск будет опубликован.", + "loc.input.label.isPreRelease": "Предварительный выпуск", + "loc.input.help.isPreRelease": "Укажите, следует ли помечать выпуск как предварительную версию.", + "loc.input.label.addChangeLog": "Добавить журнал изменений", + "loc.input.help.addChangeLog": "Если задано значение \"true\", будет создан список изменений (фиксации и проблемы) между этим и последним опубликованным выпуском, который будет добавлен к заметкам о выпуске.", + "loc.input.label.changeLogCompareToRelease": "Сравнить с", + "loc.input.help.changeLogCompareToRelease": "Укажите, с каким выпуском следует проводить сравнение, чтобы создать журнал изменений. \n\"Последний полный выпуск\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, который не помечен как предварительный.\n\"Последний выпуск, отличный от чернового\": сравнивает текущий выпуск с самым последним выпуском, отличным от чернового.\n\"Последний выпуск по тегу, отличный от чернового\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, соответствующим указанному тегу. Кроме того, вместо точного тега можно указать регулярное выражение.", + "loc.input.label.changeLogCompareToReleaseTag": "Тег выпуска", + "loc.input.help.changeLogCompareToReleaseTag": "Укажите регулярное выражение для тега выпуска. Выпуск, соответствующий этому тегу, будет использоваться в качестве основы для расчета журнала изменений.", + "loc.input.label.changeLogType": "Тип журнала изменений", + "loc.input.help.changeLogType": "Журнал изменений может быть основан на фиксациях или вопросах. Журнал изменений на основе фиксаций содержит все фиксации, включенные в выпуск, а журнал изменений на основе вопросов содержит список всех вопросов или запросов на вытягивание, включенных в выпуск. ", + "loc.input.label.changeLogLabels": "Категории", + "loc.input.help.changeLogLabels": "С помощью этого можно классифицировать изменения на основе метки, связанной с вопросом или запросом на вытягивание. Для метки можно указать отображаемое имя категории и состояние вопроса. Например, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Если изменение имеет несколько меток, приоритет имеет первая указанная метка. Оставьте это поле пустым, чтобы просмотреть плоский список вопросов или запросов на вытягивание.", + "loc.messages.GithubApiFailError": "Произошла непредвиденная ошибка.", + "loc.messages.GetTagsError": "При получении тегов произошла непредвиденная ошибка.", + "loc.messages.GetReleasesError": "При получении выпусков произошла непредвиденная ошибка.", + "loc.messages.CreateReleaseError": "При создании выпуска произошла непредвиденная ошибка.", + "loc.messages.EditReleaseError": "При изменении выпуска произошла непредвиденная ошибка.", + "loc.messages.DeleteReleaseError": "При удалении выпуска произошла непредвиденная ошибка.", + "loc.messages.CreatingRelease": "Создание выпуска для тега: %s", + "loc.messages.CreateReleaseSuccess": "Выпуск успешно создан в %s", + "loc.messages.ReleaseAlreadyExists": "Не удалось создать выпуск. Выпуск уже существует для тега: %s", + "loc.messages.EditingRelease": "Редактирование выпуска с тегом: %s", + "loc.messages.EditReleaseSuccess": "Выпуск успешно изменен", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Не найден существующий выпуск для изменения. Создание ресурса с тегом: %s", + "loc.messages.DeletingRelease": "Удаление выпуска для тега: %s", + "loc.messages.DeleteReleaseSuccess": "Выпуск успешно удален.", + "loc.messages.NoReleaseFoundToDelete": "Не найден выпуск для тега: %s. Не удалось удалить выпуск.", + "loc.messages.FetchReleaseForTag": "Получение выпуска для тега: %s", + "loc.messages.FetchReleaseForTagSuccess": "Найден выпуск для тега: %s", + "loc.messages.FetchTagForTarget": "Поиск тегов, связанных с целевой фиксацией: %s", + "loc.messages.FetchTagForTargetSuccess": "Найден тег для целевой фиксации: %s", + "loc.messages.MissingAssetError": "Файл не найден: %s", + "loc.messages.MultipleReleasesFoundError": "Ожидался только 1 выпуск, но обнаружено больше 1 выпуска для тега: %s. Не удалось выполнить действие.", + "loc.messages.MultipleTagFound": "Ожидался только 1 тег, но обнаружено больше 1 тега для заданной фиксации: %s. Не удалось выполнить действие.", + "loc.messages.NoTagFound": "Выпуск не будет создан, так как теги для целевой фиксации не совпадают с заданным шаблоном тега", + "loc.messages.DeleteAllExistingAssets": "Идет удаление всех существующих ресурсов...", + "loc.messages.DuplicateAssetFound": "Обнаружен повторяющийся ресурс: %s", + "loc.messages.AssetsDeletedSuccessfully": "Ресурсы успешно удалены.", + "loc.messages.DeletingDuplicateAsset": "Удаление повторяющегося ресурса: %s", + "loc.messages.SkipDuplicateAssetFound": "Обнаружен дублирующийся ресурс: %s. Пропуск...", + "loc.messages.AssetDeletedSuccessfully": "Ресурс %s успешно удален", + "loc.messages.AllAssetsUploadedSuccessfully": "Все активы успешно отправлены.", + "loc.messages.ErrorDeletingDuplicateAsset": "При удалении повторяющегося ресурса произошла непредвиденная ошибка: %s", + "loc.messages.ErrorDeletingAsset": "Произошла непредвиденная ошибка при удалении ресурса: %s", + "loc.messages.DeletingAsset": "Удаление ресурса: %s", + "loc.messages.NoAssetFoundToDelete": "Не найдены ресурсы для удаления.", + "loc.messages.UploadingAssets": "Идет отправка ресурсов...", + "loc.messages.UploadingAsset": "Идет отправка файла: \"%s\".", + "loc.messages.UploadAssetError": "При загрузке файла сертификата возникла непредвиденная ошибка: %s", + "loc.messages.UploadAssetSuccess": "Файл успешно отправлен: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Не найдены ресурсы для отправки.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Файл заметок о выпуске %s является каталогом, а не файлом.", + "loc.messages.AssetIsDirectoryError": "Ресурс является каталогом, а не файлом. Пропуск отправки каталога: %s", + "loc.messages.ComputingChangeLog": "Вычисление изменений, внесенных в этом выпуске...", + "loc.messages.ComputingChangeLogSuccess": "Изменения успешно вычислены.", + "loc.messages.CommitDiffBehind": "Не удается вычислить изменения, так как указанная целевая фиксация старше фиксации последнего опубликованного выпуска.", + "loc.messages.CommitDiffEqual": "Изменения не найдены. Указанная целевая фиксация совпадает с фиксацией последнего опубликованного выпуска.", + "loc.messages.FetchLatestPublishRelease": "Получение последнего опубликованного выпуска...", + "loc.messages.FetchLatestNonDraftRelease": "Получение последнего выпуска, отличного от чернового...", + "loc.messages.FetchLastReleaseByTag": "Получение последнего выпуска, соответствующего шаблону тега: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Найден последний опубликованный выпуск: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Найден последний выпуск, отличный от чернового", + "loc.messages.FetchTagMatchingReleaseSuccess": "Найдена последняя версия, соответствующая шаблону тега: %s", + "loc.messages.GetLatestReleaseError": "При получении последнего опубликованного выпуска произошла непредвиденная ошибка.", + "loc.messages.NoLatestPublishRelease": "Пока нет выпусков, опубликованных в репозитории.", + "loc.messages.NoMatchingReleases": "Выпуски, отличные от черновых, не найдены.", + "loc.messages.NoTagMatchingReleases": "Не найдены выпуски, соответствующие шаблону тега: %s ", + "loc.messages.FetchCommitDiff": "Получение списка фиксаций со времени последнего опубликованного выпуска...", + "loc.messages.FetchCommitDiffSuccess": "Найден список изменений.", + "loc.messages.FetchCommitDiffError": "При получении списка изменений произошла непредвиденная ошибка.", + "loc.messages.FetchInitialCommit": "Получение начальной фиксации...", + "loc.messages.FetchInitialCommitSuccess": "Найдена начальная фиксация: %s", + "loc.messages.InvalidGitHubEndpoint": "Недопустимая конечная точка службы GitHub: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Недопустимая схема подключения службы GitHub: %s. Разрешены только соединения с личным маркером доступа GitHub и OAuth.", + "loc.messages.FetchInitialCommitError": "При получении начальной фиксации произошла непредвиденная ошибка.", + "loc.messages.InvalidActionSet": "Недопустимое действие: %s. Разрешены только действия \"create\", \"edit\" или \"delete\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Недопустимый источник тегов: %s. Разрешены только параметры gitTag или userSpecifiedTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Недопустимый источник заметок о выпуске: %s. Разрешены только параметры filePath и inline. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Недопустимый атрибут compareWith: %s. Разрешены только параметры lastFullRelease, lastNonDraftRelease или lastNonDraftReleaseByTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Недопустимый режим отправки ресурса: %s. Разрешены только параметры \"delete\" и \"replace\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Для действия \"%s\" требуется тег. Укажите тег в шаге. Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Для источника тегов задан параметр userSpecifiedTag, укажите тег для действия create. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Не найдены файлы, соответствующие \"%s\". Нет элементов для отправки.", + "loc.messages.PatternIsADirectory": "Не удается отправить \"%s\", так как это каталог. Укажите файл.", + "loc.messages.SearchingFileMatchingPattern": "Поиск файлов, соответствующих \"%s\".", + "loc.messages.IssuesFetchError": "Ошибка при получении вопросов. Не удается создать журнал изменений.", + "loc.messages.NoIssuesLinkedError": "Нет вопросов, связанных с фиксациями в указанном инструменте сравнения фиксаций.", + "loc.messages.LabelsSyntaxError": "При синтаксическом анализе меток произошла ошибка. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Недопустимый атрибут ChangeLogType: %s. Разрешены только параметры commitBased или issueBased. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Изменения", + "loc.messages.DefaultCategory": "Другие", + "loc.messages.SeeMoreText": "Дополнительные сведения" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..9c26118556c3 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 发布", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/AA3aeiw)", + "loc.description": "创建、编辑或删除 GitHub 发布", + "loc.instanceNameFormat": "GitHub 发布($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog 配置", + "loc.input.label.gitHubConnection": "GitHub 连接(OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定要用于连接到 GitHub 存储库的 GitHub 服务连接的名称。该连接必须基于 GitHub 用户的 OAuth 或 GitHub 个人访问令牌。可在[此处](https://aka.ms/AA3am5s)详细了解服务连接。", + "loc.input.label.repositoryName": "存储库", + "loc.input.help.repositoryName": "指定将在其中创建、编辑或删除 GitHub 发布的 GitHub 存储库的名称。", + "loc.input.label.action": "操作", + "loc.input.help.action": "指定要执行的发布操作的类型。此任务可以创建、编辑或删除 GitHub 发布。", + "loc.input.label.target": "目标", + "loc.input.help.target": "指定将为其创建 GitHub 发布的提交 SHA。例如 `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。还可以在此处使用变量。例如 `$(myCommitSHA)`。", + "loc.input.label.tagSource": "标记源", + "loc.input.help.tagSource": "指定要用于发布创建的标记。“Git 标记”选项会自动接受与 Git 提交关联的标记。使用“用户指定的标记”选项手动提供标记。", + "loc.input.label.tagPattern": "标记模式", + "loc.input.help.tagPattern": "使用正则表达式(如 `release-v1.*`)指定 git 标记模式。仅将针对具有匹配 git 标记的提交创建 GitHub 发布。", + "loc.input.label.tag": "标记", + "loc.input.help.tag": "指定要为其创建、编辑或删除发布的标记。还可以在此处使用变量。例如 `$(myTagName)`。", + "loc.input.label.title": "发布标题", + "loc.input.help.title": "指定 GitHub 发布的标题。如果留空,则将使用标记作为发布标题。", + "loc.input.label.releaseNotesSource": "发行说明源", + "loc.input.help.releaseNotesSource": "指定 GitHub 发布的说明。使用“发行说明文件”选项将文件内容用作发行说明。使用“内联发行说明”选项手动输入发行说明。", + "loc.input.label.releaseNotesFilePath": "发行说明文件路径", + "loc.input.help.releaseNotesFilePath": "选择包含发行说明的文件。", + "loc.input.label.releaseNotesInline": "发行说明", + "loc.input.help.releaseNotesInline": "在此处输入发行说明。支持 Markdown。", + "loc.input.label.assets": "资产", + "loc.input.help.assets": "指定要作为发布的资产进行上传的文件。可以使用通配符指定多个文件。例如,对于生成管道,可以指定 `$(Build.ArtifactStagingDirectory)/*.zip`,对于发布管道,可以指定 `$(System.DefaultWorkingDirectory)/*.zip`。还可以指定多个模式 - 每行一个。默认情况下,将上传 $(Build.ArtifactStagingDirectory) 目录中的所有文件。若要了解有关可用预定义变量列表的详细信息,请参阅[生成变量](https://aka.ms/AA4449z)和[发布变量](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "资产上传模式", + "loc.input.help.assetUploadMode": "使用“删除现有资产”选项首先删除发布中的任何现有资产,然后上传所有资产。使用“替换现有资产”选项替换具有相同名称的任何资产。", + "loc.input.label.isDraft": "草稿发布", + "loc.input.help.isDraft": "指示是否应将发布另存为草稿(未发布)。如果为 `false`,则发布此发布。", + "loc.input.label.isPreRelease": "预发布", + "loc.input.help.isPreRelease": "指示是否应将发布标记为预发布。", + "loc.input.label.addChangeLog": "添加更改日志", + "loc.input.help.addChangeLog": "如果设置为 `true`,则将生成此发布与上次发布的发布之间的更改(提交和问题)列表,并追加到发行说明。", + "loc.input.label.changeLogCompareToRelease": "比较对象", + "loc.input.help.changeLogCompareToRelease": "指示应与哪个版本比较以生成更改日志: \n最新完整版本: 将当前版本与未标记为预发布的最新非草稿版本进行比较。\n最新非草稿版本: 将当前版本与最新非草稿版本进行比较。\n按标记排序的最新非草稿版本: 将当前版本与最新非草稿版本(与指定标记匹配)进行比较。还可以指定一个正则表达式而非确切的标记。", + "loc.input.label.changeLogCompareToReleaseTag": "发布标记", + "loc.input.help.changeLogCompareToReleaseTag": "指定发布标记的正则表达式。与此标记匹配的版本将用作 changelog 计算的基础。", + "loc.input.label.changeLogType": "Changelog 类型", + "loc.input.help.changeLogType": "Changelog 可以基于提交或基于问题。基于提交的 changelog 列出版本中包含的所有提交,而基于问题的 changelog 列出该版本中包含的所有问题/拉取请求。", + "loc.input.label.changeLogLabels": "类别", + "loc.input.help.changeLogLabels": "使用此项,可根据与问题/PR 相关的标签对更改进行分类。对于标签,可提及类别的显示名称和问题状态。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果某更改具有多个标签,则优先采用第一个指定的标签。将此字段留空,以查看问题/PR 的简单列表。", + "loc.messages.GithubApiFailError": "发生意外错误。", + "loc.messages.GetTagsError": "提取标记时出现意外错误。", + "loc.messages.GetReleasesError": "提取发布时出现意外错误。", + "loc.messages.CreateReleaseError": "创建发布时出现意外错误。", + "loc.messages.EditReleaseError": "编辑发布时出现意外错误。", + "loc.messages.DeleteReleaseError": "删除发布时出现意外错误。", + "loc.messages.CreatingRelease": "正在创建标记的发布: %s", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功创建发布", + "loc.messages.ReleaseAlreadyExists": "未能创建发布。已存在以下标记的发布: %s", + "loc.messages.EditingRelease": "正在使用以下标记编辑发布: %s", + "loc.messages.EditReleaseSuccess": "已成功编辑发布", + "loc.messages.NoReleaseFoundToEditCreateRelease": "未找到要编辑的现有发布。请使用以下标记创建一个发布: %s", + "loc.messages.DeletingRelease": "正在删除标记的发布: %s", + "loc.messages.DeleteReleaseSuccess": "已成功删除版本。", + "loc.messages.NoReleaseFoundToDelete": "未找到以下标记的任何发布: %s。删除发布失败。", + "loc.messages.FetchReleaseForTag": "正在提取以下标记的发布: %s", + "loc.messages.FetchReleaseForTagSuccess": "已找到以下标记的发布: %s", + "loc.messages.FetchTagForTarget": "正在搜索与目标提交相关的标记: %s", + "loc.messages.FetchTagForTargetSuccess": "已找到目标提交的标记: %s", + "loc.messages.MissingAssetError": "找不到文件: %s", + "loc.messages.MultipleReleasesFoundError": "应仅为 1 个发布,但为标记 %s 找到多个发布。无法执行该操作。", + "loc.messages.MultipleTagFound": "应仅为 1 个标记,但为给定提交 %s 找到多个标记。无法执行该操作。", + "loc.messages.NoTagFound": "将不会创建发布,因为目标提交的标记与给定的标记模式不匹配", + "loc.messages.DeleteAllExistingAssets": "正在删除所有现有资产...", + "loc.messages.DuplicateAssetFound": "找到重复资产: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功删除资产。", + "loc.messages.DeletingDuplicateAsset": "正在删除重复资产: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重复资产: %s。正在跳过...", + "loc.messages.AssetDeletedSuccessfully": "资产 %s 已成功删除", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上传所有资产。", + "loc.messages.ErrorDeletingDuplicateAsset": "删除重复资产时出现意外错误: %s", + "loc.messages.ErrorDeletingAsset": "删除资产时出现意外错误: %s", + "loc.messages.DeletingAsset": "正在删除资产: %s", + "loc.messages.NoAssetFoundToDelete": "未找到要删除的资产。", + "loc.messages.UploadingAssets": "正在上传资产...", + "loc.messages.UploadingAsset": "正在上传文件:“%s”。", + "loc.messages.UploadAssetError": "上传文件时出现意外错误: %s", + "loc.messages.UploadAssetSuccess": "已成功上传文件:“%s”", + "loc.messages.NoAssetFoundToUpload": "未找到要上传的资产。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "发行说明文件 %s 是目录,而不是文件。", + "loc.messages.AssetIsDirectoryError": "资产是目录,而不是文件。正在跳过上传目录: %s", + "loc.messages.ComputingChangeLog": "正在计算此发布中所做的更改...", + "loc.messages.ComputingChangeLogSuccess": "已成功计算更改。", + "loc.messages.CommitDiffBehind": "无法计算更改,因为所提供的目标提交早于上次发行版的提交。", + "loc.messages.CommitDiffEqual": "未找到任何更改。提供的目标提交与上次发行版的提交相同。", + "loc.messages.FetchLatestPublishRelease": "正在提取最新发布的发布...", + "loc.messages.FetchLatestNonDraftRelease": "正在提取最新非草稿版本…", + "loc.messages.FetchLastReleaseByTag": "正在提取与标记模式匹配的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "已找到最新发布的发布: %s", + "loc.messages.FetchMatchingReleaseSuccess": "已找到最新非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "已找到与标记模式匹配的最新版本: %s", + "loc.messages.GetLatestReleaseError": "提取最新发布的发布时出现意外错误。", + "loc.messages.NoLatestPublishRelease": "存储库中尚未发布任何发布。", + "loc.messages.NoMatchingReleases": "未找到非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到与标记模式匹配的版本: %s", + "loc.messages.FetchCommitDiff": "正在提取自上次发布的发布以来的提交列表...", + "loc.messages.FetchCommitDiffSuccess": "已找到更改列表。", + "loc.messages.FetchCommitDiffError": "提取更改列表时出现意外错误。", + "loc.messages.FetchInitialCommit": "正在提取初始提交...", + "loc.messages.FetchInitialCommitSuccess": "已找到初始提交: %s", + "loc.messages.InvalidGitHubEndpoint": "无效的 GitHub 服务终结点: %s。", + "loc.messages.InvalidEndpointAuthScheme": "无效的 GitHub 服务连接方案: %s。仅允许 OAuth 和 GitHub 个人访问令牌连接。", + "loc.messages.FetchInitialCommitError": "提取初始提交时出现意外错误。", + "loc.messages.InvalidActionSet": "无效的操作: %s。仅允许“创建”、“编辑”或“删除”操作。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "无效的标记源: %s。仅允许 \"gitTag\" 或 \"userSpecifiedTag\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "无效的发行说明源: %s。仅允许 \"filePath\" 或 \"inline\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "无效的 compareWith 属性: %s。仅允许 \"lastFullRelease\"、\"lastNonDraftRelease\" 或 \"lastNonDraftReleaseByTag\" 选项。对于 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "无效的资产上传模式: %s。仅允许“删除”或“替换”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "对于“%s”操作,标记是必需的。请在步骤中指定一个标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "标记源设置为 userSpecifiedTag- 请指定创建操作的标记。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "未找到与“%s”匹配的文件。没有要上传的内容。", + "loc.messages.PatternIsADirectory": "无法上传“%s”,因为它是一个目录。请指定一个文件。", + "loc.messages.SearchingFileMatchingPattern": "正在搜索匹配“%s”的文件。", + "loc.messages.IssuesFetchError": "提取问题时出错。无法生成更改日志。", + "loc.messages.NoIssuesLinkedError": "在指定提交差异中,未将任何问题链接到提交。", + "loc.messages.LabelsSyntaxError": "分析标签时出错。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "无效的 ChangeLogType 属性: %s。仅允许 \"commitBased\" 或 \"issueBased\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "更改", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..61b28f935013 --- /dev/null +++ b/_generated/GitHubReleaseV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 版本", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/AA3aeiw)", + "loc.description": "建立、編輯或刪除 GitHub 版本", + "loc.instanceNameFormat": "GitHub 版本 ($(action))", + "loc.group.displayName.changeLogConfiguration": "變更記錄組態", + "loc.input.label.gitHubConnection": "GitHub 連線 (OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定用來連線到 GitHub 存放庫的 GitHub 服務連線名稱。該連線必須根據 GitHub 使用者的 OAuth 或 GitHub 個人存取權杖來進行。若要深入了解服務連線,請前往 [這裡](https://aka.ms/AA3am5s)。", + "loc.input.label.repositoryName": "存放庫", + "loc.input.help.repositoryName": "指定建立、編輯或刪除 GitHub 版本所在的 GitHub 存放庫名稱。", + "loc.input.label.action": "動作", + "loc.input.help.action": "指定要執行的版本作業類型。這項工作可以建立、編輯或刪除 GitHub 版本。", + "loc.input.label.target": "目標", + "loc.input.help.target": "指定要建立 GitHub 版本的認可 SHA。例如 '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'。您也可以在這裡使用變數。例如 '$(myCommitSHA)'。", + "loc.input.label.tagSource": "標籤來源", + "loc.input.help.tagSource": "指定要用來建立版本的標籤。[Git 標籤] 選項會自動使用與 Git 認可建立關聯的標籤。使用 [使用者指定的標籤] 可手動提供標籤。", + "loc.input.label.tagPattern": "標籤模式", + "loc.input.help.tagPattern": "使用 Regex (例如 `release-v1.*`) 指定 git 標籤模式。僅針對具有相符 git 標籤的認可建立 GitHub 版本。", + "loc.input.label.tag": "標籤", + "loc.input.help.tag": "指定要建立、編輯或刪除版本的標籤。您也可以在這裡使用變數。例如 '$(myTagName)'。", + "loc.input.label.title": "版本標題", + "loc.input.help.title": "指定 GitHub 版本的標題。如果保留空白,將使用標籤作為版本標題。", + "loc.input.label.releaseNotesSource": "版本資訊來源", + "loc.input.help.releaseNotesSource": "指定 GitHub 版本的描述。使用 [版本資訊檔案] 選項可使用檔案內容作為版本資訊。使用 [內嵌版本資訊] 選項可手動輸入版本資訊。", + "loc.input.label.releaseNotesFilePath": "版本資訊檔案路徑", + "loc.input.help.releaseNotesFilePath": "選取包含版本資訊的檔案。", + "loc.input.label.releaseNotesInline": "版本資訊", + "loc.input.help.releaseNotesInline": "請在這裡輸入版本資訊。支援 Markdown。", + "loc.input.label.assets": "資產", + "loc.input.help.assets": "指定要上傳為版本資產的檔案。您可以使用萬用字元來指定多個檔案。例如若為建置管線,請使用 `$(Build.ArtifactStagingDirectory)/*.zip`; 若為發行管線,請使用 `$(System.DefaultWorkingDirectory)/*.zip`。您也可以指定多個模式,每行指定一個。根據預設會上傳 $(Build.ArtifactStagingDirectory) 目錄中的所有檔案。若要深入了解可用預先定義變數的清單,請參閱 [建置變數](https://aka.ms/AA4449z) 和 [發行變數](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "資產上傳模式", + "loc.input.help.assetUploadMode": "使用 [刪除現有的資產] 選項可先刪除版本中任何現有的資產,再上傳所有資產。使用 [取代現有的資產] 選項可取代同名的所有資產。", + "loc.input.label.isDraft": "草稿版本", + "loc.input.help.isDraft": "指出是否應將版本儲存為草稿 (未發佈)。如果是 'false',將會發佈版本。", + "loc.input.label.isPreRelease": "發行前版本", + "loc.input.help.isPreRelease": "指出是否應將版本標記為發行前版本。", + "loc.input.label.addChangeLog": "新增變更記錄", + "loc.input.help.addChangeLog": "如果設定為 'true',將會產生此版本和上次所發佈版本間變更 (認可和問題) 的清單,並附加到版本資訊。", + "loc.input.label.changeLogCompareToRelease": "比較對象", + "loc.input.help.changeLogCompareToRelease": "指出應比較的版本以產生變更記錄: \n最後完整版本: 比較目前版本與未標示為發行前版本的最新非草稿版本。\n最後非草稿版本: 比較目前版本與最新的非草稿版本。\n依標籤決定的最後非草稿版本: 比較目前版本與符合指定標籤的最後非草稿版本。您也可以指定 Regex,而不指定具體的標籤。", + "loc.input.label.changeLogCompareToReleaseTag": "版本標籤", + "loc.input.help.changeLogCompareToReleaseTag": "指定 Regex 為版本標籤。符合此標籤的版本會用作變更記錄計算的基底。", + "loc.input.label.changeLogType": "變更記錄類型", + "loc.input.help.changeLogType": "變更記錄可依據認可或問題來進行記錄。以認可為依據的變更記錄,會列出版本內含的所有認可,而以問題為依據的變更記錄,則會列出版本內含的所有問題/提取要求。", + "loc.input.label.changeLogLabels": "類別", + "loc.input.help.changeLogLabels": "使用此項即可依據與問題/pr 建立關聯的標籤將變更分類。針對標籤,您可以提及類別的顯示名稱及問題的狀態。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果變更有多個標籤,則優先使用第一個指定的標籤。此欄位請保留空白,以查看問題/pr 的簡單列表。", + "loc.messages.GithubApiFailError": "發生未預期的錯誤。", + "loc.messages.GetTagsError": "擷取標籤時發生未預期的錯誤。", + "loc.messages.GetReleasesError": "擷取版本時發生未預期的錯誤。", + "loc.messages.CreateReleaseError": "建立版本時發生未預期的錯誤。", + "loc.messages.EditReleaseError": "編輯版本時發生未預期的錯誤。", + "loc.messages.DeleteReleaseError": "刪除版本時發生未預期的錯誤。", + "loc.messages.CreatingRelease": "正在建立標籤 %s 的版本", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功建立版本", + "loc.messages.ReleaseAlreadyExists": "無法建立版本。已有標籤 %s 的版本", + "loc.messages.EditingRelease": "正在編輯標籤為 %s 的版本", + "loc.messages.EditReleaseSuccess": "已成功編輯版本", + "loc.messages.NoReleaseFoundToEditCreateRelease": "找不到任何要編輯的現有版本。正在使用標籤 %s 建立一個", + "loc.messages.DeletingRelease": "正在刪除標籤 %s 的版本", + "loc.messages.DeleteReleaseSuccess": "已成功刪除版本。", + "loc.messages.NoReleaseFoundToDelete": "找不到標籤 %s 的版本。刪除版本失敗。", + "loc.messages.FetchReleaseForTag": "正在擷取標籤 %s 的版本", + "loc.messages.FetchReleaseForTagSuccess": "找到標籤 %s 的版本", + "loc.messages.FetchTagForTarget": "正在搜尋與目標認可 %s 建立關聯的標籤", + "loc.messages.FetchTagForTargetSuccess": "找到目標認可 %s 的標籤", + "loc.messages.MissingAssetError": "找不到檔案: %s", + "loc.messages.MultipleReleasesFoundError": "標籤 %s 只應有 1 個版本,但卻找到多個版本。無法執行此動作。", + "loc.messages.MultipleTagFound": "指定的認可 %s 只應有 1 個標籤,但卻找到多個標籤。無法執行此動作。", + "loc.messages.NoTagFound": "因為目標認可與指定的標籤模式不符,所以不會將版本建立為標籤", + "loc.messages.DeleteAllExistingAssets": "正在刪除所有現有的資產...", + "loc.messages.DuplicateAssetFound": "找到重複的資產: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功刪除資產。", + "loc.messages.DeletingDuplicateAsset": "正在刪除重複的資產: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重複的資產 %s。正在跳過...", + "loc.messages.AssetDeletedSuccessfully": "已成功刪除資產 %s", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上傳所有資產。", + "loc.messages.ErrorDeletingDuplicateAsset": "刪除重複的資產 %s 時發生未預期的錯誤", + "loc.messages.ErrorDeletingAsset": "刪除資產 %s 時發生未預期的錯誤", + "loc.messages.DeletingAsset": "正在刪除資產: %s", + "loc.messages.NoAssetFoundToDelete": "找不到任何要刪除的資產。", + "loc.messages.UploadingAssets": "正在上傳資產...", + "loc.messages.UploadingAsset": "正在上傳檔案: '%s'。", + "loc.messages.UploadAssetError": "上傳檔案 %s 時發生未預期的錯誤", + "loc.messages.UploadAssetSuccess": "已成功上傳檔案: '%s'", + "loc.messages.NoAssetFoundToUpload": "找不到任何要上傳的資產。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "版本資訊檔案 %s 是目錄,而不是檔案。", + "loc.messages.AssetIsDirectoryError": "資產是目錄,而不是檔案。正在跳過目錄的上傳: %s", + "loc.messages.ComputingChangeLog": "正在計算此版本中所做的變更...", + "loc.messages.ComputingChangeLogSuccess": "已成功計算變更。", + "loc.messages.CommitDiffBehind": "因為提供的目標認可比上次所發佈版本的認可舊,所以無法計算變更。", + "loc.messages.CommitDiffEqual": "找不到任何變更。提供的目標認可與上次所發佈版本的認可相同。", + "loc.messages.FetchLatestPublishRelease": "正在擷取最新發佈的版本...", + "loc.messages.FetchLatestNonDraftRelease": "正在擷取最新的非草稿版本...", + "loc.messages.FetchLastReleaseByTag": "正在擷取符合標籤模式的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "找到最新發佈的版本: %s", + "loc.messages.FetchMatchingReleaseSuccess": "找到最新的非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "找到符合標籤模式的最新版本: %s", + "loc.messages.GetLatestReleaseError": "擷取最新發佈的版本時發生未預期的錯誤。", + "loc.messages.NoLatestPublishRelease": "尚未在存放庫中發佈任何版本。", + "loc.messages.NoMatchingReleases": "找不到任何非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到符合標籤模式的版本: %s ", + "loc.messages.FetchCommitDiff": "正在擷取自上次所發佈版本之後的認可清單...", + "loc.messages.FetchCommitDiffSuccess": "找到變更清單。", + "loc.messages.FetchCommitDiffError": "擷取變更清單時發生未預期的錯誤。", + "loc.messages.FetchInitialCommit": "正在擷取初始認可...", + "loc.messages.FetchInitialCommitSuccess": "找到初始認可: %s", + "loc.messages.InvalidGitHubEndpoint": "GitHub 服務端點 %s 無效。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 服務連線配置 %s 無效。僅允許 OAuth 和 GitHub 個人存取權杖連線。", + "loc.messages.FetchInitialCommitError": "擷取初始認可時發生未預期的錯誤。", + "loc.messages.InvalidActionSet": "動作 %s 無效。僅允許 'create'、'edit' 或 'delete' 動作。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "標籤來源無效: %s。僅允許 'gitTag' 或 'userSpecifiedTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "版本資訊來源無效: %s。僅允許 'filePath' 或 'inline' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 屬性無效: %s。僅允許 'lastFullRelease'、'lastNonDraftRelease' 或 'lastNonDraftReleaseByTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "資產上傳模式 %s 無效。僅允許 'delete' 或 'replace' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 動作需有標籤。請在此步驟中指定標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "標籤來源已設定為 userSpecifiedTag-,請指定建立動作的標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "找不到符合 '%s' 的檔案。沒有要上傳的項目。", + "loc.messages.PatternIsADirectory": "因為 '%s' 是目錄,所以無法予以上傳。請指定檔案。", + "loc.messages.SearchingFileMatchingPattern": "正在搜尋符合 '%s' 的檔案。", + "loc.messages.IssuesFetchError": "擷取問題時發生錯誤。無法產生變更記錄。", + "loc.messages.NoIssuesLinkedError": "沒有任何問題連結到指定認可 Diff 中的認可。", + "loc.messages.LabelsSyntaxError": "剖析標籤時發生錯誤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 屬性無效: %s。僅允許 'commitBased' 或 'issueBased' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "變更", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多內容" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/ActionL0Tests.ts b/_generated/GitHubReleaseV1/Tests/ActionL0Tests.ts new file mode 100644 index 000000000000..04ff1bf404cf --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/ActionL0Tests.ts @@ -0,0 +1,25 @@ +import { Action } from "../operations/Action"; + +export class ActionL0Tests { + + public static async startTests() { + await this.validateCreateReleaseAction(); + await this.validateEditReleaseAction(); + await this.validateDeleteReleaseAction(); + } + + public static async validateCreateReleaseAction() { + await new Action().createReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, []); + } + + public static async validateEditReleaseAction() { + await new Action().editReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, [], "id"); + } + + public static async validateDeleteReleaseAction() { + await new Action().deleteReleaseAction("endpoint", "repo", "tag"); + } + +} + +ActionL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/ActionTests.ts b/_generated/GitHubReleaseV1/Tests/ActionTests.ts new file mode 100644 index 000000000000..519bef69bc0f --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/ActionTests.ts @@ -0,0 +1,63 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import * as sinon from 'sinon'; +import { Inputs } from '../operations/Constants'; + +export class ActionTests { + + public static startTest() { + let tp = path.join(__dirname, 'ActionL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.assetUploadMode, "replace"); + + this.stub(tr); + + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + createRelease: async function() { + return { + statusCode: 201, + body: { "upload_url": "url" } + } + }, + editRelease: function() { + return { + statusCode: 200, + body: { "html_url": "url" } + } + }, + deleteRelease: function() { + return { + statusCode: 204 + } + }, + uploadReleaseAsset: function() { + return { + statusCode: 201 + } + } + } + } + }); + + tr.registerMock("./Helper", { + Helper: function () { + return { + getReleaseIdForTag: function() { + return "id"; + } + } + } + }); + } + +} + +ActionTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/ChangeLogL0Tests.ts b/_generated/GitHubReleaseV1/Tests/ChangeLogL0Tests.ts new file mode 100644 index 000000000000..2e6e8057ddde --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/ChangeLogL0Tests.ts @@ -0,0 +1,61 @@ +import { ChangeLog } from "../operations/ChangeLog"; +import { TestString } from "./TestStrings"; +import { ChangeLogStartCommit } from "../operations/Utility"; + +export class ChangeLogL0Tests { + public static async startTests() { + await this.validateGetChangeLog1(); + await this.validateGetChangeLog2(); + await this.validateGetChangeLog3(); + await this.validateGetChangeLog4(); + await this.validateGetChangeLog5(); + await this.validateGetChangeLog6(); + } + + public static async validateGetChangeLog1() { + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "commitBased"); + + if (changes === this.expectedCommitBasedChanges) { + console.log(TestString.getChangeLogKeyword); + } + } + + public static async validateGetChangeLog2() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftRelease, "commitBased"); + } + + public static async validateGetChangeLog3() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftReleaseByTag, "commitBased", "v1.*"); + } + + public static async validateGetChangeLog4(){ + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, []); + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.allIssuesChangeLog); + } + } + + public static async validateGetChangeLog5(){ + let changeLogLabels = `[{"label": "ux", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "bug", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + if (changes === this.expectedIssueBasedChanges) { + console.log(TestString.issueBasedChangeLog); + } + } + + public static async validateGetChangeLog6(){ + let changeLogLabels = `[{"label": "hello", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "nope", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.noCategoryChangeLog); + } + } + + public static readonly expectedCommitBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* xyz Fixing issue #56. [ #9 ]\n* abc Fixing issue #2 #3. [ #4, #5 ]\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedAllIssuesChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* #1: Incorrect color contrast in control panel\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedIssueBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n\n### Closed UX Issues/PRs:\n\n\n* #1: Incorrect color contrast in control panel\n\n### Open Bugs:\n\n\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + +} + +ChangeLogL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/ChangeLogTests.ts b/_generated/GitHubReleaseV1/Tests/ChangeLogTests.ts new file mode 100644 index 000000000000..57020cde2f6c --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/ChangeLogTests.ts @@ -0,0 +1,170 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class ChangeLogTests { + + public static startTest() { + let tp = path.join(__dirname, 'ChangeLogL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + process.env["RELEASE_RELEASEWEBURL"] = "MOCK_RELEASE_URL"; + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Helper", { + Helper: function () { + return { + getCommitShaFromTarget: function() { + return "abc"; + }, + filterTag: function(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]) { + console.log("Tag Name: "+ filterValue); + return { commit: { sha: "abc" } }; + } + } + } + }); + + tr.registerMock("./Release", { + Release: function () { + return { + getLatestRelease: function() { + return { + statusCode: 200, + body: { "tag_name": "tagName" } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + { + "tag_name": "pre_rel", + "prerelease": true, + "draft": false + }, + { + "tag_name": "v1.2", + "prerelease": false, + "draft": false + } + ] + } + }, + getCommitsList: function() { + return { + statusCode: 200, + body: { "commits": [ + {"sha": "abc", "commit": { "message": "Fixing issue #2 #3.\n\n desc #4 GH-5" } }, + {"sha": "xyz", "commit": { "message": "Fixing issue #56.\n\n desc Gh-9" } } + ] } + }; + }, + getIssuesList: function (githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + if (includeLabels) { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + "labels": { + "edges": [ + { + "node": { + "name": "nit" + } + }, + { + "node": { + "name": "bug" + } + } + ] + } + } + } + } + } + } + } + else { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + } + } + } + } + } + } + } + } + } + }); + } +} + +ChangeLogTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/CreateAction2L0Tests.ts b/_generated/GitHubReleaseV1/Tests/CreateAction2L0Tests.ts new file mode 100644 index 000000000000..ebe4e7528bee --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/CreateAction2L0Tests.ts @@ -0,0 +1,48 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "gitTag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCommitTarget: function() { + return null; + }, + publishTelemetry: function() { + + } + } + } + }); + } + + public static sandbox; +} + +CreateAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/CreateActionL0Tests.ts b/_generated/GitHubReleaseV1/Tests/CreateActionL0Tests.ts new file mode 100644 index 000000000000..ca5adfc6434f --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/CreateActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "userSpecifiedTag"); + tr.setInput(Inputs.tag, "tag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCreateAction: function() { + return "v1.0.1"; + }, + publishTelemetry: function() { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called"); // = this.createActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +CreateActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/DeleteAction2L0Tests.ts b/_generated/GitHubReleaseV1/Tests/DeleteAction2L0Tests.ts new file mode 100644 index 000000000000..e32bf396eaae --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/DeleteAction2L0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "Delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteAction2KeyWord) }); + } + + public static sandbox; +} + +DeleteAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/DeleteActionL0Tests.ts b/_generated/GitHubReleaseV1/Tests/DeleteActionL0Tests.ts new file mode 100644 index 000000000000..8c692e965ce8 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/DeleteActionL0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteActionKeyWord) }); + } + + public static sandbox; +} + +DeleteActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/EditAction2L0Tests.ts b/_generated/GitHubReleaseV1/Tests/EditAction2L0Tests.ts new file mode 100644 index 000000000000..b8d23dd0ff34 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/EditAction2L0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return "123"; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + editReleaseAction: () => { + console.log("L0Test: edit release action method should be called when a release is present for given tag"); // = this.editAction2KeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/EditActionL0Tests.ts b/_generated/GitHubReleaseV1/Tests/EditActionL0Tests.ts new file mode 100644 index 000000000000..15ea41e40ba4 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/EditActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return null; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called when no release is present for given tag"); // = this.editActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/HelperL0Tests.ts b/_generated/GitHubReleaseV1/Tests/HelperL0Tests.ts new file mode 100644 index 000000000000..07dace6e6eb8 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/HelperL0Tests.ts @@ -0,0 +1,47 @@ +import { Helper } from "../operations/Helper"; +import { TestString } from "./TestStrings"; + +export class HelperL0Tests { + public static async startTests() { + await this.validateGetTagForCreateAction(); + await this.validateGetTagForCreateActionWithTagPattern(); + await this.validateGetCommitShaFromTarget(); + await this.validateGetReleaseIdForTag(); + } + + public static async validateGetTagForCreateAction() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "abc"); + + if (tag === "tagName") { + console.log(TestString.getTagForCreateActionKeyword); + } + } + + public static async validateGetTagForCreateActionWithTagPattern() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "bcd", "v1.*"); + + if (tag === "v1.12") { + console.log(TestString.getTagForCreateActionWithTagPatternKeyword); + } + } + + public static async validateGetCommitShaFromTarget() { + let target = "master"; + let sha = await new Helper().getCommitShaFromTarget("endpoint", "repo", target); + + if (sha === "abc") { + console.log(TestString.getCommitShaFromTargetKeyword); + } + } + + public static async validateGetReleaseIdForTag() { + let releaseId = await new Helper().getReleaseIdForTag("endpoint", "repo", "tagName"); + + if (releaseId === 456) { + console.log(TestString.getReleaseIdForTagKeyword); + } + } + +} + +HelperL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/HelperTests.ts b/_generated/GitHubReleaseV1/Tests/HelperTests.ts new file mode 100644 index 000000000000..d04fb89eb0d5 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/HelperTests.ts @@ -0,0 +1,67 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class HelperTests { + + public static startTest() { + let tp = path.join(__dirname, 'HelperL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + getTags: function() { + return { + statusCode: 200, + headers: { "link": ""}, + body: [ + { + "commit": { "sha": "abc" }, + "name": "tagName" + }, + { + "commit": { "sha": "bcd" }, + "name": "test" + }, + { + "commit": { "sha": "bcd" }, + "name": "v1.12" + } + ] + } + }, + getBranch: function(githubEndpointToken: string, repositoryName: string, target: string) { + + return { + statusCode: 200, + body: { commit: { sha: target === "master"? "abc":target } } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + {"tag_name": "abc", "id": 123}, + {"tag_name": "tagName", "id": 456} + ], + headers: {} + } + } + } + } + }); + } +} + +HelperTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/InvalidActionL0Tests.ts b/_generated/GitHubReleaseV1/Tests/InvalidActionL0Tests.ts new file mode 100644 index 000000000000..7bf27ba512fc --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/InvalidActionL0Tests.ts @@ -0,0 +1,34 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class InvalidActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "creadte"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tag, "tag"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + } + + public static sandbox; +} + +InvalidActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/L0.ts b/_generated/GitHubReleaseV1/Tests/L0.ts new file mode 100644 index 000000000000..2c065aa90f4e --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/L0.ts @@ -0,0 +1,136 @@ +import * as path from 'path'; +import * as assert from 'assert'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { TestString } from './TestStrings'; + +describe('GitHubReleaseTaskTests Suite', function() { + this.timeout(60000); + + it('Validate delete action is called when action = delete.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteActionKeyWord) >= 0, 'should have printed: ' + TestString.deleteActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = create', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createActionKeyWord) >= 0, 'should have printed: ' + TestString.createActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = edit but no release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editActionKeyWord) >= 0, 'should have printed: ' + TestString.editActionKeyWord); + + done(); + }); + + it('Validate edit action is called when action = edit but a release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editAction2KeyWord) >= 0, 'should have printed: ' + TestString.editAction2KeyWord); + + done(); + }); + + it('Validate delete action is called when action = Delete. Validating if action is case insensitive or not.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteAction2KeyWord) >= 0, 'should have printed: ' + TestString.deleteAction2KeyWord); + + done(); + }); + + it('Validate task fails with correct error when action = create and no tag is present.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.NoTagFoundKeyword) >= 0, 'should have printed: ' + TestString.NoTagFoundKeyword); + + done(); + }); + + it('Validate task fails with correct error when action input is invalid', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'InvalidActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.InvalidActionKeyword) >= 0, 'should have printed: ' + TestString.InvalidActionKeyword); + + done(); + }); + + it('Validate Utility class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'UtilityL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getReleaseNoteKeyword) >= 0, 'should have printed: ' + TestString.getReleaseNoteKeyword); + assert(tr.stdout.search(TestString.validBranchNameKeyword) >= 0, 'should have printed: ' + TestString.validBranchNameKeyword); + assert(tr.stdout.search(TestString.invalidBranchNameKeyword) >= 0, 'should have printed: ' + TestString.invalidBranchNameKeyword); + assert(tr.stdout.search(TestString.tagMatchingKeyword) >= 0, 'should have printed: ' + TestString.tagMatchingKeyword); + assert(tr.stdout.search(TestString.parseHTTPHeaderLinkKeyword) >= 0, 'should have printed: ' + TestString.parseHTTPHeaderLinkKeyword); + assert(tr.stdout.search(TestString.extractRepositoryOwnerAndNameKeyword) >= 0, 'should have printed: ' + TestString.extractRepositoryOwnerAndNameKeyword); + assert(tr.stdout.search(TestString.extractRepoAndIssueIdKeyword) >= 0, 'should have printed: ' + TestString.extractRepoAndIssueIdKeyword); + assert(tr.stdout.search(TestString.getFirstLineKeyword) >= 0, 'should have printed: ' + TestString.getFirstLineKeyword); + + done(); + }); + + it('Validate Helper class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'HelperTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getTagForCreateActionKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionKeyword); + assert(tr.stdout.search(TestString.getTagForCreateActionWithTagPatternKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionWithTagPatternKeyword); + assert(tr.stdout.search(TestString.getCommitShaFromTargetKeyword) >= 0, 'should have printed: ' + TestString.getCommitShaFromTargetKeyword); + assert(tr.stdout.search(TestString.getReleaseIdForTagKeyword) >= 0, 'should have printed: ' + TestString.getReleaseIdForTagKeyword); + + done(); + }); + + it('Validate ChangeLog class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ChangeLogTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.stdout.search(TestString.getChangeLogKeyword) >= 0, 'should have printed: ' + TestString.getChangeLogKeyword); + assert(tr.stdout.search(TestString.allIssuesChangeLog) >= 0, 'should have printed: ' + TestString.allIssuesChangeLog); + assert(tr.stdout.search(TestString.issueBasedChangeLog) >= 0, 'should have printed: ' + TestString.issueBasedChangeLog); + assert(tr.stdout.search(TestString.noCategoryChangeLog) >= 0, 'should have printed: ' + TestString.noCategoryChangeLog); + assert(tr.stdout.search("Tag Name: v1.2") >=0, 'should have printed: TagName: v1.2'); + assert(tr.stdout.search("Tag Name: pre_rel") >=0, 'should have printed: TagName: pre_rel'); + assert(tr.stdout.search("Tag Name: tagName") >=0, 'should have printed: TagName: tagName'); + + done(); + }); + + it('Validate Action class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ActionTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.createReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.editReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.editReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.deleteReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.deleteReleaseSuccessKeyword); + + done(); + }); + +}); diff --git a/_generated/GitHubReleaseV1/Tests/TestStrings.ts b/_generated/GitHubReleaseV1/Tests/TestStrings.ts new file mode 100644 index 000000000000..afad94c3cd22 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/TestStrings.ts @@ -0,0 +1,29 @@ + +export class TestString { + public static readonly createReleaseSuccessKeyword: string = "CreateReleaseSuccess"; + public static readonly editReleaseSuccessKeyword: string = "EditReleaseSuccess"; + public static readonly deleteReleaseSuccessKeyword: string = "DeleteReleaseSuccess"; + public static readonly getChangeLogKeyword: string = "getChangeLog method should work properly"; + public static readonly NoTagFoundKeyword: string = "No tag found"; + public static readonly createActionKeyWord: string = "L0Test: create release action method should be called"; + public static readonly deleteActionKeyWord: string = "L0Test: delete action called when action = delete"; + public static readonly deleteAction2KeyWord: string = "L0Test: delete action should be called when action = Delete"; + public static readonly editAction2KeyWord: string = "L0Test: edit release action method should be called when a release is present for given tag"; + public static readonly editActionKeyWord: string = "L0Test: create release action method should be called when no release is present for given tag"; + public static readonly getTagForCreateActionKeyword: string = "getTagForCreateAction method should work properly"; + public static readonly getTagForCreateActionWithTagPatternKeyword: string = "getTagForCreateAction method should work properly when tagPattern is specified"; + public static readonly getCommitShaFromTargetKeyword: string = "getCommitShaFromTarget method should work properly"; + public static readonly getReleaseIdForTagKeyword: string = "getReleaseIdForTag method should work properly"; + public static readonly InvalidActionKeyword: string = "Invalid action input"; + public static readonly getReleaseNoteKeyword: string = "getReleaseNote method should work properly"; + public static readonly validBranchNameKeyword: string = "normalizeBranchName method should return tag name when branch = refs/tags/tagname"; + public static readonly invalidBranchNameKeyword: string = "normalizeBranchName method should return undefined when branch = refs/heads/tagname"; + public static readonly parseHTTPHeaderLinkKeyword: string = "parseHTTPHeaderLink method should work properly"; + public static readonly extractRepositoryOwnerAndNameKeyword: string = "extractRepositoryOwnerAndName method should work properly"; + public static readonly extractRepoAndIssueIdKeyword: string = "extractRepoAndIssueId method should work properly"; + public static readonly getFirstLineKeyword: string = "getFirstLine method should work properly"; + public static readonly tagMatchingKeyword: string = "isTagMatching method should work properly"; + public static readonly allIssuesChangeLog: string = "getChangeLog should generate All Issues ChangeLog"; + public static readonly issueBasedChangeLog: string = "getChangeLog should generate Issue Based ChangeLog"; + public static readonly noCategoryChangeLog: string = "ChangeLog generated should be a flatlist of issues."; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/UtilityL0Tests.ts b/_generated/GitHubReleaseV1/Tests/UtilityL0Tests.ts new file mode 100644 index 000000000000..9ee3a7a7d368 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/UtilityL0Tests.ts @@ -0,0 +1,92 @@ +import { Utility } from "../operations/Utility"; +import { TestString } from "./TestStrings"; + +export class UtilityL0Tests { + + public static startTests() { + this.validateGetReleaseNote(); + this.validateNormalizeBranchName(); + this.validateIsTagMatching(); + this.validateParseHTTPHeaderLink(); + this.validateExtractRepositoryOwnerAndName(); + this.validateExtractRepoAndIssueId(); + this.validateGetFirstLine(); + } + + public static validateGetReleaseNote() { + let releaseNoteInput = "release_note_input"; + let changeLog = "change_log"; + + let releaseNote = Utility.getReleaseNote("input", null, releaseNoteInput, changeLog); + if (releaseNote === (releaseNoteInput + changeLog)) { + console.log(TestString.getReleaseNoteKeyword); + } + } + + public static validateNormalizeBranchName() { + let normalizedBranchName = ""; + + normalizedBranchName = Utility.normalizeBranchName("refs/tags/tagName"); + if (normalizedBranchName === "tagName") { + console.log(TestString.validBranchNameKeyword); + } + + normalizedBranchName = Utility.normalizeBranchName("refs/heads/tagName"); + if (!normalizedBranchName) { + console.log(TestString.invalidBranchNameKeyword); + } + } + + public static validateIsTagMatching() { + let tag = "v1.1"; + let tagPattern = "v1.*"; + if (Utility.isTagMatching(tag, tagPattern)) { + console.log(TestString.tagMatchingKeyword); + } + } + + public static validateParseHTTPHeaderLink() { + let parsedHttpHeaderLink = {}; + let headerLink = '; rel="next", ; rel="last"'; + let expectedParsedHeaderLink = { + "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + } + parsedHttpHeaderLink = Utility.parseHTTPHeaderLink(headerLink); + + if (JSON.stringify(parsedHttpHeaderLink) === JSON.stringify(expectedParsedHeaderLink)) { + console.log(TestString.parseHTTPHeaderLinkKeyword); + } + } + + public static validateExtractRepositoryOwnerAndName() { + let repoName = "owner_name/repo_name"; + let repoInfo = Utility.extractRepositoryOwnerAndName(repoName); + + if (repoInfo.owner === "owner_name" && repoInfo.name === "repo_name") { + console.log(TestString.extractRepositoryOwnerAndNameKeyword); + } + + } + + public static validateExtractRepoAndIssueId() { + let repoIssueId = "repo#26"; + let info = Utility.extractRepoAndIssueId(repoIssueId); + + if (info.repository === "repo" && info.issueId === "26") { + console.log(TestString.extractRepoAndIssueIdKeyword); + } + } + + public static validateGetFirstLine() { + let message = "Fixing issue #25.\n Description #23"; + let firstLine = Utility.getFirstLine(message); + + if (firstLine === "Fixing issue #25.") { + console.log(TestString.getFirstLineKeyword); + } + } + +} + +UtilityL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/Tests/package-lock.json b/_generated/GitHubReleaseV1/Tests/package-lock.json new file mode 100644 index 000000000000..6bfd619fe2e3 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/package-lock.json @@ -0,0 +1,182 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/sinon": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz", + "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sinon": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } + } +} diff --git a/_generated/GitHubReleaseV1/Tests/package.json b/_generated/GitHubReleaseV1/Tests/package.json new file mode 100644 index 000000000000..d56d0b905d13 --- /dev/null +++ b/_generated/GitHubReleaseV1/Tests/package.json @@ -0,0 +1,10 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "devDependencies": { + "@types/sinon": "^4.3.1", + "sinon": "^4.5.0", + "@types/mocha": "2.2.48" + } +} diff --git a/_generated/GitHubReleaseV1/ThirdPartyNotices.txt b/_generated/GitHubReleaseV1/ThirdPartyNotices.txt new file mode 100644 index 000000000000..2f2f1cc1664a --- /dev/null +++ b/_generated/GitHubReleaseV1/ThirdPartyNotices.txt @@ -0,0 +1,668 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +GitHub Release Task incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. browserify-mime (git+https://github.com/broofa/node-mime.git) +4. concat-map (https://github.com/substack/node-concat-map) +5. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +6. inflight (https://github.com/npm/inflight) +7. inherits (https://github.com/isaacs/inherits) +8. glob (git://github.com/isaacs/node-glob.git) +9. minimatch (https://github.com/isaacs/minimatch) +10. Mockery (https://github.com/mfncooper/mockery) +11. once (https://github.com/isaacs/once) +12. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +13. q (https://github.com/kriskowal/q) +14. semver (https://github.com/npm/node-semver/) +15. semver-compare (https://github.com/substack/semver-compare) +16. ShellJS (https://github.com/shelljs/shelljs) +17. tunnel (https://github.com/koichik/node-tunnel) +18. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +19. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +20. uuid (git+https://github.com/kelektiv/node-uuid.git) +21. vso-node-api (https://github.com/Microsoft/vsts-node-api) +22. azure-pipelines-task-lib (https://github.com/Microsoft/azure-pipelines-task-lib) +23. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +24. wrappy (https://github.com/npm/wrappy) +25. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +26. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/icon.png b/_generated/GitHubReleaseV1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96e6b70c499d6b624878201c3f81424b0982054c GIT binary patch literal 1094 zcmV-M1iAZ(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00Xv3L_t(oN3B;)Xj4HDer*%{10~7+yjQ9b ztsqtuR76x1l|m6z5LB=Q5f!~u58k{K(Szv0qn>(E6#M}Z6qFu3C{(3hyi`=YNwq)z zRZB^e`pv#+OkOt6*Svf%kheSY&F<{X&c>MywAM>iMs+Hou0ZZ;A)jiYo+zpA;QKP> z4!f?KW%c^N^St@4ltH(zlA8C2=xL-l4dt{q|@nzIO_o` zK^=s+$p^cuKmt2|SY{;DFP!5ren&~ZpinXn6Gz#&Q1{`h(RWz_B;3g|MF`IBIHnSA zCbPkmU9_CYV}}hv0yr8fRFPwALQFXSv(I;V8s(S8o~ClK@AGLxu75NjRnXd%ftuR&F=mVN29qDD*VVH zgvYWnsot<*-9VeN_{q@%f`fErzGJ(3p@C}O=F6dM4-R5%By#tP0J?O*`P<@W+`(=K zgA^dOzhJ=-J_ivvu65*Mkdz?9H2JhaM z=n&cMppmS=hqc{e5nrjvFxRX>S2=N5xuu$HPBkw!iuia|oHR!wZ^G~okL3`hUY*t( zqdYRHx0ucd4%ki=d4nQkADft!c3{wSEG%Y#dO7uMeE%pKm^nEL;#)AWT~bMqK7ii0 zQkyE0M<3Y1b_Pu#?kg$?_1?S2+ zQG)Ltlwz9_;vA0SE#G91!`^hX=o$NJ0?vecPHa^!<`?LgR1K+(?!Ax9C3vv9taB1Fjrm8wlDo6XK;M>d(#LLXz* zaA1}A|5tf+l8_Tts{mDr%?9!l`EiidqJgerB+Kg{Sy(CB7J!YsjPtTeP}opjA3;XP zQV3fBHLw{ysw7m_Q4A;i*?34I2ihT>{9P5$>B152!q22X5(dZl3#0r-xPpe0SpWb4 M07*qoM6N<$f*rl~Jpcdz literal 0 HcmV?d00001 diff --git a/_generated/GitHubReleaseV1/icon.svg b/_generated/GitHubReleaseV1/icon.svg new file mode 100644 index 000000000000..f9aea8bf7966 --- /dev/null +++ b/_generated/GitHubReleaseV1/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/_generated/GitHubReleaseV1/main.ts b/_generated/GitHubReleaseV1/main.ts new file mode 100644 index 000000000000..05d9a819d7ed --- /dev/null +++ b/_generated/GitHubReleaseV1/main.ts @@ -0,0 +1,133 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import { Action } from "./operations/Action"; +import { Utility, ActionType, Delimiters, ChangeLogStartCommit, ChangeLogType } from './operations/Utility'; +import { Inputs} from "./operations/Constants"; +import { ChangeLog } from "./operations/ChangeLog"; +import { Helper } from "./operations/Helper"; + +class Main { + + public static async run(): Promise { + try { + var taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + + let actions = new Action(); + let helper = new Helper() + + // Get basic task inputs + const githubEndpoint = tl.getInput(Inputs.gitHubConnection, true); + const githubEndpointToken = Utility.getGithubEndPointToken(githubEndpoint); + + const repositoryName = tl.getInput(Inputs.repositoryName, true); + + const action = tl.getInput(Inputs.action, true).toLowerCase(); + Utility.validateAction(action); + + let tagSource = tl.getInput(Inputs.tagSource); + Utility.validateTagSource(tagSource, action); + + let tag = tl.getInput(Inputs.tag); + Utility.validateTag(tag, tagSource, action); + + if (action === ActionType.delete) { + helper.publishTelemetry(); + await actions.deleteReleaseAction(githubEndpointToken, repositoryName, tag); + } + else { + // Get task inputs specific to create and edit release + const target = tl.getInput(Inputs.target, true); + const releaseTitle = tl.getInput(Inputs.title) || undefined; + + const isPrerelease = tl.getBoolInput(Inputs.isPreRelease) || false; + const isDraft = tl.getBoolInput(Inputs.isDraft) || false; + const githubReleaseAssetInputPatterns = tl.getDelimitedInput(Inputs.assets, Delimiters.newLine); + + if (action === ActionType.create) { + //Get task inputs specific to create release + const tagPattern = tl.getInput(Inputs.tagPattern) || undefined; + + // Get tag to create release if tag source is gitTag/userSpecifiedTag + if (Utility.isTagSourceAuto(tagSource)) { + tag = await helper.getTagForCommitTarget(githubEndpointToken, repositoryName, target, tagPattern); + } + + if (!!tag) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + else { + // If no tag found, then give warning. + // Doing this because commits without associated tag will fail continuosly if we throw error. + // Other option is to have some task condition, which user can specify in task. + tl.warning(tl.loc("NoTagFound")); + tl.debug("No tag found"); // for purpose of L0 test only. + } + } + else if (action === ActionType.edit) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + // Get the release id of the release to edit. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: any = await helper.getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + // If a release is found, then edit it. + // Else create a new release. + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await actions.editReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns, releaseId); + } + else { + tl.warning(tl.loc("NoReleaseFoundToEditCreateRelease", tag)); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + } + } + + tl.setResult(tl.TaskResult.Succeeded, ""); + } + catch(error) { + tl.setResult(tl.TaskResult.Failed, error); + } + } + + private static async _getReleaseNote(githubEndpointToken: string, repositoryName: string, target: string): Promise { + const releaseNotesSource = tl.getInput(Inputs.releaseNotesSource, true); + Utility.validateReleaseNotesSource(releaseNotesSource); + const releaseNotesFile = tl.getPathInput(Inputs.releaseNotesFilePath, false, true); + const releaseNoteInput = tl.getInput(Inputs.releaseNotesInline); + const showChangeLog: boolean = tl.getBoolInput(Inputs.addChangeLog); + let changeLog: string = ""; + if (showChangeLog){ + let changeLogLabels: any = null; + const changeLogCompareToRelease = tl.getInput(Inputs.changeLogCompareToRelease); + Utility.validateStartCommitSpecification(changeLogCompareToRelease); + const changeLogType = tl.getInput(Inputs.changeLogType); + Utility.validateChangeLogType(changeLogType); + if (changeLogType === ChangeLogType.issueBased){ + const changeLogLabelsInput = tl.getInput(Inputs.changeLogLabels); + try{ + changeLogLabels = JSON.parse(changeLogLabelsInput); + } + catch(error){ + changeLogLabels = []; + tl.warning(tl.loc("LabelsSyntaxError")); + } + } + + const changeLogCompareToReleaseTag = tl.getInput(Inputs.changeLogCompareToReleaseTag) || undefined; + // Generate the change log + // Get change log for top 250 commits only + changeLog = await new ChangeLog().getChangeLog(githubEndpointToken, repositoryName, target, 250, ChangeLogStartCommit[changeLogCompareToRelease], changeLogType, changeLogCompareToReleaseTag, changeLogLabels); + } + // Append change log to release note + const releaseNote: string = Utility.getReleaseNote(releaseNotesSource, releaseNotesFile, releaseNoteInput, changeLog) || undefined; + + return releaseNote; + } +} + +Main.run(); diff --git a/_generated/GitHubReleaseV1/make.json b/_generated/GitHubReleaseV1/make.json new file mode 100644 index 000000000000..3df4ca171399 --- /dev/null +++ b/_generated/GitHubReleaseV1/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/Action.ts b/_generated/GitHubReleaseV1/operations/Action.ts new file mode 100644 index 000000000000..f4d849317b75 --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/Action.ts @@ -0,0 +1,255 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import fs = require('fs'); +import { WebResponse } from "./webClient"; +import { Release } from "./Release"; +import { Utility, AssetUploadMode, GitHubAttributes } from "./Utility"; +import { Inputs } from "./Constants"; +import { Helper } from "./Helper"; + +export class Action { + + /** + * Creating a release and uploading assets are 2 different process. First we create a release and when it is successful, we upload assets to it. + * But in our scenario, we assume it to be a single process, means if upload assets step fail then we say release is in dirty state and we would want it to be deleted as it is without assets yet. + * So, we delete the created release as assets are not uploaded to it. And will want user to run the task again to create release with assets. + * The delete release step is only reachable if user has specified any assets to upload and the upload step failed. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + */ + public async createReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[]): Promise { + console.log(tl.loc("CreatingRelease", tag)); + + // Create release + let response: WebResponse = await new Release().createRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease); + tl.debug("Create release response: " + JSON.stringify(response)); + + if (response.statusCode === 201) { + try { + // Upload the assets + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, [], false); + console.log(tl.loc("CreateReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + catch (error) { + console.log(tl.loc("CreateReleaseFailed")); + + try { + // If upload asets fail, then delete the release + let releaseId: string = response.body[GitHubAttributes.id]; + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + catch (error) { + tl.debug("Failed to delete the release which is in dirty state currently. Assets were expected to be uploaded but it failed. Delete the release manually.") + } + + throw error; + } + } + else if (response.statusCode === 422 && response.body.errors && response.body.errors.length > 0 && response.body.errors[0].code === this._alreadyExistErrorCode) { + tl.error(tl.loc("ReleaseAlreadyExists", tag)); + throw new Error(response.body[GitHubAttributes.message]); + } + else { + tl.error(tl.loc("CreateReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Edits an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + * @param releaseId + */ + public async editReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[], releaseId: string): Promise { + console.log(tl.loc("EditingRelease", tag)); + + let response: WebResponse = await new Release().editRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, releaseId); + tl.debug("Edit release response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, response.body[GitHubAttributes.assets], true); + console.log(tl.loc("EditReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + else { + tl.error(tl.loc("EditReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Deletes a release if it exists. + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async deleteReleaseAction(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + // Get the release id of the release with corresponding tag to delete. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: string = await new Helper().getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + else { + throw new Error(tl.loc("NoReleaseFoundToDelete", tag)); + } + } + + /** + * Deletes an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param releaseId + * @param tag + */ + private async _deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string, tag: string): Promise { + console.log(tl.loc("DeletingRelease", tag)); + let response: WebResponse = await new Release().deleteRelease(githubEndpointToken, repositoryName, releaseId); + tl.debug("Delete release response: " + JSON.stringify(response)); + + if (response.statusCode === 204) { + console.log(tl.loc("DeleteReleaseSuccess")); + } + else { + tl.error(tl.loc("DeleteReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Upload assets to the release. + * @param githubEndpointToken + * @param repositoryName + * @param githubReleaseAssetInputPatterns + * @param uploadUrl + * @param existingAssets + */ + private async _uploadAssets(githubEndpointToken: string, repositoryName: string, githubReleaseAssetInputPatterns: string[], uploadUrl: string, existingAssets: any[], editMode: boolean): Promise { + const assetUploadMode = tl.getInput(Inputs.assetUploadMode); + Utility.validateAssetUploadMode(assetUploadMode); + + // Delete all assets in case of edit release before uploading new assets. + if (editMode && !!assetUploadMode && assetUploadMode === AssetUploadMode.delete) { + console.log(tl.loc("DeleteAllExistingAssets")); + await this._deleteAssets(githubEndpointToken, repositoryName, existingAssets); + } + + if (githubReleaseAssetInputPatterns && githubReleaseAssetInputPatterns.length > 0) { + console.log(tl.loc("UploadingAssets")); + } + else { + console.log(tl.loc("NoAssetFoundToUpload")); + return; + } + + for (let pattern of (githubReleaseAssetInputPatterns || [])) { + await this._uploadAssetsForGivenPattern(githubEndpointToken, repositoryName, uploadUrl, existingAssets, pattern, assetUploadMode); + } + + console.log(tl.loc("AllAssetsUploadedSuccessfully")); + } + + private async _uploadAssetsForGivenPattern(githubEndpointToken: string, repositoryName: string, uploadUrl: string, existingAssets: any[], pattern: string, assetUploadMode: string): Promise { + console.log(tl.loc("SearchingFileMatchingPattern", pattern)); + + let assets: string[] = Utility.getUploadAssets(pattern) || []; + + if (Utility.isPatternADirectory(assets, pattern)) { + console.log(tl.loc("PatternIsADirectory", pattern)); + return; + } + + assets = assets.filter(asset => Utility.isFile(asset)); + + if (assets.length === 0) { + console.log(tl.loc("NoFileFoundMatchingPattern", pattern)); + return; + } + + Utility.validateUploadAssets(assets); + + for (let index = 0; index < assets.length; index++) { + const asset = assets[index]; + console.log(tl.loc("UploadingAsset", asset)); + + let uploadResponse = await new Release().uploadReleaseAsset(githubEndpointToken, asset, uploadUrl); + tl.debug("Upload asset response: " + JSON.stringify(uploadResponse)); + + if (uploadResponse.statusCode === 201) { + console.log(tl.loc("UploadAssetSuccess", asset)); + } + else if (uploadResponse.statusCode === 422 && uploadResponse.body.errors && uploadResponse.body.errors.length > 0 && uploadResponse.body.errors[0].code === this._alreadyExistErrorCode) { + + if (assetUploadMode === AssetUploadMode.replace) { + console.log(tl.loc("DuplicateAssetFound", asset)); + console.log(tl.loc("DeletingDuplicateAsset", asset)); + + const fileName = path.basename(asset); + + for (let existingAsset of existingAssets) { + if (fileName === existingAsset.name) { + await this._deleteAssets(githubEndpointToken, repositoryName, [existingAsset]); + index--; + break; + } + } + } + else { + console.log(tl.loc("SkipDuplicateAssetFound", asset)); + } + } + else { + tl.error(tl.loc("UploadAssetError")) + throw new Error(uploadResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Delete assets. + * @param githubEndpointToken + * @param repositoryName + * @param assets + */ + private async _deleteAssets(githubEndpointToken: string, repositoryName: string, assets: any[]): Promise { + if (assets && assets.length === 0) { + console.log(tl.loc("NoAssetFoundToDelete")); + return; + } + + for (let asset of assets) { + console.log(tl.loc("DeletingAsset", asset[GitHubAttributes.nameAttribute])); + let deleteAssetResponse = await new Release().deleteReleaseAsset(githubEndpointToken, repositoryName, asset.id); + tl.debug("Delete asset response: " + JSON.stringify(deleteAssetResponse)); + + if (deleteAssetResponse.statusCode === 204) { + console.log(tl.loc("AssetDeletedSuccessfully", asset[GitHubAttributes.nameAttribute])); + } + else { + tl.error(tl.loc("ErrorDeletingAsset", asset[GitHubAttributes.nameAttribute])); + throw new Error(deleteAssetResponse.body[GitHubAttributes.message]); + } + } + console.log(tl.loc("AssetsDeletedSuccessfully")); + } + + private readonly _alreadyExistErrorCode: string = "already_exists"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/ChangeLog.ts b/_generated/GitHubReleaseV1/operations/ChangeLog.ts new file mode 100644 index 000000000000..0608268b0737 --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/ChangeLog.ts @@ -0,0 +1,701 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import { Utility, GitHubAttributes, IRepositoryIssueId, Delimiters, AzureDevOpsVariables, ChangeLogStartCommit, GitHubIssueState, ChangeLogType } from "./Utility"; +import { Release } from "./Release"; +import { Helper } from "./Helper"; + +export class ChangeLog { + + /** + * Returns the change log. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param top + * @param compareWithRelease + * @param changeLogType + * @param changeLogCompareToReleaseTag + * @param changeLogLabels + */ + public async getChangeLog(githubEndpointToken: string, repositoryName: string, target: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogType: string, changeLogCompareToReleaseTag?: string, changeLogLabels?: any[]): Promise { + console.log(tl.loc("ComputingChangeLog")); + + let release = new Release(); + // We will be fetching changes between startCommitSha...endCommitSha. + // endCommitSha: It is the current commit + // startCommitSha: It is the commit for which previous release was created + // If no previous release found, then it will be the first commit. + + // Get the curent commit. + let endCommitSha: string = await new Helper().getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + //Get the start commit. + let startCommitSha: string = await this.getStartCommitSha(githubEndpointToken, repositoryName, endCommitSha, top,compareWithRelease, changeLogCompareToReleaseTag); + // Compare the diff between 2 commits. + tl.debug("start commit: "+ startCommitSha + "; end commit: "+ endCommitSha); + console.log(tl.loc("FetchCommitDiff")); + let commitsListResponse = await release.getCommitsList(githubEndpointToken, repositoryName, startCommitSha, endCommitSha); + tl.debug("Get commits list response: " + JSON.stringify(commitsListResponse)); + + if (commitsListResponse.statusCode === 200) { + // If end commit is older than start commit i.e. Rollback scenario, we will not show any change log. + if (commitsListResponse.body[GitHubAttributes.status] === GitHubAttributes.behind) { + tl.warning(tl.loc("CommitDiffBehind")); + return ""; + } + else { + let commits: any[] = commitsListResponse.body[GitHubAttributes.commits] || []; + + // If endCommit and startCommit are same then also we will not show any change log. + if (commits.length === 0) { + console.log(tl.loc("CommitDiffEqual")); + return ""; + } + + console.log(tl.loc("FetchCommitDiffSuccess")); + // Reversing commits as commits retrieved are in oldest first order + commits = commits.reverse(); + + // Only show changeLog for top X commits, where X = top + // Form the commitId to issues dictionary + let commitIdToMessageDictionary: { [key: string]: string } = this._getCommitIdToMessageDictionary(commits.length > top ? commits.slice(0, top) : commits); + tl.debug("commitIdToMessageDictionary: " + JSON.stringify(commitIdToMessageDictionary)); + + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = this._getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary, repositoryName); + tl.debug("commitIdToRepoIssueIdsDictionary: " + JSON.stringify(commitIdToRepoIssueIdsDictionary)); + if (changeLogType === ChangeLogType.commitBased) { + return this._getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary, commitIdToMessageDictionary, repositoryName); + } + else { + let issues = new Set([]); + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string) => { + if (issues.size >= top) { + return; + } + commitIdToRepoIssueIdsDictionary[commitId].forEach(repoIssueId => { + if (issues.size >= top) { + return; + } + let issueDetails = Utility.extractRepoAndIssueId(repoIssueId); + let issueId = Number(issueDetails.issueId); + if (!!issueId && issueDetails.repository === repositoryName) { + issues.add(issueId); + } + }); + }); + + if (!!changeLogLabels && !!changeLogLabels.length) { + return this._getIssueBasedChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken, changeLogLabels); + } + else { + return this._getAllIssuesChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken); + } + } + } + } + else{ + tl.error(tl.loc("FetchCommitDiffError")); + throw new Error(commitsListResponse.body[GitHubAttributes.message]); + } + } + /** + * Generate issue based ChangeLog + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + * @param labels + */ + private async _getIssueBasedChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string, labels: any[]) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, true); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let index = 0; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + let labelsRankDictionary = this._getLabelsRankDictionary(labels); + tl.debug("labelsRankDictionary: " + JSON.stringify(labelsRankDictionary)); + let groupedIssuesDictionary = this._getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels); + tl.debug("Group wise issues : " + JSON.stringify(groupedIssuesDictionary)); + Object.keys(groupedIssuesDictionary).forEach((group: string) => { + if (groupedIssuesDictionary[group].length === 0) return; + //If the only category is the default cateogry, don't add the category title. + if (index > 0 || group!= this._defaultGroup){ + let changeLogGroupTitle = util.format(this._groupTitleFormat, group); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogGroupTitle + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogGroupTitle + Delimiters.newLine; + index++; + } + } + groupedIssuesDictionary[group].forEach(issueDetails => { + let changeLogPerIssue: string = this._getChangeLogPerIssue(issueDetails.id, issueDetails.issue); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + index++; + } + }); + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate all issue based ChangeLog without labels + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + */ + private async _getAllIssuesChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, false); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + Object.keys(issuesList).forEach((key: string, index: number) => { + let changeLogPerIssue = this._getChangeLogPerIssue(key.substr(1), issuesList[key].title); + // See more functionality + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate commit based ChangeLog + * @param commitIdToRepoIssueIdsDictionary + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private async _getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary: { [key: string]: Set }, commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string){ + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + // Evaluate change log + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string, index: number) => { + let changeLogPerCommit: string = this._getChangeLogPerCommit(commitId, commitIdToMessageDictionary[commitId], commitIdToRepoIssueIdsDictionary[commitId], repositoryName); + //See more functionality + // If changes are more than 10, then we will show See more button which will be collapsible. + // And under that seeMoreChangeLog will be shown + // topXChangeLog will be visible to user. + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerCommit + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerCommit + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + /** + * Returns the start commit needed to compute ChangeLog. + * @param githubEndpointToken + * @param repositoryName + * @param endCommitSha + * @param top + * @param compareWithRelease + * @param changeLogCompareToReleaseTag + */ + + public async getStartCommitSha(githubEndpointToken: string, repositoryName: string, endCommitSha: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogCompareToReleaseTag?: string): Promise { + let release = new Release(); + let startCommitSha: string; + if (compareWithRelease === ChangeLogStartCommit.lastFullRelease) { + // Get the latest published release to compare the changes with. + console.log(tl.loc("FetchLatestPublishRelease")); + let latestReleaseResponse = await release.getLatestRelease(githubEndpointToken, repositoryName); + tl.debug("Get latest release response: " + JSON.stringify(latestReleaseResponse)); + // Get the start commit. + // Release has target_commitsh property but it can be branch name also. + // Hence if a release is present, then get the tag and find its corresponding commit. + // Else get the first commit. + if (latestReleaseResponse.statusCode !== 200 && latestReleaseResponse.statusCode !== 404) { + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(latestReleaseResponse.body[GitHubAttributes.message]); + } + else if (latestReleaseResponse.statusCode !== 404 && latestReleaseResponse.body && !!latestReleaseResponse.body[GitHubAttributes.tagName]) { + let latestReleaseTag: string = latestReleaseResponse.body[GitHubAttributes.tagName]; + tl.debug("latest release tag: " + latestReleaseTag); + + let latestReleaseUrl: string = latestReleaseResponse.body[GitHubAttributes.htmlUrl]; + console.log(tl.loc("FetchLatestPublishReleaseSuccess", latestReleaseUrl)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, latestReleaseTag); + } + else { + console.log(tl.loc("NoLatestPublishRelease")); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + + return startCommitSha; + } + + let comparer; + if (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) { + //Latest non-draft Release + console.log(tl.loc("FetchLatestNonDraftRelease")); + comparer = release => !release[GitHubAttributes.draft]; + } + else { + //Latest release with the given tag or matching the given regex. + console.log(tl.loc("FetchLastReleaseByTag", changeLogCompareToReleaseTag)); + comparer = release => !release[GitHubAttributes.draft] && Utility.isTagMatching(release[GitHubAttributes.tagName], changeLogCompareToReleaseTag); + + } + + let initialTag = await this.getLastReleaseTag(githubEndpointToken, repositoryName, comparer); + + //If no such release exists, get the start commit + //else get the commit for that tag. + if (!initialTag) { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("NoMatchingReleases")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("NoTagMatchingReleases", changeLogCompareToReleaseTag)); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + else { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("FetchMatchingReleaseSuccess")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("FetchTagMatchingReleaseSuccess", changeLogCompareToReleaseTag)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, initialTag); + } + + return startCommitSha; + } + + /** + * Returns latest release satisfying the given comparer. + * @param githubEndpointToken + * @param repositoryName + * @param comparer + */ + public async getLastReleaseTag(githubEndpointToken: string, repositoryName: string, comparer:(release: any)=> boolean): Promise { + let release = new Release(); + + // Fetching all releases in the repository. Sorted in descending order according to 'created_at' attribute. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + let startRelease: any; + //404 is returned when there are no releases. + if (releasesResponse.statusCode !== 200 && releasesResponse.statusCode !== 404){ + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + else if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + startRelease = (releasesResponse.body || []).find(comparer); + if (!!startRelease) { + return startRelease[GitHubAttributes.tagName]; + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + } + //If status code is 404 or there are no releases satisfying the constraints return null. + return null; + } + } + + /** + * Returns the commit for provided tag + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + private async _getCommitForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let filteredTag: any = await new Helper().filterTag(githubEndpointToken, repositoryName, tag, this._filterTagsByTagName); + + return filteredTag && filteredTag[GitHubAttributes.commit][GitHubAttributes.sha]; + } + + /** + * Returns a commit which is 'X' (top) commits older than the provided commit sha. + * @param githubEndpointToken + * @param repositoryName + * @param sha + */ + private async _getInitialCommit(githubEndpointToken: string, repositoryName: string, sha: string, top: number): Promise { + let release = new Release(); + + // No api available to get first commit directly. + // So, fetching all commits before the current commit sha. + // Returning last commit or 250th commit which ever is smaller. + let commitsForGivenShaResponse = await release.getCommitsBeforeGivenSha(githubEndpointToken, repositoryName, sha); + let links: { [key: string]: string } = {}; + let commits: any[] = []; + + while(true) { + tl.debug("Get initial commit response: " + JSON.stringify(commitsForGivenShaResponse)); + + if (commitsForGivenShaResponse.statusCode === 200) { + // Returned commits are in latest first order and first commit is the commit queried itself. + (commitsForGivenShaResponse.body || []).forEach(commit => { + commits.push(commit); + }); + + if (commits.length >= top) { + // Return 250th commit + return commits[top - 1][GitHubAttributes.sha]; + } + + links = Utility.parseHTTPHeaderLink(commitsForGivenShaResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + commitsForGivenShaResponse = paginatedResponse; + continue; + } + else { + // Return last commit. + return commits[commits.length - 1][GitHubAttributes.sha]; + } + } + else { + tl.error(tl.loc("FetchInitialCommitError")); + throw new Error(commitsForGivenShaResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns a dictionary of { commitId to commit message }. + * @param commits + */ + private _getCommitIdToMessageDictionary(commits: any[]): { [key: string]: string } { + let commitIdToMessageDictionary: { [key: string]: string } = {}; + + for (let commit of (commits || [])) { + commitIdToMessageDictionary[commit[GitHubAttributes.sha]] = commit[GitHubAttributes.commit][GitHubAttributes.message]; + } + + return commitIdToMessageDictionary; + } + + /** + * Returns a dictionary of { commitId to repoIssueIds }. + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private _getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string): { [key: string]: Set } { + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = {}; + + Object.keys(commitIdToMessageDictionary).forEach((commitId: string) => { + commitIdToRepoIssueIdsDictionary[commitId] = this._getRepoIssueIdFromCommitMessage(commitIdToMessageDictionary[commitId], repositoryName); + + }); + + return commitIdToRepoIssueIdsDictionary; + } + + /** + * Returns a dictionary of { key to displayname, rank }. + * Key is labelname#issuestate + * This dictionary is used to find the label with highest priority. + * @param labels + */ + private _getLabelsRankDictionary(labels: any[]){ + let labelsRankDictionary = {}; + for (let index = 0; index < labels.length; index++){ + if (!labels[index].label || !labels[index].displayName) continue; + let label = labels[index].label; + let issueState = labels[index].state || this._noStateSpecified; + let key = (label+ Delimiters.hash +issueState).toLowerCase(); + if (!labelsRankDictionary[key]){ + labelsRankDictionary[key] = {displayName: labels[index].displayName, rank: index}; + } + } + return labelsRankDictionary; + } + + /** + * Returns a dictionary of { groupname to issues }. + * This dictionary is used to find all the issues under a display name. + * @param labelsRankDictionary + * @param issuesList + */ + private _getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels){ + let labelsIssuesDictionary = {}; + labels.forEach(label => { + if (!label.displayName) return; + labelsIssuesDictionary[label.displayName] = []; + }); + labelsIssuesDictionary[this._defaultGroup] = []; + Object.keys(issuesList).forEach((issue: string) => { + let group: string = null; + let currentLabelRank: number = Number.MAX_SAFE_INTEGER; + let issueState = issuesList[issue].state; + //For Pull Requests, show only Merged PRs, Ignore Closed PRs + if (!!issuesList[issue].changedFiles){ + if(issueState.toLowerCase() === GitHubIssueState.merged.toLowerCase()){ + issueState = GitHubIssueState.closed; + } + else if (issueState.toLowerCase() === GitHubIssueState.closed.toLowerCase()){ + return; + } + } + issuesList[issue].labels.edges && issuesList[issue].labels.edges.forEach(labelDetails => { + let key = (labelDetails.node.name + Delimiters.hash + issueState).toLowerCase(); + if(!labelsRankDictionary[key]) { + key = (labelDetails.node.name + Delimiters.hash + this._noStateSpecified).toLowerCase(); + } + + if (labelsRankDictionary[key] && labelsRankDictionary[key].rank < currentLabelRank){ + group = labelsRankDictionary[key].displayName; + currentLabelRank = labelsRankDictionary[key].rank; + } + }); + if (currentLabelRank === Number.MAX_SAFE_INTEGER){ + group = this._defaultGroup; //Default category + } + labelsIssuesDictionary[group].push({"issue": issuesList[issue].title, "id": issue.substr(1)}); + }); + return labelsIssuesDictionary; + } + + /** + * Returns the log for a single issue. + * Log format: * #issueId: issueTitle + * @param issueId + * @param issueTitle + */ + private _getChangeLogPerIssue(issueId: number | string, issueTitle: string){ + return Delimiters.star + Delimiters.space + Delimiters.hash + issueId + Delimiters.colon + Delimiters.space + issueTitle; + } + + /** + * Filter tags by tag name. + * Returns tag object. + */ + private _filterTagsByTagName = (tagsList: any[], tagName: string): any[] => { + let filteredTags: any[] = []; + + (tagsList || []).forEach((tag: any) => { + if (tag[GitHubAttributes.nameAttribute] === tagName) { + filteredTags.push(tag); + } + }); + + return filteredTags; + } + + /** + * Returns a unique set of repository#issueId string for each issue mentioned in the commit. + * repository#issueId string is needed as issues can be of cross repository. + * @param message + * @param repositoryName + */ + private _getRepoIssueIdFromCommitMessage(message: string, repositoryName: string): Set { + let match = undefined; + let repoIssueIdSet: Set = new Set(); + + // regex.exec(message) will return one match at a time. + // Multiple execution will yield all matches. + // Returns undefined if no further match found. + // match is an array, where match[0] is the complete match + // and other match[i] gives the captured strings in order. + // In our regex, we have captured repository name and issueId resp. + while (match = this._issueRegex.exec(message)) { + tl.debug("match: " + match[0]); + tl.debug("match1: " + match[1]); + tl.debug("match2: " + match[2]); + tl.debug("repositoryName: " + repositoryName); + + // If no repository name found before an issue, then use user provided repository name to link it to issue + let repo: string = match[1] ? match[1] : repositoryName; + let issueId: string = match[2]; + + // Using # as separator as neither repoName nor issueId will have #. + let uniqueRepoIssueId: string = repo + Delimiters.hash + issueId; + tl.debug("uniqueRepoIssueId: " + uniqueRepoIssueId); + + // Message can contain same issue linked multiple times. + // Do not add an issue if its already added. + if (!repoIssueIdSet.has(uniqueRepoIssueId)) { + repoIssueIdSet.add(uniqueRepoIssueId); + } + } + + return repoIssueIdSet; + } + + /** + * Returns the log for a single commit. + * Log format: * commitId commitMessageTitle, [ #issueId1, #issueId2 ] + * @param commitId + * @param commitMessage + * @param repoIssueIdSet + * @param repositoryName + */ + private _getChangeLogPerCommit(commitId: string, commitMessage: string, repoIssueIdSet: Set, repositoryName: string): string { + // GitHub commit messages have description as well alongwith title. + // Parsing the commit title and showing to user. + let commitMessageFirstLine: string = Utility.getFirstLine(commitMessage); + // Log format without issues: * commitId commitMessageTitle + let log: string = Delimiters.star + Delimiters.space + commitId + Delimiters.space + commitMessageFirstLine; + let issuesText: string = ""; + + // Appending each issue mentioned in the commit message. + // Ignoring issue which is present in commit title, to avoid duplicates. + if (!!repoIssueIdSet && repoIssueIdSet.size > 0) { + + (repoIssueIdSet).forEach((repoIssueId: string) => { + // Extract repository information for issue as cross repository issues can also be present. + let repoIssueIdInfo: IRepositoryIssueId = Utility.extractRepoAndIssueId(repoIssueId); + let issueIdText: string = ""; + + // If issue belongs to cross repository, then prefix repository name to issueId so that it can be linked correctly in GitHub. + if (repoIssueIdInfo.repository !== repositoryName) { + issueIdText += repoIssueIdInfo.repository; + } + // # is required before issueId for referencing purpose in GitHub. + issueIdText = issueIdText + Delimiters.hash + repoIssueIdInfo.issueId; + + // If this issue is not present in commit title, then append to issues text. + if (!commitMessageFirstLine.includes(issueIdText)) { + if (!!issuesText) { + // Append comma after every issue + issuesText += Delimiters.comma; + } + issuesText = issuesText + Delimiters.space + issueIdText; + } + }); + } + + // If issues are present, then enclose it in brackets and append to log. + if (!!issuesText) { + log = log + Delimiters.openingBracketWithSpace + issuesText + Delimiters.closingBracketWithSpace; + } + + return log; + } + + private _getAutoGeneratedText(): string { + let autoGeneratedUrl: string = encodeURI(this._getAutoGeneratedUrl()); + + if (!!autoGeneratedUrl) { + return util.format(this._autoGeneratedTextFormat, autoGeneratedUrl); + } + + return ""; + } + + private _generateChangeLog(topXChangeLog: string, seeMoreChangeLog: string): string { + let changeLog: string = ""; + if (topXChangeLog) { + changeLog = util.format(this._changeLogTitleFormat, this._changeLogTitle) + topXChangeLog; + + if(!seeMoreChangeLog) { + changeLog = changeLog + Delimiters.newLine + this._getAutoGeneratedText(); + } + else { + changeLog = changeLog + util.format(this._seeMoreChangeLogFormat, this._seeMoreText, seeMoreChangeLog, this._getAutoGeneratedText()); + } + } + return changeLog; + } + + private _getAutoGeneratedUrl(): string { + let releaseUrl: string = tl.getVariable(AzureDevOpsVariables.releaseWebUrl); + + if (!!releaseUrl) { + tl.debug("release web url: " + releaseUrl); + return releaseUrl; + } + else { + let collectionUri: string = tl.getVariable(AzureDevOpsVariables.collectionUri); + + // Make sure collection uri does not end with slash + if (collectionUri.endsWith(Delimiters.slash)) { + collectionUri = collectionUri.slice(0, collectionUri.length - 1); + } + + let teamProject: string = tl.getVariable(AzureDevOpsVariables.teamProject); + let buildId: string = tl.getVariable(AzureDevOpsVariables.buildId); + + tl.debug("Build url: " + util.format(this._buildUrlFormat, collectionUri, teamProject, buildId)); + return util.format(this._buildUrlFormat, collectionUri, teamProject, buildId); + } + } + + // https://github.com/moby/moby/commit/df23a1e675c7e3cbad617374d85c48103541ee14?short_path=6206c94#diff-6206c94cde21ec0a5563c8369b71e609 + // Supported format for GitHub issues: #26 GH-26 repositoryName#26 repositoryNameGH-26, where GH is case in-sensitive. + private readonly _issueRegex = new RegExp("(?:^|[^A-Za-z0-9_]?)([a-z0-9_]+/[a-zA-Z0-9-_.]+)?(?:#|[G|g][H|h]-)([0-9]+)(?:[^A-Za-z_]|$)", "gm"); + private readonly _changeLogTitle: string = tl.loc("ChangeLogTitle"); + private readonly _seeMoreText: string = tl.loc("SeeMoreText"); + private readonly _noStateSpecified: string = "none"; + private readonly _defaultGroup: string = tl.loc("DefaultCategory"); + private readonly _changeLogVisibleLimit: number = 10; + private readonly _changeLogTitleFormat: string = "\n\n## %s:\n\n"; + private readonly _groupTitleFormat: string = "\n### %s:\n\n"; + private readonly _buildUrlFormat: string = "%s/%s/_build/results?buildId=%s&view=logs"; + private readonly _autoGeneratedTextFormat: string = "This list of changes was [auto generated](%s)."; + private readonly _seeMoreChangeLogFormat: string = "
%s\n\n%s\n%s
"; // For showing See more button if more than 10 commits message are to be shown to user. +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/Constants.ts b/_generated/GitHubReleaseV1/operations/Constants.ts new file mode 100644 index 000000000000..cbc21d3c713a --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/Constants.ts @@ -0,0 +1,24 @@ + +export class Inputs { + public static readonly action = "action"; + public static readonly repositoryName = "repositoryName"; + public static readonly tag = "tag"; + public static readonly tagSource = "tagSource"; + public static readonly target = "target"; + public static readonly title = "title"; + public static readonly isDraft = "isDraft"; + public static readonly isPreRelease = "isPreRelease"; + public static readonly gitHubConnection = "gitHubConnection"; + public static readonly assets = "assets"; + public static readonly assetUploadMode = "assetUploadMode"; + public static readonly releaseNotesSource = "releaseNotesSource"; + public static readonly releaseNotesInline = "releaseNotesInline"; + public static readonly releaseNotesFilePath = "releaseNotesFilePath"; + public static readonly addChangeLog = "addChangeLog"; + public static readonly changeLogLabels = "changeLogLabels"; + public static readonly deleteExistingAssets = "deleteExistingAssets"; + public static readonly tagPattern = "tagPattern"; + public static readonly changeLogCompareToRelease = "changeLogCompareToRelease"; + public static readonly changeLogCompareToReleaseTag = "changeLogCompareToReleaseTag"; + public static readonly changeLogType = "changeLogType"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/Helper.ts b/_generated/GitHubReleaseV1/operations/Helper.ts new file mode 100644 index 000000000000..fcaa3d38cabc --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/Helper.ts @@ -0,0 +1,283 @@ +import tl = require("azure-pipelines-task-lib/task"); +import * as telemetry from "azure-pipelines-tasks-utility-common/telemetry"; +import { Utility, GitHubAttributes, AzureDevOpsVariables, ActionType} from "./Utility"; +import { Inputs } from "./Constants"; +import { Release } from "./Release"; +import * as crypto from "crypto"; + +interface IRelease { + tagName: string; + id: number; +} + +interface ITelemetryData { + area: string; + action: string; + repository: string; + tagSource: string; + isDraft: boolean; + isPreRelease: boolean; + addChangeLog: boolean; +} + +export class Helper { + + /** + * Returns tag name to be used for creating a release. + * If tagPattern is specified, returns tag matching the given pattern + * If user has specified tag, then use it + * else if $(Build.SourceBranch) is referencing to a tag, then parse tag name and use it + * else fetch tag from the target specified by user + * if no tag found for that target commit, then return undefined + * else if more than 1 tag found, then throw error + * else return the found tag name + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param tagPattern + */ + public async getTagForCommitTarget(githubEndpointToken: string, repositoryName: string, target: string, tagPattern: string = null): Promise { + console.log(tl.loc("FetchTagForTarget", target)); + let tag = undefined; + + let commit_sha: string = await this.getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + tl.debug("commit sha for target: " + commit_sha); + let buildSourceVersion = tl.getVariable(AzureDevOpsVariables.buildSourceVersion); + + // If the buildSourceVersion and user specified target does not match, then prefer user specified target + if (commit_sha !== buildSourceVersion) { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + else { + let buildSourceBranch = tl.getVariable(AzureDevOpsVariables.buildSourceBranch); + let normalizedBranch = Utility.normalizeBranchName(buildSourceBranch); + + // Check if branch is referencing to tag, if yes, then parse tag from branch name e.g. refs/tags/v1.0.1 + // Else fetch tag from commit + if (!!normalizedBranch) { + tag = normalizedBranch; + if (!!tagPattern && !Utility.isTagMatching(tag, tagPattern)) { + tag = null; + } + } + else { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + } + + if (!!tag) { + console.log(tl.loc("FetchTagForTargetSuccess", target)); + } + + return tag; + } + + /** + * Returns latest commit on the target if target is branch else returns target. + * Target can be branch as well e.g. 'master' and in this scenario we need to fetch commit associated to that branch + * @param githubEndpointToken + * @param repositoryName + * @param target + */ + public async getCommitShaFromTarget(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let commit_sha: string = undefined; + let response = await new Release().getBranch(githubEndpointToken, repositoryName, target); + tl.debug("Get branch response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + commit_sha = response.body[GitHubAttributes.commit][GitHubAttributes.sha]; + } + else if (response.statusCode === 404) { + commit_sha = target; + } + else { + tl.error(tl.loc("GithubApiFailError")); + throw new Error(response.body[GitHubAttributes.message]); + } + + return commit_sha; + } + + /** + * Returns releaseId associated with the tag. + * If 0 release found return undefined + * else if 1 release found return releaseId + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async getReleaseIdForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let release = new Release(); + + // Fetching all releases in the repository. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let releasesWithGivenTag: IRelease[] = []; + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + (releasesResponse.body || []).forEach(release => { + tl.debug("release[GitHubAttributes.tagName]: " + release[GitHubAttributes.tagName] + " " + "tag: " + tag); + // Push release if tag matches + if (release[GitHubAttributes.tagName] === tag) { + releasesWithGivenTag.push({ + tagName: release[GitHubAttributes.tagName], + id: release[GitHubAttributes.id] + } as IRelease); + } + }); + + // Throw error in case of ambiguity as we do not know which release to pick for editing or deleting release. + if (releasesWithGivenTag.length >= 2) { + throw new Error(tl.loc("MultipleReleasesFoundError", tag)); + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + else { + return releasesWithGivenTag.length === 0 ? null : releasesWithGivenTag[0].id; + } + } + else { + tl.error(tl.loc("GetReleasesError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns tag object associated with the commit. + * If 0 tag found return undefined + * else if 1 tag found return tag object + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param filterValue + * @param filterTagsCallback Callback to filter the tags + */ + public async filterTag(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]): Promise { + let release = new Release(); + + // Fetching the tags in the repository + let tagsResponse = await release.getTags(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + let filteredTags: any[] = []; + + // Fetching tags api call may end up in paginated results. + // So, traversing pages one by one and throwing error if more than 1 tag found. + while (true) { + tl.debug("Get tags response: " + JSON.stringify(tagsResponse)); + + if (tagsResponse.statusCode === 200) { + // Parse header link and get links to different pages + links = Utility.parseHTTPHeaderLink(tagsResponse.headers[GitHubAttributes.link]); + + // Filter the tags returned in current page + let tags: any[] = filterTagsCallback(tagsResponse.body, filterValue); + + if (!!tags && tags.length > 0) { + // Push returned tags in filtered tags. + tags.forEach((tag: any) => { + filteredTags.push(tag); + }) + + // Throw error in case of ambiguity as we do not know which tag to pick for creating release. + if (filteredTags.length >= 2 ) { + throw new Error(tl.loc("MultipleTagFound", filterValue)); + } + } + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + tagsResponse = paginatedResponse; + continue; + } + else { + return filteredTags.length === 0 ? undefined : filteredTags[0]; + } + } + else{ + tl.error(tl.loc("GetTagsError")); + throw new Error(tagsResponse.body[GitHubAttributes.message]); + } + } + } + + public publishTelemetry(): void { + let telemetryData = {} as ITelemetryData; + + const releaseId: string = tl.getVariable(AzureDevOpsVariables.releaseId); + + telemetryData.area = !!releaseId ? "release" : "build"; + telemetryData.action = tl.getInput(Inputs.action, true).toLowerCase(); + let repositoryName = tl.getInput(Inputs.repositoryName, true); + telemetryData.repository = crypto.createHash('sha256').update(repositoryName).digest('hex'); + + if (telemetryData.action !== ActionType.delete) { + + if (telemetryData.action === ActionType.create) { + telemetryData.tagSource = tl.getInput(Inputs.tagSource); + } + + telemetryData.isDraft = tl.getBoolInput(Inputs.isDraft); + telemetryData.isPreRelease = tl.getBoolInput(Inputs.isPreRelease); + telemetryData.addChangeLog = tl.getBoolInput(Inputs.addChangeLog); + } + + telemetry.emitTelemetry("TaskHub", "GitHubRelease", telemetryData); + } + + /** + * Returns tag name associated with the commit. + * If tagPattern is specified returns tag name + * If 0 tag found return undefined + * else if 1 tag found return tag name + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param commit_sha + */ + private async _getTagForCommit(githubEndpointToken: string, repositoryName: string, commit_sha: string, tagPattern: string = null): Promise { + let filteredTag: any; + let filterTagsCallback = (tagsList: any[], commit_sha: string): any[] => { + tagsList = this._filterTagsByCommitSha(tagsList, commit_sha); + if (!tagPattern) { + return tagsList; + } + return tagsList.filter((tag: any) => Utility.isTagMatching(tag[GitHubAttributes.nameAttribute], tagPattern)); + } + + filteredTag = await this.filterTag(githubEndpointToken, repositoryName, commit_sha, filterTagsCallback); + + return filteredTag && filteredTag[GitHubAttributes.nameAttribute]; + } + + /** + * Returns an array of matched tags, filtering on basis of commit sha + */ + private _filterTagsByCommitSha = (tagsList: any[], commit_sha: string): any[] => { + let filteredTags: any[] = []; + + for (let tag of (tagsList || [])) { + if (tag[GitHubAttributes.commit][GitHubAttributes.sha] === commit_sha) { + filteredTags.push(tag); + } + } + + return filteredTags; + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/Release.ts b/_generated/GitHubReleaseV1/operations/Release.ts new file mode 100644 index 000000000000..7510be5205f4 --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/Release.ts @@ -0,0 +1,259 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import path = require("path"); +import fs = require('fs'); +import mime = require('browserify-mime'); +import { Utility } from "./Utility"; +import { WebRequest, sendRequest, WebResponse } from "./webClient"; + +export class Release { + + public async createRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._createReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "POST"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Create release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async editRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "PATCH"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Edit release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteReleaseAsset(githubEndpointToken: string, repositoryName: string, asset_id: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._deleteReleaseAssetApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, asset_id); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release asset request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + + public async uploadReleaseAsset(githubEndpointToken: string, filePath: string, uploadUrl: string): Promise { + let fileName = path.basename(filePath); + tl.debug("Filename: " + fileName); + + let rd = fs.createReadStream(filePath); + var stats = fs.statSync(filePath); + + let request = new WebRequest(); + request.uri = util.format(this._uploadReleaseAssetApiUrlFormat, uploadUrl.split('{')[0], encodeURIComponent(fileName)); + request.method = "POST"; + request.headers = { + "Content-Type": mime.lookup(fileName), + 'Content-Length': stats.size, + 'Authorization': 'token ' + githubEndpointToken + }; + request.body = rd; + tl.debug("Upload release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getBranch(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getBranchApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, target); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get branch request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getTags(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getTagsApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get tags request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getReleases(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get releases request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getLatestRelease(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getLatestReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get latest release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getPaginatedResult(githubEndpointToken: string, nextPageLink: string): Promise { + let request = new WebRequest(); + + request.uri = nextPageLink; + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get paginated request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsList(githubEndpointToken: string,repositoryName: string, startCommitSha: string, endCommitSha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsListApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, startCommitSha, endCommitSha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits list request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsBeforeGivenSha(githubEndpointToken: string,repositoryName: string, sha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsBeforeGivenShaApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, sha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits before given sha request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getIssuesList(githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + let request = new WebRequest(); + request.uri = util.format(this._graphQLUrlFormat, Utility.getGitHubApiUrl()); + request.method = "POST"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Fetching labels for issues: " + issues); + let issuesQuery = issues.map(issue => `_${issue}: issueOrPullRequest(number: ${issue}){ ...labelsForIssue ...labelsForPullRequest }`).join(", "); + let repositoryDetails = repositoryName.split("/"); + let labelsFragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let labelsFragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + changedFiles + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let fragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + }`; + let fragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + }`; + + let query = `query{ + repository(owner: "${repositoryDetails[0]}", name: "${repositoryDetails[1]}"){ + ${issuesQuery} + } + } + ${includeLabels ? labelsFragmentForIssue : fragmentForIssue} + ${includeLabels ? labelsFragmentForPullRequest : fragmentForPullRequest}`; + request.body = JSON.stringify({ query }); + tl.debug("Get issues along with labels: " + JSON.stringify(request)); + return await sendRequest(request); + } + + private readonly _createReleaseApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _editOrDeleteReleaseApiUrlFormat: string = "%s/repos/%s/releases/%s"; + private readonly _deleteReleaseAssetApiUrlFormat: string = "%s/repos/%s/releases/assets/%s"; + private readonly _uploadReleaseAssetApiUrlFormat: string = "%s?name=%s"; + private readonly _getReleasesApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _getLatestReleasesApiUrlFormat: string = "%s/repos/%s/releases/latest"; + private readonly _getBranchApiUrlFormat: string = "%s/repos/%s/branches/%s"; + private readonly _getTagsApiUrlFormat: string = "%s/repos/%s/tags"; + private readonly _getCommitsListApiUrlFormat: string = "%s/repos/%s/compare/%s...%s"; + private readonly _getCommitsBeforeGivenShaApiUrlFormat: string = "%s/repos/%s/commits?sha=%s&per_page=100"; + private readonly _graphQLUrlFormat: string = "%s/graphql"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/operations/Utility.ts b/_generated/GitHubReleaseV1/operations/Utility.ts new file mode 100644 index 000000000000..96a1d317b5f4 --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/Utility.ts @@ -0,0 +1,364 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import glob = require('glob'); +import fs = require('fs'); + +export class Utility { + + public static getGithubEndPointToken(githubEndpoint: string): string { + const githubEndpointObject = tl.getEndpointAuthorization(githubEndpoint, false); + let githubEndpointToken: string = null; + + if (!!githubEndpointObject) { + tl.debug("Endpoint scheme: " + githubEndpointObject.scheme); + + if (githubEndpointObject.scheme === 'PersonalAccessToken') { + githubEndpointToken = githubEndpointObject.parameters.accessToken + } else if (githubEndpointObject.scheme === 'OAuth'){ + // scheme: 'OAuth' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme === 'Token'){ + // scheme: 'Token' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme) { + throw new Error(tl.loc("InvalidEndpointAuthScheme", githubEndpointObject.scheme)); + } + } + + if (!githubEndpointToken) { + throw new Error(tl.loc("InvalidGitHubEndpoint", githubEndpoint)); + } + + return githubEndpointToken; + } + + public static getUploadAssets(pattern: string): string[] { + let githubReleaseAssets: Set = new Set(); + + /** Check for one or multiples files into array + * Accept wildcards to look for files + */ + let filePaths: string[] = glob.sync(pattern); + + (filePaths || []).forEach((filePath) => { + if (!githubReleaseAssets.has(filePath)) { + githubReleaseAssets.add(filePath) + } + }) + + return Array.from(githubReleaseAssets); + } + + public static isFile(asset: string): boolean { + return fs.lstatSync(path.resolve(asset)).isFile(); + } + + public static isPatternADirectory(assets: string[], pattern: string): boolean { + if (assets && assets.length === 1 && pattern) { + if ((path.resolve(assets[0]) === path.resolve(pattern)) && tl.exist(path.resolve(pattern)) && tl.stats(path.resolve(pattern)).isDirectory()) { + tl.debug("Pattern is a directory " + pattern); + return true; + } + } + return false; + } + + public static validateUploadAssets(assets: string[]): void { + if (assets && assets.length > 0) { + try { + assets.forEach(function (asset) { + fs.accessSync(path.resolve(asset)); + }) + } catch (err) { + tl.warning(tl.loc("MissingAssetError", err.path)); + } + } + } + + public static getReleaseNote(releaseNotesSource: string, releaseNotesFile: any, releaseNoteInput: string, changeLog: string): string { + let releaseNote: string = ""; + + if (releaseNotesSource === ReleaseNotesSelectionMode.filePath) { + + if (fs.lstatSync(path.resolve(releaseNotesFile)).isDirectory()) { + console.log(tl.loc("ReleaseNotesFileIsDirectoryError", releaseNotesFile)); + } + else { + releaseNote = fs.readFileSync(releaseNotesFile).toString(); + } + } + else { + releaseNote = releaseNoteInput; + } + tl.debug("ReleaseNote:\n" + releaseNote); + + if (!releaseNote) { + releaseNote = ""; + } + + // Append commits and issues to release note. + if (changeLog){ + releaseNote = releaseNote + changeLog; + } + + return releaseNote; + } + + public static getGitHubApiUrl(): string { + let githubApiUrlInput: string = undefined; // Todo: mdakbar: get GHE url + return githubApiUrlInput ? githubApiUrlInput : this._githubApiUrl; // url without slash at end + } + + public static normalizeBranchName(branchName: string): string { + if (!!branchName && branchName.startsWith(this._tagRef)) { + return branchName.substring(this._tagRef.length); + } + return undefined; + } + + /** + * Returns the parsed HTTP header link if it exists. + * E.g. Link: '; rel="next", ; rel="last"' + * Returned object would be like { + * "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + * "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + * } + * @param headerLink + */ + public static parseHTTPHeaderLink(headerLink: string): { [key: string]: string } { + if (!headerLink) { + // No paginated results found + return null; + } + + // Split pages by comma as pages are separated by comma + let pages = headerLink.split(Delimiters.comma); + let links: { [key: string]: string } = {}; + + // Parse each page to get link and rel + (pages || []).forEach((page) => { + let section: string[] = page.split(Delimiters.semiColon); + + // Atleast link and rel should be present else header link format has changed + if (section.length < 2) { + throw new Error("section could not be split on ';'"); + } + + // Reference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n + // Get link + let urlMatch = section[0].trim().match(this._githubPaginatedLinkRegex); // If it didn't match, it will return null, else it will return match at first position + let relMatch = null; + + // Get rel, there can be other attributes like rel. So for loop is needed to filter rel attribute. + for (let i = 1; i < section.length; i++) { + relMatch = section[i].trim().match(this._githubPaginatedRelRegex); // If it didn't match, it will return null, else it will return match at first position + + // Break as soon as rel attribute is found + if (!!relMatch) { + break; + } + } + + // If both link and rel are found, append it to dictionary + if (urlMatch && relMatch) { + links[relMatch[1]] = urlMatch[1]; + } + + }) + + tl.debug("Parsed link: " + JSON.stringify(links)); + return links; + } + + public static extractRepositoryOwnerAndName(repositoryName: string): IGitHubRepositoryInfo { + let repositoryInfo = repositoryName.split(Delimiters.slash); + + return { + owner: repositoryInfo[0], + name: repositoryInfo[1] + } + } + + public static extractRepoAndIssueId(repoIssueId: string): IRepositoryIssueId { + let repoIssueIdInfo: string[] = repoIssueId.split(Delimiters.hash); + let repo: string = repoIssueIdInfo[0]; + let issueId: string = repoIssueIdInfo[1]; + + return { + repository: repo, + issueId: issueId + } + } + + public static getFirstLine(commitMessage: string): string { + commitMessage = (commitMessage || "").trim(); + const match = commitMessage.match(this._onlyFirstLine); + + tl.debug("Commit message: " + commitMessage); + tl.debug("match: " + match); + + return match[0]; + } + + public static isTagSourceAuto(tagSource: string) { + return (tagSource === TagSelectionMode.gitTag); + } + + public static validateTagSource(tagSource: string, action: string) { + if (action === ActionType.create && tagSource !== TagSelectionMode.gitTag && tagSource !== TagSelectionMode.userSpecifiedTag) { + throw new Error(tl.loc("InvalidTagSource", tagSource)); + } + } + + public static validateAction(action: string) { + if (action !== ActionType.create && action !== ActionType.edit && action !== ActionType.delete) { + tl.debug("Invalid action input"); // for purpose of L0 test only. + throw new Error(tl.loc("InvalidActionSet", action)); + } + } + + public static validateReleaseNotesSource(releaseNotesSource: string) { + if (releaseNotesSource !== ReleaseNotesSelectionMode.filePath && releaseNotesSource !== ReleaseNotesSelectionMode.inline) { + throw new Error(tl.loc("InvalidReleaseNotesSource", releaseNotesSource)); + } + } + + public static validateStartCommitSpecification(compareWith: string) { + if (compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastFullRelease.toUpperCase() + && compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastNonDraftRelease.toUpperCase() + && compareWith.toUpperCase() != changeLogStartCommitSpecification.lastNonDraftReleaseByTag.toUpperCase()) { + throw new Error(tl.loc("InvalidCompareWithAttribute", compareWith)); + } + } + + public static validateChangeLogType(changeLogType: string) { + if (changeLogType.toUpperCase() !== ChangeLogType.issueBased.toUpperCase() + && changeLogType.toUpperCase() !== ChangeLogType.commitBased.toUpperCase() ) { + throw new Error(tl.loc("InvalidChangeLogTypeAttribute", changeLogType)); + } + } + public static validateAssetUploadMode(assetUploadMode: string) { + if (assetUploadMode !== AssetUploadMode.delete && assetUploadMode !== AssetUploadMode.replace) { + throw new Error(tl.loc("InvalidAssetUploadMode", assetUploadMode)); + } + } + + public static validateTag(tag: string, tagSource: string, action: string) { + if (!tag) { + if (action === ActionType.edit || action === ActionType.delete) { + throw new Error(tl.loc("TagRequiredEditDeleteAction", action)); + } + else if (action === ActionType.create && !this.isTagSourceAuto(tagSource)) { + throw new Error(tl.loc("TagRequiredCreateAction")); + } + } + + } + + public static isTagMatching(tag: string, tagPattern: string): boolean { + let tagPatternRegex = new RegExp("^" + tagPattern + "$"); + return tagPatternRegex.test(tag); + } + + private static readonly _onlyFirstLine = new RegExp("^.*$", "m"); + private static readonly _githubPaginatedLinkRegex = new RegExp("^<(.*)>$"); + private static readonly _githubPaginatedRelRegex = new RegExp('^rel="(.*)"$'); + private static readonly _tagRef: string = "refs/tags/"; + private static readonly _githubApiUrl: string = "https://api.github.com"; // url without slash at end +} + +export class TagSelectionMode { + public static readonly gitTag: string = "gitTag"; + public static readonly userSpecifiedTag: string = "userSpecifiedTag"; +} + +export class AssetUploadMode { + public static readonly delete = "delete"; + public static readonly replace = "replace"; +} + +export class changeLogStartCommitSpecification { + public static readonly lastFullRelease = "lastFullRelease"; + public static readonly lastNonDraftRelease = "lastNonDraftRelease"; + public static readonly lastNonDraftReleaseByTag = "lastNonDraftReleaseByTag"; +} + +export enum ChangeLogStartCommit{ + lastFullRelease = 0, + lastNonDraftRelease, + lastNonDraftReleaseByTag +} + +export class ChangeLogType{ + public static readonly issueBased = "issueBased"; + public static readonly commitBased = "commitBased"; +} +class ReleaseNotesSelectionMode { + public static readonly inline = "inline"; + public static readonly filePath = "filePath"; +} + +export class GitHubIssueState{ + public static readonly closed = "CLOSED"; + public static readonly merged = "MERGED"; +} + +export class GitHubAttributes { + public static readonly id: string = "id"; + public static readonly nameAttribute: string = "name"; + public static readonly tagName: string = "tag_name"; + public static readonly uploadUrl: string = "upload_url"; + public static readonly htmlUrl: string = "html_url"; + public static readonly assets: string = "assets"; + public static readonly commit: string = "commit"; + public static readonly message: string = "message"; + public static readonly state: string = "state"; + public static readonly title: string = "title"; + public static readonly commits: string = "commits"; + public static readonly sha: string = "sha"; + public static readonly behind: string = "behind"; + public static readonly status: string = "status"; + public static readonly link: string = "link"; + public static readonly next: string = "next"; + public static readonly draft: string = "draft"; + public static readonly preRelease: string = "prerelease"; +} + +export class ActionType { + public static readonly create = "create"; + public static readonly edit = "edit"; + public static readonly delete = "delete"; +} + +export class AzureDevOpsVariables { + public static readonly buildSourceVersion: string = "Build.SourceVersion"; + public static readonly buildSourceBranch: string = "Build.SourceBranch"; + public static readonly releaseWebUrl: string = "Release.ReleaseWebURL"; + public static readonly collectionUri: string = "System.TeamFoundationCollectionUri"; + public static readonly teamProject: string = "System.TeamProject"; + public static readonly buildId: string = "Build.BuildId"; + public static readonly releaseId: string = "Release.ReleaseId"; +} + +export interface IGitHubRepositoryInfo { + owner: string; + name: string; +} + +export interface IRepositoryIssueId { + repository: string; + issueId: string; +} + +export class Delimiters { + public static readonly newLine: string = "\n"; + public static readonly hash: string = "#"; + public static readonly slash: string = "/"; + public static readonly semiColon: string = ";"; + public static readonly comma: string = ","; + public static readonly space: string = " "; + public static readonly openingBracketWithSpace: string = " ["; + public static readonly closingBracketWithSpace: string = " ]"; + public static readonly star: string = "*"; + public static readonly colon: string = ":"; +} diff --git a/_generated/GitHubReleaseV1/operations/webClient.ts b/_generated/GitHubReleaseV1/operations/webClient.ts new file mode 100644 index 000000000000..19c509790deb --- /dev/null +++ b/_generated/GitHubReleaseV1/operations/webClient.ts @@ -0,0 +1,112 @@ +import tl = require('azure-pipelines-task-lib/task'); +import httpClient = require("typed-rest-client/HttpClient"); +import httpInterfaces = require("typed-rest-client/Interfaces"); +import util = require("util"); + +let proxyUrl: string = tl.getVariable("agent.proxyurl"); +var requestOptions: httpInterfaces.IRequestOptions = proxyUrl ? { + proxy: { + proxyUrl: proxyUrl, + proxyUsername: tl.getVariable("agent.proxyusername"), + proxyPassword: tl.getVariable("agent.proxypassword"), + proxyBypassHosts: tl.getVariable("agent.proxybypasslist") ? JSON.parse(tl.getVariable("agent.proxybypasslist")) : null + } +} : {}; + +let ignoreSslErrors: string = tl.getVariable("VSTS_ARM_REST_IGNORE_SSL_ERRORS"); +requestOptions.ignoreSslError = ignoreSslErrors && ignoreSslErrors.toLowerCase() == "true"; + +var httpCallbackClient = new httpClient.HttpClient(tl.getVariable("AZURE_HTTP_USER_AGENT"), null, requestOptions); + +export class WebRequest { + public method: string; + public uri: string; + // body can be string or ReadableStream + public body: string | NodeJS.ReadableStream; + public headers: any; +} + +export class WebResponse { + public statusCode: number; + public statusMessage: string; + public headers: any; + public body: any; +} + +export class WebRequestOptions { + public retriableErrorCodes: string[]; + public retryCount: number; + public retryIntervalInSeconds: number; + public retriableStatusCodes: number[]; + public retryRequestTimedout: boolean; +} + +export async function sendRequest(request: WebRequest, options?: WebRequestOptions): Promise { + let i = 0; + let retryCount = options && options.retryCount ? options.retryCount : 5; + let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2; + let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"]; + let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504]; + let timeToWait: number = retryIntervalInSeconds; + while (true) { + try { + let response: WebResponse = await sendRequestInternal(request); + if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + continue; + } + + return response; + } + catch (error) { + if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + } + else { + if (error.code) { + console.log("##vso[task.logissue type=error;code=" + error.code + ";]"); + } + + throw error; + } + } + } +} + +export function sleepFor(sleepDurationInSeconds): Promise { + return new Promise((resolve, reject) => { + setTimeout(resolve, sleepDurationInSeconds * 1000); + }); +} + +async function sendRequestInternal(request: WebRequest): Promise { + tl.debug(util.format("[%s]%s", request.method, request.uri)); + var response: httpClient.HttpClientResponse = await httpCallbackClient.request(request.method, request.uri, request.body, request.headers); + return await toWebResponse(response); +} + +async function toWebResponse(response: httpClient.HttpClientResponse): Promise { + var res = new WebResponse(); + if (response) { + res.statusCode = response.message.statusCode; + res.statusMessage = response.message.statusMessage; + res.headers = response.message.headers; + var body = await response.readBody(); + if (body) { + try { + res.body = JSON.parse(body); + } + catch (error) { + tl.debug("Could not parse response: " + JSON.stringify(error, null, 2)); + tl.debug("Response: " + JSON.stringify(res.body)); + res.body = body; + } + } + } + + return res; +} diff --git a/_generated/GitHubReleaseV1/package-lock.json b/_generated/GitHubReleaseV1/package-lock.json new file mode 100644 index 000000000000..8d3554ed2295 --- /dev/null +++ b/_generated/GitHubReleaseV1/package-lock.json @@ -0,0 +1,657 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha512-JgOVmcJwa5Fw/deqBPC/lYG/D2duDIcv6V/u58bQhThOHAYFf6tYd+INHc/uaggWSnx5nxcKwjyHcMU1xweEWA==", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + }, + "dependencies": { + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha512-o9QYRJN5WgS8oCtqvwzzcfnzaTnDPr7HpUsQdSXscTyzXbjvl4wSHPTUKOKzEaDeQvOuyRtt3ui+ujM7x7TReQ==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/_generated/GitHubReleaseV1/package.json b/_generated/GitHubReleaseV1/package.json new file mode 100644 index 000000000000..a5152f3685e7 --- /dev/null +++ b/_generated/GitHubReleaseV1/package.json @@ -0,0 +1,23 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.0", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^3.0.6-preview.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "brace-expansion": "1.1.8", + "browserify-mime": "1.2.9", + "glob": "7.1.2", + "q": "1.4.1", + "semver": "5.4.1", + "typed-rest-client": "^1.8.9", + "vso-node-api": "6.0.1-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GitHubReleaseV1/task.json b/_generated/GitHubReleaseV1/task.json new file mode 100644 index 000000000000..c27b255c23f5 --- /dev/null +++ b/_generated/GitHubReleaseV1/task.json @@ -0,0 +1,348 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": false, + "version": { + "Major": 1, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "gitTag", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "gitTag": "Git tag", + "userSpecifiedTag": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = gitTag", + "helpMarkDown": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "filePath", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "filePath": "Release notes file", + "inline": "Inline release notes" + } + }, + { + "name": "releaseNotesFilePath", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = filePath" + }, + { + "name": "releaseNotesInline", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = inline", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" + } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + }, + "_buildConfigMapping": { + "Default": "1.224.1", + "Node16-219": "1.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/task.loc.json b/_generated/GitHubReleaseV1/task.loc.json new file mode 100644 index 000000000000..38470f8948ba --- /dev/null +++ b/_generated/GitHubReleaseV1/task.loc.json @@ -0,0 +1,348 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": false, + "version": { + "Major": 1, + "Minor": 224, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "ms-resource:loc.group.displayName.changeLogConfiguration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "ms-resource:loc.input.label.gitHubConnection", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gitHubConnection" + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "ms-resource:loc.input.label.repositoryName", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.repositoryName", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "ms-resource:loc.input.label.action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.action", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "ms-resource:loc.input.label.target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.target" + }, + { + "name": "tagSource", + "type": "radio", + "label": "ms-resource:loc.input.label.tagSource", + "required": true, + "defaultValue": "gitTag", + "visibleRule": "action = create", + "helpMarkDown": "ms-resource:loc.input.help.tagSource", + "options": { + "gitTag": "Git tag", + "userSpecifiedTag": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "ms-resource:loc.input.label.tagPattern", + "required": false, + "visibleRule": "tagSource = gitTag", + "helpMarkDown": "ms-resource:loc.input.help.tagPattern" + }, + { + "name": "tag", + "type": "string", + "label": "ms-resource:loc.input.label.tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", + "helpMarkDown": "ms-resource:loc.input.help.tag" + }, + { + "name": "title", + "type": "string", + "label": "ms-resource:loc.input.label.title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.title" + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "ms-resource:loc.input.label.releaseNotesSource", + "required": false, + "defaultValue": "filePath", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesSource", + "options": { + "filePath": "Release notes file", + "inline": "Inline release notes" + } + }, + { + "name": "releaseNotesFilePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.releaseNotesFilePath", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesFilePath", + "visibleRule": "releaseNotesSource = filePath" + }, + { + "name": "releaseNotesInline", + "type": "multiLine", + "label": "ms-resource:loc.input.label.releaseNotesInline", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesInline", + "visibleRule": "releaseNotesSource = inline", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "ms-resource:loc.input.label.assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assets", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "ms-resource:loc.input.label.assetUploadMode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assetUploadMode", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "ms-resource:loc.input.label.isDraft", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isDraft", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "ms-resource:loc.input.label.isPreRelease", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.isPreRelease" + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "ms-resource:loc.input.label.addChangeLog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.addChangeLog" + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogCompareToRelease", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToRelease", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "ms-resource:loc.input.label.changeLogCompareToReleaseTag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToReleaseTag" + }, + { + "name": "changeLogType", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogType", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogType", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "ms-resource:loc.input.label.changeLogLabels", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "ms-resource:loc.input.help.changeLogLabels" + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "main.js" + } + }, + "messages": { + "GithubApiFailError": "ms-resource:loc.messages.GithubApiFailError", + "GetTagsError": "ms-resource:loc.messages.GetTagsError", + "GetReleasesError": "ms-resource:loc.messages.GetReleasesError", + "CreateReleaseError": "ms-resource:loc.messages.CreateReleaseError", + "EditReleaseError": "ms-resource:loc.messages.EditReleaseError", + "DeleteReleaseError": "ms-resource:loc.messages.DeleteReleaseError", + "CreatingRelease": "ms-resource:loc.messages.CreatingRelease", + "CreateReleaseSuccess": "ms-resource:loc.messages.CreateReleaseSuccess", + "ReleaseAlreadyExists": "ms-resource:loc.messages.ReleaseAlreadyExists", + "EditingRelease": "ms-resource:loc.messages.EditingRelease", + "EditReleaseSuccess": "ms-resource:loc.messages.EditReleaseSuccess", + "NoReleaseFoundToEditCreateRelease": "ms-resource:loc.messages.NoReleaseFoundToEditCreateRelease", + "DeletingRelease": "ms-resource:loc.messages.DeletingRelease", + "DeleteReleaseSuccess": "ms-resource:loc.messages.DeleteReleaseSuccess", + "NoReleaseFoundToDelete": "ms-resource:loc.messages.NoReleaseFoundToDelete", + "FetchReleaseForTag": "ms-resource:loc.messages.FetchReleaseForTag", + "FetchReleaseForTagSuccess": "ms-resource:loc.messages.FetchReleaseForTagSuccess", + "FetchTagForTarget": "ms-resource:loc.messages.FetchTagForTarget", + "FetchTagForTargetSuccess": "ms-resource:loc.messages.FetchTagForTargetSuccess", + "MissingAssetError": "ms-resource:loc.messages.MissingAssetError", + "MultipleReleasesFoundError": "ms-resource:loc.messages.MultipleReleasesFoundError", + "MultipleTagFound": "ms-resource:loc.messages.MultipleTagFound", + "NoTagFound": "ms-resource:loc.messages.NoTagFound", + "DeleteAllExistingAssets": "ms-resource:loc.messages.DeleteAllExistingAssets", + "DuplicateAssetFound": "ms-resource:loc.messages.DuplicateAssetFound", + "AssetsDeletedSuccessfully": "ms-resource:loc.messages.AssetsDeletedSuccessfully", + "DeletingDuplicateAsset": "ms-resource:loc.messages.DeletingDuplicateAsset", + "SkipDuplicateAssetFound": "ms-resource:loc.messages.SkipDuplicateAssetFound", + "AssetDeletedSuccessfully": "ms-resource:loc.messages.AssetDeletedSuccessfully", + "AllAssetsUploadedSuccessfully": "ms-resource:loc.messages.AllAssetsUploadedSuccessfully", + "ErrorDeletingDuplicateAsset": "ms-resource:loc.messages.ErrorDeletingDuplicateAsset", + "ErrorDeletingAsset": "ms-resource:loc.messages.ErrorDeletingAsset", + "DeletingAsset": "ms-resource:loc.messages.DeletingAsset", + "NoAssetFoundToDelete": "ms-resource:loc.messages.NoAssetFoundToDelete", + "UploadingAssets": "ms-resource:loc.messages.UploadingAssets", + "UploadingAsset": "ms-resource:loc.messages.UploadingAsset", + "UploadAssetError": "ms-resource:loc.messages.UploadAssetError", + "UploadAssetSuccess": "ms-resource:loc.messages.UploadAssetSuccess", + "NoAssetFoundToUpload": "ms-resource:loc.messages.NoAssetFoundToUpload", + "ReleaseNotesFileIsDirectoryError": "ms-resource:loc.messages.ReleaseNotesFileIsDirectoryError", + "AssetIsDirectoryError": "ms-resource:loc.messages.AssetIsDirectoryError", + "ComputingChangeLog": "ms-resource:loc.messages.ComputingChangeLog", + "ComputingChangeLogSuccess": "ms-resource:loc.messages.ComputingChangeLogSuccess", + "CommitDiffBehind": "ms-resource:loc.messages.CommitDiffBehind", + "CommitDiffEqual": "ms-resource:loc.messages.CommitDiffEqual", + "FetchLatestPublishRelease": "ms-resource:loc.messages.FetchLatestPublishRelease", + "FetchLatestNonDraftRelease": "ms-resource:loc.messages.FetchLatestNonDraftRelease", + "FetchLastReleaseByTag": "ms-resource:loc.messages.FetchLastReleaseByTag", + "FetchLatestPublishReleaseSuccess": "ms-resource:loc.messages.FetchLatestPublishReleaseSuccess", + "FetchMatchingReleaseSuccess": "ms-resource:loc.messages.FetchMatchingReleaseSuccess", + "FetchTagMatchingReleaseSuccess": "ms-resource:loc.messages.FetchTagMatchingReleaseSuccess", + "GetLatestReleaseError": "ms-resource:loc.messages.GetLatestReleaseError", + "NoLatestPublishRelease": "ms-resource:loc.messages.NoLatestPublishRelease", + "NoMatchingReleases": "ms-resource:loc.messages.NoMatchingReleases", + "NoTagMatchingReleases": "ms-resource:loc.messages.NoTagMatchingReleases", + "FetchCommitDiff": "ms-resource:loc.messages.FetchCommitDiff", + "FetchCommitDiffSuccess": "ms-resource:loc.messages.FetchCommitDiffSuccess", + "FetchCommitDiffError": "ms-resource:loc.messages.FetchCommitDiffError", + "FetchInitialCommit": "ms-resource:loc.messages.FetchInitialCommit", + "FetchInitialCommitSuccess": "ms-resource:loc.messages.FetchInitialCommitSuccess", + "InvalidGitHubEndpoint": "ms-resource:loc.messages.InvalidGitHubEndpoint", + "InvalidEndpointAuthScheme": "ms-resource:loc.messages.InvalidEndpointAuthScheme", + "FetchInitialCommitError": "ms-resource:loc.messages.FetchInitialCommitError", + "InvalidActionSet": "ms-resource:loc.messages.InvalidActionSet", + "InvalidTagSource": "ms-resource:loc.messages.InvalidTagSource", + "InvalidReleaseNotesSource": "ms-resource:loc.messages.InvalidReleaseNotesSource", + "InvalidCompareWithAttribute": "ms-resource:loc.messages.InvalidCompareWithAttribute", + "InvalidAssetUploadMode": "ms-resource:loc.messages.InvalidAssetUploadMode", + "TagRequiredEditDeleteAction": "ms-resource:loc.messages.TagRequiredEditDeleteAction", + "TagRequiredCreateAction": "ms-resource:loc.messages.TagRequiredCreateAction", + "NoFileFoundMatchingPattern": "ms-resource:loc.messages.NoFileFoundMatchingPattern", + "PatternIsADirectory": "ms-resource:loc.messages.PatternIsADirectory", + "SearchingFileMatchingPattern": "ms-resource:loc.messages.SearchingFileMatchingPattern", + "IssuesFetchError": "ms-resource:loc.messages.IssuesFetchError", + "NoIssuesLinkedError": "ms-resource:loc.messages.NoIssuesLinkedError", + "LabelsSyntaxError": "ms-resource:loc.messages.LabelsSyntaxError", + "InvalidChangeLogTypeAttribute": "ms-resource:loc.messages.InvalidChangeLogTypeAttribute", + "ChangeLogTitle": "ms-resource:loc.messages.ChangeLogTitle", + "DefaultCategory": "ms-resource:loc.messages.DefaultCategory", + "SeeMoreText": "ms-resource:loc.messages.SeeMoreText" + }, + "_buildConfigMapping": { + "Default": "1.224.1", + "Node16-219": "1.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1/tsconfig.json b/_generated/GitHubReleaseV1/tsconfig.json new file mode 100644 index 000000000000..875bb90cd697 --- /dev/null +++ b/_generated/GitHubReleaseV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} diff --git a/_generated/GitHubReleaseV1_Node16/README.md b/_generated/GitHubReleaseV1_Node16/README.md new file mode 100644 index 000000000000..05244f53a4fb --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/README.md @@ -0,0 +1,63 @@ +# GitHub Release + +## Overview + +The [GitHub Release task](https://aka.ms/AA3m1bq) can be used to create/edit/delete a GitHub release directly from your CI/CD pipeline. This task works on cross platform Azure Pipeline agents running Windows, Linux or Mac and uses GitHub APIs to manage GitHub releases. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task, like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites are required for the task to work properly: + +#### GitHub Service Connection + +In order to perform operations on the GitHub repository, the task needs a GitHub service connection with adequate permission. If it does not exist already, you can [create a GitHub service connection](https://aka.ms/AA3am5s) in your azure pipelines project. Once the service connection is created, all you need is the name of the service connection in this task. + +## Parameters of the task + +The GitHub Release task can run in 3 action types, viz. create, edit or delete. Based on the action chosen by the user certain parameters will be ignored. The following is the list of parameters required for this task. + +* **Service Connection:** This is the name of GitHub service connection which will be used to connect to target GitHub account. You can use an existing GitHub service connection or create a new one. Note that the service connection should use OAuth or PAT for authentication. + +* **GitHub Repository:** This is the name of the GitHub repository where GitHub releases will be managed. E.g. `microsoft/vscode`. + +* **Action:** Action is the type of release operation you want perform using this task. This task can perform 3 different actions - create, edit or delete. + + * Create: This action creates a GitHub release. Throws error if a published release already exists with the given tag. + + * Edit: This action modifies a existing GitHub release. Tag is used to identify the release to be edited. Throws error if more than 1 release(draft or published) is found with the given tag. + + * Delete: This action deletes a GitHub release. Tag is used to identify the release to be deleted. Throws error if more than 1 release(draft or published) is found with the given tag. + +* **Target:** This is the commit SHA for which the GitHub release will be created. By default, the value is $(Build.SourceVersion) which corresponds to the commit for which the build was run. If you specify a branch name here(E.g. *master* ), the latest commit from this branch will be used as target. This field is ignored when using edit and delete actions. + +* **Tag Source:** This parameter allows you to choose the source of tag to be used for a release action. This is available only for *create* action. It can be done in 2 ways: + + * Git tag: Choose this option if the tag to be used in release creation has been pushed to the repository. The release will be created using the git tag that is associated with this commit. If no tag is found for the given commit, the release will not be created. If multiple tags are found, the task will throw an error. + + * User specified tag: Choose this option if you want the task to create a new tag. The release will subsequently be created using the new tag provided in the 'tag' parameter. If the tag already exists in the repository, then the release will be created for the existing tag. + +* **Tag:** This is the tag to be used for the chosen release action. You can specify the tag directly or by using variables, Eg. v\$(MajorVersion).\$(MinorVersion).\$(PatchVersion). For *edit*, *delete* actions, the release having this tag will be acted upon. For *create* action, a new release will be created with this tag. Note that this is a mandatory field for *edit* and *delete* actions. + +* **Release Title:** This is the title that will be used for release creation. If left empty, the tag name will be used as the release title. + +* **Release Notes Source:** This field lets you specify the source for the description of your GitHub release. There are 2 ways for doing this: + * Release notes file: On selecting this, you will have to specify the path to the file. The contents of this file will be copied as release notes at the time of release creation. + * Inline release notes: On selecting this, you can manually type your release notes into a text area. The contents of this text area will be copied as release notes at the time of release creation. + +* **Assets** These are the files that will be uploaded as assets for the release. You can use wild card characters to specify a set of files. All the matching files shall be uploaded. You can also specify multiple patterns - one path per line. By default, it uploads the contents of $(Build.ArtifactStagingDirectory). If the specified folder is missing, it throws a warning. + +* **Asset Upload Mode** This option is used in case of editing a release. There are 2 ways in which assets can be uploaded. + + * Delete existing assets: When using this option, the task will first delete any existing assets in the release and upload all the assets once again. + + * Replace existing assets: When using this option, the task will replace any assets that have the same name* + +* **Draft Release** Check this option if the release has to be saved as a draft release. If kept unchecked, the created release will be published. This option is ignored in case of *delete* action. + +* **Pre Release** Check this option if the release has to be marked as a pre-release. This option is ignored in case of *delete* action. + +* **Add Changelog:** Using this option you can generate and append list of changes to release notes. The list of changes(commits and issues) between this and last published release will be generated and appended to release notes. Maximum number of changes shown is 250. diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..9adf446ec67d --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub-Release", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/AA3aeiw)", + "loc.description": "Hiermit wird ein GitHub-Release erstellt, bearbeitet oder gelöscht.", + "loc.instanceNameFormat": "GitHub-Release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Konfiguration des Änderungsprotokolls", + "loc.input.label.gitHubConnection": "GitHub-Verbindung (OAuth oder PAT)", + "loc.input.help.gitHubConnection": "Geben Sie den Namen der GitHub-Dienstverbindung an, die zum Herstellen einer Verbindung mit dem GitHub-Repository verwendet werden soll. Die Verbindung muss auf einem OAuth-Token eines GitHub-Benutzers oder einem persönlichen GitHub-Zugriffstoken basieren. Weitere Informationen zu Dienstverbindungen finden Sie [hier](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Geben Sie den Namen des GitHub-Repositorys an, in dem das GitHub-Release erstellt, bearbeitet oder gelöscht wird.", + "loc.input.label.action": "Aktion", + "loc.input.help.action": "Geben Sie den Typ des auszuführenden Releasevorgangs an. Mit dieser Aufgabe kann ein GitHub-Release erstellt, bearbeitet oder gelöscht werden.", + "loc.input.label.target": "Ziel", + "loc.input.help.target": "Geben Sie den Commit-SHA an, für den das GitHub-Release erstellt wird, z. B. \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Sie können hier auch eine Variable verwenden, beispielsweise \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Tagquelle", + "loc.input.help.tagSource": "Geben Sie das Tag an, das für die Releaseerstellung verwendet werden soll. Die Option \"Git-Tag\" verwendet automatisch das Tag, das dem Git-Commit zugeordnet ist. Verwenden Sie die Option \"Benutzerdefiniertes Tag\", um manuell ein Tag anzugeben.", + "loc.input.label.tagPattern": "Tagmuster", + "loc.input.help.tagPattern": "Geben Sie das Git-Tagmuster mithilfe eines regulären Ausdrucks (z. B. \"release-v1.*\") an. Ein GitHub-Release wird nur für Commits mit übereinstimmendem Git-Tag erstellt.", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Geben Sie das Tag an, für das ein Release erstellt, bearbeitet oder gelöscht werden soll. Sie können hier auch eine Variable verwenden, z. B. \"$(myTagName)\".", + "loc.input.label.title": "Releasetitel", + "loc.input.help.title": "Geben Sie den Titel für das GitHub-Release an. Wenn Sie keinen Titel angeben, wird das Tag als Releasetitel verwendet.", + "loc.input.label.releaseNotesSource": "Quelle für Versionshinweise", + "loc.input.help.releaseNotesSource": "Geben Sie die Beschreibung für das GitHub-Release an. Verwenden Sie die Option \"Datei mit Anmerkungen zu dieser Version\", um den Inhalt einer Datei als Versionshinweise zu verwenden. Verwenden Sie die Option \"Inline-Versionshinweise\", um Anmerkungen zu dieser Version manuell einzugeben.", + "loc.input.label.releaseNotesFilePath": "Dateipfad zu Versionsanmerkungen", + "loc.input.help.releaseNotesFilePath": "Wählen Sie die Datei aus, die die Versionshinweise enthält.", + "loc.input.label.releaseNotesInline": "Versionshinweise", + "loc.input.help.releaseNotesInline": "Geben Sie hier die Versionshinweise ein. Markdown wird unterstützt.", + "loc.input.label.assets": "Ressourcen", + "loc.input.help.assets": "Geben Sie die Dateien an, die als Ressourcen für das Release hochgeladen werden sollen. Sie können Platzhalterzeichen verwenden, um mehrere Dateien anzugeben. Beispielsweise können Sie für Buildpipelines \"$(Build.ArtifactStagingDirectory)/*.zip\" oder für Releasepipelines \"$(System.DefaultWorkingDirectory)/*.zip\" verwenden. Es ist auch möglich, mehrere Muster anzugeben – ein Muster pro Zeile. Standardmäßig werden alle Dateien im Verzeichnis \"$(Build.ArtifactStagingDirectory)\" hochgeladen. Weitere Informationen zur Liste der verfügbaren vordefinierten Variablen finden Sie unter [Buildvariablen](https://aka.ms/AA4449z) und [Releasevariablen](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Uploadmodus für Ressourcen", + "loc.input.help.assetUploadMode": "Verwenden Sie die Option \"Vorhandene Ressourcen löschen\", um zunächst alle vorhandenen Ressourcen im Release zu löschen und dann alle Ressourcen hochzuladen. Verwenden Sie die Option \"Vorhandene Ressourcen ersetzen\", um alle Ressourcen mit übereinstimmenden Namen zu ersetzen.", + "loc.input.label.isDraft": "Entwurfsrelease", + "loc.input.help.isDraft": "Geben Sie an, ob das Release als (nicht veröffentlichter) Entwurf gespeichert werden soll. Bei Festlegung auf FALSE wird das Release veröffentlicht.", + "loc.input.label.isPreRelease": "Vorabversion", + "loc.input.help.isPreRelease": "Geben Sie an, ob das Release als Vorabversion gekennzeichnet werden soll.", + "loc.input.label.addChangeLog": "Änderungsprotokoll hinzufügen", + "loc.input.help.addChangeLog": "Bei Festlegung auf TRUE wird eine Liste der Änderungen (Commits und Issues) zwischen dieser und dem zuletzt veröffentlichten Release generiert und an die Versionshinweise angefügt.", + "loc.input.label.changeLogCompareToRelease": "Vergleichen mit", + "loc.input.help.changeLogCompareToRelease": "Geben Sie an, mit welchem Release der Vergleich erfolgen soll, um das Änderungsprotokoll zu generieren: \nLetztes vollständiges Release: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen, das nicht als Vorabversion gekennzeichnet ist.\nLetztes Nicht-Entwurfsrelease: Bei dieser Option wird das aktuelle Release mit dem neuesten Nicht-Entwurfsrelease verglichen.\nLetztes Nicht-Entwurfsrelease nach Tag: Bei dieser Option wird das aktuelle Release mit dem letzten Nicht-Entwurfsrelease verglichen, das mit dem angegebenen Tag übereinstimmt. Sie können anstelle eines Tags auch einen regulären Ausdruck angeben.", + "loc.input.label.changeLogCompareToReleaseTag": "Releasetag", + "loc.input.help.changeLogCompareToReleaseTag": "Geben Sie den regulären Ausdruck für das Releasetag an. Das Release, das mit diesem Tag übereinstimmt, wird als Basis für die Berechnung des Änderungsprotokolls verwendet.", + "loc.input.label.changeLogType": "Typ des Änderungsprotokolls", + "loc.input.help.changeLogType": "Das Änderungsprotokoll kann auf Commits oder Issues basieren. Ein auf Commits basierendes Änderungsprotokoll listet alle in einem Release enthaltenen Commits auf, während in einem auf Issues basierenden Änderungsprotokoll alle Issues/Pull Requests im Release aufgelistet werden.", + "loc.input.label.changeLogLabels": "Kategorien", + "loc.input.help.changeLogLabels": "Hiermit können Sie Änderungen anhand der Bezeichnung kategorisieren, die dem Issue/Pull Request zugeordnet ist. Für eine Bezeichnung können Sie den Anzeigenamen für die Kategorie und den Status des Issues angeben. Beispiel: \"\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Wenn eine Änderung mehrere Bezeichnungen aufweist, hat die erste angegebene Bezeichnung Vorrang. Lassen Sie dieses Feld leer, um eine flache Liste mit Issues/Pull Requests anzuzeigen.", + "loc.messages.GithubApiFailError": "Ein unerwarteter Fehler ist aufgetreten.", + "loc.messages.GetTagsError": "Unerwarteter Fehler beim Abrufen von Tags.", + "loc.messages.GetReleasesError": "Unerwarteter Fehler beim Abrufen von Releases.", + "loc.messages.CreateReleaseError": "Unerwarteter Fehler beim Erstellen der Release.", + "loc.messages.EditReleaseError": "Unerwarteter Fehler beim Bearbeiten des Release.", + "loc.messages.DeleteReleaseError": "Unerwarteter Fehler beim Löschen des Release.", + "loc.messages.CreatingRelease": "Release für Tag wird erstellt: %s", + "loc.messages.CreateReleaseSuccess": "Das Release wurde erfolgreich in \"%s\" erstellt.", + "loc.messages.ReleaseAlreadyExists": "Fehler beim Erstellen des Release. Für das folgende Tag ist bereits ein Release vorhanden: %s", + "loc.messages.EditingRelease": "Das Release mit folgendem Tag wird bearbeitet: %s", + "loc.messages.EditReleaseSuccess": "Release erfolgreich bearbeitet", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Es wurde kein vorhandenes Release zum Bearbeiten gefunden. Es wird ein Release mit dem folgenden Tag erstellt: %s", + "loc.messages.DeletingRelease": "Das Release für folgendes Tag wird gelöscht: %s", + "loc.messages.DeleteReleaseSuccess": "Die Release wurde erfolgreich gelöscht.", + "loc.messages.NoReleaseFoundToDelete": "Für das Tag \"%s\" wurde kein Release gefunden. Fehler beim Löschen des Release.", + "loc.messages.FetchReleaseForTag": "Das Release für das folgende Tag wird abgerufen: %s", + "loc.messages.FetchReleaseForTagSuccess": "Für folgendes Tag wurde ein Release gefunden: %s", + "loc.messages.FetchTagForTarget": "Es wird nach Tags gesucht, die dem Zielcommit zugeordnet sind: %s", + "loc.messages.FetchTagForTargetSuccess": "Für folgenden Zielcommit wurde ein Tag gefunden: %s", + "loc.messages.MissingAssetError": "Datei nicht gefunden: %s", + "loc.messages.MultipleReleasesFoundError": "Es wurde nur 1 Release erwartet, aber für das Tag \"%s\" wurde mehr als 1 Release gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.MultipleTagFound": "Es wurde nur 1 Tag erwartet, aber für den angegebenen Commit \"%s\" wurde mehr als 1 Tag gefunden. Die Aktion kann nicht ausgeführt werden.", + "loc.messages.NoTagFound": "Das Release wird nicht erstellt, weil die Tags für den Zielcommit nicht mit dem angegebenen Tagmuster übereinstimmen.", + "loc.messages.DeleteAllExistingAssets": "Alle vorhandenen Ressourcen werden gelöscht...", + "loc.messages.DuplicateAssetFound": "Doppelte Ressource gefunden: %s", + "loc.messages.AssetsDeletedSuccessfully": "Die Ressourcen wurden erfolgreich gelöscht.", + "loc.messages.DeletingDuplicateAsset": "Doppelte Ressource wird gelöscht: %s", + "loc.messages.SkipDuplicateAssetFound": "Doppelte Ressource gefunden: %s. Wird übersprungen...", + "loc.messages.AssetDeletedSuccessfully": "Die Ressource \"%s\" wurde erfolgreich gelöscht.", + "loc.messages.AllAssetsUploadedSuccessfully": "Alle Ressourcen wurden erfolgreich hochgeladen.", + "loc.messages.ErrorDeletingDuplicateAsset": "Unerwarteter Fehler beim Löschen der doppelten Ressource: %s", + "loc.messages.ErrorDeletingAsset": "Unerwarteter Fehler beim Löschen der Ressource: %s", + "loc.messages.DeletingAsset": "Ressource wird gelöscht: %s", + "loc.messages.NoAssetFoundToDelete": "Es wurden keine Ressourcen zum Löschen gefunden.", + "loc.messages.UploadingAssets": "Ressourcen werden hochgeladen...", + "loc.messages.UploadingAsset": "Datei wird hochgeladen: \"%s\"", + "loc.messages.UploadAssetError": "Unerwarteter Fehler beim Hochladen der Datei: %s", + "loc.messages.UploadAssetSuccess": "Datei erfolgreich hochgeladen: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Es wurden keine Ressourcen zum Hochladen gefunden.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Die Datei mit Versionshinweisen \"%s\" ist ein Verzeichnis und keine Datei.", + "loc.messages.AssetIsDirectoryError": "Die Ressource ist ein Verzeichnis und keine Datei. Der Upload des Verzeichnisses wird übersprungen: %s", + "loc.messages.ComputingChangeLog": "In diesem Release vorgenommene Änderungen werden berechnet...", + "loc.messages.ComputingChangeLogSuccess": "Die Änderungen wurden erfolgreich berechnet.", + "loc.messages.CommitDiffBehind": "Die Änderungen können nicht berechnet werden, weil der angegebene Zielcommit älter ist als der Commit für das neueste veröffentlichte Release.", + "loc.messages.CommitDiffEqual": "Es wurden keine Änderungen gefunden. Der angegebene Zielcommit ist mit dem Commit für das neueste veröffentlichte Release identisch.", + "loc.messages.FetchLatestPublishRelease": "Das neueste veröffentlichte Release wird abgerufen...", + "loc.messages.FetchLatestNonDraftRelease": "Das neueste Nicht-Entwurfsrelease wird abgerufen...", + "loc.messages.FetchLastReleaseByTag": "Das neueste Release mit übereinstimmendem Tagmuster wird abgerufen: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Das neueste veröffentlichte Release wurde gefunden: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Das neueste Nicht-Entwurfsrelease wurde gefunden.", + "loc.messages.FetchTagMatchingReleaseSuccess": "Das neueste Release mit übereinstimmendem Tagmuster wurde gefunden: %s", + "loc.messages.GetLatestReleaseError": "Unerwarteter Fehler beim Abrufen des neuesten veröffentlichten Release.", + "loc.messages.NoLatestPublishRelease": "Im Repository wurden noch keine Releases veröffentlicht.", + "loc.messages.NoMatchingReleases": "Keine Nicht-Entwurfsreleases gefunden.", + "loc.messages.NoTagMatchingReleases": "Es wurden keine Releases gefunden, die mit dem Tagmuster übereinstimmen: %s.", + "loc.messages.FetchCommitDiff": "Die Liste der Commits seit dem zuletzt veröffentlichten Release wird abgerufen...", + "loc.messages.FetchCommitDiffSuccess": "Die Liste der Änderungen wurde gefunden.", + "loc.messages.FetchCommitDiffError": "Unerwarteter Fehler beim Abrufen der Liste mit Änderungen.", + "loc.messages.FetchInitialCommit": "Der erste Commit wird abgerufen...", + "loc.messages.FetchInitialCommitSuccess": "Der erste Commit wurde gefunden: %s", + "loc.messages.InvalidGitHubEndpoint": "Ungültiger GitHub-Dienstendpunkt: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Ungültiges GitHub-Dienstverbindungsschema: %s. Es sind nur GitHub-Verbindungen zulässig, die auf einem OAuth-Token oder einem persönlichen Zugriffstoken basieren.", + "loc.messages.FetchInitialCommitError": "Unerwarteter Fehler beim Abrufen des ersten Commits.", + "loc.messages.InvalidActionSet": "Ungültige Aktion: %s. Es sind nur die Aktionen \"create\", \"edit\" oder \"delete\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Ungültige Tagquelle: %s. Es sind nur die Optionen \"gitTag\" oder \"userSpecifiedTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Ungültige Quelle für Versionshinweise: %s. Es sind nur die Optionen \"filePath\" oder \"inline\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Ungültiges compareWith-Attribut: %s. Es sind nur die Optionen \"lastFullRelease\", \"lastNonDraftRelease\" oder \"lastNonDraftReleaseByTag\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Ungültiger Modus für Ressourcenupload: %s. Es sind nur die Aktionen \"delete\" oder \"replace\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Für die Aktion \"%s\" ist ein Tag erforderlich. Geben Sie im Schritt ein Tag an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Die Tagquelle ist auf \"userSpecifiedTag\" festgelegt. Geben Sie ein Tag für die Aktion zum Erstellen an. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Es wurden keine Dateien gefunden, die mit \"%s\" übereinstimmen. Keine Elemente zum Upload vorhanden.", + "loc.messages.PatternIsADirectory": "\"%s\" kann nicht hochgeladen werden, weil es sich um ein Verzeichnis handelt. Geben Sie eine Datei an.", + "loc.messages.SearchingFileMatchingPattern": "Es wird nach Dateien gesucht, die mit \"%s\" übereinstimmen.", + "loc.messages.IssuesFetchError": "Fehler beim Abrufen von Issues. Das Änderungsprotokoll kann nicht generiert werden.", + "loc.messages.NoIssuesLinkedError": "Im angegebenen Commitvergleich sind keine Issues mit Commits verknüpft.", + "loc.messages.LabelsSyntaxError": "Fehler beim Analysieren der Bezeichnungen. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Ungültiges ChangeLogType-Attribut: %s. Es sind nur die Optionen \"commitBased\" oder \"issueBased\" zulässig. Informationen zur YAML-Syntax finden Sie hier: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Änderungen", + "loc.messages.DefaultCategory": "Andere", + "loc.messages.SeeMoreText": "Mehr anzeigen" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/en-US/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..dc4a14bce873 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub Release", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "loc.description": "Create, edit, or delete a GitHub release", + "loc.instanceNameFormat": "GitHub release ($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog configuration", + "loc.input.label.gitHubConnection": "GitHub connection (OAuth or PAT)", + "loc.input.help.gitHubConnection": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "loc.input.label.target": "Target", + "loc.input.help.target": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Tag source", + "loc.input.help.tagSource": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "loc.input.label.tagPattern": "Tag Pattern", + "loc.input.help.tagPattern": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`.", + "loc.input.label.title": "Release title", + "loc.input.help.title": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title.", + "loc.input.label.releaseNotesSource": "Release notes source", + "loc.input.help.releaseNotesSource": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "loc.input.label.releaseNotesFilePath": "Release notes file path", + "loc.input.help.releaseNotesFilePath": "Select the file which contains the release notes.", + "loc.input.label.releaseNotesInline": "Release notes", + "loc.input.help.releaseNotesInline": "Enter the release notes here. Markdown is supported.", + "loc.input.label.assets": "Assets", + "loc.input.help.assets": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Asset upload mode", + "loc.input.help.assetUploadMode": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "loc.input.label.isDraft": "Draft release", + "loc.input.help.isDraft": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "loc.input.label.isPreRelease": "Pre-release", + "loc.input.help.isPreRelease": "Indicate whether the release should be marked as a pre-release.", + "loc.input.label.addChangeLog": "Add changelog", + "loc.input.help.addChangeLog": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes.", + "loc.input.label.changeLogCompareToRelease": "Compare to", + "loc.input.help.changeLogCompareToRelease": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "loc.input.label.changeLogCompareToReleaseTag": "Release Tag", + "loc.input.help.changeLogCompareToReleaseTag": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation.", + "loc.input.label.changeLogType": "Changelog type", + "loc.input.help.changeLogType": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "loc.input.label.changeLogLabels": "Categories", + "loc.input.help.changeLogLabels": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr.", + "loc.messages.GithubApiFailError": "An unexpected error occurred.", + "loc.messages.GetTagsError": "An unexpected error occurred while fetching tags.", + "loc.messages.GetReleasesError": "An unexpected error occurred while fetching releases.", + "loc.messages.CreateReleaseError": "An unexpected error occurred while creating the release.", + "loc.messages.EditReleaseError": "An unexpected error occurred while editing the release.", + "loc.messages.DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "loc.messages.CreatingRelease": "Creating a release for tag: %s", + "loc.messages.CreateReleaseSuccess": "Release created successfully at %s", + "loc.messages.ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "loc.messages.EditingRelease": "Editing the release with tag: %s", + "loc.messages.EditReleaseSuccess": "Release edited successfully", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "loc.messages.DeletingRelease": "Deleting the release for tag: %s", + "loc.messages.DeleteReleaseSuccess": "Release deleted successfully.", + "loc.messages.NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "loc.messages.FetchReleaseForTag": "Fetching the release for tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "Found a release for tag: %s", + "loc.messages.FetchTagForTarget": "Searching for tags associated with target commit: %s", + "loc.messages.FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "loc.messages.MissingAssetError": "File not found: %s", + "loc.messages.MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "loc.messages.MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "loc.messages.NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", + "loc.messages.DeleteAllExistingAssets": "Deleting all existing assets...", + "loc.messages.DuplicateAssetFound": "Duplicate asset found: %s", + "loc.messages.AssetsDeletedSuccessfully": "Assets deleted successfully.", + "loc.messages.DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "loc.messages.SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "loc.messages.AssetDeletedSuccessfully": "Asset %s deleted successfully", + "loc.messages.AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "loc.messages.ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "loc.messages.ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "loc.messages.DeletingAsset": "Deleting asset: %s", + "loc.messages.NoAssetFoundToDelete": "No assets were found to delete.", + "loc.messages.UploadingAssets": "Uploading assets...", + "loc.messages.UploadingAsset": "Uploading file: '%s'.", + "loc.messages.UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "loc.messages.UploadAssetSuccess": "Uploaded file successfully: '%s'", + "loc.messages.NoAssetFoundToUpload": "No assets were found to upload.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "loc.messages.AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "loc.messages.ComputingChangeLog": "Computing changes made in this release...", + "loc.messages.ComputingChangeLogSuccess": "Changes computed successfully.", + "loc.messages.CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "loc.messages.CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "loc.messages.FetchLatestPublishRelease": "Fetching the latest published release...", + "loc.messages.FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "loc.messages.FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "loc.messages.FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "loc.messages.GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "loc.messages.NoLatestPublishRelease": "No releases are published yet in the repository.", + "loc.messages.NoMatchingReleases": "No non-draft releases found.", + "loc.messages.NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "loc.messages.FetchCommitDiff": "Fetching the list of commits since the last published release...", + "loc.messages.FetchCommitDiffSuccess": "Found the list of changes.", + "loc.messages.FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "loc.messages.FetchInitialCommit": "Fetching the initial commit...", + "loc.messages.FetchInitialCommitSuccess": "Found the initial commit: %s", + "loc.messages.InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "loc.messages.FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "loc.messages.InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "loc.messages.PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "loc.messages.SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "loc.messages.IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "loc.messages.NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "loc.messages.LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changes", + "loc.messages.DefaultCategory": "Others", + "loc.messages.SeeMoreText": "See More" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..4391ba157eb3 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versión de GitHub", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/AA3aeiw)", + "loc.description": "Crea, edita o elimina una versión de GitHub.", + "loc.instanceNameFormat": "Versión de GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuración del registro de cambios", + "loc.input.label.gitHubConnection": "Conexión de GitHub (OAuth o PAT)", + "loc.input.help.gitHubConnection": "Especifique el nombre de la conexión de servicio de GitHub que se va a usar para conectarse al repositorio de GitHub. La conexión se debe basar en el valor OAuth del usuario de GitHub o en un token de acceso personal de GitHub. Obtenga más información sobre las conexiones de servicio [aquí](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repositorio", + "loc.input.help.repositoryName": "Especifique el nombre del repositorio de GitHub en el que se creará, editará o eliminará la versión de GitHub.", + "loc.input.label.action": "Acción", + "loc.input.help.action": "Especifique el tipo de operación de versión que se va a realizar. Esta tarea permite crear, editar o eliminar una versión de GitHub.", + "loc.input.label.target": "Destino", + "loc.input.help.target": "Especifique el SHA de \"commit\" para el que se creará la versión de GitHub. Por ejemplo, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". También puede usar una variable aquí; por ejemplo, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Origen de etiqueta", + "loc.input.help.tagSource": "Especifique la etiqueta que se va a usar para la creación de la versión. La opción \"Git tag\" obtiene automáticamente la etiqueta asociada al \"commit\" de GIT. Utilice la opción \"User specified tag\" para proporcionar una etiqueta de forma manual.", + "loc.input.label.tagPattern": "Patrón de etiqueta", + "loc.input.help.tagPattern": "Especifique el patrón de etiqueta GIT mediante una notación regex (por ejemplo, \"release-v1.*\"). La versión de GitHub solo se creará para los \"commits\" que tengan una etiqueta GIT coincidente. ", + "loc.input.label.tag": "Etiqueta", + "loc.input.help.tag": "Especifique la etiqueta para la que se va a crear, editar o eliminar una versión. También puede usar una variable aquí. Por ejemplo, \"$(myTagName)\".", + "loc.input.label.title": "Título de la versión", + "loc.input.help.title": "Especifique el título de la versión de GitHub. Si se deja en blanco, se usará la etiqueta como título de la versión.", + "loc.input.label.releaseNotesSource": "Origen de las notas de la versión", + "loc.input.help.releaseNotesSource": "Especifique la descripción de la versión de GitHub. Use la opción \"Archivo de notas de la versión\" para utilizar el contenido de un archivo como notas de la versión. Use la opción \"Inline release notes\" para escribir las notas de la versión de forma manual.", + "loc.input.label.releaseNotesFilePath": "Ruta de acceso al archivo de notas de la versión", + "loc.input.help.releaseNotesFilePath": "Seleccione el archivo que contiene las notas de la versión.", + "loc.input.label.releaseNotesInline": "Notas de la versión", + "loc.input.help.releaseNotesInline": "Especifique aquí las notas de la versión. Se admite Markdown.", + "loc.input.label.assets": "Recursos", + "loc.input.help.assets": "Especifique los archivos que se van a cargar como recursos de la versión. Puede usar caracteres comodín para especificar varios archivos. Por ejemplo, \"$(Build.ArtifactStagingDirectory)/*.zip\" para las canalizaciones de compilación o \"`$(System.DefaultWorkingDirectory)/*.zip\" en el caso de las canalizaciones de versión. También puede especificar varios patrones, uno por cada línea. De forma predeterminada, se cargarán todos los archivos del directorio $(Build.ArtifactStagingDirectory). Para obtener más información sobre la lista de variables predefinidas disponibles, consulte las [variables de compilación](https://aka.ms/AA4449z) y las [variables de versión] (https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modo de carga de recursos", + "loc.input.help.assetUploadMode": "Use la opción \"Delete existing assets\" para eliminar primero los recursos existentes en la versión y, después, cargar todos los recursos. Use la opción \"Replace existing assets\" para reemplazar los recursos que tengan el mismo nombre.", + "loc.input.label.isDraft": "Versión de borrador", + "loc.input.help.isDraft": "Indique si la versión debe guardarse como borrador (sin publicar). Si el valor es \"false\", la versión se publicará.", + "loc.input.label.isPreRelease": "Versión preliminar", + "loc.input.help.isPreRelease": "Indique si la versión se debe marcar como versión preliminar.", + "loc.input.label.addChangeLog": "Agregar registro de cambios", + "loc.input.help.addChangeLog": "Si se establece en \"true\", se generará una lista de los cambios (\"commits\" e \"issues\") entre esta y la última versión publicada y se anexará a las notas de la versión.", + "loc.input.label.changeLogCompareToRelease": "Comparar con", + "loc.input.help.changeLogCompareToRelease": "Indique la versión con la que debemos comparar para generar el registro de cambios: \nÚltima versión completa: compara la versión actual con la versión más reciente que no sea de borrador y que no esté marcada como versión preliminar.\nÚltima versión de no borrador: compara la versión actual con la versión más reciente que no sea de borrador.\nÚltima versión de no borrador por etiqueta: compara la versión actual con la última versión que no sea de borrador y que coincida con la etiqueta especificada. También puede especificar una notación regex en lugar de una etiqueta exacta.", + "loc.input.label.changeLogCompareToReleaseTag": "Etiqueta de versión", + "loc.input.help.changeLogCompareToReleaseTag": "Especifique la notación regex para la etiqueta de versión. La versión que coincida con esta etiqueta se usará como base para el cálculo del registro de cambios.", + "loc.input.label.changeLogType": "Tipo de registro de cambios", + "loc.input.help.changeLogType": "El registro de cambios puede basarse en \"commits\" o en incidencias. Un registro de cambios basado en \"commits\" enumera todos los \"commits\" incluidos en una versión, mientras que un registro de cambios basado en incidencias enumera todas las incidencias o solicitudes de incorporación de cambios que se incluyen en la versión. ", + "loc.input.label.changeLogLabels": "Categorías", + "loc.input.help.changeLogLabels": "Si usa esta opción, puede clasificar los cambios en función de la etiqueta asociada a la incidencia o a la solicitud de incorporación de cambios. Para una etiqueta, puede mencionar el nombre para mostrar de la categoría y el estado de la incidencia. Por ejemplo, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Si un cambio tiene varias etiquetas, la primera etiqueta que se especifique tiene prioridad. Deje este campo en blanco para ver una lista plana de las incidencias o solicitudes de incorporación de cambios.", + "loc.messages.GithubApiFailError": "Error inesperado.", + "loc.messages.GetTagsError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las etiquetas.", + "loc.messages.GetReleasesError": "Error inesperado al aplicar \"fetch\" para recuperar cambios en las versiones.", + "loc.messages.CreateReleaseError": "Error inesperado al crear la versión.", + "loc.messages.EditReleaseError": "Error inesperado al editar la versión.", + "loc.messages.DeleteReleaseError": "Error inesperado al eliminar la versión.", + "loc.messages.CreatingRelease": "Creando una versión para la etiqueta: %s", + "loc.messages.CreateReleaseSuccess": "La versión se ha creado correctamente en %s", + "loc.messages.ReleaseAlreadyExists": "No se pudo crear la versión. Ya existe una versión para la etiqueta: %s", + "loc.messages.EditingRelease": "Editando la versión con la etiqueta %s", + "loc.messages.EditReleaseSuccess": "La versión se ha editado correctamente.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "No se ha encontrado ninguna versión existente para editar. Se va a crear una con la etiqueta %s", + "loc.messages.DeletingRelease": "Eliminando la versión de la etiqueta: %s", + "loc.messages.DeleteReleaseSuccess": "La versión se eliminó correctamente.", + "loc.messages.NoReleaseFoundToDelete": "No se encontró ninguna versión para la etiqueta %s. Error al eliminar la versión.", + "loc.messages.FetchReleaseForTag": "Usando \"fetch\" para recuperar cambios de la versión de la etiqueta: %s", + "loc.messages.FetchReleaseForTagSuccess": "Se ha encontrado una versión para la etiqueta: %s", + "loc.messages.FetchTagForTarget": "Buscando etiquetas asociadas al \"commit\" de destino: %s", + "loc.messages.FetchTagForTargetSuccess": "Se ha encontrado una etiqueta para el \"commit\" de destino: %s", + "loc.messages.MissingAssetError": "No se encuentra el archivo: %s", + "loc.messages.MultipleReleasesFoundError": "Se esperaba solo una versión, pero se ha encontrado más de una para la etiqueta: %s. No se puede realizar la acción.", + "loc.messages.MultipleTagFound": "Se esperaba solo una etiqueta, pero se ha encontrado más de una para el \"commit\" dado: %s. No se puede realizar la acción.", + "loc.messages.NoTagFound": "No se creará la versión porque las etiquetas del \"commit\" de destino no coinciden con el patrón de etiqueta dado.", + "loc.messages.DeleteAllExistingAssets": "Eliminando todos los recursos existentes...", + "loc.messages.DuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s", + "loc.messages.AssetsDeletedSuccessfully": "Los recursos se han eliminado correctamente.", + "loc.messages.DeletingDuplicateAsset": "Eliminando el recurso duplicado: %s", + "loc.messages.SkipDuplicateAssetFound": "Se ha encontrado un recurso duplicado: %s. Omitiendo...", + "loc.messages.AssetDeletedSuccessfully": "El recurso %s se ha eliminado correctamente.", + "loc.messages.AllAssetsUploadedSuccessfully": "Todos los recursos se han cargado correctamente.", + "loc.messages.ErrorDeletingDuplicateAsset": "Error inesperado al eliminar el recurso duplicado: %s", + "loc.messages.ErrorDeletingAsset": "Error inesperado al eliminar el recurso: %s", + "loc.messages.DeletingAsset": "Eliminando el recurso: %s", + "loc.messages.NoAssetFoundToDelete": "No se han encontrado recursos para eliminar.", + "loc.messages.UploadingAssets": "Cargando los recursos...", + "loc.messages.UploadingAsset": "Cargando el archivo: \"%s\".", + "loc.messages.UploadAssetError": "Error inesperado al cargar el archivo: %s", + "loc.messages.UploadAssetSuccess": "El archivo se cargó correctamente: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "No se han encontrado recursos para cargar.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "El archivo de notas de la versión %s es un directorio y no un archivo.", + "loc.messages.AssetIsDirectoryError": "El recurso es un directorio y no un archivo. Omitiendo la carga del directorio: %s", + "loc.messages.ComputingChangeLog": "Calculando los cambios realizados en esta versión...", + "loc.messages.ComputingChangeLogSuccess": "Los cambios se han calculado correctamente.", + "loc.messages.CommitDiffBehind": "No se pueden calcular los cambios porque el \"commit\" de destino proporcionado es anterior al de la última versión publicada.", + "loc.messages.CommitDiffEqual": "No se han encontrado cambios. El \"commit\" de destino proporcionado es el mismo que el de la última versión publicada.", + "loc.messages.FetchLatestPublishRelease": "Usando \"fetch\" para recuperar cambios de la última versión publicada...", + "loc.messages.FetchLatestNonDraftRelease": "Capturando la última versión que no sea de borrador...", + "loc.messages.FetchLastReleaseByTag": "Captura de la última versión que coincida con el patrón de etiqueta: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Se ha encontrado la última versión publicada: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Se ha encontrado la última versión que no es un borrador", + "loc.messages.FetchTagMatchingReleaseSuccess": "Se ha encontrado la última versión que coincide con el patrón de etiqueta: %s", + "loc.messages.GetLatestReleaseError": "Error inesperado al aplicar \"fetch\" para recuperar cambios de la última versión publicada.", + "loc.messages.NoLatestPublishRelease": "No hay ninguna versión publicada aún en el repositorio.", + "loc.messages.NoMatchingReleases": "No se encontró ninguna versión que no sea de borrador.", + "loc.messages.NoTagMatchingReleases": "No se encontraron versiones que coincidan con el patrón de etiqueta: %s ", + "loc.messages.FetchCommitDiff": "Usando \"fetch\" para recuperar cambios de la lista de elementos \"commit\" desde la última versión publicada...", + "loc.messages.FetchCommitDiffSuccess": "Se ha encontrado la lista de cambios.", + "loc.messages.FetchCommitDiffError": "Error inesperado al aplicar \"fetch\" a la lista de cambios.", + "loc.messages.FetchInitialCommit": "Usando \"fetch\" para recuperar cambios del \"commit\" inicial...", + "loc.messages.FetchInitialCommitSuccess": "Se ha encontrado el \"commit\" inicial: %s", + "loc.messages.InvalidGitHubEndpoint": "Punto de conexión de servicio de GitHub no válido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Esquema de conexión del servicio de GitHub no válido: %s. Solo se permiten conexiones de token de acceso personal de GitHub y OAuth.", + "loc.messages.FetchInitialCommitError": "Error inesperado al aplicar \"fetch\" para la recuperación de cambios del \"commit\" inicial.", + "loc.messages.InvalidActionSet": "Acción no válida: %s. Solo se permiten las acciones \"create\", \"edit\" o \"delete\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Origen de etiqueta no válido: %s. Solo se permiten las opciones \"gitTag\" o \"userSpecifiedTag\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Origen de notas de la versión no válido: %s. Solo se permiten las opciones \"filePath\" o \"inline\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Atributo compareWith no válido: %s. Solo se permiten las opciones \"lastFullRelease\", \"lastNonDraftRelease\" o \"lastNonDraftReleaseByTag\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modo de carga de recursos no válido: %s. Solo se permiten las opciones \"delete\" o \"replace\". Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Se requiere una etiqueta para la acción \"%s\". Especifique una etiqueta en el paso. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "El origen de la etiqueta está establecido en userSpecifiedTag; especifique una etiqueta para la acción create. Para ver la sintaxis de YAML, consulte: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "No se ha encontrado ningún archivo que coincida con \"%s\". No hay nada que cargar.", + "loc.messages.PatternIsADirectory": "No se puede cargar \"%s\" porque es un directorio. Especifique un archivo.", + "loc.messages.SearchingFileMatchingPattern": "Buscando archivos que coincidan con \"%s\".", + "loc.messages.IssuesFetchError": "Error al capturar las incidencias. No se puede generar el registro de cambios.", + "loc.messages.NoIssuesLinkedError": "No hay ninguna incidencia vinculada a los \"commits\" en la diferencia de \"commits\" especificada.", + "loc.messages.LabelsSyntaxError": "Error al analizar las etiquetas. Para ver la sintaxis YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Atributo ChangeLogType no válido: %s. Solo se permiten las opciones \"commitBased\" o \"issueBased\". Para ver la sintaxis de YAML, consulte https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Cambios", + "loc.messages.DefaultCategory": "Otra", + "loc.messages.SeeMoreText": "Ver más" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..a1ef1dfe2a82 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Mise en production GitHub", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/AA3aeiw)", + "loc.description": "Créer, modifier ou supprimer une mise en production GitHub", + "loc.instanceNameFormat": "Mise en production GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configuration du journal des modifications", + "loc.input.label.gitHubConnection": "Connexion GitHub (OAuth ou PAT)", + "loc.input.help.gitHubConnection": "Spécifiez le nom de la connexion de service GitHub à utiliser pour la connexion au dépôt GitHub. La connexion doit être basée sur le jeton OAuth d'un utilisateur GitHub ou un jeton d'accès personnel GitHub. En savoir plus sur les connexions de service [ici](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Dépôt", + "loc.input.help.repositoryName": "Spécifiez le nom du dépôt GitHub dans lequel la mise en production GitHub est créée, modifiée ou supprimée.", + "loc.input.label.action": "Action", + "loc.input.help.action": "Spécifiez le type d'opération de mise en production à effectuer. Cette tâche permet de créer, modifier ou supprimer une mise en production GitHub.", + "loc.input.label.target": "Cible", + "loc.input.help.target": "Spécifiez le SHA de validation pour lequel la mise en production GitHub doit être créée. Exemple : '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. Vous pouvez également utiliser une variable ici. Exemple : '$(myCommitSHA)'.", + "loc.input.label.tagSource": "Source de l'étiquette", + "loc.input.help.tagSource": "Spécifiez l'étiquette à utiliser pour la création de la mise en production. L'option Étiquette Git accepte automatiquement l'étiquette associée à la validation Git. Utilisez l'option Étiquette spécifiée par l'utilisateur pour fournir une étiquette manuellement.", + "loc.input.label.tagPattern": "Modèle d'étiquette", + "loc.input.help.tagPattern": "Spécifiez le modèle d'étiquette git à l'aide d'une notation regex (par exemple 'release-v1.*'). La mise en production GitHub est créée uniquement pour les commits qui ont une étiquette git correspondante. ", + "loc.input.label.tag": "Étiquette", + "loc.input.help.tag": "Spécifiez l'étiquette pour laquelle vous souhaitez créer, modifier ou supprimer une mise en production. Vous pouvez également utiliser une variable ici. Exemple : '$(myTagName)'.", + "loc.input.label.title": "Titre de la mise en production", + "loc.input.help.title": "Spécifiez le titre de la mise en production GitHub. Si rien n'est indiqué, l'étiquette est utilisée en tant que titre de la mise en production.", + "loc.input.label.releaseNotesSource": "Source des notes de publication", + "loc.input.help.releaseNotesSource": "Spécifiez la description de la mise en production GitHub. Utilisez l'option Fichier de notes de publication pour utiliser le contenu d'un fichier en tant que notes de publication. Utilisez l'option Notes de publication inline pour entrer manuellement les notes de publication.", + "loc.input.label.releaseNotesFilePath": "Chemin du fichier de notes de publication", + "loc.input.help.releaseNotesFilePath": "Sélectionnez le fichier qui contient les notes de publication.", + "loc.input.label.releaseNotesInline": "Notes de publication", + "loc.input.help.releaseNotesInline": "Entrez les notes de publication ici. Markdown est pris en charge.", + "loc.input.label.assets": "Ressources", + "loc.input.help.assets": "Spécifiez les fichiers à charger en tant que composants de la mise en production. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers. Exemple : '$(Build.ArtifactStagingDirectory)/*.zip' pour les pipelines de build ou '$(System.DefaultWorkingDirectory)/*.zip' pour les pipelines de mise en production. Vous pouvez également spécifier plusieurs modèles (un par ligne). Par défaut, tous les fichiers du répertoire $(Build.ArtifactStagingDirectory) sont chargés. Pour en savoir plus sur la liste des variables prédéfinies disponibles, consultez les informations relatives aux [variables de build](https://aka.ms/AA4449z) et aux [variables de mise en production](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Mode de chargement des composants", + "loc.input.help.assetUploadMode": "Utilisez l'option Supprimer les composants existants pour supprimer d'abord tous les composants existants de la mise en production avant de charger tous les composants. Utilisez l'option Remplacer les composants existants pour remplacer les composants qui portent le même nom.", + "loc.input.label.isDraft": "Version brouillon", + "loc.input.help.isDraft": "Indiquez si la mise en production doit être enregistrée en tant que brouillon (non publiée). Si la valeur est 'false', la mise en production est publiée.", + "loc.input.label.isPreRelease": "Préversion", + "loc.input.help.isPreRelease": "Indiquez si la mise en production doit être marquée en tant que préversion.", + "loc.input.label.addChangeLog": "Ajouter un journal des modifications", + "loc.input.help.addChangeLog": "Si la valeur est 'true', la liste des changements (validations et problèmes) survenus entre cette mise en production et la dernière mise en production publiée est générée et ajoutée aux notes de publication.", + "loc.input.label.changeLogCompareToRelease": "Comparer à", + "loc.input.help.changeLogCompareToRelease": "Indiquez la mise en production que nous devons comparer pour générer le journal des modifications : \nDernière mise en production complète : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente qui n'est pas marquée en tant que préversion.\nDernière mise en production non-brouillon : compare la mise en production actuelle avec la mise en production non-brouillon la plus récente.\nDernière mise en production non-brouillon par étiquette : compare la mise en production actuelle avec la dernière mise en production non-brouillon correspondant à l'étiquette spécifiée. Vous pouvez également utiliser une notation regex à la place d'une étiquette exacte.", + "loc.input.label.changeLogCompareToReleaseTag": "Étiquette de mise en production", + "loc.input.help.changeLogCompareToReleaseTag": "Spécifiez la notation regex de l'étiquette de mise en production. La mise en production correspondant à cette étiquette sert de base au calcul du journal des modifications.", + "loc.input.label.changeLogType": "Type de journal des modifications", + "loc.input.help.changeLogType": "Le journal des modifications peut être basé sur les commits ou les problèmes. Le journal des modifications basé sur les commits liste tous les commits inclus dans une mise en production alors que le journal des modifications basé sur les problèmes liste la totalité des problèmes/demandes de tirage (pull requests) inclus dans la mise en production. ", + "loc.input.label.changeLogLabels": "Catégories", + "loc.input.help.changeLogLabels": "Ainsi, vous pouvez catégoriser les changements en fonction de l'étiquette associée au problème/à la demande de tirage (pull request). Pour une étiquette, vous pouvez mentionner le nom d'affichage de la catégorie et l'état du problème. Exemple : \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Dans le cas où un changement comporte plusieurs étiquettes, la première étiquette spécifiée est prioritaire. Laissez ce champ vide pour voir une liste plate des problèmes/demandes de tirage.", + "loc.messages.GithubApiFailError": "Une erreur inattendue s'est produite.", + "loc.messages.GetTagsError": "Une erreur inattendue s'est produite durant la récupération (fetch) des étiquettes.", + "loc.messages.GetReleasesError": "Une erreur inattendue s'est produite durant la récupération (fetch) des mises en production.", + "loc.messages.CreateReleaseError": "Une erreur inattendue s'est produite durant la création de la mise en production.", + "loc.messages.EditReleaseError": "Une erreur inattendue s'est produite durant la modification de la mise en production.", + "loc.messages.DeleteReleaseError": "Une erreur inattendue s'est produite durant la suppression de la mise en production.", + "loc.messages.CreatingRelease": "Création d'une mise en production pour l'étiquette : %s", + "loc.messages.CreateReleaseSuccess": "Création réussie de la mise en production à %s", + "loc.messages.ReleaseAlreadyExists": "Échec de la création de la mise en production. Il existe déjà une mise en production pour l'étiquette : %s", + "loc.messages.EditingRelease": "Modification de la mise en production avec l'étiquette : %s", + "loc.messages.EditReleaseSuccess": "Mise en production modifiée correctement", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Il n'existe aucune mise en production à modifier. Création d'une mise en production avec l'étiquette : %s", + "loc.messages.DeletingRelease": "Suppression de la mise en production pour l'étiquette : %s", + "loc.messages.DeleteReleaseSuccess": "Suppression réussie de la mise en production.", + "loc.messages.NoReleaseFoundToDelete": "Mise en production introuvable pour l'étiquette : %s. Échec de la suppression de la mise en production.", + "loc.messages.FetchReleaseForTag": "Récupération (fetch) de la mise en production pour l'étiquette : %s", + "loc.messages.FetchReleaseForTagSuccess": "Mise en production trouvée pour l'étiquette : %s", + "loc.messages.FetchTagForTarget": "Recherche d'étiquettes associées à la validation cible : %s", + "loc.messages.FetchTagForTargetSuccess": "Étiquette trouvée pour la validation cible : %s", + "loc.messages.MissingAssetError": "Fichier introuvable : %s", + "loc.messages.MultipleReleasesFoundError": "Une seule mise en production était attendue, mais plusieurs mises en production ont été trouvées pour l'étiquette : %s. Impossible d'effectuer l'action.", + "loc.messages.MultipleTagFound": "Une seule étiquette était attendue, mais plusieurs étiquettes ont été trouvées pour la validation spécifiée : %s. Impossible d'effectuer l'action.", + "loc.messages.NoTagFound": "La mise en production ne sera pas créée, car les étiquettes du commit cible ne correspondent pas au modèle d'étiquette donné", + "loc.messages.DeleteAllExistingAssets": "Suppression de tous les composants existants...", + "loc.messages.DuplicateAssetFound": "Composant dupliqué trouvé : %s", + "loc.messages.AssetsDeletedSuccessfully": "Composants supprimés correctement.", + "loc.messages.DeletingDuplicateAsset": "Suppression du composant dupliqué : %s", + "loc.messages.SkipDuplicateAssetFound": "Composant dupliqué trouvé : %s. Ignoré...", + "loc.messages.AssetDeletedSuccessfully": "Composant %s supprimé correctement", + "loc.messages.AllAssetsUploadedSuccessfully": "Tous les composants ont été chargés correctement.", + "loc.messages.ErrorDeletingDuplicateAsset": "Une erreur inattendue s'est produite durant la suppression du composant dupliqué : %s", + "loc.messages.ErrorDeletingAsset": "Une erreur inattendue s'est produite durant la suppression du composant : %s", + "loc.messages.DeletingAsset": "Suppression du composant : %s", + "loc.messages.NoAssetFoundToDelete": "Les composants à supprimer sont introuvables.", + "loc.messages.UploadingAssets": "Chargement des composants...", + "loc.messages.UploadingAsset": "Chargement du fichier : '%s'.", + "loc.messages.UploadAssetError": "Une erreur inattendue s'est produite durant le chargement du fichier : %s", + "loc.messages.UploadAssetSuccess": "Chargement réussi du fichier : '%s'", + "loc.messages.NoAssetFoundToUpload": "Les composants à charger sont introuvables.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Fichier de notes de publication : %s est un répertoire et non un fichier.", + "loc.messages.AssetIsDirectoryError": "La composant est un répertoire et non un fichier. Chargement du répertoire ignoré : %s", + "loc.messages.ComputingChangeLog": "Calcul des changements apportés à cette mise en production...", + "loc.messages.ComputingChangeLogSuccess": "Changements calculés correctement.", + "loc.messages.CommitDiffBehind": "Impossible de calculer les modifications, car la validation cible fournie est antérieure à la validation de la dernière mise en production publiée.", + "loc.messages.CommitDiffEqual": "Changements introuvables. La validation cible fournie est la même que celle de la dernière mise en production publiée.", + "loc.messages.FetchLatestPublishRelease": "Récupération (fetch) de la dernière mise en production publiée...", + "loc.messages.FetchLatestNonDraftRelease": "Récupération (fetch) de la dernière mise en production non-brouillon...", + "loc.messages.FetchLastReleaseByTag": "Récupération (fetch) de la dernière mise en production correspondant au modèle d'étiquette %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "La dernière mise en production publiée a été trouvée : %s", + "loc.messages.FetchMatchingReleaseSuccess": "La dernière mise en production non-brouillon a été trouvée", + "loc.messages.FetchTagMatchingReleaseSuccess": "La dernière mise en production correspondant au modèle d'étiquette %s a été trouvée", + "loc.messages.GetLatestReleaseError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la dernière mise en production publiée.", + "loc.messages.NoLatestPublishRelease": "Aucune mise en production n'a encore été publiée dans le dépôt.", + "loc.messages.NoMatchingReleases": "Mises en production non-brouillon introuvables.", + "loc.messages.NoTagMatchingReleases": "Aucune mise en production ne correspond au modèle d'étiquette : %s ", + "loc.messages.FetchCommitDiff": "Récupération (fetch) de la liste des validations depuis la dernière mise en production publiée...", + "loc.messages.FetchCommitDiffSuccess": "La liste des changements a été trouvée.", + "loc.messages.FetchCommitDiffError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la liste des changements.", + "loc.messages.FetchInitialCommit": "Récupération (fetch) de la validation initiale...", + "loc.messages.FetchInitialCommitSuccess": "Validation initiale trouvée : %s", + "loc.messages.InvalidGitHubEndpoint": "Point de terminaison de service GitHub non valide : %s.", + "loc.messages.InvalidEndpointAuthScheme": "Mode de connexion de service GitHub non valide : %s. Seules les connexions par jeton d'accès personnel OAuth et GitHub sont autorisées.", + "loc.messages.FetchInitialCommitError": "Une erreur inattendue s'est produite durant la récupération (fetch) de la validation initiale.", + "loc.messages.InvalidActionSet": "Action non valide : %s. Seules les actions 'create', 'edit' ou 'delete' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Source étiquette non valide : %s. Seules les options 'gitTag' ou 'userSpecifiedTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Source des notes de publication non valide : %s. Seules les options 'filePath' ou 'inline' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Attribut compareWith non valide : %s. Seules les options 'lastFullRelease, 'lastNonDraftRelease' ou 'lastNonDraftReleaseByTag' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Mode de chargement de composant non valide : %s. Seules les options 'delete' ou 'replace' sont autorisées. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Pour l'action '%s', une étiquette est nécessaire. Spécifiez une étiquette au cours de l'étape. Pour la syntaxe YAML, consultez https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "La source de l'étiquette a la valeur userSpecifiedTag. Spécifiez une étiquette pour l'action de création. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Il n'existe aucun fichier correspondant à '%s'. Rien à charger.", + "loc.messages.PatternIsADirectory": "Impossible de charger '%s', car il s'agit d'un répertoire. Spécifiez un fichier.", + "loc.messages.SearchingFileMatchingPattern": "Recherche de fichier(s) correspondant à '%s'.", + "loc.messages.IssuesFetchError": "Erreur durant la récupération (fetch) des problèmes. Impossible de générer le journal des modifications.", + "loc.messages.NoIssuesLinkedError": "Aucun problème n'est lié aux commits dans la comparaison des différences de commit spécifiée.", + "loc.messages.LabelsSyntaxError": "Une erreur s'est produite durant l'analyse des étiquettes. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Attribut ChangeLogType non valide : %s. Seules les options 'commitBased' ou 'issueBased' sont autorisées. Pour la syntaxe YAML, consultez : https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Changements", + "loc.messages.DefaultCategory": "Autres", + "loc.messages.SeeMoreText": "Voir plus" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..42f2e14dbe1a --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Versione di GitHub", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/AA3aeiw)", + "loc.description": "Consente di creare, modificare o eliminare una versione di GitHub", + "loc.instanceNameFormat": "Versione di GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Configurazione del log delle modifiche", + "loc.input.label.gitHubConnection": "Connessione a GitHub (OAuth o token di accesso personale)", + "loc.input.help.gitHubConnection": "Specificare il nome della connessione al servizio GitHub da usare per la connessione al repository GitHub. La connessione deve essere basata su un OAuth dell'utente di GitHub o su un token di accesso personale GitHub. Per altre informazioni sulle connessioni al servizio, vedere [qui](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Repository", + "loc.input.help.repositoryName": "Specificare il nome del repository GitHub in cui verrà creata, modificata o eliminata la versione GitHub.", + "loc.input.label.action": "Azione", + "loc.input.help.action": "Specificare il tipo di operazione da eseguire sulla versione. Questa attività consente di creare, modificare o eliminare una versione di GitHub.", + "loc.input.label.target": "Destinazione", + "loc.input.help.target": "Specificare il commit SHA per cui verrà creata la versione GitHub, ad esempio `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. È anche possibile usare una variabile, ad esempio `$(myCommitSHA)`.", + "loc.input.label.tagSource": "Origine dei tag", + "loc.input.help.tagSource": "Specificare il tag da usare per la creazione della versione. L'opzione 'Tag GIT' accetta automaticamente il tag associato al commit GIT. Selezionare l'opzione 'Tag specificato dall'utente' per specificare manualmente un tag.", + "loc.input.label.tagPattern": "Criterio tag", + "loc.input.help.tagPattern": "Consente di specificare il criterio tag GIT con espressioni regolari, ad esempio `release-v1.*`. La versione GitHub verrà creata solo per i commit a cui è associato il tag GIT corrispondente. ", + "loc.input.label.tag": "Tag", + "loc.input.help.tag": "Specificare il tag per cui creare, modificare o eliminare una versione. È anche possibile usare una variabile, ad esempio `$(myTagName)`.", + "loc.input.label.title": "Titolo della versione", + "loc.input.help.title": "Specificare il titolo della versione GitHub. Se viene lasciato vuoto, come titolo della versione verrà usato il tag.", + "loc.input.label.releaseNotesSource": "Origine delle note sulla versione", + "loc.input.help.releaseNotesSource": "Specificare la descrizione della versione di GitHub. Selezionare l'opzione 'File delle note sulla versione' per usare il contenuto di un file come note sulla versione. Selezionare l'opzione 'Note sulla versione online' per immettere manualmente le note sulla versione.", + "loc.input.label.releaseNotesFilePath": "Percorso del file delle note sulla versione", + "loc.input.help.releaseNotesFilePath": "Selezionare il file che contiene le note sulla versione.", + "loc.input.label.releaseNotesInline": "Note sulla versione", + "loc.input.help.releaseNotesInline": "Immettere qui le note sulla versione. Markdown è supportato.", + "loc.input.label.assets": "Asset", + "loc.input.help.assets": "Specificare i file da caricare come asset della versione. È possibile usare caratteri jolly per specificare più file. Ad esempio, specificare `$(Build.ArtifactStagingDirectory)/*.zip` per le pipeline di compilazione oppure `$(System.DefaultWorkingDirectory)/*.zip` per le pipeline di versione. È anche possibile specificare più criteri, uno per riga. Per impostazione predefinita, tutti i file verranno caricati nella directory $(Build.ArtifactStagingDirectory). Per altre informazioni sull'elenco delle variabili predefinite disponibili, vedere le [variabili di compilazione](https://aka.ms/AA4449z) e le [variabili di versione](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Modalità di caricamento degli asset", + "loc.input.help.assetUploadMode": "Usare l'opzione 'Elimina asset esistenti' per eliminare prima tutti gli asset esistenti nella versione, quindi caricare tutti gli asset. Usare l'opzione 'Sostituisci asset esistenti' per sostituire gli asset con lo stesso nome.", + "loc.input.label.isDraft": "Versione bozza", + "loc.input.help.isDraft": "Indica se la versione deve essere salvata come bozza (non pubblicata). Se è `false`, la versione verrà pubblicata.", + "loc.input.label.isPreRelease": "Versione non definitiva", + "loc.input.help.isPreRelease": "Indica se la versione deve essere contrassegnata come versione non definitiva.", + "loc.input.label.addChangeLog": "Aggiungi log delle modifiche", + "loc.input.help.addChangeLog": "Se è impostato su `true`, verrà generato un elenco di modifiche (commit e problemi) relativo alla versione corrente e all'ultima versione pubblicata e tale elenco verrà aggiunto alle note sulla versione.", + "loc.input.label.changeLogCompareToRelease": "Confronta con", + "loc.input.help.changeLogCompareToRelease": "Indica la versione con cui eseguire il confronto per generare il log delle modifiche: \nUltima versione completa: confronta la versione corrente con la versione non bozza più recente che non è contrassegnata come versione non definitiva.\nUltima versione non bozza: confronta la versione corrente con la versione non bozza più recente.\nUltima versione non bozza per tag: confronta la versione corrente con l'ultima versione non bozza corrispondente al tag specificato. È anche possibile specificare un'espressione regolare invece di un tag esatto.", + "loc.input.label.changeLogCompareToReleaseTag": "Tag di versione", + "loc.input.help.changeLogCompareToReleaseTag": "Consente di specificare l'espressione regolare per il tag di versione. La versione corrispondente a questo tag verrà usata come base per il calcolo del log delle modifiche.", + "loc.input.label.changeLogType": "Tipo di log delle modifiche", + "loc.input.help.changeLogType": "Il log delle modifiche può essere basato su commit o su problemi. Il log delle modifiche basato su commit elenca tutti i commit inclusi in una versione, mentre quello basato su problemi elenca tutti i problemi o le richieste pull inclusi nella versione. ", + "loc.input.label.changeLogLabels": "Categorie", + "loc.input.help.changeLogLabels": "Consente di categorizzare le modifiche in base all'etichetta associata al problema o alla richiesta pull. Per un'etichetta è possibile menzionare il nome visualizzato per la categoria e lo stato del problema, ad esempio `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. Nel caso in cui a una modifica siano associate più etichette, la priorità viene assegnata alla prima etichetta specificata. Lasciare vuoto questo campo per visualizzare un elenco semplice di problemi/richieste pull.", + "loc.messages.GithubApiFailError": "Si è verificato un errore imprevisto.", + "loc.messages.GetTagsError": "Si è verificato un errore imprevisto durante il recupero dei tag.", + "loc.messages.GetReleasesError": "Si è verificato un errore imprevisto durante il recupero delle versioni.", + "loc.messages.CreateReleaseError": "Si è verificato un errore imprevisto durante la creazione della versione.", + "loc.messages.EditReleaseError": "Si è verificato un errore imprevisto durante la modifica della versione.", + "loc.messages.DeleteReleaseError": "Si è verificato un errore imprevisto durante l'eliminazione della versione.", + "loc.messages.CreatingRelease": "Creazione di una versione per il tag: %s", + "loc.messages.CreateReleaseSuccess": "La versione è stata creata in %s", + "loc.messages.ReleaseAlreadyExists": "Non è stato possibile creare la versione. Esiste già una versione per il tag: %s", + "loc.messages.EditingRelease": "Modifica della versione con il tag: %s", + "loc.messages.EditReleaseSuccess": "La versione è stata modificata", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Non sono state trovate versioni esistenti da modificare. Ne verrà creata una con tag: %s", + "loc.messages.DeletingRelease": "Eliminazione della versione per il tag: %s", + "loc.messages.DeleteReleaseSuccess": "La versione è stata eliminata.", + "loc.messages.NoReleaseFoundToDelete": "Non è stata trovata alcuna versione per il tag: %s. L'eliminazione della versione non è riuscita.", + "loc.messages.FetchReleaseForTag": "Recupero della versione per il tag: %s", + "loc.messages.FetchReleaseForTagSuccess": "È stata trovata una versione per il tag: %s", + "loc.messages.FetchTagForTarget": "Ricerca dei tag associati al commit di destinazione: %s", + "loc.messages.FetchTagForTargetSuccess": "È stato trovato un tag per il commit di destinazione: %s", + "loc.messages.MissingAssetError": "File non trovato: %s", + "loc.messages.MultipleReleasesFoundError": "È prevista una sola versione, ma ne è stata trovata più di una per il tag: %s. Non è possibile eseguire l'azione.", + "loc.messages.MultipleTagFound": "È previsto un solo tag, ma ne è stato trovato più di uno per il commit specificato: %s. Non è possibile eseguire l'azione.", + "loc.messages.NoTagFound": "La versione non verrà creata perché i tag per il commit di destinazione non corrispondono al criterio tag specificato", + "loc.messages.DeleteAllExistingAssets": "Eliminazione di tutti gli asset esistenti...", + "loc.messages.DuplicateAssetFound": "È stato trovato un asset duplicato: %s", + "loc.messages.AssetsDeletedSuccessfully": "Gli asset sono stati eliminati.", + "loc.messages.DeletingDuplicateAsset": "Eliminazione dell'asset duplicato: %s", + "loc.messages.SkipDuplicateAssetFound": "È stato trovato un asset duplicato: %s. Verrà ignorato...", + "loc.messages.AssetDeletedSuccessfully": "L'asset %s è stato eliminato", + "loc.messages.AllAssetsUploadedSuccessfully": "Tutti gli asset sono stati caricati.", + "loc.messages.ErrorDeletingDuplicateAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset duplicato: %s", + "loc.messages.ErrorDeletingAsset": "Si è verificato un errore imprevisto durante l'eliminazione dell'asset: %s", + "loc.messages.DeletingAsset": "Eliminazione dell'asset: %s", + "loc.messages.NoAssetFoundToDelete": "Non sono stati trovati asset da eliminare.", + "loc.messages.UploadingAssets": "Caricamento degli asset...", + "loc.messages.UploadingAsset": "Caricamento del file: '%s'.", + "loc.messages.UploadAssetError": "Si è verificato un errore imprevisto durante il caricamento del file: %s", + "loc.messages.UploadAssetSuccess": "Il file è stato caricato: '%s'", + "loc.messages.NoAssetFoundToUpload": "Non sono stati trovati asset da caricare.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Il file delle note sulla versione %s è una directory e non un file.", + "loc.messages.AssetIsDirectoryError": "L'asset è una directory e non un file. La directory di caricamento verrà ignorata: %s", + "loc.messages.ComputingChangeLog": "Calcolo delle modifiche apportate in questa versione...", + "loc.messages.ComputingChangeLogSuccess": "Le modifiche sono state calcolate.", + "loc.messages.CommitDiffBehind": "Non è possibile calcolare le modifiche perché il commit di destinazione specificato è meno recente del commit dell'ultima versione pubblicata.", + "loc.messages.CommitDiffEqual": "Non sono state trovate modifiche. Il commit di destinazione specificato è uguale a quello dell'ultima versione pubblicata.", + "loc.messages.FetchLatestPublishRelease": "Recupero dell'ultima versione pubblicata...", + "loc.messages.FetchLatestNonDraftRelease": "Recupero della versione non bozza più recente...", + "loc.messages.FetchLastReleaseByTag": "Recupero della versione più recente corrispondente al criterio tag %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "L'ultima versione pubblicata è stata trovata: %s", + "loc.messages.FetchMatchingReleaseSuccess": "La versione non bozza più recente è stata trovata", + "loc.messages.FetchTagMatchingReleaseSuccess": "La versione più recente corrispondente al criterio tag %s è stata trovata", + "loc.messages.GetLatestReleaseError": "Si è verificato un errore imprevisto durante il recupero dell'ultima versione pubblicata.", + "loc.messages.NoLatestPublishRelease": "Non sono ancora state pubblicate versioni nel repository.", + "loc.messages.NoMatchingReleases": "Non sono state trovate versioni non bozza.", + "loc.messages.NoTagMatchingReleases": "Non sono state trovate versioni corrispondenti al criterio tag %s ", + "loc.messages.FetchCommitDiff": "Recupero dell'elenco di commit eseguiti dall'ultima versione pubblicata...", + "loc.messages.FetchCommitDiffSuccess": "L'elenco di modifiche è stato trovato.", + "loc.messages.FetchCommitDiffError": "Si è verificato un errore imprevisto durante il recupero dell'elenco di modifiche.", + "loc.messages.FetchInitialCommit": "Recupero del commit iniziale...", + "loc.messages.FetchInitialCommitSuccess": "Il commit iniziale è stato trovato: %s", + "loc.messages.InvalidGitHubEndpoint": "Endpoint servizio GitHub non valido: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Schema di connessione al servizio GitHub non valido: %s. Sono consentite solo le connessioni OAuth o con token di accesso personale GitHub.", + "loc.messages.FetchInitialCommitError": "Si è verificato un errore imprevisto durante il recupero del commit iniziale.", + "loc.messages.InvalidActionSet": "Azione non valida: %s. Sono consentite solo le azioni 'create', 'edit' e 'delete'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "L'origine dei tag non è valida: %s. Sono consentite solo le opzioni 'gitTag' o 'userSpecifiedTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "L'origine delle note sulla versione non è valida: %s. Sono consentite solo le opzioni 'filePath' o 'inline'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "L'attributo di compareWith non è valido: %s. Sono consentite solo le opzioni 'lastFullRelease, 'lastNonDraftRelease' o 'lastNonDraftReleaseByTag'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Modalità di caricamento degli asset non valida: %s. Sono consentite solo le opzioni 'delete' e 'replace'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Per l'azione '%s' è richiesto un tag. Specificare un tag nel passaggio. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "L'origine del tag è impostata su userSpecifiedTag. Specificare un tag per l'azione create. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Non sono stati trovati file corrispondenti a '%s'. Non c'è nulla da caricare.", + "loc.messages.PatternIsADirectory": "Non è possibile caricare '%s' perché è una directory. Specificare un file.", + "loc.messages.SearchingFileMatchingPattern": "Ricerca dei file corrispondenti a '%s'.", + "loc.messages.IssuesFetchError": "Si è verificato un errore durante il recupero dei problemi. Non è possibile generare il log delle modifiche.", + "loc.messages.NoIssuesLinkedError": "Non è stato collegato alcun problema ai commit nel Diff di commit specificato.", + "loc.messages.LabelsSyntaxError": "Si è verificato un errore durante l'analisi delle etichette. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "L'attributo di ChangeLogType non è valido: %s. Sono consentite solo le opzioni 'commitBased' o 'issueBased'. Per la sintassi YAML, vedere: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Modifiche", + "loc.messages.DefaultCategory": "Altri tipi", + "loc.messages.SeeMoreText": "Visualizza dettagli" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..d7c9a9b43ab5 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub リリース", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub リリースを作成、編集、または削除します", + "loc.instanceNameFormat": "GitHub リリース ($(action))", + "loc.group.displayName.changeLogConfiguration": "変更ログの構成", + "loc.input.label.gitHubConnection": "GitHub 接続 (OAuth または PAT)", + "loc.input.help.gitHubConnection": "GitHub リポジトリへの接続に使用する GitHub サービス接続の名前を指定します。この接続は、GitHub ユーザーの OAuth または GitHub 個人用アクセス トークンに基づいている必要があります。サービス接続については、[こちら](https://aka.ms/AA3am5s)を参照してください。", + "loc.input.label.repositoryName": "リポジトリ", + "loc.input.help.repositoryName": "GitHub リリースが作成、編集、または削除される GitHub リポジトリの名前を指定します。", + "loc.input.label.action": "アクション", + "loc.input.help.action": "実行するリリース操作の種類を指定します。このタスクでは、GitHub リリースを作成、編集、または削除できます。", + "loc.input.label.target": "ターゲット", + "loc.input.help.target": "GitHub リリースを作成するためのコミット SHA を指定します。例: `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。ここで変数を使用することもできます。例: '$(myCommitSHA)'。", + "loc.input.label.tagSource": "タグ ソース", + "loc.input.help.tagSource": "リリースの作成に使用するタグを指定します。[Git タグ] オプションを使用する場合、Git コミットと関連付けられているタグが自動的に取得されます。[ユーザー指定のタグ] オプションを使用する場合、手動でタグを指定します。", + "loc.input.label.tagPattern": "タグ パターン", + "loc.input.help.tagPattern": "正規表現を使用して Git タグ パターンを指定します (例: `release-v1.*`)。GitHub リリースは、一致する Git タグがあるコミットに対してのみ作成されます。", + "loc.input.label.tag": "タグ", + "loc.input.help.tag": "リリースを作成、編集、または削除するためのタグを指定します。ここで変数を使用することもできます。例: `$(myTagName)`。", + "loc.input.label.title": "リリース タイトル", + "loc.input.help.title": "GitHub リリースのタイトルを指定します。空のままにすると、タグはリリース タイトルとして使用されます。", + "loc.input.label.releaseNotesSource": "リリース ノートのソース", + "loc.input.help.releaseNotesSource": "GitHub リリースの説明を指定します。ファイルの内容をリリース ノートとして使用するには、[リリース ノート ファイル] オプションを使用します。手動でリリース ノートを入力するには、[インライン リリース ノート] オプションを使用します。", + "loc.input.label.releaseNotesFilePath": "リリース ノート ファイル パス", + "loc.input.help.releaseNotesFilePath": "リリース ノートを含むファイルを選択します。", + "loc.input.label.releaseNotesInline": "リリース ノート", + "loc.input.help.releaseNotesInline": "リリース ノートをこちらに入力してください。マークダウンがサポートされています。", + "loc.input.label.assets": "資産", + "loc.input.help.assets": "リリース アセットとしてアップロードするファイルを指定します。ワイルドカード文字を使用して複数のファイルを指定できます。例: ビルド パイプラインの場合は `$(Build.ArtifactStagingDirectory)/*.zip`、リリース パイプラインの場合は `$(System.DefaultWorkingDirectory)/*.zip` とします。1 行に 1 つずつ、複数のパターンを指定することもできます。既定では、$(Build.ArtifactStagingDirectory) ディレクトリ内のすべてのファイルがアップロードされます。利用可能な事前定義済み変数のリストについて詳しくは、[ビルド変数](https://aka.ms/AA4449z)および[リリース変数](https://aka.ms/AA43wws)を参照してください。", + "loc.input.label.assetUploadMode": "アセット アップロード モード", + "loc.input.help.assetUploadMode": "最初にリリース内の既存のアセットを削除してからすべてのアセットをアップロードするには、[既存のアセットを削除] オプションを使用します。同じ名前のアセットを置換するには、[既存のアセットを置換] オプションを使用します。", + "loc.input.label.isDraft": "ドラフト リリース", + "loc.input.help.isDraft": "リリースを下書き (未公開) として保存する必要があるかどうかを示します。[false] の場合、リリースは公開されます。", + "loc.input.label.isPreRelease": "プレリリース", + "loc.input.help.isPreRelease": "リリースをプレリリースとしてマークする必要があるかどうかを示します。", + "loc.input.label.addChangeLog": "変更ログの追加", + "loc.input.help.addChangeLog": "[true] に設定されている場合、これと公開された最新リリースの間の変更 (コミットと公開) の一覧が生成され、リリース ノートに追加されます。", + "loc.input.label.changeLogCompareToRelease": "比較対象", + "loc.input.help.changeLogCompareToRelease": "変更ログを生成するために比較するリリースを指定します。\n最後の完全リリース: 現在のリリースを、プレリリースとしてマークされていない、ドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース: 現在のリリースをドラフト以外の最新リリースと比較します。\n最後のドラフト以外のリリース (タグによる): 現在のリリースを、指定されたタグと一致する最後のドラフト以外のリリースと比較します。正確なタグの代わりに正規表現を指定することもできます。", + "loc.input.label.changeLogCompareToReleaseTag": "リリース タグ", + "loc.input.help.changeLogCompareToReleaseTag": "リリース タグの正規表現を指定します。このタグに一致するリリースは、変更ログの計算のベースとして使用されます。", + "loc.input.label.changeLogType": "変更ログの種類", + "loc.input.help.changeLogType": "変更ログは、コミット ベースまたはイシュー ベースにすることができます。コミット ベースの変更ログにはリリースに含まれているすべてのコミットが一覧表示されるのに対し、イシュー ベースの変更ログにはリリースに含まれるすべてのイシューまたは pull request が一覧表示されます。", + "loc.input.label.changeLogLabels": "カテゴリ", + "loc.input.help.changeLogLabels": "これを使用すると、イシューまたは PR に関連付けられているラベルに基づいて変更を分類できます。ラベルにはカテゴリの表示名とイシューの状態を含めることができます。例: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。1 つの変更に複数のラベルがある場合、最初に指定したラベルが優先されます。イシューまたは PR のフラットな一覧を表示するには、このフィールドを空のままにします。", + "loc.messages.GithubApiFailError": "予期しないエラーが発生しました。", + "loc.messages.GetTagsError": "タグのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.GetReleasesError": "リリースのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.CreateReleaseError": "リリースの作成中に予期しないエラーが発生しました。", + "loc.messages.EditReleaseError": "リリースの編集中に予期しないエラーが発生しました。", + "loc.messages.DeleteReleaseError": "リリースの削除中に予期しないエラーが発生しました。", + "loc.messages.CreatingRelease": "タグのリリースを作成しています: %s", + "loc.messages.CreateReleaseSuccess": "%s でリリースが正常に作成されました", + "loc.messages.ReleaseAlreadyExists": "リリースを作成できませんでした。次のタグのリリースが既に存在します: %s", + "loc.messages.EditingRelease": "タグ付きのリリースを編集しています: %s", + "loc.messages.EditReleaseSuccess": "リリースが正常に編集されました", + "loc.messages.NoReleaseFoundToEditCreateRelease": "編集対象の既存のリリースは見つかりませんでした。タグを使用して作成しています: %s", + "loc.messages.DeletingRelease": "タグのリリースを削除しています: %s", + "loc.messages.DeleteReleaseSuccess": "リリースが正常に削除されました。", + "loc.messages.NoReleaseFoundToDelete": "タグのリリースが見つかりませんでした: %s。リリースの削除に失敗しました。", + "loc.messages.FetchReleaseForTag": "タグのリリースをフェッチしています: %s", + "loc.messages.FetchReleaseForTagSuccess": "タグのリリースが見つかりました: %s", + "loc.messages.FetchTagForTarget": "ターゲットのコミットに関連付けられたタグを検索しています: %s", + "loc.messages.FetchTagForTargetSuccess": "ターゲット コミットのタグが見つかりました: %s", + "loc.messages.MissingAssetError": "ファイルが見つかりませんでした: %s", + "loc.messages.MultipleReleasesFoundError": "必要なリリースは 1 つだけですが、タグには複数のリリースが見つかりました: %s。操作を実行できません。", + "loc.messages.MultipleTagFound": "必要なタグは 1 つのみですが、指定されたコミットに複数のタグが見つかりました: %s。操作を実行できません。", + "loc.messages.NoTagFound": "ターゲット コミットのタグが指定されたタグ パターンと一致しないため、リリースは作成されません", + "loc.messages.DeleteAllExistingAssets": "既存のすべてのアセットを削除しています...", + "loc.messages.DuplicateAssetFound": "重複するアセットが見つかりました: %s", + "loc.messages.AssetsDeletedSuccessfully": "アセットが正常に削除されました。", + "loc.messages.DeletingDuplicateAsset": "重複するアセットを削除しています: %s", + "loc.messages.SkipDuplicateAssetFound": "重複するアセットが見つかりました: %s。スキップしています...", + "loc.messages.AssetDeletedSuccessfully": "アセット %s が正常に削除されました", + "loc.messages.AllAssetsUploadedSuccessfully": "すべてのアセットが正常にアップロードされました。", + "loc.messages.ErrorDeletingDuplicateAsset": "重複するアセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.ErrorDeletingAsset": "アセットの削除中に予期しないエラーが発生しました: %s", + "loc.messages.DeletingAsset": "アセットを削除しています: %s", + "loc.messages.NoAssetFoundToDelete": "削除するアセットが見つかりませんでした。", + "loc.messages.UploadingAssets": "アセットをアップロードしています...", + "loc.messages.UploadingAsset": "ファイルをアップロードしています: '%s'。", + "loc.messages.UploadAssetError": "次のファイルのアップロード中に予期しないエラーが発生しました: %s", + "loc.messages.UploadAssetSuccess": "ファイルが正常にアップロードされました: '%s'", + "loc.messages.NoAssetFoundToUpload": "アップロードするアセットが見つかりませんでした。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "リリース ノート ファイル: %s はディレクトリであり、ファイルではありません。", + "loc.messages.AssetIsDirectoryError": "このアセットはディレクトリであり、ファイルではありません。ディレクトリのアップロードをスキップしています: %s", + "loc.messages.ComputingChangeLog": "このリリースで行われた変更を計算しています...", + "loc.messages.ComputingChangeLogSuccess": "変更が正常に計算されました。", + "loc.messages.CommitDiffBehind": "指定されたターゲット コミットが、公開された最新リリースのコミットより古いため、変更を計算できません。", + "loc.messages.CommitDiffEqual": "変更は見つかりませんでした。指定されたターゲットのコミットは、公開された最新リリースのコミットと同じです。", + "loc.messages.FetchLatestPublishRelease": "公開された最新リリースをフェッチしています...", + "loc.messages.FetchLatestNonDraftRelease": "ドラフト以外の最新リリースをフェッチしています...", + "loc.messages.FetchLastReleaseByTag": "タグ パターンに一致する最新リリースをフェッチしています: %s", + "loc.messages.FetchLatestPublishReleaseSuccess": "公開された最新のリリースが見つかりました: %s", + "loc.messages.FetchMatchingReleaseSuccess": "ドラフト以外の最新リリースが見つかりました", + "loc.messages.FetchTagMatchingReleaseSuccess": "タグ パターンに一致する最新リリースが見つかりました: %s", + "loc.messages.GetLatestReleaseError": "公開された最新リリースのフェッチ中に予期しないエラーが発生しました。 ", + "loc.messages.NoLatestPublishRelease": "リポジトリに公開されているリリースはまだありません。", + "loc.messages.NoMatchingReleases": "ドラフト以外のリリースが見つかりません。", + "loc.messages.NoTagMatchingReleases": "タグ パターン %s に一致するリリースが見つかりませんでした", + "loc.messages.FetchCommitDiff": "公開された最新リリース以降のコミットの一覧をフェッチしています...", + "loc.messages.FetchCommitDiffSuccess": "変更の一覧が見つかりました。", + "loc.messages.FetchCommitDiffError": "変更の一覧のフェッチ中に予期しないエラーが発生しました。", + "loc.messages.FetchInitialCommit": "初期コミットをフェッチしています...", + "loc.messages.FetchInitialCommitSuccess": "初期コミットが見つかりました: %s", + "loc.messages.InvalidGitHubEndpoint": "無効な GitHub サービス エンドポイント: %s。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub サービス接続スキームが無効です: %s。使用できるのは OAuth と GitHub の個人用アクセス トークン接続のみです。", + "loc.messages.FetchInitialCommitError": "初期コミットのフェッチ中に予期しないエラーが発生しました。", + "loc.messages.InvalidActionSet": "無効なアクション: %s。'作成'、'編集'、または '削除' の操作のみが許可されています。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "タグ ソース %s が無効です。'gitTag' または 'userSpecifiedTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidReleaseNotesSource": "リリース ノート ソース %s が無効です。'filePath' または 'inline' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidCompareWithAttribute": "compareWith 属性 %s が無効です。'lastFullRelease'、'lastNonDraftRelease'、'lastNonDraftReleaseByTag' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidAssetUploadMode": "アセットのアップロード モードが無効です: %s。'削除'、または '置換' オプションのみ使用できます。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' アクションには、タグが必要です。手順でタグを指定してください。Yaml 構文については、次を参照してください: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "タグ ソースが userSpecifiedTag に設定されています。作成アクション用のタグを指定してください。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.NoFileFoundMatchingPattern": "'%s' と一致するファイルが見つかりませんでした。アップロードするものがありません。", + "loc.messages.PatternIsADirectory": "'%s' はディレクトリであるため、アップロードできません。ファイルを指定してください。", + "loc.messages.SearchingFileMatchingPattern": "'%s' と一致するファイルを検索しています。", + "loc.messages.IssuesFetchError": "イシューのフェッチでエラーが発生しました。変更ログを生成できません。", + "loc.messages.NoIssuesLinkedError": "指定されたコミットの差分には、コミットにリンクされているイシューはありません。", + "loc.messages.LabelsSyntaxError": "ラベルの解析中にエラーが発生しました。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 属性 %s が無効です。'commitBased' または 'issueBased' オプションのみ使用できます。YAML 構文については、https://aka.ms/AA3m1bq をご覧ください", + "loc.messages.ChangeLogTitle": "変更", + "loc.messages.DefaultCategory": "その他", + "loc.messages.SeeMoreText": "さらに表示" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..ab518df16a65 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 릴리스", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/AA3aeiw)", + "loc.description": "GitHub 릴리스를 만들거나, 편집하거나, 삭제합니다.", + "loc.instanceNameFormat": "GitHub 릴리스($(action))", + "loc.group.displayName.changeLogConfiguration": "변경 로그 구성", + "loc.input.label.gitHubConnection": "GitHub 연결(OAuth 또는 PAT)", + "loc.input.help.gitHubConnection": "GitHub 리포지토리에 연결하는 데 사용할 GitHub 서비스 연결의 이름을 지정합니다. 이 연결은 GitHub 사용자의 OAuth 또는 GitHub 개인용 액세스 토큰을 기반으로 해야 합니다. [여기](https://aka.ms/AA3am5s)서 서비스 연결에 대해 자세히 알아보세요.", + "loc.input.label.repositoryName": "리포지토리", + "loc.input.help.repositoryName": "GitHub 릴리스를 만들거나, 편집하거나, 삭제할 GitHub 리포지토리의 이름을 지정합니다.", + "loc.input.label.action": "작업", + "loc.input.help.action": "수행할 릴리스 작업 유형을 지정합니다. 이 작업은 GitHub 릴리스를 만들거나, 편집하거나, 삭제할 수 있습니다.", + "loc.input.label.target": "대상", + "loc.input.help.target": "GitHub 릴리스를 만들 커밋 SHA를 지정합니다. 예: '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'. 여기서 변수를 사용할 수도 있습니다. 예: '$(myCommitSHA)'", + "loc.input.label.tagSource": "태그 소스", + "loc.input.help.tagSource": "릴리스 생성에 사용할 태그를 지정합니다. 'Git tag' 옵션은 Git 커밋에 연결된 태그를 자동으로 사용합니다. 태그를 수동으로 지정하려면 '사용자 지정 태그' 옵션을 사용합니다.", + "loc.input.label.tagPattern": "태그 패턴", + "loc.input.help.tagPattern": "regex를 사용하여 git 태그 패턴을 지정합니다(예: `release-v1.*`). GitHub 릴리스는 일치하는 git 태그가 있는 커밋에 대해서만 생성됩니다. ", + "loc.input.label.tag": "태그", + "loc.input.help.tag": "릴리스를 만들거나, 편집하거나, 삭제할 태그를 지정합니다. 여기서 변수를 사용할 수도 있습니다. 예: '$(myTagName)'", + "loc.input.label.title": "릴리스 제목", + "loc.input.help.title": "GitHub 릴리스의 제목을 지정합니다. 비워 두면, 태그가 릴리스 제목으로 사용됩니다.", + "loc.input.label.releaseNotesSource": "릴리스 정보 소스", + "loc.input.help.releaseNotesSource": "GitHub 릴리스에 대한 설명을 지정합니다. 파일 내용을 릴리스 정보로 사용하려면 '릴리스 정보 파일' 옵션을 사용합니다. 릴리스 정보를 수동으로 입력하려면 '인라인 릴리스 정보' 옵션을 사용합니다.", + "loc.input.label.releaseNotesFilePath": "릴리스 정보 파일 경로", + "loc.input.help.releaseNotesFilePath": "릴리스 정보가 포함된 파일을 선택합니다.", + "loc.input.label.releaseNotesInline": "릴리스 정보", + "loc.input.help.releaseNotesInline": "여기에 릴리스 정보를 입력합니다. Markdown이 지원됩니다.", + "loc.input.label.assets": "자산", + "loc.input.help.assets": "릴리스의 자산으로 업로드할 파일을 지정합니다. 와일드카드 문자를 사용하여 여러 파일을 지정할 수 있습니다. 예를 들어 빌드 파이프라인의 경우 '$(Build.ArtifactStagingDirectory)/*.zip', 릴리스 파이프라인의 경우 '$(System.DefaultWorkingDirectory)/*.zip'입니다. 한 줄에 하나씩, 여러 개의 패턴을 지정할 수도 있습니다. 기본적으로 $(Build.ArtifactStagingDirectory) 디렉터리에 있는 모든 파일이 업로드됩니다. 사용 가능한 미리 정의된 변수 목록에 대한 자세한 내용은 [빌드 변수](https://aka.ms/AA4449z) 및 [릴리스 변수](https://aka.ms/AA43wws)를 참조하세요.", + "loc.input.label.assetUploadMode": "자산 업로드 모드", + "loc.input.help.assetUploadMode": "릴리스의 기존 자산을 먼저 삭제한 후 모든 자산을 업로드하려면 '기존 자산 삭제' 옵션을 사용합니다. 동일한 이름의 자산을 모두 바꾸려면 '기존 자산 바꾸기' 옵션을 사용합니다.", + "loc.input.label.isDraft": "초안 릴리스", + "loc.input.help.isDraft": "릴리스를 초안(게시되지 않음)으로 저장해야 하는지 여부를 나타냅니다. 'false'이면, 릴리스가 게시됩니다.", + "loc.input.label.isPreRelease": "시험판", + "loc.input.help.isPreRelease": "릴리스를 시험판으로 표시해야 하는지 여부를 나타냅니다.", + "loc.input.label.addChangeLog": "changelog 추가", + "loc.input.help.addChangeLog": "'true'로 설정하면, 이 릴리스와 마지막으로 게시된 릴리스 사이의 변경 내용(커밋 및 문제) 목록이 생성되어 릴리스 정보에 추가됩니다.", + "loc.input.label.changeLogCompareToRelease": "비교 대상", + "loc.input.help.changeLogCompareToRelease": "변경 로그를 생성하기 위해 비교할 릴리스를 나타냅니다. \n마지막 전체 릴리스: 현재 릴리스와 시험판으로 표시되어 있지 않은 초안이 아닌 최신 릴리스를 비교합니다.\n초안이 아닌 마지막 릴리스: 현재 릴리스를 초안이 아닌 최신 릴리스와 비교합니다.\n태그 기준 초안이 아닌 마지막 릴리스: 지정한 태그와 일치하는 초안이 아닌 마지막 릴리스를 현재 릴리스와 비교합니다. 정확한 태그 대신 regex를 지정할 수도 있습니다.", + "loc.input.label.changeLogCompareToReleaseTag": "릴리스 태그", + "loc.input.help.changeLogCompareToReleaseTag": "릴리스 태그에 대한 regex를 지정합니다. 이 태그와 일치하는 릴리스가 변경 로그 계산의 기본으로 사용됩니다.", + "loc.input.label.changeLogType": "변경 로그 유형", + "loc.input.help.changeLogType": "변경 로그는 커밋 기반 또는 문제 기반일 수 있습니다. 문제 기반 변경 로그는 릴리스에 포함된 모든 문제/끌어오기 요청을 나열하지만 커밋 기반 변경 로그는 릴리스에 포함된 모든 커밋을 나열합니다. ", + "loc.input.label.changeLogLabels": "범주", + "loc.input.help.changeLogLabels": "문제/PR과 연결된 레이블을 기준으로 변경 내용을 분류하는 데 사용할 수 있습니다. 레이블의 경우 범주 및 문제 상태에 대해 해당 표시 이름을 언급할 수 있습니다. 예: `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`. 변경 내용에 레이블이 여러 개 있는 경우 처음 지정한 레이블이 우선 순위를 갖습니다. 문제/PR의 단순 목록을 보려면 이 필드를 비워 두세요.", + "loc.messages.GithubApiFailError": "예기치 않은 오류가 발생했습니다.", + "loc.messages.GetTagsError": "태그를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.GetReleasesError": "릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreateReleaseError": "릴리스를 만드는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.EditReleaseError": "릴리스를 편집하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeleteReleaseError": "릴리스를 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.CreatingRelease": "%s 태그의 릴리스를 만드는 중", + "loc.messages.CreateReleaseSuccess": "%s에 릴리스를 만들었습니다.", + "loc.messages.ReleaseAlreadyExists": "릴리스를 만들지 못했습니다. %s 태그의 릴리스가 이미 있습니다.", + "loc.messages.EditingRelease": "%s 태그가 있는 릴리스를 편집하는 중", + "loc.messages.EditReleaseSuccess": "릴리스를 편집했습니다.", + "loc.messages.NoReleaseFoundToEditCreateRelease": "편집할 기존 릴리스가 없습니다. %s 태그를 사용하여 만드는 중입니다.", + "loc.messages.DeletingRelease": "%s 태그의 릴리스를 삭제하는 중", + "loc.messages.DeleteReleaseSuccess": "릴리스를 삭제했습니다.", + "loc.messages.NoReleaseFoundToDelete": "%s 태그의 릴리스를 찾을 수 없습니다. 릴리스를 삭제하지 못했습니다.", + "loc.messages.FetchReleaseForTag": "%s 태그의 릴리스를 페치하는 중", + "loc.messages.FetchReleaseForTagSuccess": "%s 태그의 릴리스를 찾았습니다.", + "loc.messages.FetchTagForTarget": "대상 커밋 %s에 연결된 태그를 검색하는 중", + "loc.messages.FetchTagForTargetSuccess": "대상 커밋 %s의 태그를 찾았습니다.", + "loc.messages.MissingAssetError": "%s 파일을 찾을 수 없습니다.", + "loc.messages.MultipleReleasesFoundError": "릴리스가 1개만 필요한데, %s 태그의 릴리스를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.MultipleTagFound": "태그가 1개만 필요한데, 지정된 %s 커밋의 태그를 2개 이상 찾았습니다. 작업을 수행할 수 없습니다.", + "loc.messages.NoTagFound": "대상 커밋에 대한 태그가 지정된 태그 패턴과 일치하지 않으므로 릴리스가 만들어지지 않습니다.", + "loc.messages.DeleteAllExistingAssets": "기존 자산을 모두 삭제하는 중...", + "loc.messages.DuplicateAssetFound": "중복된 %s 자산을 찾았습니다.", + "loc.messages.AssetsDeletedSuccessfully": "자산을 삭제했습니다.", + "loc.messages.DeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중", + "loc.messages.SkipDuplicateAssetFound": "중복된 %s 자산을 찾았습니다. 건너뛰는 중...", + "loc.messages.AssetDeletedSuccessfully": "%s 자산을 삭제했습니다.", + "loc.messages.AllAssetsUploadedSuccessfully": "모든 자산을 업로드했습니다.", + "loc.messages.ErrorDeletingDuplicateAsset": "중복된 %s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.ErrorDeletingAsset": "%s 자산을 삭제하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.DeletingAsset": "%s 자산을 삭제하는 중", + "loc.messages.NoAssetFoundToDelete": "삭제할 자산이 없습니다.", + "loc.messages.UploadingAssets": "자산을 업로드하는 중...", + "loc.messages.UploadingAsset": "'%s' 파일을 업로드하는 중입니다.", + "loc.messages.UploadAssetError": "%s 파일을 업로드하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.UploadAssetSuccess": "'%s' 파일을 업로드했습니다.", + "loc.messages.NoAssetFoundToUpload": "업로드할 자산이 없습니다.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "릴리스 정보 파일 %s은(는) 파일이 아닌 디렉터리입니다.", + "loc.messages.AssetIsDirectoryError": "이 자산은 파일이 아닌 디렉터리입니다. %s 디렉터리 업로드를 건너뜁니다.", + "loc.messages.ComputingChangeLog": "이 릴리스의 변경 내용을 컴퓨팅하는 중...", + "loc.messages.ComputingChangeLogSuccess": "변경 내용을 컴퓨팅했습니다.", + "loc.messages.CommitDiffBehind": "지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋보다 이전이므로 변경 내용을 컴퓨팅할 수 없습니다.", + "loc.messages.CommitDiffEqual": "변경 내용을 찾을 수 없습니다. 지정한 대상 커밋이 마지막으로 게시된 릴리스의 커밋과 같습니다.", + "loc.messages.FetchLatestPublishRelease": "게시된 최신 릴리스를 페치하는 중...", + "loc.messages.FetchLatestNonDraftRelease": "초안이 아닌 최신 릴리스를 가져오는 중...", + "loc.messages.FetchLastReleaseByTag": "태그 패턴과 일치하는 최신 릴리스를 가져오는 중: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "게시된 최신 릴리스 %s을(를) 찾았습니다.", + "loc.messages.FetchMatchingReleaseSuccess": "초안이 아닌 최신 릴리스를 찾음", + "loc.messages.FetchTagMatchingReleaseSuccess": "태그 패턴과 일치하는 최신 릴리스를 찾음: %s", + "loc.messages.GetLatestReleaseError": "게시된 최신 릴리스를 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.NoLatestPublishRelease": "리포지토리에 게시된 릴리스가 아직 없습니다.", + "loc.messages.NoMatchingReleases": "초안이 아닌 릴리스를 찾을 수 없습니다.", + "loc.messages.NoTagMatchingReleases": "태그 패턴 %s과(와) 일치하는 릴리스를 찾을 수 없습니다. ", + "loc.messages.FetchCommitDiff": "마지막으로 게시된 릴리스 이후 커밋 목록을 페치하는 중...", + "loc.messages.FetchCommitDiffSuccess": "변경 내용 목록을 찾았습니다.", + "loc.messages.FetchCommitDiffError": "변경 내용 목록을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.FetchInitialCommit": "초기 커밋을 페치하는 중...", + "loc.messages.FetchInitialCommitSuccess": "초기 커밋 %s을(를) 찾았습니다.", + "loc.messages.InvalidGitHubEndpoint": "GitHub 서비스 엔드포인트 %s이(가) 잘못되었습니다.", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 서비스 연결 체계 %s이(가) 잘못되었습니다. OAuth 및 GitHub 개인용 액세스 토큰 연결만 허용됩니다.", + "loc.messages.FetchInitialCommitError": "초기 커밋을 페치하는 중 예기치 않은 오류가 발생했습니다.", + "loc.messages.InvalidActionSet": "%s 작업이 잘못되었습니다. 'create', 'edit' 또는 'delete' 작업만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidTagSource": "태그 소스 %s이(가) 잘못되었습니다. 'gitTag' 또는 'userSpecifiedTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidReleaseNotesSource": "릴리스 정보 소스 %s이(가) 잘못되었습니다. 'filePath' 또는 'inline' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidCompareWithAttribute": "compareWith 특성 %s이(가) 잘못되었습니다. 'lastFullRelease, 'lastNonDraftRelease' 또는 'lastNonDraftReleaseByTag' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidAssetUploadMode": "자산 업로드 모드 %s이(가) 잘못되었습니다. 'delete' 또는 'replace' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 작업에는 태그가 필요합니다. 단계에서 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.TagRequiredCreateAction": "태그 소스가 userSpecifiedTag로 설정되었습니다. create 작업의 태그를 지정하세요. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.NoFileFoundMatchingPattern": "'%s'과(와) 일치하는 파일이 없습니다. 업로드할 파일이 없습니다.", + "loc.messages.PatternIsADirectory": "'%s'은(는) 디렉터리이므로 업로드할 수 없습니다. 파일을 지정하세요.", + "loc.messages.SearchingFileMatchingPattern": "'%s'과(와) 일치하는 파일을 검색 중입니다.", + "loc.messages.IssuesFetchError": "문제를 가져오는 동안 오류가 발생했습니다. 변경 로그를 생성할 수 없습니다.", + "loc.messages.NoIssuesLinkedError": "지정된 커밋 Diff에서 커밋에 연결된 문제가 없습니다.", + "loc.messages.LabelsSyntaxError": "레이블의 구문을 분석하는 동안 오류가 발생했습니다. Yaml 구문에 대해서는 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 특성 %s이(가) 잘못되었습니다. 'commitBased' 또는 'issueBased' 옵션만 허용됩니다. YAML 구문에 대한 자세한 내용은 https://aka.ms/AA3m1bq를 참조하세요.", + "loc.messages.ChangeLogTitle": "변경 내용", + "loc.messages.DefaultCategory": "기타", + "loc.messages.SeeMoreText": "자세히 보기" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..dea78196147e --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "Выпуск GitHub", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/AA3aeiw)", + "loc.description": "Создание, изменение или удаление выпуска GitHub", + "loc.instanceNameFormat": "Выпуск GitHub ($(action))", + "loc.group.displayName.changeLogConfiguration": "Конфигурация журнала изменений", + "loc.input.label.gitHubConnection": "Подключение GitHub (OAuth или личный маркер доступа)", + "loc.input.help.gitHubConnection": "Укажите имя подключения службы GitHub, которое будет использоваться для подключения к репозиторию GitHub. Подключение должно быть основано на личном маркере доступа или OAuth пользователя GitHub. Дополнительные сведения о подключениях служб см. [здесь](https://aka.ms/AA3am5s).", + "loc.input.label.repositoryName": "Репозиторий", + "loc.input.help.repositoryName": "Укажите имя репозитория GitHub, в котором будет создан, изменен или удален выпуск GitHub.", + "loc.input.label.action": "Действие", + "loc.input.help.action": "Укажите тип выполняемой операции выпуска. Эта задача может создавать, изменять или удалять выпуск GitHub.", + "loc.input.label.target": "Целевой объект", + "loc.input.help.target": "Укажите SHA фиксации, для которого будет создан выпуск GitHub. Например, \"48b11d8d6e92a22e3e9563a3f643699c16fd6e27\". Здесь также можно использовать переменную. Например, \"$(myCommitSHA)\".", + "loc.input.label.tagSource": "Источник тегов", + "loc.input.help.tagSource": "Укажите тег, который будет использоваться для создания выпуска. Параметр \"Тег Git\" автоматически принимает тег, связанный с фиксацией Git. Для указания тега вручную используйте параметр \"Тег, указанный пользователем\".", + "loc.input.label.tagPattern": "Шаблон тега", + "loc.input.help.tagPattern": "Укажите шаблон тега Git с помощью регулярного выражения (например, release-v1.*). Выпуск GitHub будет создан только для фиксаций с соответствующим тегом Git. ", + "loc.input.label.tag": "Тег", + "loc.input.help.tag": "Укажите тег, для которого требуется создать, изменить или удалить выпуск. Здесь также можно использовать переменную. Например, \"$(myTagName)\".", + "loc.input.label.title": "Название выпуска", + "loc.input.help.title": "Укажите название выпуска GitHub. Если оставить параметр пустым, в качестве названия выпуска будет использоваться тег.", + "loc.input.label.releaseNotesSource": "Источник заметок о выпуске", + "loc.input.help.releaseNotesSource": "Укажите описание выпуска GitHub. Используйте параметр \"Файл заметок о выпуске\", чтобы использовать содержимое файла в качестве заметок о выпуске. Используйте параметр \"Встроенные заметки о выпуске\", чтобы вручную ввести заметки о выпуске.", + "loc.input.label.releaseNotesFilePath": "Путь к файлу заметок о выпуске", + "loc.input.help.releaseNotesFilePath": "Выберите файл, содержащий заметки о выпуске.", + "loc.input.label.releaseNotesInline": "Заметки о выпуске", + "loc.input.help.releaseNotesInline": "Введите здесь примечания к выпуску. Markdown поддерживается.", + "loc.input.label.assets": "Ресурсы", + "loc.input.help.assets": "Укажите файлы, которые будут отправлены в качестве ресурсов выпуска. Для указания нескольких файлов можно использовать подстановочные знаки. Например, для конвейеров сборки, \"$(Build.ArtifactStagingDirectory)/*.zip\" или в случае конвейеров выпуска \"$(System.DefaultWorkingDirectory)/*.zip\". Также можно указать несколько шаблонов — по одному на строку. По умолчанию будут отправлены все файлы в каталоге $(Build.ArtifactStagingDirectory). Чтобы получить дополнительные сведения о списке доступных предварительно заданных переменных, см. [переменные сборки](https://aka.ms/AA4449z) и [переменные выпуска](https://aka.ms/AA43wws).", + "loc.input.label.assetUploadMode": "Режим отправки активов", + "loc.input.help.assetUploadMode": "Используйте параметр \"Удалить существующие ресурсы\", чтобы сначала удалить все существующие ресурсы в выпуске, а затем отправить все ресурсы. Используйте параметр \"Заменить существующие ресурсы\", чтобы заменить все ресурсы с одинаковыми именами.", + "loc.input.label.isDraft": "Черновик выпуска", + "loc.input.help.isDraft": "Укажите, следует ли сохранять выпуск в виде черновика (неопубликованным). Если задано значение false, выпуск будет опубликован.", + "loc.input.label.isPreRelease": "Предварительный выпуск", + "loc.input.help.isPreRelease": "Укажите, следует ли помечать выпуск как предварительную версию.", + "loc.input.label.addChangeLog": "Добавить журнал изменений", + "loc.input.help.addChangeLog": "Если задано значение \"true\", будет создан список изменений (фиксации и проблемы) между этим и последним опубликованным выпуском, который будет добавлен к заметкам о выпуске.", + "loc.input.label.changeLogCompareToRelease": "Сравнить с", + "loc.input.help.changeLogCompareToRelease": "Укажите, с каким выпуском следует проводить сравнение, чтобы создать журнал изменений. \n\"Последний полный выпуск\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, который не помечен как предварительный.\n\"Последний выпуск, отличный от чернового\": сравнивает текущий выпуск с самым последним выпуском, отличным от чернового.\n\"Последний выпуск по тегу, отличный от чернового\": сравнивает текущий выпуск с последним выпуском, отличным от чернового, соответствующим указанному тегу. Кроме того, вместо точного тега можно указать регулярное выражение.", + "loc.input.label.changeLogCompareToReleaseTag": "Тег выпуска", + "loc.input.help.changeLogCompareToReleaseTag": "Укажите регулярное выражение для тега выпуска. Выпуск, соответствующий этому тегу, будет использоваться в качестве основы для расчета журнала изменений.", + "loc.input.label.changeLogType": "Тип журнала изменений", + "loc.input.help.changeLogType": "Журнал изменений может быть основан на фиксациях или вопросах. Журнал изменений на основе фиксаций содержит все фиксации, включенные в выпуск, а журнал изменений на основе вопросов содержит список всех вопросов или запросов на вытягивание, включенных в выпуск. ", + "loc.input.label.changeLogLabels": "Категории", + "loc.input.help.changeLogLabels": "С помощью этого можно классифицировать изменения на основе метки, связанной с вопросом или запросом на вытягивание. Для метки можно указать отображаемое имя категории и состояние вопроса. Например, \"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\". Если изменение имеет несколько меток, приоритет имеет первая указанная метка. Оставьте это поле пустым, чтобы просмотреть плоский список вопросов или запросов на вытягивание.", + "loc.messages.GithubApiFailError": "Произошла непредвиденная ошибка.", + "loc.messages.GetTagsError": "При получении тегов произошла непредвиденная ошибка.", + "loc.messages.GetReleasesError": "При получении выпусков произошла непредвиденная ошибка.", + "loc.messages.CreateReleaseError": "При создании выпуска произошла непредвиденная ошибка.", + "loc.messages.EditReleaseError": "При изменении выпуска произошла непредвиденная ошибка.", + "loc.messages.DeleteReleaseError": "При удалении выпуска произошла непредвиденная ошибка.", + "loc.messages.CreatingRelease": "Создание выпуска для тега: %s", + "loc.messages.CreateReleaseSuccess": "Выпуск успешно создан в %s", + "loc.messages.ReleaseAlreadyExists": "Не удалось создать выпуск. Выпуск уже существует для тега: %s", + "loc.messages.EditingRelease": "Редактирование выпуска с тегом: %s", + "loc.messages.EditReleaseSuccess": "Выпуск успешно изменен", + "loc.messages.NoReleaseFoundToEditCreateRelease": "Не найден существующий выпуск для изменения. Создание ресурса с тегом: %s", + "loc.messages.DeletingRelease": "Удаление выпуска для тега: %s", + "loc.messages.DeleteReleaseSuccess": "Выпуск успешно удален.", + "loc.messages.NoReleaseFoundToDelete": "Не найден выпуск для тега: %s. Не удалось удалить выпуск.", + "loc.messages.FetchReleaseForTag": "Получение выпуска для тега: %s", + "loc.messages.FetchReleaseForTagSuccess": "Найден выпуск для тега: %s", + "loc.messages.FetchTagForTarget": "Поиск тегов, связанных с целевой фиксацией: %s", + "loc.messages.FetchTagForTargetSuccess": "Найден тег для целевой фиксации: %s", + "loc.messages.MissingAssetError": "Файл не найден: %s", + "loc.messages.MultipleReleasesFoundError": "Ожидался только 1 выпуск, но обнаружено больше 1 выпуска для тега: %s. Не удалось выполнить действие.", + "loc.messages.MultipleTagFound": "Ожидался только 1 тег, но обнаружено больше 1 тега для заданной фиксации: %s. Не удалось выполнить действие.", + "loc.messages.NoTagFound": "Выпуск не будет создан, так как теги для целевой фиксации не совпадают с заданным шаблоном тега", + "loc.messages.DeleteAllExistingAssets": "Идет удаление всех существующих ресурсов...", + "loc.messages.DuplicateAssetFound": "Обнаружен повторяющийся ресурс: %s", + "loc.messages.AssetsDeletedSuccessfully": "Ресурсы успешно удалены.", + "loc.messages.DeletingDuplicateAsset": "Удаление повторяющегося ресурса: %s", + "loc.messages.SkipDuplicateAssetFound": "Обнаружен дублирующийся ресурс: %s. Пропуск...", + "loc.messages.AssetDeletedSuccessfully": "Ресурс %s успешно удален", + "loc.messages.AllAssetsUploadedSuccessfully": "Все активы успешно отправлены.", + "loc.messages.ErrorDeletingDuplicateAsset": "При удалении повторяющегося ресурса произошла непредвиденная ошибка: %s", + "loc.messages.ErrorDeletingAsset": "Произошла непредвиденная ошибка при удалении ресурса: %s", + "loc.messages.DeletingAsset": "Удаление ресурса: %s", + "loc.messages.NoAssetFoundToDelete": "Не найдены ресурсы для удаления.", + "loc.messages.UploadingAssets": "Идет отправка ресурсов...", + "loc.messages.UploadingAsset": "Идет отправка файла: \"%s\".", + "loc.messages.UploadAssetError": "При загрузке файла сертификата возникла непредвиденная ошибка: %s", + "loc.messages.UploadAssetSuccess": "Файл успешно отправлен: \"%s\"", + "loc.messages.NoAssetFoundToUpload": "Не найдены ресурсы для отправки.", + "loc.messages.ReleaseNotesFileIsDirectoryError": "Файл заметок о выпуске %s является каталогом, а не файлом.", + "loc.messages.AssetIsDirectoryError": "Ресурс является каталогом, а не файлом. Пропуск отправки каталога: %s", + "loc.messages.ComputingChangeLog": "Вычисление изменений, внесенных в этом выпуске...", + "loc.messages.ComputingChangeLogSuccess": "Изменения успешно вычислены.", + "loc.messages.CommitDiffBehind": "Не удается вычислить изменения, так как указанная целевая фиксация старше фиксации последнего опубликованного выпуска.", + "loc.messages.CommitDiffEqual": "Изменения не найдены. Указанная целевая фиксация совпадает с фиксацией последнего опубликованного выпуска.", + "loc.messages.FetchLatestPublishRelease": "Получение последнего опубликованного выпуска...", + "loc.messages.FetchLatestNonDraftRelease": "Получение последнего выпуска, отличного от чернового...", + "loc.messages.FetchLastReleaseByTag": "Получение последнего выпуска, соответствующего шаблону тега: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "Найден последний опубликованный выпуск: %s", + "loc.messages.FetchMatchingReleaseSuccess": "Найден последний выпуск, отличный от чернового", + "loc.messages.FetchTagMatchingReleaseSuccess": "Найдена последняя версия, соответствующая шаблону тега: %s", + "loc.messages.GetLatestReleaseError": "При получении последнего опубликованного выпуска произошла непредвиденная ошибка.", + "loc.messages.NoLatestPublishRelease": "Пока нет выпусков, опубликованных в репозитории.", + "loc.messages.NoMatchingReleases": "Выпуски, отличные от черновых, не найдены.", + "loc.messages.NoTagMatchingReleases": "Не найдены выпуски, соответствующие шаблону тега: %s ", + "loc.messages.FetchCommitDiff": "Получение списка фиксаций со времени последнего опубликованного выпуска...", + "loc.messages.FetchCommitDiffSuccess": "Найден список изменений.", + "loc.messages.FetchCommitDiffError": "При получении списка изменений произошла непредвиденная ошибка.", + "loc.messages.FetchInitialCommit": "Получение начальной фиксации...", + "loc.messages.FetchInitialCommitSuccess": "Найдена начальная фиксация: %s", + "loc.messages.InvalidGitHubEndpoint": "Недопустимая конечная точка службы GitHub: %s.", + "loc.messages.InvalidEndpointAuthScheme": "Недопустимая схема подключения службы GitHub: %s. Разрешены только соединения с личным маркером доступа GitHub и OAuth.", + "loc.messages.FetchInitialCommitError": "При получении начальной фиксации произошла непредвиденная ошибка.", + "loc.messages.InvalidActionSet": "Недопустимое действие: %s. Разрешены только действия \"create\", \"edit\" или \"delete\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "Недопустимый источник тегов: %s. Разрешены только параметры gitTag или userSpecifiedTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "Недопустимый источник заметок о выпуске: %s. Разрешены только параметры filePath и inline. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "Недопустимый атрибут compareWith: %s. Разрешены только параметры lastFullRelease, lastNonDraftRelease или lastNonDraftReleaseByTag. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "Недопустимый режим отправки ресурса: %s. Разрешены только параметры \"delete\" и \"replace\". Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "Для действия \"%s\" требуется тег. Укажите тег в шаге. Синтаксис YAML см. на странице: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "Для источника тегов задан параметр userSpecifiedTag, укажите тег для действия create. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "Не найдены файлы, соответствующие \"%s\". Нет элементов для отправки.", + "loc.messages.PatternIsADirectory": "Не удается отправить \"%s\", так как это каталог. Укажите файл.", + "loc.messages.SearchingFileMatchingPattern": "Поиск файлов, соответствующих \"%s\".", + "loc.messages.IssuesFetchError": "Ошибка при получении вопросов. Не удается создать журнал изменений.", + "loc.messages.NoIssuesLinkedError": "Нет вопросов, связанных с фиксациями в указанном инструменте сравнения фиксаций.", + "loc.messages.LabelsSyntaxError": "При синтаксическом анализе меток произошла ошибка. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "Недопустимый атрибут ChangeLogType: %s. Разрешены только параметры commitBased или issueBased. Синтаксис YAML см. на странице https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "Изменения", + "loc.messages.DefaultCategory": "Другие", + "loc.messages.SeeMoreText": "Дополнительные сведения" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..9c26118556c3 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 发布", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/AA3aeiw)", + "loc.description": "创建、编辑或删除 GitHub 发布", + "loc.instanceNameFormat": "GitHub 发布($(action))", + "loc.group.displayName.changeLogConfiguration": "Changelog 配置", + "loc.input.label.gitHubConnection": "GitHub 连接(OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定要用于连接到 GitHub 存储库的 GitHub 服务连接的名称。该连接必须基于 GitHub 用户的 OAuth 或 GitHub 个人访问令牌。可在[此处](https://aka.ms/AA3am5s)详细了解服务连接。", + "loc.input.label.repositoryName": "存储库", + "loc.input.help.repositoryName": "指定将在其中创建、编辑或删除 GitHub 发布的 GitHub 存储库的名称。", + "loc.input.label.action": "操作", + "loc.input.help.action": "指定要执行的发布操作的类型。此任务可以创建、编辑或删除 GitHub 发布。", + "loc.input.label.target": "目标", + "loc.input.help.target": "指定将为其创建 GitHub 发布的提交 SHA。例如 `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`。还可以在此处使用变量。例如 `$(myCommitSHA)`。", + "loc.input.label.tagSource": "标记源", + "loc.input.help.tagSource": "指定要用于发布创建的标记。“Git 标记”选项会自动接受与 Git 提交关联的标记。使用“用户指定的标记”选项手动提供标记。", + "loc.input.label.tagPattern": "标记模式", + "loc.input.help.tagPattern": "使用正则表达式(如 `release-v1.*`)指定 git 标记模式。仅将针对具有匹配 git 标记的提交创建 GitHub 发布。", + "loc.input.label.tag": "标记", + "loc.input.help.tag": "指定要为其创建、编辑或删除发布的标记。还可以在此处使用变量。例如 `$(myTagName)`。", + "loc.input.label.title": "发布标题", + "loc.input.help.title": "指定 GitHub 发布的标题。如果留空,则将使用标记作为发布标题。", + "loc.input.label.releaseNotesSource": "发行说明源", + "loc.input.help.releaseNotesSource": "指定 GitHub 发布的说明。使用“发行说明文件”选项将文件内容用作发行说明。使用“内联发行说明”选项手动输入发行说明。", + "loc.input.label.releaseNotesFilePath": "发行说明文件路径", + "loc.input.help.releaseNotesFilePath": "选择包含发行说明的文件。", + "loc.input.label.releaseNotesInline": "发行说明", + "loc.input.help.releaseNotesInline": "在此处输入发行说明。支持 Markdown。", + "loc.input.label.assets": "资产", + "loc.input.help.assets": "指定要作为发布的资产进行上传的文件。可以使用通配符指定多个文件。例如,对于生成管道,可以指定 `$(Build.ArtifactStagingDirectory)/*.zip`,对于发布管道,可以指定 `$(System.DefaultWorkingDirectory)/*.zip`。还可以指定多个模式 - 每行一个。默认情况下,将上传 $(Build.ArtifactStagingDirectory) 目录中的所有文件。若要了解有关可用预定义变量列表的详细信息,请参阅[生成变量](https://aka.ms/AA4449z)和[发布变量](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "资产上传模式", + "loc.input.help.assetUploadMode": "使用“删除现有资产”选项首先删除发布中的任何现有资产,然后上传所有资产。使用“替换现有资产”选项替换具有相同名称的任何资产。", + "loc.input.label.isDraft": "草稿发布", + "loc.input.help.isDraft": "指示是否应将发布另存为草稿(未发布)。如果为 `false`,则发布此发布。", + "loc.input.label.isPreRelease": "预发布", + "loc.input.help.isPreRelease": "指示是否应将发布标记为预发布。", + "loc.input.label.addChangeLog": "添加更改日志", + "loc.input.help.addChangeLog": "如果设置为 `true`,则将生成此发布与上次发布的发布之间的更改(提交和问题)列表,并追加到发行说明。", + "loc.input.label.changeLogCompareToRelease": "比较对象", + "loc.input.help.changeLogCompareToRelease": "指示应与哪个版本比较以生成更改日志: \n最新完整版本: 将当前版本与未标记为预发布的最新非草稿版本进行比较。\n最新非草稿版本: 将当前版本与最新非草稿版本进行比较。\n按标记排序的最新非草稿版本: 将当前版本与最新非草稿版本(与指定标记匹配)进行比较。还可以指定一个正则表达式而非确切的标记。", + "loc.input.label.changeLogCompareToReleaseTag": "发布标记", + "loc.input.help.changeLogCompareToReleaseTag": "指定发布标记的正则表达式。与此标记匹配的版本将用作 changelog 计算的基础。", + "loc.input.label.changeLogType": "Changelog 类型", + "loc.input.help.changeLogType": "Changelog 可以基于提交或基于问题。基于提交的 changelog 列出版本中包含的所有提交,而基于问题的 changelog 列出该版本中包含的所有问题/拉取请求。", + "loc.input.label.changeLogLabels": "类别", + "loc.input.help.changeLogLabels": "使用此项,可根据与问题/PR 相关的标签对更改进行分类。对于标签,可提及类别的显示名称和问题状态。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果某更改具有多个标签,则优先采用第一个指定的标签。将此字段留空,以查看问题/PR 的简单列表。", + "loc.messages.GithubApiFailError": "发生意外错误。", + "loc.messages.GetTagsError": "提取标记时出现意外错误。", + "loc.messages.GetReleasesError": "提取发布时出现意外错误。", + "loc.messages.CreateReleaseError": "创建发布时出现意外错误。", + "loc.messages.EditReleaseError": "编辑发布时出现意外错误。", + "loc.messages.DeleteReleaseError": "删除发布时出现意外错误。", + "loc.messages.CreatingRelease": "正在创建标记的发布: %s", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功创建发布", + "loc.messages.ReleaseAlreadyExists": "未能创建发布。已存在以下标记的发布: %s", + "loc.messages.EditingRelease": "正在使用以下标记编辑发布: %s", + "loc.messages.EditReleaseSuccess": "已成功编辑发布", + "loc.messages.NoReleaseFoundToEditCreateRelease": "未找到要编辑的现有发布。请使用以下标记创建一个发布: %s", + "loc.messages.DeletingRelease": "正在删除标记的发布: %s", + "loc.messages.DeleteReleaseSuccess": "已成功删除版本。", + "loc.messages.NoReleaseFoundToDelete": "未找到以下标记的任何发布: %s。删除发布失败。", + "loc.messages.FetchReleaseForTag": "正在提取以下标记的发布: %s", + "loc.messages.FetchReleaseForTagSuccess": "已找到以下标记的发布: %s", + "loc.messages.FetchTagForTarget": "正在搜索与目标提交相关的标记: %s", + "loc.messages.FetchTagForTargetSuccess": "已找到目标提交的标记: %s", + "loc.messages.MissingAssetError": "找不到文件: %s", + "loc.messages.MultipleReleasesFoundError": "应仅为 1 个发布,但为标记 %s 找到多个发布。无法执行该操作。", + "loc.messages.MultipleTagFound": "应仅为 1 个标记,但为给定提交 %s 找到多个标记。无法执行该操作。", + "loc.messages.NoTagFound": "将不会创建发布,因为目标提交的标记与给定的标记模式不匹配", + "loc.messages.DeleteAllExistingAssets": "正在删除所有现有资产...", + "loc.messages.DuplicateAssetFound": "找到重复资产: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功删除资产。", + "loc.messages.DeletingDuplicateAsset": "正在删除重复资产: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重复资产: %s。正在跳过...", + "loc.messages.AssetDeletedSuccessfully": "资产 %s 已成功删除", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上传所有资产。", + "loc.messages.ErrorDeletingDuplicateAsset": "删除重复资产时出现意外错误: %s", + "loc.messages.ErrorDeletingAsset": "删除资产时出现意外错误: %s", + "loc.messages.DeletingAsset": "正在删除资产: %s", + "loc.messages.NoAssetFoundToDelete": "未找到要删除的资产。", + "loc.messages.UploadingAssets": "正在上传资产...", + "loc.messages.UploadingAsset": "正在上传文件:“%s”。", + "loc.messages.UploadAssetError": "上传文件时出现意外错误: %s", + "loc.messages.UploadAssetSuccess": "已成功上传文件:“%s”", + "loc.messages.NoAssetFoundToUpload": "未找到要上传的资产。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "发行说明文件 %s 是目录,而不是文件。", + "loc.messages.AssetIsDirectoryError": "资产是目录,而不是文件。正在跳过上传目录: %s", + "loc.messages.ComputingChangeLog": "正在计算此发布中所做的更改...", + "loc.messages.ComputingChangeLogSuccess": "已成功计算更改。", + "loc.messages.CommitDiffBehind": "无法计算更改,因为所提供的目标提交早于上次发行版的提交。", + "loc.messages.CommitDiffEqual": "未找到任何更改。提供的目标提交与上次发行版的提交相同。", + "loc.messages.FetchLatestPublishRelease": "正在提取最新发布的发布...", + "loc.messages.FetchLatestNonDraftRelease": "正在提取最新非草稿版本…", + "loc.messages.FetchLastReleaseByTag": "正在提取与标记模式匹配的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "已找到最新发布的发布: %s", + "loc.messages.FetchMatchingReleaseSuccess": "已找到最新非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "已找到与标记模式匹配的最新版本: %s", + "loc.messages.GetLatestReleaseError": "提取最新发布的发布时出现意外错误。", + "loc.messages.NoLatestPublishRelease": "存储库中尚未发布任何发布。", + "loc.messages.NoMatchingReleases": "未找到非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到与标记模式匹配的版本: %s", + "loc.messages.FetchCommitDiff": "正在提取自上次发布的发布以来的提交列表...", + "loc.messages.FetchCommitDiffSuccess": "已找到更改列表。", + "loc.messages.FetchCommitDiffError": "提取更改列表时出现意外错误。", + "loc.messages.FetchInitialCommit": "正在提取初始提交...", + "loc.messages.FetchInitialCommitSuccess": "已找到初始提交: %s", + "loc.messages.InvalidGitHubEndpoint": "无效的 GitHub 服务终结点: %s。", + "loc.messages.InvalidEndpointAuthScheme": "无效的 GitHub 服务连接方案: %s。仅允许 OAuth 和 GitHub 个人访问令牌连接。", + "loc.messages.FetchInitialCommitError": "提取初始提交时出现意外错误。", + "loc.messages.InvalidActionSet": "无效的操作: %s。仅允许“创建”、“编辑”或“删除”操作。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "无效的标记源: %s。仅允许 \"gitTag\" 或 \"userSpecifiedTag\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "无效的发行说明源: %s。仅允许 \"filePath\" 或 \"inline\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "无效的 compareWith 属性: %s。仅允许 \"lastFullRelease\"、\"lastNonDraftRelease\" 或 \"lastNonDraftReleaseByTag\" 选项。对于 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "无效的资产上传模式: %s。仅允许“删除”或“替换”选项。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "对于“%s”操作,标记是必需的。请在步骤中指定一个标记。有关 yaml 语法,请参见: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "标记源设置为 userSpecifiedTag- 请指定创建操作的标记。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "未找到与“%s”匹配的文件。没有要上传的内容。", + "loc.messages.PatternIsADirectory": "无法上传“%s”,因为它是一个目录。请指定一个文件。", + "loc.messages.SearchingFileMatchingPattern": "正在搜索匹配“%s”的文件。", + "loc.messages.IssuesFetchError": "提取问题时出错。无法生成更改日志。", + "loc.messages.NoIssuesLinkedError": "在指定提交差异中,未将任何问题链接到提交。", + "loc.messages.LabelsSyntaxError": "分析标签时出错。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "无效的 ChangeLogType 属性: %s。仅允许 \"commitBased\" 或 \"issueBased\" 选项。有关 yaml 语法,请参阅: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "更改", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..61b28f935013 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,127 @@ +{ + "loc.friendlyName": "GitHub 版本", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/AA3aeiw)", + "loc.description": "建立、編輯或刪除 GitHub 版本", + "loc.instanceNameFormat": "GitHub 版本 ($(action))", + "loc.group.displayName.changeLogConfiguration": "變更記錄組態", + "loc.input.label.gitHubConnection": "GitHub 連線 (OAuth 或 PAT)", + "loc.input.help.gitHubConnection": "指定用來連線到 GitHub 存放庫的 GitHub 服務連線名稱。該連線必須根據 GitHub 使用者的 OAuth 或 GitHub 個人存取權杖來進行。若要深入了解服務連線,請前往 [這裡](https://aka.ms/AA3am5s)。", + "loc.input.label.repositoryName": "存放庫", + "loc.input.help.repositoryName": "指定建立、編輯或刪除 GitHub 版本所在的 GitHub 存放庫名稱。", + "loc.input.label.action": "動作", + "loc.input.help.action": "指定要執行的版本作業類型。這項工作可以建立、編輯或刪除 GitHub 版本。", + "loc.input.label.target": "目標", + "loc.input.help.target": "指定要建立 GitHub 版本的認可 SHA。例如 '48b11d8d6e92a22e3e9563a3f643699c16fd6e27'。您也可以在這裡使用變數。例如 '$(myCommitSHA)'。", + "loc.input.label.tagSource": "標籤來源", + "loc.input.help.tagSource": "指定要用來建立版本的標籤。[Git 標籤] 選項會自動使用與 Git 認可建立關聯的標籤。使用 [使用者指定的標籤] 可手動提供標籤。", + "loc.input.label.tagPattern": "標籤模式", + "loc.input.help.tagPattern": "使用 Regex (例如 `release-v1.*`) 指定 git 標籤模式。僅針對具有相符 git 標籤的認可建立 GitHub 版本。", + "loc.input.label.tag": "標籤", + "loc.input.help.tag": "指定要建立、編輯或刪除版本的標籤。您也可以在這裡使用變數。例如 '$(myTagName)'。", + "loc.input.label.title": "版本標題", + "loc.input.help.title": "指定 GitHub 版本的標題。如果保留空白,將使用標籤作為版本標題。", + "loc.input.label.releaseNotesSource": "版本資訊來源", + "loc.input.help.releaseNotesSource": "指定 GitHub 版本的描述。使用 [版本資訊檔案] 選項可使用檔案內容作為版本資訊。使用 [內嵌版本資訊] 選項可手動輸入版本資訊。", + "loc.input.label.releaseNotesFilePath": "版本資訊檔案路徑", + "loc.input.help.releaseNotesFilePath": "選取包含版本資訊的檔案。", + "loc.input.label.releaseNotesInline": "版本資訊", + "loc.input.help.releaseNotesInline": "請在這裡輸入版本資訊。支援 Markdown。", + "loc.input.label.assets": "資產", + "loc.input.help.assets": "指定要上傳為版本資產的檔案。您可以使用萬用字元來指定多個檔案。例如若為建置管線,請使用 `$(Build.ArtifactStagingDirectory)/*.zip`; 若為發行管線,請使用 `$(System.DefaultWorkingDirectory)/*.zip`。您也可以指定多個模式,每行指定一個。根據預設會上傳 $(Build.ArtifactStagingDirectory) 目錄中的所有檔案。若要深入了解可用預先定義變數的清單,請參閱 [建置變數](https://aka.ms/AA4449z) 和 [發行變數](https://aka.ms/AA43wws)。", + "loc.input.label.assetUploadMode": "資產上傳模式", + "loc.input.help.assetUploadMode": "使用 [刪除現有的資產] 選項可先刪除版本中任何現有的資產,再上傳所有資產。使用 [取代現有的資產] 選項可取代同名的所有資產。", + "loc.input.label.isDraft": "草稿版本", + "loc.input.help.isDraft": "指出是否應將版本儲存為草稿 (未發佈)。如果是 'false',將會發佈版本。", + "loc.input.label.isPreRelease": "發行前版本", + "loc.input.help.isPreRelease": "指出是否應將版本標記為發行前版本。", + "loc.input.label.addChangeLog": "新增變更記錄", + "loc.input.help.addChangeLog": "如果設定為 'true',將會產生此版本和上次所發佈版本間變更 (認可和問題) 的清單,並附加到版本資訊。", + "loc.input.label.changeLogCompareToRelease": "比較對象", + "loc.input.help.changeLogCompareToRelease": "指出應比較的版本以產生變更記錄: \n最後完整版本: 比較目前版本與未標示為發行前版本的最新非草稿版本。\n最後非草稿版本: 比較目前版本與最新的非草稿版本。\n依標籤決定的最後非草稿版本: 比較目前版本與符合指定標籤的最後非草稿版本。您也可以指定 Regex,而不指定具體的標籤。", + "loc.input.label.changeLogCompareToReleaseTag": "版本標籤", + "loc.input.help.changeLogCompareToReleaseTag": "指定 Regex 為版本標籤。符合此標籤的版本會用作變更記錄計算的基底。", + "loc.input.label.changeLogType": "變更記錄類型", + "loc.input.help.changeLogType": "變更記錄可依據認可或問題來進行記錄。以認可為依據的變更記錄,會列出版本內含的所有認可,而以問題為依據的變更記錄,則會列出版本內含的所有問題/提取要求。", + "loc.input.label.changeLogLabels": "類別", + "loc.input.help.changeLogLabels": "使用此項即可依據與問題/pr 建立關聯的標籤將變更分類。針對標籤,您可以提及類別的顯示名稱及問題的狀態。例如 `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"`。如果變更有多個標籤,則優先使用第一個指定的標籤。此欄位請保留空白,以查看問題/pr 的簡單列表。", + "loc.messages.GithubApiFailError": "發生未預期的錯誤。", + "loc.messages.GetTagsError": "擷取標籤時發生未預期的錯誤。", + "loc.messages.GetReleasesError": "擷取版本時發生未預期的錯誤。", + "loc.messages.CreateReleaseError": "建立版本時發生未預期的錯誤。", + "loc.messages.EditReleaseError": "編輯版本時發生未預期的錯誤。", + "loc.messages.DeleteReleaseError": "刪除版本時發生未預期的錯誤。", + "loc.messages.CreatingRelease": "正在建立標籤 %s 的版本", + "loc.messages.CreateReleaseSuccess": "已在 %s 成功建立版本", + "loc.messages.ReleaseAlreadyExists": "無法建立版本。已有標籤 %s 的版本", + "loc.messages.EditingRelease": "正在編輯標籤為 %s 的版本", + "loc.messages.EditReleaseSuccess": "已成功編輯版本", + "loc.messages.NoReleaseFoundToEditCreateRelease": "找不到任何要編輯的現有版本。正在使用標籤 %s 建立一個", + "loc.messages.DeletingRelease": "正在刪除標籤 %s 的版本", + "loc.messages.DeleteReleaseSuccess": "已成功刪除版本。", + "loc.messages.NoReleaseFoundToDelete": "找不到標籤 %s 的版本。刪除版本失敗。", + "loc.messages.FetchReleaseForTag": "正在擷取標籤 %s 的版本", + "loc.messages.FetchReleaseForTagSuccess": "找到標籤 %s 的版本", + "loc.messages.FetchTagForTarget": "正在搜尋與目標認可 %s 建立關聯的標籤", + "loc.messages.FetchTagForTargetSuccess": "找到目標認可 %s 的標籤", + "loc.messages.MissingAssetError": "找不到檔案: %s", + "loc.messages.MultipleReleasesFoundError": "標籤 %s 只應有 1 個版本,但卻找到多個版本。無法執行此動作。", + "loc.messages.MultipleTagFound": "指定的認可 %s 只應有 1 個標籤,但卻找到多個標籤。無法執行此動作。", + "loc.messages.NoTagFound": "因為目標認可與指定的標籤模式不符,所以不會將版本建立為標籤", + "loc.messages.DeleteAllExistingAssets": "正在刪除所有現有的資產...", + "loc.messages.DuplicateAssetFound": "找到重複的資產: %s", + "loc.messages.AssetsDeletedSuccessfully": "已成功刪除資產。", + "loc.messages.DeletingDuplicateAsset": "正在刪除重複的資產: %s", + "loc.messages.SkipDuplicateAssetFound": "找到重複的資產 %s。正在跳過...", + "loc.messages.AssetDeletedSuccessfully": "已成功刪除資產 %s", + "loc.messages.AllAssetsUploadedSuccessfully": "已成功上傳所有資產。", + "loc.messages.ErrorDeletingDuplicateAsset": "刪除重複的資產 %s 時發生未預期的錯誤", + "loc.messages.ErrorDeletingAsset": "刪除資產 %s 時發生未預期的錯誤", + "loc.messages.DeletingAsset": "正在刪除資產: %s", + "loc.messages.NoAssetFoundToDelete": "找不到任何要刪除的資產。", + "loc.messages.UploadingAssets": "正在上傳資產...", + "loc.messages.UploadingAsset": "正在上傳檔案: '%s'。", + "loc.messages.UploadAssetError": "上傳檔案 %s 時發生未預期的錯誤", + "loc.messages.UploadAssetSuccess": "已成功上傳檔案: '%s'", + "loc.messages.NoAssetFoundToUpload": "找不到任何要上傳的資產。", + "loc.messages.ReleaseNotesFileIsDirectoryError": "版本資訊檔案 %s 是目錄,而不是檔案。", + "loc.messages.AssetIsDirectoryError": "資產是目錄,而不是檔案。正在跳過目錄的上傳: %s", + "loc.messages.ComputingChangeLog": "正在計算此版本中所做的變更...", + "loc.messages.ComputingChangeLogSuccess": "已成功計算變更。", + "loc.messages.CommitDiffBehind": "因為提供的目標認可比上次所發佈版本的認可舊,所以無法計算變更。", + "loc.messages.CommitDiffEqual": "找不到任何變更。提供的目標認可與上次所發佈版本的認可相同。", + "loc.messages.FetchLatestPublishRelease": "正在擷取最新發佈的版本...", + "loc.messages.FetchLatestNonDraftRelease": "正在擷取最新的非草稿版本...", + "loc.messages.FetchLastReleaseByTag": "正在擷取符合標籤模式的最新版本: %s ", + "loc.messages.FetchLatestPublishReleaseSuccess": "找到最新發佈的版本: %s", + "loc.messages.FetchMatchingReleaseSuccess": "找到最新的非草稿版本", + "loc.messages.FetchTagMatchingReleaseSuccess": "找到符合標籤模式的最新版本: %s", + "loc.messages.GetLatestReleaseError": "擷取最新發佈的版本時發生未預期的錯誤。", + "loc.messages.NoLatestPublishRelease": "尚未在存放庫中發佈任何版本。", + "loc.messages.NoMatchingReleases": "找不到任何非草稿版本。", + "loc.messages.NoTagMatchingReleases": "找不到符合標籤模式的版本: %s ", + "loc.messages.FetchCommitDiff": "正在擷取自上次所發佈版本之後的認可清單...", + "loc.messages.FetchCommitDiffSuccess": "找到變更清單。", + "loc.messages.FetchCommitDiffError": "擷取變更清單時發生未預期的錯誤。", + "loc.messages.FetchInitialCommit": "正在擷取初始認可...", + "loc.messages.FetchInitialCommitSuccess": "找到初始認可: %s", + "loc.messages.InvalidGitHubEndpoint": "GitHub 服務端點 %s 無效。", + "loc.messages.InvalidEndpointAuthScheme": "GitHub 服務連線配置 %s 無效。僅允許 OAuth 和 GitHub 個人存取權杖連線。", + "loc.messages.FetchInitialCommitError": "擷取初始認可時發生未預期的錯誤。", + "loc.messages.InvalidActionSet": "動作 %s 無效。僅允許 'create'、'edit' 或 'delete' 動作。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidTagSource": "標籤來源無效: %s。僅允許 'gitTag' 或 'userSpecifiedTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidReleaseNotesSource": "版本資訊來源無效: %s。僅允許 'filePath' 或 'inline' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidCompareWithAttribute": "compareWith 屬性無效: %s。僅允許 'lastFullRelease'、'lastNonDraftRelease' 或 'lastNonDraftReleaseByTag' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidAssetUploadMode": "資產上傳模式 %s 無效。僅允許 'delete' 或 'replace' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredEditDeleteAction": "'%s' 動作需有標籤。請在此步驟中指定標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.TagRequiredCreateAction": "標籤來源已設定為 userSpecifiedTag-,請指定建立動作的標籤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.NoFileFoundMatchingPattern": "找不到符合 '%s' 的檔案。沒有要上傳的項目。", + "loc.messages.PatternIsADirectory": "因為 '%s' 是目錄,所以無法予以上傳。請指定檔案。", + "loc.messages.SearchingFileMatchingPattern": "正在搜尋符合 '%s' 的檔案。", + "loc.messages.IssuesFetchError": "擷取問題時發生錯誤。無法產生變更記錄。", + "loc.messages.NoIssuesLinkedError": "沒有任何問題連結到指定認可 Diff 中的認可。", + "loc.messages.LabelsSyntaxError": "剖析標籤時發生錯誤。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.InvalidChangeLogTypeAttribute": "ChangeLogType 屬性無效: %s。僅允許 'commitBased' 或 'issueBased' 選項。如需 yaml 語法,請參閱: https://aka.ms/AA3m1bq", + "loc.messages.ChangeLogTitle": "變更", + "loc.messages.DefaultCategory": "其他", + "loc.messages.SeeMoreText": "查看更多內容" +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/ActionL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/ActionL0Tests.ts new file mode 100644 index 000000000000..04ff1bf404cf --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/ActionL0Tests.ts @@ -0,0 +1,25 @@ +import { Action } from "../operations/Action"; + +export class ActionL0Tests { + + public static async startTests() { + await this.validateCreateReleaseAction(); + await this.validateEditReleaseAction(); + await this.validateDeleteReleaseAction(); + } + + public static async validateCreateReleaseAction() { + await new Action().createReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, []); + } + + public static async validateEditReleaseAction() { + await new Action().editReleaseAction("endpoint", "repo", "target", "tagName", "title", "note", false, false, [], "id"); + } + + public static async validateDeleteReleaseAction() { + await new Action().deleteReleaseAction("endpoint", "repo", "tag"); + } + +} + +ActionL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/ActionTests.ts b/_generated/GitHubReleaseV1_Node16/Tests/ActionTests.ts new file mode 100644 index 000000000000..519bef69bc0f --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/ActionTests.ts @@ -0,0 +1,63 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import * as sinon from 'sinon'; +import { Inputs } from '../operations/Constants'; + +export class ActionTests { + + public static startTest() { + let tp = path.join(__dirname, 'ActionL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.assetUploadMode, "replace"); + + this.stub(tr); + + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + createRelease: async function() { + return { + statusCode: 201, + body: { "upload_url": "url" } + } + }, + editRelease: function() { + return { + statusCode: 200, + body: { "html_url": "url" } + } + }, + deleteRelease: function() { + return { + statusCode: 204 + } + }, + uploadReleaseAsset: function() { + return { + statusCode: 201 + } + } + } + } + }); + + tr.registerMock("./Helper", { + Helper: function () { + return { + getReleaseIdForTag: function() { + return "id"; + } + } + } + }); + } + +} + +ActionTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogL0Tests.ts new file mode 100644 index 000000000000..2e6e8057ddde --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogL0Tests.ts @@ -0,0 +1,61 @@ +import { ChangeLog } from "../operations/ChangeLog"; +import { TestString } from "./TestStrings"; +import { ChangeLogStartCommit } from "../operations/Utility"; + +export class ChangeLogL0Tests { + public static async startTests() { + await this.validateGetChangeLog1(); + await this.validateGetChangeLog2(); + await this.validateGetChangeLog3(); + await this.validateGetChangeLog4(); + await this.validateGetChangeLog5(); + await this.validateGetChangeLog6(); + } + + public static async validateGetChangeLog1() { + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "commitBased"); + + if (changes === this.expectedCommitBasedChanges) { + console.log(TestString.getChangeLogKeyword); + } + } + + public static async validateGetChangeLog2() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftRelease, "commitBased"); + } + + public static async validateGetChangeLog3() { + await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastNonDraftReleaseByTag, "commitBased", "v1.*"); + } + + public static async validateGetChangeLog4(){ + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, []); + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.allIssuesChangeLog); + } + } + + public static async validateGetChangeLog5(){ + let changeLogLabels = `[{"label": "ux", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "bug", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + if (changes === this.expectedIssueBasedChanges) { + console.log(TestString.issueBasedChangeLog); + } + } + + public static async validateGetChangeLog6(){ + let changeLogLabels = `[{"label": "hello", "displayName": "Closed UX Issues/PRs", "state": "CLOSED"}, {"label" : "nope", "displayName": "Open Bugs", "state": "OPEN"}]`; + let changes = await new ChangeLog().getChangeLog("endpoint", "owner/repo", "target", 250, ChangeLogStartCommit.lastFullRelease, "issueBased", null, JSON.parse(changeLogLabels)); + + if (changes === this.expectedAllIssuesChanges) { + console.log(TestString.noCategoryChangeLog); + } + } + + public static readonly expectedCommitBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* xyz Fixing issue #56. [ #9 ]\n* abc Fixing issue #2 #3. [ #4, #5 ]\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedAllIssuesChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n* #1: Incorrect color contrast in control panel\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + public static readonly expectedIssueBasedChanges = "\n\n## loc_mock_ChangeLogTitle:\n\n\n### Closed UX Issues/PRs:\n\n\n* #1: Incorrect color contrast in control panel\n\n### Open Bugs:\n\n\n* #2: Text alignment confusing in panel\n* #3: Fixed previous minor bugs\n\nThis list of changes was [auto generated](MOCK_RELEASE_URL)."; + +} + +ChangeLogL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogTests.ts b/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogTests.ts new file mode 100644 index 000000000000..57020cde2f6c --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/ChangeLogTests.ts @@ -0,0 +1,170 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class ChangeLogTests { + + public static startTest() { + let tp = path.join(__dirname, 'ChangeLogL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + process.env["RELEASE_RELEASEWEBURL"] = "MOCK_RELEASE_URL"; + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Helper", { + Helper: function () { + return { + getCommitShaFromTarget: function() { + return "abc"; + }, + filterTag: function(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]) { + console.log("Tag Name: "+ filterValue); + return { commit: { sha: "abc" } }; + } + } + } + }); + + tr.registerMock("./Release", { + Release: function () { + return { + getLatestRelease: function() { + return { + statusCode: 200, + body: { "tag_name": "tagName" } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + { + "tag_name": "pre_rel", + "prerelease": true, + "draft": false + }, + { + "tag_name": "v1.2", + "prerelease": false, + "draft": false + } + ] + } + }, + getCommitsList: function() { + return { + statusCode: 200, + body: { "commits": [ + {"sha": "abc", "commit": { "message": "Fixing issue #2 #3.\n\n desc #4 GH-5" } }, + {"sha": "xyz", "commit": { "message": "Fixing issue #56.\n\n desc Gh-9" } } + ] } + }; + }, + getIssuesList: function (githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + if (includeLabels) { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + "labels": { + "edges": [ + { + "node": { + "name": "bug" + } + }, + { + "node": { + "name": "ux" + } + } + ] + } + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + "labels": { + "edges": [ + { + "node": { + "name": "nit" + } + }, + { + "node": { + "name": "bug" + } + } + ] + } + } + } + } + } + } + } + else { + return { + statusCode: 200, + body: { + "data": { + "repository": { + "_1": { + "title": "Incorrect color contrast in control panel", + "state": "CLOSED", + }, + "_2": { + "title": "Text alignment confusing in panel", + "state": "OPEN", + }, + "_3": { + "title": "Fixed previous minor bugs", + "state": "OPEN", + "changedFiles": 1, + } + } + } + } + } + } + } + } + } + }); + } +} + +ChangeLogTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/CreateAction2L0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/CreateAction2L0Tests.ts new file mode 100644 index 000000000000..ebe4e7528bee --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/CreateAction2L0Tests.ts @@ -0,0 +1,48 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "gitTag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCommitTarget: function() { + return null; + }, + publishTelemetry: function() { + + } + } + } + }); + } + + public static sandbox; +} + +CreateAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/CreateActionL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/CreateActionL0Tests.ts new file mode 100644 index 000000000000..ca5adfc6434f --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/CreateActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class CreateActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "create"); + tr.setInput(Inputs.tagSource, "userSpecifiedTag"); + tr.setInput(Inputs.tag, "tag"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getTagForCreateAction: function() { + return "v1.0.1"; + }, + publishTelemetry: function() { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called"); // = this.createActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +CreateActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/DeleteAction2L0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/DeleteAction2L0Tests.ts new file mode 100644 index 000000000000..e32bf396eaae --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/DeleteAction2L0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "Delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteAction2KeyWord) }); + } + + public static sandbox; +} + +DeleteAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/DeleteActionL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/DeleteActionL0Tests.ts new file mode 100644 index 000000000000..8c692e965ce8 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/DeleteActionL0Tests.ts @@ -0,0 +1,42 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; +import { TestString } from './TestStrings'; + +export class DeleteActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Set the input + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "delete"); + tr.setInput(Inputs.tag, "tag"); + + // Stub methods + this.stub(); + + // Run the main.js + tr.run(); + + // Restore all stubs + this.sandbox.restore(); + } + + public static stub() { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + var Action = require('../operations/Action'); + this.sandbox.stub(Action.Action.prototype, "deleteReleaseAction").callsFake(() => { console.log(TestString.deleteActionKeyWord) }); + } + + public static sandbox; +} + +DeleteActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/EditAction2L0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/EditAction2L0Tests.ts new file mode 100644 index 000000000000..b8d23dd0ff34 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/EditAction2L0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditAction2L0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return "123"; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + editReleaseAction: () => { + console.log("L0Test: edit release action method should be called when a release is present for given tag"); // = this.editAction2KeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditAction2L0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/EditActionL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/EditActionL0Tests.ts new file mode 100644 index 000000000000..15ea41e40ba4 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/EditActionL0Tests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class EditActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "edit"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tagSource, "manual"); + tr.setInput(Inputs.tag, "v1.0.0"); + tr.setInput(Inputs.releaseNotesSource, "inline"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + + tr.registerMock("./operations/Helper", { + Helper: function () { + return { + getReleaseIdForTag: () => { + return null; + }, + publishTelemetry: () => { + + } + } + } + }); + + tr.registerMock("./operations/Action", { + Action: function () { + return { + createReleaseAction: () => { + console.log("L0Test: create release action method should be called when no release is present for given tag"); // = this.editActionKeyWord + } + } + } + }); + + } + + public static sandbox; +} + +EditActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/HelperL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/HelperL0Tests.ts new file mode 100644 index 000000000000..07dace6e6eb8 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/HelperL0Tests.ts @@ -0,0 +1,47 @@ +import { Helper } from "../operations/Helper"; +import { TestString } from "./TestStrings"; + +export class HelperL0Tests { + public static async startTests() { + await this.validateGetTagForCreateAction(); + await this.validateGetTagForCreateActionWithTagPattern(); + await this.validateGetCommitShaFromTarget(); + await this.validateGetReleaseIdForTag(); + } + + public static async validateGetTagForCreateAction() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "abc"); + + if (tag === "tagName") { + console.log(TestString.getTagForCreateActionKeyword); + } + } + + public static async validateGetTagForCreateActionWithTagPattern() { + let tag = await new Helper().getTagForCommitTarget("endpoint", "repo", "bcd", "v1.*"); + + if (tag === "v1.12") { + console.log(TestString.getTagForCreateActionWithTagPatternKeyword); + } + } + + public static async validateGetCommitShaFromTarget() { + let target = "master"; + let sha = await new Helper().getCommitShaFromTarget("endpoint", "repo", target); + + if (sha === "abc") { + console.log(TestString.getCommitShaFromTargetKeyword); + } + } + + public static async validateGetReleaseIdForTag() { + let releaseId = await new Helper().getReleaseIdForTag("endpoint", "repo", "tagName"); + + if (releaseId === 456) { + console.log(TestString.getReleaseIdForTagKeyword); + } + } + +} + +HelperL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/HelperTests.ts b/_generated/GitHubReleaseV1_Node16/Tests/HelperTests.ts new file mode 100644 index 000000000000..d04fb89eb0d5 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/HelperTests.ts @@ -0,0 +1,67 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class HelperTests { + + public static startTest() { + let tp = path.join(__dirname, 'HelperL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + // Stub methods + this.stub(tr); + + // Run the main.js + tr.run(); + } + + public static stub(tr) { + + tr.registerMock("./Release", { + Release: function () { + return { + getTags: function() { + return { + statusCode: 200, + headers: { "link": ""}, + body: [ + { + "commit": { "sha": "abc" }, + "name": "tagName" + }, + { + "commit": { "sha": "bcd" }, + "name": "test" + }, + { + "commit": { "sha": "bcd" }, + "name": "v1.12" + } + ] + } + }, + getBranch: function(githubEndpointToken: string, repositoryName: string, target: string) { + + return { + statusCode: 200, + body: { commit: { sha: target === "master"? "abc":target } } + } + }, + getReleases: function() { + return { + statusCode: 200, + body: [ + {"tag_name": "abc", "id": 123}, + {"tag_name": "tagName", "id": 456} + ], + headers: {} + } + } + } + } + }); + } +} + +HelperTests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/InvalidActionL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/InvalidActionL0Tests.ts new file mode 100644 index 000000000000..7bf27ba512fc --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/InvalidActionL0Tests.ts @@ -0,0 +1,34 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { Inputs } from '../operations/Constants'; +import * as sinon from 'sinon'; + +export class InvalidActionL0Tests { + + public static startTest() { + let tp = path.join(__dirname, '..', 'main.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + + tr.setInput(Inputs.gitHubConnection, "connection"); + tr.setInput(Inputs.repositoryName, "repo"); + tr.setInput(Inputs.action, "creadte"); + tr.setInput(Inputs.target, "master"); + tr.setInput(Inputs.tag, "tag"); + + this.stub(tr); + tr.run(); + + this.sandbox.restore(); + } + + public static stub(tr) { + this.sandbox = sinon.sandbox.create(); + + var Utility = require('../operations/Utility'); + this.sandbox.stub(Utility.Utility, "getGithubEndPointToken").callsFake(function() { return { scheme: 'OAuth', parameters: { AccessToken: "**someToken**"}} }); + } + + public static sandbox; +} + +InvalidActionL0Tests.startTest(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/L0.ts b/_generated/GitHubReleaseV1_Node16/Tests/L0.ts new file mode 100644 index 000000000000..2c065aa90f4e --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/L0.ts @@ -0,0 +1,136 @@ +import * as path from 'path'; +import * as assert from 'assert'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { TestString } from './TestStrings'; + +describe('GitHubReleaseTaskTests Suite', function() { + this.timeout(60000); + + it('Validate delete action is called when action = delete.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteActionKeyWord) >= 0, 'should have printed: ' + TestString.deleteActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = create', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createActionKeyWord) >= 0, 'should have printed: ' + TestString.createActionKeyWord); + + done(); + }); + + it('Validate create action is called when action = edit but no release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editActionKeyWord) >= 0, 'should have printed: ' + TestString.editActionKeyWord); + + done(); + }); + + it('Validate edit action is called when action = edit but a release is present for that tag.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'EditAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.editAction2KeyWord) >= 0, 'should have printed: ' + TestString.editAction2KeyWord); + + done(); + }); + + it('Validate delete action is called when action = Delete. Validating if action is case insensitive or not.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'DeleteAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.deleteAction2KeyWord) >= 0, 'should have printed: ' + TestString.deleteAction2KeyWord); + + done(); + }); + + it('Validate task fails with correct error when action = create and no tag is present.', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'CreateAction2L0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.NoTagFoundKeyword) >= 0, 'should have printed: ' + TestString.NoTagFoundKeyword); + + done(); + }); + + it('Validate task fails with correct error when action input is invalid', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'InvalidActionL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.InvalidActionKeyword) >= 0, 'should have printed: ' + TestString.InvalidActionKeyword); + + done(); + }); + + it('Validate Utility class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'UtilityL0Tests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getReleaseNoteKeyword) >= 0, 'should have printed: ' + TestString.getReleaseNoteKeyword); + assert(tr.stdout.search(TestString.validBranchNameKeyword) >= 0, 'should have printed: ' + TestString.validBranchNameKeyword); + assert(tr.stdout.search(TestString.invalidBranchNameKeyword) >= 0, 'should have printed: ' + TestString.invalidBranchNameKeyword); + assert(tr.stdout.search(TestString.tagMatchingKeyword) >= 0, 'should have printed: ' + TestString.tagMatchingKeyword); + assert(tr.stdout.search(TestString.parseHTTPHeaderLinkKeyword) >= 0, 'should have printed: ' + TestString.parseHTTPHeaderLinkKeyword); + assert(tr.stdout.search(TestString.extractRepositoryOwnerAndNameKeyword) >= 0, 'should have printed: ' + TestString.extractRepositoryOwnerAndNameKeyword); + assert(tr.stdout.search(TestString.extractRepoAndIssueIdKeyword) >= 0, 'should have printed: ' + TestString.extractRepoAndIssueIdKeyword); + assert(tr.stdout.search(TestString.getFirstLineKeyword) >= 0, 'should have printed: ' + TestString.getFirstLineKeyword); + + done(); + }); + + it('Validate Helper class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'HelperTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.getTagForCreateActionKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionKeyword); + assert(tr.stdout.search(TestString.getTagForCreateActionWithTagPatternKeyword) >= 0, 'should have printed: ' + TestString.getTagForCreateActionWithTagPatternKeyword); + assert(tr.stdout.search(TestString.getCommitShaFromTargetKeyword) >= 0, 'should have printed: ' + TestString.getCommitShaFromTargetKeyword); + assert(tr.stdout.search(TestString.getReleaseIdForTagKeyword) >= 0, 'should have printed: ' + TestString.getReleaseIdForTagKeyword); + + done(); + }); + + it('Validate ChangeLog class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ChangeLogTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.stdout.search(TestString.getChangeLogKeyword) >= 0, 'should have printed: ' + TestString.getChangeLogKeyword); + assert(tr.stdout.search(TestString.allIssuesChangeLog) >= 0, 'should have printed: ' + TestString.allIssuesChangeLog); + assert(tr.stdout.search(TestString.issueBasedChangeLog) >= 0, 'should have printed: ' + TestString.issueBasedChangeLog); + assert(tr.stdout.search(TestString.noCategoryChangeLog) >= 0, 'should have printed: ' + TestString.noCategoryChangeLog); + assert(tr.stdout.search("Tag Name: v1.2") >=0, 'should have printed: TagName: v1.2'); + assert(tr.stdout.search("Tag Name: pre_rel") >=0, 'should have printed: TagName: pre_rel'); + assert(tr.stdout.search("Tag Name: tagName") >=0, 'should have printed: TagName: tagName'); + + done(); + }); + + it('Validate Action class methods', (done: Mocha.Done) => { + let tp = path.join(__dirname, 'ActionTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.stdout.search(TestString.createReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.createReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.editReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.editReleaseSuccessKeyword); + assert(tr.stdout.search(TestString.deleteReleaseSuccessKeyword) >= 0, 'should have printed: ' + TestString.deleteReleaseSuccessKeyword); + + done(); + }); + +}); diff --git a/_generated/GitHubReleaseV1_Node16/Tests/TestStrings.ts b/_generated/GitHubReleaseV1_Node16/Tests/TestStrings.ts new file mode 100644 index 000000000000..afad94c3cd22 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/TestStrings.ts @@ -0,0 +1,29 @@ + +export class TestString { + public static readonly createReleaseSuccessKeyword: string = "CreateReleaseSuccess"; + public static readonly editReleaseSuccessKeyword: string = "EditReleaseSuccess"; + public static readonly deleteReleaseSuccessKeyword: string = "DeleteReleaseSuccess"; + public static readonly getChangeLogKeyword: string = "getChangeLog method should work properly"; + public static readonly NoTagFoundKeyword: string = "No tag found"; + public static readonly createActionKeyWord: string = "L0Test: create release action method should be called"; + public static readonly deleteActionKeyWord: string = "L0Test: delete action called when action = delete"; + public static readonly deleteAction2KeyWord: string = "L0Test: delete action should be called when action = Delete"; + public static readonly editAction2KeyWord: string = "L0Test: edit release action method should be called when a release is present for given tag"; + public static readonly editActionKeyWord: string = "L0Test: create release action method should be called when no release is present for given tag"; + public static readonly getTagForCreateActionKeyword: string = "getTagForCreateAction method should work properly"; + public static readonly getTagForCreateActionWithTagPatternKeyword: string = "getTagForCreateAction method should work properly when tagPattern is specified"; + public static readonly getCommitShaFromTargetKeyword: string = "getCommitShaFromTarget method should work properly"; + public static readonly getReleaseIdForTagKeyword: string = "getReleaseIdForTag method should work properly"; + public static readonly InvalidActionKeyword: string = "Invalid action input"; + public static readonly getReleaseNoteKeyword: string = "getReleaseNote method should work properly"; + public static readonly validBranchNameKeyword: string = "normalizeBranchName method should return tag name when branch = refs/tags/tagname"; + public static readonly invalidBranchNameKeyword: string = "normalizeBranchName method should return undefined when branch = refs/heads/tagname"; + public static readonly parseHTTPHeaderLinkKeyword: string = "parseHTTPHeaderLink method should work properly"; + public static readonly extractRepositoryOwnerAndNameKeyword: string = "extractRepositoryOwnerAndName method should work properly"; + public static readonly extractRepoAndIssueIdKeyword: string = "extractRepoAndIssueId method should work properly"; + public static readonly getFirstLineKeyword: string = "getFirstLine method should work properly"; + public static readonly tagMatchingKeyword: string = "isTagMatching method should work properly"; + public static readonly allIssuesChangeLog: string = "getChangeLog should generate All Issues ChangeLog"; + public static readonly issueBasedChangeLog: string = "getChangeLog should generate Issue Based ChangeLog"; + public static readonly noCategoryChangeLog: string = "ChangeLog generated should be a flatlist of issues."; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/UtilityL0Tests.ts b/_generated/GitHubReleaseV1_Node16/Tests/UtilityL0Tests.ts new file mode 100644 index 000000000000..9ee3a7a7d368 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/UtilityL0Tests.ts @@ -0,0 +1,92 @@ +import { Utility } from "../operations/Utility"; +import { TestString } from "./TestStrings"; + +export class UtilityL0Tests { + + public static startTests() { + this.validateGetReleaseNote(); + this.validateNormalizeBranchName(); + this.validateIsTagMatching(); + this.validateParseHTTPHeaderLink(); + this.validateExtractRepositoryOwnerAndName(); + this.validateExtractRepoAndIssueId(); + this.validateGetFirstLine(); + } + + public static validateGetReleaseNote() { + let releaseNoteInput = "release_note_input"; + let changeLog = "change_log"; + + let releaseNote = Utility.getReleaseNote("input", null, releaseNoteInput, changeLog); + if (releaseNote === (releaseNoteInput + changeLog)) { + console.log(TestString.getReleaseNoteKeyword); + } + } + + public static validateNormalizeBranchName() { + let normalizedBranchName = ""; + + normalizedBranchName = Utility.normalizeBranchName("refs/tags/tagName"); + if (normalizedBranchName === "tagName") { + console.log(TestString.validBranchNameKeyword); + } + + normalizedBranchName = Utility.normalizeBranchName("refs/heads/tagName"); + if (!normalizedBranchName) { + console.log(TestString.invalidBranchNameKeyword); + } + } + + public static validateIsTagMatching() { + let tag = "v1.1"; + let tagPattern = "v1.*"; + if (Utility.isTagMatching(tag, tagPattern)) { + console.log(TestString.tagMatchingKeyword); + } + } + + public static validateParseHTTPHeaderLink() { + let parsedHttpHeaderLink = {}; + let headerLink = '; rel="next", ; rel="last"'; + let expectedParsedHeaderLink = { + "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + } + parsedHttpHeaderLink = Utility.parseHTTPHeaderLink(headerLink); + + if (JSON.stringify(parsedHttpHeaderLink) === JSON.stringify(expectedParsedHeaderLink)) { + console.log(TestString.parseHTTPHeaderLinkKeyword); + } + } + + public static validateExtractRepositoryOwnerAndName() { + let repoName = "owner_name/repo_name"; + let repoInfo = Utility.extractRepositoryOwnerAndName(repoName); + + if (repoInfo.owner === "owner_name" && repoInfo.name === "repo_name") { + console.log(TestString.extractRepositoryOwnerAndNameKeyword); + } + + } + + public static validateExtractRepoAndIssueId() { + let repoIssueId = "repo#26"; + let info = Utility.extractRepoAndIssueId(repoIssueId); + + if (info.repository === "repo" && info.issueId === "26") { + console.log(TestString.extractRepoAndIssueIdKeyword); + } + } + + public static validateGetFirstLine() { + let message = "Fixing issue #25.\n Description #23"; + let firstLine = Utility.getFirstLine(message); + + if (firstLine === "Fixing issue #25.") { + console.log(TestString.getFirstLineKeyword); + } + } + +} + +UtilityL0Tests.startTests(); \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/Tests/package-lock.json b/_generated/GitHubReleaseV1_Node16/Tests/package-lock.json new file mode 100644 index 000000000000..6bfd619fe2e3 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/package-lock.json @@ -0,0 +1,182 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/sinon": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz", + "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", + "dev": true + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sinon": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } + } +} diff --git a/_generated/GitHubReleaseV1_Node16/Tests/package.json b/_generated/GitHubReleaseV1_Node16/Tests/package.json new file mode 100644 index 000000000000..d56d0b905d13 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/Tests/package.json @@ -0,0 +1,10 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "devDependencies": { + "@types/sinon": "^4.3.1", + "sinon": "^4.5.0", + "@types/mocha": "2.2.48" + } +} diff --git a/_generated/GitHubReleaseV1_Node16/ThirdPartyNotices.txt b/_generated/GitHubReleaseV1_Node16/ThirdPartyNotices.txt new file mode 100644 index 000000000000..2f2f1cc1664a --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/ThirdPartyNotices.txt @@ -0,0 +1,668 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +GitHub Release Task incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. balanced-match (https://github.com/juliangruber/balanced-match) +2. brace-expansion (https://github.com/juliangruber/brace-expansion) +3. browserify-mime (git+https://github.com/broofa/node-mime.git) +4. concat-map (https://github.com/substack/node-concat-map) +5. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +6. inflight (https://github.com/npm/inflight) +7. inherits (https://github.com/isaacs/inherits) +8. glob (git://github.com/isaacs/node-glob.git) +9. minimatch (https://github.com/isaacs/minimatch) +10. Mockery (https://github.com/mfncooper/mockery) +11. once (https://github.com/isaacs/once) +12. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +13. q (https://github.com/kriskowal/q) +14. semver (https://github.com/npm/node-semver/) +15. semver-compare (https://github.com/substack/semver-compare) +16. ShellJS (https://github.com/shelljs/shelljs) +17. tunnel (https://github.com/koichik/node-tunnel) +18. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +19. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +20. uuid (git+https://github.com/kelektiv/node-uuid.git) +21. vso-node-api (https://github.com/Microsoft/vsts-node-api) +22. azure-pipelines-task-lib (https://github.com/Microsoft/azure-pipelines-task-lib) +23. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +24. wrappy (https://github.com/npm/wrappy) +25. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +26. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF browserify-mime (node-mime) NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF azure-pipelines-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/icon.png b/_generated/GitHubReleaseV1_Node16/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..96e6b70c499d6b624878201c3f81424b0982054c GIT binary patch literal 1094 zcmV-M1iAZ(P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00Xv3L_t(oN3B;)Xj4HDer*%{10~7+yjQ9b ztsqtuR76x1l|m6z5LB=Q5f!~u58k{K(Szv0qn>(E6#M}Z6qFu3C{(3hyi`=YNwq)z zRZB^e`pv#+OkOt6*Svf%kheSY&F<{X&c>MywAM>iMs+Hou0ZZ;A)jiYo+zpA;QKP> z4!f?KW%c^N^St@4ltH(zlA8C2=xL-l4dt{q|@nzIO_o` zK^=s+$p^cuKmt2|SY{;DFP!5ren&~ZpinXn6Gz#&Q1{`h(RWz_B;3g|MF`IBIHnSA zCbPkmU9_CYV}}hv0yr8fRFPwALQFXSv(I;V8s(S8o~ClK@AGLxu75NjRnXd%ftuR&F=mVN29qDD*VVH zgvYWnsot<*-9VeN_{q@%f`fErzGJ(3p@C}O=F6dM4-R5%By#tP0J?O*`P<@W+`(=K zgA^dOzhJ=-J_ivvu65*Mkdz?9H2JhaM z=n&cMppmS=hqc{e5nrjvFxRX>S2=N5xuu$HPBkw!iuia|oHR!wZ^G~okL3`hUY*t( zqdYRHx0ucd4%ki=d4nQkADft!c3{wSEG%Y#dO7uMeE%pKm^nEL;#)AWT~bMqK7ii0 zQkyE0M<3Y1b_Pu#?kg$?_1?S2+ zQG)Ltlwz9_;vA0SE#G91!`^hX=o$NJ0?vecPHa^!<`?LgR1K+(?!Ax9C3vv9taB1Fjrm8wlDo6XK;M>d(#LLXz* zaA1}A|5tf+l8_Tts{mDr%?9!l`EiidqJgerB+Kg{Sy(CB7J!YsjPtTeP}opjA3;XP zQV3fBHLw{ysw7m_Q4A;i*?34I2ihT>{9P5$>B152!q22X5(dZl3#0r-xPpe0SpWb4 M07*qoM6N<$f*rl~Jpcdz literal 0 HcmV?d00001 diff --git a/_generated/GitHubReleaseV1_Node16/icon.svg b/_generated/GitHubReleaseV1_Node16/icon.svg new file mode 100644 index 000000000000..f9aea8bf7966 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/_generated/GitHubReleaseV1_Node16/main.ts b/_generated/GitHubReleaseV1_Node16/main.ts new file mode 100644 index 000000000000..05d9a819d7ed --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/main.ts @@ -0,0 +1,133 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import { Action } from "./operations/Action"; +import { Utility, ActionType, Delimiters, ChangeLogStartCommit, ChangeLogType } from './operations/Utility'; +import { Inputs} from "./operations/Constants"; +import { ChangeLog } from "./operations/ChangeLog"; +import { Helper } from "./operations/Helper"; + +class Main { + + public static async run(): Promise { + try { + var taskManifestPath = path.join(__dirname, "task.json"); + tl.debug("Setting resource path to " + taskManifestPath); + tl.setResourcePath(taskManifestPath); + + let actions = new Action(); + let helper = new Helper() + + // Get basic task inputs + const githubEndpoint = tl.getInput(Inputs.gitHubConnection, true); + const githubEndpointToken = Utility.getGithubEndPointToken(githubEndpoint); + + const repositoryName = tl.getInput(Inputs.repositoryName, true); + + const action = tl.getInput(Inputs.action, true).toLowerCase(); + Utility.validateAction(action); + + let tagSource = tl.getInput(Inputs.tagSource); + Utility.validateTagSource(tagSource, action); + + let tag = tl.getInput(Inputs.tag); + Utility.validateTag(tag, tagSource, action); + + if (action === ActionType.delete) { + helper.publishTelemetry(); + await actions.deleteReleaseAction(githubEndpointToken, repositoryName, tag); + } + else { + // Get task inputs specific to create and edit release + const target = tl.getInput(Inputs.target, true); + const releaseTitle = tl.getInput(Inputs.title) || undefined; + + const isPrerelease = tl.getBoolInput(Inputs.isPreRelease) || false; + const isDraft = tl.getBoolInput(Inputs.isDraft) || false; + const githubReleaseAssetInputPatterns = tl.getDelimitedInput(Inputs.assets, Delimiters.newLine); + + if (action === ActionType.create) { + //Get task inputs specific to create release + const tagPattern = tl.getInput(Inputs.tagPattern) || undefined; + + // Get tag to create release if tag source is gitTag/userSpecifiedTag + if (Utility.isTagSourceAuto(tagSource)) { + tag = await helper.getTagForCommitTarget(githubEndpointToken, repositoryName, target, tagPattern); + } + + if (!!tag) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + else { + // If no tag found, then give warning. + // Doing this because commits without associated tag will fail continuosly if we throw error. + // Other option is to have some task condition, which user can specify in task. + tl.warning(tl.loc("NoTagFound")); + tl.debug("No tag found"); // for purpose of L0 test only. + } + } + else if (action === ActionType.edit) { + helper.publishTelemetry(); + const releaseNote: string = await this._getReleaseNote(githubEndpointToken, repositoryName, target); + // Get the release id of the release to edit. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: any = await helper.getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + // If a release is found, then edit it. + // Else create a new release. + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await actions.editReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns, releaseId); + } + else { + tl.warning(tl.loc("NoReleaseFoundToEditCreateRelease", tag)); + await actions.createReleaseAction(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, githubReleaseAssetInputPatterns); + } + } + } + + tl.setResult(tl.TaskResult.Succeeded, ""); + } + catch(error) { + tl.setResult(tl.TaskResult.Failed, error); + } + } + + private static async _getReleaseNote(githubEndpointToken: string, repositoryName: string, target: string): Promise { + const releaseNotesSource = tl.getInput(Inputs.releaseNotesSource, true); + Utility.validateReleaseNotesSource(releaseNotesSource); + const releaseNotesFile = tl.getPathInput(Inputs.releaseNotesFilePath, false, true); + const releaseNoteInput = tl.getInput(Inputs.releaseNotesInline); + const showChangeLog: boolean = tl.getBoolInput(Inputs.addChangeLog); + let changeLog: string = ""; + if (showChangeLog){ + let changeLogLabels: any = null; + const changeLogCompareToRelease = tl.getInput(Inputs.changeLogCompareToRelease); + Utility.validateStartCommitSpecification(changeLogCompareToRelease); + const changeLogType = tl.getInput(Inputs.changeLogType); + Utility.validateChangeLogType(changeLogType); + if (changeLogType === ChangeLogType.issueBased){ + const changeLogLabelsInput = tl.getInput(Inputs.changeLogLabels); + try{ + changeLogLabels = JSON.parse(changeLogLabelsInput); + } + catch(error){ + changeLogLabels = []; + tl.warning(tl.loc("LabelsSyntaxError")); + } + } + + const changeLogCompareToReleaseTag = tl.getInput(Inputs.changeLogCompareToReleaseTag) || undefined; + // Generate the change log + // Get change log for top 250 commits only + changeLog = await new ChangeLog().getChangeLog(githubEndpointToken, repositoryName, target, 250, ChangeLogStartCommit[changeLogCompareToRelease], changeLogType, changeLogCompareToReleaseTag, changeLogLabels); + } + // Append change log to release note + const releaseNote: string = Utility.getReleaseNote(releaseNotesSource, releaseNotesFile, releaseNoteInput, changeLog) || undefined; + + return releaseNote; + } +} + +Main.run(); diff --git a/_generated/GitHubReleaseV1_Node16/make.json b/_generated/GitHubReleaseV1_Node16/make.json new file mode 100644 index 000000000000..3df4ca171399 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/Action.ts b/_generated/GitHubReleaseV1_Node16/operations/Action.ts new file mode 100644 index 000000000000..f4d849317b75 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/Action.ts @@ -0,0 +1,255 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import fs = require('fs'); +import { WebResponse } from "./webClient"; +import { Release } from "./Release"; +import { Utility, AssetUploadMode, GitHubAttributes } from "./Utility"; +import { Inputs } from "./Constants"; +import { Helper } from "./Helper"; + +export class Action { + + /** + * Creating a release and uploading assets are 2 different process. First we create a release and when it is successful, we upload assets to it. + * But in our scenario, we assume it to be a single process, means if upload assets step fail then we say release is in dirty state and we would want it to be deleted as it is without assets yet. + * So, we delete the created release as assets are not uploaded to it. And will want user to run the task again to create release with assets. + * The delete release step is only reachable if user has specified any assets to upload and the upload step failed. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + */ + public async createReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[]): Promise { + console.log(tl.loc("CreatingRelease", tag)); + + // Create release + let response: WebResponse = await new Release().createRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease); + tl.debug("Create release response: " + JSON.stringify(response)); + + if (response.statusCode === 201) { + try { + // Upload the assets + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, [], false); + console.log(tl.loc("CreateReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + catch (error) { + console.log(tl.loc("CreateReleaseFailed")); + + try { + // If upload asets fail, then delete the release + let releaseId: string = response.body[GitHubAttributes.id]; + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + catch (error) { + tl.debug("Failed to delete the release which is in dirty state currently. Assets were expected to be uploaded but it failed. Delete the release manually.") + } + + throw error; + } + } + else if (response.statusCode === 422 && response.body.errors && response.body.errors.length > 0 && response.body.errors[0].code === this._alreadyExistErrorCode) { + tl.error(tl.loc("ReleaseAlreadyExists", tag)); + throw new Error(response.body[GitHubAttributes.message]); + } + else { + tl.error(tl.loc("CreateReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Edits an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param releaseTitle + * @param releaseNote + * @param isDraft + * @param isPrerelease + * @param githubReleaseAssetInputPatterns + * @param releaseId + */ + public async editReleaseAction(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, githubReleaseAssetInputPatterns: string[], releaseId: string): Promise { + console.log(tl.loc("EditingRelease", tag)); + + let response: WebResponse = await new Release().editRelease(githubEndpointToken, repositoryName, target, tag, releaseTitle, releaseNote, isDraft, isPrerelease, releaseId); + tl.debug("Edit release response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + const uploadUrl: string = response.body[GitHubAttributes.uploadUrl]; + await this._uploadAssets(githubEndpointToken, repositoryName, githubReleaseAssetInputPatterns, uploadUrl, response.body[GitHubAttributes.assets], true); + console.log(tl.loc("EditReleaseSuccess", response.body[GitHubAttributes.htmlUrl])); + } + else { + tl.error(tl.loc("EditReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Deletes a release if it exists. + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async deleteReleaseAction(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + // Get the release id of the release with corresponding tag to delete. + console.log(tl.loc("FetchReleaseForTag", tag)); + let releaseId: string = await new Helper().getReleaseIdForTag(githubEndpointToken, repositoryName, tag); + + if (!!releaseId) { + console.log(tl.loc("FetchReleaseForTagSuccess", tag)); + await this._deleteRelease(githubEndpointToken, repositoryName, releaseId, tag); + } + else { + throw new Error(tl.loc("NoReleaseFoundToDelete", tag)); + } + } + + /** + * Deletes an existing release. + * @param githubEndpointToken + * @param repositoryName + * @param releaseId + * @param tag + */ + private async _deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string, tag: string): Promise { + console.log(tl.loc("DeletingRelease", tag)); + let response: WebResponse = await new Release().deleteRelease(githubEndpointToken, repositoryName, releaseId); + tl.debug("Delete release response: " + JSON.stringify(response)); + + if (response.statusCode === 204) { + console.log(tl.loc("DeleteReleaseSuccess")); + } + else { + tl.error(tl.loc("DeleteReleaseError")); + throw new Error(response.body[GitHubAttributes.message]); + } + } + + /** + * Upload assets to the release. + * @param githubEndpointToken + * @param repositoryName + * @param githubReleaseAssetInputPatterns + * @param uploadUrl + * @param existingAssets + */ + private async _uploadAssets(githubEndpointToken: string, repositoryName: string, githubReleaseAssetInputPatterns: string[], uploadUrl: string, existingAssets: any[], editMode: boolean): Promise { + const assetUploadMode = tl.getInput(Inputs.assetUploadMode); + Utility.validateAssetUploadMode(assetUploadMode); + + // Delete all assets in case of edit release before uploading new assets. + if (editMode && !!assetUploadMode && assetUploadMode === AssetUploadMode.delete) { + console.log(tl.loc("DeleteAllExistingAssets")); + await this._deleteAssets(githubEndpointToken, repositoryName, existingAssets); + } + + if (githubReleaseAssetInputPatterns && githubReleaseAssetInputPatterns.length > 0) { + console.log(tl.loc("UploadingAssets")); + } + else { + console.log(tl.loc("NoAssetFoundToUpload")); + return; + } + + for (let pattern of (githubReleaseAssetInputPatterns || [])) { + await this._uploadAssetsForGivenPattern(githubEndpointToken, repositoryName, uploadUrl, existingAssets, pattern, assetUploadMode); + } + + console.log(tl.loc("AllAssetsUploadedSuccessfully")); + } + + private async _uploadAssetsForGivenPattern(githubEndpointToken: string, repositoryName: string, uploadUrl: string, existingAssets: any[], pattern: string, assetUploadMode: string): Promise { + console.log(tl.loc("SearchingFileMatchingPattern", pattern)); + + let assets: string[] = Utility.getUploadAssets(pattern) || []; + + if (Utility.isPatternADirectory(assets, pattern)) { + console.log(tl.loc("PatternIsADirectory", pattern)); + return; + } + + assets = assets.filter(asset => Utility.isFile(asset)); + + if (assets.length === 0) { + console.log(tl.loc("NoFileFoundMatchingPattern", pattern)); + return; + } + + Utility.validateUploadAssets(assets); + + for (let index = 0; index < assets.length; index++) { + const asset = assets[index]; + console.log(tl.loc("UploadingAsset", asset)); + + let uploadResponse = await new Release().uploadReleaseAsset(githubEndpointToken, asset, uploadUrl); + tl.debug("Upload asset response: " + JSON.stringify(uploadResponse)); + + if (uploadResponse.statusCode === 201) { + console.log(tl.loc("UploadAssetSuccess", asset)); + } + else if (uploadResponse.statusCode === 422 && uploadResponse.body.errors && uploadResponse.body.errors.length > 0 && uploadResponse.body.errors[0].code === this._alreadyExistErrorCode) { + + if (assetUploadMode === AssetUploadMode.replace) { + console.log(tl.loc("DuplicateAssetFound", asset)); + console.log(tl.loc("DeletingDuplicateAsset", asset)); + + const fileName = path.basename(asset); + + for (let existingAsset of existingAssets) { + if (fileName === existingAsset.name) { + await this._deleteAssets(githubEndpointToken, repositoryName, [existingAsset]); + index--; + break; + } + } + } + else { + console.log(tl.loc("SkipDuplicateAssetFound", asset)); + } + } + else { + tl.error(tl.loc("UploadAssetError")) + throw new Error(uploadResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Delete assets. + * @param githubEndpointToken + * @param repositoryName + * @param assets + */ + private async _deleteAssets(githubEndpointToken: string, repositoryName: string, assets: any[]): Promise { + if (assets && assets.length === 0) { + console.log(tl.loc("NoAssetFoundToDelete")); + return; + } + + for (let asset of assets) { + console.log(tl.loc("DeletingAsset", asset[GitHubAttributes.nameAttribute])); + let deleteAssetResponse = await new Release().deleteReleaseAsset(githubEndpointToken, repositoryName, asset.id); + tl.debug("Delete asset response: " + JSON.stringify(deleteAssetResponse)); + + if (deleteAssetResponse.statusCode === 204) { + console.log(tl.loc("AssetDeletedSuccessfully", asset[GitHubAttributes.nameAttribute])); + } + else { + tl.error(tl.loc("ErrorDeletingAsset", asset[GitHubAttributes.nameAttribute])); + throw new Error(deleteAssetResponse.body[GitHubAttributes.message]); + } + } + console.log(tl.loc("AssetsDeletedSuccessfully")); + } + + private readonly _alreadyExistErrorCode: string = "already_exists"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/ChangeLog.ts b/_generated/GitHubReleaseV1_Node16/operations/ChangeLog.ts new file mode 100644 index 000000000000..0608268b0737 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/ChangeLog.ts @@ -0,0 +1,701 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import { Utility, GitHubAttributes, IRepositoryIssueId, Delimiters, AzureDevOpsVariables, ChangeLogStartCommit, GitHubIssueState, ChangeLogType } from "./Utility"; +import { Release } from "./Release"; +import { Helper } from "./Helper"; + +export class ChangeLog { + + /** + * Returns the change log. + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param top + * @param compareWithRelease + * @param changeLogType + * @param changeLogCompareToReleaseTag + * @param changeLogLabels + */ + public async getChangeLog(githubEndpointToken: string, repositoryName: string, target: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogType: string, changeLogCompareToReleaseTag?: string, changeLogLabels?: any[]): Promise { + console.log(tl.loc("ComputingChangeLog")); + + let release = new Release(); + // We will be fetching changes between startCommitSha...endCommitSha. + // endCommitSha: It is the current commit + // startCommitSha: It is the commit for which previous release was created + // If no previous release found, then it will be the first commit. + + // Get the curent commit. + let endCommitSha: string = await new Helper().getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + //Get the start commit. + let startCommitSha: string = await this.getStartCommitSha(githubEndpointToken, repositoryName, endCommitSha, top,compareWithRelease, changeLogCompareToReleaseTag); + // Compare the diff between 2 commits. + tl.debug("start commit: "+ startCommitSha + "; end commit: "+ endCommitSha); + console.log(tl.loc("FetchCommitDiff")); + let commitsListResponse = await release.getCommitsList(githubEndpointToken, repositoryName, startCommitSha, endCommitSha); + tl.debug("Get commits list response: " + JSON.stringify(commitsListResponse)); + + if (commitsListResponse.statusCode === 200) { + // If end commit is older than start commit i.e. Rollback scenario, we will not show any change log. + if (commitsListResponse.body[GitHubAttributes.status] === GitHubAttributes.behind) { + tl.warning(tl.loc("CommitDiffBehind")); + return ""; + } + else { + let commits: any[] = commitsListResponse.body[GitHubAttributes.commits] || []; + + // If endCommit and startCommit are same then also we will not show any change log. + if (commits.length === 0) { + console.log(tl.loc("CommitDiffEqual")); + return ""; + } + + console.log(tl.loc("FetchCommitDiffSuccess")); + // Reversing commits as commits retrieved are in oldest first order + commits = commits.reverse(); + + // Only show changeLog for top X commits, where X = top + // Form the commitId to issues dictionary + let commitIdToMessageDictionary: { [key: string]: string } = this._getCommitIdToMessageDictionary(commits.length > top ? commits.slice(0, top) : commits); + tl.debug("commitIdToMessageDictionary: " + JSON.stringify(commitIdToMessageDictionary)); + + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = this._getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary, repositoryName); + tl.debug("commitIdToRepoIssueIdsDictionary: " + JSON.stringify(commitIdToRepoIssueIdsDictionary)); + if (changeLogType === ChangeLogType.commitBased) { + return this._getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary, commitIdToMessageDictionary, repositoryName); + } + else { + let issues = new Set([]); + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string) => { + if (issues.size >= top) { + return; + } + commitIdToRepoIssueIdsDictionary[commitId].forEach(repoIssueId => { + if (issues.size >= top) { + return; + } + let issueDetails = Utility.extractRepoAndIssueId(repoIssueId); + let issueId = Number(issueDetails.issueId); + if (!!issueId && issueDetails.repository === repositoryName) { + issues.add(issueId); + } + }); + }); + + if (!!changeLogLabels && !!changeLogLabels.length) { + return this._getIssueBasedChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken, changeLogLabels); + } + else { + return this._getAllIssuesChangeLog(Array.from(issues), repositoryName, release, githubEndpointToken); + } + } + } + } + else{ + tl.error(tl.loc("FetchCommitDiffError")); + throw new Error(commitsListResponse.body[GitHubAttributes.message]); + } + } + /** + * Generate issue based ChangeLog + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + * @param labels + */ + private async _getIssueBasedChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string, labels: any[]) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, true); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let index = 0; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + let labelsRankDictionary = this._getLabelsRankDictionary(labels); + tl.debug("labelsRankDictionary: " + JSON.stringify(labelsRankDictionary)); + let groupedIssuesDictionary = this._getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels); + tl.debug("Group wise issues : " + JSON.stringify(groupedIssuesDictionary)); + Object.keys(groupedIssuesDictionary).forEach((group: string) => { + if (groupedIssuesDictionary[group].length === 0) return; + //If the only category is the default cateogry, don't add the category title. + if (index > 0 || group!= this._defaultGroup){ + let changeLogGroupTitle = util.format(this._groupTitleFormat, group); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogGroupTitle + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogGroupTitle + Delimiters.newLine; + index++; + } + } + groupedIssuesDictionary[group].forEach(issueDetails => { + let changeLogPerIssue: string = this._getChangeLogPerIssue(issueDetails.id, issueDetails.issue); + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + index++; + } + }); + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate all issue based ChangeLog without labels + * @param issues + * @param repositoryName + * @param release + * @param githubEndpointToken + */ + private async _getAllIssuesChangeLog(issues: number[], repositoryName: string, release: Release, githubEndpointToken: string) { + + if (issues.length === 0) { + console.log(tl.loc("NoIssuesLinkedError")); + return ""; + } + + let issuesListResponse = await release.getIssuesList(githubEndpointToken, repositoryName, issues, false); + if (issuesListResponse.statusCode === 200) { + if (!!issuesListResponse.body.errors) { + console.log(tl.loc("IssuesFetchError")); + tl.warning(JSON.stringify(issuesListResponse.body.errors)); + return ""; + } + else { + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + let issuesList = issuesListResponse.body.data.repository; + tl.debug("issuesListResponse: " + JSON.stringify(issuesList)); + Object.keys(issuesList).forEach((key: string, index: number) => { + let changeLogPerIssue = this._getChangeLogPerIssue(key.substr(1), issuesList[key].title); + // See more functionality + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerIssue + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerIssue + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + } + else { + console.log(tl.loc("IssuesFetchError")); + tl.warning(issuesListResponse.body[GitHubAttributes.message]); + return ""; + } + } + /** + * Generate commit based ChangeLog + * @param commitIdToRepoIssueIdsDictionary + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private async _getCommitBasedChangeLog(commitIdToRepoIssueIdsDictionary: { [key: string]: Set }, commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string){ + let changeLog: string = ""; + let topXChangeLog: string = ""; // where 'X' is the this._changeLogVisibleLimit. + let seeMoreChangeLog: string = ""; + // Evaluate change log + Object.keys(commitIdToRepoIssueIdsDictionary).forEach((commitId: string, index: number) => { + let changeLogPerCommit: string = this._getChangeLogPerCommit(commitId, commitIdToMessageDictionary[commitId], commitIdToRepoIssueIdsDictionary[commitId], repositoryName); + //See more functionality + // If changes are more than 10, then we will show See more button which will be collapsible. + // And under that seeMoreChangeLog will be shown + // topXChangeLog will be visible to user. + if (index >= this._changeLogVisibleLimit) { + seeMoreChangeLog = seeMoreChangeLog + changeLogPerCommit + Delimiters.newLine; + } + else { + topXChangeLog = topXChangeLog + changeLogPerCommit + Delimiters.newLine; + } + }); + changeLog = this._generateChangeLog(topXChangeLog, seeMoreChangeLog); + console.log(tl.loc("ComputingChangeLogSuccess")); + return changeLog; + } + /** + * Returns the start commit needed to compute ChangeLog. + * @param githubEndpointToken + * @param repositoryName + * @param endCommitSha + * @param top + * @param compareWithRelease + * @param changeLogCompareToReleaseTag + */ + + public async getStartCommitSha(githubEndpointToken: string, repositoryName: string, endCommitSha: string, top: number, compareWithRelease: ChangeLogStartCommit, changeLogCompareToReleaseTag?: string): Promise { + let release = new Release(); + let startCommitSha: string; + if (compareWithRelease === ChangeLogStartCommit.lastFullRelease) { + // Get the latest published release to compare the changes with. + console.log(tl.loc("FetchLatestPublishRelease")); + let latestReleaseResponse = await release.getLatestRelease(githubEndpointToken, repositoryName); + tl.debug("Get latest release response: " + JSON.stringify(latestReleaseResponse)); + // Get the start commit. + // Release has target_commitsh property but it can be branch name also. + // Hence if a release is present, then get the tag and find its corresponding commit. + // Else get the first commit. + if (latestReleaseResponse.statusCode !== 200 && latestReleaseResponse.statusCode !== 404) { + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(latestReleaseResponse.body[GitHubAttributes.message]); + } + else if (latestReleaseResponse.statusCode !== 404 && latestReleaseResponse.body && !!latestReleaseResponse.body[GitHubAttributes.tagName]) { + let latestReleaseTag: string = latestReleaseResponse.body[GitHubAttributes.tagName]; + tl.debug("latest release tag: " + latestReleaseTag); + + let latestReleaseUrl: string = latestReleaseResponse.body[GitHubAttributes.htmlUrl]; + console.log(tl.loc("FetchLatestPublishReleaseSuccess", latestReleaseUrl)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, latestReleaseTag); + } + else { + console.log(tl.loc("NoLatestPublishRelease")); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + + return startCommitSha; + } + + let comparer; + if (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) { + //Latest non-draft Release + console.log(tl.loc("FetchLatestNonDraftRelease")); + comparer = release => !release[GitHubAttributes.draft]; + } + else { + //Latest release with the given tag or matching the given regex. + console.log(tl.loc("FetchLastReleaseByTag", changeLogCompareToReleaseTag)); + comparer = release => !release[GitHubAttributes.draft] && Utility.isTagMatching(release[GitHubAttributes.tagName], changeLogCompareToReleaseTag); + + } + + let initialTag = await this.getLastReleaseTag(githubEndpointToken, repositoryName, comparer); + + //If no such release exists, get the start commit + //else get the commit for that tag. + if (!initialTag) { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("NoMatchingReleases")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("NoTagMatchingReleases", changeLogCompareToReleaseTag)); + console.log(tl.loc("FetchInitialCommit")); + startCommitSha = await this._getInitialCommit(githubEndpointToken, repositoryName, endCommitSha, top); + console.log(tl.loc("FetchInitialCommitSuccess", startCommitSha)); + } + else { + (compareWithRelease === ChangeLogStartCommit.lastNonDraftRelease) && console.log(tl.loc("FetchMatchingReleaseSuccess")); + (compareWithRelease === ChangeLogStartCommit.lastNonDraftReleaseByTag) && console.log(tl.loc("FetchTagMatchingReleaseSuccess", changeLogCompareToReleaseTag)); + startCommitSha = await this._getCommitForTag(githubEndpointToken, repositoryName, initialTag); + } + + return startCommitSha; + } + + /** + * Returns latest release satisfying the given comparer. + * @param githubEndpointToken + * @param repositoryName + * @param comparer + */ + public async getLastReleaseTag(githubEndpointToken: string, repositoryName: string, comparer:(release: any)=> boolean): Promise { + let release = new Release(); + + // Fetching all releases in the repository. Sorted in descending order according to 'created_at' attribute. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + let startRelease: any; + //404 is returned when there are no releases. + if (releasesResponse.statusCode !== 200 && releasesResponse.statusCode !== 404){ + tl.error(tl.loc("GetLatestReleaseError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + else if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + startRelease = (releasesResponse.body || []).find(comparer); + if (!!startRelease) { + return startRelease[GitHubAttributes.tagName]; + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + } + //If status code is 404 or there are no releases satisfying the constraints return null. + return null; + } + } + + /** + * Returns the commit for provided tag + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + private async _getCommitForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let filteredTag: any = await new Helper().filterTag(githubEndpointToken, repositoryName, tag, this._filterTagsByTagName); + + return filteredTag && filteredTag[GitHubAttributes.commit][GitHubAttributes.sha]; + } + + /** + * Returns a commit which is 'X' (top) commits older than the provided commit sha. + * @param githubEndpointToken + * @param repositoryName + * @param sha + */ + private async _getInitialCommit(githubEndpointToken: string, repositoryName: string, sha: string, top: number): Promise { + let release = new Release(); + + // No api available to get first commit directly. + // So, fetching all commits before the current commit sha. + // Returning last commit or 250th commit which ever is smaller. + let commitsForGivenShaResponse = await release.getCommitsBeforeGivenSha(githubEndpointToken, repositoryName, sha); + let links: { [key: string]: string } = {}; + let commits: any[] = []; + + while(true) { + tl.debug("Get initial commit response: " + JSON.stringify(commitsForGivenShaResponse)); + + if (commitsForGivenShaResponse.statusCode === 200) { + // Returned commits are in latest first order and first commit is the commit queried itself. + (commitsForGivenShaResponse.body || []).forEach(commit => { + commits.push(commit); + }); + + if (commits.length >= top) { + // Return 250th commit + return commits[top - 1][GitHubAttributes.sha]; + } + + links = Utility.parseHTTPHeaderLink(commitsForGivenShaResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + commitsForGivenShaResponse = paginatedResponse; + continue; + } + else { + // Return last commit. + return commits[commits.length - 1][GitHubAttributes.sha]; + } + } + else { + tl.error(tl.loc("FetchInitialCommitError")); + throw new Error(commitsForGivenShaResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns a dictionary of { commitId to commit message }. + * @param commits + */ + private _getCommitIdToMessageDictionary(commits: any[]): { [key: string]: string } { + let commitIdToMessageDictionary: { [key: string]: string } = {}; + + for (let commit of (commits || [])) { + commitIdToMessageDictionary[commit[GitHubAttributes.sha]] = commit[GitHubAttributes.commit][GitHubAttributes.message]; + } + + return commitIdToMessageDictionary; + } + + /** + * Returns a dictionary of { commitId to repoIssueIds }. + * @param commitIdToMessageDictionary + * @param repositoryName + */ + private _getCommitIdToRepoIssueIdsDictionary(commitIdToMessageDictionary: { [key: string]: string }, repositoryName: string): { [key: string]: Set } { + let commitIdToRepoIssueIdsDictionary: { [key: string]: Set } = {}; + + Object.keys(commitIdToMessageDictionary).forEach((commitId: string) => { + commitIdToRepoIssueIdsDictionary[commitId] = this._getRepoIssueIdFromCommitMessage(commitIdToMessageDictionary[commitId], repositoryName); + + }); + + return commitIdToRepoIssueIdsDictionary; + } + + /** + * Returns a dictionary of { key to displayname, rank }. + * Key is labelname#issuestate + * This dictionary is used to find the label with highest priority. + * @param labels + */ + private _getLabelsRankDictionary(labels: any[]){ + let labelsRankDictionary = {}; + for (let index = 0; index < labels.length; index++){ + if (!labels[index].label || !labels[index].displayName) continue; + let label = labels[index].label; + let issueState = labels[index].state || this._noStateSpecified; + let key = (label+ Delimiters.hash +issueState).toLowerCase(); + if (!labelsRankDictionary[key]){ + labelsRankDictionary[key] = {displayName: labels[index].displayName, rank: index}; + } + } + return labelsRankDictionary; + } + + /** + * Returns a dictionary of { groupname to issues }. + * This dictionary is used to find all the issues under a display name. + * @param labelsRankDictionary + * @param issuesList + */ + private _getGroupedIssuesDictionary(labelsRankDictionary, issuesList, labels){ + let labelsIssuesDictionary = {}; + labels.forEach(label => { + if (!label.displayName) return; + labelsIssuesDictionary[label.displayName] = []; + }); + labelsIssuesDictionary[this._defaultGroup] = []; + Object.keys(issuesList).forEach((issue: string) => { + let group: string = null; + let currentLabelRank: number = Number.MAX_SAFE_INTEGER; + let issueState = issuesList[issue].state; + //For Pull Requests, show only Merged PRs, Ignore Closed PRs + if (!!issuesList[issue].changedFiles){ + if(issueState.toLowerCase() === GitHubIssueState.merged.toLowerCase()){ + issueState = GitHubIssueState.closed; + } + else if (issueState.toLowerCase() === GitHubIssueState.closed.toLowerCase()){ + return; + } + } + issuesList[issue].labels.edges && issuesList[issue].labels.edges.forEach(labelDetails => { + let key = (labelDetails.node.name + Delimiters.hash + issueState).toLowerCase(); + if(!labelsRankDictionary[key]) { + key = (labelDetails.node.name + Delimiters.hash + this._noStateSpecified).toLowerCase(); + } + + if (labelsRankDictionary[key] && labelsRankDictionary[key].rank < currentLabelRank){ + group = labelsRankDictionary[key].displayName; + currentLabelRank = labelsRankDictionary[key].rank; + } + }); + if (currentLabelRank === Number.MAX_SAFE_INTEGER){ + group = this._defaultGroup; //Default category + } + labelsIssuesDictionary[group].push({"issue": issuesList[issue].title, "id": issue.substr(1)}); + }); + return labelsIssuesDictionary; + } + + /** + * Returns the log for a single issue. + * Log format: * #issueId: issueTitle + * @param issueId + * @param issueTitle + */ + private _getChangeLogPerIssue(issueId: number | string, issueTitle: string){ + return Delimiters.star + Delimiters.space + Delimiters.hash + issueId + Delimiters.colon + Delimiters.space + issueTitle; + } + + /** + * Filter tags by tag name. + * Returns tag object. + */ + private _filterTagsByTagName = (tagsList: any[], tagName: string): any[] => { + let filteredTags: any[] = []; + + (tagsList || []).forEach((tag: any) => { + if (tag[GitHubAttributes.nameAttribute] === tagName) { + filteredTags.push(tag); + } + }); + + return filteredTags; + } + + /** + * Returns a unique set of repository#issueId string for each issue mentioned in the commit. + * repository#issueId string is needed as issues can be of cross repository. + * @param message + * @param repositoryName + */ + private _getRepoIssueIdFromCommitMessage(message: string, repositoryName: string): Set { + let match = undefined; + let repoIssueIdSet: Set = new Set(); + + // regex.exec(message) will return one match at a time. + // Multiple execution will yield all matches. + // Returns undefined if no further match found. + // match is an array, where match[0] is the complete match + // and other match[i] gives the captured strings in order. + // In our regex, we have captured repository name and issueId resp. + while (match = this._issueRegex.exec(message)) { + tl.debug("match: " + match[0]); + tl.debug("match1: " + match[1]); + tl.debug("match2: " + match[2]); + tl.debug("repositoryName: " + repositoryName); + + // If no repository name found before an issue, then use user provided repository name to link it to issue + let repo: string = match[1] ? match[1] : repositoryName; + let issueId: string = match[2]; + + // Using # as separator as neither repoName nor issueId will have #. + let uniqueRepoIssueId: string = repo + Delimiters.hash + issueId; + tl.debug("uniqueRepoIssueId: " + uniqueRepoIssueId); + + // Message can contain same issue linked multiple times. + // Do not add an issue if its already added. + if (!repoIssueIdSet.has(uniqueRepoIssueId)) { + repoIssueIdSet.add(uniqueRepoIssueId); + } + } + + return repoIssueIdSet; + } + + /** + * Returns the log for a single commit. + * Log format: * commitId commitMessageTitle, [ #issueId1, #issueId2 ] + * @param commitId + * @param commitMessage + * @param repoIssueIdSet + * @param repositoryName + */ + private _getChangeLogPerCommit(commitId: string, commitMessage: string, repoIssueIdSet: Set, repositoryName: string): string { + // GitHub commit messages have description as well alongwith title. + // Parsing the commit title and showing to user. + let commitMessageFirstLine: string = Utility.getFirstLine(commitMessage); + // Log format without issues: * commitId commitMessageTitle + let log: string = Delimiters.star + Delimiters.space + commitId + Delimiters.space + commitMessageFirstLine; + let issuesText: string = ""; + + // Appending each issue mentioned in the commit message. + // Ignoring issue which is present in commit title, to avoid duplicates. + if (!!repoIssueIdSet && repoIssueIdSet.size > 0) { + + (repoIssueIdSet).forEach((repoIssueId: string) => { + // Extract repository information for issue as cross repository issues can also be present. + let repoIssueIdInfo: IRepositoryIssueId = Utility.extractRepoAndIssueId(repoIssueId); + let issueIdText: string = ""; + + // If issue belongs to cross repository, then prefix repository name to issueId so that it can be linked correctly in GitHub. + if (repoIssueIdInfo.repository !== repositoryName) { + issueIdText += repoIssueIdInfo.repository; + } + // # is required before issueId for referencing purpose in GitHub. + issueIdText = issueIdText + Delimiters.hash + repoIssueIdInfo.issueId; + + // If this issue is not present in commit title, then append to issues text. + if (!commitMessageFirstLine.includes(issueIdText)) { + if (!!issuesText) { + // Append comma after every issue + issuesText += Delimiters.comma; + } + issuesText = issuesText + Delimiters.space + issueIdText; + } + }); + } + + // If issues are present, then enclose it in brackets and append to log. + if (!!issuesText) { + log = log + Delimiters.openingBracketWithSpace + issuesText + Delimiters.closingBracketWithSpace; + } + + return log; + } + + private _getAutoGeneratedText(): string { + let autoGeneratedUrl: string = encodeURI(this._getAutoGeneratedUrl()); + + if (!!autoGeneratedUrl) { + return util.format(this._autoGeneratedTextFormat, autoGeneratedUrl); + } + + return ""; + } + + private _generateChangeLog(topXChangeLog: string, seeMoreChangeLog: string): string { + let changeLog: string = ""; + if (topXChangeLog) { + changeLog = util.format(this._changeLogTitleFormat, this._changeLogTitle) + topXChangeLog; + + if(!seeMoreChangeLog) { + changeLog = changeLog + Delimiters.newLine + this._getAutoGeneratedText(); + } + else { + changeLog = changeLog + util.format(this._seeMoreChangeLogFormat, this._seeMoreText, seeMoreChangeLog, this._getAutoGeneratedText()); + } + } + return changeLog; + } + + private _getAutoGeneratedUrl(): string { + let releaseUrl: string = tl.getVariable(AzureDevOpsVariables.releaseWebUrl); + + if (!!releaseUrl) { + tl.debug("release web url: " + releaseUrl); + return releaseUrl; + } + else { + let collectionUri: string = tl.getVariable(AzureDevOpsVariables.collectionUri); + + // Make sure collection uri does not end with slash + if (collectionUri.endsWith(Delimiters.slash)) { + collectionUri = collectionUri.slice(0, collectionUri.length - 1); + } + + let teamProject: string = tl.getVariable(AzureDevOpsVariables.teamProject); + let buildId: string = tl.getVariable(AzureDevOpsVariables.buildId); + + tl.debug("Build url: " + util.format(this._buildUrlFormat, collectionUri, teamProject, buildId)); + return util.format(this._buildUrlFormat, collectionUri, teamProject, buildId); + } + } + + // https://github.com/moby/moby/commit/df23a1e675c7e3cbad617374d85c48103541ee14?short_path=6206c94#diff-6206c94cde21ec0a5563c8369b71e609 + // Supported format for GitHub issues: #26 GH-26 repositoryName#26 repositoryNameGH-26, where GH is case in-sensitive. + private readonly _issueRegex = new RegExp("(?:^|[^A-Za-z0-9_]?)([a-z0-9_]+/[a-zA-Z0-9-_.]+)?(?:#|[G|g][H|h]-)([0-9]+)(?:[^A-Za-z_]|$)", "gm"); + private readonly _changeLogTitle: string = tl.loc("ChangeLogTitle"); + private readonly _seeMoreText: string = tl.loc("SeeMoreText"); + private readonly _noStateSpecified: string = "none"; + private readonly _defaultGroup: string = tl.loc("DefaultCategory"); + private readonly _changeLogVisibleLimit: number = 10; + private readonly _changeLogTitleFormat: string = "\n\n## %s:\n\n"; + private readonly _groupTitleFormat: string = "\n### %s:\n\n"; + private readonly _buildUrlFormat: string = "%s/%s/_build/results?buildId=%s&view=logs"; + private readonly _autoGeneratedTextFormat: string = "This list of changes was [auto generated](%s)."; + private readonly _seeMoreChangeLogFormat: string = "
%s\n\n%s\n%s
"; // For showing See more button if more than 10 commits message are to be shown to user. +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/Constants.ts b/_generated/GitHubReleaseV1_Node16/operations/Constants.ts new file mode 100644 index 000000000000..cbc21d3c713a --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/Constants.ts @@ -0,0 +1,24 @@ + +export class Inputs { + public static readonly action = "action"; + public static readonly repositoryName = "repositoryName"; + public static readonly tag = "tag"; + public static readonly tagSource = "tagSource"; + public static readonly target = "target"; + public static readonly title = "title"; + public static readonly isDraft = "isDraft"; + public static readonly isPreRelease = "isPreRelease"; + public static readonly gitHubConnection = "gitHubConnection"; + public static readonly assets = "assets"; + public static readonly assetUploadMode = "assetUploadMode"; + public static readonly releaseNotesSource = "releaseNotesSource"; + public static readonly releaseNotesInline = "releaseNotesInline"; + public static readonly releaseNotesFilePath = "releaseNotesFilePath"; + public static readonly addChangeLog = "addChangeLog"; + public static readonly changeLogLabels = "changeLogLabels"; + public static readonly deleteExistingAssets = "deleteExistingAssets"; + public static readonly tagPattern = "tagPattern"; + public static readonly changeLogCompareToRelease = "changeLogCompareToRelease"; + public static readonly changeLogCompareToReleaseTag = "changeLogCompareToReleaseTag"; + public static readonly changeLogType = "changeLogType"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/Helper.ts b/_generated/GitHubReleaseV1_Node16/operations/Helper.ts new file mode 100644 index 000000000000..fcaa3d38cabc --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/Helper.ts @@ -0,0 +1,283 @@ +import tl = require("azure-pipelines-task-lib/task"); +import * as telemetry from "azure-pipelines-tasks-utility-common/telemetry"; +import { Utility, GitHubAttributes, AzureDevOpsVariables, ActionType} from "./Utility"; +import { Inputs } from "./Constants"; +import { Release } from "./Release"; +import * as crypto from "crypto"; + +interface IRelease { + tagName: string; + id: number; +} + +interface ITelemetryData { + area: string; + action: string; + repository: string; + tagSource: string; + isDraft: boolean; + isPreRelease: boolean; + addChangeLog: boolean; +} + +export class Helper { + + /** + * Returns tag name to be used for creating a release. + * If tagPattern is specified, returns tag matching the given pattern + * If user has specified tag, then use it + * else if $(Build.SourceBranch) is referencing to a tag, then parse tag name and use it + * else fetch tag from the target specified by user + * if no tag found for that target commit, then return undefined + * else if more than 1 tag found, then throw error + * else return the found tag name + * @param githubEndpointToken + * @param repositoryName + * @param target + * @param tag + * @param tagPattern + */ + public async getTagForCommitTarget(githubEndpointToken: string, repositoryName: string, target: string, tagPattern: string = null): Promise { + console.log(tl.loc("FetchTagForTarget", target)); + let tag = undefined; + + let commit_sha: string = await this.getCommitShaFromTarget(githubEndpointToken, repositoryName, target); + tl.debug("commit sha for target: " + commit_sha); + let buildSourceVersion = tl.getVariable(AzureDevOpsVariables.buildSourceVersion); + + // If the buildSourceVersion and user specified target does not match, then prefer user specified target + if (commit_sha !== buildSourceVersion) { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + else { + let buildSourceBranch = tl.getVariable(AzureDevOpsVariables.buildSourceBranch); + let normalizedBranch = Utility.normalizeBranchName(buildSourceBranch); + + // Check if branch is referencing to tag, if yes, then parse tag from branch name e.g. refs/tags/v1.0.1 + // Else fetch tag from commit + if (!!normalizedBranch) { + tag = normalizedBranch; + if (!!tagPattern && !Utility.isTagMatching(tag, tagPattern)) { + tag = null; + } + } + else { + tag = await this._getTagForCommit(githubEndpointToken, repositoryName, commit_sha, tagPattern); + } + } + + if (!!tag) { + console.log(tl.loc("FetchTagForTargetSuccess", target)); + } + + return tag; + } + + /** + * Returns latest commit on the target if target is branch else returns target. + * Target can be branch as well e.g. 'master' and in this scenario we need to fetch commit associated to that branch + * @param githubEndpointToken + * @param repositoryName + * @param target + */ + public async getCommitShaFromTarget(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let commit_sha: string = undefined; + let response = await new Release().getBranch(githubEndpointToken, repositoryName, target); + tl.debug("Get branch response: " + JSON.stringify(response)); + + if (response.statusCode === 200) { + commit_sha = response.body[GitHubAttributes.commit][GitHubAttributes.sha]; + } + else if (response.statusCode === 404) { + commit_sha = target; + } + else { + tl.error(tl.loc("GithubApiFailError")); + throw new Error(response.body[GitHubAttributes.message]); + } + + return commit_sha; + } + + /** + * Returns releaseId associated with the tag. + * If 0 release found return undefined + * else if 1 release found return releaseId + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param tag + */ + public async getReleaseIdForTag(githubEndpointToken: string, repositoryName: string, tag: string): Promise { + let release = new Release(); + + // Fetching all releases in the repository. + let releasesResponse = await release.getReleases(githubEndpointToken, repositoryName); + let releasesWithGivenTag: IRelease[] = []; + let links: { [key: string]: string } = {}; + + // Fetching releases api call may end up in paginated results. + // Traversing all the pages and filtering all the releases with given tag. + while (true) { + tl.debug("Get releases response: " + JSON.stringify(releasesResponse)); + + if (releasesResponse.statusCode === 200) { + // Filter the releases fetched + (releasesResponse.body || []).forEach(release => { + tl.debug("release[GitHubAttributes.tagName]: " + release[GitHubAttributes.tagName] + " " + "tag: " + tag); + // Push release if tag matches + if (release[GitHubAttributes.tagName] === tag) { + releasesWithGivenTag.push({ + tagName: release[GitHubAttributes.tagName], + id: release[GitHubAttributes.id] + } as IRelease); + } + }); + + // Throw error in case of ambiguity as we do not know which release to pick for editing or deleting release. + if (releasesWithGivenTag.length >= 2) { + throw new Error(tl.loc("MultipleReleasesFoundError", tag)); + } + + links = Utility.parseHTTPHeaderLink(releasesResponse.headers[GitHubAttributes.link]); + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + releasesResponse = paginatedResponse; + continue; + } + else { + return releasesWithGivenTag.length === 0 ? null : releasesWithGivenTag[0].id; + } + } + else { + tl.error(tl.loc("GetReleasesError")); + throw new Error(releasesResponse.body[GitHubAttributes.message]); + } + } + } + + /** + * Returns tag object associated with the commit. + * If 0 tag found return undefined + * else if 1 tag found return tag object + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param filterValue + * @param filterTagsCallback Callback to filter the tags + */ + public async filterTag(githubEndpointToken: string, repositoryName: string, filterValue: string, filterTagsCallback: (tagsList: any[], filterValue: string) => any[]): Promise { + let release = new Release(); + + // Fetching the tags in the repository + let tagsResponse = await release.getTags(githubEndpointToken, repositoryName); + let links: { [key: string]: string } = {}; + let filteredTags: any[] = []; + + // Fetching tags api call may end up in paginated results. + // So, traversing pages one by one and throwing error if more than 1 tag found. + while (true) { + tl.debug("Get tags response: " + JSON.stringify(tagsResponse)); + + if (tagsResponse.statusCode === 200) { + // Parse header link and get links to different pages + links = Utility.parseHTTPHeaderLink(tagsResponse.headers[GitHubAttributes.link]); + + // Filter the tags returned in current page + let tags: any[] = filterTagsCallback(tagsResponse.body, filterValue); + + if (!!tags && tags.length > 0) { + // Push returned tags in filtered tags. + tags.forEach((tag: any) => { + filteredTags.push(tag); + }) + + // Throw error in case of ambiguity as we do not know which tag to pick for creating release. + if (filteredTags.length >= 2 ) { + throw new Error(tl.loc("MultipleTagFound", filterValue)); + } + } + + // Calling the next page if it exists + if (links && links[GitHubAttributes.next]) { + let paginatedResponse = await release.getPaginatedResult(githubEndpointToken, links[GitHubAttributes.next]); + tagsResponse = paginatedResponse; + continue; + } + else { + return filteredTags.length === 0 ? undefined : filteredTags[0]; + } + } + else{ + tl.error(tl.loc("GetTagsError")); + throw new Error(tagsResponse.body[GitHubAttributes.message]); + } + } + } + + public publishTelemetry(): void { + let telemetryData = {} as ITelemetryData; + + const releaseId: string = tl.getVariable(AzureDevOpsVariables.releaseId); + + telemetryData.area = !!releaseId ? "release" : "build"; + telemetryData.action = tl.getInput(Inputs.action, true).toLowerCase(); + let repositoryName = tl.getInput(Inputs.repositoryName, true); + telemetryData.repository = crypto.createHash('sha256').update(repositoryName).digest('hex'); + + if (telemetryData.action !== ActionType.delete) { + + if (telemetryData.action === ActionType.create) { + telemetryData.tagSource = tl.getInput(Inputs.tagSource); + } + + telemetryData.isDraft = tl.getBoolInput(Inputs.isDraft); + telemetryData.isPreRelease = tl.getBoolInput(Inputs.isPreRelease); + telemetryData.addChangeLog = tl.getBoolInput(Inputs.addChangeLog); + } + + telemetry.emitTelemetry("TaskHub", "GitHubRelease", telemetryData); + } + + /** + * Returns tag name associated with the commit. + * If tagPattern is specified returns tag name + * If 0 tag found return undefined + * else if 1 tag found return tag name + * else throw error + * @param githubEndpointToken + * @param repositoryName + * @param commit_sha + */ + private async _getTagForCommit(githubEndpointToken: string, repositoryName: string, commit_sha: string, tagPattern: string = null): Promise { + let filteredTag: any; + let filterTagsCallback = (tagsList: any[], commit_sha: string): any[] => { + tagsList = this._filterTagsByCommitSha(tagsList, commit_sha); + if (!tagPattern) { + return tagsList; + } + return tagsList.filter((tag: any) => Utility.isTagMatching(tag[GitHubAttributes.nameAttribute], tagPattern)); + } + + filteredTag = await this.filterTag(githubEndpointToken, repositoryName, commit_sha, filterTagsCallback); + + return filteredTag && filteredTag[GitHubAttributes.nameAttribute]; + } + + /** + * Returns an array of matched tags, filtering on basis of commit sha + */ + private _filterTagsByCommitSha = (tagsList: any[], commit_sha: string): any[] => { + let filteredTags: any[] = []; + + for (let tag of (tagsList || [])) { + if (tag[GitHubAttributes.commit][GitHubAttributes.sha] === commit_sha) { + filteredTags.push(tag); + } + } + + return filteredTags; + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/Release.ts b/_generated/GitHubReleaseV1_Node16/operations/Release.ts new file mode 100644 index 000000000000..7510be5205f4 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/Release.ts @@ -0,0 +1,259 @@ +import tl = require("azure-pipelines-task-lib/task"); +import util = require("util"); +import path = require("path"); +import fs = require('fs'); +import mime = require('browserify-mime'); +import { Utility } from "./Utility"; +import { WebRequest, sendRequest, WebResponse } from "./webClient"; + +export class Release { + + public async createRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._createReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "POST"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Create release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async editRelease(githubEndpointToken: string, repositoryName: string, target: string, tag: string, releaseTitle: string, releaseNote: string, isDraft: boolean, isPrerelease: boolean, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "PATCH"; + request.body = JSON.stringify({ + "tag_name": tag, + "target_commitish": target, + "name": releaseTitle, + "body": releaseNote, + "draft": isDraft, + "prerelease": isPrerelease + }); + request.headers = { + "Content-Type": "application/json", + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Edit release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteRelease(githubEndpointToken: string, repositoryName: string, releaseId: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._editOrDeleteReleaseApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, releaseId); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async deleteReleaseAsset(githubEndpointToken: string, repositoryName: string, asset_id: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._deleteReleaseAssetApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, asset_id); + request.method = "DELETE"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Delete release asset request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + + public async uploadReleaseAsset(githubEndpointToken: string, filePath: string, uploadUrl: string): Promise { + let fileName = path.basename(filePath); + tl.debug("Filename: " + fileName); + + let rd = fs.createReadStream(filePath); + var stats = fs.statSync(filePath); + + let request = new WebRequest(); + request.uri = util.format(this._uploadReleaseAssetApiUrlFormat, uploadUrl.split('{')[0], encodeURIComponent(fileName)); + request.method = "POST"; + request.headers = { + "Content-Type": mime.lookup(fileName), + 'Content-Length': stats.size, + 'Authorization': 'token ' + githubEndpointToken + }; + request.body = rd; + tl.debug("Upload release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getBranch(githubEndpointToken: string, repositoryName: string, target: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getBranchApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, target); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get branch request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getTags(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getTagsApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get tags request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getReleases(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get releases request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getLatestRelease(githubEndpointToken: string, repositoryName: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getLatestReleasesApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get latest release request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getPaginatedResult(githubEndpointToken: string, nextPageLink: string): Promise { + let request = new WebRequest(); + + request.uri = nextPageLink; + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get paginated request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsList(githubEndpointToken: string,repositoryName: string, startCommitSha: string, endCommitSha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsListApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, startCommitSha, endCommitSha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits list request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getCommitsBeforeGivenSha(githubEndpointToken: string,repositoryName: string, sha: string): Promise { + let request = new WebRequest(); + + request.uri = util.format(this._getCommitsBeforeGivenShaApiUrlFormat, Utility.getGitHubApiUrl(), repositoryName, sha); + request.method = "GET"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Get commits before given sha request: " + JSON.stringify(request)); + + return await sendRequest(request); + } + + public async getIssuesList(githubEndpointToken: string, repositoryName: string, issues: number[], includeLabels: boolean) { + let request = new WebRequest(); + request.uri = util.format(this._graphQLUrlFormat, Utility.getGitHubApiUrl()); + request.method = "POST"; + request.headers = { + 'Authorization': 'token ' + githubEndpointToken + }; + tl.debug("Fetching labels for issues: " + issues); + let issuesQuery = issues.map(issue => `_${issue}: issueOrPullRequest(number: ${issue}){ ...labelsForIssue ...labelsForPullRequest }`).join(", "); + let repositoryDetails = repositoryName.split("/"); + let labelsFragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let labelsFragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + changedFiles + labels(last: 10) { + edges { + node{ + name + } + } + } + }`; + let fragmentForIssue = `fragment labelsForIssue on Issue{ + title + state + }`; + let fragmentForPullRequest = `fragment labelsForPullRequest on PullRequest{ + title + state + }`; + + let query = `query{ + repository(owner: "${repositoryDetails[0]}", name: "${repositoryDetails[1]}"){ + ${issuesQuery} + } + } + ${includeLabels ? labelsFragmentForIssue : fragmentForIssue} + ${includeLabels ? labelsFragmentForPullRequest : fragmentForPullRequest}`; + request.body = JSON.stringify({ query }); + tl.debug("Get issues along with labels: " + JSON.stringify(request)); + return await sendRequest(request); + } + + private readonly _createReleaseApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _editOrDeleteReleaseApiUrlFormat: string = "%s/repos/%s/releases/%s"; + private readonly _deleteReleaseAssetApiUrlFormat: string = "%s/repos/%s/releases/assets/%s"; + private readonly _uploadReleaseAssetApiUrlFormat: string = "%s?name=%s"; + private readonly _getReleasesApiUrlFormat: string = "%s/repos/%s/releases"; + private readonly _getLatestReleasesApiUrlFormat: string = "%s/repos/%s/releases/latest"; + private readonly _getBranchApiUrlFormat: string = "%s/repos/%s/branches/%s"; + private readonly _getTagsApiUrlFormat: string = "%s/repos/%s/tags"; + private readonly _getCommitsListApiUrlFormat: string = "%s/repos/%s/compare/%s...%s"; + private readonly _getCommitsBeforeGivenShaApiUrlFormat: string = "%s/repos/%s/commits?sha=%s&per_page=100"; + private readonly _graphQLUrlFormat: string = "%s/graphql"; +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/operations/Utility.ts b/_generated/GitHubReleaseV1_Node16/operations/Utility.ts new file mode 100644 index 000000000000..96a1d317b5f4 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/Utility.ts @@ -0,0 +1,364 @@ +import tl = require("azure-pipelines-task-lib/task"); +import path = require("path"); +import glob = require('glob'); +import fs = require('fs'); + +export class Utility { + + public static getGithubEndPointToken(githubEndpoint: string): string { + const githubEndpointObject = tl.getEndpointAuthorization(githubEndpoint, false); + let githubEndpointToken: string = null; + + if (!!githubEndpointObject) { + tl.debug("Endpoint scheme: " + githubEndpointObject.scheme); + + if (githubEndpointObject.scheme === 'PersonalAccessToken') { + githubEndpointToken = githubEndpointObject.parameters.accessToken + } else if (githubEndpointObject.scheme === 'OAuth'){ + // scheme: 'OAuth' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme === 'Token'){ + // scheme: 'Token' + githubEndpointToken = githubEndpointObject.parameters.AccessToken + } else if (githubEndpointObject.scheme) { + throw new Error(tl.loc("InvalidEndpointAuthScheme", githubEndpointObject.scheme)); + } + } + + if (!githubEndpointToken) { + throw new Error(tl.loc("InvalidGitHubEndpoint", githubEndpoint)); + } + + return githubEndpointToken; + } + + public static getUploadAssets(pattern: string): string[] { + let githubReleaseAssets: Set = new Set(); + + /** Check for one or multiples files into array + * Accept wildcards to look for files + */ + let filePaths: string[] = glob.sync(pattern); + + (filePaths || []).forEach((filePath) => { + if (!githubReleaseAssets.has(filePath)) { + githubReleaseAssets.add(filePath) + } + }) + + return Array.from(githubReleaseAssets); + } + + public static isFile(asset: string): boolean { + return fs.lstatSync(path.resolve(asset)).isFile(); + } + + public static isPatternADirectory(assets: string[], pattern: string): boolean { + if (assets && assets.length === 1 && pattern) { + if ((path.resolve(assets[0]) === path.resolve(pattern)) && tl.exist(path.resolve(pattern)) && tl.stats(path.resolve(pattern)).isDirectory()) { + tl.debug("Pattern is a directory " + pattern); + return true; + } + } + return false; + } + + public static validateUploadAssets(assets: string[]): void { + if (assets && assets.length > 0) { + try { + assets.forEach(function (asset) { + fs.accessSync(path.resolve(asset)); + }) + } catch (err) { + tl.warning(tl.loc("MissingAssetError", err.path)); + } + } + } + + public static getReleaseNote(releaseNotesSource: string, releaseNotesFile: any, releaseNoteInput: string, changeLog: string): string { + let releaseNote: string = ""; + + if (releaseNotesSource === ReleaseNotesSelectionMode.filePath) { + + if (fs.lstatSync(path.resolve(releaseNotesFile)).isDirectory()) { + console.log(tl.loc("ReleaseNotesFileIsDirectoryError", releaseNotesFile)); + } + else { + releaseNote = fs.readFileSync(releaseNotesFile).toString(); + } + } + else { + releaseNote = releaseNoteInput; + } + tl.debug("ReleaseNote:\n" + releaseNote); + + if (!releaseNote) { + releaseNote = ""; + } + + // Append commits and issues to release note. + if (changeLog){ + releaseNote = releaseNote + changeLog; + } + + return releaseNote; + } + + public static getGitHubApiUrl(): string { + let githubApiUrlInput: string = undefined; // Todo: mdakbar: get GHE url + return githubApiUrlInput ? githubApiUrlInput : this._githubApiUrl; // url without slash at end + } + + public static normalizeBranchName(branchName: string): string { + if (!!branchName && branchName.startsWith(this._tagRef)) { + return branchName.substring(this._tagRef.length); + } + return undefined; + } + + /** + * Returns the parsed HTTP header link if it exists. + * E.g. Link: '; rel="next", ; rel="last"' + * Returned object would be like { + * "next": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=2", + * "last": "https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34" + * } + * @param headerLink + */ + public static parseHTTPHeaderLink(headerLink: string): { [key: string]: string } { + if (!headerLink) { + // No paginated results found + return null; + } + + // Split pages by comma as pages are separated by comma + let pages = headerLink.split(Delimiters.comma); + let links: { [key: string]: string } = {}; + + // Parse each page to get link and rel + (pages || []).forEach((page) => { + let section: string[] = page.split(Delimiters.semiColon); + + // Atleast link and rel should be present else header link format has changed + if (section.length < 2) { + throw new Error("section could not be split on ';'"); + } + + // Reference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n + // Get link + let urlMatch = section[0].trim().match(this._githubPaginatedLinkRegex); // If it didn't match, it will return null, else it will return match at first position + let relMatch = null; + + // Get rel, there can be other attributes like rel. So for loop is needed to filter rel attribute. + for (let i = 1; i < section.length; i++) { + relMatch = section[i].trim().match(this._githubPaginatedRelRegex); // If it didn't match, it will return null, else it will return match at first position + + // Break as soon as rel attribute is found + if (!!relMatch) { + break; + } + } + + // If both link and rel are found, append it to dictionary + if (urlMatch && relMatch) { + links[relMatch[1]] = urlMatch[1]; + } + + }) + + tl.debug("Parsed link: " + JSON.stringify(links)); + return links; + } + + public static extractRepositoryOwnerAndName(repositoryName: string): IGitHubRepositoryInfo { + let repositoryInfo = repositoryName.split(Delimiters.slash); + + return { + owner: repositoryInfo[0], + name: repositoryInfo[1] + } + } + + public static extractRepoAndIssueId(repoIssueId: string): IRepositoryIssueId { + let repoIssueIdInfo: string[] = repoIssueId.split(Delimiters.hash); + let repo: string = repoIssueIdInfo[0]; + let issueId: string = repoIssueIdInfo[1]; + + return { + repository: repo, + issueId: issueId + } + } + + public static getFirstLine(commitMessage: string): string { + commitMessage = (commitMessage || "").trim(); + const match = commitMessage.match(this._onlyFirstLine); + + tl.debug("Commit message: " + commitMessage); + tl.debug("match: " + match); + + return match[0]; + } + + public static isTagSourceAuto(tagSource: string) { + return (tagSource === TagSelectionMode.gitTag); + } + + public static validateTagSource(tagSource: string, action: string) { + if (action === ActionType.create && tagSource !== TagSelectionMode.gitTag && tagSource !== TagSelectionMode.userSpecifiedTag) { + throw new Error(tl.loc("InvalidTagSource", tagSource)); + } + } + + public static validateAction(action: string) { + if (action !== ActionType.create && action !== ActionType.edit && action !== ActionType.delete) { + tl.debug("Invalid action input"); // for purpose of L0 test only. + throw new Error(tl.loc("InvalidActionSet", action)); + } + } + + public static validateReleaseNotesSource(releaseNotesSource: string) { + if (releaseNotesSource !== ReleaseNotesSelectionMode.filePath && releaseNotesSource !== ReleaseNotesSelectionMode.inline) { + throw new Error(tl.loc("InvalidReleaseNotesSource", releaseNotesSource)); + } + } + + public static validateStartCommitSpecification(compareWith: string) { + if (compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastFullRelease.toUpperCase() + && compareWith.toUpperCase() !== changeLogStartCommitSpecification.lastNonDraftRelease.toUpperCase() + && compareWith.toUpperCase() != changeLogStartCommitSpecification.lastNonDraftReleaseByTag.toUpperCase()) { + throw new Error(tl.loc("InvalidCompareWithAttribute", compareWith)); + } + } + + public static validateChangeLogType(changeLogType: string) { + if (changeLogType.toUpperCase() !== ChangeLogType.issueBased.toUpperCase() + && changeLogType.toUpperCase() !== ChangeLogType.commitBased.toUpperCase() ) { + throw new Error(tl.loc("InvalidChangeLogTypeAttribute", changeLogType)); + } + } + public static validateAssetUploadMode(assetUploadMode: string) { + if (assetUploadMode !== AssetUploadMode.delete && assetUploadMode !== AssetUploadMode.replace) { + throw new Error(tl.loc("InvalidAssetUploadMode", assetUploadMode)); + } + } + + public static validateTag(tag: string, tagSource: string, action: string) { + if (!tag) { + if (action === ActionType.edit || action === ActionType.delete) { + throw new Error(tl.loc("TagRequiredEditDeleteAction", action)); + } + else if (action === ActionType.create && !this.isTagSourceAuto(tagSource)) { + throw new Error(tl.loc("TagRequiredCreateAction")); + } + } + + } + + public static isTagMatching(tag: string, tagPattern: string): boolean { + let tagPatternRegex = new RegExp("^" + tagPattern + "$"); + return tagPatternRegex.test(tag); + } + + private static readonly _onlyFirstLine = new RegExp("^.*$", "m"); + private static readonly _githubPaginatedLinkRegex = new RegExp("^<(.*)>$"); + private static readonly _githubPaginatedRelRegex = new RegExp('^rel="(.*)"$'); + private static readonly _tagRef: string = "refs/tags/"; + private static readonly _githubApiUrl: string = "https://api.github.com"; // url without slash at end +} + +export class TagSelectionMode { + public static readonly gitTag: string = "gitTag"; + public static readonly userSpecifiedTag: string = "userSpecifiedTag"; +} + +export class AssetUploadMode { + public static readonly delete = "delete"; + public static readonly replace = "replace"; +} + +export class changeLogStartCommitSpecification { + public static readonly lastFullRelease = "lastFullRelease"; + public static readonly lastNonDraftRelease = "lastNonDraftRelease"; + public static readonly lastNonDraftReleaseByTag = "lastNonDraftReleaseByTag"; +} + +export enum ChangeLogStartCommit{ + lastFullRelease = 0, + lastNonDraftRelease, + lastNonDraftReleaseByTag +} + +export class ChangeLogType{ + public static readonly issueBased = "issueBased"; + public static readonly commitBased = "commitBased"; +} +class ReleaseNotesSelectionMode { + public static readonly inline = "inline"; + public static readonly filePath = "filePath"; +} + +export class GitHubIssueState{ + public static readonly closed = "CLOSED"; + public static readonly merged = "MERGED"; +} + +export class GitHubAttributes { + public static readonly id: string = "id"; + public static readonly nameAttribute: string = "name"; + public static readonly tagName: string = "tag_name"; + public static readonly uploadUrl: string = "upload_url"; + public static readonly htmlUrl: string = "html_url"; + public static readonly assets: string = "assets"; + public static readonly commit: string = "commit"; + public static readonly message: string = "message"; + public static readonly state: string = "state"; + public static readonly title: string = "title"; + public static readonly commits: string = "commits"; + public static readonly sha: string = "sha"; + public static readonly behind: string = "behind"; + public static readonly status: string = "status"; + public static readonly link: string = "link"; + public static readonly next: string = "next"; + public static readonly draft: string = "draft"; + public static readonly preRelease: string = "prerelease"; +} + +export class ActionType { + public static readonly create = "create"; + public static readonly edit = "edit"; + public static readonly delete = "delete"; +} + +export class AzureDevOpsVariables { + public static readonly buildSourceVersion: string = "Build.SourceVersion"; + public static readonly buildSourceBranch: string = "Build.SourceBranch"; + public static readonly releaseWebUrl: string = "Release.ReleaseWebURL"; + public static readonly collectionUri: string = "System.TeamFoundationCollectionUri"; + public static readonly teamProject: string = "System.TeamProject"; + public static readonly buildId: string = "Build.BuildId"; + public static readonly releaseId: string = "Release.ReleaseId"; +} + +export interface IGitHubRepositoryInfo { + owner: string; + name: string; +} + +export interface IRepositoryIssueId { + repository: string; + issueId: string; +} + +export class Delimiters { + public static readonly newLine: string = "\n"; + public static readonly hash: string = "#"; + public static readonly slash: string = "/"; + public static readonly semiColon: string = ";"; + public static readonly comma: string = ","; + public static readonly space: string = " "; + public static readonly openingBracketWithSpace: string = " ["; + public static readonly closingBracketWithSpace: string = " ]"; + public static readonly star: string = "*"; + public static readonly colon: string = ":"; +} diff --git a/_generated/GitHubReleaseV1_Node16/operations/webClient.ts b/_generated/GitHubReleaseV1_Node16/operations/webClient.ts new file mode 100644 index 000000000000..19c509790deb --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/operations/webClient.ts @@ -0,0 +1,112 @@ +import tl = require('azure-pipelines-task-lib/task'); +import httpClient = require("typed-rest-client/HttpClient"); +import httpInterfaces = require("typed-rest-client/Interfaces"); +import util = require("util"); + +let proxyUrl: string = tl.getVariable("agent.proxyurl"); +var requestOptions: httpInterfaces.IRequestOptions = proxyUrl ? { + proxy: { + proxyUrl: proxyUrl, + proxyUsername: tl.getVariable("agent.proxyusername"), + proxyPassword: tl.getVariable("agent.proxypassword"), + proxyBypassHosts: tl.getVariable("agent.proxybypasslist") ? JSON.parse(tl.getVariable("agent.proxybypasslist")) : null + } +} : {}; + +let ignoreSslErrors: string = tl.getVariable("VSTS_ARM_REST_IGNORE_SSL_ERRORS"); +requestOptions.ignoreSslError = ignoreSslErrors && ignoreSslErrors.toLowerCase() == "true"; + +var httpCallbackClient = new httpClient.HttpClient(tl.getVariable("AZURE_HTTP_USER_AGENT"), null, requestOptions); + +export class WebRequest { + public method: string; + public uri: string; + // body can be string or ReadableStream + public body: string | NodeJS.ReadableStream; + public headers: any; +} + +export class WebResponse { + public statusCode: number; + public statusMessage: string; + public headers: any; + public body: any; +} + +export class WebRequestOptions { + public retriableErrorCodes: string[]; + public retryCount: number; + public retryIntervalInSeconds: number; + public retriableStatusCodes: number[]; + public retryRequestTimedout: boolean; +} + +export async function sendRequest(request: WebRequest, options?: WebRequestOptions): Promise { + let i = 0; + let retryCount = options && options.retryCount ? options.retryCount : 5; + let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2; + let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"]; + let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504]; + let timeToWait: number = retryIntervalInSeconds; + while (true) { + try { + let response: WebResponse = await sendRequestInternal(request); + if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + continue; + } + + return response; + } + catch (error) { + if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) { + tl.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message)); + await sleepFor(timeToWait); + timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds; + } + else { + if (error.code) { + console.log("##vso[task.logissue type=error;code=" + error.code + ";]"); + } + + throw error; + } + } + } +} + +export function sleepFor(sleepDurationInSeconds): Promise { + return new Promise((resolve, reject) => { + setTimeout(resolve, sleepDurationInSeconds * 1000); + }); +} + +async function sendRequestInternal(request: WebRequest): Promise { + tl.debug(util.format("[%s]%s", request.method, request.uri)); + var response: httpClient.HttpClientResponse = await httpCallbackClient.request(request.method, request.uri, request.body, request.headers); + return await toWebResponse(response); +} + +async function toWebResponse(response: httpClient.HttpClientResponse): Promise { + var res = new WebResponse(); + if (response) { + res.statusCode = response.message.statusCode; + res.statusMessage = response.message.statusMessage; + res.headers = response.message.headers; + var body = await response.readBody(); + if (body) { + try { + res.body = JSON.parse(body); + } + catch (error) { + tl.debug("Could not parse response: " + JSON.stringify(error, null, 2)); + tl.debug("Response: " + JSON.stringify(res.body)); + res.body = body; + } + } + } + + return res; +} diff --git a/_generated/GitHubReleaseV1_Node16/package-lock.json b/_generated/GitHubReleaseV1_Node16/package-lock.json new file mode 100644 index 000000000000..a9f6bc1481d9 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/package-lock.json @@ -0,0 +1,657 @@ +{ + "name": "github.release", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==" + }, + "@types/q": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/@types/q/-/q-1.5.0.tgz", + "integrity": "sha512-sWj7AMiG0fYmta6ug1ublLjtj/tqn+CnCZeo7yswR1ykxel0FOWFGdWviTcGSNAMmtLbycDqbg6w98VPFKJmbw==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.210.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.210.0.tgz", + "integrity": "sha512-tQ1dRjreZqkH6s0X/TN3NS4uFgirL88E6CO185kLtJS+WsAC+HlNmtkO8PrzMATr41gZWSuNCyLTHPmZ7NeKNg==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vso-node-api": { + "version": "6.0.1-preview", + "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.1-preview.tgz", + "integrity": "sha512-JgOVmcJwa5Fw/deqBPC/lYG/D2duDIcv6V/u58bQhThOHAYFf6tYd+INHc/uaggWSnx5nxcKwjyHcMU1xweEWA==", + "requires": { + "q": "^1.0.1", + "tunnel": "0.0.4", + "underscore": "^1.8.3" + }, + "dependencies": { + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha512-o9QYRJN5WgS8oCtqvwzzcfnzaTnDPr7HpUsQdSXscTyzXbjvl4wSHPTUKOKzEaDeQvOuyRtt3ui+ujM7x7TReQ==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/_generated/GitHubReleaseV1_Node16/package.json b/_generated/GitHubReleaseV1_Node16/package.json new file mode 100644 index 000000000000..646b08f8f55c --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/package.json @@ -0,0 +1,23 @@ +{ + "name": "github.release", + "version": "0.0.0", + "main": "main.js", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^16.11.39", + "@types/q": "1.5.0", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^4.3.1", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "brace-expansion": "1.1.8", + "browserify-mime": "1.2.9", + "glob": "7.1.2", + "q": "1.4.1", + "semver": "5.4.1", + "typed-rest-client": "^1.8.9", + "vso-node-api": "6.0.1-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GitHubReleaseV1_Node16/task.json b/_generated/GitHubReleaseV1_Node16/task.json new file mode 100644 index 000000000000..f66860f29b0d --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/task.json @@ -0,0 +1,352 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "GitHub Release", + "description": "Create, edit, or delete a GitHub release", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "[Learn more about this task](https://aka.ms/AA3aeiw)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": false, + "version": { + "Major": 1, + "Minor": 224, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "Changelog configuration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "GitHub connection (OAuth or PAT)", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the name of the GitHub service connection to use to connect to the GitHub repository. The connection must be based on a GitHub user's OAuth or a GitHub personal access token. Learn more about service connections [here](https://aka.ms/AA3am5s)." + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "Repository", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "Specify the name of the GitHub repository in which the GitHub release will be created, edited, or deleted.", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "Action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "Specify the type of release operation to perform. This task can create, edit, or delete a GitHub release.", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "Target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the commit SHA for which the GitHub release will be created. E.g. `48b11d8d6e92a22e3e9563a3f643699c16fd6e27`. You can also use a variable here. E.g. `$(myCommitSHA)`." + }, + { + "name": "tagSource", + "type": "radio", + "label": "Tag source", + "required": true, + "defaultValue": "gitTag", + "visibleRule": "action = create", + "helpMarkDown": "Specify the tag to be used for release creation. The 'Git tag' option automatically takes the tag which is associated with the Git commit. Use the 'User specified tag' option to manually provide a tag.", + "options": { + "gitTag": "Git tag", + "userSpecifiedTag": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "Tag Pattern", + "required": false, + "visibleRule": "tagSource = gitTag", + "helpMarkDown": "Specify the git tag pattern using regex(Eg. `release-v1.*`). GitHub release will be created only for commits that have matching git tag. " + }, + { + "name": "tag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", + "helpMarkDown": "Specify the tag for which to create, edit, or delete a release. You can also use a variable here. E.g. `$(myTagName)`." + }, + { + "name": "title", + "type": "string", + "label": "Release title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the title of the GitHub release. If left empty, the tag will be used as the release title." + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "Release notes source", + "required": false, + "defaultValue": "filePath", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the description of the GitHub release. Use the 'Release notes file' option to use the contents of a file as release notes. Use the 'Inline release notes' option to manually enter release notes.", + "options": { + "filePath": "Release notes file", + "inline": "Inline release notes" + } + }, + { + "name": "releaseNotesFilePath", + "type": "filePath", + "label": "Release notes file path", + "required": false, + "helpMarkDown": "Select the file which contains the release notes.", + "visibleRule": "releaseNotesSource = filePath" + }, + { + "name": "releaseNotesInline", + "type": "multiLine", + "label": "Release notes", + "required": false, + "helpMarkDown": "Enter the release notes here. Markdown is supported.", + "visibleRule": "releaseNotesSource = inline", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "Assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Specify the files to be uploaded as assets of the release. You can use wildcard characters to specify multiple files. E.g. For build pipelines, `$(Build.ArtifactStagingDirectory)/*.zip` or in case of release pipelines `$(System.DefaultWorkingDirectory)/*.zip`. You can also specify multiple patterns - one per line. By default, all files in the $(Build.ArtifactStagingDirectory) directory will be uploaded. To know more about the list of pre-defined variables available, see [build variables](https://aka.ms/AA4449z) and [release variables](https://aka.ms/AA43wws).", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "Asset upload mode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "Use the 'Delete existing assets' option to first delete any existing assets in the release and then upload all assets. Use the 'Replace existing assets' option to replace any assets that have the same name.", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "Draft release", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Indicate whether the release should be saved as a draft (unpublished). If `false`, the release will be published.", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "Pre-release", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "Indicate whether the release should be marked as a pre-release." + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "Add changelog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "If set to `true`, a list of changes (commits and issues) between this and the last published release will be generated and appended to the release notes." + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "Compare to", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Indicate which release we should compare with to generate the changelog: \nLast full release: Compares the current release with the most recent non-draft release which is not marked as pre-release.\nLast non-draft release: Compares the current release with the most recent non-draft release.\nLast non-draft release by tag: Compares the current release with the last non-draft release matching the specified tag. You can also specify a regex instead of an exact tag.", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "Release Tag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "Specify the regex for release tag. Release matching this tag will be used as base for changelog computation." + }, + { + "name": "changeLogType", + "type": "radio", + "label": "Changelog type", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "Changelog can be commit based or issue based . Commit based changelog lists all commits included in a release where as Issue based changelog lists all the issues/pr included in the release. ", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "Categories", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "Using this you can categorize changes based on the label associated with the issue/pr. For a label you can mention the display name for the category and the state of issue. E.g. `\"[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]\"` .In case a change has multiple labels on it, the first specified label takes priority. Leave this field empty, to see a flat list of issues/pr." + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "GitHub release ($(action))", + "execution": { + "Node10": { + "target": "main.js" + }, + "Node16": { + "target": "main.js", + "argumentFormat": "" + } + }, + "messages": { + "GithubApiFailError": "An unexpected error occurred.", + "GetTagsError": "An unexpected error occurred while fetching tags.", + "GetReleasesError": "An unexpected error occurred while fetching releases.", + "CreateReleaseError": "An unexpected error occurred while creating the release.", + "EditReleaseError": "An unexpected error occurred while editing the release.", + "DeleteReleaseError": "An unexpected error occurred while deleting the release.", + "CreatingRelease": "Creating a release for tag: %s", + "CreateReleaseSuccess": "Release created successfully at %s", + "ReleaseAlreadyExists": "Failed to create the release. A release already exists for tag: %s", + "EditingRelease": "Editing the release with tag: %s", + "EditReleaseSuccess": "Release edited successfully", + "NoReleaseFoundToEditCreateRelease": "No existing release was found to edit. Creating one with the tag: %s", + "DeletingRelease": "Deleting the release for tag: %s", + "DeleteReleaseSuccess": "Release deleted successfully.", + "NoReleaseFoundToDelete": "No release was found for tag: %s. Deleting the release failed.", + "FetchReleaseForTag": "Fetching the release for tag: %s", + "FetchReleaseForTagSuccess": "Found a release for tag: %s", + "FetchTagForTarget": "Searching for tags associated with target commit: %s", + "FetchTagForTargetSuccess": "Found a tag for target commit: %s", + "MissingAssetError": "File not found: %s", + "MultipleReleasesFoundError": "Only 1 release was expected but more than 1 release was found for tag: %s. Unable to perform the action.", + "MultipleTagFound": "Only 1 tag was expected but more than 1 tag was found for the given commit: %s. Unable to perform the action.", + "NoTagFound": "Release will not be created as the tags for the target commit do not match with the given tag pattern", + "DeleteAllExistingAssets": "Deleting all existing assets...", + "DuplicateAssetFound": "Duplicate asset found: %s", + "AssetsDeletedSuccessfully": "Assets deleted successfully.", + "DeletingDuplicateAsset": "Deleting duplicate asset: %s", + "SkipDuplicateAssetFound": "Duplicate asset found: %s. Skipping...", + "AssetDeletedSuccessfully": "Asset %s deleted successfully", + "AllAssetsUploadedSuccessfully": "All assets uploaded successfully.", + "ErrorDeletingDuplicateAsset": "An unexpected error occurred while deleting duplicate asset: %s", + "ErrorDeletingAsset": "An unexpected error occurred while deleting asset: %s", + "DeletingAsset": "Deleting asset: %s", + "NoAssetFoundToDelete": "No assets were found to delete.", + "UploadingAssets": "Uploading assets...", + "UploadingAsset": "Uploading file: '%s'.", + "UploadAssetError": "An unexpected error occurred while uploading the file: %s", + "UploadAssetSuccess": "Uploaded file successfully: '%s'", + "NoAssetFoundToUpload": "No assets were found to upload.", + "ReleaseNotesFileIsDirectoryError": "Release notes file: %s is a directory and not a file.", + "AssetIsDirectoryError": "The asset is a directory and not a file. Skipping uploading directory: %s", + "ComputingChangeLog": "Computing changes made in this release...", + "ComputingChangeLogSuccess": "Changes computed successfully.", + "CommitDiffBehind": "Cannot compute the changes as the provided target commit is older than the commit of the last published release.", + "CommitDiffEqual": "No changes were found. The provided target commit is the same as the commit of the last published release.", + "FetchLatestPublishRelease": "Fetching the latest published release...", + "FetchLatestNonDraftRelease": "Fetching the latest non-draft release...", + "FetchLastReleaseByTag": "Fetching the latest release matching the tag pattern: %s ", + "FetchLatestPublishReleaseSuccess": "Found the latest published release: %s", + "FetchMatchingReleaseSuccess": "Found the latest non-draft release", + "FetchTagMatchingReleaseSuccess": "Found the latest release matching the tag pattern: %s", + "GetLatestReleaseError": "An unexpected error occurred while fetching the latest published release.", + "NoLatestPublishRelease": "No releases are published yet in the repository.", + "NoMatchingReleases": "No non-draft releases found.", + "NoTagMatchingReleases": "No releases found matching the tag pattern: %s ", + "FetchCommitDiff": "Fetching the list of commits since the last published release...", + "FetchCommitDiffSuccess": "Found the list of changes.", + "FetchCommitDiffError": "An unexpected error occurred while fetching the list of changes.", + "FetchInitialCommit": "Fetching the initial commit...", + "FetchInitialCommitSuccess": "Found the initial commit: %s", + "InvalidGitHubEndpoint": "Invalid GitHub service endpoint: %s.", + "InvalidEndpointAuthScheme": "Invalid GitHub service connection scheme: %s. Only OAuth and GitHub personal access token connections are allowed.", + "FetchInitialCommitError": "An unexpected error occurred while fetching the initial commit.", + "InvalidActionSet": "Invalid action: %s. Only 'create', 'edit', or 'delete' actions are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidTagSource": "Invalid tag source: %s. Only 'gitTag', or 'userSpecifiedTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidReleaseNotesSource": "Invalid release notes source: %s. Only 'filePath', or 'inline' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidCompareWithAttribute": "Invalid compareWith attribute: %s. Only 'lastFullRelease, 'lastNonDraftRelease', or 'lastNonDraftReleaseByTag' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidAssetUploadMode": "Invalid asset upload mode: %s. Only 'delete', or 'replace' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredEditDeleteAction": "For '%s' action, a tag is required. Please specify a tag in the step. For yaml syntax see: https://aka.ms/AA3m1bq", + "TagRequiredCreateAction": "Tag source is set to userSpecifiedTag- please specify a tag for create action. For yaml syntax see: https://aka.ms/AA3m1bq", + "NoFileFoundMatchingPattern": "No files found matching '%s'. Nothing to upload.", + "PatternIsADirectory": "'%s' cannot be uploaded as it is a directory. Please specify a file.", + "SearchingFileMatchingPattern": "Searching for file(s) matching '%s'.", + "IssuesFetchError": "Error fetching issues. Cannot generate change log.", + "NoIssuesLinkedError": "No issues are linked to commits in the specified commit Diff.", + "LabelsSyntaxError": "Error occured while parsing the labels. For yaml syntax see: https://aka.ms/AA3m1bq", + "InvalidChangeLogTypeAttribute": "Invalid ChangeLogType attribute: %s. Only 'commitBased' or 'issueBased' options are allowed. For yaml syntax see: https://aka.ms/AA3m1bq", + "ChangeLogTitle": "Changes", + "DefaultCategory": "Others", + "SeeMoreText": "See More" + }, + "_buildConfigMapping": { + "Default": "1.224.1", + "Node16-219": "1.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/task.loc.json b/_generated/GitHubReleaseV1_Node16/task.loc.json new file mode 100644 index 000000000000..726fb5cde7e8 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/task.loc.json @@ -0,0 +1,352 @@ +{ + "id": "7B5A6198-ADF8-4B16-9939-7ADDF85708B2", + "name": "GitHubRelease", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/AA5vv5o", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "preview": false, + "version": { + "Major": 1, + "Minor": 224, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.0.0", + "groups": [ + { + "name": "changeLogConfiguration", + "displayName": "ms-resource:loc.group.displayName.changeLogConfiguration", + "isExpanded": true, + "visibleRule": "addChangeLog = true" + } + ], + "inputs": [ + { + "name": "gitHubConnection", + "type": "connectedService:github:OAuth,OAuth2,PersonalAccessToken,Token", + "label": "ms-resource:loc.input.label.gitHubConnection", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gitHubConnection" + }, + { + "name": "repositoryName", + "type": "githubRepositoryPicker", + "label": "ms-resource:loc.input.label.repositoryName", + "defaultValue": "$(Build.Repository.Name)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.repositoryName", + "properties": { + "DisableManageLink": "True", + "EditableOptions": "True" + } + }, + { + "name": "action", + "type": "pickList", + "label": "ms-resource:loc.input.label.action", + "defaultValue": "create", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.action", + "options": { + "create": "Create", + "edit": "Edit", + "delete": "Delete" + } + }, + { + "name": "target", + "type": "string", + "label": "ms-resource:loc.input.label.target", + "defaultValue": "$(Build.SourceVersion)", + "required": true, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.target" + }, + { + "name": "tagSource", + "type": "radio", + "label": "ms-resource:loc.input.label.tagSource", + "required": true, + "defaultValue": "gitTag", + "visibleRule": "action = create", + "helpMarkDown": "ms-resource:loc.input.help.tagSource", + "options": { + "gitTag": "Git tag", + "userSpecifiedTag": "User specified tag" + } + }, + { + "name": "tagPattern", + "type": "string", + "label": "ms-resource:loc.input.label.tagPattern", + "required": false, + "visibleRule": "tagSource = gitTag", + "helpMarkDown": "ms-resource:loc.input.help.tagPattern" + }, + { + "name": "tag", + "type": "string", + "label": "ms-resource:loc.input.label.tag", + "defaultValue": "", + "required": true, + "visibleRule": "action = edit || action = delete || tagSource = userSpecifiedTag", + "helpMarkDown": "ms-resource:loc.input.help.tag" + }, + { + "name": "title", + "type": "string", + "label": "ms-resource:loc.input.label.title", + "defaultValue": "", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.title" + }, + { + "name": "releaseNotesSource", + "type": "radio", + "label": "ms-resource:loc.input.label.releaseNotesSource", + "required": false, + "defaultValue": "filePath", + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesSource", + "options": { + "filePath": "Release notes file", + "inline": "Inline release notes" + } + }, + { + "name": "releaseNotesFilePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.releaseNotesFilePath", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesFilePath", + "visibleRule": "releaseNotesSource = filePath" + }, + { + "name": "releaseNotesInline", + "type": "multiLine", + "label": "ms-resource:loc.input.label.releaseNotesInline", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.releaseNotesInline", + "visibleRule": "releaseNotesSource = inline", + "properties": { + "resizable": "true", + "rows": "4", + "maxLength": "5000" + } + }, + { + "name": "assets", + "type": "multiLine", + "label": "ms-resource:loc.input.label.assets", + "defaultValue": "$(Build.ArtifactStagingDirectory)/*", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assets", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "assetUploadMode", + "type": "radio", + "label": "ms-resource:loc.input.label.assetUploadMode", + "required": false, + "defaultValue": "delete", + "visibleRule": "action = edit", + "helpMarkDown": "ms-resource:loc.input.help.assetUploadMode", + "options": { + "delete": "Delete exisiting assets", + "replace": "Replace existing assets" + } + }, + { + "name": "isDraft", + "type": "boolean", + "label": "ms-resource:loc.input.label.isDraft", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isDraft", + "visibleRule": "action = create || action = edit" + }, + { + "name": "isPreRelease", + "type": "boolean", + "label": "ms-resource:loc.input.label.isPreRelease", + "defaultValue": "false", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.isPreRelease" + }, + { + "name": "addChangeLog", + "type": "boolean", + "label": "ms-resource:loc.input.label.addChangeLog", + "defaultValue": "true", + "required": false, + "visibleRule": "action = create || action = edit", + "helpMarkDown": "ms-resource:loc.input.help.addChangeLog" + }, + { + "name": "changeLogCompareToRelease", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogCompareToRelease", + "required": true, + "defaultValue": "lastFullRelease", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToRelease", + "options": { + "lastFullRelease": "Last full release", + "lastNonDraftRelease": "Last non-draft release", + "lastNonDraftReleaseByTag": "Last non-draft release by tag" + } + }, + { + "name": "changeLogCompareToReleaseTag", + "type": "string", + "label": "ms-resource:loc.input.label.changeLogCompareToReleaseTag", + "required": true, + "groupName": "changeLogConfiguration", + "visibleRule": "changeLogCompareToRelease = lastNonDraftReleaseByTag", + "helpMarkDown": "ms-resource:loc.input.help.changeLogCompareToReleaseTag" + }, + { + "name": "changeLogType", + "type": "radio", + "label": "ms-resource:loc.input.label.changeLogType", + "required": true, + "defaultValue": "commitBased", + "groupName": "changeLogConfiguration", + "visibleRule": "addChangeLog = true", + "helpMarkDown": "ms-resource:loc.input.help.changeLogType", + "options": { + "commitBased": "Commit based", + "issueBased": "Issue based" + } + }, + { + "name": "changeLogLabels", + "type": "multiLine", + "label": "ms-resource:loc.input.label.changeLogLabels", + "required": false, + "visibleRule": "changeLogType = issueBased", + "defaultValue": "[{ \"label\" : \"bug\", \"displayName\" : \"Bugs\", \"state\" : \"closed\" }]", + "groupName": "changeLogConfiguration", + "helpMarkDown": "ms-resource:loc.input.help.changeLogLabels" + } + ], + "dataSourceBindings": [ + { + "target": "repositoryName", + "endpointId": "$(gitHubConnection)", + "dataSourceName": "UserRepositories", + "resultTemplate": "{ \"Value\" : \"{{full_name}}\", \"DisplayValue\" : \"{{full_name}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "main.js" + }, + "Node16": { + "target": "main.js", + "argumentFormat": "" + } + }, + "messages": { + "GithubApiFailError": "ms-resource:loc.messages.GithubApiFailError", + "GetTagsError": "ms-resource:loc.messages.GetTagsError", + "GetReleasesError": "ms-resource:loc.messages.GetReleasesError", + "CreateReleaseError": "ms-resource:loc.messages.CreateReleaseError", + "EditReleaseError": "ms-resource:loc.messages.EditReleaseError", + "DeleteReleaseError": "ms-resource:loc.messages.DeleteReleaseError", + "CreatingRelease": "ms-resource:loc.messages.CreatingRelease", + "CreateReleaseSuccess": "ms-resource:loc.messages.CreateReleaseSuccess", + "ReleaseAlreadyExists": "ms-resource:loc.messages.ReleaseAlreadyExists", + "EditingRelease": "ms-resource:loc.messages.EditingRelease", + "EditReleaseSuccess": "ms-resource:loc.messages.EditReleaseSuccess", + "NoReleaseFoundToEditCreateRelease": "ms-resource:loc.messages.NoReleaseFoundToEditCreateRelease", + "DeletingRelease": "ms-resource:loc.messages.DeletingRelease", + "DeleteReleaseSuccess": "ms-resource:loc.messages.DeleteReleaseSuccess", + "NoReleaseFoundToDelete": "ms-resource:loc.messages.NoReleaseFoundToDelete", + "FetchReleaseForTag": "ms-resource:loc.messages.FetchReleaseForTag", + "FetchReleaseForTagSuccess": "ms-resource:loc.messages.FetchReleaseForTagSuccess", + "FetchTagForTarget": "ms-resource:loc.messages.FetchTagForTarget", + "FetchTagForTargetSuccess": "ms-resource:loc.messages.FetchTagForTargetSuccess", + "MissingAssetError": "ms-resource:loc.messages.MissingAssetError", + "MultipleReleasesFoundError": "ms-resource:loc.messages.MultipleReleasesFoundError", + "MultipleTagFound": "ms-resource:loc.messages.MultipleTagFound", + "NoTagFound": "ms-resource:loc.messages.NoTagFound", + "DeleteAllExistingAssets": "ms-resource:loc.messages.DeleteAllExistingAssets", + "DuplicateAssetFound": "ms-resource:loc.messages.DuplicateAssetFound", + "AssetsDeletedSuccessfully": "ms-resource:loc.messages.AssetsDeletedSuccessfully", + "DeletingDuplicateAsset": "ms-resource:loc.messages.DeletingDuplicateAsset", + "SkipDuplicateAssetFound": "ms-resource:loc.messages.SkipDuplicateAssetFound", + "AssetDeletedSuccessfully": "ms-resource:loc.messages.AssetDeletedSuccessfully", + "AllAssetsUploadedSuccessfully": "ms-resource:loc.messages.AllAssetsUploadedSuccessfully", + "ErrorDeletingDuplicateAsset": "ms-resource:loc.messages.ErrorDeletingDuplicateAsset", + "ErrorDeletingAsset": "ms-resource:loc.messages.ErrorDeletingAsset", + "DeletingAsset": "ms-resource:loc.messages.DeletingAsset", + "NoAssetFoundToDelete": "ms-resource:loc.messages.NoAssetFoundToDelete", + "UploadingAssets": "ms-resource:loc.messages.UploadingAssets", + "UploadingAsset": "ms-resource:loc.messages.UploadingAsset", + "UploadAssetError": "ms-resource:loc.messages.UploadAssetError", + "UploadAssetSuccess": "ms-resource:loc.messages.UploadAssetSuccess", + "NoAssetFoundToUpload": "ms-resource:loc.messages.NoAssetFoundToUpload", + "ReleaseNotesFileIsDirectoryError": "ms-resource:loc.messages.ReleaseNotesFileIsDirectoryError", + "AssetIsDirectoryError": "ms-resource:loc.messages.AssetIsDirectoryError", + "ComputingChangeLog": "ms-resource:loc.messages.ComputingChangeLog", + "ComputingChangeLogSuccess": "ms-resource:loc.messages.ComputingChangeLogSuccess", + "CommitDiffBehind": "ms-resource:loc.messages.CommitDiffBehind", + "CommitDiffEqual": "ms-resource:loc.messages.CommitDiffEqual", + "FetchLatestPublishRelease": "ms-resource:loc.messages.FetchLatestPublishRelease", + "FetchLatestNonDraftRelease": "ms-resource:loc.messages.FetchLatestNonDraftRelease", + "FetchLastReleaseByTag": "ms-resource:loc.messages.FetchLastReleaseByTag", + "FetchLatestPublishReleaseSuccess": "ms-resource:loc.messages.FetchLatestPublishReleaseSuccess", + "FetchMatchingReleaseSuccess": "ms-resource:loc.messages.FetchMatchingReleaseSuccess", + "FetchTagMatchingReleaseSuccess": "ms-resource:loc.messages.FetchTagMatchingReleaseSuccess", + "GetLatestReleaseError": "ms-resource:loc.messages.GetLatestReleaseError", + "NoLatestPublishRelease": "ms-resource:loc.messages.NoLatestPublishRelease", + "NoMatchingReleases": "ms-resource:loc.messages.NoMatchingReleases", + "NoTagMatchingReleases": "ms-resource:loc.messages.NoTagMatchingReleases", + "FetchCommitDiff": "ms-resource:loc.messages.FetchCommitDiff", + "FetchCommitDiffSuccess": "ms-resource:loc.messages.FetchCommitDiffSuccess", + "FetchCommitDiffError": "ms-resource:loc.messages.FetchCommitDiffError", + "FetchInitialCommit": "ms-resource:loc.messages.FetchInitialCommit", + "FetchInitialCommitSuccess": "ms-resource:loc.messages.FetchInitialCommitSuccess", + "InvalidGitHubEndpoint": "ms-resource:loc.messages.InvalidGitHubEndpoint", + "InvalidEndpointAuthScheme": "ms-resource:loc.messages.InvalidEndpointAuthScheme", + "FetchInitialCommitError": "ms-resource:loc.messages.FetchInitialCommitError", + "InvalidActionSet": "ms-resource:loc.messages.InvalidActionSet", + "InvalidTagSource": "ms-resource:loc.messages.InvalidTagSource", + "InvalidReleaseNotesSource": "ms-resource:loc.messages.InvalidReleaseNotesSource", + "InvalidCompareWithAttribute": "ms-resource:loc.messages.InvalidCompareWithAttribute", + "InvalidAssetUploadMode": "ms-resource:loc.messages.InvalidAssetUploadMode", + "TagRequiredEditDeleteAction": "ms-resource:loc.messages.TagRequiredEditDeleteAction", + "TagRequiredCreateAction": "ms-resource:loc.messages.TagRequiredCreateAction", + "NoFileFoundMatchingPattern": "ms-resource:loc.messages.NoFileFoundMatchingPattern", + "PatternIsADirectory": "ms-resource:loc.messages.PatternIsADirectory", + "SearchingFileMatchingPattern": "ms-resource:loc.messages.SearchingFileMatchingPattern", + "IssuesFetchError": "ms-resource:loc.messages.IssuesFetchError", + "NoIssuesLinkedError": "ms-resource:loc.messages.NoIssuesLinkedError", + "LabelsSyntaxError": "ms-resource:loc.messages.LabelsSyntaxError", + "InvalidChangeLogTypeAttribute": "ms-resource:loc.messages.InvalidChangeLogTypeAttribute", + "ChangeLogTitle": "ms-resource:loc.messages.ChangeLogTitle", + "DefaultCategory": "ms-resource:loc.messages.DefaultCategory", + "SeeMoreText": "ms-resource:loc.messages.SeeMoreText" + }, + "_buildConfigMapping": { + "Default": "1.224.1", + "Node16-219": "1.224.0" + } +} \ No newline at end of file diff --git a/_generated/GitHubReleaseV1_Node16/tsconfig.json b/_generated/GitHubReleaseV1_Node16/tsconfig.json new file mode 100644 index 000000000000..875bb90cd697 --- /dev/null +++ b/_generated/GitHubReleaseV1_Node16/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} diff --git a/make-options.json b/make-options.json index 259ad72b9d2a..66451a589d03 100644 --- a/make-options.json +++ b/make-options.json @@ -221,6 +221,8 @@ "FuncToolsInstallerV0", "PackerBuildV0", "PackerBuildV1", - "DownloadGitHubNugetPackageV1" + "DownloadGitHubNugetPackageV1", + "GitHubReleaseV0", + "GitHubReleaseV1" ] } \ No newline at end of file