From c33926d4d2fb16a671aa63ebc90d9ab1fab10ee9 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:27:09 -0500 Subject: [PATCH 01/29] Create templates and translation strings. --- options/locale/locale_bg-BG.ini | 3 +++ options/locale/locale_cs-CZ.ini | 4 ++++ options/locale/locale_de-DE.ini | 1 + options/locale/locale_en-US.ini | 4 ++++ options/locale/locale_es-ES.ini | 4 ++++ options/locale/locale_fa-IR.ini | 7 ++++--- options/locale/locale_fi-FI.ini | 1 + options/locale/locale_fr-FR.ini | 1 + options/locale/locale_hu-HU.ini | 1 + options/locale/locale_it-IT.ini | 1 + options/locale/locale_ja-JP.ini | 1 + options/locale/locale_lv-LV.ini | 1 + options/locale/locale_pl-PL.ini | 1 + options/locale/locale_pt-BR.ini | 1 + options/locale/locale_pt-PT.ini | 1 + options/locale/locale_ru-RU.ini | 1 + options/locale/locale_sv-SE.ini | 1 + options/locale/locale_tr-TR.ini | 7 ++++--- options/locale/locale_uk-UA.ini | 3 ++- options/locale/locale_zh-CN.ini | 7 ++++--- options/locale/locale_zh-TW.ini | 1 + public/img/teamcity.png | Bin 0 -> 5563 bytes templates/admin/hook_new.tmpl | 2 ++ templates/org/settings/hook_new.tmpl | 3 +++ templates/repo/settings/webhook/list.tmpl | 3 +++ templates/repo/settings/webhook/new.tmpl | 3 +++ templates/repo/settings/webhook/teamcity.tmpl | 19 ++++++++++++++++++ templates/swagger/v1_json.tmpl | 1 + 28 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 public/img/teamcity.png create mode 100644 templates/repo/settings/webhook/teamcity.tmpl diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 85466f5f7d837..54dafef785b1a 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -909,6 +909,9 @@ settings.hook_type=Тип на куката settings.slack_token=API ключ settings.slack_domain=Домейн settings.slack_channel=Канал +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Ключове за внедряване settings.add_deploy_key=Добави ключ за внедряване settings.title=Заглавие diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 2924bac2a8107..28876c555a155 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1569,9 +1569,13 @@ settings.add_slack_hook_desc=Integrovat Slack do vašeho repozi settings.slack_token=Poukázka settings.slack_domain=Doména settings.slack_channel=Kanál +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integrovat Discord do vašeho repozitáře. settings.add_dingtalk_hook_desc=Integrovat Dingtalk do vašeho repozitáře. settings.add_telegram_hook_desc=Integrovat Telegram do vašeho repozitáře. +settings.add_teamcity_hook_desc=Integrovat TeamCity do vašeho repozitáře. settings.add_matrix_hook_desc=Integrovat Matrix do vašeho repozitáře. settings.add_msteams_hook_desc=Integrovat Microsoft Teams do vašeho repozitáře. settings.add_feishu_hook_desc=Integrovat Feishu do vašeho repozitáře. diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 149500486fc51..1b66d951a4b45 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -1604,6 +1604,7 @@ settings.slack_channel=Kanal settings.add_discord_hook_desc=Discord-Integration zu deinem Repository hinzufügen. settings.add_dingtalk_hook_desc=Dingtalk-Integration zu deinem Repository hinzufügen. settings.add_telegram_hook_desc=Telegram-Integration zu deinem Repository hinzufügen. +settings.add_teamcity_hook_desc=TeamCity-Integration zu deinem Repository hinzufügen. settings.add_matrix_hook_desc=Matrix-Integration zu deinem Repository hinzufügen. settings.add_msteams_hook_desc="Microsoft Teams"-Integration zu deinem Repository hinzufügen. settings.add_feishu_hook_desc=Feishu-Integration zu deinem Repository hinzufügen. diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 7bb62250a4ef8..183815a062395 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1612,9 +1612,13 @@ settings.add_slack_hook_desc = Integrate Slack into your reposi settings.slack_token = Token settings.slack_domain = Domain settings.slack_channel = Channel +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc = Integrate Discord into your repository. settings.add_dingtalk_hook_desc = Integrate Dingtalk into your repository. settings.add_telegram_hook_desc = Integrate Telegram into your repository. +settings.add_teamcity_hook_desc = Integrate TeamCity into your repository. settings.add_matrix_hook_desc = Integrate Matrix into your repository. settings.add_msteams_hook_desc = Integrate Microsoft Teams into your repository. settings.add_feishu_hook_desc = Integrate Feishu into your repository. diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 1b58765821b65..2e9fb194eede1 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1594,9 +1594,13 @@ settings.add_slack_hook_desc=Integrar Slack en su repositorio. settings.slack_token=Token settings.slack_domain=Dominio settings.slack_channel=Canal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integrar Discord en su repositorio. settings.add_dingtalk_hook_desc=Integrar Dingtalk en su repositorio. settings.add_telegram_hook_desc=Integrar Telegrama en tu repositorio. +settings.add_teamcity_hook_desc=Integrar TeamCity en tu repositorio. settings.add_matrix_hook_desc=Integrar Matrix en su repositorio. settings.add_msteams_hook_desc=Integrar Microsoft Teams en tu repositorio. settings.add_feishu_hook_desc=Integrar Slack en su repositorio. diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index d2fb1bb12622f..53d37174a25a3 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -548,10 +548,10 @@ access_token_deletion=حذف توکن access_token_deletion_desc=حذف token باعث از کار افتادن تمامی برنامه‎هایی که در آنها به کار رفته می‎شود. آیا ادامه می‎دهید؟ delete_token_success=token مورد نظر حذف شد. برنامه هایی که از آن استفاده می‎کنند به زودی دسترسی به حساب کاربری شما را از دست می‎دهند. -manage_oauth2_applications=مدیریت برنامه‎های OAuth2 -edit_oauth2_application=ویرایش برنامه OAuth2 +manage_oauth2_applications=مدیریت برنامه‎های OAuth2 +edit_oauth2_application=ویرایش برنامه OAuth2 oauth2_applications_desc=برنامه‎های OAuth2 احراز هویت برنامه های شخص ثالث را با بستری امن میسر می‎کند. -remove_oauth2_application=حذف برنامه OAuth2 +remove_oauth2_application=حذف برنامه OAuth2 remove_oauth2_application_desc=حذف برنامه OAuth2 دسترسی تمام برنامه های متصل با آن را از بین می‎برد. آیا ادامه می‎دهید؟ remove_oauth2_application_success=برنامه حذف شده است. create_oauth2_application=ساختن یک برنامه OAuth2 جدید @@ -1486,6 +1486,7 @@ settings.slack_channel=کانال settings.add_discord_hook_desc=درست کردن اختلاف‌ها در مخزن شما. settings.add_dingtalk_hook_desc=درست کردن Dingtalk در مخزن شما. settings.add_telegram_hook_desc=درست کردن تلگرام در مخزن شما. +settings.add_teamcity_hook_desc=درست کردن TeamCity در مخزن شما. settings.add_msteams_hook_desc=درست کردن تیم مایکروسافت در مخزن شما. settings.deploy_keys=کلید های استقرار settings.add_deploy_key=افزودن کلید استقرار diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index a1131fba060b2..1e137372c3bce 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -903,6 +903,7 @@ settings.slack_channel=Kanava settings.add_discord_hook_desc=Liitä Discord repoon. settings.add_dingtalk_hook_desc=Liitä Dingtalk repoon. settings.add_telegram_hook_desc=Liitä Telegram repoon. +settings.add_teamcity_hook_desc=Liitä TeamCity repoon. settings.add_matrix_hook_desc=Liitä Matrix repoon. settings.add_msteams_hook_desc=Liitä Microsoft Teams repoon. settings.add_feishu_hook_desc=Liitä Feishu repoon. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 45eafc9286cee..39e98c5f217df 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1483,6 +1483,7 @@ settings.slack_channel=Canal settings.add_discord_hook_desc=Intégrer Discord au dépôt. settings.add_dingtalk_hook_desc=Intégrer Dingtalk au dépôt. settings.add_telegram_hook_desc=Intégrer Telegram au dépôt. +settings.add_teamcity_hook_desc=Intégrer TeamCity au dépôt. settings.add_matrix_hook_desc=Intégrer Matrix au dépôt. settings.add_msteams_hook_desc=Intégrer Microsoft Teams au dépôt. settings.add_feishu_hook_desc=Intégrer Feishu au dépôt. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index fea2b219bd1f9..a0dd371ee4863 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -1218,6 +1218,7 @@ settings.slack_channel=Csatorna settings.add_discord_hook_desc=Discord integrálása a tárolóba. settings.add_dingtalk_hook_desc=Dingtalk integrálása a tárolóba. settings.add_telegram_hook_desc=Telegram integrálása a tárolóba. +settings.add_teamcity_hook_desc=TeamCity integrálása a tárolóba. settings.add_msteams_hook_desc=Microsoft Teams integrálása a tárolóba. settings.deploy_keys=Telepítési kulcsok settings.add_deploy_key=Telepítési kulcs hozzáadása diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 43cd9ca5e3c65..51e92cc9e05fe 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -1437,6 +1437,7 @@ settings.slack_channel=Canale settings.add_discord_hook_desc=Integra Discord nel tuo repository. settings.add_dingtalk_hook_desc=Integra Dingtalk nel tuo repository. settings.add_telegram_hook_desc=Integra Telegram nella tua repository. +settings.add_teamcity_hook_desc=Integra TeamCity nella tua repository. settings.add_msteams_hook_desc=Integra Microsoft Teams nella tua repository. settings.add_feishu_hook_desc=Integra Feishu nel tuo repository. settings.deploy_keys=Dispiega Chiavi diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index d780cd39e258e..4f13c5b36e123 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1614,6 +1614,7 @@ settings.slack_channel=チャンネル settings.add_discord_hook_desc=Discordをリポジトリと組み合わせます。 settings.add_dingtalk_hook_desc=Dingtalkをリポジトリと組み合わせます。 settings.add_telegram_hook_desc=Telegramをリポジトリと組み合わせます。 +settings.add_teamcity_hook_desc=TeamCityをリポジトリと組み合わせます。 settings.add_matrix_hook_desc=Matrix とリポジトリを組み合わせます。 settings.add_msteams_hook_desc=Microsoft Teamsをリポジトリと組み合わせます。 settings.add_feishu_hook_desc=Feishuをリポジトリと組み合わせます。 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index b51a10f5de819..499b601a0e601 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1586,6 +1586,7 @@ settings.slack_channel=Kanāls settings.add_discord_hook_desc=Integrēt Discord repozitorijā. settings.add_dingtalk_hook_desc=Integrēt Dingtalk repozitorijā. settings.add_telegram_hook_desc=Integrēt Telegram repozitorijā. +settings.add_teamcity_hook_desc=Integrēt TeamCity repozitorijā. settings.add_matrix_hook_desc=Integrēt Matrix repozitorijā. settings.add_msteams_hook_desc=Integrēt Microsoft Teams repozitorijā. settings.add_feishu_hook_desc=Integrēt Feishu repozitorijā. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index eed7bf84e9dd1..813813e4d5ef3 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1555,6 +1555,7 @@ settings.slack_channel=Kanał settings.add_discord_hook_desc=Zintegruj Discorda ze swoim repozytorium. settings.add_dingtalk_hook_desc=Zintegruj Dingtalka ze swoim repozytorium. settings.add_telegram_hook_desc=Zintegruj Telegrama ze swoim repozytorium. +settings.add_teamcity_hook_desc=Zintegruj TeamCity ze swoim repozytorium. settings.add_matrix_hook_desc=Zintegruj Matrixa ze swoim repozytorium. settings.add_msteams_hook_desc=Zintegruj Microsoft Teams ze swoim repozytorium. settings.add_feishu_hook_desc=Zintegruj Feishu ze swoim repozytorium. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 7cb1c7b411c92..7eb75be1b8e0e 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1413,6 +1413,7 @@ settings.slack_channel=Canal settings.add_discord_hook_desc=Integre o Discord em seu repositório. settings.add_dingtalk_hook_desc=Integre o Dingtalk em seu repositório. settings.add_telegram_hook_desc=Integre Telegram no seu repositório. +settings.add_teamcity_hook_desc=Integre TeamCity no seu repositório. settings.add_msteams_hook_desc=Integre Microsoft Teams no seu repositório. settings.add_feishu_hook_desc=Integre o Feishu em seu repositório. settings.deploy_keys=Chaves de Deploy diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 5317ab60367b6..41bcf63cc7624 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1586,6 +1586,7 @@ settings.slack_channel=Canal settings.add_discord_hook_desc=Integrar Discord no seu repositório. settings.add_dingtalk_hook_desc=Integrar Dingtalk no seu repositório. settings.add_telegram_hook_desc=Integrar Telegram no seu repositório. +settings.add_teamcity_hook_desc=Integrar TeamCity no seu repositório. settings.add_matrix_hook_desc=Integrar Matrix no seu repositório. settings.add_msteams_hook_desc=Integrar Microsoft Teams no seu repositório. settings.add_feishu_hook_desc=Integrar Feishu no seu repositório. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 88e02a0bc91f3..a1ba53e186708 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1586,6 +1586,7 @@ settings.slack_channel=Канал settings.add_discord_hook_desc=Добавить уведомления о событиях через Discord. settings.add_dingtalk_hook_desc=Добавить интеграцию с Dingtalk в ваш репозиторий. settings.add_telegram_hook_desc=Добавить интеграцию с Telegram в ваш репозиторий. +settings.add_teamcity_hook_desc=Добавить интеграцию с TeamCity в ваш репозиторий. settings.add_matrix_hook_desc=Добавить интеграцию Matrix в ваш репозиторий. settings.add_msteams_hook_desc=Добавить интеграцию с Microsoft Teams в ваш репозиторий. settings.add_feishu_hook_desc=Добавить интеграцию Feishu в ваш репозиторий. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 9a6371b3a566a..fa10c0ed02b8d 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1391,6 +1391,7 @@ settings.slack_channel=Kanal settings.add_discord_hook_desc=Integrera Discord med din utvecklingskatalog. settings.add_dingtalk_hook_desc=Integrera Dingtalk med din utvecklingskatalog. settings.add_telegram_hook_desc=Integrera Telegram med din utvecklingskatalog. +settings.add_teamcity_hook_desc=Integrera TeamCity med din utvecklingskatalog. settings.add_matrix_hook_desc=Integrera Matrix med din utvecklingskatalog. settings.add_msteams_hook_desc=Integrera Microsoft Teams med din utvecklingskatalog. settings.add_feishu_hook_desc=Integrera Feishu med din utvecklingskatalog. diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 95f243fe359d6..efd4043f31c01 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -1385,8 +1385,8 @@ activity.no_git_activity=Bu dönemde herhangi bir işleme yapılmamıştır. activity.git_stats_exclude_merges=Birleştirmeler hariç, activity.git_stats_author_1=%d yazar activity.git_stats_author_n=%d yazar -activity.git_stats_pushed_1= -activity.git_stats_pushed_n= +activity.git_stats_pushed_1= +activity.git_stats_pushed_n= activity.git_stats_commit_1=%d işlemeyi activity.git_stats_commit_n=%d işlemeyi activity.git_stats_push_to_branch=%s dalına ve @@ -1614,6 +1614,7 @@ settings.slack_channel=Kanal settings.add_discord_hook_desc=Deponuza Discord entegre edin. settings.add_dingtalk_hook_desc=Deponuza Dingtalk entegre edin. settings.add_telegram_hook_desc=Deponuza Telegram entegre edin. +settings.add_teamcity_hook_desc=Deponuza TeamCity entegre edin. settings.add_matrix_hook_desc=Deponuza Matrix entegre edin. settings.add_msteams_hook_desc=Deponuza Microsoft Teams entegre edin. settings.add_feishu_hook_desc=Deponuza Feishu entegre edin. @@ -1817,7 +1818,7 @@ branch.create_success='%s' dalı oluşturuldu. branch.branch_already_exists='%s' dalı zaten bu depoda var. branch.branch_name_conflict='%s' dal adı zaten mevcut olan '%s' dalıyla çakışıyor. branch.tag_collision='%s' dalı, depoda aynı ada sahip bir etiket olduğundan oluşturulamıyor. -branch.deleted_by=%s tarafından silindi +branch.deleted_by=%s tarafından silindi branch.restore_success='%s' dalı geri yüklendi. branch.restore_failed='%s' dalı geri yüklenemedi. branch.protected_deletion_failed='%s' dalı korunuyor. Silinemez. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 6ba428783e5d0..1781541d48811 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -472,7 +472,7 @@ delete_email=Видалити email_deletion=Видалити адресу електронної пошти email_deletion_desc=Електронна адреса та пов'язана з нею інформація буде видалена з вашого облікового запису. Git коміти, здійснені через цю електронну адресу, залишиться без змін. Продовжити? email_deletion_success=Адресу електронної пошти було видалено. -theme_update_success=Тему оновлено. +theme_update_success=Тему оновлено. theme_update_error=Вибрана тема не існує. openid_deletion=Видалити адресу OpenID openid_deletion_desc=Видалення цієї OpenID-адреси з вашого облікового запису забороняє вам входити з ним. Продовжити? @@ -1560,6 +1560,7 @@ settings.slack_channel=Канал settings.add_discord_hook_desc=Інтеграція Discord у ваш репозиторії. settings.add_dingtalk_hook_desc=Інтеграція Dingtalk у ваш репозиторії. settings.add_telegram_hook_desc=Інтегруйте Telegram у своє сховище. +settings.add_teamcity_hook_desc=Інтегруйте TeamCity у своє сховище. settings.add_matrix_hook_desc=Інтегрувати Matrix з вашим репозиторієм. settings.add_msteams_hook_desc=Інтегруйте Microsoft Teams у своє сховище. settings.add_feishu_hook_desc=Інтеграція Feishu у ваш репозиторії. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index a8ba7d2f40854..d619f181d7d7f 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -530,8 +530,8 @@ last_used=上次使用在 no_activity=没有最近活动 can_read_info=读取 can_write_info=写入 -key_state_desc=7 天内使用过该密钥 -token_state_desc=7 天内使用过该密钥 +key_state_desc=7 天内使用过该密钥 +token_state_desc=7 天内使用过该密钥 show_openid=在个人信息上显示 hide_openid=在个人信息上隐藏 ssh_disabled=SSH 被禁用 @@ -678,7 +678,7 @@ watchers=关注者 stargazers=称赞者 forks=派生仓库 pick_reaction=选择你的表情 -reactions_more=再加载 %d +reactions_more=再加载 %d unit_disabled=站点管理员已禁用此仓库单元。 language_other=其它 @@ -1586,6 +1586,7 @@ settings.slack_channel=频道 settings.add_discord_hook_desc=将 Discord 集成到您的仓库中。 settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的仓库中。 settings.add_telegram_hook_desc=将 Telegram 集成到您的仓库中。 +settings.add_teamcity_hook_desc=将 TeamCity 集成到您的仓库中。 settings.add_matrix_hook_desc=将 Matrix 集成到您的仓库中。 settings.add_msteams_hook_desc=将 Microsoft Teams 集成到您的仓库中。 settings.add_feishu_hook_desc=将 Feishu 集成到您的仓库中。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index affb67341c13c..316f07c403cd2 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1422,6 +1422,7 @@ settings.slack_channel=頻道 settings.add_discord_hook_desc=將 Discord 整合到您的儲存庫。 settings.add_dingtalk_hook_desc=將 Dingtalk 整合到您的儲存庫。 settings.add_telegram_hook_desc=將 Telegram 整合到您的儲存庫。 +settings.add_teamcity_hook_desc=將 TeamCity 整合到您的儲存庫。 settings.add_matrix_hook_desc=將 Matrix 整合到您的儲存庫。 settings.add_msteams_hook_desc=將 Microsoft Teams 整合到您的儲存庫。 settings.add_feishu_hook_desc=將 Feishu 整合到您的儲存庫。 diff --git a/public/img/teamcity.png b/public/img/teamcity.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddee0dc719f4dcec00fbd9674b76210d6e2c91e GIT binary patch literal 5563 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV literal 0 HcmV?d00001 diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index 26169acaa0bfd..a4e9a671ff84e 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -22,6 +22,8 @@ {{else if eq .HookType "telegram"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "msteams"}} {{else if eq .HookType "feishu"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index 35bb1610a872b..9e8776267537c 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -21,6 +21,8 @@ {{else if eq .HookType "telegram"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "msteams"}} {{else if eq .HookType "feishu"}} @@ -37,6 +39,7 @@ {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/msteams" .}} {{template "repo/settings/webhook/feishu" .}} {{template "repo/settings/webhook/matrix" .}} diff --git a/templates/repo/settings/webhook/list.tmpl b/templates/repo/settings/webhook/list.tmpl index 29994d8197176..094135dd566d1 100644 --- a/templates/repo/settings/webhook/list.tmpl +++ b/templates/repo/settings/webhook/list.tmpl @@ -26,6 +26,9 @@ Microsoft Teams + + TeamCity + Feishu diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index cf4c541bb0de3..970a05640de34 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -19,6 +19,8 @@ {{else if eq .HookType "telegram"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "msteams"}} {{else if eq .HookType "feishu"}} @@ -34,6 +36,7 @@ {{template "repo/settings/webhook/slack" .}} {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/telegram" .}} {{template "repo/settings/webhook/msteams" .}} {{template "repo/settings/webhook/feishu" .}} diff --git a/templates/repo/settings/webhook/teamcity.tmpl b/templates/repo/settings/webhook/teamcity.tmpl new file mode 100644 index 0000000000000..6faaf7b077bb0 --- /dev/null +++ b/templates/repo/settings/webhook/teamcity.tmpl @@ -0,0 +1,19 @@ +{{if eq .HookType "teamcity"}} +

