From 18bf6be3982500f19c678e6818ee50b267cdad6d Mon Sep 17 00:00:00 2001 From: viktike Date: Sun, 14 Jan 2018 23:09:30 +0100 Subject: [PATCH 01/15] Add myself as a translator (#3370) --- options/locale/TRANSLATORS | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/TRANSLATORS b/options/locale/TRANSLATORS index 17baccd65..96001e96e 100644 --- a/options/locale/TRANSLATORS +++ b/options/locale/TRANSLATORS @@ -62,6 +62,7 @@ Thiago Avelino Thomas Fanninger Tilmann Bach Toni Villena Jiménez +Viktor Sperl Vladimir Jigulin mogaika AT yandex DOT ru Vladimir Vissoultchev YJSoft From 6b9073b3a4710ac48c817a4cff97f420f926ab83 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 14 Jan 2018 22:10:15 +0000 Subject: [PATCH 02/15] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 50ae0005d..0e949baaa 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -608,10 +608,10 @@ commits.signed_by=Signiert von commits.gpg_key_id=GPG Schlüssel ID ext_issues=Externe Issues -ext_issues.desc=Link zu einem Externen Issuetracker. +ext_issues.desc=Link zu einem externen Issuetracker. issues.desc=Issues ist der Platz zum Verwalten der Aufgaben und Fehler. -issues.new=Neues Issue +issues.new=Neuer Issue issues.new.labels=Label issues.new.no_label=Kein Label issues.new.clear_labels=Labels entfernen @@ -848,7 +848,7 @@ activity.title.issues_n=%d Issues activity.title.issues_closed_by=%s von %s geschlossen activity.title.issues_created_by=%s von %s erstellt activity.closed_issue_label=Geschlossen -activity.new_issues_count_1=Neues Issue +activity.new_issues_count_1=Neuer Issue activity.new_issues_count_n=Neue Issues activity.new_issue_label=Geöffnet activity.title.unresolved_conv_1=%d offene Konversation From d29aa7677745671c1ed22fbd612dd3370f178b73 Mon Sep 17 00:00:00 2001 From: Ethan Koenig Date: Sun, 14 Jan 2018 14:27:57 -0800 Subject: [PATCH 03/15] Fix en-US locale (#3371) --- options/locale/locale_en-US.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index b6e252e80..d676aabe4 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -270,7 +270,7 @@ openid_been_used = OpenID address '%s' already used. username_password_incorrect = Incorrect username or password. enterred_invalid_repo_name = Please ensure that the repository name you entered is correct. enterred_invalid_owner_name = Please ensure that the owner name you entered is correct. -enterred_invalid_password = Please ensure the that password you entered is correct. +enterred_invalid_password = Please ensure that the password you entered is correct. user_not_exist = The user does not exist. last_org_owner = Removing the last user from the owner team is not allowed because there must always be at least one owner in any given organization. cannot_add_org_to_team = Organization cannot be added as a team member. From bec09378f96f45561a6da9ddec844b720957540c Mon Sep 17 00:00:00 2001 From: muhfaris Date: Mon, 15 Jan 2018 13:03:30 +0700 Subject: [PATCH 04/15] Fix Delete repository message (#3260) --- public/js/index.js | 5 ++++- templates/admin/repo/list.tmpl | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/js/index.js b/public/js/index.js index 160be5b68..9b67e5926 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1683,7 +1683,10 @@ function showDeletePopup() { filter += "#" + $this.attr("id") } - $('.delete.modal' + filter).modal({ + var dialog = $('.delete.modal' + filter); + dialog.find('.repo-name').text($this.data('repo-name')); + + dialog.modal({ closable: false, onApprove: function() { if ($this.data('type') == "form") { diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl index 470be359e..86d6b8042 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -37,7 +37,7 @@ {{.NumIssues}} {{SizeFmt .Size}} {{.CreatedUnix.FormatShort}} - + {{end}} @@ -55,7 +55,7 @@

{{.i18n.Tr "repo.settings.delete_desc"}}

- {{.i18n.Tr "repo.settings.delete_notices_2"}}
+ {{.i18n.Tr "repo.settings.delete_notices_2" `` | Safe}}
{{.i18n.Tr "repo.settings.delete_notices_fork_1"}}
{{template "base/delete_modal_actions" .}} From e2bb7933e8619be4ef65abf34a06cb60802ba744 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 15 Jan 2018 06:04:51 +0000 Subject: [PATCH 05/15] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 - options/locale/locale_es-ES.ini | 1 - options/locale/locale_fr-FR.ini | 1 - options/locale/locale_hu-HU.ini | 1 - options/locale/locale_ko-KR.ini | 1 - options/locale/locale_lv-LV.ini | 1 - options/locale/locale_nl-NL.ini | 1 - options/locale/locale_pl-PL.ini | 1 - options/locale/locale_pt-BR.ini | 1 - options/locale/locale_ru-RU.ini | 1 - options/locale/locale_sv-SE.ini | 1 - options/locale/locale_zh-CN.ini | 1 - options/locale/locale_zh-HK.ini | 1 - options/locale/locale_zh-TW.ini | 1 - 14 files changed, 14 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 0e949baaa..853e87113 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -270,7 +270,6 @@ openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet. username_password_incorrect=Falscher Benutzername oder Passwort. enterred_invalid_repo_name=Bitte achte darauf, dass der eingegebene Repository-Name korrekt ist. enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Name des Besitzers korrekt ist. -enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort richtig ist. user_not_exist=Dieser Benutzer ist nicht vorhanden. last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer pro Organisation geben muss. cannot_add_org_to_team=Organisationen können nicht als Teammitglied hinzugefügt werden. diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index e5d89f426..0cf6d0a22 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -240,7 +240,6 @@ openid_been_used=La Dirección de OpenID '%s' ya esta en uso. username_password_incorrect=Nombre de usuario o contraseña incorrectos. enterred_invalid_repo_name=Por favor, asegúrate de que has introducido el nombre correctamente. enterred_invalid_owner_name=Por favor, asegúrate de que el nombre del propietario introducido es correcto. -enterred_invalid_password=Por favor, asegúrate de que has introducido correctamente tu contraseña. user_not_exist=Este usuario no existe. cannot_add_org_to_team=Organización no puede agregarse como un miembro del equipo. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 7c450d273..4f41c9e80 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -269,7 +269,6 @@ openid_been_used=Adresse OpenID '%s' déjà utilisée. username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect. enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct. enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct. -enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct. user_not_exist=Cet utilisateur n'existe pas. last_org_owner=L'utilisateur à exclure est le dernier membre de l'équipe propriétaire. Il doit y avoir un autre propriétaire. cannot_add_org_to_team=Une organisation ne peut être ajoutée comme membre d'une équipe. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 550d3bba2..01cbbf38d 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -270,7 +270,6 @@ openid_been_used=Az OpenID cím "%s" már használatban van. username_password_incorrect=Helytelen felhasználónév vagy jelszó. enterred_invalid_repo_name=Ellenőrizze, hogy a tároló neve helyes. enterred_invalid_owner_name=Kérlek ellenőrizd, hogy a beírt tulajdonos neve helyes. -enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes. user_not_exist=A fiók nem létezik. last_org_owner=Az utolsó felhasználót nem lehet eltávolítani a tulajdonosi csapatból, mert legalább egy tulajdonosnak lennie kell minden szervezetben. cannot_add_org_to_team=Szervezet nem adható hozzá egy csoport tagjaként. diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index f391fc1d5..196433edb 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -238,7 +238,6 @@ openid_been_used=OpenID 주소 '%s' 는 이미 사용중입니다. username_password_incorrect=사용자 이름 또는 비밀번호가 잘못되었습니다 enterred_invalid_repo_name=입력한 저장소 이름이 올바른지 확인하십시오. enterred_invalid_owner_name=입력한 사용자 이름이 올바른지 확인하십시오. -enterred_invalid_password=입력한 비밀번호가 올바른지 확인하십시오. user_not_exist=존재하지 않는 사용자입니다. last_org_owner=소유자 팀에서 마지막 사용자를 제거하는 것은 허용되지 않습니다. 최소한 한명의 소유자가 있어야 합니다. cannot_add_org_to_team=조직은 팀 멤버로 추가할수 없습니다. diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index b27557d79..9f9806b13 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -270,7 +270,6 @@ openid_been_used=OpenID adrese '%s' jau ir izmantota. username_password_incorrect=Nepareizs lietotājvārds vai parole. enterred_invalid_repo_name=Lūdzu, pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs. enterred_invalid_owner_name=Lūdzu, pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs. -enterred_invalid_password=Lūdzu, pārliecinieties, vai ievadītā parole ir pareiza. user_not_exist=Lietotājs neeksistē. last_org_owner=Nevar noņemt pēdējo īpašnieku komandas lietotāju, jo organizācijām ir jābūt vismaz vienam īpašniekam. cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index fd4b43b61..8d23754a4 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -260,7 +260,6 @@ openid_been_used=OpenID adres '%s' reeds gebruikt. username_password_incorrect=Onjuiste gebruikersnaam en/of wachtwoord. enterred_invalid_repo_name=U heeft een onjuiste repository naam ingevoerd. enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd. -enterred_invalid_password=U heeft een onjuist wachtwoord ingevoerd. user_not_exist=De gebruiker bestaat niet. last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst een nieuw lid (eigenaar) aanstellen. cannot_add_org_to_team=Organisatie kan niet worden toegevoegd als een teamlid. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index fed77ef04..6f99c6a17 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -266,7 +266,6 @@ openid_been_used=Adres OpenID '%s' jest już używany. username_password_incorrect=Nieprawidłowa nazwa użytkownika lub hasło. enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna. enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna. -enterred_invalid_password=Proszę upewnij się, że wprowadzone hasło jest poprawne. user_not_exist=Użytkownik nie istnieje. last_org_owner=Usuwany użytkownik jest ostatnim członkiem ekipy właścicieli. Musi być inny właściciel. cannot_add_org_to_team=Organizacja nie może zostać dodana jako członek zespołu. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 3d2bf1673..e93c483f7 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -269,7 +269,6 @@ openid_been_used=O endereço OpenID '%s' já está sendo usado. username_password_incorrect=Nome de usuário ou senha incorretos. enterred_invalid_repo_name=Por favor certifique-se de que o nome do repositório está correto. enterred_invalid_owner_name=Por favor certifique-se de que o nome do proprietário está correto. -enterred_invalid_password=Por favor certifique-se de que a senha está correta. user_not_exist=O usuário não existe. last_org_owner=Não é permitido remover o último usuário da equipe de proprietários, pois deve haver pelo menos um proprietário em uma organização. cannot_add_org_to_team=Uma organização não pode ser adicionada como membro de uma equipe. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 355f5b283..15299dd20 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -270,7 +270,6 @@ openid_been_used=Адрес OpenID '%s' уже используется. username_password_incorrect=Неверное имя пользователя или пароль. enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория. enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное. -enterred_invalid_password=Убедитесь, что введенный пароль верен. user_not_exist=Пользователь не существует. last_org_owner=Удаление последнего пользователя из команды владельцев не разрешается, поскольку всегда должен быть по крайней мере один владелец в любой организации. cannot_add_org_to_team=Организацию нельзя добавить в качестве члена команды. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 42d9f4169..1005208e5 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -252,7 +252,6 @@ email_been_used=E-postadress används redan. openid_been_used=OpenID-adressen '%s' används redan. username_password_incorrect=Felaktigt användarnamn eller lösenord. enterred_invalid_owner_name=Kontrollera att ägarnamnet som du angav är rätt. -enterred_invalid_password=Kontrollera att lösenordet som du angav är rätt. user_not_exist=Användaren finns inte. last_org_owner=Att ta bort den sista användaren i ägare-teamet är inte tillåtet då det måste finnas minst en användare i ägare-teamet. cannot_add_org_to_team=En organisation kan inte läggas till som en gruppmedlem. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index bbad7fa34..483afb9e7 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -269,7 +269,6 @@ openid_been_used=OpenID 地址 '%s' 已被使用。 username_password_incorrect=用户名或密码错误 enterred_invalid_repo_name=请检查您输入的仓库名称是正确。 enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。 -enterred_invalid_password=请检查您输入的密码是否正确。 user_not_exist=该用户名不存在 last_org_owner=被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作! cannot_add_org_to_team=组织不能被加入到团队中。 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 05b640266..8f29eb9dd 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -259,7 +259,6 @@ openid_been_used=OpenID 位址 '%s' 已被使用。 username_password_incorrect=帳戶名稱或密碼有誤 enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是否正確。 enterred_invalid_owner_name=請檢查您輸入的擁有者名稱是否正確。 -enterred_invalid_password=請檢查您輸入的密碼是否正確。 user_not_exist=該使用者名稱並不存在 last_org_owner=無法移除群組內唯一的管理員 cannot_add_org_to_team=組織不能被新增為團隊成員。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index b1ca2dd64..1a364d3ac 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -269,7 +269,6 @@ openid_been_used=OpenID 位址 '%s' 已被使用。 username_password_incorrect=帳戶名稱或密碼有誤 enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是否正確。 enterred_invalid_owner_name=請檢查您輸入的擁有者名稱是否正確。 -enterred_invalid_password=請檢查您輸入的密碼是否正確。 user_not_exist=該用戶名不存在 last_org_owner=無法移除群組內唯一的管理員 cannot_add_org_to_team=組織不能被新增為團隊成員。 From a68bf746a4bf111e56e0e7133195b82467b182c9 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Tue, 16 Jan 2018 00:45:13 +0200 Subject: [PATCH 06/15] Change reserved avatar name to correct - avatars (#3375) --- models/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user.go b/models/user.go index da9411dcb..bf2868328 100644 --- a/models/user.go +++ b/models/user.go @@ -649,7 +649,7 @@ func NewGhostUser() *User { } var ( - reservedUsernames = []string{"assets", "css", "explore", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} + reservedUsernames = []string{"assets", "css", "explore", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatars", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} reservedUserPatterns = []string{"*.keys"} ) From cc0c4a30a778b27393923d29fe97b8bc33f345f4 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 15 Jan 2018 22:45:41 +0000 Subject: [PATCH 07/15] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 + options/locale/locale_hu-HU.ini | 1 + options/locale/locale_ru-RU.ini | 1 + 3 files changed, 3 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 853e87113..2128484eb 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -270,6 +270,7 @@ openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet. username_password_incorrect=Falscher Benutzername oder Passwort. enterred_invalid_repo_name=Bitte achte darauf, dass der eingegebene Repository-Name korrekt ist. enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Name des Besitzers korrekt ist. +enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort korrekt ist. user_not_exist=Dieser Benutzer ist nicht vorhanden. last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer pro Organisation geben muss. cannot_add_org_to_team=Organisationen können nicht als Teammitglied hinzugefügt werden. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 01cbbf38d..045346b58 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -270,6 +270,7 @@ openid_been_used=Az OpenID cím "%s" már használatban van. username_password_incorrect=Helytelen felhasználónév vagy jelszó. enterred_invalid_repo_name=Ellenőrizze, hogy a tároló neve helyes. enterred_invalid_owner_name=Kérlek ellenőrizd, hogy a beírt tulajdonos neve helyes. +enterred_invalid_password=Ellenőrizze, hogy a beírt jelszó helyes. user_not_exist=A fiók nem létezik. last_org_owner=Az utolsó felhasználót nem lehet eltávolítani a tulajdonosi csapatból, mert legalább egy tulajdonosnak lennie kell minden szervezetben. cannot_add_org_to_team=Szervezet nem adható hozzá egy csoport tagjaként. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 15299dd20..1b3c165a4 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -270,6 +270,7 @@ openid_been_used=Адрес OpenID '%s' уже используется. username_password_incorrect=Неверное имя пользователя или пароль. enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория. enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное. +enterred_invalid_password=Убедитесь, что введённый пароль верен. user_not_exist=Пользователь не существует. last_org_owner=Удаление последнего пользователя из команды владельцев не разрешается, поскольку всегда должен быть по крайней мере один владелец в любой организации. cannot_add_org_to_team=Организацию нельзя добавить в качестве члена команды. From 695b10beddc640d333fd5864cb6edb03e540b344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Br=C3=BCckner?= Date: Tue, 16 Jan 2018 09:54:13 +0100 Subject: [PATCH 08/15] Fix API-Endpoint release (#3012) * Fixes API-Endpoint release (#3005) * Using context.ReferencesGitRepo(); doing the same in the PATCH route. * Add release create, get and update test --- integrations/api_releases_test.go | 85 +++++++++++++++++++++++++++++++ routers/api/v1/api.go | 4 +- routers/api/v1/repo/release.go | 5 +- 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 integrations/api_releases_test.go diff --git a/integrations/api_releases_test.go b/integrations/api_releases_test.go new file mode 100644 index 000000000..678075935 --- /dev/null +++ b/integrations/api_releases_test.go @@ -0,0 +1,85 @@ +// Copyright 2018 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 integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/git" + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPICreateRelease(t *testing.T) { + prepareTestEnv(t) + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + session := loginUser(t, owner.LowerName) + + gitRepo, err := git.OpenRepository(repo.RepoPath()) + assert.NoError(t, err) + + err = gitRepo.CreateTag("v0.0.1", "master") + assert.NoError(t, err) + + commitID, err := gitRepo.GetTagCommitID("v0.0.1") + assert.NoError(t, err) + + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/releases", + owner.Name, repo.Name) + req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateReleaseOption{ + TagName: "v0.0.1", + Title: "v0.0.1", + Note: "test", + IsDraft: false, + IsPrerelease: false, + Target: commitID, + }) + resp := session.MakeRequest(t, req, http.StatusCreated) + + var newRelease api.Release + DecodeJSON(t, resp, &newRelease) + models.AssertExistsAndLoadBean(t, &models.Release{ + ID: newRelease.ID, + TagName: newRelease.TagName, + Title: newRelease.Title, + Note: newRelease.Note, + }) + + urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/releases/%d", + owner.Name, repo.Name, newRelease.ID) + req = NewRequest(t, "GET", urlStr) + resp = session.MakeRequest(t, req, http.StatusOK) + + var release api.Release + DecodeJSON(t, resp, &release) + + assert.Equal(t, newRelease.TagName, release.TagName) + assert.Equal(t, newRelease.Title, release.Title) + assert.Equal(t, newRelease.Note, release.Note) + + req = NewRequestWithJSON(t, "PATCH", urlStr, &api.EditReleaseOption{ + TagName: release.TagName, + Title: release.Title, + Note: "updated", + IsDraft: &release.IsDraft, + IsPrerelease: &release.IsPrerelease, + Target: release.Target, + }) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &newRelease) + models.AssertExistsAndLoadBean(t, &models.Release{ + ID: newRelease.ID, + TagName: newRelease.TagName, + Title: newRelease.Title, + Note: newRelease.Note, + }) +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 8a300f995..6bbc01426 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -463,9 +463,9 @@ func RegisterRoutes(m *macaron.Macaron) { }) m.Group("/releases", func() { m.Combo("").Get(repo.ListReleases). - Post(reqToken(), reqRepoWriter(), bind(api.CreateReleaseOption{}), repo.CreateRelease) + Post(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.CreateReleaseOption{}), repo.CreateRelease) m.Combo("/:id").Get(repo.GetRelease). - Patch(reqToken(), reqRepoWriter(), bind(api.EditReleaseOption{}), repo.EditRelease). + Patch(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.EditReleaseOption{}), repo.EditRelease). Delete(reqToken(), reqRepoWriter(), repo.DeleteRelease) }) m.Post("/mirror-sync", reqToken(), reqRepoWriter(), repo.MirrorSync) diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go index f5b529ac6..41efa482d 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -96,7 +96,7 @@ func ListReleases(ctx *context.APIContext) { // CreateRelease create a release func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { - // swagger:operation GET /repos/{owner}/{repo}/releases repository repoCreateRelease + // swagger:operation POST /repos/{owner}/{repo}/releases repository repoCreateRelease // --- // summary: Create a release // consumes: @@ -146,6 +146,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { IsDraft: form.IsDraft, IsPrerelease: form.IsPrerelease, IsTag: false, + Repo: ctx.Repo.Repository, } if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil { if models.IsErrReleaseAlreadyExist(err) { @@ -167,6 +168,8 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { rel.IsPrerelease = form.IsPrerelease rel.PublisherID = ctx.User.ID rel.IsTag = false + rel.Repo = ctx.Repo.Repository + rel.Publisher = ctx.User if err = models.UpdateRelease(ctx.Repo.GitRepo, rel, nil); err != nil { ctx.ServerError("UpdateRelease", err) From 095fb9f2e32fe78acb9bc034f0e1d60922ff1e60 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 16 Jan 2018 12:07:47 +0100 Subject: [PATCH 09/15] Add integrations tests from git cli (#3377) * test: integration add git cli tests Extracted form for easing review process and debug #3152 * test: integration add git cli big file commit * fix: Don't rewrite key if internal server --- integrations/git_test.go | 344 +++++++++++++++++++++++------------- integrations/mysql.ini.tmpl | 7 +- integrations/pgsql.ini.tmpl | 29 +-- integrations/repo_test.go | 2 +- integrations/sqlite.ini | 8 +- models/ssh_key.go | 10 ++ 6 files changed, 258 insertions(+), 142 deletions(-) diff --git a/integrations/git_test.go b/integrations/git_test.go index 53814cf41..05b2c366b 100644 --- a/integrations/git_test.go +++ b/integrations/git_test.go @@ -6,8 +6,9 @@ package integrations import ( "context" + "crypto/rand" + "fmt" "io/ioutil" - "math/rand" "net" "net/http" "net/url" @@ -17,6 +18,7 @@ import ( "time" "code.gitea.io/git" + "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/sdk/gitea" @@ -24,7 +26,13 @@ import ( "github.com/stretchr/testify/assert" ) -func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) { +const ( + littleSize = 1024 //1ko + bigSize = 128 * 1024 * 1024 //128Mo +) + +func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL)) { + prepareTestEnv(t) s := http.Server{ Handler: mac, } @@ -35,151 +43,241 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) { assert.NoError(t, err) defer func() { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) s.Shutdown(ctx) cancel() }() go s.Serve(listener) + //Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs) callback(t, u) } func TestGit(t *testing.T) { - prepareTestEnv(t) - - onGiteaWebRun(t, func(t *testing.T, u *url.URL) { - dstPath, err := ioutil.TempDir("", "repo-tmp-17") - assert.NoError(t, err) - defer os.RemoveAll(dstPath) + onGiteaRun(t, func(t *testing.T, u *url.URL) { u.Path = "user2/repo1.git" - t.Run("Standard", func(t *testing.T) { - - t.Run("CloneNoLogin", func(t *testing.T) { - dstLocalPath, err := ioutil.TempDir("", "repo1") - assert.NoError(t, err) - defer os.RemoveAll(dstLocalPath) - err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{}) - assert.NoError(t, err) - assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md"))) - }) - - t.Run("CreateRepo", func(t *testing.T) { - session := loginUser(t, "user2") - req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ - AutoInit: true, - Description: "Temporary repo", - Name: "repo-tmp-17", - Private: false, - Gitignores: "", - License: "WTFPL", - Readme: "Default", + t.Run("HTTP", func(t *testing.T) { + dstPath, err := ioutil.TempDir("", "repo-tmp-17") + assert.NoError(t, err) + defer os.RemoveAll(dstPath) + t.Run("Standard", func(t *testing.T) { + t.Run("CloneNoLogin", func(t *testing.T) { + dstLocalPath, err := ioutil.TempDir("", "repo1") + assert.NoError(t, err) + defer os.RemoveAll(dstLocalPath) + err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{}) + assert.NoError(t, err) + assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md"))) }) - session.MakeRequest(t, req, http.StatusCreated) - }) - u.Path = "user2/repo-tmp-17.git" - u.User = url.UserPassword("user2", userPassword) - t.Run("Clone", func(t *testing.T) { - err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{}) - assert.NoError(t, err) - assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md"))) - }) - - t.Run("PushCommit", func(t *testing.T) { - data := make([]byte, 1024) - _, err := rand.Read(data) - assert.NoError(t, err) - tmpFile, err := ioutil.TempFile(dstPath, "data-file-") - defer tmpFile.Close() - _, err = tmpFile.Write(data) - assert.NoError(t, err) - - //Commit - err = git.AddChanges(dstPath, false, filepath.Base(tmpFile.Name())) - assert.NoError(t, err) - err = git.CommitChanges(dstPath, git.CommitChangesOptions{ - Committer: &git.Signature{ - Email: "user2@example.com", - Name: "User Two", - When: time.Now(), - }, - Author: &git.Signature{ - Email: "user2@example.com", - Name: "User Two", - When: time.Now(), - }, - Message: "Testing commit", + t.Run("CreateRepo", func(t *testing.T) { + session := loginUser(t, "user2") + req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: "repo-tmp-17", + Private: false, + Gitignores: "", + License: "WTFPL", + Readme: "Default", + }) + session.MakeRequest(t, req, http.StatusCreated) }) - assert.NoError(t, err) - //Push - err = git.Push(dstPath, git.PushOptions{ - Branch: "master", - Remote: u.String(), - Force: false, + u.Path = "user2/repo-tmp-17.git" + u.User = url.UserPassword("user2", userPassword) + t.Run("Clone", func(t *testing.T) { + err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{}) + assert.NoError(t, err) + assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md"))) + }) + + t.Run("PushCommit", func(t *testing.T) { + t.Run("Little", func(t *testing.T) { + commitAndPush(t, littleSize, dstPath) + }) + t.Run("Big", func(t *testing.T) { + commitAndPush(t, bigSize, dstPath) + }) + }) + }) + t.Run("LFS", func(t *testing.T) { + t.Run("PushCommit", func(t *testing.T) { + //Setup git LFS + _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath) + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath) + assert.NoError(t, err) + err = git.AddChanges(dstPath, false, ".gitattributes") + assert.NoError(t, err) + + t.Run("Little", func(t *testing.T) { + commitAndPush(t, littleSize, dstPath) + }) + t.Run("Big", func(t *testing.T) { + commitAndPush(t, bigSize, dstPath) + }) + }) + t.Run("Locks", func(t *testing.T) { + lockTest(t, u.String(), dstPath) }) - assert.NoError(t, err) }) }) - t.Run("LFS", func(t *testing.T) { - t.Run("PushCommit", func(t *testing.T) { - /* Generate random file */ - data := make([]byte, 1024) - _, err := rand.Read(data) - assert.NoError(t, err) - tmpFile, err := ioutil.TempFile(dstPath, "data-file-") - defer tmpFile.Close() - _, err = tmpFile.Write(data) - assert.NoError(t, err) + t.Run("SSH", func(t *testing.T) { + //Setup remote link + u.Scheme = "ssh" + u.User = url.User("git") + u.Host = fmt.Sprintf("%s:%d", setting.SSH.ListenHost, setting.SSH.ListenPort) + u.Path = "user2/repo-tmp-18.git" - //Setup git LFS - _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath) - assert.NoError(t, err) - _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath) - assert.NoError(t, err) + //Setup key + keyFile := filepath.Join(setting.AppDataPath, "my-testing-key") + _, _, err := com.ExecCmd("ssh-keygen", "-f", keyFile, "-t", "rsa", "-N", "") + assert.NoError(t, err) + defer os.RemoveAll(keyFile) + defer os.RemoveAll(keyFile + ".pub") - //Commit - err = git.AddChanges(dstPath, false, ".gitattributes", filepath.Base(tmpFile.Name())) - assert.NoError(t, err) - err = git.CommitChanges(dstPath, git.CommitChangesOptions{ - Committer: &git.Signature{ - Email: "user2@example.com", - Name: "User Two", - When: time.Now(), - }, - Author: &git.Signature{ - Email: "user2@example.com", - Name: "User Two", - When: time.Now(), - }, - Message: "Testing LFS ", - }) - assert.NoError(t, err) + session := loginUser(t, "user1") + keyOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User) + urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys", keyOwner.Name) - //Push - u.User = url.UserPassword("user2", userPassword) - err = git.Push(dstPath, git.PushOptions{ - Branch: "master", - Remote: u.String(), - Force: false, - }) - assert.NoError(t, err) - }) - t.Run("Locks", func(t *testing.T) { - _, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds - assert.NoError(t, err) - _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath) - assert.NoError(t, err) - _, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath) - assert.NoError(t, err) - _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath) - assert.NoError(t, err) - _, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath) - assert.NoError(t, err) + dataPubKey, err := ioutil.ReadFile(keyFile + ".pub") + assert.NoError(t, err) + req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ + "key": string(dataPubKey), + "title": "test-key", }) + session.MakeRequest(t, req, http.StatusCreated) + //Setup ssh wrapper + sshWrapper, err := ioutil.TempFile(setting.AppDataPath, "tmp-ssh-wrapper") + sshWrapper.WriteString("#!/bin/sh\n\n") + sshWrapper.WriteString("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i \"" + filepath.Join(setting.AppWorkPath, keyFile) + "\" $* \n\n") + err = sshWrapper.Chmod(os.ModePerm) + assert.NoError(t, err) + sshWrapper.Close() + defer os.RemoveAll(sshWrapper.Name()) + + //Setup clone folder + dstPath, err := ioutil.TempDir("", "repo-tmp-18") + assert.NoError(t, err) + defer os.RemoveAll(dstPath) + + t.Run("Standard", func(t *testing.T) { + t.Run("CreateRepo", func(t *testing.T) { + session := loginUser(t, "user2") + req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: "repo-tmp-18", + Private: false, + Gitignores: "", + License: "WTFPL", + Readme: "Default", + }) + session.MakeRequest(t, req, http.StatusCreated) + }) + //TODO get url from api + t.Run("Clone", func(t *testing.T) { + _, err = git.NewCommand("clone").AddArguments("--config", "core.sshCommand="+filepath.Join(setting.AppWorkPath, sshWrapper.Name()), u.String(), dstPath).Run() + assert.NoError(t, err) + assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md"))) + }) + //time.Sleep(5 * time.Minute) + t.Run("PushCommit", func(t *testing.T) { + t.Run("Little", func(t *testing.T) { + commitAndPush(t, littleSize, dstPath) + }) + t.Run("Big", func(t *testing.T) { + commitAndPush(t, bigSize, dstPath) + }) + }) + }) + t.Run("LFS", func(t *testing.T) { + os.Setenv("GIT_SSH_COMMAND", filepath.Join(setting.AppWorkPath, sshWrapper.Name())) //TODO remove when fixed https://github.com/git-lfs/git-lfs/issues/2215 + defer os.Unsetenv("GIT_SSH_COMMAND") + t.Run("PushCommit", func(t *testing.T) { + //Setup git LFS + _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath) + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath) + assert.NoError(t, err) + err = git.AddChanges(dstPath, false, ".gitattributes") + assert.NoError(t, err) + + t.Run("Little", func(t *testing.T) { + commitAndPush(t, littleSize, dstPath) + }) + t.Run("Big", func(t *testing.T) { + commitAndPush(t, bigSize, dstPath) + }) + }) + /* Failed without #3152. TODO activate with fix. + t.Run("Locks", func(t *testing.T) { + lockTest(t, u.String(), dstPath) + }) + */ + }) }) }) } + +func lockTest(t *testing.T, remote, repoPath string) { + _, err := git.NewCommand("remote").AddArguments("set-url", "origin", remote).RunInDir(repoPath) //TODO add test ssh git-lfs-creds + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath) + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(repoPath) + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath) + assert.NoError(t, err) + _, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(repoPath) + assert.NoError(t, err) +} + +func commitAndPush(t *testing.T, size int, repoPath string) { + err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two") + assert.NoError(t, err) + _, err = git.NewCommand("push").RunInDir(repoPath) //Push + assert.NoError(t, err) +} + +func generateCommitWithNewData(size int, repoPath, email, fullName string) error { + //Generate random file + data := make([]byte, size) + _, err := rand.Read(data) + if err != nil { + return err + } + tmpFile, err := ioutil.TempFile(repoPath, "data-file-") + if err != nil { + return err + } + defer tmpFile.Close() + _, err = tmpFile.Write(data) + if err != nil { + return err + } + + //Commit + err = git.AddChanges(repoPath, false, filepath.Base(tmpFile.Name())) + if err != nil { + return err + } + err = git.CommitChanges(repoPath, git.CommitChangesOptions{ + Committer: &git.Signature{ + Email: email, + Name: fullName, + When: time.Now(), + }, + Author: &git.Signature{ + Email: email, + Name: fullName, + When: time.Now(), + }, + Message: fmt.Sprintf("Testing commit @ %v", time.Now()), + }) + return err +} diff --git a/integrations/mysql.ini.tmpl b/integrations/mysql.ini.tmpl index 08f8ddfa5..e75df81bd 100644 --- a/integrations/mysql.ini.tmpl +++ b/integrations/mysql.ini.tmpl @@ -8,7 +8,6 @@ NAME = {{TEST_MYSQL_DBNAME}} USER = {{TEST_MYSQL_USERNAME}} PASSWD = {{TEST_MYSQL_PASSWORD}} SSL_MODE = disable -PATH = data/gitea.db [indexer] ISSUE_INDEXER_PATH = integrations/indexers-mysql/issues.bleve @@ -27,10 +26,14 @@ SSH_DOMAIN = localhost HTTP_PORT = 3001 ROOT_URL = http://localhost:3001/ DISABLE_SSH = false -SSH_PORT = 22 +SSH_LISTEN_HOST = localhost +SSH_PORT = 2201 +START_SSH_SERVER = true LFS_START_SERVER = true LFS_CONTENT_PATH = data/lfs-mysql OFFLINE_MODE = false +LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w +APP_DATA_PATH = integrations/gitea-integration-mysql/data [mailer] ENABLED = false diff --git a/integrations/pgsql.ini.tmpl b/integrations/pgsql.ini.tmpl index 17ecacec5..923608235 100644 --- a/integrations/pgsql.ini.tmpl +++ b/integrations/pgsql.ini.tmpl @@ -8,7 +8,6 @@ NAME = {{TEST_PGSQL_DBNAME}} USER = {{TEST_PGSQL_USERNAME}} PASSWD = {{TEST_PGSQL_PASSWORD}} SSL_MODE = disable -PATH = data/gitea.db [indexer] ISSUE_INDEXER_PATH = integrations/indexers-pgsql/issues.bleve @@ -27,23 +26,27 @@ SSH_DOMAIN = localhost HTTP_PORT = 3002 ROOT_URL = http://localhost:3002/ DISABLE_SSH = false -SSH_PORT = 22 +SSH_LISTEN_HOST = localhost +SSH_PORT = 2202 +START_SSH_SERVER = true LFS_START_SERVER = true LFS_CONTENT_PATH = data/lfs-pgsql OFFLINE_MODE = false +LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w +APP_DATA_PATH = integrations/gitea-integration-pgsql/data [mailer] ENABLED = false [service] -REGISTER_EMAIL_CONFIRM = false -ENABLE_NOTIFY_MAIL = false -DISABLE_REGISTRATION = false -ENABLE_CAPTCHA = false -REQUIRE_SIGNIN_VIEW = false -DEFAULT_KEEP_EMAIL_PRIVATE = false +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false DEFAULT_ALLOW_CREATE_ORGANIZATION = true -NO_REPLY_ADDRESS = noreply.example.org +NO_REPLY_ADDRESS = noreply.example.org [picture] DISABLE_GRAVATAR = false @@ -54,7 +57,7 @@ PROVIDER = file PROVIDER_CONFIG = data/sessions-pgsql [log] -MODE = console,file +MODE = console,file ROOT_PATH = pgsql-log [log.console] @@ -64,6 +67,6 @@ LEVEL = Warn LEVEL = Debug [security] -INSTALL_LOCK = true -SECRET_KEY = 9pCviYTWSb -INTERNAL_TOKEN = test +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ diff --git a/integrations/repo_test.go b/integrations/repo_test.go index 8465bbdc5..a18bfabdf 100644 --- a/integrations/repo_test.go +++ b/integrations/repo_test.go @@ -71,6 +71,6 @@ func TestViewRepo1CloneLinkAuthorized(t *testing.T) { assert.Equal(t, setting.AppURL+"user2/repo1.git", link) link, exists = htmlDoc.doc.Find("#repo-clone-ssh").Attr("data-link") assert.True(t, exists, "The template has changed") - sshURL := fmt.Sprintf("%s@%s:user2/repo1.git", setting.RunUser, setting.SSH.Domain) + sshURL := fmt.Sprintf("ssh://%s@%s:%d/user2/repo1.git", setting.RunUser, setting.SSH.Domain, setting.SSH.Port) assert.Equal(t, sshURL, link) } diff --git a/integrations/sqlite.ini b/integrations/sqlite.ini index 7c9cd09b4..857cfe461 100644 --- a/integrations/sqlite.ini +++ b/integrations/sqlite.ini @@ -3,7 +3,7 @@ RUN_MODE = prod [database] DB_TYPE = sqlite3 -PATH = :memory: +PATH = integrations/gitea-integration-sqlite/gitea.db [indexer] ISSUE_INDEXER_PATH = integrations/indexers-sqlite/issues.bleve @@ -22,11 +22,14 @@ SSH_DOMAIN = localhost HTTP_PORT = 3003 ROOT_URL = http://localhost:3003/ DISABLE_SSH = false -SSH_PORT = 22 +SSH_LISTEN_HOST = localhost +SSH_PORT = 2203 +START_SSH_SERVER = true LFS_START_SERVER = true LFS_CONTENT_PATH = data/lfs-sqlite OFFLINE_MODE = false LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w +APP_DATA_PATH = integrations/gitea-integration-sqlite/data [mailer] ENABLED = false @@ -62,4 +65,3 @@ LEVEL = Debug INSTALL_LOCK = true SECRET_KEY = 9pCviYTWSb INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8 - diff --git a/models/ssh_key.go b/models/ssh_key.go index 2878177d4..e121b0d5b 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -304,6 +304,11 @@ func CheckPublicKeyString(content string) (_ string, err error) { // appendAuthorizedKeysToFile appends new SSH keys' content to authorized_keys file. func appendAuthorizedKeysToFile(keys ...*PublicKey) error { + // Don't need to rewrite this file if builtin SSH server is enabled. + if setting.SSH.StartBuiltinServer { + return nil + } + sshOpLocker.Lock() defer sshOpLocker.Unlock() @@ -532,6 +537,11 @@ func DeletePublicKey(doer *User, id int64) (err error) { // Note: x.Iterate does not get latest data after insert/delete, so we have to call this function // outside any session scope independently. func RewriteAllPublicKeys() error { + //Don't rewrite key if internal server + if setting.SSH.StartBuiltinServer { + return nil + } + sshOpLocker.Lock() defer sshOpLocker.Unlock() From e722bdbb03cd44536e971ec183299be76397112c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20=22BKC=22=20Carlb=C3=A4cker?= Date: Tue, 16 Jan 2018 22:18:11 +0100 Subject: [PATCH 10/15] Update source installation requirements (#3124) * Update source installation requirements We require Golang 1.8 since we use `net/url.PathEscape` which was not introduced until then * Use Golang 1.8 for build and test If we state Golang 1.8 we should test using that version as well * Use golang 1.8 only for single build to see if everything compiles * Change back edge also for commented out sqlite test --- .drone.yml | 2 +- docs/content/doc/installation/from-source.en-us.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index f60a20f02..cac0c3870 100644 --- a/.drone.yml +++ b/.drone.yml @@ -56,7 +56,7 @@ pipeline: event: [ push, tag, pull_request ] build-without-gcc: - image: webhippie/golang:edge + image: webhippie/golang:1.8 pull: true environment: GOPATH: /srv/app diff --git a/docs/content/doc/installation/from-source.en-us.md b/docs/content/doc/installation/from-source.en-us.md index b4f804fd6..d40e649c8 100644 --- a/docs/content/doc/installation/from-source.en-us.md +++ b/docs/content/doc/installation/from-source.en-us.md @@ -17,7 +17,7 @@ menu: This section will not include basic [installation instructions](https://golang.org/doc/install). -**Note**: Go version 1.7 or higher is required +**Note**: Go version 1.8 or higher is required ## Download From a880b1729656e4fe85e9ccf38608003cab5d5b01 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 16 Jan 2018 21:27:57 +0000 Subject: [PATCH 11/15] [skip ci] Updated translations via Crowdin --- options/locale/locale_fr-FR.ini | 4 +-- options/locale/locale_lv-LV.ini | 1 + options/locale/locale_pl-PL.ini | 55 +++++++++++++++++++++++++++++++++ options/locale/locale_pt-BR.ini | 16 ++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 4f41c9e80..c2714aee3 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -516,7 +516,7 @@ copied=Copié unwatch=Ne plus suivre watch=Suivre unstar=Retirer le vote -star=Voter +star=Favoriser fork=Bifurcation download_archive=Télécharger ce dépôt @@ -1499,7 +1499,7 @@ reopen_issue=`tickets ré-ouverts %s#%[2]s` create_pull_request=`pull request créée le %s#%[2]s` close_pull_request=`pull request fermé %s#%[2]s` reopen_pull_request=`pull request ré-ouverte %s#%[2]s` -comment_issue=`a commenté le problème %s#%[2]s` +comment_issue=`a commenté le ticket %s#%[2]s` merge_pull_request=`demande d'ajout fusionnée le %s#%[2]s` transfer_repo=a transféré le dépôt %s à %s push_tag=a soumis le tag %[2]s sur %[3]s diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 9f9806b13..b27557d79 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -270,6 +270,7 @@ openid_been_used=OpenID adrese '%s' jau ir izmantota. username_password_incorrect=Nepareizs lietotājvārds vai parole. enterred_invalid_repo_name=Lūdzu, pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs. enterred_invalid_owner_name=Lūdzu, pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs. +enterred_invalid_password=Lūdzu, pārliecinieties, vai ievadītā parole ir pareiza. user_not_exist=Lietotājs neeksistē. last_org_owner=Nevar noņemt pēdējo īpašnieku komandas lietotāju, jo organizācijām ir jābūt vismaz vienam īpašniekam. cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 6f99c6a17..87ed83b59 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -138,6 +138,7 @@ invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v run_user_not_match=Użytkownik aplikacji nie jest aktualnym użytkownikiem: %s -> %s save_config_failed=Nie udało się zapisać konfiguracji: %v invalid_admin_setting=Nieprawidłowe ustawienia konta admina: %v +install_success=Witaj! Dziękujemy za wybranie Gitea. Miłej zabawy i trzymaj się! invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v default_keep_email_private=Domyślnie ukrywaj adresy e-mail default_keep_email_private_popup=To jest domyślne ustawienie widoczności adresu e-mail użytkowników. Włączone spowoduje, że adres e-mail wszystkich nowych użytkowników zostanie domyślnie ukryty. @@ -199,6 +200,8 @@ non_local_account=Nie lokalne konta nie mogą zmieniać haseł przez webowy inte verify=Potwierdź scratch_code=Kod jednorazowy use_scratch_code=Użyj kodu jednorazowego +twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy. +twofa_passcode_incorrect=Twój kod autoryzacji jest niepoprawny. Jeśli zapodziałeś/aś swoje urządzenie, użyj swojego kodu jednorazowego do zalogowania. twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny. login_userpass=Użytkownik / Hasło login_openid=OpenID @@ -400,6 +403,7 @@ key_state_desc=Ten klucz był użyty w ciągu ostatnich 7 dni token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni show_openid=Pokaż w profilu hide_openid=Ukryj w profilu +ssh_disabled=SSH jest wyłączony manage_social=Zarządzaj powiązanymi kontami społecznościowymi social_desc=To lista powiązanych kont sieci społecznościowych. Ze względów bezpieczeństwa upewnij się, że rozpoznajesz je wszystkie jako, że można za ich pomocą logować się do Twojego konta. @@ -429,14 +433,17 @@ twofa_disable_note=W razie potrzeby można wyłączyć uwierzytelnianie dwuetapo twofa_disable_desc=Wyłączenie dwuetapowej autoryzacji sprawi, że Twoje konto będzie mniej bezpieczne. Czy na pewno chcesz kontynuować? regenerate_scratch_token_desc=Jeśli zgubiłeś lub zużyłeś swój scratch token możesz go wygenerować tutaj. twofa_disabled=Dwuetapowa autoryzacja została wyłączona. +scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej: or_enter_secret=Lub wprowadź sekret: %s then_enter_passcode=I podaj kod autoryzacji otrzymany z aplikacji: passcode_invalid=Kod dostępu jest nieprawidłowy. Spróbuj ponownie. +twofa_enrolled=Twoje konto ma teraz włączoną autoryzację dwuetapową. Koniecznie zachowaj swój kod jednorazowy (%s), ponieważ zostanie pokazany tylko raz! manage_account_links=Zarządzaj połączonymi kontami manage_account_links_desc=Zewnętrzne konta połączone z tym kontem account_links_not_available=Obecnie nie ma żadnych zewnętrznych kont połączonych z tym kontem remove_account_link=Usuń powiązane konto +remove_account_link_desc=Usunięcie tego konta powiązanego spowoduje cofnięcie mu wszystkich dostępów. Na pewno chcesz kontynuować? remove_account_link_success=Link do konta zostały pomyślnie usunięty! orgs_none=Nie jesteś członkiem żadnej organizacji. @@ -453,6 +460,7 @@ owner=Właściciel repo_name=Nazwa repozytorium repo_name_helper=Dobra nazwa repozytorium jest utworzona z krótkich, łatwych do zapamiętania i unikalnych słów kluczowych. visibility=Widoczność +visiblity_helper=To repozytorium jest prywatne visiblity_helper_forced=Administrator systemu wymaga, żeby wszystkie nowe repozytoria były prywatne visiblity_fork_helper=(Zmiana tej wartości wpłynie na wszystkie forki) clone_helper=Potrzebujesz pomocy z klonowaniem? Odwiedź Pomoc! @@ -479,6 +487,8 @@ mirror_last_synced=Ostatnia synchronizacja watchers=Obserwujący stargazers=Polubienia forks=Forki +pick_reaction=Wybierz swoją reakcję +reactions_more=i %d więcej form.reach_limit_of_creation=Osiągnąłeś limit %d repozytoriów. form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana. @@ -486,6 +496,7 @@ form.name_pattern_not_allowed=Wzorzec nazwy repozytorium „%s” jest niedozwol need_auth=Wymaga autoryzacji migrate_type=Typ migracji +migrate_type_helper=To repozytorium będzie kopią lustrzaną migrate_repo=Przenieś repozytorium migrate.clone_address=Sklonuj adres migrate.clone_address_desc=To może być adres HTTP/HTTPS/GIT lub ścieżka lokalna serwera. @@ -512,6 +523,8 @@ no_desc=Brak opisu quick_guide=Skrócona instrukcja clone_this_repo=Klonuj repozytorium create_new_repo_command=Tworzenie nowego repozytorium z linii poleceń +push_exist_repo=Wypychanie istniejącego repozytorium z linii poleceń +bare_message=Repozytorium jest puste. code=Kod code.desc=Kod jest miejscem przechowywania kodu źródłowego @@ -525,6 +538,7 @@ pulls=Pull Requests labels=Etykiety milestones=Kamienie milowe commits=Commity +commit=Commit releases=Wydania file_raw=Czysty file_history=Historia @@ -541,6 +555,7 @@ editor.edit_file=Edytuj plik editor.preview_changes=Podgląd zmian editor.cannot_edit_non_text_files=Nie można edytować plików binarnych przez interfejs webowy editor.edit_this_file=Edytuj ten plik +editor.must_be_on_a_branch=Musisz być na gałęzi, aby zgłosić lub zaproponować zmiany tego pliku editor.fork_before_edit=Musisz sforkować to repozytorium przed edycją tego pliku editor.delete_this_file=Usuń ten plik editor.must_have_write_access=Musisz mieć uprawnienia do zapisu, aby zgłosić lub zaproponować zmiany do tego pliku @@ -565,6 +580,7 @@ editor.directory_is_a_file=Wpis '%s' w ścieżce nadrzędnej jest plikiem a nie editor.file_is_a_symlink=Plik '%s' jest dowiązaniem symbolicznym które nie może być edytowane przez webowy interfejs editor.filename_is_a_directory=Nazwa '%s' jest istniejącym katalogiem w tym repozytorium. editor.file_editing_no_longer_exists=Plik '%s' który edytujesz nie istnieje już w tym repozytorium. +editor.file_changed_while_editing=Zawartość pliku została w międzyczasie zmieniona. Kliknij tutaj, aby zobaczyć co zostało zmienione lub ponownie naciśnij commit, aby nadpisać te zmiany. editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium. editor.no_changes_to_show=Brak zmian do pokazania. editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v @@ -612,6 +628,8 @@ issues.label_templates.info=Nie ma jeszcze żadnych etykiet. Kliknij na przycisk issues.label_templates.helper=Wybierz zestaw etykiet issues.label_templates.use=Użyj ten zestaw etykiet issues.label_templates.fail_to_load_file=Ładowanie pliku szablonu etykiety '%s' nie powiodło się: %v +issues.add_label_at=dodano etykietę
%s
%s +issues.remove_label_at=usunięto etykietę
%s
%s issues.change_milestone_at=`zmodyfikował kamień milowy z %s na %s %s` issues.deleted_milestone=`(usunięto)` issues.self_assign_at=`samo przypisany do %s` @@ -763,6 +781,7 @@ milestones.filter_sort.most_issues=Najwięcej problemów milestones.filter_sort.least_issues=Najmniej problemów ext_wiki=Zewnętrzna Wiki +ext_wiki.desc=Zewn. wiki linkuje do zewnętrznego systemu wiki wiki=Wiki wiki.welcome=Witamy w Wiki @@ -780,6 +799,7 @@ wiki.new_page_button=Nowa strona wiki.delete_page_button=Usuń stronę wiki.delete_page_notice_1=Spowoduje to usunięcie strony "%s:. Upewnij się, że chcesz ja usunąć. wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje. +wiki.reserved_page=Nazwa strony wiki "%s" jest zajęta. Proszę wybrać inną nazwę. wiki.pages=Strony wiki.last_updated=Ostatnia aktualizacja %s @@ -817,6 +837,8 @@ activity.new_issues_count_1=Nowy problem activity.new_issues_count_n=Nowe problemy activity.new_issue_label=Otwarte activity.title.unresolved_conv_1=%d nierozstrzygnięta dyskusja +activity.title.unresolved_conv_n=Nierozstrzygniętych dyskusji: %d +activity.unresolved_conv_desc=Lista wszystkich starych zgłoszeń i żądań ściągnięcia, które zostały ostatnio zmienione, ale nie został jeszcze rozwiązane. activity.unresolved_conv_label=Otwarte activity.title.releases_1=%d Wydanie activity.title.releases_n=%d Wydań @@ -825,6 +847,7 @@ activity.published_release_label=Opublikowane search=Szukaj search.search_repo=Szukaj repozytorium +search.results=Wyniki wyszukiwania dla "%s" w %s settings=Ustawienia settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium @@ -863,6 +886,7 @@ settings.tracker_url_format_desc=Symbole zastępcze {user} {repo} {index}< settings.enable_timetracker=Włącz śledzenie czasu settings.allow_only_contributors_to_track_time=Pozwól jedynie współpracownikom na śledzenie czasu settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wkład +settings.pulls.allow_merge_commits=Zezwól na komentarze przy scalaniu settings.danger_zone=Strefa niebezpieczeństwa settings.new_owner_has_same_repo=Nowy właściciel już posiada repozytorium o tej samej nazwie. settings.convert=Konwersja na repozytorium regularne @@ -882,6 +906,7 @@ settings.wiki_deletion_success=Dane wiki repozytorium zostały pomyślnie usuni settings.delete=Usuń to repozytorium settings.delete_desc=Po usunięciu repozytorium nie ma odwrotu. Upewnij się, że tego chcesz. settings.delete_notices_1=- Ta operacja NIE MOŻE zostać cofnięta. +settings.delete_notices_2=- Ta operacja trwale usunie wszystko z repozytorium %s, w tym kod źródłowy, zagadnienia, komentarze, wiki i dostęp dla współpracowników. settings.delete_notices_fork_1=- Wszystkie forki staną się niezależnymi repozytoriami po usunięciu. settings.deletion_success=Repozytorium zostało usunięte. settings.update_settings_success=Ustawienia repozytorium zostały zaktualizowane. @@ -899,6 +924,7 @@ settings.search_user_placeholder=Szukaj użytkownika... settings.org_not_allowed_to_be_collaborator=Organizacji nie można dodać jako współpracownika. settings.user_is_org_member=Użytkownik jest członkiem organizacji, który nie może być dodany jako współpracownik. settings.add_webhook=Dodaj webhooka +settings.hooks_desc=Webhooki działają jak proste wyzwalacze żądań HTTP POST. Jeśli cokolwiek zdarzy się w Gitea, wyślemy powiadomienie do wybranego hosta. Więcej informacji można znaleźć w przewodniku webhooków. settings.webhook_deletion=Usuń webhooka settings.webhook_deletion_desc=Usunięcie tego webooka spowoduje usunięcie powiązanych informacji i wpisów w historii. Czy chcesz kontynuować? settings.webhook_deletion_success=Webhook został pomyślnie usunięty! @@ -949,9 +975,11 @@ settings.slack_token=Token settings.slack_domain=Domena settings.slack_channel=Kanał settings.add_discord_hook_desc=Dodaj integrację z Discordem do swojego repozytorium. +settings.add_dingtalk_hook_desc=Dodaj integrację z Dingtalk do swojego repozytorium. settings.deploy_keys=Klucze wdrożeniowe settings.add_deploy_key=Dodaj klucz wdrożenia settings.deploy_key_desc=Klucze wdrożenia pozwalają na dostęp tylko do odczytu. To nie to samo co klucze SSH dla konta osobistego. +settings.is_writable=Przyznaj dostęp do zapisu settings.no_deploy_keys=Nie dodałeś żadnego klucza wdrożenia. settings.title=Tytuł settings.deploy_key_content=Treść @@ -968,6 +996,7 @@ settings.protected_branch_can_push_yes=Możesz wysyłać settings.protected_branch_can_push_no=Nie możesz wysyłać settings.branch_protection=Ochrona gałęzi dla %s settings.protect_this_branch=Chroń tą gałąź +settings.protect_this_branch_desc=Wyłącz wymuszone wypchnięcia i zabroń usuwania. settings.protect_whitelist_committers=Użytkownicy, którzy mogą wypychać do tej gałęzi settings.protect_whitelist_committers_desc=Dodaj użytkowników lub zespoły do białej listy tej gałęzi. Użytkowników z białej listy nie dotyczą typowe ograniczenia wypchnięć. settings.protect_whitelist_users=Użytkownicy, którzy mogą wypychać do tej gałęzi @@ -980,6 +1009,7 @@ settings.update_protect_branch_success=Pomyślnie zmieniono ustawienia ochrony g settings.remove_protected_branch_success=Pomyślnie usunięto ustawienia ochrony gałęzi %s settings.protected_branch_deletion=W celu usunięcia chronionej gałęzi settings.protected_branch_deletion_desc=Każdy z prawami zapisu będzie w stanie wypychać zmiany bezpośrednio do tej gałęzi. Jesteś pewien/pewna? +settings.default_branch_desc=Domyślna gałąź jest uznawana za "bazową". Dopóki nie ustawisz innej gałęzi, wszystkie pull requesty i commity będą automatycznie kierowane do bazowej. settings.choose_branch=Wybierz gałąź... settings.no_protected_branch=Nie ma chronionych gałęzi @@ -1159,11 +1189,16 @@ dashboard.delete_inactivate_accounts=Usuń wszystkie nieaktywne konta dashboard.delete_inactivate_accounts_success=Wszystkie nieaktywne konta zostały usunięte. dashboard.delete_repo_archives=Usuń wszystkie archiwa repozytoriów dashboard.delete_repo_archives_success=Pomyślnie usunięto wszystkie archiwa repozytoriów. +dashboard.delete_missing_repos=Usuń wszystkie rekordy repozytoriów, które nie mają plików Git dashboard.delete_missing_repos_success=Wszystkie repozytoria, które nie miały plików Git zostały usunięte. dashboard.git_gc_repos=Uruchom usuwanie śmieci ze wszystkich repozytoriów dashboard.git_gc_repos_success=Wszystkie repozytoria zakończyły procedurę usuwania śmieci. dashboard.resync_all_sshkeys=Przepisz plik '.ssh/authorized_keys' (dla kluczy SSH Gitea). Nie ma potrzeby tego robić, jeśli używasz wbudowanego serwera SSH. dashboard.resync_all_sshkeys_success=Wszystkie klucze publiczne zarządzane przez Gitea zostały przepisane. +dashboard.resync_all_hooks=Ponownie synchronizuj "hooki" "pre-receive", "update" i "post-receive" wszystkich repozytoriów. +dashboard.resync_all_hooks_success=Hooki" "pre-receive", "update" i "post-receive" wszystkich repozytoriów zostały ponownie zsynchronizowane. +dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy +dashboard.reinit_missing_repos_success=Wszystkie brakujące repozytoria Git, dla których istnieją rekordy, zostały zainicjalizowane. dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika dashboard.sync_external_users_started=Synchronizacja zewnętrznych danych użytkownika rozpoczęta dashboard.server_uptime=Uptime serwera @@ -1219,11 +1254,13 @@ users.max_repo_creation_desc=(Ustaw -1, aby użyć globalnego limitu) users.is_activated=Konto aktywowane users.prohibit_login=Logowanie wyłączone users.is_admin=Uprawnienia administratora +users.allow_git_hook=Może tworzyć hooki Git users.allow_import_local=Może importować lokalne repozytoria users.allow_create_organization=Może tworzyć organizacje users.update_profile=Zaktualizuj profil konta users.delete_account=Usuń konto users.still_own_repo=Ten użytkownik wciąż posiada jedno lub więcej repozytoriów. Muszą one najpierw zostać usunięte lub przetransferowane. +users.still_has_org=Ten użytkownik dalej posiada członkostwo w przynajmniej jednej organizacji. Musi ją najpierw opuścić lub usunąć. users.deletion_success=Konto usunięte pomyślnie. orgs.org_manage_panel=Zarządzanie organizacją @@ -1254,7 +1291,9 @@ auths.security_protocol=Protokół zabezpieczeń auths.domain=Domena auths.host=Serwer auths.port=Port +auths.bind_dn=DN powiązania auths.bind_password=Hasło Bind +auths.bind_password_helper=Uwaga: To hasło jest przechowywane bez szyfrowania. Zdecydowanie zalecane jest użycie konta z uprawnieniami tylko do odczytu. auths.user_base=Baza wyszukiwania auths.user_dn=DN użytkownika auths.attribute_username=Atrybut nazwy użytkownika @@ -1265,6 +1304,7 @@ auths.attribute_mail=Atrybut e-mail auths.attributes_in_bind=Pobierz atrybuty w kontekście Bind DN auths.filter=Filtr użytkownika auths.admin_filter=Filtr administratora +auths.ms_ad_sa=Atrybuty wyszukiwania MS AD auths.smtp_auth=Typ uwierzytelnienia SMTP auths.smtphost=Serwer SMTP auths.smtpport=Port SMTP @@ -1275,6 +1315,10 @@ auths.skip_tls_verify=Pomiń weryfikację protokołu TLS auths.pam_service_name=Nazwa usługi PAM auths.oauth2_provider=Dostawca OAuth2 auths.oauth2_clientID=ID klienta (klucz) +auths.oauth2_clientSecret=Sekretny Token +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.oauth2_use_custom_url=Użyj niestandardowych adresów URL, zamiast domyślnych adresów URL +auths.oauth2_tokenURL=Adres URL tokena auths.oauth2_authURL=URL autoryzacji auths.oauth2_profileURL=URL profilu auths.oauth2_emailURL=URL adresu e-mail @@ -1283,13 +1327,16 @@ auths.tips=Wskazówki auths.tips.oauth2.general=Uwierzytelnianie OAuth2 auths.tips.oauth2.general.tip=Przy rejestracji nowego uwierzytelnienia OAuth2, URL zwrotny/przekierowań powinien mieć postać /user/oauth2//callback auths.tip.oauth2_provider=Dostawca OAuth2 +auths.tip.bitbucket=Zarejestruj nowego konsumenta OAuth na https://bitbucket.org/account/user//oauth-consumers/new i dodaj uprawnienie "Account"-"Read auths.tip.dropbox=Stwórz nową aplikację na https://www.dropbox.com/developers/apps auths.tip.facebook=Zarejestruj nową aplikację na https://developers.facebook.com/apps i dodaj produkt "Facebook Login auths.tip.github=Zarejestruj nową aplikację OAuth na https://github.com/settings/applications/new auths.tip.gitlab=Zarejestruj nową aplikację na https://gitlab.com/profile/applications +auths.tip.google_plus=Uzyskaj dane uwierzytelniające klienta OAuth2 z konsoli Google API (https://console.developers.google.com/) auths.tip.twitter=Przejdź na https://dev.twitter.com/apps, stwórz aplikację i upewnij się że opcja “Allow this application to be used to Sign in with Twitter” jest włączona. auths.edit=Edytuj ustawienia uwierzytelniania auths.activated=To uwierzytelnienie zostało aktywowane +auths.new_success=Uwierzytelnienie '%s' zostało dodane. auths.update_success=Ustawienia uwierzytelniania zostały zaktualizowane. auths.update=Aktualizuj ustawienia uwierzytelniania auths.delete=Usuń to źródło uwierzytelniania @@ -1436,6 +1483,7 @@ notices.type=Typ notices.type_1=Repozytorium notices.desc=Opis notices.op=Operacja +notices.delete_success=Powiadomienia systemu zostały usunięte. [action] create_repo=tworzy repozytorium %s @@ -1452,6 +1500,7 @@ merge_pull_request=`scala pull request %s#%[2]s` transfer_repo=przenosi repozytorium %s do %s push_tag=taguje %[2]s w %[3]s delete_tag=usunięto tag %[2]s z %[3]s +delete_branch=usunięto gałąź %[2]s z %[3]s compare_commits=Porównaj %d commitów [tool] @@ -1491,11 +1540,17 @@ no_read=Nie masz żadnych przeczytanych powiadomień. pin=Przypnij powiadomienie mark_as_read=Oznacz jako przeczytane mark_as_unread=Oznacz jak nieprzeczytane +mark_all_as_read=Oznacz wszystkie jako przeczytane [gpg] error.extract_sign=Nie udało się wyłuskać podpisu error.generate_hash=Nie udało się wygenerować skrótu dla commitu +error.no_committer_account=Brak konta powiązanego z e-mailem autora error.no_gpg_keys_found=Nie znaleziono w bazie danych klucza dla tego podpisu +error.not_signed_commit=Commit nie podpisany +error.failed_retrieval_gpg_keys=Nie udało się odzyskać żadnego klucza powiązanego z kontem autora [units] +error.no_unit_allowed_repo=Nie można w tym repozytorium znaleźć żadnego modułu, do którego masz dostęp +error.unit_not_allowed=Nie masz uprawnień do przeglądania tego modułu repozytorium diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index e93c483f7..d8481f3ce 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -63,6 +63,7 @@ cancel=Cancelar install=Instalação title=Configuração inicial docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia as instruções cuidadosamente antes de alterar qualquer coisa nesta página. +requite_db_desc=Gitea requer MySQL, MSSQL, PostgreSQL, SQLite3 ou TiDB. db_title=Configurações de banco de dados db_type=Tipo de banco de dados host=Servidor @@ -269,6 +270,7 @@ openid_been_used=O endereço OpenID '%s' já está sendo usado. username_password_incorrect=Nome de usuário ou senha incorretos. enterred_invalid_repo_name=Por favor certifique-se de que o nome do repositório está correto. enterred_invalid_owner_name=Por favor certifique-se de que o nome do proprietário está correto. +enterred_invalid_password=Por favor certifique-se de que a senha está correta. user_not_exist=O usuário não existe. last_org_owner=Não é permitido remover o último usuário da equipe de proprietários, pois deve haver pelo menos um proprietário em uma organização. cannot_add_org_to_team=Uma organização não pode ser adicionada como membro de uma equipe. @@ -399,6 +401,8 @@ valid_until=Válido até valid_forever=Válido para sempre last_used=Última vez usado em no_activity=Nenhuma atividade recente +can_read_info=Leitura +can_write_info=Escrita key_state_desc=Essa chave tem sido utilizada nos últimos 7 dias token_state_desc=Esse token tem sido utilizado nos últimos 7 dias show_openid=Mostrar no perfil @@ -753,7 +757,12 @@ pulls.is_checking=A verificação do conflito ainda está em progresso, por favo pulls.can_auto_merge_desc=O merge deste pull request pode ser aplicado automaticamente. pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos. pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos. +pulls.no_merge_desc=O merge deste pull request não pode ser aplicado porque nenhuma opção de merge está habilitada. +pulls.no_merge_helper=Para aplicar o merge deste pull request, habilite pelo menos uma opção de mesclagem nas configurações do repositório ou aplique o merge do manualmente. pulls.merge_pull_request=Aplicar merge de Pull Request +pulls.rebase_merge_pull_request=Aplicar Rebase e Merge +pulls.squash_merge_pull_request=Aplicar Squash e Merge +pulls.invalid_merge_option=Você não pode usar esta opção de merge neste pull request pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.` milestones.new=Novo marco @@ -892,6 +901,10 @@ settings.tracker_url_format_desc=Você pode usar o espaço reservado {user settings.enable_timetracker=Habilitar contador de tempo settings.allow_only_contributors_to_track_time=Permitir apenas colaboradores controlar o contador de tempo settings.pulls_desc=Habilitar pull requests para aceitar contribuições públicas +settings.pulls.ignore_whitespace=Ignorar alterações com espaço em branco ao verificar conflitos +settings.pulls.allow_merge_commits=Permitir commits via merge +settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge +settings.pulls.allow_squash_commits=Permitir aplicação do squash antes do merge settings.danger_zone=Zona de perigo settings.new_owner_has_same_repo=O novo dono já tem um repositório com o mesmo nome. Por favor, escolha outro nome. settings.convert=Converter para repositório tradicional @@ -984,6 +997,8 @@ settings.add_dingtalk_hook_desc=Adicionar integração com Dingtalk settings.deploy_keys=Chaves de Deploy settings.add_deploy_key=Nova chave settings.deploy_key_desc=Chave de Deploy só tem acesso somente leitura. Não é igual as chaves SSH de conta pessoal. +settings.is_writable=Permitir acesso de escrita +settings.is_writable_info=Essa chave pode ser usada para push neste repositório? As chaves de implantação sempre têm acesso de pull. settings.no_deploy_keys=Você ainda não adicionou nenhuma chave de Deploy. settings.title=Título settings.deploy_key_content=Conteúdo da chave @@ -1308,6 +1323,7 @@ auths.attribute_mail=Atributo e-mail auths.attributes_in_bind=Buscar os atributos no contexto de Bind DN auths.filter=Filtro de usuário auths.admin_filter=Filtro de administrador +auths.ms_ad_sa=Atributos de pesquisa do MS AD auths.smtp_auth=Tipo de autenticação SMTP auths.smtphost=Host SMTP auths.smtpport=Porta SMTP From b0d5bb909b2e558bee5d4d58f201012d5f8b4c1c Mon Sep 17 00:00:00 2001 From: Ethan Koenig Date: Wed, 17 Jan 2018 13:51:07 -0800 Subject: [PATCH 12/15] Delete indexer DB entries when (re)creating index (#3385) * comment --- models/repo_indexer.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/models/repo_indexer.go b/models/repo_indexer.go index 41c9f0fa3..be409f516 100644 --- a/models/repo_indexer.go +++ b/models/repo_indexer.go @@ -86,6 +86,13 @@ func populateRepoIndexerAsynchronously() error { return nil } + // if there is any existing repo indexer metadata in the DB, delete it + // since we are starting afresh. Also, xorm requires deletes to have a + // condition, and we want to delete everything, thus 1=1. + if _, err := x.Where("1=1").Delete(new(RepoIndexerStatus)); err != nil { + return err + } + var maxRepoID int64 if _, err = x.Select("MAX(id)").Table("repository").Get(&maxRepoID); err != nil { return err From ca306985d35f295fb2a2f8a54661731462426281 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Fri, 19 Jan 2018 08:18:51 +0200 Subject: [PATCH 13/15] Change how merged PR commit info are prepared (#3368) * Change how merged PR commits and diff are made * Update code.gitea.io/git dependency * Fix typo * Remove unneeded local variable --- models/pull.go | 11 ++- routers/repo/pull.go | 90 ++++++++++--------------- vendor/code.gitea.io/git/repo_commit.go | 8 +-- vendor/vendor.json | 6 +- 4 files changed, 49 insertions(+), 66 deletions(-) diff --git a/models/pull.go b/models/pull.go index 38312e4e4..5c54a2268 100644 --- a/models/pull.go +++ b/models/pull.go @@ -132,6 +132,11 @@ func (pr *PullRequest) GetDefaultSquashMessage() string { return fmt.Sprintf("%s (#%d)", pr.Issue.Title, pr.Issue.Index) } +// GetGitRefName returns git ref for hidden pull request branch +func (pr *PullRequest) GetGitRefName() string { + return fmt.Sprintf("refs/pull/%d/head", pr.Index) +} + // APIFormat assumes following fields have been assigned with valid values: // Required - Issue // Optional - Merger @@ -562,7 +567,7 @@ func (pr *PullRequest) getMergeCommit() (*git.Commit, error) { indexTmpPath := filepath.Join(os.TempDir(), "gitea-"+pr.BaseRepo.Name+"-"+strconv.Itoa(time.Now().Nanosecond())) defer os.Remove(indexTmpPath) - headFile := fmt.Sprintf("refs/pull/%d/head", pr.Index) + headFile := pr.GetGitRefName() // Check if a pull request is merged into BaseBranch _, stderr, err := process.GetManager().ExecDirEnv(-1, "", fmt.Sprintf("isMerged (git merge-base --is-ancestor): %d", pr.BaseRepo.ID), @@ -980,7 +985,7 @@ func (pr *PullRequest) UpdatePatch() (err error) { // corresponding branches of base repository. // FIXME: Only push branches that are actually updates? func (pr *PullRequest) PushToBaseRepo() (err error) { - log.Trace("PushToBaseRepo[%d]: pushing commits to base repo 'refs/pull/%d/head'", pr.BaseRepoID, pr.Index) + log.Trace("PushToBaseRepo[%d]: pushing commits to base repo '%s'", pr.BaseRepoID, pr.GetGitRefName()) headRepoPath := pr.HeadRepo.RepoPath() headGitRepo, err := git.OpenRepository(headRepoPath) @@ -995,7 +1000,7 @@ func (pr *PullRequest) PushToBaseRepo() (err error) { // Make sure to remove the remote even if the push fails defer headGitRepo.RemoveRemote(tmpRemoteName) - headFile := fmt.Sprintf("refs/pull/%d/head", pr.Index) + headFile := pr.GetGitRefName() // Remove head in case there is a conflict. file := path.Join(pr.BaseRepo.RepoPath(), headFile) diff --git a/routers/repo/pull.go b/routers/repo/pull.go index c06c67552..1db1e6327 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -253,40 +253,30 @@ func setMergeTarget(ctx *context.Context, pull *models.PullRequest) { } // PrepareMergedViewPullInfo show meta information for a merged pull request view page -func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) { +func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) *git.PullRequestInfo { pull := issue.PullRequest - var err error - if err = pull.GetHeadRepo(); err != nil { - ctx.ServerError("GetHeadRepo", err) - return - } - setMergeTarget(ctx, pull) ctx.Data["HasMerged"] = true - mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID) - if err != nil { - ctx.ServerError("GetCommit", err) - return - } - // the ID of the last commit in the PR (not including the merge commit) - endCommitID, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1) - if err != nil { - ctx.ServerError("ParentID", err) - return - } + prInfo, err := ctx.Repo.GitRepo.GetPullRequestInfo(ctx.Repo.Repository.RepoPath(), + pull.MergeBase, pull.GetGitRefName()) - ctx.Data["NumCommits"], err = ctx.Repo.GitRepo.CommitsCountBetween(pull.MergeBase, endCommitID.String()) if err != nil { - ctx.ServerError("Repo.GitRepo.CommitsCountBetween", err) - return - } - ctx.Data["NumFiles"], err = ctx.Repo.GitRepo.FilesCountBetween(pull.MergeBase, endCommitID.String()) - if err != nil { - ctx.ServerError("Repo.GitRepo.FilesCountBetween", err) - return + if strings.Contains(err.Error(), "fatal: Not a valid object name") { + ctx.Data["IsPullReuqestBroken"] = true + ctx.Data["BaseTarget"] = "deleted" + ctx.Data["NumCommits"] = 0 + ctx.Data["NumFiles"] = 0 + return nil + } + + ctx.ServerError("GetPullRequestInfo", err) + return nil } + ctx.Data["NumCommits"] = prInfo.Commits.Len() + ctx.Data["NumFiles"] = prInfo.NumFiles + return prInfo } // PrepareViewPullInfo show meta information for a pull request preview page @@ -351,28 +341,16 @@ func ViewPullCommits(ctx *context.Context) { var commits *list.List if pull.HasMerged { - PrepareMergedViewPullInfo(ctx, issue) + prInfo := PrepareMergedViewPullInfo(ctx, issue) if ctx.Written() { return + } else if prInfo == nil { + ctx.NotFound("ViewPullCommits", nil) + return } ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name - - mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID) - if err != nil { - ctx.ServerError("Repo.GitRepo.GetCommit", err) - return - } - endCommitID, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1) - if err != nil { - ctx.ServerError("ParentID", err) - return - } - commits, err = ctx.Repo.GitRepo.CommitsBetweenIDs(endCommitID.String(), pull.MergeBase) - if err != nil { - ctx.ServerError("Repo.GitRepo.CommitsBetweenIDs", err) - return - } + commits = prInfo.Commits } else { prInfo := PrepareViewPullInfo(ctx, issue) if ctx.Written() { @@ -415,26 +393,26 @@ func ViewPullFiles(ctx *context.Context) { var headTarget string if pull.HasMerged { - PrepareMergedViewPullInfo(ctx, issue) + prInfo := PrepareMergedViewPullInfo(ctx, issue) if ctx.Written() { return + } else if prInfo == nil { + ctx.NotFound("ViewPullFiles", nil) + return } diffRepoPath = ctx.Repo.GitRepo.Path - startCommitID = pull.MergeBase - mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID) - if err != nil { - ctx.ServerError("GetCommit", err) - return - } - endCommitSha, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1) - if err != nil { - ctx.ServerError("ParentID", err) - return - } - endCommitID = endCommitSha.String() gitRepo = ctx.Repo.GitRepo + headCommitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName()) + if err != nil { + ctx.ServerError("GetRefCommitID", err) + return + } + + startCommitID = prInfo.MergeBase + endCommitID = headCommitID + headTarget = path.Join(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name diff --git a/vendor/code.gitea.io/git/repo_commit.go b/vendor/code.gitea.io/git/repo_commit.go index 44ad8450f..56bebd7a3 100644 --- a/vendor/code.gitea.io/git/repo_commit.go +++ b/vendor/code.gitea.io/git/repo_commit.go @@ -11,8 +11,8 @@ import ( "strings" ) -// getRefCommitID returns the last commit ID string of given reference (branch or tag). -func (repo *Repository) getRefCommitID(name string) (string, error) { +// GetRefCommitID returns the last commit ID string of given reference (branch or tag). +func (repo *Repository) GetRefCommitID(name string) (string, error) { stdout, err := NewCommand("show-ref", "--verify", name).RunInDir(repo.Path) if err != nil { if strings.Contains(err.Error(), "not a valid ref") { @@ -25,12 +25,12 @@ func (repo *Repository) getRefCommitID(name string) (string, error) { // GetBranchCommitID returns last commit ID string of given branch. func (repo *Repository) GetBranchCommitID(name string) (string, error) { - return repo.getRefCommitID(BranchPrefix + name) + return repo.GetRefCommitID(BranchPrefix + name) } // GetTagCommitID returns last commit ID string of given tag. func (repo *Repository) GetTagCommitID(name string) (string, error) { - return repo.getRefCommitID(TagPrefix + name) + return repo.GetRefCommitID(TagPrefix + name) } // parseCommitData parses commit information from the (uncompressed) raw diff --git a/vendor/vendor.json b/vendor/vendor.json index 51f758fd2..e00816926 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -3,10 +3,10 @@ "ignore": "test appengine", "package": [ { - "checksumSHA1": "1WHdGmDRsFRTD5N69l+MEbZr+nM=", + "checksumSHA1": "Gz+a5Qo4PCiB/Gf2f02v8HEAxDM=", "path": "code.gitea.io/git", - "revision": "f4a91053671bee69f1995e456c1541668717c19d", - "revisionTime": "2018-01-07T06:11:05Z" + "revision": "6798d0f202cdc7187c00a467b586a4bdee27e8c9", + "revisionTime": "2018-01-14T14:37:32Z" }, { "checksumSHA1": "Qtq0kW+BnpYMOriaoCjMa86WGG8=", From 05ab747054adf8617fc2e365bfeaed775cb10746 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 19 Jan 2018 07:53:45 +0100 Subject: [PATCH 14/15] Force-push to base repo's ref/pull/#/head (#3393) * Force-push to base repo's ref/pull/#/head Fixes force-pushing to pull request branches, otherwise failing with: [...gitea/models/pull.go:1022 AddTestPullRequestTask()] [E] PushToBaseRepo: Push: exit status 1 - To /path/to/gitea-repositories/org/repo.git ! [rejected] issue-fix -> refs/pull/20/head (non-fast-forward) * format --- models/pull.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/pull.go b/models/pull.go index 5c54a2268..45fe852e9 100644 --- a/models/pull.go +++ b/models/pull.go @@ -1010,6 +1010,7 @@ func (pr *PullRequest) PushToBaseRepo() (err error) { if err = git.Push(headRepoPath, git.PushOptions{ Remote: tmpRemoteName, Branch: fmt.Sprintf("%s:%s", pr.HeadBranch, headFile), + Force: true, }); err != nil { return fmt.Errorf("Push: %v", err) } From 1ce35724094f8edc124ffe4b4e1f06a99ad0c646 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 19 Jan 2018 20:45:53 +0100 Subject: [PATCH 15/15] Remove useless check (#3384) In #3377, I put check inside all write key function. This one is useless no. --- models/ssh_key.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/models/ssh_key.go b/models/ssh_key.go index e121b0d5b..97a2d2dee 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -387,10 +387,6 @@ func addKey(e Engine, key *PublicKey) (err error) { return err } - // Don't need to rewrite this file if builtin SSH server is enabled. - if setting.SSH.StartBuiltinServer { - return nil - } return appendAuthorizedKeysToFile(key) }