{{.i18n.Tr "repo.settings.add_teamcity_hook_desc" "https://jetbrains.com/teamcity" | Str2html}}

+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+
+ + +
+ {{template "repo/settings/webhook/settings" .}} +
+{{end}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index e54f40d670aba..8866389a8ec32 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -11687,6 +11687,7 @@ "gitea", "gogs", "msteams", + "teamcity", "slack", "telegram", "feishu" From 158542413f079f527a86da06faf0c253c078b098 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:28:13 -0500 Subject: [PATCH 02/29] Create TeamCityHook form model. Add enum/strings referencing TeamCity --- models/webhook.go | 9 +++++++-- modules/auth/repo_form.go | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/models/webhook.go b/models/webhook.go index 54cd9b6565841..bca7c8adf0947 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -546,7 +546,7 @@ func copyDefaultWebhooksToRepo(e Engine, repoID int64) error { // \___|_ / \____/ \____/|__|_ \ |____| (____ /____ >__|_ \ // \/ \/ \/ \/ \/ -// HookTaskType is the type of an hook task +// HookTaskType is the type of a hook task type HookTaskType int // Types of hook tasks @@ -560,6 +560,7 @@ const ( MSTEAMS FEISHU MATRIX + TEAMCITY ) var hookTaskTypes = map[string]HookTaskType{ @@ -570,6 +571,7 @@ var hookTaskTypes = map[string]HookTaskType{ "dingtalk": DINGTALK, "telegram": TELEGRAM, "msteams": MSTEAMS, + "teamcity": TEAMCITY, "feishu": FEISHU, "matrix": MATRIX, } @@ -579,7 +581,7 @@ func ToHookTaskType(name string) HookTaskType { return hookTaskTypes[name] } -// Name returns the name of an hook task type +// Name returns the name of a hook task type func (t HookTaskType) Name() string { switch t { case GITEA: @@ -596,6 +598,8 @@ func (t HookTaskType) Name() string { return "telegram" case MSTEAMS: return "msteams" + case TEAMCITY: + return "teamcity" case FEISHU: return "feishu" case MATRIX: @@ -687,6 +691,7 @@ type HookTask struct { RepoID int64 `xorm:"INDEX"` HookID int64 UUID string + BearerToken string Type HookTaskType URL string `xorm:"TEXT"` Signature string `xorm:"TEXT"` diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 039b0cb583a09..cea76d0e6d2ca 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -267,6 +267,18 @@ func (f *NewGogshookForm) Validate(ctx *macaron.Context, errs binding.Errors) bi return validate(errs, ctx.Data, f, ctx.Locale) } +type NewTeamCityhookForm struct { + HostUrl string `binding:"Required;ValidUrl"` + AuthToken string `binding:"Required"` + VcsRootId string `binding:"Required"` + WebhookForm +} + +// Validate validates the fields +func (f *NewTeamCityhookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + // NewSlackHookForm form for creating slack hook type NewSlackHookForm struct { PayloadURL string `binding:"Required;ValidUrl"` From 90890b83e6e355b7cb10fb15ce7bb4b2604dae06 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:30:04 -0500 Subject: [PATCH 03/29] Add translations --- options/locale/locale_de-DE.ini | 3 +++ options/locale/locale_en-US.ini | 2 +- options/locale/locale_fa-IR.ini | 3 +++ options/locale/locale_fi-FI.ini | 3 +++ options/locale/locale_fr-FR.ini | 3 +++ options/locale/locale_hu-HU.ini | 5 ++++- options/locale/locale_id-ID.ini | 3 +++ options/locale/locale_it-IT.ini | 3 +++ options/locale/locale_ja-JP.ini | 3 +++ options/locale/locale_ko-KR.ini | 3 +++ options/locale/locale_lv-LV.ini | 3 +++ options/locale/locale_nl-NL.ini | 3 +++ options/locale/locale_pl-PL.ini | 3 +++ options/locale/locale_pt-BR.ini | 3 +++ options/locale/locale_pt-PT.ini | 3 +++ options/locale/locale_ru-RU.ini | 3 +++ options/locale/locale_sr-SP.ini | 3 +++ options/locale/locale_sv-SE.ini | 3 +++ options/locale/locale_tr-TR.ini | 3 +++ options/locale/locale_uk-UA.ini | 3 +++ options/locale/locale_zh-CN.ini | 3 +++ options/locale/locale_zh-HK.ini | 3 +++ options/locale/locale_zh-TW.ini | 3 +++ 23 files changed, 68 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 1b66d951a4b45..d74a996b4634c 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -1601,6 +1601,9 @@ settings.add_slack_hook_desc=Slack-Integration zu deinem Reposi settings.slack_token=Token settings.slack_domain=Domain settings.slack_channel=Kanal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Discord-Integration zu deinem Repository hinzufügen. settings.add_dingtalk_hook_desc=Dingtalk-Integration zu deinem Repository hinzufügen. settings.add_telegram_hook_desc=Telegram-Integration zu deinem Repository hinzufügen. diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 183815a062395..4c1d624b19843 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -954,7 +954,7 @@ issues.new.no_reviewers = No reviewers issues.new.add_reviewer_title = Request review issues.choose.get_started = Get Started issues.choose.blank = Default -issues.choose.blank_about = Create an issue from default template. +issues.choose.blank_about = Create an issue from default template. issues.no_ref = No Branch/Tag Specified issues.create = Create Issue issues.new_label = New Label diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 53d37174a25a3..bf866fc1943a9 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -1483,6 +1483,9 @@ settings.add_slack_hook_desc=درست کردن سستی در settings.slack_token=توکن settings.slack_domain=دامنه settings.slack_channel=کانال +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=درست کردن اختلاف‌ها در مخزن شما. settings.add_dingtalk_hook_desc=درست کردن Dingtalk در مخزن شما. settings.add_telegram_hook_desc=درست کردن تلگرام در مخزن شما. diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 1e137372c3bce..1b032950afaa6 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -900,6 +900,9 @@ settings.add_slack_hook_desc=Liitä Slack repoon. settings.slack_token=Pääsymerkki settings.slack_domain=Verkkotunnus settings.slack_channel=Kanava +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Liitä Discord repoon. settings.add_dingtalk_hook_desc=Liitä Dingtalk repoon. settings.add_telegram_hook_desc=Liitä Telegram repoon. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 39e98c5f217df..db9eaf25fe075 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1480,6 +1480,9 @@ settings.add_slack_hook_desc=Intégrer Slack au dépôt. settings.slack_token=Jeton settings.slack_domain=Domaine settings.slack_channel=Canal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Intégrer Discord au dépôt. settings.add_dingtalk_hook_desc=Intégrer Dingtalk au dépôt. settings.add_telegram_hook_desc=Intégrer Telegram au dépôt. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index a0dd371ee4863..9a26673d4c993 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -1215,6 +1215,9 @@ settings.add_slack_hook_desc=Slack integrálása a tárolóba. settings.slack_token=Token settings.slack_domain=Tartomány settings.slack_channel=Csatorna +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Discord integrálása a tárolóba. settings.add_dingtalk_hook_desc=Dingtalk integrálása a tárolóba. settings.add_telegram_hook_desc=Telegram integrálása a tárolóba. @@ -1545,7 +1548,7 @@ auths.tip.gitlab=Vegyen fel új alkalmazást itt: https://gitlab.com/profile/app auths.tip.google_plus=Szerezzen OAuth2 kliens hitelesítési adatokat a Google API konzolban (https://console.developers.google.com/) auths.tip.openid_connect=Használja az OpenID kapcsolódás felfedező URL-t (/.well-known/openid-configuration) a végpontok beállításához auths.tip.twitter=Menyjen ide: https://dev.twitter.com/apps, hozzon létre egy alkalmazást és győződjön meg róla, hogy az “Allow this application to be used to Sign in with Twitter” opció be van kapcsolva -auths.tip.discord=Vegyen fel új alkalmazást itt: +auths.tip.discord=Vegyen fel új alkalmazást itt: https://discordapp.com/developers/applications/me auths.tip.gitea=Regisztráljon új OAuth2 alkalmazást. Útmutató erről itt található: https://docs.gitea.io/en-us/oauth2-provider auths.edit=Hitelesítési forrás szerkesztése diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 2a3f9ea93d9c0..ed62652b518d3 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -993,6 +993,9 @@ settings.hook_type=Jenis Hook settings.slack_token=Token settings.slack_domain=Domain settings.slack_channel=Saluran +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Kunci Deploy settings.add_deploy_key=Tambahkan Kunci Deploy settings.title=Judul diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 51e92cc9e05fe..7c4fb73a5307b 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -1434,6 +1434,9 @@ settings.add_slack_hook_desc=Integra Slack nel tuo repository. settings.slack_token=Gettone settings.slack_domain=Dominio settings.slack_channel=Canale +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integra Discord nel tuo repository. settings.add_dingtalk_hook_desc=Integra Dingtalk nel tuo repository. settings.add_telegram_hook_desc=Integra Telegram nella tua repository. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 4f13c5b36e123..135fba2648f4d 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1611,6 +1611,9 @@ settings.add_slack_hook_desc=Slackをリポジトリと組み settings.slack_token=トークン settings.slack_domain=ドメイン settings.slack_channel=チャンネル +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Discordをリポジトリと組み合わせます。 settings.add_dingtalk_hook_desc=Dingtalkをリポジトリと組み合わせます。 settings.add_telegram_hook_desc=Telegramをリポジトリと組み合わせます。 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 92803197b8a65..f5df8610ca3ab 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -1096,6 +1096,9 @@ settings.add_slack_hook_desc=Slack을 저장소와 연동. settings.slack_token=토큰 settings.slack_domain=도메인 settings.slack_channel=채널 +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Discord를 저장소와 연동. settings.add_dingtalk_hook_desc=Dingtalk을 저장소와 연동. settings.deploy_keys=배포 키 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 499b601a0e601..9904fc5ce383e 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1583,6 +1583,9 @@ settings.add_slack_hook_desc=Integrēt Slack repozitorijā. settings.slack_token=Talons settings.slack_domain=Domēns settings.slack_channel=Kanāls +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integrēt Discord repozitorijā. settings.add_dingtalk_hook_desc=Integrēt Dingtalk repozitorijā. settings.add_telegram_hook_desc=Integrēt Telegram repozitorijā. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index a6058d0055ef6..b13513467abd6 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1423,6 +1423,9 @@ settings.hook_type=Type hook settings.slack_token=Slack token settings.slack_domain=Slack domein settings.slack_channel=Slack kanaal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_matrix_hook_desc=Integreer Matrix in uw repository. settings.add_feishu_hook_desc=Integreer Feishu in uw repository. settings.deploy_keys=Installeer sleutels diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 813813e4d5ef3..361850561cf24 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1552,6 +1552,9 @@ settings.add_slack_hook_desc=Zintegruj Slacka ze swoim repozyto settings.slack_token=Token settings.slack_domain=Domena settings.slack_channel=Kanał +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Zintegruj Discorda ze swoim repozytorium. settings.add_dingtalk_hook_desc=Zintegruj Dingtalka ze swoim repozytorium. settings.add_telegram_hook_desc=Zintegruj Telegrama ze swoim repozytorium. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 7eb75be1b8e0e..7dfc82dce0002 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1410,6 +1410,9 @@ settings.add_slack_hook_desc=Integre o Slack em seu repositóri settings.slack_token=Token settings.slack_domain=Domínio settings.slack_channel=Canal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integre o Discord em seu repositório. settings.add_dingtalk_hook_desc=Integre o Dingtalk em seu repositório. settings.add_telegram_hook_desc=Integre Telegram no seu repositório. diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 41bcf63cc7624..18fcc347053ff 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1583,6 +1583,9 @@ settings.add_slack_hook_desc=Integrar Slack no seu repositório settings.slack_token=Código settings.slack_domain=Domínio settings.slack_channel=Canal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integrar Discord no seu repositório. settings.add_dingtalk_hook_desc=Integrar Dingtalk no seu repositório. settings.add_telegram_hook_desc=Integrar Telegram no seu repositório. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index a1ba53e186708..23570fbc81418 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1583,6 +1583,9 @@ settings.add_slack_hook_desc=Добавить интеграцию с Discord. settings.add_dingtalk_hook_desc=Добавить интеграцию с Dingtalk в ваш репозиторий. settings.add_telegram_hook_desc=Добавить интеграцию с Telegram в ваш репозиторий. diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 488f207218215..ccacaa9974769 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -418,6 +418,9 @@ settings.hook_type=Тип Hook-а settings.slack_token=Токен settings.slack_domain=Домен settings.slack_channel=Канал +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Кључеви за распоређивање settings.add_deploy_key=Додај кључ за распоређивање settings.title=Наслов diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index fa10c0ed02b8d..0791c72eefb78 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1388,6 +1388,9 @@ settings.add_slack_hook_desc=Integrera Slack med din utveckling settings.slack_token=Pollett settings.slack_domain=Domän settings.slack_channel=Kanal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Integrera Discord med din utvecklingskatalog. settings.add_dingtalk_hook_desc=Integrera Dingtalk med din utvecklingskatalog. settings.add_telegram_hook_desc=Integrera Telegram med din utvecklingskatalog. diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index efd4043f31c01..dfe59bc0ad6fc 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -1611,6 +1611,9 @@ settings.add_slack_hook_desc=Deponuza Slack entegre edin. settings.slack_token=Erişim Anahtarı settings.slack_domain=Alan Adı settings.slack_channel=Kanal +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Deponuza Discord entegre edin. settings.add_dingtalk_hook_desc=Deponuza Dingtalk entegre edin. settings.add_telegram_hook_desc=Deponuza Telegram entegre edin. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 1781541d48811..5338ac587611a 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -1557,6 +1557,9 @@ settings.add_slack_hook_desc=Інтеграція Slack у ва settings.slack_token=Токен settings.slack_domain=Домен settings.slack_channel=Канал +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=Інтеграція Discord у ваш репозиторії. settings.add_dingtalk_hook_desc=Інтеграція Dingtalk у ваш репозиторії. settings.add_telegram_hook_desc=Інтегруйте Telegram у своє сховище. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index d619f181d7d7f..69ffd4cde7f13 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1583,6 +1583,9 @@ settings.add_slack_hook_desc=将 Slack 集成到您的仓库中 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=频道 +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=将 Discord 集成到您的仓库中。 settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的仓库中。 settings.add_telegram_hook_desc=将 Telegram 集成到您的仓库中。 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 0028d82b49806..917f7d8f1c012 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -503,6 +503,9 @@ settings.hook_type=Hook 類型 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=頻道 +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=管理部署金鑰 settings.add_deploy_key=新增部署金鑰 settings.title=標題 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 316f07c403cd2..e21498f73a89e 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1419,6 +1419,9 @@ settings.add_slack_hook_desc=將 Slack 整合到您的儲存庫 settings.slack_token=Token settings.slack_domain=域名 settings.slack_channel=頻道 +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_discord_hook_desc=將 Discord 整合到您的儲存庫。 settings.add_dingtalk_hook_desc=將 Dingtalk 整合到您的儲存庫。 settings.add_telegram_hook_desc=將 Telegram 整合到您的儲存庫。 From 626c5d3be0a07ff8e17af09d7058ba4c09341cac Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:31:11 -0500 Subject: [PATCH 04/29] Add Meta and HookHandler. No interface matching since TeamCity doesn't have a body for posts. Add teamcity to webhook types --- modules/setting/webhook.go | 2 +- modules/webhook/teamcity.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 modules/webhook/teamcity.go diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go index 4a0c593c8d120..442a431dbd149 100644 --- a/modules/setting/webhook.go +++ b/modules/setting/webhook.go @@ -36,7 +36,7 @@ func newWebhookService() { Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000) Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() - Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix"} + Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "teamcity", "feishu", "matrix"} Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("") if Webhook.ProxyURL != "" { diff --git a/modules/webhook/teamcity.go b/modules/webhook/teamcity.go new file mode 100644 index 0000000000000..c9886c3eb926d --- /dev/null +++ b/modules/webhook/teamcity.go @@ -0,0 +1,25 @@ +package webhook + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "encoding/json" +) + +type ( + TeamCityMeta struct { + HostUrl string `json:"host_url"` + AuthToken string `json:"auth_token"` + VcsRootId string `json:"vcs_root_id"` + } +) + +func GetTeamCityHook(w *models.Webhook) *TeamCityMeta { + s := &TeamCityMeta{} + + if err := json.Unmarshal([]byte(w.Meta), s); err != nil { + log.Error("webhook.GetTeamCityHook(%d): %v", w.ID, err) + } + + return s +} From e26ea44dbfbb14076d950c52ab4f8d6fbaabc48a Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:38:47 -0500 Subject: [PATCH 05/29] Wire in TeamCity Webhook New/Edit post handlers. Add handling for TeamCity Hook Task. TeamCity needs an 'Authorization: Bearer ' header to work. Added a new property to models\HookTask and a check for value. If the value is there, the header is added. Otherwise, it's omitted. --- modules/webhook/deliver.go | 5 +- modules/webhook/webhook.go | 7 +++ routers/repo/webhook.go | 123 +++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-) diff --git a/modules/webhook/deliver.go b/modules/webhook/deliver.go index c29fcb6fa9e47..e54439732f537 100644 --- a/modules/webhook/deliver.go +++ b/modules/webhook/deliver.go @@ -50,7 +50,6 @@ func Deliver(t *models.HookTask) error { if err != nil { return err } - req.Header.Set("Content-Type", "application/json") case models.ContentTypeForm: var forms = url.Values{ @@ -91,6 +90,10 @@ func Deliver(t *models.HookTask) error { return fmt.Errorf("Invalid http method for webhook: [%d] %v", t.ID, t.HTTPMethod) } + if t.BearerToken != "" { + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", t.BearerToken)) + } + req.Header.Add("X-Gitea-Delivery", t.UUID) req.Header.Add("X-Gitea-Event", t.EventType.Event()) req.Header.Add("X-Gitea-Signature", t.Signature) diff --git a/modules/webhook/webhook.go b/modules/webhook/webhook.go index 2ef150210e71c..1d76d46c417fa 100644 --- a/modules/webhook/webhook.go +++ b/modules/webhook/webhook.go @@ -95,6 +95,8 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo var payloader api.Payloader var err error + var authToken string + // Use separate objects so modifications won't be made on payload on non-Gogs/Gitea type hooks. switch w.HookTaskType { case models.SLACK: @@ -132,6 +134,10 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo if err != nil { return fmt.Errorf("GetMatrixPayload: %v", err) } + case models.TEAMCITY: + payloader = p // TeamCity POST hooks don't have a body + hook := GetTeamCityHook(w) // Reuse the JSON marshalling + authToken = hook.AuthToken default: p.SetSecret(w.Secret) payloader = p @@ -153,6 +159,7 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo if err = models.CreateHookTask(&models.HookTask{ RepoID: repo.ID, + BearerToken: authToken, HookID: w.ID, Type: w.HookTaskType, URL: w.URL, diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index bec401021cc5a..738caa5f0463e 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -9,6 +9,8 @@ import ( "encoding/json" "errors" "fmt" + "net/http" + "net/url" "path" "strings" @@ -223,6 +225,64 @@ func GiteaHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { ctx.Redirect(orCtx.Link) } +func TeamCityHooksNewPost(ctx *context.Context, form auth.NewTeamCityhookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") + ctx.Data["PageIsSettingHooks"] = true + ctx.Data["PageIsSettingHooksNew"] = true + ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + ctx.Data["HookType"] = models.TEAMCITY.Name() + + orCtx, err := getOrgRepoCtx(ctx) + if err != nil { + ctx.ServerError("getOrgRepoCtx", err) + } + ctx.Data["BaseLink"] = orCtx.Link + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + meta, err := json.Marshal(&webhook.TeamCityMeta{ + HostUrl: form.HostUrl, + AuthToken: form.AuthToken, + VcsRootId: form.VcsRootId, + }) + if err != nil { + ctx.ServerError("Marshal", err) + return + } + + payloadUrl, err := buildTeamCityUrl(form) + if err != nil { + ctx.ServerError("buildTeamCityUrl", err) + return + } + + w := &models.Webhook{ + RepoID: orCtx.RepoID, + URL: payloadUrl, // <- lots of repeated code here...should be refactored out. + ContentType: models.ContentTypeForm, + HookEvent: ParseHookEvent(form.WebhookForm), + IsActive: form.Active, + HookTaskType: models.TEAMCITY, + HTTPMethod: http.MethodPost, + Meta: string(meta), + OrgID: orCtx.OrgID, + IsSystemWebhook: orCtx.IsSystemWebhook, + } + if err := w.UpdateEvent(); err != nil { + ctx.ServerError("UpdateEvent", err) + return + } else if err := models.CreateWebhook(w); err != nil { + ctx.ServerError("CreateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) + ctx.Redirect(orCtx.Link) +} + // GogsHooksNewPost response for creating webhook func GogsHooksNewPost(ctx *context.Context, form auth.NewGogshookForm) { newGogsWebhookPost(ctx, form, models.GOGS) @@ -656,6 +716,8 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) { ctx.Data["TelegramHook"] = webhook.GetTelegramHook(w) case models.MATRIX: ctx.Data["MatrixHook"] = webhook.GetMatrixHook(w) + case models.TEAMCITY: + ctx.Data["TeamCityHook"] = webhook.GetTeamCityHook(w) } ctx.Data["History"], err = w.History(1) @@ -759,6 +821,67 @@ func GogsHooksEditPost(ctx *context.Context, form auth.NewGogshookForm) { ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) } +// TeamCityHooksEditPost response for editing teamcity hook +func TeamCityHooksEditPost(ctx *context.Context, form auth.NewTeamCityhookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings") + ctx.Data["PageIsSettingHooks"] = true + ctx.Data["PageIsSettingHooksEdit"] = true + + orCtx, w := checkWebhook(ctx) + + if ctx.Written() { + return + } + + ctx.Data["Webhook"] = w + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + meta, err := json.Marshal(&webhook.TeamCityMeta{ + HostUrl: form.HostUrl, + AuthToken: form.AuthToken, + VcsRootId: form.VcsRootId, + }) + if err != nil { + ctx.ServerError("Marshal", err) + return + } + + w.URL, err = buildTeamCityUrl(form) + if err != nil { + ctx.ServerError("buildTeamCityUrl", err) + return + } + + w.HTTPMethod = http.MethodPost + w.Meta = string(meta) + w.HookEvent = ParseHookEvent(form.WebhookForm) + w.IsActive = form.Active + + if err := w.UpdateEvent(); err != nil { + ctx.ServerError("UpdateEvent", err) + return + } else if err := models.UpdateWebhook(w); err != nil { + ctx.ServerError("UpdateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) + ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) +} + +func buildTeamCityUrl(form auth.NewTeamCityhookForm) (string, error) { + tcUrl, err := url.Parse(form.HostUrl) + if err != nil { + return "", err + } + + return fmt.Sprintf("%s/app/rest/vcs-root-instances/commitHookNotification?locator=vcsRoot:%s", tcUrl, form.VcsRootId), nil +} + // SlackHooksEditPost response for editing slack hook func SlackHooksEditPost(ctx *context.Context, form auth.NewSlackHookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings") From faa0f9894dccfe6c733f4b8818ca1bd99645554d Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:45:36 -0500 Subject: [PATCH 06/29] Add Routes --- routers/routes/routes.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index f60af5dad0400..4500a366e8653 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -479,6 +479,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/new", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) m.Post("/feishu/new", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksNewPost) m.Get("/:id", repo.WebHooksEdit) m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) @@ -489,6 +490,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/:id", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/:id", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) m.Post("/feishu/:id", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksEditPost) + m.Post("/teamcity/:id", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksEditPost) }) m.Group("/auths", func() { @@ -589,6 +591,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/new", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) m.Post("/feishu/new", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksNewPost) m.Get("/:id", repo.WebHooksEdit) m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) @@ -599,6 +602,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/:id", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/:id", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) m.Post("/feishu/:id", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksEditPost) + m.Post("/teamcity/:id", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksEditPost) }) m.Group("/labels", func() { @@ -665,6 +669,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/new", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) m.Post("/feishu/new", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksNewPost) m.Get("/:id", repo.WebHooksEdit) m.Post("/:id/test", repo.TestWebhook) m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) @@ -676,6 +681,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/matrix/:id", bindIgnErr(auth.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/:id", bindIgnErr(auth.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) m.Post("/feishu/:id", bindIgnErr(auth.NewFeishuHookForm{}), repo.FeishuHooksEditPost) + m.Post("/teamcity/:id", bindIgnErr(auth.NewTeamCityhookForm{}), repo.TeamCityHooksEditPost) m.Group("/git", func() { m.Get("", repo.GitHooks) From a04e2b8edbfe91f2f6c3626a83270492beccf647 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 02:04:22 -0500 Subject: [PATCH 07/29] Update Teamcity.png, remove hidden whitespace. --- public/img/teamcity.png | Bin 5563 -> 15900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/img/teamcity.png b/public/img/teamcity.png index 2ddee0dc719f4dcec00fbd9674b76210d6e2c91e..8c9a2a6a0da902b0ee64f382406baab22b98a23c 100644 GIT binary patch literal 15900 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV From f7a542710f89440f9e2969b5489fb96f20b76f05 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:27:09 -0500 Subject: [PATCH 08/29] Create templates and translation strings. --- options/locale/locale_bg-BG.ini | 3 +++ options/locale/locale_en-US.ini | 4 ++++ public/img/teamcity.png | Bin 0 -> 5563 bytes templates/admin/hook_new.tmpl | 2 ++ templates/org/settings/hook_new.tmpl | 3 +++ templates/repo/settings/webhook/new.tmpl | 3 +++ templates/repo/settings/webhook/teamcity.tmpl | 19 ++++++++++++++++++ templates/swagger/v1_json.tmpl | 1 + 8 files changed, 35 insertions(+) create mode 100644 public/img/teamcity.png create mode 100644 templates/repo/settings/webhook/teamcity.tmpl diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 4354ed1cdeb12..1cd0edecb175f 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -891,6 +891,9 @@ settings.hook_type=Тип на куката settings.slack_token=API ключ settings.slack_domain=Домейн settings.slack_channel=Канал +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Ключове за внедряване settings.add_deploy_key=Добави ключ за внедряване settings.title=Заглавие diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index e91016bdc0506..7ce0f6737c8ea 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1943,6 +1943,9 @@ settings.hook_type = Hook Type settings.slack_token = Token settings.slack_domain = Domain settings.slack_channel = Channel +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.add_web_hook_desc = Integrate %s into your repository. settings.web_hook_name_gitea = Gitea settings.web_hook_name_gogs = Gogs @@ -1952,6 +1955,7 @@ settings.web_hook_name_dingtalk = DingTalk settings.web_hook_name_telegram = Telegram settings.web_hook_name_matrix = Matrix settings.web_hook_name_msteams = Microsoft Teams +settings.web_hook_name_teamcity = TeamCity settings.web_hook_name_feishu_or_larksuite = Feishu / Lark Suite settings.web_hook_name_feishu = Feishu settings.web_hook_name_larksuite = Lark Suite diff --git a/public/img/teamcity.png b/public/img/teamcity.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddee0dc719f4dcec00fbd9674b76210d6e2c91e GIT binary patch literal 5563 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV literal 0 HcmV?d00001 diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index 049e54ef833cf..fc4d27227296b 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -28,6 +28,8 @@ {{else if eq .HookType "msteams"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index 5e8ebb51e9427..d4fb2335187e5 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -23,6 +23,8 @@ {{else if eq .HookType "msteams"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} @@ -42,6 +44,7 @@ {{template "repo/settings/webhook/dingtalk" .}} {{template "repo/settings/webhook/telegram" .}} {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/feishu" .}} {{template "repo/settings/webhook/matrix" .}} {{template "repo/settings/webhook/wechatwork" .}} diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index a438a4c71a3d7..7772bf6c550d1 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -21,6 +21,8 @@ {{else if eq .HookType "msteams"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} @@ -38,6 +40,7 @@ {{template "repo/settings/webhook/slack" .}} {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/telegram" .}} {{template "repo/settings/webhook/msteams" .}} {{template "repo/settings/webhook/feishu" .}} diff --git a/templates/repo/settings/webhook/teamcity.tmpl b/templates/repo/settings/webhook/teamcity.tmpl new file mode 100644 index 0000000000000..6faaf7b077bb0 --- /dev/null +++ b/templates/repo/settings/webhook/teamcity.tmpl @@ -0,0 +1,19 @@ +{{if eq .HookType "teamcity"}} +

{{.i18n.Tr "repo.settings.add_teamcity_hook_desc" "https://jetbrains.com/teamcity" | Str2html}}

+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+
+ + +
+ {{template "repo/settings/webhook/settings" .}} +
+{{end}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 497636e78140a..0d1e688ccea17 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -13514,6 +13514,7 @@ "gitea", "gogs", "msteams", + "teamcity", "slack", "telegram", "feishu", From b4f1d8a2a7b50ea360d38b9cdd8855e5bee17999 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:28:13 -0500 Subject: [PATCH 09/29] Create TeamCityHook form model. Add enum/strings referencing TeamCity --- models/webhook.go | 0 modules/auth/repo_form.go | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/webhook.go create mode 100644 modules/auth/repo_form.go diff --git a/models/webhook.go b/models/webhook.go new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go new file mode 100644 index 0000000000000..e69de29bb2d1d From af787b4ac723b06705578285cdc64f95c25eff2c Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:30:04 -0500 Subject: [PATCH 10/29] Add translations --- options/locale/locale_id-ID.ini | 3 +++ options/locale/locale_zh-HK.ini | 3 +++ 2 files changed, 6 insertions(+) diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index a7deec0b21113..b52d4a723601b 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -966,6 +966,9 @@ settings.hook_type=Jenis Hook settings.slack_token=Token settings.slack_domain=Domain settings.slack_channel=Saluran +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Kunci Deploy settings.add_deploy_key=Tambahkan Kunci Deploy settings.title=Judul diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index c9349cece7e18..075ab5f14ffeb 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -513,6 +513,9 @@ settings.hook_type=Hook 類型 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=頻道 +settings.teamcity_host_url = Host URL +settings.teamcity_vcs_root_id = VCS Root ID +settings.teamcity_auth_token = Authentication Token settings.deploy_keys=管理部署金鑰 settings.add_deploy_key=新增部署金鑰 settings.title=標題 From 6f685b701ab9c3dc4c69cb356d65c6f15b8dd614 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:31:11 -0500 Subject: [PATCH 11/29] Add Meta and HookHandler. No interface matching since TeamCity doesn't have a body for posts. Add teamcity to webhook types --- modules/setting/webhook.go | 2 +- modules/webhook/teamcity.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 modules/webhook/teamcity.go diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go index 0bfd7dcb4dd3f..755a9d88422cc 100644 --- a/modules/setting/webhook.go +++ b/modules/setting/webhook.go @@ -36,7 +36,7 @@ func newWebhookService() { Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("") - Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"} + Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "teamcity", "feishu", "matrix", "wechatwork", "packagist"} Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("") if Webhook.ProxyURL != "" { diff --git a/modules/webhook/teamcity.go b/modules/webhook/teamcity.go new file mode 100644 index 0000000000000..c9886c3eb926d --- /dev/null +++ b/modules/webhook/teamcity.go @@ -0,0 +1,25 @@ +package webhook + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "encoding/json" +) + +type ( + TeamCityMeta struct { + HostUrl string `json:"host_url"` + AuthToken string `json:"auth_token"` + VcsRootId string `json:"vcs_root_id"` + } +) + +func GetTeamCityHook(w *models.Webhook) *TeamCityMeta { + s := &TeamCityMeta{} + + if err := json.Unmarshal([]byte(w.Meta), s); err != nil { + log.Error("webhook.GetTeamCityHook(%d): %v", w.ID, err) + } + + return s +} From 0c003403c4b40a0a9c5a4f2f0fcfb2089e2a2247 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:38:47 -0500 Subject: [PATCH 12/29] Wire in TeamCity Webhook New/Edit post handlers. Add handling for TeamCity Hook Task. TeamCity needs an 'Authorization: Bearer ' header to work. Added a new property to models\HookTask and a check for value. If the value is there, the header is added. Otherwise, it's omitted. --- modules/webhook/deliver.go | 0 modules/webhook/webhook.go | 0 routers/repo/webhook.go | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 modules/webhook/deliver.go create mode 100644 modules/webhook/webhook.go create mode 100644 routers/repo/webhook.go diff --git a/modules/webhook/deliver.go b/modules/webhook/deliver.go new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/modules/webhook/webhook.go b/modules/webhook/webhook.go new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go new file mode 100644 index 0000000000000..e69de29bb2d1d From e5fd0095a3738977f5603f8e3ac1debcc161ab8c Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 01:45:36 -0500 Subject: [PATCH 13/29] Add Routes --- routers/routes/routes.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 routers/routes/routes.go diff --git a/routers/routes/routes.go b/routers/routes/routes.go new file mode 100644 index 0000000000000..e69de29bb2d1d From 634db8f14e7aced4e04e6fba1dc4f06c2bbedcbd Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 02:04:22 -0500 Subject: [PATCH 14/29] Update Teamcity.png, remove hidden whitespace. --- public/img/teamcity.png | Bin 5563 -> 15900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/img/teamcity.png b/public/img/teamcity.png index 2ddee0dc719f4dcec00fbd9674b76210d6e2c91e..8c9a2a6a0da902b0ee64f382406baab22b98a23c 100644 GIT binary patch literal 15900 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV From ffea42ef7c6022df47acd7bef50b2c290db4c9c9 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 13:05:30 -0500 Subject: [PATCH 15/29] Rebase onto latest. Resolve merge conflicts. --- public/img/teamcity.png | Bin 15900 -> 5563 bytes templates/admin/hook_new.tmpl | 2 ++ templates/org/settings/hook_new.tmpl | 3 +++ .../repo/settings/webhook/base_list.tmpl | 3 +++ templates/repo/settings/webhook/new.tmpl | 2 +- 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/public/img/teamcity.png b/public/img/teamcity.png index 8c9a2a6a0da902b0ee64f382406baab22b98a23c..2ddee0dc719f4dcec00fbd9674b76210d6e2c91e 100644 GIT binary patch literal 5563 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV literal 15900 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 {{else if eq .HookType "telegram"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index d4fb2335187e5..a42f6ba39014e 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -21,6 +21,8 @@ {{else if eq .HookType "telegram"}} + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} @@ -43,6 +45,7 @@ {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/msteams" .}} {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/feishu" .}} diff --git a/templates/repo/settings/webhook/base_list.tmpl b/templates/repo/settings/webhook/base_list.tmpl index b1a3771bdba11..588ffe49ab0a5 100644 --- a/templates/repo/settings/webhook/base_list.tmpl +++ b/templates/repo/settings/webhook/base_list.tmpl @@ -25,6 +25,9 @@ {{.i18n.Tr "repo.settings.web_hook_name_msteams"}} + + {{.i18n.Tr "repo.settings.web_hook_name_teamcity"}} + {{.i18n.Tr "repo.settings.web_hook_name_feishu_or_larksuite"}} diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index 7772bf6c550d1..5f4ed79dd22b0 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -40,9 +40,9 @@ {{template "repo/settings/webhook/slack" .}} {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} - {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/telegram" .}} {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/feishu" .}} {{template "repo/settings/webhook/matrix" .}} {{template "repo/settings/webhook/wechatwork" .}} From ec32633fcfc0b115bc32d9c201eb0798b7ad929e Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 13:11:39 -0500 Subject: [PATCH 16/29] Revert "Add translations" This reverts commit 6c68fa57ece29258f0e5cdf0a0b962d0d2f34265. --- options/locale/locale_id-ID.ini | 3 --- options/locale/locale_zh-HK.ini | 3 --- 2 files changed, 6 deletions(-) diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index b52d4a723601b..a7deec0b21113 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -966,9 +966,6 @@ settings.hook_type=Jenis Hook settings.slack_token=Token settings.slack_domain=Domain settings.slack_channel=Saluran -settings.teamcity_host_url = Host URL -settings.teamcity_vcs_root_id = VCS Root ID -settings.teamcity_auth_token = Authentication Token settings.deploy_keys=Kunci Deploy settings.add_deploy_key=Tambahkan Kunci Deploy settings.title=Judul diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 075ab5f14ffeb..c9349cece7e18 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -513,9 +513,6 @@ settings.hook_type=Hook 類型 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=頻道 -settings.teamcity_host_url = Host URL -settings.teamcity_vcs_root_id = VCS Root ID -settings.teamcity_auth_token = Authentication Token settings.deploy_keys=管理部署金鑰 settings.add_deploy_key=新增部署金鑰 settings.title=標題 From 86435f948da43e4ba3d75cd71aea498a3086130c Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 13:23:01 -0500 Subject: [PATCH 17/29] Add TeamCityHookForm. --- services/forms/repo_form.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index b32bd3cafd9d3..067281af42526 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -372,6 +372,19 @@ func (f *NewMSTeamsHookForm) Validate(req *http.Request, errs binding.Errors) bi return middleware.Validate(errs, ctx.Data, f, ctx.Locale) } +type NewTeamCityHookForm struct { + HostUrl string `binding:"Required;ValidUrl"` + AuthToken string `binding:"Required"` + VcsRootId string `binding:"Required"` + WebhookForm +} + +// Validate validates the fields +func (f *NewTeamCityHookForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { + ctx := context.GetContext(req) + return middleware.Validate(errs, ctx.Data, f, ctx.Locale) +} + // NewFeishuHookForm form for creating feishu hook type NewFeishuHookForm struct { PayloadURL string `binding:"Required;ValidUrl"` From cc51e4207b63a5f80500632b60cb092aadfdcab1 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 14:05:15 -0500 Subject: [PATCH 18/29] Add Repo Webhooks for TeamCity with New and Edit handlers. --- models/webhook/webhook.go | 1 + routers/web/repo/webhook.go | 124 ++++++++++++++++++++++ {modules => services}/webhook/teamcity.go | 9 +- 3 files changed, 130 insertions(+), 4 deletions(-) rename {modules => services}/webhook/teamcity.go (63%) diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index ffc9b72b64d88..4e6d0ebf68f82 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -158,6 +158,7 @@ const ( DINGTALK HookType = "dingtalk" TELEGRAM HookType = "telegram" MSTEAMS HookType = "msteams" + TEAMCITY HookType = "teamcity" FEISHU HookType = "feishu" MATRIX HookType = "matrix" WECHATWORK HookType = "wechatwork" diff --git a/routers/web/repo/webhook.go b/routers/web/repo/webhook.go index fb984de7f5857..d058de101803e 100644 --- a/routers/web/repo/webhook.go +++ b/routers/web/repo/webhook.go @@ -535,6 +535,64 @@ func MSTeamsHooksNewPost(ctx *context.Context) { ctx.Redirect(orCtx.Link) } +func TeamCityHooksNewPost(ctx *context.Context, form *forms.NewTeamCityHookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") + ctx.Data["PageIsSettingHooks"] = true + ctx.Data["PageIsSettingHooksNew"] = true + ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook.HookEvent{}} + ctx.Data["HookType"] = webhook.TEAMCITY + + orCtx, err := getOrgRepoCtx(ctx) + if err != nil { + ctx.ServerError("getOrgRepoCtx", err) + } + ctx.Data["BaseLink"] = orCtx.Link + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + meta, err := json.Marshal(&webhook_service.TeamCityMeta{ + HostUrl: form.HostUrl, + AuthToken: form.AuthToken, + VcsRootId: form.VcsRootId, + }) + if err != nil { + ctx.ServerError("Marshal", err) + return + } + + payloadUrl, err := buildTeamCityUrl(form) + if err != nil { + ctx.ServerError("buildTeamCityUrl", err) + return + } + + w := &webhook.Webhook{ + RepoID: orCtx.RepoID, + URL: payloadUrl, + ContentType: webhook.ContentTypeForm, + HookEvent: ParseHookEvent(form.WebhookForm), + IsActive: form.Active, + Type: webhook.TEAMCITY, + HTTPMethod: http.MethodPost, + Meta: string(meta), + OrgID: orCtx.OrgID, + IsSystemWebhook: orCtx.IsSystemWebhook, + } + if err := w.UpdateEvent(); err != nil { + ctx.ServerError("UpdateEvent", err) + return + } else if err := webhook.CreateWebhook(db.DefaultContext, w); err != nil { + ctx.ServerError("CreateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) + ctx.Redirect(orCtx.Link) +} + // SlackHooksNewPost response for creating slack hook func SlackHooksNewPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.NewSlackHookForm) @@ -770,6 +828,8 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *webhook.Webhook) { ctx.Data["DiscordHook"] = webhook_service.GetDiscordHook(w) case webhook.TELEGRAM: ctx.Data["TelegramHook"] = webhook_service.GetTelegramHook(w) + case webhook.TEAMCITY: + ctx.Data["TeamCityHook"] = webhook_service.GetTeamCityHook(w) case webhook.MATRIX: ctx.Data["MatrixHook"] = webhook_service.GetMatrixHook(w) case webhook.PACKAGIST: @@ -1126,6 +1186,70 @@ func MSTeamsHooksEditPost(ctx *context.Context) { ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) } +// TeamCityHooksEditPost response for editing teamcity hook +func TeamCityHooksEditPost(ctx *context.Context) { + form := web.GetForm(ctx).(*forms.NewTeamCityHookForm) + + ctx.Data["Title"] = ctx.Tr("repo.settings") + ctx.Data["PageIsSettingHooks"] = true + ctx.Data["PageIsSettingHooksEdit"] = true + + orCtx, w := checkWebhook(ctx) + + if ctx.Written() { + return + } + + ctx.Data["Webhook"] = w + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + meta, err := json.Marshal(&webhook_service.TeamCityMeta{ + HostUrl: form.HostUrl, + AuthToken: form.AuthToken, + VcsRootId: form.VcsRootId, + }) + + if err != nil { + ctx.ServerError("Marshal", err) + return + } + + w.URL, err = buildTeamCityUrl(form) + if err != nil { + ctx.ServerError("buildTeamCityUrl", err) + return + } + + w.HTTPMethod = http.MethodPost + w.Meta = string(meta) + w.HookEvent = ParseHookEvent(form.WebhookForm) + w.IsActive = form.Active + + if err := w.UpdateEvent(); err != nil { + ctx.ServerError("UpdateEvent", err) + return + } else if err := webhook.UpdateWebhook(w); err != nil { + ctx.ServerError("UpdateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) + ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) +} + +func buildTeamCityUrl(meta *forms.NewTeamCityHookForm) (string, error) { + tcUrl, err := url.Parse(meta.HostUrl) + if err != nil { + return "", err + } + + return fmt.Sprintf("%s/app/rest/vcs-root-instances/commitHookNotification?locator=vcsRoot:%s", tcUrl, meta.VcsRootId), nil +} + // FeishuHooksEditPost response for editing feishu hook func FeishuHooksEditPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.NewFeishuHookForm) diff --git a/modules/webhook/teamcity.go b/services/webhook/teamcity.go similarity index 63% rename from modules/webhook/teamcity.go rename to services/webhook/teamcity.go index c9886c3eb926d..16743c70eef59 100644 --- a/modules/webhook/teamcity.go +++ b/services/webhook/teamcity.go @@ -1,12 +1,14 @@ package webhook import ( - "code.gitea.io/gitea/models" + webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/log" "encoding/json" ) type ( + + // TeamCityMeta contains metadata for the TeamCity WebHook TeamCityMeta struct { HostUrl string `json:"host_url"` AuthToken string `json:"auth_token"` @@ -14,12 +16,11 @@ type ( } ) -func GetTeamCityHook(w *models.Webhook) *TeamCityMeta { +// GetTeamCityHook returns TeamCity metadata +func GetTeamCityHook(w *webhook_model.Webhook) *TeamCityMeta { s := &TeamCityMeta{} - if err := json.Unmarshal([]byte(w.Meta), s); err != nil { log.Error("webhook.GetTeamCityHook(%d): %v", w.ID, err) } - return s } From 47805cb9418afec4b582bdadb599ba05b6594f97 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 14:07:11 -0500 Subject: [PATCH 19/29] Add TeamCity New/Edit Post webhooks to routes. --- routers/web/web.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/routers/web/web.go b/routers/web/web.go index 60a379aef8580..10d69e0eab4a1 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -447,6 +447,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost) @@ -462,6 +463,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost) @@ -561,6 +563,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Group("/{id}", func() { @@ -575,6 +578,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) }, webhooksEnabled) @@ -658,6 +662,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost) @@ -674,6 +679,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost) From cd5bbced3daf26f51c5e19f75669a92970a2d74f Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 16:32:47 -0500 Subject: [PATCH 20/29] Fix TeamCity hook signatures and templates. Use new references. --- routers/web/repo/webhook.go | 4 +++- routers/web/web.go | 12 ++++++------ templates/admin/hook_new.tmpl | 2 +- templates/org/settings/hook_new.tmpl | 2 +- templates/repo/settings/webhook/teamcity.tmpl | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/routers/web/repo/webhook.go b/routers/web/repo/webhook.go index d058de101803e..1ade3bf2549ef 100644 --- a/routers/web/repo/webhook.go +++ b/routers/web/repo/webhook.go @@ -535,7 +535,9 @@ func MSTeamsHooksNewPost(ctx *context.Context) { ctx.Redirect(orCtx.Link) } -func TeamCityHooksNewPost(ctx *context.Context, form *forms.NewTeamCityHookForm) { +// TeamCityHooksNewPost response for creating TeamCity hook +func TeamCityHooksNewPost(ctx *context.Context) { + form := web.GetForm(ctx).(*forms.NewTeamCityHookForm) ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") ctx.Data["PageIsSettingHooks"] = true ctx.Data["PageIsSettingHooksNew"] = true diff --git a/routers/web/web.go b/routers/web/web.go index 10d69e0eab4a1..dd532f029e524 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -447,7 +447,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) - m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost) @@ -463,7 +463,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) - m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost) @@ -563,7 +563,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) - m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Group("/{id}", func() { @@ -578,7 +578,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) - m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) }, webhooksEnabled) @@ -662,7 +662,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) - m.Post("/teamcity/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksNewPost) + m.Post("/teamcity/new", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost) @@ -679,7 +679,7 @@ func RegisterRoutes(m *web.Route) { m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) - m.Post("/teamcity/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.TeamCityHooksEditPost) + m.Post("/teamcity/{id}", bindIgnErr(forms.NewTeamCityHookForm{}), repo.TeamCityHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost) diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index 38cb67711444a..f34513130092d 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -27,7 +27,7 @@ {{else if eq .HookType "telegram"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index a42f6ba39014e..e1b22803e8291 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -22,7 +22,7 @@ {{else if eq .HookType "telegram"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} diff --git a/templates/repo/settings/webhook/teamcity.tmpl b/templates/repo/settings/webhook/teamcity.tmpl index 6faaf7b077bb0..8e42bfdcd45b1 100644 --- a/templates/repo/settings/webhook/teamcity.tmpl +++ b/templates/repo/settings/webhook/teamcity.tmpl @@ -1,5 +1,5 @@ {{if eq .HookType "teamcity"}} -

{{.i18n.Tr "repo.settings.add_teamcity_hook_desc" "https://jetbrains.com/teamcity" | Str2html}}

+

{{.i18n.Tr "repo.settings.add_web_hook_desc" "https://jetbrains.com/teamcity" (.i18n.Tr "repo.settings.web_hook_name_teamcity") | Str2html}}

{{.CsrfTokenHtml}}
From 199510ec647e088a707f8d6cf920bbb341b719ba Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 17:50:18 -0500 Subject: [PATCH 21/29] Added BearerToken property to HookTask Add Authorization Header when Bearer Token is present during Webhook delivery. Add empty TeamCity Payload builder to accommodate future expansion and stay consistent with existing patterns. --- models/webhook/hooktask.go | 3 +++ services/webhook/deliver.go | 5 +++++ services/webhook/teamcity.go | 8 +++++++- services/webhook/webhook.go | 20 ++++++++++++++++---- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index 1d19ebd24e76b..8a9a3ffd1d6aa 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -116,6 +116,9 @@ type HookTask struct { RequestInfo *HookRequest `xorm:"-"` ResponseContent string `xorm:"TEXT"` ResponseInfo *HookResponse `xorm:"-"` + + // Used for Auth Headers. + BearerToken string } func init() { diff --git a/services/webhook/deliver.go b/services/webhook/deliver.go index 88b709cb41e74..45b263f288105 100644 --- a/services/webhook/deliver.go +++ b/services/webhook/deliver.go @@ -116,6 +116,11 @@ func Deliver(t *webhook_model.HookTask) error { event := t.EventType.Event() eventType := string(t.EventType) + + if t.BearerToken != "" { + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", t.BearerToken)) + } + req.Header.Add("X-Gitea-Delivery", t.UUID) req.Header.Add("X-Gitea-Event", event) req.Header.Add("X-Gitea-Event-Type", eventType) diff --git a/services/webhook/teamcity.go b/services/webhook/teamcity.go index 16743c70eef59..7728471936d72 100644 --- a/services/webhook/teamcity.go +++ b/services/webhook/teamcity.go @@ -3,11 +3,11 @@ package webhook import ( webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" "encoding/json" ) type ( - // TeamCityMeta contains metadata for the TeamCity WebHook TeamCityMeta struct { HostUrl string `json:"host_url"` @@ -16,6 +16,12 @@ type ( } ) +// GetTeamCityPayload returns the payload as-is +// TeamCity requests API doesn't take a body on POST, so no need to alter it in any way. +func GetTeamCityPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { + return p, nil +} + // GetTeamCityHook returns TeamCity metadata func GetTeamCityHook(w *webhook_model.Webhook) *TeamCityMeta { s := &TeamCityMeta{} diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index 607fac963452f..7497ac3ba0026 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -46,6 +46,10 @@ var webhooks = map[webhook_model.HookType]*webhook{ name: webhook_model.MSTEAMS, payloadCreator: GetMSTeamsPayload, }, + webhook_model.TEAMCITY: { + name: webhook_model.TEAMCITY, + payloadCreator: GetTeamCityPayload, + }, webhook_model.FEISHU: { name: webhook_model.FEISHU, payloadCreator: GetFeishuPayload, @@ -170,11 +174,19 @@ func prepareWebhook(w *webhook_model.Webhook, repo *repo_model.Repository, event payloader = p } + // Load any auth/bearer tokens... + var authToken string + switch w.Type { + case webhook_model.TEAMCITY: + authToken = GetTeamCityHook(w).AuthToken + } + if err = webhook_model.CreateHookTask(&webhook_model.HookTask{ - RepoID: repo.ID, - HookID: w.ID, - Payloader: payloader, - EventType: event, + RepoID: repo.ID, + HookID: w.ID, + BearerToken: authToken, + Payloader: payloader, + EventType: event, }); err != nil { return fmt.Errorf("CreateHookTask: %v", err) } From d0b1a3d85e646a23eb5c8e09d27a85539009fd65 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 17:55:21 -0500 Subject: [PATCH 22/29] Replace Teamcity png logo with svg version --- public/img/teamcity.png | Bin 5563 -> 0 bytes public/img/teamcity.svg | 64 ++++++++++++++++++ templates/admin/hook_new.tmpl | 2 +- templates/org/settings/hook_new.tmpl | 2 +- .../repo/settings/webhook/base_list.tmpl | 2 +- templates/repo/settings/webhook/new.tmpl | 4 +- 6 files changed, 69 insertions(+), 5 deletions(-) delete mode 100644 public/img/teamcity.png create mode 100644 public/img/teamcity.svg diff --git a/public/img/teamcity.png b/public/img/teamcity.png deleted file mode 100644 index 2ddee0dc719f4dcec00fbd9674b76210d6e2c91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5563 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 Ym~zFP=lf9LcoqcG)ii|T)F1uxKR6)lbN~PV diff --git a/public/img/teamcity.svg b/public/img/teamcity.svg new file mode 100644 index 0000000000000..ca14b3dc1d44f --- /dev/null +++ b/public/img/teamcity.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index f34513130092d..85b6719d29b99 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -27,7 +27,7 @@ {{else if eq .HookType "telegram"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index e1b22803e8291..99fefbf9fd0da 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -22,7 +22,7 @@ {{else if eq .HookType "telegram"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} diff --git a/templates/repo/settings/webhook/base_list.tmpl b/templates/repo/settings/webhook/base_list.tmpl index 588ffe49ab0a5..5e065cbe52761 100644 --- a/templates/repo/settings/webhook/base_list.tmpl +++ b/templates/repo/settings/webhook/base_list.tmpl @@ -26,7 +26,7 @@ {{.i18n.Tr "repo.settings.web_hook_name_msteams"}} - {{.i18n.Tr "repo.settings.web_hook_name_teamcity"}} + {{.i18n.Tr "repo.settings.web_hook_name_teamcity"}} {{.i18n.Tr "repo.settings.web_hook_name_feishu_or_larksuite"}} diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index 5f4ed79dd22b0..b6d7146a90120 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -21,8 +21,8 @@ {{else if eq .HookType "msteams"}} - {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} From 25f83a9b00d9e8f5681e6e13a92354268cdf96b1 Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 18:43:43 -0500 Subject: [PATCH 23/29] Add unit tests for Teamcity meta and payload. --- services/webhook/teamcity.go | 9 ++++++-- services/webhook/teamcity_test.go | 35 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 services/webhook/teamcity_test.go diff --git a/services/webhook/teamcity.go b/services/webhook/teamcity.go index 7728471936d72..e3c2ced792155 100644 --- a/services/webhook/teamcity.go +++ b/services/webhook/teamcity.go @@ -1,10 +1,15 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file.package webhook + package webhook import ( + "encoding/json" + webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" - "encoding/json" ) type ( @@ -17,8 +22,8 @@ type ( ) // GetTeamCityPayload returns the payload as-is -// TeamCity requests API doesn't take a body on POST, so no need to alter it in any way. func GetTeamCityPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { + // TeamCity requests API doesn't take a body on POST, so no need to alter it in any way. return p, nil } diff --git a/services/webhook/teamcity_test.go b/services/webhook/teamcity_test.go new file mode 100644 index 0000000000000..5a8988d48c406 --- /dev/null +++ b/services/webhook/teamcity_test.go @@ -0,0 +1,35 @@ +package webhook + +import ( + "testing" + + webhook_model "code.gitea.io/gitea/models/webhook" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetTeamCityPayload(t *testing.T) { + t.Run("Payload isn't altered.", func(t *testing.T) { + p := createTestPayload() + + pl, err := GetTeamCityPayload(p, webhook_model.HookEventPush, "") + require.NoError(t, err) + require.Equal(t, p, pl) + }) +} + +func TestWebhook_GetTeamCityHook(t *testing.T) { + t.Run("GetTeamCityHook", func(t *testing.T) { + w := &webhook_model.Webhook{ + Meta: `{"host_url": "http://localhost.com", "auth_token": "testToken", "vcs_root_id" :"fooVCS"}`, + } + + teamcityHook := GetTeamCityHook(w) + assert.Equal(t, *teamcityHook, TeamCityMeta{ + HostUrl: "http://localhost.com", + AuthToken: "testToken", + VcsRootId: "fooVCS", + }) + }) +} From 75804323866d583e2ae68b51f65d6f974cbff37a Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 19:36:56 -0500 Subject: [PATCH 24/29] Fix linting issues. --- models/webhook.go | 0 templates/admin/hook_new.tmpl | 1 + templates/repo/settings/webhook/new.tmpl | 2 +- templates/repo/settings/webhook/teamcity.tmpl | 34 +++++++++---------- templates/swagger/v1_json.tmpl | 2 +- 5 files changed, 20 insertions(+), 19 deletions(-) delete mode 100644 models/webhook.go diff --git a/models/webhook.go b/models/webhook.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index 85b6719d29b99..882ee14ad5a00 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -51,6 +51,7 @@ {{template "repo/settings/webhook/dingtalk" .}} {{template "repo/settings/webhook/telegram" .}} {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/feishu" .}} {{template "repo/settings/webhook/matrix" .}} {{template "repo/settings/webhook/wechatwork" .}} diff --git a/templates/repo/settings/webhook/new.tmpl b/templates/repo/settings/webhook/new.tmpl index b6d7146a90120..3d8b4602a77a6 100644 --- a/templates/repo/settings/webhook/new.tmpl +++ b/templates/repo/settings/webhook/new.tmpl @@ -21,7 +21,7 @@ {{else if eq .HookType "msteams"}} - {{else if eq .HookType "teamcity"}} + {{else if eq .HookType "teamcity"}} {{else if eq .HookType "feishu"}} diff --git a/templates/repo/settings/webhook/teamcity.tmpl b/templates/repo/settings/webhook/teamcity.tmpl index 8e42bfdcd45b1..3ccf6245b1a9d 100644 --- a/templates/repo/settings/webhook/teamcity.tmpl +++ b/templates/repo/settings/webhook/teamcity.tmpl @@ -1,19 +1,19 @@ {{if eq .HookType "teamcity"}} -

{{.i18n.Tr "repo.settings.add_web_hook_desc" "https://jetbrains.com/teamcity" (.i18n.Tr "repo.settings.web_hook_name_teamcity") | Str2html}}

- - {{.CsrfTokenHtml}} -
- - -
-
- - -
-
- - -
- {{template "repo/settings/webhook/settings" .}} - +

{{.i18n.Tr "repo.settings.add_web_hook_desc" "https://jetbrains.com/teamcity" (.i18n.Tr "repo.settings.web_hook_name_teamcity") | Str2html}}

+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+
+ + +
+ {{template "repo/settings/webhook/settings" .}} +
{{end}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 0d1e688ccea17..0bce0752e2bae 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -13514,7 +13514,7 @@ "gitea", "gogs", "msteams", - "teamcity", + "teamcity", "slack", "telegram", "feishu", From 33e64664b7e92d176a9aea4c5c03df861af5901f Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 19:36:56 -0500 Subject: [PATCH 25/29] Rename properties/variables to use URL and ID instead of "Url" and "Id" Delete obsolete files left behind in rebase. Fix linting issues. --- modules/auth/repo_form.go | 0 modules/webhook/deliver.go | 0 modules/webhook/webhook.go | 0 routers/repo/webhook.go | 0 routers/routes/routes.go | 0 routers/web/repo/webhook.go | 26 +++++++++++++------------- services/forms/repo_form.go | 4 ++-- services/webhook/teamcity.go | 7 +++---- services/webhook/teamcity_test.go | 8 ++++++-- 9 files changed, 24 insertions(+), 21 deletions(-) delete mode 100644 modules/auth/repo_form.go delete mode 100644 modules/webhook/deliver.go delete mode 100644 modules/webhook/webhook.go delete mode 100644 routers/repo/webhook.go delete mode 100644 routers/routes/routes.go diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/modules/webhook/deliver.go b/modules/webhook/deliver.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/modules/webhook/webhook.go b/modules/webhook/webhook.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/routers/routes/routes.go b/routers/routes/routes.go deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/routers/web/repo/webhook.go b/routers/web/repo/webhook.go index 1ade3bf2549ef..9b93c446a483b 100644 --- a/routers/web/repo/webhook.go +++ b/routers/web/repo/webhook.go @@ -556,24 +556,24 @@ func TeamCityHooksNewPost(ctx *context.Context) { } meta, err := json.Marshal(&webhook_service.TeamCityMeta{ - HostUrl: form.HostUrl, + HostURL: form.HostURL, AuthToken: form.AuthToken, - VcsRootId: form.VcsRootId, + VcsRootID: form.VcsRootID, }) if err != nil { ctx.ServerError("Marshal", err) return } - payloadUrl, err := buildTeamCityUrl(form) + payloadURL, err := buildTeamCityURL(form) if err != nil { - ctx.ServerError("buildTeamCityUrl", err) + ctx.ServerError("buildTeamCityURL", err) return } w := &webhook.Webhook{ RepoID: orCtx.RepoID, - URL: payloadUrl, + URL: payloadURL, ContentType: webhook.ContentTypeForm, HookEvent: ParseHookEvent(form.WebhookForm), IsActive: form.Active, @@ -1210,19 +1210,18 @@ func TeamCityHooksEditPost(ctx *context.Context) { } meta, err := json.Marshal(&webhook_service.TeamCityMeta{ - HostUrl: form.HostUrl, + HostURL: form.HostURL, AuthToken: form.AuthToken, - VcsRootId: form.VcsRootId, + VcsRootID: form.VcsRootID, }) - if err != nil { ctx.ServerError("Marshal", err) return } - w.URL, err = buildTeamCityUrl(form) + w.URL, err = buildTeamCityURL(form) if err != nil { - ctx.ServerError("buildTeamCityUrl", err) + ctx.ServerError("buildTeamCityURL", err) return } @@ -1243,13 +1242,14 @@ func TeamCityHooksEditPost(ctx *context.Context) { ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID)) } -func buildTeamCityUrl(meta *forms.NewTeamCityHookForm) (string, error) { - tcUrl, err := url.Parse(meta.HostUrl) +// buildTeamCityURL returns the correct REST API url for a TeamCity POST request. +func buildTeamCityURL(meta *forms.NewTeamCityHookForm) (string, error) { + tcURL, err := url.Parse(meta.HostURL) if err != nil { return "", err } - return fmt.Sprintf("%s/app/rest/vcs-root-instances/commitHookNotification?locator=vcsRoot:%s", tcUrl, meta.VcsRootId), nil + return fmt.Sprintf("%s/app/rest/vcs-root-instances/commitHookNotification?locator=vcsRoot:%s", tcURL, meta.VcsRootID), nil } // FeishuHooksEditPost response for editing feishu hook diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index 067281af42526..2963aafdc5fcc 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -373,9 +373,9 @@ func (f *NewMSTeamsHookForm) Validate(req *http.Request, errs binding.Errors) bi } type NewTeamCityHookForm struct { - HostUrl string `binding:"Required;ValidUrl"` + HostURL string `binding:"Required;ValidUrl"` AuthToken string `binding:"Required"` - VcsRootId string `binding:"Required"` + VcsRootID string `binding:"Required"` WebhookForm } diff --git a/services/webhook/teamcity.go b/services/webhook/teamcity.go index e3c2ced792155..79238831bdb76 100644 --- a/services/webhook/teamcity.go +++ b/services/webhook/teamcity.go @@ -5,9 +5,8 @@ package webhook import ( - "encoding/json" - webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" ) @@ -15,9 +14,9 @@ import ( type ( // TeamCityMeta contains metadata for the TeamCity WebHook TeamCityMeta struct { - HostUrl string `json:"host_url"` + HostURL string `json:"host_url"` AuthToken string `json:"auth_token"` - VcsRootId string `json:"vcs_root_id"` + VcsRootID string `json:"vcs_root_id"` } ) diff --git a/services/webhook/teamcity_test.go b/services/webhook/teamcity_test.go index 5a8988d48c406..987c92b778920 100644 --- a/services/webhook/teamcity_test.go +++ b/services/webhook/teamcity_test.go @@ -1,3 +1,7 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file.package webhook + package webhook import ( @@ -27,9 +31,9 @@ func TestWebhook_GetTeamCityHook(t *testing.T) { teamcityHook := GetTeamCityHook(w) assert.Equal(t, *teamcityHook, TeamCityMeta{ - HostUrl: "http://localhost.com", + HostURL: "http://localhost.com", AuthToken: "testToken", - VcsRootId: "fooVCS", + VcsRootID: "fooVCS", }) }) } From d76ee61c0d04cdf9a9cde4d97efeb307a89ff22c Mon Sep 17 00:00:00 2001 From: Stryder Date: Tue, 8 Feb 2022 21:39:19 -0500 Subject: [PATCH 26/29] Add teamcity hook to docs for swagger gen. --- modules/structs/hook.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/structs/hook.go b/modules/structs/hook.go index e4d7652c72a99..76f6943f2e029 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -40,7 +40,7 @@ type CreateHookOptionConfig map[string]string // CreateHookOption options when create a hook type CreateHookOption struct { // required: true - // enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist + // enum: dingtalk,discord,gitea,gogs,msteams,teamcity,slack,telegram,feishu,wechatwork,packagist Type string `json:"type" binding:"Required"` // required: true Config CreateHookOptionConfig `json:"config" binding:"Required"` From 03f671a746a60c9963cc9601bf4368e70940eaf8 Mon Sep 17 00:00:00 2001 From: Stryder Date: Wed, 9 Feb 2022 09:46:48 -0500 Subject: [PATCH 27/29] Revert "update the comparison documents (#18669)" This reverts commit c14ca34d576ab6be82ff93c05ddd1a9537269830. --- docs/content/doc/features/comparison.en-us.md | 3 +-- docs/content/doc/features/comparison.zh-cn.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/content/doc/features/comparison.en-us.md b/docs/content/doc/features/comparison.en-us.md index 745c5d37bc729..a703766855f4b 100644 --- a/docs/content/doc/features/comparison.en-us.md +++ b/docs/content/doc/features/comparison.en-us.md @@ -50,7 +50,7 @@ _Symbols used in table:_ | Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | | Built-in Container Registry | [✘](https://github.com/go-gitea/gitea/issues/2316) | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | | External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | -| WebAuthn (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ? | +| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | | Built-in CI/CD | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | | Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ | @@ -66,7 +66,6 @@ _Symbols used in table:_ | Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | | Verified Committer | ⁄ | ✘ | ? | ✓ | ✓ | ✓ | ✘ | | GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | -| SSH Signed Commits | ✓ | ✘ | ✘ | ✘ | ✘ | ? | ? | | Reject unsigned commits | [✓](https://github.com/go-gitea/gitea/pull/9708) | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | | Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | | Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | diff --git a/docs/content/doc/features/comparison.zh-cn.md b/docs/content/doc/features/comparison.zh-cn.md index 98a50f5dc2abd..8ccdebe8cd94d 100644 --- a/docs/content/doc/features/comparison.zh-cn.md +++ b/docs/content/doc/features/comparison.zh-cn.md @@ -48,7 +48,7 @@ _表格中的符号含义:_ | 仓库写权限令牌 | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | | 内置容器 Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | | 外部 Git 镜像 | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | -| WebAuthn (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ? | +| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | | 内置 CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | | 子组织:组织内的组织 | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ | @@ -64,7 +64,6 @@ _表格中的符号含义:_ | 细粒度用户角色 (例如 Code, Issues, Wiki) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | | 提交人的身份验证 | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ | | GPG 签名的提交 | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | -| SSH 签名的提交 | ✓ | ✘ | ✘ | ✘ | ✘ | ? | ? | | 拒绝未用通过验证的提交 | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | | 仓库活跃度页面 | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | | 分支管理 | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | From cc9af8db9732a43d0270937a35c4fa7eb075d764 Mon Sep 17 00:00:00 2001 From: Stryder Date: Wed, 9 Feb 2022 09:46:49 -0500 Subject: [PATCH 28/29] Revert "Restart zero worker if there is still work to do (#18658)" This reverts commit df4401732825b9b378e51663d74edb795446f2d3. --- modules/queue/workerpool.go | 14 -------------- services/mirror/mirror.go | 28 ++++++++++------------------ 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/modules/queue/workerpool.go b/modules/queue/workerpool.go index 39ea59b7b1c21..20108d35886ca 100644 --- a/modules/queue/workerpool.go +++ b/modules/queue/workerpool.go @@ -115,9 +115,6 @@ func (p *WorkerPool) hasNoWorkerScaling() bool { return p.numberOfWorkers == 0 && (p.boostTimeout == 0 || p.boostWorkers == 0 || p.maxNumberOfWorkers == 0) } -// zeroBoost will add a temporary boost worker for a no worker queue -// p.lock must be locked at the start of this function BUT it will be unlocked by the end of this function -// (This is because addWorkers has to be called whilst unlocked) func (p *WorkerPool) zeroBoost() { ctx, cancel := context.WithTimeout(p.baseCtx, p.boostTimeout) mq := GetManager().GetManagedQueue(p.qid) @@ -319,17 +316,6 @@ func (p *WorkerPool) addWorkers(ctx context.Context, cancel context.CancelFunc, } p.pause() } - select { - case <-p.baseCtx.Done(): - // this worker queue is shut-down don't reboost - default: - if p.numberOfWorkers == 0 && atomic.LoadInt64(&p.numInQueue) > 0 { - // OK there are no workers but... there's still work to be done -> Reboost - p.zeroBoost() - // p.lock will be unlocked by zeroBoost - return - } - } p.lock.Unlock() }() } diff --git a/services/mirror/mirror.go b/services/mirror/mirror.go index 5639a08f96401..6f285ec467c63 100644 --- a/services/mirror/mirror.go +++ b/services/mirror/mirror.go @@ -59,13 +59,11 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error { handler := func(idx int, bean interface{}, limit int) error { var item SyncRequest - var repo *repo_model.Repository if m, ok := bean.(*repo_model.Mirror); ok { if m.Repo == nil { log.Error("Disconnected mirror found: %d", m.ID) return nil } - repo = m.Repo item = SyncRequest{ Type: PullMirrorType, RepoID: m.RepoID, @@ -75,7 +73,6 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error { log.Error("Disconnected push-mirror found: %d", m.ID) return nil } - repo = m.Repo item = SyncRequest{ Type: PushMirrorType, RepoID: m.RepoID, @@ -92,16 +89,17 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error { default: } + // Check if this request is already in the queue + has, err := mirrorQueue.Has(&item) + if err != nil { + return err + } + if has { + return nil + } + // Push to the Queue if err := mirrorQueue.Push(&item); err != nil { - if err == queue.ErrAlreadyInQueue { - if item.Type == PushMirrorType { - log.Trace("PushMirrors for %-v already queued for sync", repo) - } else { - log.Trace("PullMirrors for %-v already queued for sync", repo) - } - return nil - } return err } @@ -112,29 +110,23 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error { return nil } - pullMirrorsRequested := 0 if pullLimit != 0 { - requested = 0 if err := repo_model.MirrorsIterate(func(idx int, bean interface{}) error { return handler(idx, bean, pullLimit) }); err != nil && err != errLimit { log.Error("MirrorsIterate: %v", err) return err } - pullMirrorsRequested, requested = requested, 0 } - pushMirrorsRequested := 0 if pushLimit != 0 { - requested = 0 if err := repo_model.PushMirrorsIterate(func(idx int, bean interface{}) error { return handler(idx, bean, pushLimit) }); err != nil && err != errLimit { log.Error("PushMirrorsIterate: %v", err) return err } - pushMirrorsRequested, requested = requested, 0 } - log.Trace("Finished: Update: %d pull mirrors and %d push mirrors queued", pullMirrorsRequested, pushMirrorsRequested) + log.Trace("Finished: Update") return nil } From b3f8e4b0dd2a4b14880db97232a22ca1cb0d1d60 Mon Sep 17 00:00:00 2001 From: Stryder Date: Wed, 9 Feb 2022 13:21:18 -0500 Subject: [PATCH 29/29] Remove duplicate entries from rebase. --- templates/admin/hook_new.tmpl | 4 +--- templates/org/settings/hook_new.tmpl | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/templates/admin/hook_new.tmpl b/templates/admin/hook_new.tmpl index 882ee14ad5a00..506d3380b9373 100644 --- a/templates/admin/hook_new.tmpl +++ b/templates/admin/hook_new.tmpl @@ -26,12 +26,10 @@ {{else if eq .HookType "telegram"}} - {{else if eq .HookType "teamcity"}} - {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index 99fefbf9fd0da..0aad537d4a447 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -21,12 +21,10 @@ {{else if eq .HookType "telegram"}} - {{else if eq .HookType "teamcity"}} - {{else if eq .HookType "msteams"}} {{else if eq .HookType "teamcity"}} - + {{else if eq .HookType "feishu"}} {{else if eq .HookType "matrix"}} @@ -45,7 +43,6 @@ {{template "repo/settings/webhook/discord" .}} {{template "repo/settings/webhook/dingtalk" .}} {{template "repo/settings/webhook/telegram" .}} - {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/msteams" .}} {{template "repo/settings/webhook/teamcity" .}} {{template "repo/settings/webhook/feishu" .}}