From 4416a4199b3e6a1181c73893345be4ca8343d9b8 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 3 Oct 2024 00:30:51 +0000 Subject: [PATCH 01/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_ja-JP.ini | 1 + options/locale/locale_pt-PT.ini | 2 ++ 2 files changed, 3 insertions(+) diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 3a80c741db4f..2e861df207ba 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1926,6 +1926,7 @@ pulls.delete.text=本当にこのプルリクエストを削除しますか? ( pulls.recently_pushed_new_branches=%[2]s 、あなたはブランチ %[1]s にプッシュしました pull.deleted_branch=(削除済み):%s +pull.agit_documentation=AGitに関するドキュメントを確認する comments.edit.already_changed=コメントの変更を保存できません。 他のユーザーによって内容がすでに変更されているようです。 変更を上書きしないようにするため、ページを更新してからもう一度編集してください diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index e423832e9ee1..cb521fe58c99 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1040,6 +1040,7 @@ issue_labels_helper=Escolha um conjunto de rótulos para as questões. license=Licença license_helper=Escolha um ficheiro de licença. license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: Escolher uma licença. +multiple_licenses=Múltiplas licenças object_format=Formato dos elementos object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível. readme=README @@ -2941,6 +2942,7 @@ dashboard.start_schedule_tasks=Iniciar tarefas de agendamento das operações dashboard.sync_branch.started=Sincronização de ramos iniciada dashboard.sync_tag.started=Sincronização de etiquetas iniciada dashboard.rebuild_issue_indexer=Reconstruir indexador de questões +dashboard.sync_repo_licenses=Sincronizar licenças do repositório users.user_manage_panel=Gestão das contas de utilizadores users.new_account=Criar conta de utilizador From 0b1b4030e66b1312fc9c0270f128bcf368f14178 Mon Sep 17 00:00:00 2001 From: sommerf-lf <159693954+sommerf-lf@users.noreply.github.com> Date: Thu, 3 Oct 2024 03:00:56 +0200 Subject: [PATCH 02/41] add {{TEST_MINIO_ENDPOINT}} for local testing "with/without" docker + fix pgsql testing doc (#32105) while testing i found out that testing locally as documented in the changed README.md for pgsql isn't working because of the minio dependency. reworked this to by default be still docker, but allow for for local with only minio in docker and testing on bare metal. also depending on this: fixed docs for running pgsql test Closes: #32168 (by changing documentation for pgsql tests) Closes: #32169 (by changing documentation, Makefile & pgsql.ini.tmpl: adding {{TEST_MINIO_ENDPOINT}}) sry for the combined pr, but when testing I ran into this issue and first thought they were related and now finally address the same problem: not beeing able to run pgsql integration tests as described in the according README.md --- Makefile | 2 ++ tests/integration/README.md | 8 ++++++-- tests/integration/README_ZH.md | 12 ++++++++---- tests/pgsql.ini.tmpl | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 065b66d28c66..b9e940b2485a 100644 --- a/Makefile +++ b/Makefile @@ -179,6 +179,7 @@ TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres TEST_PGSQL_SCHEMA ?= gtestschema +TEST_MINIO_ENDPOINT ?= minio:9000 TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= gitea TEST_MSSQL_USERNAME ?= sa @@ -574,6 +575,7 @@ generate-ini-pgsql: -e 's|{{TEST_PGSQL_USERNAME}}|${TEST_PGSQL_USERNAME}|g' \ -e 's|{{TEST_PGSQL_PASSWORD}}|${TEST_PGSQL_PASSWORD}|g' \ -e 's|{{TEST_PGSQL_SCHEMA}}|${TEST_PGSQL_SCHEMA}|g' \ + -e 's|{{TEST_MINIO_ENDPOINT}}|${TEST_MINIO_ENDPOINT}|g' \ -e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \ -e 's|{{TEST_LOGGER}}|$(or $(TEST_LOGGER),test$(COMMA)file)|g' \ -e 's|{{TEST_TYPE}}|$(or $(TEST_TYPE),integration)|g' \ diff --git a/tests/integration/README.md b/tests/integration/README.md index f6f74ca21ff9..e673bca228ec 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -56,11 +56,15 @@ TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=root T ## Run pgsql integration tests Setup a pgsql database inside docker ``` -docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:latest #(just ctrl-c to stop db and clean the container) +docker run -e "POSTGRES_DB=test" -e "POSTGRES_USER=postgres" -e "POSTGRES_PASSWORD=postgres" -p 5432:5432 --rm --name pgsql postgres:latest #(just ctrl-c to stop db and clean the container) +``` +Setup minio inside docker +``` +docker run --rm -p 9000:9000 -e MINIO_ROOT_USER=123456 -e MINIO_ROOT_PASSWORD=12345678 --name minio bitnami/minio:2023.8.31 ``` Start tests based on the database container ``` -TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql +TEST_MINIO_ENDPOINT=localhost:9000 TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=postgres TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql ``` ## Run mssql integration tests diff --git a/tests/integration/README_ZH.md b/tests/integration/README_ZH.md index 6aea4ab212ba..a6768fd0f3c5 100644 --- a/tests/integration/README_ZH.md +++ b/tests/integration/README_ZH.md @@ -42,7 +42,7 @@ make test-sqlite ## 如何使用 mysql 数据库进行集成测试 首先在docker容器里部署一个 mysql 数据库 ``` -docker run -e "MYSQL_DATABASE=test" -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -p 3306:3306 --rm --name mysql mysql:8 #(just ctrl-c to stop db and clean the container) +docker run -e "MYSQL_DATABASE=test" -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -p 3306:3306 --rm --name mysql mysql:8 #(just ctrl-c to stop db and clean the container) ``` 之后便可以基于这个数据库进行集成测试 ``` @@ -52,17 +52,21 @@ TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=root T ## 如何使用 pgsql 数据库进行集成测试 同上,首先在 docker 容器里部署一个 pgsql 数据库 ``` -docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:14 #(just ctrl-c to stop db and clean the container) +docker run -e "POSTGRES_DB=test" -e "POSTGRES_USER=postgres" -e "POSTGRES_PASSWORD=postgres" -p 5432:5432 --rm --name pgsql postgres:latest #(just ctrl-c to stop db and clean the container) +``` +在docker内设置minio +``` +docker run --rm -p 9000:9000 -e MINIO_ROOT_USER=123456 -e MINIO_ROOT_PASSWORD=12345678 --name minio bitnami/minio:2023.8.31 ``` 之后便可以基于这个数据库进行集成测试 ``` -TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql +TEST_MINIO_ENDPOINT=localhost:9000 TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=postgres TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql ``` ## Run mssql integration tests 同上,首先在 docker 容器里部署一个 mssql 数据库 ``` -docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container) +docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Standard" -e "SA_PASSWORD=MwantsaSecurePassword1" -p 1433:1433 --rm --name mssql microsoft/mssql-server-linux:latest #(just ctrl-c to stop db and clean the container) ``` 之后便可以基于这个数据库进行集成测试 ``` diff --git a/tests/pgsql.ini.tmpl b/tests/pgsql.ini.tmpl index 6b54f790c52a..695662c2e9d2 100644 --- a/tests/pgsql.ini.tmpl +++ b/tests/pgsql.ini.tmpl @@ -115,7 +115,7 @@ MINIO_BASE_PATH = repo-avatars/ [storage] STORAGE_TYPE = minio SERVE_DIRECT = false -MINIO_ENDPOINT = minio:9000 +MINIO_ENDPOINT = {{TEST_MINIO_ENDPOINT}} MINIO_ACCESS_KEY_ID = 123456 MINIO_SECRET_ACCESS_KEY = 12345678 MINIO_BUCKET = gitea From d266d190bd744b7b6f572bf69a42013e21b9be62 Mon Sep 17 00:00:00 2001 From: Bruno Sofiato Date: Thu, 3 Oct 2024 13:03:36 -0300 Subject: [PATCH 03/41] Fixed race condition when deleting documents by repoId in ElasticSearch (#32185) Resolves #32184 --------- Signed-off-by: Bruno Sofiato --- .../code/elasticsearch/elasticsearch.go | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/modules/indexer/code/elasticsearch/elasticsearch.go b/modules/indexer/code/elasticsearch/elasticsearch.go index d64d99433d98..5c01034450be 100644 --- a/modules/indexer/code/elasticsearch/elasticsearch.go +++ b/modules/indexer/code/elasticsearch/elasticsearch.go @@ -20,6 +20,7 @@ import ( indexer_internal "code.gitea.io/gitea/modules/indexer/internal" inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch" "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/typesniffer" @@ -197,8 +198,33 @@ func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha st return nil } -// Delete deletes indexes by ids +// Delete entries by repoId func (b *Indexer) Delete(ctx context.Context, repoID int64) error { + if err := b.doDelete(ctx, repoID); err != nil { + // Maybe there is a conflict during the delete operation, so we should retry after a refresh + log.Warn("Deletion of entries of repo %v within index %v was erroneus. Trying to refresh index before trying again", repoID, b.inner.VersionedIndexName(), err) + if err := b.refreshIndex(ctx); err != nil { + return err + } + if err := b.doDelete(ctx, repoID); err != nil { + log.Error("Could not delete entries of repo %v within index %v", repoID, b.inner.VersionedIndexName()) + return err + } + } + return nil +} + +func (b *Indexer) refreshIndex(ctx context.Context) error { + if _, err := b.inner.Client.Refresh(b.inner.VersionedIndexName()).Do(ctx); err != nil { + log.Error("Error while trying to refresh index %v", b.inner.VersionedIndexName(), err) + return err + } + + return nil +} + +// Delete entries by repoId +func (b *Indexer) doDelete(ctx context.Context, repoID int64) error { _, err := b.inner.Client.DeleteByQuery(b.inner.VersionedIndexName()). Query(elastic.NewTermsQuery("repo_id", repoID)). Do(ctx) From 0bd75390f535c2f7f6422117476c953a178103ba Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 4 Oct 2024 00:30:54 +0000 Subject: [PATCH 04/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_ga-IE.ini | 1374 +++++++++++++++++++++++++++++++ 1 file changed, 1374 insertions(+) create mode 100644 options/locale/locale_ga-IE.ini diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini new file mode 100644 index 000000000000..4f579c0dd74e --- /dev/null +++ b/options/locale/locale_ga-IE.ini @@ -0,0 +1,1374 @@ +home=Baile +dashboard=Deais +explore=Iniúch +help=Cabhair +logo=Lógó +sign_in=Sínigh isteach +sign_in_with_provider=Sínigh isteach le %s +sign_in_or=nó +sign_out=Sínigh amach +sign_up=Cláraigh +link_account=Cuntas Nasc +register=Cláraigh +version=Leagan +powered_by=Cumhachtaithe ag %s +page=Leathanach +template=Teimpléad +language=Teanga +notifications=Fógraí +active_stopwatch=Rianaitheoir Ama Gníomhach +tracked_time_summary=Achoimre ar an am rianaithe bunaithe ar scagairí an liosta eisiúna +create_new=Cruthaigh... +user_profile_and_more=Próifíl agus Socruithe... +signed_in_as=Sínithe isteach mar +enable_javascript=Éilíonn JavaScript ar an suíomh Gréasáin seo. +toc=Tábla na nÁbhar +licenses=Ceadúnais +return_to_gitea=Fill ar Gitea +more_items=Tuilleadh míreanna + +username=Ainm úsáideora +email=Seoladh ríomhphoist +password=Pasfhocal +access_token=Comhartha Rochtana +re_type=Deimhnigh Pasfhocal +captcha=CAPTCHA +twofa=Fíordheimhniú Dhá-Fhachtóir +twofa_scratch=Cód Scratch Dhá-Fhachtóra +passcode=Paschód + +webauthn_insert_key=Cuir isteach d'eochair slándála +webauthn_sign_in=Brúigh an cnaipe ar d'eochair slándála. Mura bhfuil aon chnaipe ag d'eochair slándála, cuir isteach é arís. +webauthn_press_button=Brúigh an cnaipe ar d'eochair slándála le do thoil… +webauthn_use_twofa=Úsáid cód dhá fhachtóir ó do ghuthán +webauthn_error=Ní fhéadfaí do eochair slándála a léamh. +webauthn_unsupported_browser=Ní thacaíonn do bhrabhsálaí le WebAuthn faoi láthair. +webauthn_error_unknown=Tharla earráid anaithnid. Déan iarracht arís. +webauthn_error_insecure=Ní thacaíonn WebAuthn ach le naisc slán. Le haghaidh tástála thar HTTP, is féidir leat an bunús “localhost” nó "127.0.0.1" a úsáid +webauthn_error_unable_to_process=Ní fhéadfadh an freastalaí d'iarratas a phróiseáil. +webauthn_error_duplicated=Ní cheadaítear an eochair slándála don iarratas seo. Déan cinnte le do thoil nach bhfuil an eochair cláraithe cheana féin. +webauthn_error_empty=Ní mór duit ainm a shocrú don eochair seo. +webauthn_error_timeout=Sroicheadh an teorainn ama sula bhféadfaí d’eochair a léamh. Athlódáil an leathanach seo, le do thoil, agus déan iarracht arís. +webauthn_reload=Athlódáil + +repository=Stór +organization=Eagraíocht +mirror=Scáthán +new_repo=Stór Nua +new_migrate=Imirce Nua +new_mirror=Scáthán Nua +new_fork=Forc Stór Nua +new_org=Eagraíocht Nua +new_project=Tionscadal Nua +new_project_column=Colún Nua +manage_org=Eagraíochtaí a bhainistiú +admin_panel=Riarachán Láithreáin +account_settings=Socruithe Cuntais +settings=Socruithe +your_profile=Próifíl +your_starred=Réaltaigh +your_settings=Socruithe + +all=Gach +sources=Foinsí +mirrors=Scátháin +collaborative=Comhoibritheach +forks=Forcanna + +activities=Gníomhaíochtaí +pull_requests=Iarrataí Tarraing +issues=Saincheisteanna +milestones=Clocha míle + +ok=CEART GO LEOR +cancel=Cealaigh +retry=Atriail +rerun=Ath-rith +rerun_all=Ath-rith na poist go léir +save=Sábháil +add=Cuir +add_all=Cuir Gach +remove=Bain +remove_all=Bain Gach +remove_label_str=Bain mír “%s” +edit=Cuir in eagar +view=Amharc +test=Tástáil + +enabled=Cumasaithe +disabled=Díchumasaithe +locked=Faoi ghlas + +copy=Cóipeáil +copy_url=Cóipeáil URL +copy_hash=Cóipeáil hais +copy_content=Cóipeáil ábhair +copy_branch=Ainm brainse cóipeáil +copy_success=Cóipeáil! +copy_error=Theip ar an gcóip +copy_type_unsupported=Ní féidir an cineál comhaid seo a chóipeáil + +write=Scríobh +preview=Réamhamharc +loading=Á lódáil... + +error=Earráid +error404=Níl an leathanach atá tú ag iarraidh a bhaint amach annníl tú údaraithe chun é a fheiceáil. +go_back=Ar ais +invalid_data=Sonraí neamhbhailí: %v + +never=Riamh +unknown=Anaithnid + +rss_feed=Fothú RSS + +pin=Bioráin +unpin=Díphoráil + +artifacts=Déantáin +confirm_delete_artifact=An bhfuil tú cinnte gur mhaith leat an déantán '%s' a scriosadh? + +archived=Cartlann + +concept_system_global=Domhanda +concept_user_individual=Duine aonair +concept_code_repository=Stóráil +concept_user_organization=Eagraíocht + +show_timestamps=Taispeáin stampaí ama +show_log_seconds=Taispeáin soicindí +show_full_screen=Taispeáin scáileán iomlán +download_logs=Íoslódáil logaí + +confirm_delete_selected=Deimhnigh chun gach earra roghnaithe a scriosadh? + +name=Ainm +value=Luach + +filter=Scagaire +filter.clear=Scagaire Soiléir +filter.is_archived=Cartlannaithe +filter.not_archived=Gan Cartlannaithe +filter.is_fork=Forcailte +filter.not_fork=Gan Forcailte +filter.is_mirror=Scáthánaithe +filter.not_mirror=Gan Scáthánaithe +filter.is_template=Teimpléad +filter.not_template=Gan Teimpléad +filter.public=Poiblí +filter.private=Príobháideach + +no_results_found=Níor aimsíodh aon torthaí. +internal_error_skipped=Tharla earráid inmheánach ach éirithe as: %s + +[search] +search=Cuardaigh... +type_tooltip=Cineál cuardaigh +fuzzy=Doiléir +fuzzy_tooltip=Cuir san áireamh torthaí a mheaitseálann an téarma cuardaigh go dlúth freisin +exact=Beacht +exact_tooltip=Ní chuir san áireamh ach torthaí a mheaitseálann leis an téarma +repo_kind=Cuardaigh stórtha... +user_kind=Cuardaigh úsáideoirí... +org_kind=Cuardaigh eagraíochtaí... +team_kind=Cuardaigh foirne... +code_kind=Cód cuardaigh... +code_search_unavailable=Níl cuardach cód ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. +code_search_by_git_grep=Soláthraíonn “git grep” torthaí cuardaigh cód reatha. D'fhéadfadh torthaí níos fearr a bheith ann má chuireann riarthóir an láithreáin ar chumas Innéacsaithe +package_kind=Cuardaigh pacáistí... +project_kind=Cuardaigh tionscadail... +branch_kind=Cuardaigh brainsí... +tag_kind=Cuardaigh clibeanna... +tag_tooltip=Cuardaigh clibeanna meaitseála. Úsáid '%' le haon seicheamh uimhreacha a mheaitseáil. +commit_kind=Cuardaigh tiomáintí... +runner_kind=Cuardaigh reathaithe... +no_results=Níl aon torthaí meaitseála le fáil. +issue_kind=Saincheisteanna cuardaigh... +pull_kind=Cuardaigh iarratais tarraingthe... +keyword_search_unavailable=Níl cuardach de réir eochairfhocal ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. + +[aria] +navbar=Barra Nascleanúint +footer=Buntásc +footer.software=Maidir le Bogearraí +footer.links=Naisc + +[heatmap] +number_of_contributions_in_the_last_12_months=%s ranníocaíochtaí le 12 mhí anuas +no_contributions=Gan ranníocaíochtaí +less=Níos lú +more=Níos mó + +[editor] +buttons.heading.tooltip=Cuir ceannteideal leis +buttons.bold.tooltip=Cuir téacs trom leis +buttons.italic.tooltip=Cuir téacs iodálach leis +buttons.quote.tooltip=Téacs luaigh +buttons.code.tooltip=Cuir cód leis +buttons.link.tooltip=Cuir nasc leis +buttons.list.unordered.tooltip=Cuir liosta piléar leis +buttons.list.ordered.tooltip=Cuir liosta uimhrithe +buttons.list.task.tooltip=Cuir liosta tascanna leis +buttons.mention.tooltip=Luaigh úsáideoir nó foireann +buttons.ref.tooltip=Déan tagairt d'eisiúint nó iarratas tarraingthe +buttons.switch_to_legacy.tooltip=Úsáid an eagarthóir oidhreachta ina ionad +buttons.enable_monospace_font=Cumasaigh cló monospace +buttons.disable_monospace_font=Díchumasaigh cló monospace + +[filter] +string.asc=A - Z +string.desc=Z - A + +[error] +occurred=Tharla earráid +report_message=Má chreideann tú gur fabht Gitea é seo, déan cuardach le haghaidh ceisteanna ar GitHub nó oscail eagrán nua más gá. +not_found=Ní raibh an sprioc in ann a fháil. +network_error=Earráid líonra + +[startpage] +app_desc=Seirbhís Git gan phian, féin-óstáil +install=Éasca a shuiteáil +install_desc=Níl ort ach rith an dénártha do d'ardán, seol é le Docker, nó faigh pacáilte é. +platform=Tras-ardán +platform_desc=Ritheann Gitea áit ar bith is féidir le Go tiomsú le haghaidh: Windows, macOS, Linux, ARM, srl Roghnaigh an ceann is breá leat! +lightweight=Éadrom +lightweight_desc=Tá íosta riachtanais íseal ag Gitea agus is féidir leo rith ar Raspberry Pi saor. Sábháil fuinneamh do mheaisín! +license=Foinse Oscailte +license_desc=Téigh go bhfaighidh %[2]s! Bí linn trí cur leis chun an tionscadal seo a fheabhsú fós. Ná bíodh cúthail ort a bheith i do rannpháirtí! + +[install] +install=Suiteáil +title=Cumraíocht Tosaigh +docker_helper=Má ritheann tú Gitea taobh istigh de Docker, léigh an doiciméadúchán roimh aon socruithe a athrú. +require_db_desc=Éilíonn Gitea MySQL, PostgreSQL, MSSQL, SQLite3 nó TiDB (prótacal MySQL). +db_title=Socruithe Bunachar Sonraí +db_type=Cineál Bunachar Sonraí +host=Óstach +user=Ainm úsáideora +password=Pasfhocal +db_name=Ainm Bunachar Sonraí +db_schema=Scéim +db_schema_helper=Fág bán le haghaidh réamhshocraithe bunachar sonraí ("poiblí"). +ssl_mode=SSL +path=Cosán +sqlite_helper=Conair comhad don bhunachar sonraí SQLite3. Cuir
isteach cosán iomlán má reáchtáil tú Gitea mar sheirbhís. +reinstall_error=Tá tú ag iarraidh a shuiteáil i mbunachar sonraí Gitea atá ann cheana +reinstall_confirm_message=Is féidir fadhbanna iolracha a bheith ina chúis le hathshuiteáil le bunachar sonraí Gitea I bhformhór na gcásanna, ba chóir duit an "app.ini" atá agat cheana a úsáid chun Gitea a reáchtáil. Má tá a fhios agat cad atá á dhéanamh agat, deimhnigh an méid seo a leanas: +reinstall_confirm_check_1=Féadfaidh na sonraí criptithe ag an SECRET_KEY i app.ini a chailleadh: b'fhéidir nach mbeidh úsáideoirí in ann logáil isteach le 2FA/OTP & b'fhéidir nach bhfeidhmeoidh scátháin i gceart. Trí an bhosca seo a sheiceáil deimhníonn tú go bhfuil an ceart an SECRET_KEY sa chomhad reatha app.ini. +reinstall_confirm_check_2=B'fhéidir go gcaithfear na stórais agus na socruithe a athshioncronú. Trí an bhosca seo a sheiceáil deimhníonn tú go ndéanfaidh tú na crúcaí do na stórálacha agus an chomhad authorized_keys a athshioncronú de láimh. Deimhníonn tú go gcinnteoidh tú go bhfuil socruithe stórais agus scátháin ceart. +reinstall_confirm_check_3=Deimhníonn tú go bhfuil tú cinnte go bhfuil an Gitea seo ag rith leis an suíomh ceart app.ini agus go bhfuil tú cinnte go gcaithfidh tú athshuiteáil. Deimhníonn tú go n-admhaíonn tú na rioscaí thuas. +err_empty_db_path=Ní féidir cosán bunachar sonraí SQLite3 a bheith folamh. +no_admin_and_disable_registration=Ní féidir leat féinchlárú úsáideora a dhíchumasú gan cuntas riarthóra a chruthú. +err_empty_admin_password=Ní féidir le pasfhocal an riarthóra a bheith folamh. +err_empty_admin_email=Ní féidir le ríomhphost an riarthóra a bheith folamh. +err_admin_name_is_reserved=Riarthóir Tá an t-ainm úsáideora neamhbhailí, tá an t-ainm úsáideora curtha in áirithe +err_admin_name_pattern_not_allowed=Tá ainm úsáideora an riarthóra neamhbhailí, meaitseálann an t-ainm úsáideora patrún in áirithe +err_admin_name_is_invalid=Tá an t-ainm úsáideora Riarthóra neamhbhailí + +general_title=Socruithe Ginearálta +app_name=Teideal an tSuímh +app_name_helper=Is féidir leat ainm do chuideachta a iontráil anseo. +repo_path=Cosán Fréimhe an Stór +repo_path_helper=Sábhálfar stórais iargúlta Git chuig an eolaire seo. +lfs_path=Cosán Fréamh Git LFS +lfs_path_helper=Stórálfar comhaid a rianóidh Git LFS san eolaire seo. Fág folamh le díchumasú. +run_user=Rith mar Ainm Úsáideora +run_user_helper=An ainm úsáideora an chórais oibriúcháin a ritheann Gitea mar. Tabhair faoi deara go gcaithfidh rochtain a bheith ag an úsáideoir seo ar fhréamhchosán an taisclainne. +domain=Fearann ​​Freastalaí +domain_helper=Seoladh fearainn nó óstach don fhreastalaí. +ssh_port=Port Freastalaí SSH +ssh_port_helper=Uimhir chalafoirt éisteann do fhreastalaí SSH air. Fág folamh le díchumasú. +http_port=Port Éisteachta HTTP Gitea +http_port_helper=Uimhir chalafoirt a éistfidh an freastalaí gréasáin Gitea air. +app_url=URL Bonn Gitea +app_url_helper=Seoladh bonn le haghaidh URLanna clóin HTTP(S) agus fógraí ríomhphoist. +log_root_path=Cosán Logála +log_root_path_helper=Scríofar comhaid logála chuig an eolaire seo. + +optional_title=Socruithe Roghnacha +email_title=Socruithe ríomhphoist +smtp_addr=Óstach SMTP +smtp_port=Port SMTP +smtp_from=Seol Ríomhphost Mar +smtp_from_invalid=Tá an seoladh “Seol Ríomhphost Mar” neamhbhailí +smtp_from_helper=Seoladh ríomhphoist a úsáidfidh Gitea. Cuir isteach seoladh ríomhphoist simplí nó úsáid an fhormáid "Ainm" . +mailer_user=SMTP Ainm úsáideora +mailer_password=Pasfhocal SMTP +register_confirm=Deimhniú Ríomhphoist a cheangal le Clárú +mail_notify=Cumasaigh Fógraí Ríomhphoist +server_service_title=Socruithe Freastalaí agus Seirbhíse Tríú Páirtí +offline_mode=Cumasaigh Mód Áitiúil +offline_mode_popup=Díchumasaigh líonraí seachadta ábhair tríú páirtí agus freastal ar na hacmhainní go léir go háitiúil. +disable_gravatar=Díchumasaigh Gravatar +disable_gravatar_popup=Díchumasaigh foinsí abhatár Gravatar agus tríú páirtí. Úsáidfear abhatár réamhshocraithe mura n-uaslódálann úsáideoir abhatár go háitiúil. +federated_avatar_lookup=Cumasaigh Abhatáir Chónaidhme +federated_avatar_lookup_popup=Cumasaigh cuardach avatar cónaidhme ag baint úsáide as Libravatar. +disable_registration=Díchumasaigh Féin-Chlárú +disable_registration_popup=Díchumasaigh féinchlárú úsáideora. Ní bheidh ach riarthóirí in ann cuntais úsáideora nua a chruthú. +allow_only_external_registration_popup=Ceadaigh Clárú Trí Sheirbhísí Seachtracha amháin +openid_signin=Cumasaigh Síniú isteach OpenID +openid_signin_popup=Cumasaigh síniú isteach úsáideora trí OpenID. +openid_signup=Cumasaigh Féinchlárú OpenID +openid_signup_popup=Cumasaigh féinchlárú úsáideora bunaithe ar OpenID. +enable_captcha=Cumasaigh clárú CAPTCHA +enable_captcha_popup=Teastaíonn CAPTCHA le haghaidh féinchlárú úsáideora. +require_sign_in_view=Teastaíonn Sínigh isteach chun Leathanaigh Amharc +require_sign_in_view_popup=Teorainn a chur ar rochtain leathanaigh d'úsáideoirí sínithe isteach. Ní fheicfidh cuairteoirí ach na leathanaigh sínithe isteach agus clárúcháin. +admin_setting_desc=Tá cuntas riarthóra a chruthú roghnach. Beidh an chéad úsáideoir cláraithe ina rialtóir go huathoibríoch +admin_title=Socruithe Cuntas Riarthóra +admin_name=Ainm Úsáideora an Riarthóra +admin_password=Pasfhocal +confirm_password=Deimhnigh Pasfhocal +admin_email=Seoladh ríomhphoist +install_btn_confirm=Suiteáil Gitea +test_git_failed=Ní féidir ordú 'git' a thástáil: %v +sqlite3_not_available=Ní thacaíonn an leagan Gitea seo le SQLite3. Íoslódáil an leagan dénártha oifigiúil ó %s (ní an leagan 'gobuild'). +invalid_db_setting=Tá na socruithe bunachar sonraí neamhbhailí:%v +invalid_db_table=Tá an tábla bunachar sonraí "%s" neamhbhailí: %v +invalid_repo_path=Tá cosán fréimhe an stór neamhbhailí:%v +invalid_app_data_path=Tá cosán sonraí an aip neamhbhailí:%v +run_user_not_match=Ní hé an t-ainm úsáideora 'rith mar' an t-ainm úsáideora reatha: %s -> %s +internal_token_failed=Theip ar chomhartha inmheánach a ghiniúint:%v +secret_key_failed=Theip ar an eochair rúnda a ghiniúint:%v +save_config_failed=Theip ar chumraíocht a shábháil:%v +invalid_admin_setting=Tá socrú cuntas riarthóra neamhbhailí: %v +invalid_log_root_path=Tá an cosán logála neamhbhailí:%v +default_keep_email_private=Folaigh Seoltaí Ríomhphoist de réir Réamhshocrú +default_keep_email_private_popup=Folaigh seoltaí ríomhphoist cuntas úsáideora nua de réir réamhshocraithe. +default_allow_create_organization=Ceadaigh Cruthú Eagraíochtaí de réir Réamhshocrú +default_allow_create_organization_popup=Lig cuntais úsáideora nua eagraíochtaí a chruthú de réir réamhshocraithe. +default_enable_timetracking=Cumasaigh Rianú Ama de réir Réamhshocrú +default_enable_timetracking_popup=Cumasaigh rianú ama do stórais nua de réir réamhshocraithe. +no_reply_address=Fearann Ríomhphoist Folaite +no_reply_address_helper=Ainm fearainn d'úsáideoirí a bhfuil seoladh ríomhphoist i bhfolach acu. Mar shampla, logálfar an t-ainm úsáideora 'joe' i Git mar 'joe@noreply.example.org' má tá an fearainn ríomhphoist i bhfolach socraithe go 'noreply.example.org'. +password_algorithm=Algartam Hais Pasfhocal +invalid_password_algorithm=Algartam hais pasfhocail neamhbhailí +password_algorithm_helper=Socraigh an algartam hashing pasfhocal. Tá riachtanais agus neart éagsúla ag halgartaim. Tá an algartam argon2 sách slán ach úsáideann sé go leor cuimhne agus d'fhéadfadh sé a bheith míchuí do chórais bheaga. +enable_update_checker=Cumasaigh Seiceoir Nuashonraithe +enable_update_checker_helper=Seiceálacha ar eisiúintí leagan nua go tréimhsiúil trí nascadh le gitea.io. +env_config_keys=Cumraíocht Comhshaoil +env_config_keys_prompt=Cuirfear na hathróga comhshaoil seo a leanas i bhfeidhm ar do chomhad cumraíochta freisin: + +[home] +nav_menu=Roghchlár Nascleanúint +uname_holder=Ainm Úsáideora nó Seoladh Ríomhphoist +password_holder=Pasfhocal +switch_dashboard_context=Athraigh Comhthéacs an Deais +my_repos=Stórais +show_more_repos=Taispeáin níos mó stórais... +collaborative_repos=Stórais Comhoibríoch +my_orgs=Mo Eagraíochtaí +my_mirrors=Mo Scátháin +view_home=Amharc %s +filter=Scagairí Eile +filter_by_team_repositories=Scag de réir stórais foirne +feed_of=`Fotha de "%s"` + +show_archived=Cartlannaithe +show_both_archived_unarchived=Ag taispeáint idir chartlannaithe agus neamhchartlann +show_only_archived=Ag taispeáint ach na cartlannaigh +show_only_unarchived=Ag taispeáint ach na cartlannaigh neamh + +show_private=Príobháideach +show_both_private_public=Ag taispeáint poiblí agus príobháideach araon +show_only_private=Ag taispeáint príobháideach amháin +show_only_public=Ag taispeáint poiblí amháin + +issues.in_your_repos=I do stórais + +[explore] +repos=Stórais +users=Úsáideoirí +organizations=Eagraíochtaí +go_to=Téigh chuig +code=Cód +code_last_indexed_at=Innéacsaithe %s is déanaí +relevant_repositories_tooltip=Tá stórais atá forca iad nó nach bhfuil aon ábhar acu, gan aon deilbhín, agus gan aon tuairisc i bhfolach. +relevant_repositories=Níl ach stórtha ábhartha á dtaispeáint, taispeáin torthaí neamhscagtha. + +[auth] +create_new_account=Cláraigh Cuntas +already_have_account=An bhfuil cuntas agat cheana féin? +sign_in_now=Sínigh isteach anois! +disable_register_prompt=Tá clárú faoi dhíchumasú. Téigh i dteagmháil le do riarthóir suíomh. +disable_register_mail=Tá deimhniú ríomhphoist le haghaidh clárú faoi dhíchum +manual_activation_only=Déan teagmháil le riarthóir do tsuímh chun gníomhachtú a chur i gcrích. +remember_me=Cuimhnigh ar an nGléas seo +remember_me.compromised=Níl an comhartha logála isteach bailí níos mó a d'fhéadfadh cuntas i gcontúirt a léiriú. Seiceáil do chuntas le haghaidh gníomhaíochtaí neamhghnácha. +forgot_password_title=Dearmad ar an bPasfhocal +forgot_password=Dearmad ar an bPasfhocal? +need_account=An bhfuil cuntas ag teastáil uait? +sign_up_now=Cláraigh anois. +sign_up_successful=Cruthaíodh cuntas go rathúil. Fáilte romhat! +confirmation_mail_sent_prompt_ex=Tá ríomhphost dearbhaithe nua seolta chuig %s. Seiceáil do bhosca isteach laistigh den chéad %s eile chun an próiseas clárúcháin a chur i gcrích. Má tá do sheoladh ríomhphoist clárúcháin mícheart, is féidir leat síniú isteach arís agus é a athrú. +must_change_password=Nuashonraigh do phasfhocal +allow_password_change=A cheangal ar an úsáideoir pasfhocal a athrú (molta) +reset_password_mail_sent_prompt=Seoladh ríomhphost deimhnithe chu ig %s. Seiceáil do bhosca isteach laistigh den chéad %s eile chun an próiseas aisghabhála cuntais a chríochnú. +active_your_account=Gníomhachtaigh do chuntas +account_activated=Cuireadh cuntas gníomhachtaithe +prohibit_login=Sínigh isteach Toirmiscthe +prohibit_login_desc=Tá cosc ar do chuntas síniú isteach, déan teagmháil le do riarthóir láithreáin le do thoil. +resent_limit_prompt=D'iarr tú ríomhphost gníomhachtaithe cheana féin le déanaí. Fan 3 nóiméad le do thoil agus bain triail as arís. +has_unconfirmed_mail=Dia duit %s, tá seoladh ríomhphoist neamhdheimhnithe agat (%s). Mura bhfuair tú ríomhphost dearbhaithe nó mura gcaithfidh tú ceann nua a athsheoladh, cliceáil ar an gcnaipe thíos le do thoil. +change_unconfirmed_mail_address=Má tá do sheoladh ríomhphoist cláraithe mícheart, is féidir leat é a athrú anseo agus ríomhphost dearbhaithe nua a sheoladh arís. +resend_mail=Cliceáil anseo chun do r-phost gníomhachtaithe a athshe +email_not_associate=Níl baint ag an seoladh ríomhphoist le haon chuntas. +send_reset_mail=Seol Ríomhphost Aisghabháil Cuntas +reset_password=Aisghabháil Cuntas +invalid_code=Tá do chód deimhnithe neamhbhailí nó tá sé in éag. +invalid_code_forgot_password=Tá do chód deimhnithe neamhbhailí nó tá sé in éag. Cliceáil anseo chun seisiún nua a thosú. +invalid_password=Ní mheaitseálann do phasfhocal leis an bhfocal faire a úsáideadh chun an cuntas a chruthú. +reset_password_helper=Gnóthaigh Cuntas +reset_password_wrong_user=Tá tú sínithe isteach mar %s, ach tá an nasc aisghabhála cuntas i gceist le haghaidh %s +password_too_short=Ní féidir fad pasfhocal a bheith níos lú ná %d carachtair. +non_local_account=Ní féidir le húsáideoirí neamháitiúla a bhfocal faire a nuashonrú trí chomhéadan gréasáin Gitea. +verify=Fíoraigh +scratch_code=Cód Scratch +use_scratch_code=Úsáid cód scratch +twofa_scratch_used=D'úsáid tú do chód scratch. Tá tú atreoraithe chuig an leathanach socruithe dhá fhachtóir ionas gur féidir leat clárú do ghléas a bhaint nó cód scratch nua a ghiniúint. +twofa_passcode_incorrect=Tá do phaschód mícheart. Má chuir tú do ghléas míchuir tú, bain úsáid as do chód scratch chun síniú isteach. +twofa_scratch_token_incorrect=Tá do chód scratch mícheart. +login_userpass=Sínigh isteach +login_openid=OpenID +oauth_signup_tab=Cláraigh Cuntas Nua +oauth_signup_title=Comhlánaigh Cuntas Nua +oauth_signup_submit=Cuntas Comhlánaigh +oauth_signin_tab=Nasc leis an gCuntas Reatha +oauth_signin_title=Sínigh isteach chun Cuntas Nasctha a Údarú +oauth_signin_submit=Cuntas Nasc +oauth.signin.error=Bhí earráid ann ag próiseáil an t-iarratas ar údarú. Má leanann an earráid seo, déan teagmháil le riarthóir an láithreáin. +oauth.signin.error.access_denied=Diúltaíodh an t-iarratas ar údarú. +oauth.signin.error.temporarily_unavailable=Theip ar údarú toisc nach bhfuil an fhreastalaí fíordheimhnithe ar fáil Bain triail as arís níos déanaí. +oauth_callback_unable_auto_reg=Tá Clárú Uathoibríoch cumasaithe, ach sheol Soláthraí OAuth2 %[1]s réimsí in easnamh ar ais: %[2]s, ní raibh sé in ann cuntas a chruthú go huathoibríoch, cruthaigh nó nasc le cuntas, nó déan teagmháil le riarthóir an tsuímh. +openid_connect_submit=Ceangail +openid_connect_title=Ceangail le cuntas atá ann cheana +openid_connect_desc=Níl an URI OpenID roghnaithe ar eolas. Comhcheangail é le cuntas nua anseo. +openid_register_title=Cruthaigh cuntas nua +openid_register_desc=Níl an URI OpenID roghnaithe ar eolas. Comhcheangail é le cuntas nua anseo. +openid_signin_desc=Cuir isteach do URI OpenID. Mar shampla: alice.openid.example.org nó https://openid.example.org/alice. +disable_forgot_password_mail=Tá aisghabháil cuntas díchumasaithe toisc nach bhfuil aon ríomhphost ar bun. Téigh i dteagmháil le do riarthóir suíomh. +disable_forgot_password_mail_admin=Níl aisghabháil cuntas ar fáil ach amháin nuair a bhíonn ríomhphost ar bun. Bunaigh ríomhphost le do thoil chun aisghabháil cuntas a chumasú +email_domain_blacklisted=Ní féidir leat clárú le do sheoladh ríomhphoist. +authorize_application=Údaraigh an Feidhmchlár +authorize_redirect_notice=Déanfar tú a atreorú chuig %s má údaraíonn tú an feidhmchlár seo. +authorize_application_created_by=Chruthaigh %s an feidhmchlár seo. +authorize_application_description=Má dheonaíonn tú an rochtain, beidh sé in ann rochtain a fháil agus scríobh chuig faisnéis uile do chuntais, lena n-áirítear repos príobháideacha agus eagraíochtaí. +authorize_title=Údaraigh "%s" chun rochtain a fháil ar do chuntas? +authorization_failed=Theip ar údarú +authorization_failed_desc=Theip ar an údarú toisc gur bhraitheamar iarratas neamhbhailí. Téigh i dteagmháil le cothabhálaí an aip a rinne tú iarracht a údarú. +sspi_auth_failed=Theip ar fhíordheimhniú SSPI +password_pwned=Tá an pasfhocal a roghnaigh tú ar liosta na bhfocal faire goidte a nochtadh cheana i sáruithe sonraí poiblí. Bain triail eile as le pasfhocal eile agus smaoinigh ar an bpasfhocal seo a athrú áit eile freisin. +password_pwned_err=Ní fhéadfaí iarratas a chomhlánú ar HaveIBeenPwned +last_admin=Ní féidir leat an riarachán deireanach a bhaint. Caithfidh riarachán amháin ar a laghad a bheith ann. +signin_passkey=Sínigh isteach le passkey +back_to_sign_in=Ar ais go Sínigh Isteach + +[mail] +view_it_on=Féach air ar %s +reply=nó freagra a thabhairt ar an r-phost seo go díreach +link_not_working_do_paste=Níl ag obair? Bain triail as é a chóipeáil agus a ghreamú le do bhrabh +hi_user_x=Dia duit %s, + +activate_account=Gníomhachtaigh do chuntas le do thoil +activate_account.title=%s, gníomhachtaigh do chuntas le do thoil +activate_account.text_1=Dia duit %[1]s, go raibh maith agat as clárú ag %[2]s! +activate_account.text_2=Cliceáil ar an nasc seo a leanas chun do chuntas a ghníomhachtú laistigh de %s: + +activate_email=Fíoraigh do sheoladh ríomhphoist +activate_email.title=%s, fíoraigh do sheoladh ríomhphoist le do thoil +activate_email.text=Cliceáil ar an nasc seo a leanas le do sheoladh ríomhphoist a fhíorú laistigh de %s: + +register_notify=Fáilte go dtí %s +register_notify.title=%[1]s, fáilte go %[2]s +register_notify.text_1=is é seo do ríomhphost deimhnithe clárúcháin do %s! +register_notify.text_2=Is féidir leat logáil isteach anois trí ainm úsáideora: %s. +register_notify.text_3=Má cruthaíodh an cuntas seo duit, socraigh do phasfhocal ar dtús. + +reset_password=Aisghabháil do chuntas +reset_password.title=%s, d'iarr tú do chuntas a aisghabháil +reset_password.text=Cliceáil ar an nasc seo a leanas chun do chuntas a athshlánú laistigh de %s: + +register_success=Clárú rathúil + +issue_assigned.pull=@%[1]s shann tú don iarratas tarraingthe %[2]s i stór %[3]s. +issue_assigned.issue=@%[1]s shann tú don eisiúint %[2]s i stór %[3]s. + +issue.x_mentioned_you=Luaigh @%s tú: +issue.action.force_push=Bhrúigh %[1]s an %[2]s go fórsa ó %[3]s go %[4]s. +issue.action.push_1=Bhrúigh @%[1]s %[3]d tiomáintí go %[2]s +issue.action.push_n=@%[1]s brúite % [3]d tiomáintí chuig %[2]s +issue.action.close=@%[1]s dúnta #%[2]d. +issue.action.reopen=D'athoscail @%[1]s #%[2]d. +issue.action.merge=Chomhcheangail @%[1]s #%[2]d le %[3]s. +issue.action.approve=Cheadaigh @%[1]s an t-iarratas tarraingthe seo. +issue.action.reject=D'iarr @%[1]s athruithe ar an iarratas tarraingthe seo. +issue.action.review=Rinne @%[1]s trácht ar an iarratas tarraingthe seo. +issue.action.review_dismissed=Dhiúltaigh @%[1]s an léirmheas deiridh ó %[2]s don iarratas tarraingthe seo. +issue.action.ready_for_review=Mharcáil @%[1]s an t-iarratas tarraingthe seo réidh lena athbhreithniú. +issue.action.new=Chruthaigh @%[1]s #%[2]d. +issue.in_tree_path=I %s: + +release.new.subject=Scaoileadh %s i %s +release.new.text=D'eisigh @%[1]s %[2]s i %[3]s +release.title=Teideal: %s +release.note=Nóta: +release.downloads=Íoslódálacha: +release.download.zip=Cód Foinse (ZIP) +release.download.targz=Cód Foinse (TAR.GZ) + +repo.transfer.subject_to=Ba mhaith le %s "%s" a aistriú go %s +repo.transfer.subject_to_you=Ba mhaith le %s "%s" a aistriú chugat +repo.transfer.to_you=tú +repo.transfer.body=Chun glacadh leis nó a dhiúltú tabhair cuairt ar %s nó neamhaird a dhéanamh air. + +repo.collaborator.added.subject=Chuir %s le %s tú +repo.collaborator.added.text=Cuireadh tú leis mar chomhoibritheoir stórais: + +team_invite.subject=Tá cuireadh tugtha agat ag %[1]s chun dul le heagraíocht %[2]s +team_invite.text_1=Tá cuireadh tugtha ag %[1]s duit chun dul le foireann %[2]s in eagraíocht %[3]s. +team_invite.text_2=Cliceáil ar an nasc seo a leanas le do thoil chun dul isteach san fhoireann: +team_invite.text_3=Nóta: Bhí an cuireadh seo beartaithe do %[1]s. Mura raibh tú ag súil leis an gcuireadh seo, is féidir leat neamhaird a dhéanamh den ríomhphost seo. + +[modal] +yes=Tá +no=Níl +confirm=Deimhnigh +cancel=Cealaigh +modify=Nuashonraigh + +[form] +UserName=Ainm úsáideora +RepoName=Ainm stórais +Email=Seoladh ríomhphoist +Password=Pasfhocal +Retype=Deimhnigh Pasfhocal +SSHTitle=Ainm eochair SSH +HttpsUrl=URL HTTPS +PayloadUrl=URL Pálasta +TeamName=Ainm foirne +AuthName=Ainm údaraithe +AdminEmail=Ríomhphost riaracháin + +NewBranchName=Ainm brainse nua +CommitSummary=Achoimre tiomáintí +CommitMessage=Tiomantas teachtaireacht +CommitChoice=Rogha tiomanta +TreeName=Cosán comhaid +Content=Ábhar + +SSPISeparatorReplacement=Deighilteoir +SSPIDefaultLanguage=Teanga Réamhshocraithe + +require_error=` ní féidir a bheith folamh.` +alpha_dash_error=` níor cheart go mbeadh ach carachtair alfauméireacha, daingean ('-') agus béim ('_') ann. ` +alpha_dash_dot_error=` níor cheart go mbeadh ach alfa-uimhriúil, dash ('-'), cuir béim ar ('_') agus ponc ('.') carachtair ann.` +git_ref_name_error=` caithfidh gur ainm tagartha Git dea-chruthaithe é.` +size_error=` ní mór méid %s.` +min_size_error=` ní mór go mbeadh carachtar %s ar a laghad ann.` +max_size_error=` caithfidh `%s carachtar ar a mhéad a bheith ann.` +email_error=`ní seoladh ríomhphoist bailí é.` +url_error=`ní URL bailí é `"%s". ` +include_error=` ní mór fotheaghrán a bheith ann "%s".` +glob_pattern_error=` tá patrún glob neamhbhailí: %s.` +regex_pattern_error=`tá patrún regex neamhbhailí: %s.` +username_error=` ní féidir ach carachtair alfa-uimhriúla ('0-9', 'a-z', 'A-Z'), dash ('-'), béim ('_') agus ponc ('.') a bheith ann. Ní féidir tús a chur leis ná deireadh a chur le carachtair neamh-alfamanacha, agus tá cosc ​​freisin ar charthanna neamh-alfanuimhriúla i ndiaidh a chéile.` +invalid_group_team_map_error=` tá mapáil neamhbhailí: %s` +unknown_error=Earráid anaithnid: +captcha_incorrect=Tá an cód CAPTCHA mícheart. +password_not_match=Ní mheaitseálann na pasfhocail. +lang_select_error=Roghnaigh teanga ón liosta. + +username_been_taken=Tá an t-ainm úsáideora tógtha cheana féin. +username_change_not_local_user=Ní cheadaítear d'úsáideoirí neamháitiúla a n-ainm úsáideora a athrú. +username_has_not_been_changed=Níor athraíodh ainm úsáideora +repo_name_been_taken=Úsáidtear ainm an stór cheana féin. +repository_force_private=Tá Force Private cumasaithe: ní féidir stórais phríobháideacha a dhéanamh poiblí. +repository_files_already_exist=Tá comhaid ann cheana féin don stór seo. Déan teagmháil leis an riarthóir córais. +repository_files_already_exist.adopt=Tá comhaid ann cheana don stór seo agus ní féidir iad a ghlacadh ach amháin. +repository_files_already_exist.delete=Tá comhaid ann cheana féin don stór seo. Ní mór duit iad a scriosadh. +repository_files_already_exist.adopt_or_delete=Tá comhaid ann cheana féin don stór seo. Glac iad nó scrios iad. +visit_rate_limit=Thug cuairt chianda aghaidh ar theorannú rátaí. +2fa_auth_required=Bhí fíordheimhniú dhá thoisc ag teastáil ó chianchuairt. +org_name_been_taken=Tá ainm na heagraíochta glactha cheana féin. +team_name_been_taken=Tá ainm na foirne glactha cheana féin. +team_no_units_error=Ceadaigh rochtain ar chuid stórais amháin ar a laghad. +email_been_used=Úsáidtear an seoladh ríomhphoist cheana féin. +email_invalid=Tá an seoladh ríomhphoist neamhbhailí. +email_domain_is_not_allowed=Tá réimse ríomhphoist úsáideora %s ag teacht i gcoitinne le EMAIL_DOMAIN_ALLOWLIST nó EMAIL_DOMAIN_BLOCKLIST. Déan cinnte go bhfuil súil le d'oibríocht. +openid_been_used=Úsáidtear an seoladh OpenID "%s" cheana féin. +username_password_incorrect=Tá ainm úsáideora nó pasfhocal mícheart. +password_complexity=Ní shásaíonn pasfhocal ceanglais castachta: +password_lowercase_one=Carachtar beaga amháin ar a laghad +password_uppercase_one=Carachtar cás uachtair amháin ar a laghad +password_digit_one=Digit amháin ar a laghad +password_special_one=Carachtar speisialta amháin ar a laghad (poncaíocht, lúibíní, luachana, srl.) +enterred_invalid_repo_name=Tá ainm an stórais a chuir tú isteach mícheart. +enterred_invalid_org_name=Tá ainm na heagraíochta a chuir tú isteach mícheart. +enterred_invalid_owner_name=Níl ainm an úinéara nua bailí. +enterred_invalid_password=Tá an pasfhocal a chuir tú isteach mícheart. +unset_password=Níor shocraigh an t-úsáideoir logála isteach an pasfhocal. +unsupported_login_type=Ní thacaítear leis an gcineál logála isteach chun cuntas a scriosadh. +user_not_exist=Níl an t-úsáideoir ann. +team_not_exist=Níl an fhoireann ann. +last_org_owner=Ní féidir leat an t-úsáideoir deireanach a bhaint as an bhfoireann 'úinéirí'. Caithfidh úinéir amháin ar a laghad a bheith ann d'eagraíocht. +cannot_add_org_to_team=Ní féidir eagraíocht a chur leis mar bhall foirne. +duplicate_invite_to_team=Tugadh cuireadh don úsáideoir cheana féin mar bhall foirne. +organization_leave_success=D'fhág tú an eagraíocht %s go rathúil. + +invalid_ssh_key=Ní féidir d'eochair SSH a fhíorú: %s +invalid_gpg_key=Ní féidir d'eochair GPG a fhíorú: %s +invalid_ssh_principal=Príomhoide neamhbhailí: %s +must_use_public_key=Is eochair phríobháideach an eochair a sholáthraíonn tú. Ná uaslódáil d'eochair phríobháideach áit ar bith Úsáid d'eochair phoiblí ina ionad. +unable_verify_ssh_key=Ní féidir an eochair SSH a fhíorú, seiceáil faoi dhó é le haghaidh botúin. +auth_failed=Theip ar fhíordheimhniú:%v + +still_own_repo=Tá stór amháin nó níos mó ag do chuntas, scriosadh nó aistrigh iad ar dtús. +still_has_org=Is ball d'eagraíocht amháin nó níos mó é do chuntas, fág iad ar dtús. +still_own_packages=Tá pacáiste amháin nó níos mó ag do chuntas, scrios iad ar dtús. +org_still_own_repo=Tá stór amháin nó níos mó ag an eagraíocht seo fós, scriosadh nó aistrigh iad ar dtús. +org_still_own_packages=Tá pacáiste amháin nó níos mó ag an eagraíocht seo fós, scrios iad ar dtús. + +target_branch_not_exist=Níl spriocbhrainse ann. +target_ref_not_exist=Níl an sprioctagartha %s ann + +admin_cannot_delete_self=Ní féidir leat tú féin a scriosadh nuair is riarachán tú. Bain do phribhléidí riaracháin ar dtús. + +[user] +change_avatar=Athraigh do abhatár… +joined_on=Cláraigh ar %s +repositories=Stórais +activity=Gníomhaíocht Phoiblí +followers=Leantóirí +starred=Stórais Réaltaithe +watched=Stórais Breathnaithe +code=Cód +projects=Tionscadail +overview=Forbhreathnú +following=Ag leanúint +follow=Lean +unfollow=Dílean +user_bio=Beathaisnéis +disabled_public_activity=Dhíchumasaigh an t-úsáideoir seo infheictheacht phoiblí na gníomhaíochta. +email_visibility.limited=Tá do sheoladh ríomhphoist le feiceáil do gach úsáideoir fíordheimhnithe +email_visibility.private=Níl do sheoladh ríomhphoist le feiceáil ach duit féin agus do riarthóirí +show_on_map=Taispeáin an áit seo ar léarscáil +settings=Socruithe Úsáideora + +form.name_reserved=Tá an t-ainm úsáideora "%s" in áirithe. +form.name_pattern_not_allowed=Ní cheadaítear an patrún "%s" in ainm úsáideora. +form.name_chars_not_allowed=Tá carachtair neamhbhailí in ainm úsáideora "%s". + +block.block=Bloc +block.block.user=Bloc úsáideoir +block.block.org=Bloc úsáideoir don eagraíocht +block.block.failure=Theip ar an úsáideoir a bhac: %s +block.unblock=Díbhlocáil +block.unblock.failure=Theip ar an úsáideoir a díbhlocáil: %s +block.blocked=Chuir tú bac ar an úsáideoir seo. +block.title=Cuir bac ar úsáideoir +block.info=Cuireann blocáil úsáideora cosc orthu idirghníomhú le stórais, mar shampla iarratais tarraingthe nó saincheisteanna a oscailt nó trácht a dhéanamh orthu. Níos mó a fhoghlaim faoi bhac úsáideora. +block.info_1=Cuireann blocáil úsáideora cosc ar na gníomhartha seo a leanas ar do chuntas agus ar do stór: +block.info_2=ag leanúint do chuntas +block.info_3=seol fógraí chugat ag @mentioning d'ainm úsáideora +block.info_4=ag tabhairt cuireadh duit mar chomhoibritheoir chuig a stórtha +block.info_5=ag réaladh, ag forcáil nó ag féachaint ar stórais +block.info_6=ceisteanna nó iarrataí tarraingthe a oscailt agus trácht +block.info_7=freagairt ar do chuid tuairimí i saincheisteanna nó iarratais tarraingthe +block.user_to_block=Úsáideoir chun blocáil +block.note=Nóta +block.note.title=Nóta roghnach: +block.note.info=Níl an nóta le feiceáil don úsáideoir blocáilte. +block.note.edit=Cuir nóta in eagar +block.list=Úsáideoirí blocáilte +block.list.none=Níor chuir tú bac ar aon úsáideoirí. + +[settings] +profile=Próifíl +account=Cuntas +appearance=Dealramh +password=Pasfhocal +security=Slándáil +avatar=Abhatár +ssh_gpg_keys=Eochracha SSH/GPG +social=Cuntais Shóisialta +applications=Iarratais +orgs=Eagraíochtaí a bhainistiú +repos=Stórais +delete=Scrios Cuntas +twofa=Fíordheimhniú Dhá Fachtóir (TOTP) +account_link=Cuntais Nasctha +organization=Eagraíochtaí +uid=UID +webauthn=Fíordheimhniú Dhá-Fachtóir (Eochracha Slándála) + +public_profile=Próifíl Phoiblí +biography_placeholder=Inis dúinn beagán fút féin! (Is féidir leat Markdown a úsáid) +location_placeholder=Comhroinn do shuíomh thart le daoine eile +profile_desc=Rialú conas a thaispeánfar do phróifíl d'úsáideoirí eile. Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocail agus oibríochtaí Git gréasán-bhunaithe. +password_username_disabled=Ní cheadaítear d'úsáideoirí neamháitiúla a n-ainm úsáideora a athrú. Déan teagmháil le do riarthóir láithreáin le haghaidh tuilleadh sonraí +full_name=Ainm Iomlán +website=Láithreán Gréasáin +location=Suíomh +update_theme=Nuashonraigh Téama +update_profile=Nuashonraigh Próifíl +update_language=Nuashonraigh Teanga +update_language_not_found=Níl teanga “%s” ar fáil. +update_language_success=Tá an teanga nuashonraithe. +update_profile_success=Nuashonraíodh do phróifíl. +change_username=Tá d'ainm úsáideora athraithe. +change_username_prompt=Nóta: Athraíonn athrú d'ainm úsáideora URL do chuntais freisin. +change_username_redirect_prompt=Athreoróidh an sean-ainm úsáideora go dtí go n-éilíonn duine é +continue=Lean ar aghaidh +cancel=Cealaigh +language=Teanga +ui=Téama +hidden_comment_types=Cineálacha tráchtaireachta ceilte +hidden_comment_types_description=Ní thaispeánfar cineálacha tráchta a sheiceáiltear anseo taobh istigh de leathan Cuireann seiceáil “Lipéad” mar shampla baintear gach trácht “{user} cursaí/bainte {label}”. +hidden_comment_types.ref_tooltip=Tuairimí ina dtagraíodh an tsaincheist seo ó shaincheiste/coiste eile... +hidden_comment_types.issue_ref_tooltip=Tuairimí ina n-athraíonn an t-úsáideoir an brainse/clib a bhaineann leis an tsaincheist +comment_type_group_reference=Tagairt +comment_type_group_label=Lipéad +comment_type_group_milestone=Cloch Mhíle +comment_type_group_assignee=Sannaitheoir +comment_type_group_title=Teideal +comment_type_group_branch=Brainse +comment_type_group_time_tracking=Rianú Ama +comment_type_group_deadline=Spriocdháta +comment_type_group_dependency=Spleáchas +comment_type_group_lock=Stádas Glas +comment_type_group_review_request=Iarratas athbhreithnithe +comment_type_group_pull_request_push=Tiomáintí curtha leis +comment_type_group_project=Tionscadal +comment_type_group_issue_ref=Tagairt eisiúna +saved_successfully=Sábháiltear do shocruithe go rathúil. +privacy=Príobháideacht +keep_activity_private=Folaigh gníomhaíocht ó leathanach próifíle +keep_activity_private_popup=Ní dhéanann an gníomhaíocht le feiceáil ach duit féin agus do na riarthóirí + +lookup_avatar_by_mail=Cuardaigh Avatar trí Seoladh Ríomhphoist +federated_avatar_lookup=Cuardach Avatar Cónaidhme +enable_custom_avatar=Úsáid Avatar Saincheaptha +choose_new_avatar=Roghnaigh avatar nua +update_avatar=Nuashonrú Avatar +delete_current_avatar=Scrios Avatar Reatha +uploaded_avatar_not_a_image=Ní íomhá é an comhad uaslódáilte. +uploaded_avatar_is_too_big=Sáraíonn méid an chomhaid uaslódáilte (%d KiB) an méid uasta (%d KiB). +update_avatar_success=Tá do avatar nuashonraithe. +update_user_avatar_success=Nuashonraíodh avatar an úsáideora. + +change_password=Nuashonrú Pasfhocal +old_password=Pasfhocal Reatha +new_password=Pasfhocal Nua +retype_new_password=Deimhnigh Pasfhocal Nua +password_incorrect=Tá an pasfhocal reatha mícheart. +change_password_success=Tá do phasfhocal nuashonraithe. Sínigh isteach ag baint úsáide as do phasfhocal nua as seo amach. +password_change_disabled=Ní féidir le húsáideoirí neamháitiúla a bhfocal faire a nuashonrú trí chomhéadan gréasáin Gitea. + +emails=Seoltaí ríomhphoist +manage_emails=Bainistigh Seoltaí Ríomhphoist +manage_themes=Roghnaigh téama réamhshocraithe +manage_openid=Seoltaí OpenID a bhainistiú +email_desc=Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocal agus, ar choinníoll nach bhfuil sé i bhfolach, oibríochtaí Git bunaithe ar an ngréas +theme_desc=Beidh sé seo do théama réamhshocraithe ar fud an láithreáin. +theme_colorblindness_help=Tacaíocht Téama Dathdallacht +theme_colorblindness_prompt=Ní fhaigheann Gitea ach roinnt téamaí le tacaíocht bhunúsach daille datha, nach bhfuil ach cúpla dathanna sainithe acu. Tá an obair fós ar siúl. D’fhéadfaí tuilleadh feabhsuithe a dhéanamh trí níos mó dathanna a shainiú sna comhaid CSS téamaí. +primary=Príomhúil +activated=Gníomhachtaithe +requires_activation=Éilíonn gníomhachtú +primary_email=Déan príomhúil +activate_email=Seol Gníomhachtaithe +activations_pending=Gníomhartha ar Feitheamh +can_not_add_email_activations_pending=Tá gníomhachtú ar feitheamh, déan iarracht arís i gceann cúpla nóiméad más mian leat ríomhphost nua a chur leis. +delete_email=Bain +email_deletion=Bain Seoladh R-phoist +email_deletion_desc=Bainfear an seoladh ríomhphoist agus an fhaisnéis ghaolmhar as do chuntas. Ní bheidh na tiomáintí Git a bhaineann leis an seoladh ríomhphoist seo athraithe. Lean ar aghaidh? +email_deletion_success=Tá an seoladh ríomhphoist bainte. +theme_update_success=Nuashonraíodh do théama. +theme_update_error=Níl an téama roghnaithe ann. +openid_deletion=Bain Seoladh OpenID +openid_deletion_desc=Cuirfidh an seoladh OpenID seo a bhaint as do chuntas cosc ort síniú isteach leis. Lean ar aghaidh? +openid_deletion_success=Tá an seoladh OpenID bainte. +add_new_email=Cuir Seoladh Ríomhphoist nua +add_new_openid=Cuir URI OpenID nua leis +add_email=Cuir Seoladh R-phoist leis +add_openid=Cuir OpenID URI +add_email_confirmation_sent=Seoladh ríomhphost deimhnithe chuig “%s”. Seiceáil do bhosca isteach laistigh den chéad %s eile chun do sheoladh ríomhphoist a dhearbhú. +add_email_success=Cuireadh an seoladh ríomhphoist nua leis. +email_preference_set_success=Socraíodh rogha ríomhphoist go rathúil. +add_openid_success=Cuireadh an seoladh OpenID nua leis. +keep_email_private=Folaigh Seoladh ríomhphoist +keep_email_private_popup=Folóidh sé seo do sheoladh ríomhphoist ó do phróifíl, chomh maith le nuair a dhéanann tú iarratas tarraingthe nó comhad a chur in eagar ag baint úsáide as an gcomhéadan gréasáin. Ní mhodhnófar na tiomáintí a bhrúitear. Úsáid %s i ngealltanais chun iad a cheangal le do chuntas. +openid_desc=Ligeann OpenID duit fíordheimhniú a tharmligean chuig soláthraí seachtrach. + +manage_ssh_keys=Bainistigh Eochracha SSH +manage_ssh_principals=Bainistigh Príomhoidí Teastas SSH +manage_gpg_keys=Bainistigh Eochracha GPG +add_key=Cuir Eochair +ssh_desc=Tá na heochracha SSH poiblí seo bainteach le do chuntas. Ceadaíonn na heochracha príobháideacha comhfhreagracha rochtain iomlán ar do stórtha. +principal_desc=Tá baint ag na príomhoidí deimhnithe SSH seo le do chuntas agus ceadaíonn siad rochtain iomlán ar do stórtha. +gpg_desc=Tá na heochracha GPG poiblí seo bainteach le do chuntas. Coinnigh d'eochracha príobháideacha sábháilte mar a cheadaíonn siad gealltanais a fhíorú. +ssh_helper=An bhfuil cabhair uait? Féach ar threoir GitHub chun d'eochracha SSH féin a chruthú nó réitigh fadhbanna coitianta a> seans go dtiocfaidh tú ar úsáid SSH. +gpg_helper=Cabhair uait? Féach ar threoir GitHub faoi GPG. +add_new_key=Cuir eochair SSH leis +add_new_gpg_key=Cuir Eochair GPG leis +key_content_ssh_placeholder=Tosaíonn sé le 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', nó 'sk-ssh-ed25519@openssh.com' +key_content_gpg_placeholder=Tosaíonn sé le '----- BEGIN PGP POIBLÍ EOCHAIR BLOC ------ ' +add_new_principal=Cuir Príomhoide +ssh_key_been_used=Cuireadh an eochair SSH seo leis an bhfreastalaí cheana féin. +ssh_key_name_used=Tá eochair SSH leis an ainm céanna ar do chuntas cheana féin. +ssh_principal_been_used=Cuireadh an príomhoide seo leis an bhfreastalaí cheana féin. +gpg_key_id_used=Tá eochair GPG poiblí leis an aitheantas céanna ann cheana féin. +gpg_no_key_email_found=Ní mheaitseálann an eochair GPG seo aon seoladh ríomhphoist gníomhachtaithe a bhaineann le do chuntas. Féadfar é a chur leis fós má shíníonn tú an comhartha a chuirtear ar fáil. +gpg_key_matched_identities=Aitheantais Meaitseáilte: +gpg_key_matched_identities_long=Meaitseálann na haitheantais leabaithe san eochair seo na seoltaí ríomhphoist gníomhachtaithe seo a leanas don úsáideoir seo. Is féidir gealltanais a mheaitseálann na seoltaí ríomhphoist seo a fhíorú leis an eochair seo. +gpg_key_verified=Eochair Fhíoraithe +gpg_key_verified_long=Fíoraíodh an eochair le heochairchomhartha agus is féidir í a úsáid chun a fhíorú go bhfuil geallta ag meaitseáil aon seoltaí ríomhphoist gníomhachtaithe don úsáideoir seo chomh maith le haon aitheantas comhoiriúnaithe don eochair seo. +gpg_key_verify=Fíoraigh +gpg_invalid_token_signature=Ní mheaitseálann an eochair, an síniú agus an comhartha GPG a sholáthraítear nó tá an comhartha as dáta. +gpg_token_required=Ní mór duit síniú a sholáthar don chomhartha thíos +gpg_token=Comhartha +gpg_token_help=Is féidir leat síniú a ghiniúint ag úsáid: +gpg_token_signature=Síniú Armúrtha GPG +key_signature_gpg_placeholder=Tosaíonn sé le '-----BEGIN SÍNIÚ PGP -----' +verify_gpg_key_success=Tá eochair GPG “%s” fíoraithe. +ssh_key_verified=Eochair Fhíoraithe +ssh_key_verified_long=Fíoraíodh an eochair le heochairchomhartha agus is féidir í a úsáid chun a fhíorú go bhfuil geallta ag teacht le haon seoltaí ríomhphoist gníomhachtaithe don úsáideoir seo. +ssh_key_verify=Fíoraigh +ssh_invalid_token_signature=Ní mheaitseálann an eochair, an síniú nó an comhartha SSH a sholáthraítear nó tá an comhartha as dáta. +ssh_token_required=Ní mór duit síniú a sholáthar don chomhartha thíos +ssh_token=Comhartha +ssh_token_help=Is féidir leat síniú a ghiniúint ag úsáid: +ssh_token_signature=Síniú armúrtha SSH +key_signature_ssh_placeholder=Tosaíonn sé le '-----BEGIN SSH SÍNITURE-----' +verify_ssh_key_success=Tá eochair SSH “%s” fíoraithe. +subkeys=Fo-eochracha +key_id=Eochair ID +key_name=Ainm Eochair +key_content=Ábhar +principal_content=Ábhar +add_key_success=Cuireadh an eochair SSH “%s” leis. +add_gpg_key_success=Cuireadh an eochair GPG “%s” leis. +add_principal_success=Cuireadh príomhoide an deimhnithe SSH “%s” leis. +delete_key=Bain +ssh_key_deletion=Bain Eochair SSH +gpg_key_deletion=Bain Eochair GPG +ssh_principal_deletion=Bain Príomhoide Teastas SSH +ssh_key_deletion_desc=Ag baint eochair SSH, cuirtear a rochtain ar do chuntas a chúlghairm. Lean ar aghaidh? +gpg_key_deletion_desc=Má bhaintear eochair GPG, ní fhíoraítear gealltanais a shínigh sé. An leanfaidh tú ar aghaidh? +ssh_principal_deletion_desc=Cúlghairtear a rochtain ar do chuntas Príomhoide Teastas SSH. Lean ar aghaidh? +ssh_key_deletion_success=Tá an eochair SSH bainte. +gpg_key_deletion_success=Tá an eochair GPG bainte amach. +ssh_principal_deletion_success=Tá an príomhoide bainte. +added_on=Cuireadh leis ar %s +valid_until_date=Bailí go dtí %s +valid_forever=Bailí go deo +last_used=Úsáidtear go deireanach ar +no_activity=Gan gníomhaíocht le déanaí +can_read_info=Léigh +can_write_info=Scríobh +key_state_desc=Úsáideadh an eochair seo le 7 lá anuas +token_state_desc=Úsáideadh an comhartha seo le 7 lá anuas +principal_state_desc=Úsáideadh an príomhoide seo le 7 lá anuas +show_openid=Taispeáin ar phróifíl +hide_openid=Folaigh ón bpróifíl +ssh_disabled=SSH faoi mhíchumas +ssh_signonly=Tá SSH faoi láthair faoi láthair mar sin ní úsáidtear na heochracha seo ach le haghaidh fíorú sínithe tiomanta. +ssh_externally_managed=Déantar an eochair SSH seo a bhainistiú go seachtrach don úsáideoir seo +manage_social=Cuntais Shóisialta Ghaolmhara a bhainistiú +social_desc=Is féidir na cuntais shóisialta seo a úsáid chun síniú isteach i do chuntas. Déan cinnte go n-aithníonn tú gach ceann acu. +unbind=Dínascadh +unbind_success=Tá an cuntas sóisialta bainte go rathúil. + +manage_access_token=Bainistigh Comharthaí Rochtana +generate_new_token=Gin Comhartha Nua +tokens_desc=Tugann na comharthaí seo rochtain ar do chuntas ag baint úsáide as an API Gitea. +token_name=Ainm Comhartha +generate_token=Gin Comhartha +generate_token_success=Gintear do chomhartha nua. Cóipeáil é anois mar ní thaispeánfar é arís. +generate_token_name_duplicate=Úsáideadh %s mar ainm feidhmchláir cheana féin. Úsáid ceann nua le do thoil. +delete_token=Scrios +access_token_deletion=Scrios Comhartha Rochtana +access_token_deletion_cancel_action=Cealaigh +access_token_deletion_confirm_action=Scrios +access_token_deletion_desc=Cúlghairfear rochtain ar do chuntas le haghaidh feidhmchláir a úsáideann é a scriosadh comhartha. Ní féidir é seo a chur ar ais. Lean ar aghaidh? +delete_token_success=Tá an comhartha scriosta. Níl rochtain ag iarratais a úsáideann é ar do chuntas a thuilleadh. +repo_and_org_access=Rochtain Stórála agus Eagraíochta +permissions_public_only=Poiblí amháin +permissions_access_all=Gach (poiblí, príobháideach agus teoranta) +select_permissions=Roghnaigh ceadanna +permission_not_set=Níl leagtha +permission_no_access=Gan rochtain +permission_read=Léigh +permission_write=Léigh agus Scríobh +access_token_desc=Ní chuireann ceadchomharthaí roghnaithe ach teorainn leis an údarú do na bealaí API comhfhreagracha. Léigh doiciméadúchán chun tuilleadh eolais a fháil. +at_least_one_permission=Ní mór duit cead amháin ar a laghad a roghnú chun comhartha a chruthú +permissions_list=Ceadanna: + +manage_oauth2_applications=Bainistigh Feidhmchláir OAuth2 +edit_oauth2_application=Cuir Feidhmchlár OAuth2 in eagar +oauth2_applications_desc=Cumasaíonn feidhmchláir OAuth2 d’fheidhmchlár tríú páirtí úsáideoirí a fhíordheimhniú go slán ag an ásc Gitea seo. +remove_oauth2_application=Bain Feidhmchlár OAuth2 +remove_oauth2_application_desc=Ag baint feidhmchlár OAuth2, cúlghairfear rochtain ar gach comhartha rochtana sínithe. Lean ar aghaidh? +remove_oauth2_application_success=Scriosadh an feidhmchlár. +create_oauth2_application=Cruthaigh Feidhmchlár OAuth2 nua +create_oauth2_application_button=Cruthaigh Feidhmchlár +create_oauth2_application_success=D'éirigh leat feidhmchlár nua OAuth2 a chruthú. +update_oauth2_application_success=D'éirigh leat an feidhmchlár OAuth2 a nuashonrú. +oauth2_application_name=Ainm Feidhmchláir +oauth2_confidential_client=Cliant Rúnda. Roghnaigh le haghaidh aipeanna a choimeádann an rún faoi rún, mar aipeanna gréasáin. Ná roghnaigh le haghaidh aipeanna dúchasacha lena n-áirítear aipeanna deisce agus soghluaiste. +oauth2_skip_secondary_authorization=Scipeáil údarú do chliaint poiblí tar éis rochtain a dheonú D'fhéadfadh sé go mbeadh riosca slándála +oauth2_redirect_uris=URIs a atreorú. Úsáid líne nua do gach URI le do thoil. +save_application=Sábháil +oauth2_client_id=ID Cliant +oauth2_client_secret=Rúnda Cliant +oauth2_regenerate_secret=Athghin Rún +oauth2_regenerate_secret_hint=Chaill tú do rún? +oauth2_client_secret_hint=Ní thaispeánfar an rún arís tar éis duit an leathanach seo a fhágáil nó a athnuachan. Déan cinnte le do thoil gur shábháil tú é. +oauth2_application_edit=Cuir in eagar +oauth2_application_create_description=Tugann feidhmchláir OAuth2 rochtain d'iarratas tríú páirtí ar chuntais úsáideora ar an gcás seo. +oauth2_application_remove_description=Cuirfear feidhmchlár OAuth2 a bhaint cosc air rochtain a fháil ar chuntais úsáideora údaraithe ar an gcás seo. Lean ar aghaidh? +oauth2_application_locked=Réamhchláraíonn Gitea roinnt feidhmchlár OAuth2 ar thosú má tá sé cumasaithe i gcumraíocht. Chun iompar gan choinne a chosc, ní féidir iad seo a chur in eagar ná a bhaint. Féach do thoil do dhoiciméadú OAuth2 le haghaidh tuilleadh faisnéise. + +authorized_oauth2_applications=Feidhmchláir Údaraithe OAuth2 +authorized_oauth2_applications_description=Tá rochtain tugtha agat ar do chuntas pearsanta Gitea ar na feidhmchláir tríú páirtí seo. Cúlghairm rochtain d'iarratais nach bhfuil uait a thuilleadh. +revoke_key=Cúlghairm +revoke_oauth2_grant=Rochtain a chúlghairm +revoke_oauth2_grant_description=Cuirfidh rochtain ar an bhfeidhmchlár tríú páirtí seo a chúlghairm cosc ar an bhfeidhmchlár seo rochtain An bhfuil tú cinnte? +revoke_oauth2_grant_success=Cúlghairtear rochtain go rathúil. + +twofa_desc=Chun do chuntas a chosaint ar goid pasfhocal, is féidir leat fón cliste nó gléas eile a úsáid chun pasfhocail aon-uaire bunaithe ar am (“TOTP”) a fháil. +twofa_recovery_tip=Má chailleann tú do ghléas, beidh tú in ann eochair aisghabhála aonúsáide a úsáid chun rochtain ar do chuntas a fháil ar ais. +twofa_is_enrolled=Tá do chuntas cláraithe i bhfíord heimhniú dhá fhachtóir faoi láthair. +twofa_not_enrolled=Níl do chuntas cláraithe faoi láthair i bhfíordheimhniú dhá fhachtóir. +twofa_disable=Díchumasaigh Fíordheimhniú Dhá-Fachtóir +twofa_scratch_token_regenerate=Athghin Eochair Aisghabhála Aonúsáide +twofa_scratch_token_regenerated=Is é %s d'eochair aisghabhála aonúsáide anois. Stóráil é in áit shábháilte, mar ní thaispeánfar é arís. +twofa_enroll=Cláraigh le Fíordheimhniú Dhá-Fachtóir +twofa_disable_note=Is féidir leat fíordheimhniú dhá fhachtóir a dhíchumasú más gá. +twofa_disable_desc=Má dhíchumasaítear fíordheimhniú dhá fhachtóir beidh do chuntas chomh slán. Lean ar aghaidh? +regenerate_scratch_token_desc=Má chuir tú d'eochair aisghabhála míchuir tú nó má d'úsáid tú é cheana féin chun síniú isteach, is féidir leat é a athshocrú anseo. +twofa_disabled=Tá fíordheimhniú dhá fhachtóir díchumasaithe. +scan_this_image=Scan an íomhá seo le d'fheidhmchlár fíordheimhnithe: +or_enter_secret=Nó cuir isteach an rún: %s +then_enter_passcode=Agus cuir isteach an paschód a léirítear san fheidhmchlár: +passcode_invalid=Tá an pascód mícheart. Bain triail as arís. +twofa_enrolled=Tá do chuntas cláraithe go rathúil. Stóráil d'eochair aisghabhála aonúsáide (%s) in áit shábháilte, mar ní thaispeánfar é arís. +twofa_failed_get_secret=Theip ar rún a fháil. + +webauthn_desc=Is feistí crua-earraí iad eochracha slándála ina bhfuil eochracha cripte Is féidir iad a úsáid le haghaidh fíordheimhniú dhá fhachtóir. Caithfidh eochracha slándála tacú le caigh deán Fíordheimhnithe WebAuthn +webauthn_register_key=Cuir Eochair Slándála +webauthn_nickname=Leasainm +webauthn_delete_key=Bain Eochair Slándála +webauthn_delete_key_desc=Má bhaineann tú eochair slándála ní féidir leat síniú leis a thuilleadh. Lean ar aghaidh? +webauthn_key_loss_warning=Má chailleann tú d'eochracha slándála, caillfidh tú rochtain ar do chuntas. +webauthn_alternative_tip=B'fhéidir gur mhaith leat modh fíordheimhnithe breise a chumrú. + +manage_account_links=Bainistigh Cuntais Nasctha +manage_account_links_desc=Tá na cuntais sheachtracha seo nasctha le do chuntas Gitea. +account_links_not_available=Níl aon chuntais sheachtracha nasctha le do chuntas Gitea faoi láthair. +link_account=Cuntas Nasc +remove_account_link=Bain Cuntas Nasctha +remove_account_link_desc=Ag baint cuntas nasctha, cuirfear a rochtain ar do chuntas Gitea a chúlghairm. Lean ar aghaidh? +remove_account_link_success=Tá an cuntas nasctha bainte amach. + +hooks.desc=Cuir cuaillí gréasáin leis a spreagfar do gach stór ar leatsa iad. + +orgs_none=Níl tú ina bhall d'aon eagraíochtaí. +repos_none=Níl aon stórais agat. + +delete_account=Scrios Do Cuntas +delete_prompt=Scriosfaidh an oibríocht seo do chuntas úsáideora go buan. NÍ FÉIDIR é a chealú. +delete_with_all_comments=Tá do chuntas níos óige ná %s. Chun tuairimí taibhse a sheachaint, scriosfar gach trácht saincheistea/PR leis. +confirm_delete_account=Deimhnigh scriosadh +delete_account_title=Scrios Cuntas Úsáide +delete_account_desc=An bhfuil tú cinnte gur mhaith leat an cuntas úsáideora seo a scriosadh go buan? + +email_notifications.enable=Cumasaigh Fógraí Ríomhphoist +email_notifications.onmention=Ríomhphost amháin ar luaigh +email_notifications.disable=Díchumasaigh Fógraí Ríomhphoist +email_notifications.submit=Socraigh rogha ríomhphoist +email_notifications.andyourown=Agus Do Fógraí Féin + +visibility=Infheictheacht úsáideora +visibility.public=Poiblí +visibility.public_tooltip=Infheicthe do gach duine +visibility.limited=Teoranta +visibility.limited_tooltip=Infheicthe ach d'úsáideoirí fíordheimhnithe +visibility.private=Príobháideach +visibility.private_tooltip=Ní fheictear ach do bhaill d'eagraíochtaí a chuaigh tú isteach + +[repo] +new_repo_helper=Tá gach comhad tionscadail i stór, lena n-áirítear stair athbhreithnithe. Ceana féin ag óstáil ceann in áit eile Stórlann aistrithe. +owner=Úinéir +owner_helper=B'fhéidir nach dtaispeánfar roinnt eagraíochtaí sa anuas mar gheall ar theorainn uasta comhaireamh stórais. +repo_name=Ainm Stórais +repo_name_helper=Úsáideann dea-ainmneacha stórtha eochairfhocail ghearr, i gcuimhne agus uathúla. +repo_size=Méid an Stóras +template=Teimpléad +template_select=Roghnaigh teimpléad. +template_helper=Déan teimpléad den stóras +template_description=Ligeann stórais teimpléid d'úsáideoirí stórais nua a ghiniúint leis an struchtúr eolaire céanna, comhaid agus socruithe roghnacha. +visibility=Infheictheacht +visibility_description=Ní bheidh ach an t-úinéir nó baill na heagraíochta má tá cearta acu in ann é a fheiceáil. +visibility_helper=Déan stóras príobháideach +visibility_helper_forced=Cuireann riarthóir do shuíomh iallach ar stórais nua a bheith príobháideach. +visibility_fork_helper=(Beidh tionchar ag athrú seo ar gach forc.) +clone_helper=Teastaíonn cabhair ó chlónáil? Tabhair cuairt ar Cabhair. +fork_repo=Stóras Forc +fork_from=Forc ó +already_forked=Tá tú tar éis %s a fhoirceann +fork_to_different_account=Forc chuig cuntas difriúil +fork_visibility_helper=Ní féidir infheictheacht stór forcailte a athrú. +fork_branch=Brainse le clónú chuig an bhforc +all_branches=Gach brainse +fork_no_valid_owners=Ní féidir an stór seo a fhorcáil toisc nach bhfuil úinéirí bailí ann. +fork.blocked_user=Ní féidir an stór a fhorcáil toisc go bhfuil úinéir an stórais bac ort. +use_template=Úsáid an teimpléad seo +open_with_editor=Oscail le %s +download_zip=Íoslódáil ZIP +download_tar=Íoslódáil TAR.GZ +download_bundle=Íoslódáil BUNDLE +generate_repo=Cruthaigh Stóras +generate_from=Gin Ó +repo_desc=Cur síos +repo_desc_helper=Cuir isteach tuairisc ghearr (roghnach) +repo_lang=Teanga +repo_gitignore_helper=Roghnaigh teimpléid .gitignore. +repo_gitignore_helper_desc=Roghnaigh na comhaid nach bhfuil le rianú ó liosta teimpléid do theangacha coitianta. Cuirtear déantáin tipiciúla a ghineann uirlisí tógála gach teanga san áireamh ar.gitignore de réir réamhshocraithe. +issue_labels=Lipéid Eisiúna +issue_labels_helper=Roghnaigh tacar lipéad eisiúna. +license=Ceadúnas +license_helper=Roghnaigh comhad ceadúnais. +license_helper_desc=Rialaíonn ceadúnas cad is féidir agus nach féidir le daoine eile a dhéanamh le do chód. Níl mé cinnte cé acu ceann atá ceart do do thionscadal? Féach Roghnaigh ceadúnas. +multiple_licenses=Ceadúnais Iolracha +object_format=Formáid Oibiacht +object_format_helper=Formáid oibiacht an stór. Ní féidir é a athrú níos déanaí. Is é SHA1 an comhoiriúnacht is fearr. +readme=README +readme_helper=Roghnaigh comhad teimpléad README. +readme_helper_desc=Seo an áit inar féidir leat cur síos iomlán a scríobh do thionscadal. +auto_init=Taisce a thionscnamh (Cuireann sé .gitignore, Ceadúnas agus README) +trust_model_helper=Roghnaigh múnla iontaobhais le haghaidh fíorú Is iad na roghanna féideartha: +trust_model_helper_collaborator=Comhoibritheoir: Sínithe muinín ag comhoibrithe +trust_model_helper_committer=Gealltóir: Iontaobhais sínithe a mheaitseálann na gealltoirí +trust_model_helper_collaborator_committer=Comhoibritheo+Coiteoir: Sínithe iontaobhais ag comhoibritheoirí a mheaitseann leis an gealltóir +trust_model_helper_default=Réamhshocrú: Úsáid an tsamhail iontaobhais réamhshocraithe don tsuiteáil seo +create_repo=Cruthaigh Stóras +default_branch=Branse Réamhshocraithe +default_branch_label=réamhshocraithe +default_branch_helper=Is é an brainse réamhshocraithe an bunbhrainse d'iarratais tarraingthe agus gealltanna cód. +mirror_prune=Prúnáil +mirror_prune_desc=Bain tagairtí cianrianaithe atá as feidhm +mirror_interval=Eatramh Scátháin (is iad aonaid ama bailí ná 'h', 'm', 's'). 0 chun sioncrónú tréimhsiúil a dhíchumasú. (Eatraimh íosta: %s) +mirror_interval_invalid=Níl an eatramh scátháin bailí. +mirror_sync=sioncronaithe +mirror_sync_on_commit=Sioncrónaigh nuair a bhrúitear geallúintí +mirror_address=Clón Ó URL +mirror_address_desc=Cuir aon dhintiúir riachtanacha sa chuid Údaraithe. +mirror_address_url_invalid=Tá an URL curtha ar fáil neamhbhailí. Caithfidh tú gach comhpháirt den url a éalú i gceart. +mirror_address_protocol_invalid=Tá an URL curtha ar fáil neamhbhailí. Ní féidir ach suíomhanna http (s)://nó git://a úsáid le haghaidh scátháin. +mirror_lfs=Stóráil Comhad Móra (LFS) +mirror_lfs_desc=Gníomhachtaigh scáthú sonraí LFS. +mirror_lfs_endpoint=Críochphointe LFS +mirror_lfs_endpoint_desc=Déanfaidh Sync iarracht an url clónála a úsáid chun an freastalaí LFS a chinneadh. Is féidir leat críochphointe saincheaptha a shonrú freisin má tá na sonraí LFS stórtha stóráilte áit éigin eile. +mirror_last_synced=Sincronaithe Deireanach +mirror_password_placeholder=(Gan athrú) +mirror_password_blank_placeholder=(Neamhshocraithe) +mirror_password_help=Athraigh ainm úsáideora chun pasfhocal stóráilte a scriosadh. +watchers=Breathnóirí +stargazers=Réalteoirí +stars_remove_warning=Bainfidh sé seo na réaltaí go léir ón stóras seo. +forks=Forcanna +stars=Réaltaí +reactions_more=agus %d níos mó +unit_disabled=Tá an chuid stórais seo díchumasaithe ag riarthóir an láithreáin. +language_other=Eile +adopt_search=Iontráil ainm úsáideora chun stórais neamhghlactha a chuardach... (fág bán chun gach rud a fháil) +adopt_preexisting_label=Glacadh le Comhaid +adopt_preexisting=Glac le comhaid atá ann cheana +adopt_preexisting_content=Cruthaigh stór ó %s +adopt_preexisting_success=Comhaid ghlacadh agus stór cruthaithe ó %s +delete_preexisting_label=Scrios +delete_preexisting=Scrios comhaid atá ann cheana +delete_preexisting_content=Scrios comhaid i %s +delete_preexisting_success=Scriosta comhaid neamhghlactha i %s +blame_prior=Féach ar an milleán roimh an athrú seo +blame.ignore_revs=Ag déanamh neamhairde de leasuithe i .git-blame-ignore-revs. Cliceáil anseo chun seachaint agus an gnáth-amharc milleán a fheiceáil. +blame.ignore_revs.failed=Theip ar neamhaird a dhéanamh ar leasuithe i .git-blame-ignore-revs. +author_search_tooltip=Taispeánann 30 úsáideoir ar a mhéad + +tree_path_not_found_commit=Níl cosán %[1]s ann i dtiomantas %[2]s +tree_path_not_found_branch=Níl cosán %[1]s ann i mbrainse %[2]s +tree_path_not_found_tag=Níl cosán %[1]s ann i gclib %[2]s + +transfer.accept=Glac le hAistriú +transfer.accept_desc=Aistriú chuig “%s” +transfer.reject=Diúltaigh aistriú +transfer.reject_desc=`Cealaigh aistriú chuig "%s"` +transfer.no_permission_to_accept=Níl cead agat glacadh leis an aistriú seo. +transfer.no_permission_to_reject=Níl cead agat an aistriú seo a dhiúltú. + +desc.private=Príobháideach +desc.public=Poiblí +desc.template=Teimpléad +desc.internal=Inmheánach +desc.archived=Cartlannaithe +desc.sha256=SHA256 + +template.items=Míreanna Teimpléad +template.git_content=Ábhar Git (Brainse Réamhshocraithe) +template.git_hooks=Crúcanna Git +template.git_hooks_tooltip=Faoi láthair ní féidir leat Git Hooks a mhodhnú nó a bhaint nuair a chuirtear leis. Roghnaigh é seo ach amháin má tá muinín agat as an stóras teimpléid. +template.webhooks=Crúcaí gréasáin +template.topics=Topaicí +template.avatar=Abhatár +template.issue_labels=Lipéid Eisiúna +template.one_item=Ní mór mír teimpléad amháin ar a laghad a roghnú +template.invalid=Ní mór stór teimpléad a roghnú + +archive.title=Tá an stóras seo i gcartlann. Is féidir leat comhaid a fheiceáil agus iad a chlónáil, ach ní féidir leat ceisteanna a bhrú ná a oscailt ná iarratais a tharraingt. +archive.title_date=Tá an stóras seo cartlannaithe ar %s. Is féidir leat comhaid a fheiceáil agus é a chlónú, ach ní féidir leat saincheisteanna a bhrú nó a oscailt ná iarratais a tharraingt. +archive.issue.nocomment=Tá an stóras seo i gcartlann. Ní féidir leat trácht a dhéanamh ar shaincheisteanna. +archive.pull.nocomment=Tá an stóras seo i gcartlann. Ní féidir leat trácht a dhéanamh ar iarratais tarraingthe. + +form.reach_limit_of_creation_1=Tá úinéir an stóras tar éis teorainn de %d stóras a bhaint amach cheana féin. +form.reach_limit_of_creation_n=Tá úinéir an stórais tar éis teorainn de %d stórtha a bhaint amach cheana féin. +form.name_reserved=Tá ainm an stór "%s" in áirithe. +form.name_pattern_not_allowed=Ní cheadaítear an patrún "%s" in ainm stór. + +need_auth=Údarú +migrate_options=Roghanna Imirce +migrate_service=Seirbhís Imirce +migrate_options_mirror_helper=Beidh an stóras seo ina scáthán +migrate_options_lfs=Aimirce comhaid LFS +migrate_options_lfs_endpoint.label=Críochphointe LFS +migrate_options_lfs_endpoint.description=Déanfaidh imirce iarracht do chianda Git a úsáid chun freastalaí LFS a chinneadh. Is féidir leat críochphointe saincheaptha a shonrú freisin má tá na sonraí LFS stórtha stóráilte áit éigin eile. +migrate_options_lfs_endpoint.description.local=Tacaítear le cosán freastalaí áitiúil freisin. +migrate_options_lfs_endpoint.placeholder=Má fhágtar bán, díorthófar an críochphointe ón URL clóin +migrate_items=Míreanna Imirce +migrate_items_wiki=Wiki +migrate_items_milestones=Clocha míle +migrate_items_labels=Lipéid +migrate_items_issues=Saincheisteanna +migrate_items_pullrequests=Iarrataí Tarraing +migrate_items_merge_requests=Iarrataí Cumaisc +migrate_items_releases=Eisiúintí +migrate_repo=Stóras Imirc +migrate.clone_address=Aimirce/ Clón Ó URL +migrate.clone_address_desc=An URL 'clón' HTTP(S) nó Git de stóras atá ann cheana +migrate.github_token_desc=Is féidir leat comhartha amháin nó níos mó a chur le camóg scartha anseo chun imirce a dhéanamh níos gasta mar gheall ar theorainn ráta API GitHub. RABHADH: D'fhéadfadh mí-úsáid na ngné seo beartas an sholáthraí seirbhíse a shárú agus blocáil cuntais a bheith mar thoradh air. +migrate.clone_local_path=nó cosán freastalaí áitiúil +migrate.permission_denied=Ní cheadaítear duit stórais áitiúla a iompórtáil. +migrate.permission_denied_blocked=Ní féidir leat allmhairiú ó óstaigh neamh-cheadaithe, iarr ar an riarachán socruithe ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS a sheiceáil le do thoil. +migrate.invalid_local_path=Tá an cosán áitiúil neamhbhailí. Níl sé ann nó ní eolaire é. +migrate.invalid_lfs_endpoint=Níl an críochphointe LFS bailí. +migrate.failed=Theip ar an imirce:% v +migrate.migrate_items_options=Teastaíonn Comhartha Rochtana chun míreanna breise a aistriú +migrated_from=Aistríodh ó %[2]s +migrated_from_fake=Aistrithe ó %[1]s +migrate.migrate=Aistrigh Ó %s +migrate.migrating=Ag aistriú ó %s ... +migrate.migrating_failed=Theip ar aistriú ó %s. +migrate.migrating_failed.error=Theip ar aistriú: %s +migrate.migrating_failed_no_addr=Theip ar an imirce. +migrate.github.description=Aistrigh sonraí ó github.com nó ó chásanna GitHub eile. +migrate.git.description=Aistrigh stór amháin ó aon seirbhís Git. +migrate.gitlab.description=Aistrigh sonraí ó gitlab.com nó ó chásanna GitLab eile. +migrate.gitea.description=Aistrigh sonraí ó gitea.com nó ó chásanna Gitea eile. +migrate.gogs.description=Aistrigh sonraí ó notabug.org nó ó chásanna eile de chuid Gogs. +migrate.onedev.description=Aistrigh sonraí ó code.onedev.io nó ó chásanna OneDev eile. +migrate.codebase.description=Aistrigh sonraí ó codebasehq.com. +migrate.gitbucket.description=Aistrigh sonraí ó chásanna GitBucket. +migrate.codecommit.description=Aistrigh sonraí ó AWS CodeCommit. +migrate.codecommit.aws_access_key_id=ID Eochair Rochtana AWS +migrate.codecommit.aws_secret_access_key=Eochair Rochtana Rúnda AWS +migrate.codecommit.https_git_credentials_username=Ainm Úsáideora HTTPS Git Dintiúir +migrate.codecommit.https_git_credentials_password=Pasfhocal Dintiúir Git HTTPS +migrate.migrating_git=Sonraí Git a Aimirce +migrate.migrating_topics=Ábhair Imirce +migrate.migrating_milestones=Clocha Míle a Imirce +migrate.migrating_labels=Lipéid Imirce +migrate.migrating_releases=Eisiúintí Imirce +migrate.migrating_issues=Saincheisteanna Imirce +migrate.migrating_pulls=Iarratais Tarraingthe á n-Imirce +migrate.cancel_migrating_title=Cealaigh Imirce +migrate.cancel_migrating_confirm=Ar mhaith leat an imirce seo a chealú? + +mirror_from=scáthán de +forked_from=forcailte ó +generated_from=a ghintear ó +fork_from_self=Ní féidir leat stóras atá agat a fhorcáil. +fork_guest_user=Sínigh isteach chun an stóras seo a fhorc. +watch_guest_user=Sínigh isteach chun féachaint ar an stór seo. +star_guest_user=Sínigh isteach chun an stóras seo a réalú. +unwatch=Dífhéachaint +watch=Fhéachaint +unstar=Bain Réalta +star=Réalta +fork=Forc +action.blocked_user=Ní féidir gníomh a dhéanamh toisc go bhfuil úinéir an stórais bac ort. +download_archive=Íoslódáil Stóras +more_operations=Tuilleadh oibríochtaí + +quick_guide=Treoir Tapa +clone_this_repo=Clóin an stóras seo +cite_this_repo=Luaigh an stóras seo +create_new_repo_command=Stóras nua a chruthú ar an líne ordaithe +push_exist_repo=Stóras atá ann cheana a bhrú ón líne ordaithe +empty_message=Níl aon ábhar sa stóras seo. +broken_message=Ní féidir na sonraí Git atá mar bhunús leis an stóras seo a léamh. Déan teagmháil le riarthóir an chás seo nó scrios an stóras seo. + +code=Cód +code.desc=Rochtain ar chód foinse, comhaid, gealltanais agus brainsí. +branch=Brainse +tree=Crann +clear_ref=`Tagairt reatha soiléir` +filter_branch_and_tag=Scagaire brainse nó clib +find_tag=Aimsigh clib +branches=Brainsí +tags=Clibeanna +issues=Saincheisteanna +pulls=Iarratais Tarraingthe +projects=Tionscadail +packages=Pacáistí +actions=Gníomhartha +labels=Lipéid +org_labels_desc=Lipéid ar leibhéal eagraíochta is féidir a úsáid le gach stóras faoin eagraíocht seo +org_labels_desc_manage=bainistigh + +milestones=Clocha míle +commits=Tiomáintí +commit=Tiomantas + + + +commits.commits=Tiomáintí + + +commitstatus.error=Earráid + + +projects.new=Tionscadal Nua +projects.template.desc=Teimpléad +projects.column.new=Colún Nua + +issues.new.projects=Tionscadail +issues.new.milestone=Cloch Mhíle +issues.filter_label=Lipéad +issues.filter_milestone=Cloch Mhíle +issues.filter_project=Tionscadal +issues.filter_assignee=Sannaitheoir +issues.action_label=Lipéad +issues.action_milestone=Cloch Mhíle +issues.action_assignee=Sannaitheoir +issues.save=Sábháil + + +pulls.tab_commits=Tiomáintí + + + + + + + + + + + + + +wiki=Wiki +wiki.page=Leathanach +wiki.new_page=Leathanach + + +contributors.contribution_type.commits=Tiomáintí + +settings.githooks=Crúcanna Git + +settings.trust_model.collaborator.long=Comhoibritheoir: Sínithe muinín ag comhoibrithe +settings.trust_model.collaboratorcommitter.long=Comhoibritheo+Coiteoir: Sínithe iontaobhais ag comhoibritheoirí a mheaitseann leis an gealltóir +settings.event_fork=Forc +settings.event_wiki=Wiki + + + + + + + + + +[graphs] + +[org] + + + + + + + +[admin] + +dashboard.sync_repo_licenses=Sioncronaigh ceadúnais repo + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[action] + +[tool] + +[dropzone] + +[notification] + +[gpg] + +[units] + +[packages] + +[secrets] + +[actions] + + + +runners.task_list.commit=Tiomantas + +runs.commit=Tiomantas + + + + +[projects] + +[git.filemode] +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … + From 7e68bc88238104d2ee8b5a877fc1ad437f1778a4 Mon Sep 17 00:00:00 2001 From: Job Date: Fri, 4 Oct 2024 19:12:48 +0200 Subject: [PATCH 05/41] Fix PR creation on forked repositories (#31863) Resolves #20475 --- routers/api/v1/repo/pull.go | 17 ++++++++++++++--- tests/integration/pull_create_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 7eb4a8b8a2d4..4e3de77032fb 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1124,9 +1124,20 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) // Check if current user has fork of repository or in the same repository. headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID) if headRepo == nil && !isSameRepo { - log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) - ctx.NotFound("GetForkedRepo") - return nil, nil, nil, "", "" + err := baseRepo.GetBaseRepo(ctx) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetBaseRepo", err) + return nil, nil, nil, "", "" + } + + // Check if baseRepo's base repository is the same as headUser's repository. + if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID { + log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) + ctx.NotFound("GetBaseRepo") + return nil, nil, nil, "", "" + } + // Assign headRepo so it can be used below. + headRepo = baseRepo.BaseRepo } var headGitRepo *git.Repository diff --git a/tests/integration/pull_create_test.go b/tests/integration/pull_create_test.go index 5a06a7817f66..9812d2073d1e 100644 --- a/tests/integration/pull_create_test.go +++ b/tests/integration/pull_create_test.go @@ -199,3 +199,30 @@ func TestPullBranchDelete(t *testing.T) { session.MakeRequest(t, req, http.StatusOK) }) } + +/* +Setup: +The base repository is: user2/repo1 +Fork repository to: user1/repo1 +Push extra commit to: user2/repo1, which changes README.md +Create a PR on user1/repo1 + +Test checks: +Check if pull request can be created from base to the fork repository. +*/ +func TestPullCreatePrFromBaseToFork(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + sessionFork := loginUser(t, "user1") + testRepoFork(t, sessionFork, "user2", "repo1", "user1", "repo1", "") + + // Edit base repository + sessionBase := loginUser(t, "user2") + testEditFile(t, sessionBase, "user2", "repo1", "master", "README.md", "Hello, World (Edited)\n") + + // Create a PR + resp := testPullCreateDirectly(t, sessionFork, "user1", "repo1", "master", "user2", "repo1", "master", "This is a pull title") + // check the redirected URL + url := test.RedirectURL(resp) + assert.Regexp(t, "^/user1/repo1/pulls/[0-9]*$", url) + }) +} From 5d6d025c9b8d2abca9ec2bfdc795d1f0c1c6592d Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Sat, 5 Oct 2024 02:45:06 +0900 Subject: [PATCH 06/41] Add support for searching users by email (#30908) Fix #30898 we have an option `SearchByEmail`, so enable it, then we can search user by email. Also added a test for it. --- models/user/search.go | 14 ++++++++- routers/api/v1/user/user.go | 11 +++---- tests/integration/api_user_search_test.go | 36 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/models/user/search.go b/models/user/search.go index 45b051187ea0..382b6fac2b08 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -65,7 +65,19 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess builder.Like{"LOWER(full_name)", lowerKeyword}, ) if opts.SearchByEmail { - keywordCond = keywordCond.Or(builder.Like{"LOWER(email)", lowerKeyword}) + var emailCond builder.Cond + emailCond = builder.Like{"LOWER(email)", lowerKeyword} + if opts.Actor == nil { + emailCond = emailCond.And(builder.Eq{"keep_email_private": false}) + } else if !opts.Actor.IsAdmin { + emailCond = emailCond.And( + builder.Or( + builder.Eq{"keep_email_private": false}, + builder.Eq{"id": opts.Actor.ID}, + ), + ) + } + keywordCond = keywordCond.Or(emailCond) } cond = cond.And(keywordCond) diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index fedad87fc4fa..2c277a18c739 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -68,11 +68,12 @@ func Search(ctx *context.APIContext) { users = []*user_model.User{user_model.NewActionsUser()} default: users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ - Actor: ctx.Doer, - Keyword: ctx.FormTrim("q"), - UID: uid, - Type: user_model.UserTypeIndividual, - ListOptions: listOptions, + Actor: ctx.Doer, + Keyword: ctx.FormTrim("q"), + UID: uid, + Type: user_model.UserTypeIndividual, + SearchByEmail: true, + ListOptions: listOptions, }) if err != nil { ctx.JSON(http.StatusInternalServerError, map[string]any{ diff --git a/tests/integration/api_user_search_test.go b/tests/integration/api_user_search_test.go index f776b3532576..ff4671c54e94 100644 --- a/tests/integration/api_user_search_test.go +++ b/tests/integration/api_user_search_test.go @@ -109,3 +109,39 @@ func TestAPIUserSearchNotLoggedInUserHidden(t *testing.T) { DecodeJSON(t, resp, &results) assert.Empty(t, results.Data) } + +func TestAPIUserSearchByEmail(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + // admin can search user with private email + adminUsername := "user1" + session := loginUser(t, adminUsername) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser) + query := "user2@example.com" + req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusOK) + + var results SearchResults + DecodeJSON(t, resp, &results) + assert.Equal(t, 1, len(results.Data)) + assert.Equal(t, query, results.Data[0].Email) + + // no login user can not search user with private email + req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &results) + assert.Empty(t, results.Data) + + // user can search self with private email + user2 := "user2" + session = loginUser(t, user2) + token = getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser) + req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query). + AddTokenAuth(token) + resp = MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &results) + assert.Equal(t, 1, len(results.Data)) + assert.Equal(t, query, results.Data[0].Email) +} From 6a4eb126bd911e36489979954f0b3a3ebc1ae19f Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 5 Oct 2024 00:30:40 +0000 Subject: [PATCH 07/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_ga-IE.ini | 422 +++++++++++++++++++++++++++++++- 1 file changed, 415 insertions(+), 7 deletions(-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 4f579c0dd74e..826ac0accef4 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -1238,29 +1238,425 @@ org_labels_desc_manage=bainistigh milestones=Clocha míle commits=Tiomáintí commit=Tiomantas - - - +release=Scaoileadh +releases=Scaoileann +tag=Clib +released_this=scaoileadh seo +tagged_this=clib seo +file.title=%s ag %s +file_raw=Amh +file_history=Stair +file_view_source=Féach Foinse +file_view_rendered=Amharc Rindreáilte +file_view_raw=Amharc Amh +file_permalink=Buan-nasc +file_too_large=Tá an comhad ró-mhór le taispeáint. +file_is_empty=Tá an comhad folamh. +code_preview_line_from_to=Línte %[1]d go %[2]d i %[3]s +code_preview_line_in=Líne %[1]d i %[2]s +invisible_runes_header=`Tá carachtair Unicode dofheicthe sa chomhad seo ` +invisible_runes_description=`Tá carachtair dofheicthe Unicode sa chomhad seo nach féidir a idirdhealú do dhaoine ach d'fhéadfadh ríomhaire iad a phróiseáil ar bhealach difriúil. Má cheapann tú go bhfuil sé seo d'aon ghnó, is féidir leat neamhaird a dhéanamh go sábháilte don rabhadh seo Úsáid an cnaipe Escape chun iad a nochtadh. ` +ambiguous_runes_header=`Tá carachtair Unicode débhríoch sa chomhad seo ` +ambiguous_runes_description=`Tá carachtair Unicode sa chomhad seo a d'fhéadfadh a bheith mearbhall le carachtair eile. Má cheapann tú go bhfuil sé seo d'aon ghnó, is féidir leat neamhaird a dhéanamh go sábháilte don rabhadh seo Úsáid an cnaipe Escape chun iad a nochtadh. ` +invisible_runes_line=`Tá carachtair unicode dofheicthe ag an líne seo ` +ambiguous_runes_line=`Tá carachtair unicode débhríoch ag an líne seo ` +ambiguous_character=Is féidir `%[1]c [U+%04[1]X] a mheascadh le %[2]c [U+%04[2]X]` + +escape_control_characters=Éalú +unescape_control_characters=Dí-Éalú +file_copy_permalink=Cóipeáil Buan-nasc +view_git_blame=Féach ar Git Blame +video_not_supported_in_browser=Ní thacaíonn do bhrabhsálaí leis an gclib 'video' HTML5. +audio_not_supported_in_browser=Ní thacaíonn do bhrabhsálaí leis an gclib 'audio' HTML5. +stored_lfs=Stóráilte le Git LFS +symbolic_link=Nasc siombalach +executable_file=Comhad Infheidhmithe +vendored=Díoltóra +generated=Gintear +commit_graph=Graf Tiomantas +commit_graph.select=Roghnaigh brainsí +commit_graph.hide_pr_refs=Folaigh Iarrataí Tarraing +commit_graph.monochrome=Mona +commit_graph.color=Dath +commit.contained_in=Tá an tiomantas seo le fáil i: +commit.contained_in_default_branch=Tá an tiomantas seo mar chuid den bhrainse réamhshocraithe +commit.load_referencing_branches_and_tags=Luchtaigh brainsí agus clibeanna a thagraíonn an tiomantas +blame=An milleán +download_file=Íoslódáil comhad +normal_view=Amharc Gnáth +line=líne +lines=línte +from_comment=(trácht) + +editor.add_file=Cuir Comhad +editor.new_file=Comhad Nua +editor.upload_file=Uaslódáil Comhad +editor.edit_file=Cuir Comhad in eagar +editor.preview_changes=Athruithe Réamhamhar +editor.cannot_edit_lfs_files=Ní féidir comhaid LFS a chur in eagar sa chomhéadan gréasáin. +editor.cannot_edit_non_text_files=Ní féidir comhaid dhénártha a chur in eagar sa chomhéadan gréasáin. +editor.edit_this_file=Cuir Comhad in eagar +editor.this_file_locked=Tá an comhad faoi ghlas +editor.must_be_on_a_branch=Caithfidh tú a bheith ar bhrainse chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.fork_before_edit=Ní mór duit an stór seo a fhorcáil chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.delete_this_file=Scrios Comhad +editor.must_have_write_access=Caithfidh rochtain scríofa a bheith agat chun athruithe a dhéanamh nó a mholadh ar an gcomhad seo. +editor.file_delete_success=Tá an comhad "%s" scriosta. +editor.name_your_file=Ainmnigh do chomhad… +editor.filename_help=Cuir eolaire leis trína ainm a chlóscríobh ina dhiaidh sin le slash ('/'). Bain eolaire trí backspace a chlóscríobh ag tús an réimse ionchuir. +editor.or=nó +editor.cancel_lower=Cealaigh +editor.commit_signed_changes=Tiomantas Athruithe Sínithe +editor.commit_changes=Athruithe a Tiomantas +editor.add_tmpl=Cuir '{filename}' leis +editor.add=Cuir %s leis +editor.update=Nuashonraigh %s +editor.delete=Scrios %s +editor.patch=Cuir paiste i bhfeidh +editor.patching=Paisteáil: +editor.fail_to_apply_patch=Ní féidir paiste "%s" a chur i bhfeidhm +editor.new_patch=Paiste Nua +editor.commit_message_desc=Cuir cur síos leathnaithe roghnach leis… +editor.signoff_desc=Cuir leantóir sínithe ag an gcoiteoir ag deireadh na teachtaireachta logála tiomanta. +editor.commit_directly_to_this_branch=Tiomanta go díreach chuig an mbrainse %s. +editor.create_new_branch=Cruthaigh brainse nua don ghealltanas seo agus cuir tús le hiarratas tarraingthe. +editor.create_new_branch_np=Cruthaigh brainse nua don tiomantas seo. +editor.propose_file_change=Athrú comhad a mholadh +editor.new_branch_name=Ainmnigh an brainse nua don gealltanas seo +editor.new_branch_name_desc=Ainm brainse nua… +editor.cancel=Cealaigh +editor.filename_cannot_be_empty=Ní féidir ainm an chomhaid a bheith folamh. +editor.filename_is_invalid=Tá ainm an chomhaid neamhbhailí: "%s". +editor.branch_does_not_exist=Níl brainse "%s" ann sa stóras seo. +editor.branch_already_exists=Tá brainse "%s" ann cheana féin sa stóras seo. +editor.directory_is_a_file=Úsáidtear ainm eolaire "%s" cheana féin mar ainm comhaid sa stóras seo. +editor.file_is_a_symlink=Is nasc siombalach é `"%s". Ní féidir naisc shiombalacha a chur in eagar san eagarthóir gréasáin` +editor.filename_is_a_directory=Úsáidtear ainm comhaid "%s" cheana féin mar ainm eolaire sa stóras seo. +editor.file_editing_no_longer_exists=Níl an comhad atá á chur in eagar, "%s", ann sa stóras seo a thuilleadh. +editor.file_deleting_no_longer_exists=Níl an comhad atá á scriosadh, "%s", ann sa stóras seo a thuilleadh. +editor.file_changed_while_editing=Tá athrú tagtha ar ábhar an chomhad ó thosaigh tú ag eagarthóireacht Cliceáil anseo chun iad a fheiceáil nó Athru ithe a Tiomantas arís chun iad a fhorscríobh. +editor.file_already_exists=Tá comhad darb ainm "%s" ann cheana féin sa stóras seo. +editor.commit_id_not_matching=Ní mheaitseálann an ID Tiomanta leis an ID nuair a thosaigh tú ag eagarthóireacht. Tiomanta isteach i mbrainse paiste agus ansin cumaisc. +editor.push_out_of_date=Is cosúil go bhfuil an brú as dáta. +editor.commit_empty_file_header=Tiomantas comhad folamh +editor.commit_empty_file_text=Tá an comhad atá tú ar tí tiomantas folamh. Ar aghaidh? +editor.no_changes_to_show=Níl aon athruithe le taispeáint. +editor.fail_to_update_file=Theip ar nuashonrú/cruthú comhad "%s". +editor.fail_to_update_file_summary=Teachtaireacht Earráide: +editor.push_rejected_no_message=Dhiúltaigh an freastalaí an t-athrú gan teachtaireacht. Seiceáil Git Hooks le do thoil. +editor.push_rejected=Dhiúltaigh an freastalaí an t-athrú. Seiceáil Git Hooks le do thoil. +editor.push_rejected_summary=Teachtaireacht Diúltaithe Iomlán: +editor.add_subdir=Cuir eolaire leis… +editor.unable_to_upload_files=Theip ar uaslódáil comhaid go "%s" le hearráid: %v +editor.upload_file_is_locked=Tá comhad "%s" faoi ghlas ag %s. +editor.upload_files_to_dir=`Uaslódáil comhaid go "%s"` +editor.cannot_commit_to_protected_branch=Ní féidir gealltanas a thabhairt don bhrainse faoi chosaint "%s". +editor.no_commit_to_branch=Ní féidir tiomantas a thabhairt go díreach don bhrainse mar: +editor.user_no_push_to_branch=Ní féidir leis an úsáideoir brúigh go dtí an brainse +editor.require_signed_commit=Éilíonn an Brainse tiomantas sínithe +editor.cherry_pick=Roghnaigh silíní %s ar: +editor.revert=Fill %s ar: + +commits.desc=Brabhsáil stair athraithe cód foinse. commits.commits=Tiomáintí - +commits.no_commits=Níl aon ghealltanas i gcoiteann. Tá stair iomlán difriúil ag "%s" agus "%s". +commits.nothing_to_compare=Tá na brainsí seo cothrom. +commits.search.tooltip=Is féidir eochairfhocail a réamhfhostú le “údar:”, “committer:”, “after:”, nó “before:”, e.g. "fill an t-údar:Alice roimh: 2019-01-13". +commits.search_branch=An Brainse seo +commits.search_all=Gach Brainse +commits.author=Údar +commits.message=Teachtaireacht +commits.date=Dáta +commits.older=Níos sine +commits.newer=Níos nuaí +commits.signed_by=Sínithe ag +commits.signed_by_untrusted_user=Sínithe ag úsáideoir neamhiontaofa +commits.signed_by_untrusted_user_unmatched=Sínithe ag úsáideoir neamhiontaofa nach bhfuil ag teacht leis an gcoiste +commits.gpg_key_id=GPG Eochair ID +commits.ssh_key_fingerprint=Méarloirg Eochair SSH +commits.view_path=Féach ag an bpointe seo sa stair + +commit.operations=Oibríochtaí +commit.revert=Téigh ar ais +commit.revert-header=Téigh ar ais: %s +commit.revert-content=Roghnaigh brainse chun filleadh ar: +commit.cherry-pick=Roghnaigh silíní +commit.cherry-pick-header=Roghnaigh silíní: %s +commit.cherry-pick-content=Roghnaigh brainse chun silíní a phiocadh air: commitstatus.error=Earráid - - +commitstatus.failure=Teip +commitstatus.pending=Ar feitheamh +commitstatus.success=Rath + +ext_issues=Rochtain ar Saincheisteanna Seachtracha +ext_issues.desc=Nasc le rianaitheoir saincheisteanna seachtrach. + +projects.desc=Saincheisteanna a bhainistiú agus tionscadail a tharraingt isteach. +projects.description=Cur síos (roghnach) +projects.description_placeholder=Cur síos +projects.create=Cruthaigh Tionscadal +projects.title=Teideal projects.new=Tionscadal Nua +projects.new_subheader=Déan do chuid oibre a chomhordú, a rianú agus a nuashonrú in aon áit amháin, ionas go bhfanann na tionscadail trédhearcach agus de réir sceidil. +projects.create_success=Tá an tionscadal "%s" cruthaithe. +projects.deletion=Scrios tionscadal +projects.deletion_desc=Má scriostar tionscadal, bainfear de gach saincheist a bhaineann leis é. Lean ort? +projects.deletion_success=Tá an tionscadal scriosta. +projects.edit=Cuir Tionscadal in Eagar +projects.edit_subheader=Eagraíonn tionscadail saincheisteanna agus rianaíonn siad dul chun cinn. +projects.modify=Cuir Tionscadal in Eagar +projects.edit_success=Tá an tionscadal "%s" nuashonraithe. +projects.type.none=Níl aon +projects.type.basic_kanban=Bunúsach Kanban +projects.type.bug_triage=Triáiseáil Fabht projects.template.desc=Teimpléad +projects.template.desc_helper=Roghnaigh teimpléad tionscadail chun tosú +projects.column.edit=Cuir Colún in eagar +projects.column.edit_title=Ainm +projects.column.new_title=Ainm +projects.column.new_submit=Cruthaigh Colún projects.column.new=Colún Nua - +projects.column.set_default=Socraigh Réamhshocrú +projects.column.set_default_desc=Socraigh an colún seo mar réamhshocrú le haghaidh saincheisteanna agus tarraingtí gan chatagóir +projects.column.delete=Scrios Colún +projects.column.deletion_desc=Ag scriosadh colún tionscadail aistríonn gach saincheist ghaolmhar chuig an gcolún. Lean ar aghaidh? +projects.column.color=Dath +projects.open=Oscailte +projects.close=Dún +projects.column.assigned_to=Sannta do +projects.card_type.desc=Réamhamharcanna Cárta +projects.card_type.images_and_text=Íomhánna agus Téacs +projects.card_type.text_only=Téacs Amháin + +issues.desc=Eagraigh tuarascálacha fabht, tascanna agus cloch mhíle. +issues.filter_assignees=Scagaire Sannaitheoir +issues.filter_milestones=Cloch Mhíle Scagaire +issues.filter_projects=Tionscadal Scagaire +issues.filter_labels=Lipéad Scagaire +issues.filter_reviewers=Athbhreithneoir Scagaire +issues.new=Eagrán Nua +issues.new.title_empty=Ní féidir leis an teideal a bheith folamh +issues.new.labels=Lipéid +issues.new.no_label=Gan Lipéad +issues.new.clear_labels=Lipéid shoiléir issues.new.projects=Tionscadail +issues.new.clear_projects=Tionscadail soiléire +issues.new.no_projects=Gan aon tionscadal +issues.new.open_projects=Tionscadail Oscailte +issues.new.closed_projects=Tionscadail Dúnta +issues.new.no_items=Gan aon earraí issues.new.milestone=Cloch Mhíle +issues.new.no_milestone=Gan Chloch Mhíle +issues.new.clear_milestone=Cloch Mhíle soiléir +issues.new.open_milestone=Clocha Míle Oscailte +issues.new.closed_milestone=Clocha Míle Dúnta +issues.new.assignees=Sannaitheoirí +issues.new.clear_assignees=Ceannaitheoirí soiléir +issues.new.no_assignees=Gan aon Sannaitheoirí +issues.new.no_reviewers=Gan athbhreithnithe +issues.new.blocked_user=Ní féidir saincheist a chruthú toisc go bhfuil úinéir an stórais bac ort. +issues.edit.already_changed=Ní féidir athruithe a shábháil ar an tsaincheist. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint +issues.edit.blocked_user=Ní féidir ábhar a chur in eagar toisc go bhfuil an póstaer nó úinéir an stórais bac ort. +issues.choose.get_started=Faigh Tosaigh +issues.choose.open_external_link=Oscailte +issues.choose.blank=Réamhshocrú +issues.choose.blank_about=Cruthaigh saincheist ó theimpléad réamhshocraithe. +issues.choose.ignore_invalid_templates=Rinneadh neamhaird ar theimpléid +issues.choose.invalid_templates=%v teimpléad neamhbhail(í) aimsíodh +issues.choose.invalid_config=Tá earráidí sa chumraíocht eisiúint: +issues.no_ref=Níl aon Brainse/Clib Sonraithe +issues.create=Cruthaigh Saincheist +issues.new_label=Lipéad Nua +issues.new_label_placeholder=Ainm lipéad +issues.new_label_desc_placeholder=Cur síos +issues.create_label=Cruthaigh Lipéad +issues.label_templates.title=Luchtaigh sraith réamhshainithe lipéid +issues.label_templates.info=Níl aon lipéid ann fós. Cruthaigh lipéad le 'Lipéad Nua' nó bain úsáid as tacar lipéad réamhshainithe: +issues.label_templates.helper=Roghnaigh tacar lipéad +issues.label_templates.use=Úsáid Sraith Lipéad +issues.label_templates.fail_to_load_file=Theip ar lódáil an chomhaid teimpléid lipéid "%s": %v +issues.add_label=cuireadh an lipéad %s %s leis +issues.add_labels=cuireadh na %s lipéid %s +issues.remove_label=bainte an %s lipéad %s +issues.remove_labels=bainte na %s lipéid %s +issues.add_remove_labels=chuir %s leis agus bhain %s lipéid %s +issues.add_milestone_at=`chuir seo leis an gcloch mhíle %s %s` +issues.add_project_at=`chuir seo leis an tionscadal %s %s` +issues.move_to_column_of_project=`aistrigh sé seo chuig %s i %s ar %s` +issues.change_milestone_at=`mionathraithe an chloch mhíle ó %s go %s %s` +issues.change_project_at=`mionathraithe an tionscadal ó %s go %s %s` +issues.remove_milestone_at=` bhain seo den %schloch mhíle %s` +issues.remove_project_at=`bhain sé seo den %san tionscadal %s` +issues.deleted_milestone=`(scriosta)` +issues.deleted_project=`(scriosta)` +issues.self_assign_at=`féin-shannta an %s seo` +issues.add_assignee_at=`a shannadh ag %s %s` +issues.remove_assignee_at=`a bhí gan shannadh ag %s %s` +issues.remove_self_assignment=`bhain siad a sannadh %s` +issues.change_title_at=`athraigh an teideal ó %s go %s %s` +issues.change_ref_at=`tagairt athraithe ó %s go %s %s` +issues.remove_ref_at=`bhaint an tagairt %s %s` +issues.add_ref_at=`Cuireadh an tagairt %s %s leis` +issues.delete_branch_at=`brainse scriosta %s %s` issues.filter_label=Lipéad +issues.filter_label_exclude=`Úsáid alt + cliceáil/iontráil chun lipéid a eisiamh` +issues.filter_label_no_select=Gach lipéad +issues.filter_label_select_no_label=Gan lipéad issues.filter_milestone=Cloch Mhíle +issues.filter_milestone_all=Gach cloch mhíle +issues.filter_milestone_none=Gan aon clocha mhíle +issues.filter_milestone_open=Clocha mhíle oscailte +issues.filter_milestone_closed=Clocha mhíle dúnta issues.filter_project=Tionscadal +issues.filter_project_all=Gach tionscadal +issues.filter_project_none=Gan aon tionscadal issues.filter_assignee=Sannaitheoir +issues.filter_assginee_no_select=Gach sannaithe +issues.filter_assginee_no_assignee=Gan sannaitheoir +issues.filter_poster=Údar +issues.filter_poster_no_select=Gach údair +issues.filter_type=Cineál +issues.filter_type.all_issues=Gach saincheist +issues.filter_type.assigned_to_you=Sannta duit +issues.filter_type.created_by_you=Cruthaithe agat +issues.filter_type.mentioning_you=Ag tagairt duit +issues.filter_type.review_requested=Athbhreithniú iarrtha +issues.filter_type.reviewed_by_you=Athbhreithnithe agat +issues.filter_sort=Sórtáil +issues.filter_sort.latest=Is nuaí +issues.filter_sort.oldest=Is sine +issues.filter_sort.recentupdate=Nuashonraithe le déanaí +issues.filter_sort.leastupdate=Is lú a nuashonraíodh le déanaí +issues.filter_sort.mostcomment=Is mó a bhfuil tráchtanna air +issues.filter_sort.leastcomment=Is lú a bhfuil tráchtanna air +issues.filter_sort.nearduedate=An dáta dlite is gaire +issues.filter_sort.farduedate=An dáta dlite is faide +issues.filter_sort.moststars=An líon réaltaí is mó +issues.filter_sort.feweststars=An líon réaltaí is lú +issues.filter_sort.mostforks=An líon forcanna is mó +issues.filter_sort.fewestforks=An líon forcanna is lú +issues.action_open=Oscailte +issues.action_close=Dún issues.action_label=Lipéad issues.action_milestone=Cloch Mhíle +issues.action_milestone_no_select=Gan Chloch Mhíle issues.action_assignee=Sannaitheoir +issues.action_assignee_no_select=Gan sannaitheoir +issues.action_check=Seiceáil/Dísheiceáil +issues.action_check_all=Seiceáil/Dísheiceáil gach mireanna +issues.opened_by=oscail %[1]s le %[3]s +pulls.merged_by=le %[3]s cumasc %[1]s +pulls.merged_by_fake=le %[2]s a chumasc %[1]s +issues.closed_by=le dúnadh %[3]s %[1]s +issues.opened_by_fake=oscail %[1]s le %[2]s +issues.closed_by_fake=faoi ​​%[2]s dúnadh %[1]s +issues.previous=Roimhe Seo +issues.next=Ar Aghaidh +issues.open_title=Oscailte +issues.closed_title=Dúnta +issues.draft_title=Dréacht +issues.num_comments_1=%d trácht +issues.num_comments=%d tráchtanna +issues.commented_at=`trácht %s ` +issues.delete_comment_confirm=An bhfuil tú cinnte gur mhaith leat an trácht seo a scriosadh? +issues.context.copy_link=Cóipeáil Nasc +issues.context.quote_reply=Luaigh Freagra +issues.context.reference_issue=Tagairt in Eagrán Nua +issues.context.edit=Cuir in eagar +issues.context.delete=Scrios +issues.no_content=Níl aon tuairisc ar fáil. +issues.close=Dún Eagrán +issues.comment_pull_merged_at=cumasc tiomantas %[1]s le %[2]s %[3]s +issues.comment_manually_pull_merged_at=cumasc tiomantas %[1]s le %[2]s %[3]s +issues.close_comment_issue=Dún le trácht +issues.reopen_issue=Athoscail +issues.reopen_comment_issue=Athoscail le trácht +issues.create_comment=Trácht +issues.comment.blocked_user=Ní féidir trácht a chruthú nó a chur in eagar toisc go bhfuil an tráchtaire nó úinéir an stórais bac ort. +issues.closed_at=`dhún an cheist seo %[2]s` +issues.reopened_at=`athoscail an t-eagrán seo %[2]s` +issues.commit_ref_at=`rinne tagairt don cheist seo ó ghealltanas %[2]s` +issues.ref_issue_from=`rinne dagairt don cheist seo %[4]s %[2]s` +issues.ref_pull_from=`rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s` +issues.ref_closing_from=`rinne dagairt d'iarratas tarraingthe %[4]s a dhúnfaidh an cheist seo %[2]s` +issues.ref_reopening_from=`rinne dagairt d'iarratas tarraingthe %[4]s a athosclóidh an cheist seo %[2]s` +issues.ref_closed_from=`dhún an cheist seo %[4]s %[2]s` +issues.ref_reopened_from=`d'athoscail an eagrán seo %[4]s %[2]s` +issues.ref_from=`ó %[1]s` +issues.author=Údar +issues.author_helper=Is é an t-úsáideoir seo an t-údar. +issues.role.owner=Úinéir +issues.role.owner_helper=Is é an t-úsáideoir seo úinéir an stór seo. +issues.role.member=Comhalta +issues.role.member_helper=Is ball den eagraíocht é an t-úsáideoir seo a bhfuil an stór seo ina úinéireacht. +issues.role.collaborator=Comhoibritheoir +issues.role.collaborator_helper=Tugadh cuireadh don úsáideoir seo comhoibriú ar an stóras. +issues.role.first_time_contributor=Cuiditheoir den chéad uair +issues.role.first_time_contributor_helper=Seo é an chéad uair a chuir an t-úsáideoir seo leis an stóras. +issues.role.contributor=Cuiditheoir +issues.role.contributor_helper=Tá an t-úsáideoir seo tiomanta don stóras roimhe seo. +issues.re_request_review=Athiarraigh athbhreithniú +issues.is_stale=Rinneadh athruithe ar an PR seo ón athbhreithniú seo +issues.remove_request_review=Bain iarratas athbhreithni +issues.remove_request_review_block=Ní féidir iarratas athbhreithnithe a bhaint +issues.dismiss_review=Díbhe Athbhreithnithe +issues.dismiss_review_warning=An bhfuil tú cinnte gur mhaith leat an athbhreithnithe seo a dhíbhe? +issues.sign_in_require_desc=Sínigh isteach chun dul isteach sa chomhrá seo. +issues.edit=Cuir in eagar +issues.cancel=Cealaigh issues.save=Sábháil +issues.label_title=Ainm +issues.label_description=Cur síos +issues.label_color=Dath +issues.label_exclusive=Eisiach +issues.label_archive=Lipéad Cartlann +issues.label_archived_filter=Taispeáin lipéid cartlainne +issues.label_archive_tooltip=Eisiatar lipéid chartlainne de réir réamhshocraithe ó na moltaí nuair a dhéantar cuardach de réir lipéid. +issues.label_exclusive_desc=Ainmnigh an lipéad scope/item chun é a dhéanamh comheisiatach le lipéid scope/ eile. +issues.label_exclusive_warning=Bainfear aon lipéid scóipe contrártha le linn eagarthóireacht a dhéanamh ar lipéid iarratais eisiúna nó tarraingthe. +issues.label_count=%d lipéid +issues.label_open_issues=%d saincheisteanna oscailte/iarratais tarraing +issues.label_edit=Cuir in eagar +issues.label_delete=Scrios +issues.label_modify=Cuir Lipéad in Eagar +issues.label_deletion=Scrios Lipéad +issues.label_deletion_desc=Baineann lipéad a scriosadh é ó gach saincheist. Lean ar aghaidh? +issues.label_deletion_success=Tá an lipéad scriosta. +issues.label.filter_sort.alphabetically=Aibítreach +issues.label.filter_sort.reverse_alphabetically=Aisiompú in ord aibítre +issues.label.filter_sort.by_size=Méid is lú +issues.label.filter_sort.reverse_by_size=Méid is mó +issues.num_participants=%d Rannpháirtithe +issues.attachment.open_tab=`Cliceáil chun "%s" a fheiceáil i gcluaisín nua` +issues.attachment.download=`Cliceáil chun "%s" a íoslódáil +issues.subscribe=Liostáil +issues.unsubscribe=Díliostáil +issues.unpin_issue=Bain pionna an t-eagrán +issues.max_pinned=Ní féidir leat níos mó saincheisteanna a phionadh +issues.pin_comment=phionnáil an %s seo +issues.unpin_comment=bain pionna an %s seo +issues.lock=Cuir glas ar an gcomhrá +issues.unlock=Díghlasáil comhrá +issues.lock.unknown_reason=Ní féidir fadhb a ghlasáil le cúis anaithnid. +issues.lock_duplicate=Ní féidir saincheist a ghlasáil faoi dhó. +issues.unlock_error=Ní féidir saincheist nach bhfuil glasáilte a dhíghlasáil. +issues.lock_with_reason=curtha ar ceal mar %s agus comhrá teoranta do chomhoibrithe %s +issues.lock_no_reason=comhrá faoi ghlas agus teoranta do chomhoibrithe %s +issues.unlock_comment=an comhrá seo a dhíghlasáil %s +issues.lock_confirm=Glas +issues.unlock_confirm=Díghlasáil +issues.lock.notice_1=- Ní féidir le húsáideoirí eile tuairimí nua a chur leis an gceist seo. +issues.lock.notice_2=- Is féidir leatsa agus le comhoibrithe eile a bhfuil rochtain acu ar an stór seo fós tuairimí a fhágáil a fheiceann daoine eile. +issues.lock.notice_3=- Is féidir leat an tsaincheist seo a dhíghlasáil arís sa todhchaí. +issues.unlock.notice_1=- Bheadh gach duine in ann trácht a dhéanamh ar an gceist seo arís. +issues.unlock.notice_2=- Is féidir leat an tsaincheist seo a ghlasáil arís sa todhchaí i gcónaí. +issues.lock.reason=Cúis le glasáil +issues.lock.title=Glas comhrá ar an gceist seo. +issues.unlock.title=Díghlasáil comhrá ar an gceist seo. +issues.comment_on_locked=Ní féidir leat trácht a dhéanamh ar shaincheist faoi ghlas. +issues.delete=Scrios +issues.delete.title=Scrios an t-eagrán seo? pulls.tab_commits=Tiomáintí @@ -1274,6 +1670,8 @@ pulls.tab_commits=Tiomáintí +milestones.open=Oscailte +milestones.close=Dún @@ -1281,18 +1679,26 @@ wiki=Wiki wiki.page=Leathanach wiki.new_page=Leathanach +activity.closed_issue_label=Dúnta +activity.new_issues_count_1=Eagrán Nua +activity.unresolved_conv_label=Oscailte contributors.contribution_type.commits=Tiomáintí settings.githooks=Crúcanna Git +settings.projects_mode_all=Gach tionscadal +settings.trust_model.collaborator=Comhoibritheoir settings.trust_model.collaborator.long=Comhoibritheoir: Sínithe muinín ag comhoibrithe settings.trust_model.collaboratorcommitter.long=Comhoibritheo+Coiteoir: Sínithe iontaobhais ag comhoibritheoirí a mheaitseann leis an gealltóir +settings.slack_color=Dath settings.event_fork=Forc settings.event_wiki=Wiki +settings.event_release=Scaoileadh +branch.branch_already_exists=Tá brainse "%s" ann cheana féin sa stóras seo. @@ -1338,6 +1744,7 @@ dashboard.sync_repo_licenses=Sioncronaigh ceadúnais repo +notices.operations=Oibríochtaí [action] @@ -1371,4 +1778,5 @@ runs.commit=Tiomantas [git.filemode] ; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +symbolic_link=Nasc siombalach From 66923e02d20e9d5b68ab20fbcdebd779eb4dbaf9 Mon Sep 17 00:00:00 2001 From: Zisu Zhang Date: Sun, 6 Oct 2024 04:41:38 +0800 Subject: [PATCH 08/41] Enhance USER_DISABLED_FEATURES to allow disabling change username or full name (#31959) Fix #31958 Enhanced `USER_DISABLED_FEATURES`(also `EXTERNAL_USER_DISABLE_FEATURES`) option in `[admin]` section. Added following values: - `change_username`: Disable change username - `change_full_name`: Disable change full name --- Progress: - [x] Update code - [x] Update translations --- custom/conf/app.example.ini | 2 ++ modules/setting/admin.go | 2 ++ options/locale/locale_en-US.ini | 5 ++++- routers/web/user/setting/profile.go | 16 +++++++++++++++- templates/user/settings/profile.tmpl | 9 ++++++--- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 69d541ff8d40..7c7a43944f09 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1507,6 +1507,8 @@ LEVEL = Info ;; - manage_gpg_keys: a user cannot configure gpg keys ;; - manage_mfa: a user cannot configure mfa devices ;; - manage_credentials: a user cannot configure emails, passwords, or openid +;; - change_username: a user cannot change their username +;; - change_full_name: a user cannot change their full name ;;EXTERNAL_USER_DISABLE_FEATURES = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/modules/setting/admin.go b/modules/setting/admin.go index ca4e9b1d5835..fde291ade94a 100644 --- a/modules/setting/admin.go +++ b/modules/setting/admin.go @@ -29,4 +29,6 @@ const ( UserFeatureManageGPGKeys = "manage_gpg_keys" UserFeatureManageMFA = "manage_mfa" UserFeatureManageCredentials = "manage_credentials" + UserFeatureChangeUsername = "change_username" + UserFeatureChangeFullName = "change_full_name" ) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index e3b17f9a04f2..a02d939b79ed 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -580,6 +580,8 @@ lang_select_error = Select a language from the list. username_been_taken = The username is already taken. username_change_not_local_user = Non-local users are not allowed to change their username. +change_username_disabled = Changing username is disabled. +change_full_name_disabled = Changing full name is disabled. username_has_not_been_changed = Username has not been changed repo_name_been_taken = The repository name is already used. repository_force_private = Force Private is enabled: private repositories cannot be made public. @@ -705,7 +707,8 @@ public_profile = Public Profile biography_placeholder = Tell us a little bit about yourself! (You can use Markdown) location_placeholder = Share your approximate location with others profile_desc = Control how your profile is show to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations. -password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details. +password_username_disabled = You are not allowed to change their username. Please contact your site administrator for more details. +password_full_name_disabled = You are not allowed to change their full name. Please contact your site administrator for more details. full_name = Full Name website = Website location = Location diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 554f6cd6ce3f..3b051c9b5f4b 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -69,6 +69,11 @@ func ProfilePost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.UpdateProfileForm) if form.Name != "" { + if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureChangeUsername) { + ctx.Flash.Error(ctx.Tr("user.form.change_username_disabled")) + ctx.Redirect(setting.AppSubURL + "/user/settings") + return + } if err := user_service.RenameUser(ctx, ctx.Doer, form.Name); err != nil { switch { case user_model.IsErrUserIsNotLocal(err): @@ -91,7 +96,6 @@ func ProfilePost(ctx *context.Context) { } opts := &user_service.UpdateOptions{ - FullName: optional.Some(form.FullName), KeepEmailPrivate: optional.Some(form.KeepEmailPrivate), Description: optional.Some(form.Description), Website: optional.Some(form.Website), @@ -99,6 +103,16 @@ func ProfilePost(ctx *context.Context) { Visibility: optional.Some(form.Visibility), KeepActivityPrivate: optional.Some(form.KeepActivityPrivate), } + + if form.FullName != "" { + if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureChangeFullName) { + ctx.Flash.Error(ctx.Tr("user.form.change_full_name_disabled")) + ctx.Redirect(setting.AppSubURL + "/user/settings") + return + } + opts.FullName = optional.Some(form.FullName) + } + if err := user_service.UpdateUser(ctx, ctx.Doer, opts); err != nil { ctx.ServerError("UpdateUser", err) return diff --git a/templates/user/settings/profile.tmpl b/templates/user/settings/profile.tmpl index aaaf8f30db6d..9c7e2de21832 100644 --- a/templates/user/settings/profile.tmpl +++ b/templates/user/settings/profile.tmpl @@ -12,14 +12,17 @@ {{ctx.Locale.Tr "settings.change_username_prompt"}} {{ctx.Locale.Tr "settings.change_username_redirect_prompt"}} - - {{if or (not .SignedUser.IsLocal) .IsReverseProxy}} + + {{if or (not .SignedUser.IsLocal) ($.UserDisabledFeatures.Contains "change_username") .IsReverseProxy}}

{{ctx.Locale.Tr "settings.password_username_disabled"}}

{{end}}
- + + {{if ($.UserDisabledFeatures.Contains "change_full_name")}} +

{{ctx.Locale.Tr "settings.password_full_name_disabled"}}

+ {{end}}
From 479c31bb4df2bad155035ad6706d830f874e533b Mon Sep 17 00:00:00 2001 From: Yarden Shoham Date: Sat, 5 Oct 2024 23:52:30 +0300 Subject: [PATCH 09/41] Upgrade htmx to 2.0.3 (#32192) Release notes: https://github.com/bigskysoftware/htmx/releases/tag/v2.0.3 Tested `Star`, `Watch`, and the admin dashboard page. All functionality remains unchanged. Signed-off-by: Yarden Shoham --- package-lock.json | 9 ++++----- package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0e83b60ec24..ca001b293930 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "esbuild-loader": "4.2.2", "escape-goat": "4.0.0", "fast-glob": "3.3.2", - "htmx.org": "2.0.2", + "htmx.org": "2.0.3", "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.11", @@ -10548,10 +10548,9 @@ } }, "node_modules/htmx.org": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-2.0.2.tgz", - "integrity": "sha512-eUPIpQaWKKstX393XNCRCMJTrqPzikh36Y9RceqsUZLTtlFjFaVDgwZLUsrFk8J2uzZxkkfiy0TE359j2eN6hA==", - "license": "0BSD" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-2.0.3.tgz", + "integrity": "sha512-AeoJUAjkCVVajbfKX+3sVQBTCt8Ct4lif1T+z/tptTXo8+8yyq3QIMQQe/IT+R8ssfrO1I0DeX4CAronzCL6oA==" }, "node_modules/human-signals": { "version": "5.0.0", diff --git a/package.json b/package.json index d188e99a30d8..015dfc67a689 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "esbuild-loader": "4.2.2", "escape-goat": "4.0.0", "fast-glob": "3.3.2", - "htmx.org": "2.0.2", + "htmx.org": "2.0.3", "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.11", From e53056866674691864c4dfdddb3dfc629a06cbba Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 6 Oct 2024 00:34:29 +0000 Subject: [PATCH 10/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_cs-CZ.ini | 1 - options/locale/locale_de-DE.ini | 1 - options/locale/locale_el-GR.ini | 1 - options/locale/locale_es-ES.ini | 1 - options/locale/locale_fa-IR.ini | 1 - options/locale/locale_fi-FI.ini | 1 - options/locale/locale_fr-FR.ini | 1 - options/locale/locale_ga-IE.ini | 482 ++++++++++++++++++++++++++++++-- options/locale/locale_hu-HU.ini | 1 - options/locale/locale_id-ID.ini | 1 - options/locale/locale_is-IS.ini | 1 - options/locale/locale_it-IT.ini | 1 - options/locale/locale_ja-JP.ini | 3 +- 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_pt-PT.ini | 1 - options/locale/locale_ru-RU.ini | 1 - options/locale/locale_si-LK.ini | 1 - options/locale/locale_sk-SK.ini | 1 - options/locale/locale_sv-SE.ini | 1 - options/locale/locale_tr-TR.ini | 1 - options/locale/locale_uk-UA.ini | 1 - options/locale/locale_zh-CN.ini | 1 - options/locale/locale_zh-TW.ini | 1 - 27 files changed, 464 insertions(+), 46 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 07cbfe2c8f93..2bf2a968807b 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -689,7 +689,6 @@ public_profile=Veřejný profil biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown) location_placeholder=Sdílejte svou přibližnou polohu s ostatními profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git. -password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů. full_name=Celé jméno website=Web location=Místo diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 7512c5410152..4f011663e883 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -683,7 +683,6 @@ public_profile=Öffentliches Profil biography_placeholder=Erzähle uns ein wenig über Dich selbst! (Du kannst Markdown verwenden) location_placeholder=Teile Deinen ungefähren Standort mit anderen profile_desc=Lege fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet. -password_username_disabled=Benutzer, die nicht von Gitea verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details. full_name=Vollständiger Name website=Webseite location=Standort diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 48610abb34e1..8a82d9353a30 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -620,7 +620,6 @@ public_profile=Δημόσιο Προφίλ biography_placeholder=Πείτε μας λίγο για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown) location_placeholder=Μοιραστείτε την κατά προσέγγιση τοποθεσία σας με άλλους profile_desc=Ελέγξτε πώς εμφανίζεται το προφίλ σας σε άλλους χρήστες. Η κύρια διεύθυνση email σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση κωδικού πρόσβασης και λειτουργίες Git που βασίζονται στο web. -password_username_disabled=Οι μη τοπικοί χρήστες δεν επιτρέπεται να αλλάξουν το όνομα χρήστη τους. Επικοινωνήστε με το διαχειριστή σας για περισσότερες λεπτομέρειες. full_name=Πλήρες Όνομα website=Ιστοσελίδα location=Τοποθεσία diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 7d637f3d3ab3..423f74f8b206 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -617,7 +617,6 @@ public_profile=Perfil público biography_placeholder=¡Cuéntanos un poco sobre ti mismo! (Puedes usar Markdown) location_placeholder=Comparte tu ubicación aproximada con otros profile_desc=Controla cómo se muestra su perfil a otros usuarios. Tu dirección de correo electrónico principal se utilizará para notificaciones, recuperación de contraseña y operaciones de Git basadas en la web. -password_username_disabled=Usuarios no locales no tienen permitido cambiar su nombre de usuario. Por favor, contacta con el administrador del sistema para más detalles. full_name=Nombre completo website=Página web location=Localización diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 38fb70dae021..33d72ee7eb7f 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -491,7 +491,6 @@ account_link=حساب‌های مرتبط organization=سازمان ها public_profile=نمایه عمومی -password_username_disabled=حساب‌های غیر محلی مجاز به تغییر نام کاربری نیستند. لطفا با مدیر سایت در ارتباط باشید. full_name=نام کامل website=تارنما location=موقعیت مکانی diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 200e104f46b1..d16efb8834d3 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -451,7 +451,6 @@ account_link=Linkitetyt tilit organization=Organisaatiot public_profile=Julkinen profiili -password_username_disabled=Ei-paikalliset käyttäjät eivät voi muuttaa käyttäjätunnustaan. Ole hyvä ja ota yhteyttä sivuston ylläpitäjään saadaksesi lisätietoa. full_name=Kokonimi website=Nettisivut location=Sijainti diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 1ce04640e345..e64c85b7a4e5 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -705,7 +705,6 @@ public_profile=Profil public biography_placeholder=Parlez-nous un peu de vous ! (Vous pouvez utiliser Markdown) location_placeholder=Partagez votre position approximative avec d'autres personnes profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web. -password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails. full_name=Nom complet website=Site Web location=Localisation diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 826ac0accef4..23e0839530e0 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -705,7 +705,6 @@ public_profile=Próifíl Phoiblí biography_placeholder=Inis dúinn beagán fút féin! (Is féidir leat Markdown a úsáid) location_placeholder=Comhroinn do shuíomh thart le daoine eile profile_desc=Rialú conas a thaispeánfar do phróifíl d'úsáideoirí eile. Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocail agus oibríochtaí Git gréasán-bhunaithe. -password_username_disabled=Ní cheadaítear d'úsáideoirí neamháitiúla a n-ainm úsáideora a athrú. Déan teagmháil le do riarthóir láithreáin le haghaidh tuilleadh sonraí full_name=Ainm Iomlán website=Láithreán Gréasáin location=Suíomh @@ -1657,45 +1656,488 @@ issues.unlock.title=Díghlasáil comhrá ar an gceist seo. issues.comment_on_locked=Ní féidir leat trácht a dhéanamh ar shaincheist faoi ghlas. issues.delete=Scrios issues.delete.title=Scrios an t-eagrán seo? - - +issues.delete.text=An bhfuil tú cinnte gur mhaith leat an cheist seo a scriosadh? (Bainfidh sé seo an t-inneachar go léir go buan. Smaoinigh ar é a dhúnadh ina ionad sin, má tá sé i gceist agat é a choinneáil i gcartlann) +issues.tracker=Rianaitheoir Ama +issues.start_tracking_short=Tosaigh Uaineoir +issues.start_tracking=Rianú Am Tosaigh +issues.start_tracking_history=`thosaigh sé ag obair %s` +issues.tracker_auto_close=Stopfar ama go huathoibríoch nuair a dhúnfar an tsaincheist seo +issues.tracking_already_started=`Tá tús curtha agat cheana féin ag rianú ama ar eagrán eile!` +issues.stop_tracking=Stop Uaineadóir +issues.stop_tracking_history=`stop sé ag obair %s` +issues.cancel_tracking=Caith amach +issues.cancel_tracking_history=`rianú ama curtha ar ceal %s` +issues.add_time=Láimh Cuir Am leis +issues.del_time=Scrios an log ama seo +issues.add_time_short=Cuir Am leis +issues.add_time_cancel=Cealaigh +issues.add_time_history=`am caite curtha leis %s` +issues.del_time_history=`an t-am caite scriosta %s` +issues.add_time_hours=Uaireanta +issues.add_time_minutes=Miontuairi +issues.add_time_sum_to_small=Níor iontráilíodh aon am. +issues.time_spent_total=An t-am iomlán a chaitear +issues.time_spent_from_all_authors=`Am Iomlán Caitear: %s` +issues.due_date=Dáta dlite +issues.invalid_due_date_format=Ní mór 'bbbb-mm-ll' a bheith i bhformáid an dáta dlite. +issues.error_modifying_due_date=Theip ar an dáta dlite a mhodhnú. +issues.error_removing_due_date=Theip ar an dáta dlite a bhaint. +issues.push_commit_1=Cuir %d gealltanas %s leis +issues.push_commits_n=cuireadh %d tiomantas %s leis +issues.force_push_codes=`bhrú i bhfeidhm %[1]s ó %[2]s go %[4]s %[6]s` +issues.force_push_compare=Déan comparáid +issues.due_date_form=bbbb-mm-ll +issues.due_date_form_add=Cuir dáta dlite leis +issues.due_date_form_edit=Cuir in eagar +issues.due_date_form_remove=Bain +issues.due_date_not_writer=Ní mór duit rochtain scríofa ar an stór seo d'fhonn dáta dlite eisiúna a nuashonrú. +issues.due_date_not_set=Níl aon dáta dlite socraithe. +issues.due_date_added=cuireadh an dáta dlite %s %s +issues.due_date_modified=d'athraigh an dáta dlite ó %[2]s go %[1]s %[3]s +issues.due_date_remove=bainte an dáta dlite %s %s +issues.due_date_overdue=Thar téarma +issues.due_date_invalid=Tá an dáta dlite neamhbhailí nó lasmuigh den raon. Úsáid an fhormáid 'bbbb-mm-ll' le do thoil. +issues.dependency.title=Spleithiúlachtaí +issues.dependency.issue_no_dependencies=Níl aon spleáchais leagtha síos. +issues.dependency.pr_no_dependencies=Níl aon spleáchais leagtha síos. +issues.dependency.no_permission_1=Níl cead agat spleáchas %d a léamh +issues.dependency.no_permission_n=Níl cead agat spleáchais %d a léamh +issues.dependency.no_permission.can_remove=Níl cead agat an spleáchas seo a léamh ach is féidir leis an spleáchas seo a bhaint +issues.dependency.add=Cuir spleáchas leis… +issues.dependency.cancel=Cealaigh +issues.dependency.remove=Bain +issues.dependency.remove_info=Bain an spleáchas seo +issues.dependency.added_dependency=`cuireadh spleáchas nua %s` +issues.dependency.removed_dependency=`bainte spleáchas %s` +issues.dependency.pr_closing_blockedby=Cuireann na saincheisteanna seo a leanas bac ar an iarratas tarraingte seo a dhúnadh +issues.dependency.issue_closing_blockedby=Tá na saincheisteanna seo a leanas bac ar dhúnadh an cheist seo +issues.dependency.issue_close_blocks=Cuireann an tsaincheist seo bac ar dhúnadh na saincheisteanna +issues.dependency.pr_close_blocks=Cuireann an iarratas tarraingthe seo bac ar dhúnadh na saincheisteanna +issues.dependency.issue_close_blocked=Ní mór duit gach saincheist a chuireann bac ar an gceist seo a dhúnadh sular féidir leat é a dhúnadh. +issues.dependency.issue_batch_close_blocked=Ní féidir saincheisteanna a roghnaíonn tú a dhúnadh, toisc go bhfuil spleáchais oscailte fós ag eisiúint #%d +issues.dependency.pr_close_blocked=Ní mór duit gach saincheist a bhlocálann an iarratas tarraingthe seo a dhúnadh sula féidir leat é a chumasc. +issues.dependency.blocks_short=Bloic +issues.dependency.blocked_by_short=Ag brath ar +issues.dependency.remove_header=Bain spleáchas +issues.dependency.issue_remove_text=Bainfidh sé seo an spleáchas ón gceist seo. Lean ar aghaidh? +issues.dependency.pr_remove_text=Bainfidh sé seo an spleáchas ón iarratas tarraingthe seo. Lean ar aghaidh? +issues.dependency.setting=Cumasaigh spleáchais le haghaidh Saincheisteanna agus Iarrataí Tar +issues.dependency.add_error_same_issue=Ní féidir leat ceist a dhéanamh ag brath air féin. +issues.dependency.add_error_dep_issue_not_exist=Níl saincheist spleách ann. +issues.dependency.add_error_dep_not_exist=Ní bhíonn spleáchas ann. +issues.dependency.add_error_dep_exists=Tá spleáchas ann cheana féin. +issues.dependency.add_error_cannot_create_circular=Ní féidir leat spleáchas a chruthú le dhá shaincheist a chuireann bac ar a chéile. +issues.dependency.add_error_dep_not_same_repo=Caithfidh an dá shaincheist a bheith sa stór céanna. +issues.review.self.approval=Ní féidir leat d'iarratas tarraingthe féin a cheadú. +issues.review.self.rejection=Ní féidir leat athruithe a iarraidh ar d'iarratas tarraingthe féin. +issues.review.approve=ceadaigh na hathruithe seo %s +issues.review.comment=athbhreithnithe %s +issues.review.dismissed=dhiúltaigh athbhreithniú %s ó %s +issues.review.dismissed_label=Dhiúltaigh +issues.review.left_comment=d'fhág trácht +issues.review.content.empty=Ní mór duit trácht a fhágáil a léiríonn an t-athrú (í) iarrtha. +issues.review.reject=athruithe iarrtha %s +issues.review.wait=iarradh athbhreithniú %s +issues.review.add_review_request=athbhreithniú iarrtha ó %s %s +issues.review.remove_review_request=iarratas athbhreithnithe bainte le haghaidh %s %s +issues.review.remove_review_request_self=dhiúltaigh %s a athbhreithniú +issues.review.pending=Ar feitheamh +issues.review.pending.tooltip=Níl an nóta tráchta seo le feiceáil ag úsáideoirí eile faoi láthair. Chun do thuairimí ar feitheamh a chur isteach, roghnaigh "%s" -> "%s/%s/%s" ag barr an leathanaigh. +issues.review.review=Léirmheas +issues.review.reviewers=Léirmheasóirí +issues.review.outdated=As dáta +issues.review.outdated_description=Tá athrú tagtha ar ábhar ó rinneadh an trácht seo +issues.review.option.show_outdated_comments=Taispeáin tráchtanna atá as dáta +issues.review.option.hide_outdated_comments=Folaigh tráchtanna atá as dáta +issues.review.show_outdated=Taispeáin as dáta +issues.review.hide_outdated=Folaigh as dáta +issues.review.show_resolved=Taispeáin réitithe +issues.review.hide_resolved=Folaigh réitithe +issues.review.resolve_conversation=Réitigh comhrá +issues.review.un_resolve_conversation=Comhrá gan réiteach +issues.review.resolved_by=mharcáil an comhrá seo mar réitigh +issues.review.commented=Trácht +issues.review.official=Ceadaithe +issues.review.requested=Athbhreithniú ar feitheamh +issues.review.rejected=Athruithe iarrtha +issues.review.stale=Nuashonraithe ó faomhadh +issues.review.unofficial=Ceadú gan áireamh +issues.assignee.error=Níor cuireadh gach sannaí leis mar gheall ar earráid gan choinne. +issues.reference_issue.body=Comhlacht +issues.content_history.deleted=scriosta +issues.content_history.edited=curtha in eagar +issues.content_history.created=cruthaithe +issues.content_history.delete_from_history=Scrios ón stair +issues.content_history.delete_from_history_confirm=Scrios ón stair? +issues.content_history.options=Roghanna +issues.reference_link=Tagairt: %s + +compare.compare_base=bonn +compare.compare_head=déan comparáid + +pulls.desc=Cumasaigh iarratais tarraingthe agus athbhreithnithe cód. +pulls.new=Iarratas Tarraingthe Nua +pulls.new.blocked_user=Ní féidir iarratas tarraingthe a chruthú toisc go bhfuil úinéir an stórais bac ort. +pulls.new.must_collaborator=Caithfidh tú a bheith ina chomhoibritheoir chun iarratas tarraingthe a chruthú. +pulls.edit.already_changed=Ní féidir athruithe a shábháil ar an iarratas tarraingthe. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint +pulls.view=Féach ar Iarratas Tarraing +pulls.compare_changes=Iarratas Tarraingthe Nua +pulls.allow_edits_from_maintainers=Ceadaigh eagarthóirí ó chothabhálaí +pulls.allow_edits_from_maintainers_desc=Is féidir le húsáideoirí a bhfuil rochtain scríofa acu ar an mbunbhrainse brú chuig an bhrainse +pulls.allow_edits_from_maintainers_err=Theip ar nuashonrú +pulls.compare_changes_desc=Roghnaigh an brainse le cumasc isteach agus an brainse le tarraingt uaidh. +pulls.has_viewed_file=Breathnaithe +pulls.has_changed_since_last_review=Athraithe ó d'athbhreithniú deire +pulls.viewed_files_label=Breathnaíodh ar %[1]d / %[2]d comhaid +pulls.expand_files=Leathnaigh gach comhaid +pulls.collapse_files=Laghdaigh gach comhaid +pulls.compare_base=cumaisc isteach +pulls.compare_compare=tarraing ó +pulls.switch_comparison_type=Athraigh cineál comparáide +pulls.switch_head_and_base=Athraigh ceann agus bonn +pulls.filter_branch=Brainse scagaire +pulls.show_all_commits=Taispeáin gach gealltanas +pulls.show_changes_since_your_last_review=Taispeáin athruithe ón léirmheas deiridh +pulls.showing_only_single_commit=Ag taispeáint athruithe tiomantais %[1]s amháin +pulls.showing_specified_commit_range=Ag taispeáint athruithe idir %[1]s..%[2]s +pulls.select_commit_hold_shift_for_range=Roghnaigh tiomantas. Coinnigh shift + cliceáil chun raon a roghnú +pulls.review_only_possible_for_full_diff=Ní féidir athbhreithniú a dhéanamh ach amháin nuair a bhreathnaítear ar an difríocht iomlán +pulls.filter_changes_by_commit=Scagaigh de réir tiomantas +pulls.nothing_to_compare=Tá na brainsí seo cothrom. Ní gá iarratas tarraingthe a chruthú. +pulls.nothing_to_compare_have_tag=Tá an brainse/clib roghnaithe cothrom. +pulls.nothing_to_compare_and_allow_empty_pr=Tá na brainsí seo cothrom. Beidh an PR seo folamh. +pulls.has_pull_request=`Tá iarratas tarraingthe idir na brainsí seo ann cheana: %[2]s#%[3]d` +pulls.create=Cruthaigh Iarratas Tarraing +pulls.title_desc=ag iarraidh %[1]d gealltanas a chumasc ó %[2]s go %[3]s +pulls.merged_title_desc=cumasc %[1]d tiomantas ó %[2]s go %[3]s %[4]s +pulls.change_target_branch_at=`athraigh an spriocbhrainse ó %s go %s %s` +pulls.tab_conversation=Comhrá pulls.tab_commits=Tiomáintí - - - - - - - - - - +pulls.tab_files=Comhaid Athraithe +pulls.reopen_to_merge=Athoscail an t-iarratas tarraingthe seo le do thoil chun cumasc a dhéanamh. +pulls.cant_reopen_deleted_branch=Ní féidir an t-iarratas tarraingthe seo a athoscailt toisc gur scriosadh an brainse. +pulls.merged=Cumaiscthe +pulls.merged_success=D'éirigh leis an iarratas tarraingthe a chumasc agus a dhúnadh +pulls.closed=Iarratas tarraingthe dúnta +pulls.manually_merged=Cumaisc de láimh +pulls.merged_info_text=Is féidir an brainse %s a scriosadh anois. +pulls.is_closed=Tá an t-iarratas tarraingthe dúnta. +pulls.title_wip_desc=`Tosaigh an teideal le %s chun an t-iarratas tarraingthe a chosc ó chumasc de thaisme.` +pulls.cannot_merge_work_in_progress=Tá an t-iarratas tarraingthe seo marcáilte mar obair atá ar siúl. +pulls.still_in_progress=Fós ar siúl? +pulls.add_prefix=Cuir réimír %s leis +pulls.remove_prefix=Bain an réimír %s +pulls.data_broken=Tá an t-iarratas tarraingthe seo briste mar gheall ar fhaisnéis forc a bheith in easnamh. +pulls.files_conflicted=Tá athruithe ag an iarratas tarraingthe seo atá contrártha leis an spriocbhrainse. +pulls.is_checking=Tá seiceáil coinbhleachta cumaisc ar siúl. Bain triail eile as i gceann cúpla nóiméad. +pulls.is_ancestor=Tá an brainse seo san áireamh cheana féin sa spriocbhrainse. Níl aon rud le cumasc. +pulls.is_empty=Tá na hathruithe ar an mbrainse seo ar an spriocbhrainse cheana féin. Is tiomantas folamh é seo. +pulls.required_status_check_failed=Níor éirigh le roinnt seiceálacha riachtanacha. +pulls.required_status_check_missing=Tá roinnt seiceanna riachtanacha ar iarraidh. +pulls.required_status_check_administrator=Mar riarthóir, féadfaidh tú an t-iarratas tarraingthe seo a chumasc fós. +pulls.blocked_by_approvals=Níl go leor ceadaithe ag an iarraidh tarraingthe seo fós. Deonaíodh %d den fhaomhadh %d. +pulls.blocked_by_approvals_whitelisted=Níl go leor ceaduithe riachtanacha ag an iarratas tarraingte seo go fóill. %d de %d faomhadh tugtha ó úsáideoirí nó foirne ar an liosta ceadaithe. +pulls.blocked_by_rejection=Tá athruithe ag athbhreithneoir oifigiúil ag an iarratas tarraingthe seo. +pulls.blocked_by_official_review_requests=Tá iarratais ar athbhreithniú oifigiúil ag an iarratas tarraingte seo. +pulls.blocked_by_outdated_branch=Tá bac ar an iarratas tarraingte seo toisc go bhfuil sé as dáta. +pulls.blocked_by_changed_protected_files_1=Cuirtear bac ar an iarratas tarraingthe seo toisc go n-athraíonn sé comhad cosanta: +pulls.blocked_by_changed_protected_files_n=Tá bac ar an iarratas tarraingthe seo toisc go n-athraíonn sé comhaid chosanta: +pulls.can_auto_merge_desc=Is féidir an t-iarratas tarraingt seo a chumasc go huathoibríoch. +pulls.cannot_auto_merge_desc=Ní féidir an t-iarratas tarraingthe seo a chumasc go huathoibríoch mar gheall ar choinbhleachtaí. +pulls.cannot_auto_merge_helper=Cumaisc de láimh chun na coinbhleachtaí a réiteach. +pulls.num_conflicting_files_1=Comhad contrártha %d +pulls.num_conflicting_files_n=%d comhaid contrártha +pulls.approve_count_1=%d ceadú +pulls.approve_count_n=%d faomhadh +pulls.reject_count_1=%d iarratas athraithe +pulls.reject_count_n=%d iarratas ar athrú +pulls.waiting_count_1=%d athbhreithniú feithimh +pulls.waiting_count_n=%d athbhreithnithe feithimh +pulls.wrong_commit_id=caithfidh comhad id a bheith ina id tiomanta ar an spriocbhrainse + +pulls.no_merge_desc=Ní féidir an t-iarratas tarraingthe seo a chumasc toisc go bhfuil gach rogha cumaisc stór díchumasaithe. +pulls.no_merge_helper=Cumasaigh roghanna cumaisc i socruithe an stór nó cumasc an t-iarratas tarraingthe de láimh. +pulls.no_merge_wip=Ní féidir an t-iarratas tarraingthe seo a chumasc toisc go bhfuil sé marcáilte mar obair atá ar siúl é. +pulls.no_merge_not_ready=Níl an t-iarratas tarraingthe seo réidh le cumasc, seiceáil stádas athbhreithnithe agus seiceálacha stádais. +pulls.no_merge_access=Níl tú údaraithe chun an t-iarratas tarraingthe seo a chumasc. +pulls.merge_pull_request=Cruthaigh tiomantas cumaisc +pulls.rebase_merge_pull_request=Athbhunaigh ansin go tapa ar aghaidh +pulls.rebase_merge_commit_pull_request=Rebase ansin cruthaigh tiomantas cumaisc +pulls.squash_merge_pull_request=Cruthaigh tiomantas scuaise +pulls.fast_forward_only_merge_pull_request=Go tapa ar aghaidh amháin +pulls.merge_manually=Cumaisc de láimh +pulls.merge_commit_id=ID an tiomantis cumaisc +pulls.require_signed_wont_sign=Éilíonn an bhrainse tiomáintí shínithe, ach ní shínífear an cumasc seo + +pulls.invalid_merge_option=Ní féidir leat an rogha cumaisc seo a úsáid don iarratas tarraingthe seo. +pulls.merge_conflict=Theip ar Cumaisc: Bhí coinbhleacht ann agus é ag cumasc. Leid: Bain triail as straitéis dhifriúil +pulls.merge_conflict_summary=Teachtaireacht Earráide +pulls.rebase_conflict=Theip ar Chumasc: Bhí coinbhleacht ann agus tiomantas á athbhunú: %[1]s. Leid: Bain triail as straitéis eile +pulls.rebase_conflict_summary=Teachtaireacht Earráide +pulls.unrelated_histories=Theip ar Cumaisc: Ní roinneann an ceann cumaisc agus an bonn stair choiteann. Leid: Bain triail as straitéis dhifriúil +pulls.merge_out_of_date=Theip ar Cumaisc: Agus an cumaisc á ghiniúint, nuashonraíodh an bonn. Leid: Bain triail as arís. +pulls.head_out_of_date=Theip ar Cumaisc: Agus an cumaisc á ghiniúint, nuashonraíodh an ceann. Leid: Bain triail as arís. +pulls.has_merged=Theip ar: Cumaisíodh an t-iarratas tarraingthe, ní féidir leat a chumasc arís nó an spriocbhrainse a athrú. +pulls.push_rejected=Theip ar Brúigh: Diúltaíodh don bhrú. Déan athbhreithniú ar na Git Hooks don stór seo. +pulls.push_rejected_summary=Teachtaireacht Diúltaithe Iomlán +pulls.push_rejected_no_message=Theip ar Brúigh: Diúltaíodh don bhrú ach ní raibh aon teachtaireacht iargúlta ann. Déan athbhreithniú ar Git Hooks don stór seo +pulls.open_unmerged_pull_exists=`Ní féidir leat oibríocht athoscailte a dhéanamh toisc go bhfuil iarratas tarraingthe ar feitheamh (#%d) le hairíonna comhionanna. ` +pulls.status_checking=Tá roinnt seiceála ar feitheamh +pulls.status_checks_success=D'éirigh le gach seiceáil +pulls.status_checks_warning=Thuairiscigh roinnt seiceálacha rabhaidh +pulls.status_checks_failure=Theip ar roinnt seiceálacha +pulls.status_checks_error=Thug roinnt seiceálacha earráidí +pulls.status_checks_requested=Riachtanach +pulls.status_checks_details=Sonraí +pulls.status_checks_hide_all=Folaigh gach seiceáil +pulls.status_checks_show_all=Taispeáin gach seiceáil +pulls.update_branch=Nuashonrú brainse trí chumasc +pulls.update_branch_rebase=Nuashonraigh an bhrainse trí athbhunú +pulls.update_branch_success=Bhí nuashonrú brainse rathúil +pulls.update_not_allowed=Ní cheadaítear duit brainse a nuashonrú +pulls.outdated_with_base_branch=Tá an brainse seo as dáta leis an mbunbhrainse +pulls.close=Dún Iarratas Tarraing +pulls.closed_at=`dhún an t-iarratas tarraingthe seo %[2]s` +pulls.reopened_at=`athoscail an t-iarratas tarraingthe seo %[2]s` +pulls.cmd_instruction_hint=`Féach ar treoracha na líne ordaithe.` +pulls.cmd_instruction_checkout_title=Seiceáil +pulls.cmd_instruction_checkout_desc=Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe. +pulls.cmd_instruction_merge_title=Cumaisc +pulls.cmd_instruction_merge_desc=Cumaisc na hathruithe agus nuashonrú ar Gitea. +pulls.cmd_instruction_merge_warning=Rabhadh: Ní féidir leis an oibríocht seo an t-iarratas tarraingthe a chumasc toisc nach raibh "cumasc láimhe uathoibríoch" cumasaithe +pulls.clear_merge_message=Glan an teachtaireacht chumaisc +pulls.clear_merge_message_hint=Má imrítear an teachtaireacht chumaisc ní bhainfear ach ábhar na teachtaireachta tiomanta agus coimeádfar leantóirí git ginte ar nós "Co-Authored-By …". + +pulls.auto_merge_button_when_succeed=(Nuair a éiríonn le seiceálacha) +pulls.auto_merge_when_succeed=Cumaisc uathoibríoch nuair a éiríonn +pulls.auto_merge_newly_scheduled=Bhí an t-iarratas tarraingt sceidealta le cumasc nuair a éiríonn le gach seiceáil. +pulls.auto_merge_has_pending_schedule=Bhí an t-iarratas tarraingthe seo sceidealaithe ag %[1]s chun cumasc uathoibríoch a dhéanamh nuair a éiríonn le gach seiceáil %[2]s. + +pulls.auto_merge_cancel_schedule=Cealaigh cumasc uathoibríoch +pulls.auto_merge_not_scheduled=Níl an t-iarratas tarraingthe seo sceidealaithe le cumasc go huathoibríoch. +pulls.auto_merge_canceled_schedule=Cealaíodh an cumaisc uathoibríoch don iarratas tarraingthe seo. + +pulls.auto_merge_newly_scheduled_comment=`sceidealta an t-iarratas tarraingthe seo le cumasc uathoibrithe nuair a éiríonn le gach seiceáil %[1]s` +pulls.auto_merge_canceled_schedule_comment=`curtha ar ceal uathchumasc leis an iarratas tarraingthe seo nuair a éiríonn le gach seiceáil %[1]s` + +pulls.delete.title=Scrios an t-iarratas tarraingthe seo? +pulls.delete.text=An bhfuil tú cinnte gur mhaith leat an t-iarratas tarraingthe seo a scriosadh? (Bainfidh sé seo an t-inneachar go léir go buan. Smaoinigh ar é a dhúnadh ina ionad sin, má tá sé i gceist agat é a choinneáil i gcartlann) + +pulls.recently_pushed_new_branches=Bhrúigh tú ar bhrainse %[1]s %[2]s + +pull.deleted_branch=(scriosta): %s +pull.agit_documentation=Déan athbhreithniú ar dhoiciméid faoi AGit + +comments.edit.already_changed=Ní féidir athruithe a shábháil ar an trácht. Dealraíonn sé gur athraigh úsáideoir eile an t-ábhar cheana féin. Athnuachan an leathanach agus déan iarracht eagarthóireacht arís chun a gcuid athruithe a sheachaint + +milestones.new=Cloch Mhíle Nua +milestones.closed=Dúnta %s +milestones.update_ago=Nuashonraithe %s +milestones.no_due_date=Gan dáta dlite milestones.open=Oscailte milestones.close=Dún - - - -wiki=Wiki +milestones.new_subheader=Is féidir le clocha míle cabhrú leat ceisteanna a eagrú agus a ndul chun cinn a rianú. +milestones.completeness=%d%% Críochnaithe +milestones.create=Cruthaigh Cloch Mhíle +milestones.title=Teideal +milestones.desc=Cur síos +milestones.due_date=Dáta dlite (roghnach) +milestones.clear=Glan +milestones.invalid_due_date_format=Caithfidh formáid dáta dlite a bheith 'bbbb-mm-ll'. +milestones.create_success=Cruthaíodh an chloch mhíle "%s". +milestones.edit=Cuir Cloch Mhíle in eagar +milestones.edit_subheader=Eagraíonn Garspriocanna saincheisteanna agus rianaítear dul chun cinn. +milestones.cancel=Cealaigh +milestones.modify=Nuashonraigh Cloch Mhíle +milestones.edit_success=Nuashonraíodh cloch mhíle "%s". +milestones.deletion=Scrios Cloch Mhíle +milestones.deletion_desc=Cuireann scriosadh cloch mhíle é as gach saincheist ghaolmhar. Lean ar aghaidh? +milestones.deletion_success=Tá an chloch mhíle scriosta. +milestones.filter_sort.name=Ainm +milestones.filter_sort.earliest_due_data=An dáta dlite is luaithe +milestones.filter_sort.latest_due_date=An dáta dlite is déanaí +milestones.filter_sort.least_complete=Is lú críochnaithe +milestones.filter_sort.most_complete=Is mó críochnaithe +milestones.filter_sort.most_issues=Saincheisteanna is mó +milestones.filter_sort.least_issues=Saincheisteanna is lú + +signing.will_sign=Síneofar an gealltanas seo le heochair "%s". +signing.wont_sign.error=Bhí earráid ann agus tú ag seiceáil an féidir an tiomantas a shíniú. +signing.wont_sign.nokey=Níl aon eochair ar fáil chun an tiomantas seo a shíniú. +signing.wont_sign.never=Ní shínítear tiomáintí riamh. +signing.wont_sign.always=Sínítear tiomáintí i gcónaí. +signing.wont_sign.pubkey=Ní shíníofar an tiomantas toisc nach bhfuil eochair phoiblí agat a bhaineann le do chuntas. +signing.wont_sign.twofa=Caithfidh fíordheimhniú dhá-fhachtóir a bheith agat chun tiomáintí a shíniú. +signing.wont_sign.parentsigned=Ní shíníofar an tiomantas toisc nach bhfuil an tiomantas tuismitheora sínithe. +signing.wont_sign.basesigned=Ní shínífear an cumasc toisc nach bhfuil an tiomantas bunaithe sínithe. +signing.wont_sign.headsigned=Ní shínífear an cumasc toisc nach bhfuil an tiomantas ceann sínithe. +signing.wont_sign.commitssigned=Ní shínífear an cumasc toisc nach bhfuil na tiomáintí gaolmhara go léir sínithe. +signing.wont_sign.approved=Ní shíníofar an cumaisc toisc nach bhfuil an PR ceadaithe. +signing.wont_sign.not_signed_in=Níl tú sínithe isteach. + +ext_wiki=Rochtain ar Vicí Seachtrach +ext_wiki.desc=Nasc le vicí seachtrach. + +wiki=Vicí +wiki.welcome=Fáilte go dtí an Vicí. +wiki.welcome_desc=Ligeann an vicí duit cáipéisíocht a scríobh agus a roinnt le comhoibrithe. +wiki.desc=Scríobh agus roinn cáipéisíocht le comhoibrithe. +wiki.create_first_page=Cruthaigh an Chéad Leathanach wiki.page=Leathanach +wiki.filter_page=Leathanach scagaire wiki.new_page=Leathanach - +wiki.page_title=Teideal an leathanaigh +wiki.page_content=Ábhar an leathanaigh +wiki.default_commit_message=Scríobh nóta faoin nuashonrú leathanaigh seo (roghnach). +wiki.save_page=Sábháil Leathanach +wiki.last_commit_info=Cuireadh %s an leathanach seo in eagar %s +wiki.edit_page_button=Cuir in eagar +wiki.new_page_button=Leathanach Nua +wiki.file_revision=Athbhreithniú Leathanach +wiki.wiki_page_revisions=Athbhreithnithe Leathanach Vicí +wiki.back_to_wiki=Ar ais go leathanach vicí +wiki.delete_page_button=Scrios Leathanach +wiki.delete_page_notice_1=Ní féidir leathanach vicí "%s" a scriosadh. Lean ort? +wiki.page_already_exists=Tá leathanach vicí leis an ainm céanna ann cheana féin. +wiki.reserved_page=Tá an t-ainm leathanaigh vicí "%s" in áirithe. +wiki.pages=Leathanaigh +wiki.last_updated=Nuashonraithe deireanach %s +wiki.page_name_desc=Cuir isteach ainm don leathanach Vicí seo. Is iad roinnt ainmneacha speisialta: 'Baile', '_Sidebar' agus '_Footer'. +wiki.original_git_entry_tooltip=Féach ar an gcomhad bunaidh Git in ionad nasc cairdiúil a úsáid. + +activity=Gníomhaíocht +activity.navbar.pulse=Cuisle +activity.navbar.code_frequency=Minicíocht Cód +activity.navbar.contributors=Rannpháirtithe +activity.navbar.recent_commits=Tiomáintí le déanaí +activity.period.filter_label=Tréimhse: +activity.period.daily=1 lá +activity.period.halfweekly=3 lá +activity.period.weekly=1 seachtain +activity.period.monthly=1 mhí +activity.period.quarterly=3 mhí +activity.period.semiyearly=6 mhí +activity.period.yearly=1 bhliain +activity.overview=Forbhreathnú +activity.active_prs_count_1=%d Iarratas Tarraingthe Gníomhach +activity.active_prs_count_n=%d Iarratais Tharraing Ghníomhach +activity.merged_prs_count_1=Iarratas Tarraing Cumaisc +activity.merged_prs_count_n=Iarratais Tharraing Chomhcheangail +activity.opened_prs_count_1=Iarratas Tarraing Beartaithe +activity.opened_prs_count_n=Iarratais Tarraing Beartaithe +activity.title.user_1=%d úsáideoir +activity.title.user_n=%d úsáideoirí +activity.title.prs_1=Iarratas tarraing %d +activity.title.prs_n=%d Iarratais Tarraing +activity.title.prs_merged_by=%s a chumasc ag %s +activity.title.prs_opened_by=%s arna mholadh ag %s +activity.merged_prs_label=Cumaiscthe +activity.opened_prs_label=Molta +activity.active_issues_count_1=%d Eagrán Gníomhach +activity.active_issues_count_n=%d Ceisteanna Gníomhacha +activity.closed_issues_count_1=Saincheist Dúnta +activity.closed_issues_count_n=Saincheisteanna Dúnta +activity.title.issues_1=Saincheist %d +activity.title.issues_n=Saincheisteanna %d +activity.title.issues_closed_from=%s dúnta ó %s +activity.title.issues_created_by=%s cruthaithe ag %s activity.closed_issue_label=Dúnta activity.new_issues_count_1=Eagrán Nua +activity.new_issues_count_n=Saincheisteanna Nua +activity.new_issue_label=Osclaíodh +activity.title.unresolved_conv_1=%d Comhrá Neamhréitithe +activity.title.unresolved_conv_n=%d Comhráite Neamhréitithe +activity.unresolved_conv_desc=Níor réitíodh na saincheisteanna agus na hiarratais tarraingthe seo le déanaí fós. activity.unresolved_conv_label=Oscailte - +activity.title.releases_1=Scaoileadh %d +activity.title.releases_n=Eisiúintí %d +activity.title.releases_published_by=%s foilsithe ag %s +activity.published_release_label=Foilsithe +activity.no_git_activity=Níor rinneadh aon ghníomhaíocht tiomanta sa tréimhse seo. +activity.git_stats_exclude_merges=Gan cumaisc a áireamh, +activity.git_stats_author_1=%d údar +activity.git_stats_author_n=%d údair +activity.git_stats_pushed_1=tá sé brúite +activity.git_stats_pushed_n=tá brú orthu +activity.git_stats_commit_1=%d tiomantas +activity.git_stats_commit_n=%d tiomáintí +activity.git_stats_push_to_branch=chuig %s agus +activity.git_stats_push_to_all_branches=chuig gach brainse. +activity.git_stats_on_default_branch=Ar %s, +activity.git_stats_file_1=%d comhad +activity.git_stats_file_n=%d comhaid +activity.git_stats_files_changed_1=tá athrú tagtha +activity.git_stats_files_changed_n=tá athraithe +activity.git_stats_additions=agus tá ann +activity.git_stats_addition_1=%d breisiú +activity.git_stats_addition_n=%d breiseanna +activity.git_stats_and_deletions=agus +activity.git_stats_deletion_1=%d scriosadh +activity.git_stats_deletion_n=%d scriosta + +contributors.contribution_type.filter_label=Cineál ranníocaíochta: contributors.contribution_type.commits=Tiomáintí +contributors.contribution_type.additions=Breiseanna +contributors.contribution_type.deletions=Scriosadh +settings=Socruithe +settings.desc=Is é socruithe an áit ar féidir leat na socruithe don stóras a bhainistiú +settings.options=Stóras +settings.collaboration=Comhoibritheoirí +settings.collaboration.admin=Riarthóir +settings.collaboration.write=Scríobh +settings.collaboration.read=Léigh +settings.collaboration.owner=Úinéir +settings.collaboration.undefined=Neamhshainithe +settings.hooks=Gníomhartha Gréasáin settings.githooks=Crúcanna Git - +settings.basic_settings=Socruithe Bunúsacha +settings.mirror_settings=Socruithe Scáthán +settings.mirror_settings.docs=Cuir do stóras ar bun chun tiomáintí, clibeanna agus brainsí a shioncronú go huathoibríoch le stóras eile. +settings.mirror_settings.docs.disabled_pull_mirror.instructions=Socraigh do thionscadal chun tiomáintí, clibeanna agus brainsí a bhrú go huathoibríoch chuig stóras eile. Tá scátháin tarraingthe díchumasaithe ag riarthóir do shuíomh. +settings.mirror_settings.docs.disabled_push_mirror.instructions=Socraigh do thionscadal chun tiomáintí, clibeanna agus brainsí a tharraingt go huathoibríoch ó stóras eile. +settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Faoi láthair, ní féidir é seo a dhéanamh ach sa roghchlár "Imirce Nua". Le haghaidh tuilleadh eolais, téigh i gcomhairle le do thoil: +settings.mirror_settings.docs.disabled_push_mirror.info=Chuir riarthóir do shuíomh faoi dhíchumasú scátháin bhrú. +settings.mirror_settings.docs.no_new_mirrors=Tá do stóras ag teacht le hathruithe chuig nó ó stóras eile. Cuimhnigh le do thoil nach féidir leat scátháin nua a chruthú faoi láthair. +settings.mirror_settings.docs.can_still_use=Cé nach féidir leat scátháin atá ann cheana a mhodhnú nó cinn nua a chruthú, féadfaidh tú do scáthán atá ann cheana a úsáid fós. +settings.mirror_settings.docs.pull_mirror_instructions=Chun scáthán tarraingthe a shocrú, téigh i gcomhairle le do thoil: +settings.mirror_settings.docs.more_information_if_disabled=Is féidir leat tuilleadh eolais a fháil faoi scátháin bhrú agus tarraingthe anseo: +settings.mirror_settings.docs.doc_link_title=Conas is féidir liom na stórtha a scáthánú? +settings.mirror_settings.docs.doc_link_pull_section=an chuid "Ag tarraingt ó stóras" den doiciméadú. +settings.mirror_settings.docs.pulling_remote_title=Ag tarraingt ó stóras cianda +settings.mirror_settings.mirrored_repository=Stóras scátháin +settings.mirror_settings.pushed_repository=Stóras brúite +settings.mirror_settings.direction=Treo +settings.mirror_settings.direction.pull=Tarraingt +settings.mirror_settings.direction.push=Brúigh +settings.mirror_settings.last_update=Nuashonrú deireanach +settings.mirror_settings.push_mirror.none=Níl aon scátháin bhrú cumraithe +settings.mirror_settings.push_mirror.remote_url=URL Stóras Cianda Git +settings.mirror_settings.push_mirror.add=Cuir Scáthán Brúigh leis +settings.mirror_settings.push_mirror.edit_sync_time=Eagar eatramh sioncronaithe scátháin + +settings.sync_mirror=Sioncronaigh Anois +settings.pull_mirror_sync_in_progress=Athruithe a tharraingt ón iargúlta %s i láthair na huaire. +settings.push_mirror_sync_in_progress=Athruithe a bhrú ar an iargúlta %s i láthair na huaire. +settings.site=Láithreán Gréasáin +settings.update_settings=Nuashonrú Socruithe +settings.update_mirror_settings=Nuashonraigh Socruithe Scátháin +settings.branches.switch_default_branch=Athraigh Brainse Réamhshocraithe +settings.branches.update_default_branch=An Brainse Réamhshocraithe a nuashonrú +settings.branches.add_new_rule=Cuir Riail Nua leis +settings.advanced_settings=Ardsocruithe settings.projects_mode_all=Gach tionscadal settings.trust_model.collaborator=Comhoibritheoir settings.trust_model.collaborator.long=Comhoibritheoir: Sínithe muinín ag comhoibrithe settings.trust_model.collaboratorcommitter.long=Comhoibritheo+Coiteoir: Sínithe iontaobhais ag comhoibritheoirí a mheaitseann leis an gealltóir +settings.webhook.body=Comhlacht settings.slack_color=Dath settings.event_fork=Forc settings.event_wiki=Wiki settings.event_release=Scaoileadh +settings.event_push=Brúigh +diff.review.comment=Trácht branch.branch_already_exists=Tá brainse "%s" ann cheana féin sa stóras seo. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 28605d48cf68..69f0e6eab77b 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -397,7 +397,6 @@ account_link=Kapcsolt fiókok organization=Szervezetek public_profile=Nyilvános profil -password_username_disabled=A nem helyi felhasználóknak nem engedélyezett, hogy megváltoztassák a felhasználói nevüket. Kérjük lépjen kapcsolatba a helyi rendszergazdájával további információkért. full_name=Teljes név website=Webhely location=Hely diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 94c60979a8df..d1b4166e1628 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -317,7 +317,6 @@ account_link=Akun Tertaut organization=Organisasi public_profile=Profil Publik -password_username_disabled=Pengguna non-lokal tidak diizinkan untuk mengubah nama pengguna mereka. Silakan hubungi administrator sistem anda untuk lebih lanjut. full_name=Nama Lengkap website=Situs Web location=Lokasi diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index 656b5e1c5650..0bd4ba68946d 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -428,7 +428,6 @@ account_link=Tengdir Reikningar organization=Stofnanir public_profile=Opinber Notandasíða -password_username_disabled=Notendum utan staðarins er ekki heimilt að breyta notendanafni sínu. Vinsamlegast hafðu samband við síðustjórann þinn til að fá frekari upplýsingar. full_name=Fullt Nafn website=Vefsíða location=Staðsetning diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 3ddd2bbddfef..d82215622fdb 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -516,7 +516,6 @@ account_link=Account collegati organization=Organizzazioni public_profile=Profilo pubblico -password_username_disabled=Gli utenti non locali non hanno il permesso di cambiare il proprio nome utente. per maggiori dettagli si prega di contattare l'amministratore del sito. full_name=Nome Completo website=Sito web location=Posizione diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 2e861df207ba..973c1b3761c3 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -705,7 +705,6 @@ public_profile=公開プロフィール biography_placeholder=自己紹介してください!(Markdownを使うことができます) location_placeholder=おおよその場所を他の人と共有 profile_desc=あなたのプロフィールが他のユーザーにどのように表示されるかを制御します。あなたのプライマリメールアドレスは、通知、パスワードの回復、WebベースのGit操作に使用されます。 -password_username_disabled=非ローカルユーザーのユーザー名は変更できません。詳細はサイト管理者にお問い合わせください。 full_name=フルネーム website=Webサイト location=場所 @@ -1040,6 +1039,7 @@ issue_labels_helper=イシューのラベルセットを選択 license=ライセンス license_helper=ライセンス ファイルを選択してください。 license_helper_desc=ライセンスにより、他人があなたのコードに対して何ができて何ができないのかを規定します。 どれがプロジェクトにふさわしいか迷っていますか? ライセンス選択サイト も確認してみてください。 +multiple_licenses=複数のライセンス object_format=オブジェクトのフォーマット object_format_helper=リポジトリのオブジェクトフォーマット。後で変更することはできません。SHA1 は最も互換性があります。 readme=README @@ -2941,6 +2941,7 @@ dashboard.start_schedule_tasks=Actionsスケジュールタスクを開始 dashboard.sync_branch.started=ブランチの同期を開始しました dashboard.sync_tag.started=タグの同期を開始しました dashboard.rebuild_issue_indexer=イシューインデクサーの再構築 +dashboard.sync_repo_licenses=リポジトリライセンスの同期 users.user_manage_panel=ユーザーアカウント管理 users.new_account=ユーザーアカウントを作成 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index dc122ec4c352..91c5b24ab560 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -375,7 +375,6 @@ account_link=연결된 계정 organization=조직 public_profile=공개 프로필 -password_username_disabled=로컬 사용자가 아닌 경우 사용자 이름 변경을 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요. full_name=성명 website=웹 사이트 location=위치 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index d8ab21e1703a..ee6f3911b0d9 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -623,7 +623,6 @@ public_profile=Publiskais profils biography_placeholder=Pastāsti mums mazliet par sevi! (Var izmantot Markdown) location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem profile_desc=Norādīt, kā profils tiek attēlots citiem lietotājiem. Primārā e-pasta adrese tiks izmantota paziņojumiem, paroles atjaunošanai un Git tīmekļa darbībām. -password_username_disabled=Ne-lokāliem lietotājiem nav atļauts mainīt savu lietotāja vārdu. Sazinieties ar sistēmas administratoru, lai uzzinātu sīkāk. full_name=Pilns vārds website=Mājas lapa location=Atrašanās vieta diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 5ed3417b4a7c..1540cf095b07 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -515,7 +515,6 @@ account_link=Gekoppelde Accounts organization=Organisaties public_profile=Openbaar profiel -password_username_disabled=Niet-lokale gebruikers kunnen hun gebruikersnaam niet veranderen. Neem contact op met de sitebeheerder voor meer details. full_name=Volledige naam website=Website location=Locatie diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 911a4b9e0ef5..22bdf1bbacb0 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -500,7 +500,6 @@ account_link=Powiązane Konta organization=Organizacje public_profile=Profil publiczny -password_username_disabled=Użytkownicy nielokalni nie mogą zmieniać swoich nazw. Aby uzyskać więcej informacji, skontaktuj się z administratorem strony. full_name=Imię i nazwisko website=Strona location=Lokalizacja diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 6f4f710d7f05..bb185d3de6dd 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -622,7 +622,6 @@ public_profile=Perfil público biography_placeholder=Conte-nos um pouco sobre você! (Você pode usar Markdown) location_placeholder=Compartilhe sua localização aproximada com outras pessoas profile_desc=Controle como o seu perfil é exibido para outros usuários. Seu endereço de e-mail principal será usado para notificações, recuperação de senha e operações do Git baseadas na Web. -password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do site para mais informações. full_name=Nome completo website=Site location=Localização diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index cb521fe58c99..6f788737ff5b 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -705,7 +705,6 @@ public_profile=Perfil público biography_placeholder=Conte-nos um pouco sobre si! (Pode usar Markdown) location_placeholder=Partilhe a sua localização aproximada com outros profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web. -password_username_disabled=Utilizadores não-locais não podem mudar os seus nomes de utilizador. Entre em contacto com o administrador do sítio saber para mais detalhes. full_name=Nome completo website=Sítio web location=Localização diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 03c6e2d073f9..7fd73f9d830c 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -618,7 +618,6 @@ public_profile=Открытый профиль biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown) location_placeholder=Поделитесь своим приблизительным местоположением с другими profile_desc=Контролируйте, как ваш профиль будет отображаться другим пользователям. Ваш основной адрес электронной почты будет использоваться для уведомлений, восстановления пароля и веб-операций Git. -password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта. full_name=Имя и фамилия website=Веб-сайт location=Местоположение diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index c9521d80f886..4d64c46e6ee2 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -480,7 +480,6 @@ account_link=සම්බන්ධිත ගිණුම් organization=සංවිධාන public_profile=ප්‍රසිද්ධ පැතිකඩ -password_username_disabled=දේශීය නොවන පරිශීලකයින්ට ඔවුන්ගේ පරිශීලක නාමය වෙනස් කිරීමට අවසර නැත. වැඩි විස්තර සඳහා කරුණාකර ඔබේ වෙබ් අඩවිය පරිපාලක අමතන්න. full_name=සම්පූර්ණ නම website=වියමන අඩවිය location=ස්ථානය diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 484fa320fa9f..a964b526afa1 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -583,7 +583,6 @@ account_link=Prepojené účty organization=Organizácie public_profile=Verejný profil -password_username_disabled=Externí používatelia nemôžu meniť svoje používateľské meno. Kontaktujte, prosím, svojho administrátora kvôli detailom. full_name=Celé meno website=Webová stránka location=Miesto diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 459b7045067b..2993828c22fd 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -418,7 +418,6 @@ account_link=Länkade Konton organization=Organisationer public_profile=Offentlig profil -password_username_disabled=Externa användare kan inte ändra sitt användarnamn. Kontakta din webbadministratör för mera information. full_name=Fullständigt namn website=Webbplats location=Plats diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 7ef6c1d35e15..3c719f84bafc 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -694,7 +694,6 @@ public_profile=Herkese Açık Profil biography_placeholder=Bize kendiniz hakkında birşeyler söyleyin! (Markdown kullanabilirsiniz) location_placeholder=Yaklaşık konumunuzu başkalarıyla paylaşın profile_desc=Profilinizin başkalarına nasıl gösterildiğini yönetin. Ana e-posta adresiniz bildirimler, parola kurtarma ve web tabanlı Git işlemleri için kullanılacaktır. -password_username_disabled=Yerel olmayan kullanıcılara kullanıcı adlarını değiştirme izni verilmemiştir. Daha fazla bilgi edinmek için lütfen site yöneticisi ile iletişime geçiniz. full_name=Ad Soyad website=Web Sitesi location=Konum diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 129ab1b7f5c2..d94d11207b48 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -494,7 +494,6 @@ account_link=Прив'язані облікові записи organization=Організації public_profile=Загальнодоступний профіль -password_username_disabled=Нелокальним користувачам заборонено змінювати ім'я користувача. Щоб отримати докладнішу інформацію, зв'яжіться з адміністратором сайту. full_name=Повне ім'я website=Веб-сайт location=Місцезнаходження diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 2827a8cd35b9..3be7b044e903 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -686,7 +686,6 @@ public_profile=公开信息 biography_placeholder=告诉我们一点您自己! (您可以使用Markdown) location_placeholder=与他人分享你的大概位置 profile_desc=控制您的个人资料对其他用户的显示方式。您的主要电子邮件地址将用于通知、密码恢复和基于网页界面的 Git 操作 -password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。 full_name=自定义名称 website=个人网站 location=所在地区 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 9406419e6bb1..d755f64dcd5f 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -583,7 +583,6 @@ account_link=已連結帳號 organization=組織 public_profile=公開的個人資料 -password_username_disabled=非本地使用者不允許更改他們的帳號。詳細資訊請聯絡您的系統管理員。 full_name=全名 website=個人網站 location=所在地區 From 6551847aa8a7b2d363e9fbfe7509b679be5c0a71 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 7 Oct 2024 00:32:39 +0000 Subject: [PATCH 11/41] [skip ci] Updated licenses and gitignores --- options/gitignore/KiCad | 2 + options/license/Sendmail-Open-Source-1.1 | 75 ++++++++++++++++++++++++ options/license/harbour-exception | 23 ++++++++ 3 files changed, 100 insertions(+) create mode 100644 options/license/Sendmail-Open-Source-1.1 create mode 100644 options/license/harbour-exception diff --git a/options/gitignore/KiCad b/options/gitignore/KiCad index a63bc0e7f7e0..59fde34c0e55 100644 --- a/options/gitignore/KiCad +++ b/options/gitignore/KiCad @@ -16,6 +16,8 @@ _autosave-* *-save.pro *-save.kicad_pcb fp-info-cache +~*.lck +\#auto_saved_files# # Netlist files (exported from Eeschema) *.net diff --git a/options/license/Sendmail-Open-Source-1.1 b/options/license/Sendmail-Open-Source-1.1 new file mode 100644 index 000000000000..054f719ee594 --- /dev/null +++ b/options/license/Sendmail-Open-Source-1.1 @@ -0,0 +1,75 @@ +SENDMAIL OPEN SOURCE LICENSE + +The following license terms and conditions apply to this open source +software ("Software"), unless a different license is obtained directly +from Sendmail, Inc. ("Sendmail") located at 6475 Christie Ave, Suite 350, +Emeryville, CA 94608, USA. + +Use, modification and redistribution (including distribution of any +modified or derived work) of the Software in source and binary forms is +permitted only if each of the following conditions of 1-6 are met: + +1. Redistributions of the Software qualify as "freeware" or "open + source software" under one of the following terms: + + (a) Redistributions are made at no charge beyond the reasonable + cost of materials and delivery; or + + (b) Redistributions are accompanied by a copy of the modified + Source Code (on an acceptable machine-readable medium) or by an + irrevocable offer to provide a copy of the modified Source Code + (on an acceptable machine-readable medium) for up to three years + at the cost of materials and delivery. Such redistributions must + allow further use, modification, and redistribution of the Source + Code under substantially the same terms as this license. For + the purposes of redistribution "Source Code" means the complete + human-readable, compilable, linkable, and operational source + code of the redistributed module(s) including all modifications. + +2. Redistributions of the Software Source Code must retain the + copyright notices as they appear in each Source Code file, these + license terms and conditions, and the disclaimer/limitation of + liability set forth in paragraph 6 below. Redistributions of the + Software Source Code must also comply with the copyright notices + and/or license terms and conditions imposed by contributors on + embedded code. The contributors' license terms and conditions + and/or copyright notices are contained in the Source Code + distribution. + +3. Redistributions of the Software in binary form must reproduce the + Copyright Notice described below, these license terms and conditions, + and the disclaimer/limitation of liability set forth in paragraph + 6 below, in the documentation and/or other materials provided with + the binary distribution. For the purposes of binary distribution, + "Copyright Notice" refers to the following language: "Copyright (c) + 1998-2009 Sendmail, Inc. All rights reserved." + +4. Neither the name, trademark or logo of Sendmail, Inc. (including + without limitation its subsidiaries or affiliates) or its contributors + may be used to endorse or promote products, or software or services + derived from this Software without specific prior written permission. + The name "sendmail" is a registered trademark and service mark of + Sendmail, Inc. + +5. We reserve the right to cancel this license if you do not comply with + the terms. This license is governed by California law and both of us + agree that for any dispute arising out of or relating to this Software, + that jurisdiction and venue is proper in San Francisco or Alameda + counties. These license terms and conditions reflect the complete + agreement for the license of the Software (which means this supercedes + prior or contemporaneous agreements or representations). If any term + or condition under this license is found to be invalid, the remaining + terms and conditions still apply. + +6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY + SENDMAIL AND ITS CONTRIBUTORS "AS IS" WITHOUT WARRANTY OF ANY KIND + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A + PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. IN NO EVENT SHALL SENDMAIL + OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + WITHOUT LIMITATION NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/options/license/harbour-exception b/options/license/harbour-exception new file mode 100644 index 000000000000..25d75e9fc766 --- /dev/null +++ b/options/license/harbour-exception @@ -0,0 +1,23 @@ +As a special exception, the Harbour Project gives permission for +additional uses of the text contained in its release of Harbour. + +The exception is that, if you link the Harbour libraries with other +files to produce an executable, this does not by itself cause the +resulting executable to be covered by the GNU General Public License. +Your use of that executable is in no way restricted on account of +linking the Harbour library code into it. + +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. + +This exception applies only to the code released by the Harbour +Project under the name Harbour. If you copy code from other +Harbour Project or Free Software Foundation releases into a copy of +Harbour, as the General Public License permits, the exception does +not apply to the code that you add in this way. To avoid misleading +anyone as to the status of such modified files, you must delete +this exception notice from them. + +If you write modifications of your own for Harbour, it is your choice +whether to permit this exception to apply to your modifications. +If you do not wish that, delete this exception notice. From fa35ace9fb0383cee78e1717bcb6eab1224fb4f1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 7 Oct 2024 11:50:38 +0800 Subject: [PATCH 12/41] Fix bug when there are multiple triggers with workflow dispatch (#32200) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8dd694792528..d85553ac9f26 100644 --- a/go.mod +++ b/go.mod @@ -331,7 +331,7 @@ replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0 -replace github.com/nektos/act => gitea.com/gitea/act v0.259.1 +replace github.com/nektos/act => gitea.com/gitea/act v0.261.3 replace github.com/charmbracelet/git-lfs-transfer => gitea.com/gitea/git-lfs-transfer v0.2.0 diff --git a/go.sum b/go.sum index aa592053b53e..bb185e20c16d 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:cliQ4HHsCo6xi2oWZYKWW4bly/Ory9FuTpFPRxj/mAg= git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs= -gitea.com/gitea/act v0.259.1 h1:8GG1o/xtUHl3qjn5f0h/2FXrT5ubBn05TJOM5ry+FBw= -gitea.com/gitea/act v0.259.1/go.mod h1:UxZWRYqQG2Yj4+4OqfGWW5a3HELwejyWFQyU7F1jUD8= +gitea.com/gitea/act v0.261.3 h1:BhiYpGJQKGq0XMYYICCYAN4KnsEWHyLbA6dxhZwFcV4= +gitea.com/gitea/act v0.261.3/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok= gitea.com/gitea/git-lfs-transfer v0.2.0 h1:baHaNoBSRaeq/xKayEXwiDQtlIjps4Ac/Ll4KqLMB40= gitea.com/gitea/git-lfs-transfer v0.2.0/go.mod h1:UrXUCm3xLQkq15fu7qlXHUMlrhdlXHoi13KH2Dfiits= gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed h1:EZZBtilMLSZNWtHHcgq2mt6NSGhJSZBuduAlinMEmso= From bdd655f2bde5facada4394f36fe54e364787de7a Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 7 Oct 2024 23:21:07 +0200 Subject: [PATCH 13/41] Allow filtering PRs by poster in the ListPullRequests API (#32209) as title --- *Sponsored by Kithara Software GmbH* --- models/issues/pull_list.go | 5 ++++ routers/api/v1/repo/pull.go | 42 ++++++++++++++++++++++++++-------- templates/swagger/v1_json.tmpl | 25 +++++++++++++++----- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/models/issues/pull_list.go b/models/issues/pull_list.go index f80a2284f096..9155ea083468 100644 --- a/models/issues/pull_list.go +++ b/models/issues/pull_list.go @@ -26,6 +26,7 @@ type PullRequestsOptions struct { SortType string Labels []int64 MilestoneID int64 + PosterID int64 } func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { @@ -46,6 +47,10 @@ func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullR sess.And("issue.milestone_id=?", opts.MilestoneID) } + if opts.PosterID > 0 { + sess.And("issue.poster_id=?", opts.PosterID) + } + return sess } diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 4e3de77032fb..34ebcb42d5ae 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -52,56 +52,79 @@ func ListPullRequests(ctx *context.APIContext) { // parameters: // - name: owner // in: path - // description: owner of the repo + // description: Owner of the repo // type: string // required: true // - name: repo // in: path - // description: name of the repo + // description: Name of the repo // type: string // required: true // - name: state // in: query - // description: "State of pull request: open or closed (optional)" + // description: State of pull request // type: string - // enum: [closed, open, all] + // enum: [open, closed, all] + // default: open // - name: sort // in: query - // description: "Type of sort" + // description: Type of sort // type: string // enum: [oldest, recentupdate, leastupdate, mostcomment, leastcomment, priority] // - name: milestone // in: query - // description: "ID of the milestone" + // description: ID of the milestone // type: integer // format: int64 // - name: labels // in: query - // description: "Label IDs" + // description: Label IDs // type: array // collectionFormat: multi // items: // type: integer // format: int64 + // - name: poster + // in: query + // description: Filter by pull request author + // type: string // - name: page // in: query - // description: page number of results to return (1-based) + // description: Page number of results to return (1-based) // type: integer + // minimum: 1 + // default: 1 // - name: limit // in: query - // description: page size of results + // description: Page size of results // type: integer + // minimum: 0 // responses: // "200": // "$ref": "#/responses/PullRequestList" // "404": // "$ref": "#/responses/notFound" + // "500": + // "$ref": "#/responses/error" labelIDs, err := base.StringsToInt64s(ctx.FormStrings("labels")) if err != nil { ctx.Error(http.StatusInternalServerError, "PullRequests", err) return } + var posterID int64 + if posterStr := ctx.FormString("poster"); posterStr != "" { + poster, err := user_model.GetUserByName(ctx, posterStr) + if err != nil { + if user_model.IsErrUserNotExist(err) { + ctx.Error(http.StatusBadRequest, "Poster not found", err) + } else { + ctx.Error(http.StatusInternalServerError, "GetUserByName", err) + } + return + } + posterID = poster.ID + } listOptions := utils.GetListOptions(ctx) prs, maxResults, err := issues_model.PullRequests(ctx, ctx.Repo.Repository.ID, &issues_model.PullRequestsOptions{ ListOptions: listOptions, @@ -109,6 +132,7 @@ func ListPullRequests(ctx *context.APIContext) { SortType: ctx.FormTrim("sort"), Labels: labelIDs, MilestoneID: ctx.FormInt64("milestone"), + PosterID: posterID, }) if err != nil { ctx.Error(http.StatusInternalServerError, "PullRequests", err) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index bac918ac3899..2cbd8782d841 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -11209,26 +11209,27 @@ "parameters": [ { "type": "string", - "description": "owner of the repo", + "description": "Owner of the repo", "name": "owner", "in": "path", "required": true }, { "type": "string", - "description": "name of the repo", + "description": "Name of the repo", "name": "repo", "in": "path", "required": true }, { "enum": [ - "closed", "open", + "closed", "all" ], "type": "string", - "description": "State of pull request: open or closed (optional)", + "default": "open", + "description": "State of pull request", "name": "state", "in": "query" }, @@ -11265,14 +11266,23 @@ "in": "query" }, { + "type": "string", + "description": "Filter by pull request author", + "name": "poster", + "in": "query" + }, + { + "minimum": 1, "type": "integer", - "description": "page number of results to return (1-based)", + "default": 1, + "description": "Page number of results to return (1-based)", "name": "page", "in": "query" }, { + "minimum": 0, "type": "integer", - "description": "page size of results", + "description": "Page size of results", "name": "limit", "in": "query" } @@ -11283,6 +11293,9 @@ }, "404": { "$ref": "#/responses/notFound" + }, + "500": { + "$ref": "#/responses/error" } } }, From d3ada91ea41b2f2eb58d637ab4c0a2dde07f20ce Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 8 Oct 2024 00:30:42 +0000 Subject: [PATCH 14/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_ga-IE.ini | 804 +++++++++++++++++++++++++++++++- options/locale/locale_pt-PT.ini | 4 + 2 files changed, 790 insertions(+), 18 deletions(-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 23e0839530e0..82209b1b1180 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -580,6 +580,8 @@ lang_select_error=Roghnaigh teanga ón liosta. username_been_taken=Tá an t-ainm úsáideora tógtha cheana féin. username_change_not_local_user=Ní cheadaítear d'úsáideoirí neamháitiúla a n-ainm úsáideora a athrú. +change_username_disabled=Tá athrú an ainm úsáideora díchumasaithe. +change_full_name_disabled=Tá athrú an ainm iomlán díchumasaithe. username_has_not_been_changed=Níor athraíodh ainm úsáideora repo_name_been_taken=Úsáidtear ainm an stór cheana féin. repository_force_private=Tá Force Private cumasaithe: ní féidir stórais phríobháideacha a dhéanamh poiblí. @@ -705,6 +707,8 @@ public_profile=Próifíl Phoiblí biography_placeholder=Inis dúinn beagán fút féin! (Is féidir leat Markdown a úsáid) location_placeholder=Comhroinn do shuíomh thart le daoine eile profile_desc=Rialú conas a thaispeánfar do phróifíl d'úsáideoirí eile. Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocail agus oibríochtaí Git gréasán-bhunaithe. +password_username_disabled=Níl cead agat a n-ainm úsáideora a athrú. Déan teagmháil le do riarthóir suímh le haghaidh tuilleadh sonraí. +password_full_name_disabled=Níl cead agat a n-ainm iomlán a athrú. Déan teagmháil le do riarthóir suímh le haghaidh tuilleadh sonraí. full_name=Ainm Iomlán website=Láithreán Gréasáin location=Suíomh @@ -970,7 +974,7 @@ remove_account_link=Bain Cuntas Nasctha remove_account_link_desc=Ag baint cuntas nasctha, cuirfear a rochtain ar do chuntas Gitea a chúlghairm. Lean ar aghaidh? remove_account_link_success=Tá an cuntas nasctha bainte amach. -hooks.desc=Cuir cuaillí gréasáin leis a spreagfar do gach stór ar leatsa iad. +hooks.desc=Cuir crúcaí gréasán leis a spreagfar do gach stór ar leatsa iad. orgs_none=Níl tú ina bhall d'aon eagraíochtaí. repos_none=Níl aon stórais agat. @@ -2089,7 +2093,7 @@ settings.collaboration.write=Scríobh settings.collaboration.read=Léigh settings.collaboration.owner=Úinéir settings.collaboration.undefined=Neamhshainithe -settings.hooks=Gníomhartha Gréasáin +settings.hooks=Crúcaí Gréasán settings.githooks=Crúcanna Git settings.basic_settings=Socruithe Bunúsacha settings.mirror_settings=Socruithe Scáthán @@ -2126,54 +2130,797 @@ settings.branches.switch_default_branch=Athraigh Brainse Réamhshocraithe settings.branches.update_default_branch=An Brainse Réamhshocraithe a nuashonrú settings.branches.add_new_rule=Cuir Riail Nua leis settings.advanced_settings=Ardsocruithe +settings.wiki_desc=Cumasaigh Stór Vicí +settings.use_internal_wiki=Úsáid Vicí Insuite +settings.default_wiki_branch_name=Ainm Brainse Réamhshocraithe Vicí +settings.default_wiki_everyone_access=Cead Rochtana Réamhshocraithe d'úsáideoirí sínithe isteach: +settings.failed_to_change_default_wiki_branch=Theip ar an brainse réamhshocraithe vicí a athrú. +settings.use_external_wiki=Úsáid Vicí Seachtrach +settings.external_wiki_url=URL Vicí Seachtrach +settings.external_wiki_url_error=Ní URL bailí é URL seachtrach vicí. +settings.external_wiki_url_desc=Atreoraítear cuairteoirí chuig an URL wiki seachtrach agus iad ag cliceáil ar an gcluaisín wiki. +settings.issues_desc=Cumasaigh Rianóir Saincheist Stórais +settings.use_internal_issue_tracker=Úsáid Rianóir Saincheist Ionsuite +settings.use_external_issue_tracker=Úsáid Rianaire Eisiúint Sheachtrach +settings.external_tracker_url=URL Rianaithe Saincheisteanna Seachtrach +settings.external_tracker_url_error=Ní URL bailí é an URL rianaitheora saincheisteanna seachtrach. +settings.external_tracker_url_desc=Déantar cuairteoirí a atreorú chuig an URL rianaithe eisiúintí seachtracha nuair a chliceálann siad ar an táb saincheisteanna. +settings.tracker_url_format=Formáid URL Rianaithe Saincheist Seachtrach +settings.tracker_url_format_error=Ní URL bailí é an fhormáid URL rianaitheora saincheisteanna seachtrach. +settings.tracker_issue_style=Formáid Uimhir Rianaithe Saincheisteanna +settings.tracker_issue_style.numeric=Uimhriúil +settings.tracker_issue_style.alphanumeric=Alfauméireacha +settings.tracker_issue_style.regexp=Léiriú Rialta +settings.tracker_issue_style.regexp_pattern=Patrún Léirithe Rialta +settings.tracker_issue_style.regexp_pattern_desc=Úsáidfear an chéad ghrúpa a gabhadh in ionad {index}. +settings.tracker_url_format_desc=Úsáid na sealbhóirí áite {user}, {repo} agus {index} le haghaidh an ainm úsáideora, an t-ainm stórtha agus an t-innéacs eisiúna. +settings.enable_timetracker=Cumasaigh Rianú Ama +settings.allow_only_contributors_to_track_time=Lig do Rannpháirtithe Amach Am a Rianú +settings.pulls_desc=Cumasaigh Iarratais Tarraingthe Stóras +settings.pulls.ignore_whitespace=Déan neamhaird de spás bán le haghaidh coinbhleachtaí +settings.pulls.enable_autodetect_manual_merge=Cumasaigh cumasc láimhe autodetector (Nóta: I roinnt cásanna speisialta, is féidir míbhreithiúnais tarlú) +settings.pulls.allow_rebase_update=Cumasaigh brainse iarratais tarraingthe a nuashonrú trí athbhunú +settings.pulls.default_delete_branch_after_merge=Scrios brainse an iarratais tarraingthe tar éis cumasc de réir réamhshocraithe +settings.pulls.default_allow_edits_from_maintainers=Ceadaigh eagarthóirí ó chothabhálaí de réir réamhshocraithe +settings.releases_desc=Cumasaigh Eisiúintí Stórais +settings.packages_desc=Cumasaigh Clárlann na bPacáistí Taisclainne +settings.projects_desc=Cumasaigh Tionscadail +settings.projects_mode_desc=Mód Tionscadail (cé na cineálacha tionscadail le taispeáint) +settings.projects_mode_repo=Tionscadail stórais amháin +settings.projects_mode_owner=Tionscadail úsáideora nó org amháin settings.projects_mode_all=Gach tionscadal +settings.actions_desc=Cumasaigh Gníomhartha Taiscthe +settings.admin_settings=Socruithe Riarthóra +settings.admin_enable_health_check=Cumasaigh Seiceálacha Sláinte Stórais (git fsck) +settings.admin_code_indexer=Innéacsaitheoir Cód +settings.admin_stats_indexer=Innéacsóir Staitisticí Cód +settings.admin_indexer_commit_sha=SHA Innéacsaithe Deiridh +settings.admin_indexer_unindexed=Neamh-innéacsaithe +settings.reindex_button=Cuir le Scuaine Reindex +settings.reindex_requested=Athinnéacsú Iarrtha +settings.admin_enable_close_issues_via_commit_in_any_branch=Saincheist a dhúnadh trí ghealltanas a rinneadh i mbrainse neamh-mhainneachtana +settings.danger_zone=Crios Contúirte +settings.new_owner_has_same_repo=Tá stóras leis an ainm céanna ag an úinéir nua cheana féin. Roghnaigh ainm eile le do thoil. +settings.convert=Tiontaigh go Stóras Rialta +settings.convert_desc=Is féidir leat an scáthán seo a thiontú ina stór rialta. Ní féidir é seo a chur ar ais. +settings.convert_notices_1=Déanfaidh an oibríocht seo an scáthán a thiontú ina stóras rialta agus ní féidir é a chur ar ais. +settings.convert_confirm=Tiontaigh Stóras +settings.convert_succeed=Tá an scáthán tiontaithe ina stóras rialta. +settings.convert_fork=Tiontaigh go Stóras Rialta +settings.convert_fork_desc=Is féidir leat an forc seo a thiontú ina stóras rialta. Ní féidir é seo a chur ar ais. +settings.convert_fork_notices_1=Déanfaidh an oibríocht seo an forc a thiontú ina stóras rialta agus ní féidir é a chur ar ais. +settings.convert_fork_confirm=Tiontaigh Stóras +settings.convert_fork_succeed=Tá an forc tiontaithe ina stóras rialta. +settings.transfer=Úinéireacht Aistrithe +settings.transfer.rejected=Diúltaíodh d'aistriú stóras. +settings.transfer.success=D'éirigh le haistriú stóras. +settings.transfer.blocked_user=Ní féidir an stóras a aistriú toisc go bhfuil bac á chur ort ag an úinéir nua. +settings.transfer_abort=Cealaigh aistriú +settings.transfer_abort_invalid=Ní féidir leat aistriú stóras nach bhfuil ann a chealú. +settings.transfer_abort_success=Cuireadh an t-aistriú stóras chuig %s ar ceal go rathúil. +settings.transfer_desc=Aistrigh an stóras seo chuig úsáideoir nó chuig eagraíocht a bhfuil cearta riarthóra agat ina leith. +settings.transfer_form_title=Cuir isteach ainm an stóras mar dhearbhú: +settings.transfer_in_progress=Tá aistriú leanúnach ann faoi láthair. Cealaigh é más mian leat an stóras seo a aistriú chuig úsáideoir eile. +settings.transfer_notices_1=- Caillfidh tú rochtain ar an stóras má aistríonn tú é chuig úsáideoir aonair. +settings.transfer_notices_2=- Coimeádfaidh tú rochtain ar an stóras má aistríonn tú é chuig eagraíocht a bhfuil (comh)úinéir agat. +settings.transfer_notices_3=- Má tá an stóras príobháideach agus má aistrítear é chuig úsáideoir aonair, cinnteoidh an gníomh seo go bhfuil ar a laghad cead léite ag an úsáideoir (agus athraíonn sé ceadanna más gá). +settings.transfer_notices_4=- Más le heagraíocht an stóras, agus má aistríonn tú chuig eagraíocht nó duine aonair eile é, caillfidh tú na naisc idir saincheisteanna an taisclainne agus bord tionscadail na heagraíochta. +settings.transfer_owner=Úinéir nua +settings.transfer_perform=Déan Aistriú +settings.transfer_started=`Tá an stóras seo marcáilte le haistriú agus tá sé ag fanacht le deimhniú ó "%s"` +settings.transfer_succeed=Tá an stóras aistrithe. +settings.signing_settings=Socruithe Fíoraithe Sínithe +settings.trust_model=Samhail Iontaobhas Sínithe +settings.trust_model.default=Múnla Iontaobhais Réamhshocraithe +settings.trust_model.default.desc=Úsáid an tsamhail iontaobhais stórais réamhshocraithe don suiteáil settings.trust_model.collaborator=Comhoibritheoir settings.trust_model.collaborator.long=Comhoibritheoir: Sínithe muinín ag comhoibrithe -settings.trust_model.collaboratorcommitter.long=Comhoibritheo+Coiteoir: Sínithe iontaobhais ag comhoibritheoirí a mheaitseann leis an gealltóir +settings.trust_model.collaborator.desc=Déanfar sínithe bailí ó chomhoibritheoirí an stóras seo a mharcáil mar 'iontaofa' – (cibé acu a mheaitseálann siad an tiomnóir nó nach bhfuil). Seachas sin, marcálfar sínithe bailí mar 'neamhiontaofa' má mheaitseálann an síniú an tiomnóir agus mar 'neamh-mheaitseáilte' mura bhfuil. +settings.trust_model.committer=Coimisitheoir +settings.trust_model.committer.long=Gealltóir: Sínithe iontaobhais a mheaitseálann na coimitheoirí (Meaitseálann sé seo le GitHub agus cuirfidh sé iallach ar Gitea gealltanais sínithe Gitea a bheith mar an tiomnóir) +settings.trust_model.committer.desc=Ní mharcálfar "muinín" ar shínithe bailí ach amháin má mheaitseálann siad leis an gcoiste, nó déanfar iad a mharcáil "gan mheaitseáil". Cuireann sé seo iachall ar Gitea a bheith mar an tiomnóir ar ghealltanais sínithe agus an fíor-chimisteoir marcáilte mar Comhúdar: agus Co-tiomanta ag: leantóir sa chimiú. Caithfidh an eochair réamhshocraithe Gitea a bheith ag teacht le hÚsáideoir sa bhunachar sonraí. +settings.trust_model.collaboratorcommitter=Comhoibritheo+Coimiteoir +settings.trust_model.collaboratorcommitter.long=Comhoibrí+Coiste: sínithe muiníne ó chomhoibrithe a mheaitseálann an tiomnóir +settings.trust_model.collaboratorcommitter.desc=Déanfar sínithe bailí ó chomhoibritheoirí ar an stór seo a mharcáil "muinín" má mheaitseálann siad leis an gcoiste. Seachas sin, marcálfar "neamhiontaofa" ar shínithe bailí má mheaitseálann an síniú leis an gcoiste agus "gan mheaitseáil" ar shlí eile. Cuirfidh sé seo iallach ar Gitea a mharcáil mar an tiomnóir ar ghealltanais shínithe agus an fíor-choiste a bheith marcáilte mar Comhúdaraithe Ag: agus Comhthiomanta Ag: leantóir sa ghealltanas. Caithfidh an eochair réamhshocraithe Gitea a bheith ag teacht le hÚsáideoir sa bhunachar sonraí. +settings.wiki_delete=Scrios Sonraí Vicí +settings.wiki_delete_desc=Tá sonraí wiki stóras a scriosadh buan agus ní féidir iad a chur ar ais. +settings.wiki_delete_notices_1=- Scriosfaidh agus díchumasóidh sé seo an stóras vicí do %s go buan. +settings.confirm_wiki_delete=Scrios Sonraí Vicí +settings.wiki_deletion_success=Scriosadh sonraí vicí an stórais. +settings.delete=Scrios an Stóras seo +settings.delete_desc=Tá scriosadh stóras buan agus ní féidir é a chealú. +settings.delete_notices_1=- NÍ FÉIDIR an oibríocht seo a chealú. +settings.delete_notices_2=- Scriosfaidh an oibríocht seo stór %s go buan lena n-áirítear cód, ceisteanna, nótaí tráchta, sonraí vicí agus socruithe comhoibrithe. +settings.delete_notices_fork_1=- Beidh forcanna den stóras seo neamhspleách tar éis iad a scriosadh. +settings.deletion_success=Tá an stóras scriosta. +settings.update_settings_success=Nuashonraíodh na socruithe stóras. +settings.update_settings_no_unit=Ba cheart go gceadódh an stóras idirghníomhú de chineál éigin ar a laghad. +settings.confirm_delete=Scrios Stóras +settings.add_collaborator=Cuir Comhoibritheoir leis +settings.add_collaborator_success=Cuireadh an comhoibritheoir leis. +settings.add_collaborator_inactive_user=Ní féidir úsáideoir neamhghníomhach a chur mar chomhoibritheoir. +settings.add_collaborator_owner=Ní féidir úinéir a chur leis mar chomhoibritheoir. +settings.add_collaborator_duplicate=Tá an comhoibrí curtha leis an stóras seo cheana féin. +settings.add_collaborator.blocked_user=Cuireann úinéir an stóras bac ar an gcomhoibritheoir nó a mhalairt. +settings.delete_collaborator=Bain +settings.collaborator_deletion=Bain Comhoibritheoir +settings.collaborator_deletion_desc=Má dhéantar comhoibrí a bhaint, déanfar a rochtain ar an stóras seo a chúlghairm. Lean ort? +settings.remove_collaborator_success=Tá an comhoibritheoir bainte. +settings.org_not_allowed_to_be_collaborator=Ní féidir eagraíochtaí a chur leis mar chomhoibritheoir. +settings.change_team_access_not_allowed=Tá rochtain foirne a athrú don stóras teoranta d'úinéir eagraíochta +settings.team_not_in_organization=Níl an fhoireann san eagraíocht chéanna leis an stóras +settings.teams=Foirne +settings.add_team=Cuir Foireann leis +settings.add_team_duplicate=Tá an stóras ag an bhfoireann cheana féin +settings.add_team_success=Tá rochtain ag an bhfoireann anois ar an stóras. +settings.change_team_permission_tip=Tá cead na foirne socraithe ar leathanach socraithe foirne agus ní féidir é a athrú in aghaidh an stóras +settings.delete_team_tip=Tá rochtain ag an bhfoireann seo ar gach stórais agus ní féidir í a bhaint +settings.remove_team_success=Tá rochtain na foirne ar an stóras bainte amach. +settings.add_webhook=Cuir Crúca Gréasán leis +settings.add_webhook.invalid_channel_name=Ní féidir ainm cainéal Crúca Gréasán a bheith folamh agus ní féidir ach carachtar # a bheith ann. +settings.hooks_desc=Déanann Crúcaí Gréasán iarratais HTTP POST go huathoibríoch chuig freastalaí nuair a chuireann imeachtaí áirithe Gitea tús. Léigh tuilleadh sa treoirleabhair gréasáin. +settings.webhook_deletion=Bain Crúca Gréasán +settings.webhook_deletion_desc=Scriostar a shocruithe agus a stair seachadta a bhaineann le Crúca Gréasán a bhaint. Lean ar aghaidh? +settings.webhook_deletion_success=Tá an Crúca Gréasán bainte amach. +settings.webhook.test_delivery=Seachadadh Tástála +settings.webhook.test_delivery_desc=Déan tástáil ar an Crúca Gréasán seo le himeacht bhréige. +settings.webhook.test_delivery_desc_disabled=Chun an Crúca Gréasán seo a thástáil le himeacht bhréige, gníomhachtaigh é. +settings.webhook.request=Iarratas +settings.webhook.response=Freagra +settings.webhook.headers=Ceanntásca +settings.webhook.payload=Ábhar settings.webhook.body=Comhlacht +settings.webhook.replay.description=Seinn an Crúca Gréasán seo arís. +settings.webhook.replay.description_disabled=Chun an Crúca Gréasán seo a athsheinm, gníomhachtaigh é. +settings.webhook.delivery.success=Cuireadh imeacht leis an scuaine seachadta. D'fhéadfadh sé cúpla soicind a thógáil sula dtaispeántar sé sa stair seachadta. +settings.githooks_desc=Tá Git Crúcaí faoi thiomáint ag Git féin. Is féidir leat comhaid crúca a chur in eagar thíos chun oibríochtaí saincheaptha a shocrú. +settings.githook_edit_desc=Mura bhfuil an hook neamhghníomhach, cuirfear ábhar samplach i láthair. Má fhágann tú ábhar go luach folamh díchumasófar an crúca seo. +settings.githook_name=Ainm Crúca +settings.githook_content=Ábhar Crúca +settings.update_githook=Nuashonraigh Crúca +settings.add_webhook_desc=Seolfaidh Gitea iarratais POST le cineál ábhar sonraithe chuig an spriocURL. Léigh tuilleadh sa treoir Crúcaí Gréasán. +settings.payload_url=URL spriocdhírithe +settings.http_method=Modh HTTP +settings.content_type=Cineál Ábhar POST +settings.secret=Rúnda +settings.slack_username=Ainm úsáideora +settings.slack_icon_url=URL deilbhín settings.slack_color=Dath +settings.discord_username=Ainm úsáideora +settings.discord_icon_url=URL deilbhín +settings.event_desc=Truicear Ar: +settings.event_push_only=Imeachtaí Brúigh +settings.event_send_everything=Gach Imeacht +settings.event_choose=Imeachtaí Saincheaptha… +settings.event_header_repository=Imeachtaí Stóras +settings.event_create=Cruthaigh +settings.event_create_desc=Cruthaíodh brainse nó clib. +settings.event_delete=Scrios +settings.event_delete_desc=Brainse nó clib scriosta. settings.event_fork=Forc -settings.event_wiki=Wiki +settings.event_fork_desc=Forcadh stóras. +settings.event_wiki=Vicí +settings.event_wiki_desc=Leathanach Vicí cruthaithe, athainmnithe, curtha in eagar nó scriosta. settings.event_release=Scaoileadh +settings.event_release_desc=Scaoileadh foilsithe, nuashonraithe nó scriosta i stóras. settings.event_push=Brúigh - +settings.event_force_push=Fórsa Brúigh +settings.event_push_desc=Brúigh Git chuig stóras. +settings.event_repository=Stóras +settings.event_repository_desc=Stóras a cruthaíodh nó a scriosadh. +settings.event_header_issue=Imeachtaí Eisiúint +settings.event_issues=Saincheisteanna +settings.event_issues_desc=Osclaíodh, dúnadh, athosclaíodh nó cuireadh an cheist in eagar. +settings.event_issue_assign=Saincheist Sannaithe +settings.event_issue_assign_desc=Eisiúint sannta nó neamhshannta. +settings.event_issue_label=Eisiúint Lipéadaithe +settings.event_issue_label_desc=Lipéid eisiúna nuashonraithe nó glanta. +settings.event_issue_milestone=Clocha Míle Saincheiste +settings.event_issue_milestone_desc=Clocha Míle Saincheiste nó Clocha Míle de-Saincheiste. +settings.event_issue_comment=Trácht Eisiúna +settings.event_issue_comment_desc=Trácht eisiúna cruthaithe, curtha in eagar nó a scriosadh. +settings.event_header_pull_request=Tarraingt Imeachtaí Iarratas +settings.event_pull_request=Iarratas Tarraingthe +settings.event_pull_request_desc=Iarratas tarraingthe oscailte, dúnta, athoscailte nó curtha in eagar. +settings.event_pull_request_assign=Iarratas Tarraingthe Sannta +settings.event_pull_request_assign_desc=Iarratas tarraingthe sannta nó neamhshannta. +settings.event_pull_request_label=Iarratas Tarraingthe Lipéadaithe +settings.event_pull_request_label_desc=Tarraing lipéid iarratais nuashonraithe nó glanta. +settings.event_pull_request_milestone=Iarratas Tarraing Cloch Mhíle +settings.event_pull_request_milestone_desc=Iarratas tarraing clocha míle nó dí-chlocha míle. +settings.event_pull_request_comment=Trácht ar Iarratas Tarraingthe +settings.event_pull_request_comment_desc=Trácht ar iarratas tarraingthe cruthaithe, curtha in eagar, nó scriosta. +settings.event_pull_request_review=Iarratas Tarraingthe Athbhreithnithe +settings.event_pull_request_review_desc=Tarraing iarratas ceadaithe, diúltaithe nó trácht athbhreithnithe. +settings.event_pull_request_sync=Iarratas Tarraing Sincronaithe +settings.event_pull_request_sync_desc=Tarraing iarratas sioncrónaithe. +settings.event_pull_request_review_request=Iarratas ar Athbhreithniú Tarraingthe Iarrtha +settings.event_pull_request_review_request_desc=Tarraing athbhreithniú iarratais iarrtha nó baineadh iarratas athbhreithnithe. +settings.event_pull_request_approvals=Ceaduithe Iarratais Tarraing +settings.event_pull_request_merge=Cumaisc Iarratas Tarraing +settings.event_package=Pacáiste +settings.event_package_desc=Pacáiste a cruthaíodh nó a scriosadh i stóras. +settings.branch_filter=Scagaire brainse +settings.branch_filter_desc=Liosta bán brainse le haghaidh brú, cruthú brainse agus imeachtaí scriosta brainse, sonraithe mar phatrún glob. Má tá sé folamh nó *, tuairiscítear imeachtaí do gach brainse. Féach %[2]s doiciméadú le haghaidh comhréire. Samplaí: máistir, {master,release*}. +settings.authorization_header=Ceanntásc Údaraithe +settings.authorization_header_desc=Cuirfear san áireamh mar cheanntásc údaraithe d'iarratais nuair a bheidh ann Samplaí: %s. +settings.active=Gníomhach +settings.active_helper=Seolfar faisnéis faoi imeachtaí spreagtha chuig an URL Crúca Gréasán seo. +settings.add_hook_success=Cuireadh an Crúca Gréasán leis. +settings.update_webhook=Nuashonraigh Crúca Gréasán +settings.update_hook_success=Nuashonraíodh an Crúca Gréasán. +settings.delete_webhook=Bain Crúca Gréasán +settings.recent_deliveries=Seachadtaí le déana +settings.hook_type=Cineál Crúca +settings.slack_token=Comhartha +settings.slack_domain=Fearann +settings.slack_channel=Cainéal +settings.add_web_hook_desc=Comhtháthaigh %s isteach i do stóras. +settings.web_hook_name_gitea=Gitea +settings.web_hook_name_gogs=Gogs +settings.web_hook_name_slack=Slack +settings.web_hook_name_discord=Discord +settings.web_hook_name_dingtalk=DingTalk +settings.web_hook_name_telegram=Teileagram +settings.web_hook_name_matrix=Maitrís +settings.web_hook_name_msteams=Microsoft Teams +settings.web_hook_name_feishu_or_larksuite=Feishu / Lark Suite +settings.web_hook_name_feishu=Feishu +settings.web_hook_name_larksuite=Lark Suite +settings.web_hook_name_wechatwork=WeCom (Wechat Work) +settings.web_hook_name_packagist=Packagist +settings.packagist_username=Ainm úsáideora Pacagist +settings.packagist_api_token=Comhartha API +settings.packagist_package_url=URL pacáiste Packagist +settings.deploy_keys=Eochracha a imscaradh +settings.add_deploy_key=Cuir Eochair Imscartha leis +settings.deploy_key_desc=Tá rochtain tarraingthe léite amháin ag eochracha imscartha ar an stóras. +settings.is_writable=Cumasaigh Rochtain Scríobh +settings.is_writable_info=Lig don eochair imlonnaithe seo a bhrú chuig an stóras. +settings.no_deploy_keys=Níl aon eochracha imscartha ann fós. +settings.title=Teideal +settings.deploy_key_content=Ábhar +settings.key_been_used=Tá eochair imscartha le hábhar comhionann in úsáid cheana féin. +settings.key_name_used=Tá eochair imscartha leis an ainm céanna ann cheana féin. +settings.add_key_success=Tá an eochair imlonnaithe "%s" curtha leis. +settings.deploy_key_deletion=Bain Eochair Imlonnaithe +settings.deploy_key_deletion_desc=Ag baint eochair imscartha, cuirfear a rochtain ar an stóras seo a chúlghairm. Lean ar aghaidh? +settings.deploy_key_deletion_success=Tá an eochair imscartha bainte amach. +settings.branches=Brainsí +settings.protected_branch=Cosaint Brainse +settings.protected_branch.save_rule=Sábháil Riail +settings.protected_branch.delete_rule=Scrios Riail +settings.protected_branch_can_push=Ceadaigh bhrú? +settings.protected_branch_can_push_yes=Is féidir leat a bhrú +settings.protected_branch_can_push_no=Ní féidir leat a bhrú +settings.branch_protection=Rialacha Cosanta Brainse do Bhrainse '%s' +settings.protect_this_branch=Cumasaigh Cosaint Brainse +settings.protect_this_branch_desc=Cosc ar scriosadh agus cuireann sé srian le Git a bhrú agus a chumasc go dtí an brainse. +settings.protect_disable_push=Díchumasaigh Brúigh +settings.protect_disable_push_desc=Ní cheadfar aon bhrú chuig an mbrainse seo. +settings.protect_disable_force_push=Díchumasaigh Fórsa Brú +settings.protect_disable_force_push_desc=Ní cheadfar aon fhórsa a bhrú chuig an mbrainse seo. +settings.protect_enable_push=Cumasaigh Brúigh +settings.protect_enable_push_desc=Beidh cead ag aon duine a bhfuil rochtain scríofa aige/aici brú chuig an mbrainse seo (ach gan brú a bhrú). +settings.protect_enable_force_push_all=Cumasaigh Fórsa Brúigh +settings.protect_enable_force_push_all_desc=Beidh cead ag duine ar bith a bhfuil rochtain brú aige brú a chur ar an mbrainse seo. +settings.protect_enable_force_push_allowlist=Brú Fórsa Srianta ón Liosta Ceadaithe +settings.protect_enable_force_push_allowlist_desc=Ní cheadófar ach d’úsáideoirí liostaithe nó foirne a bhfuil rochtain bhrú acu brú a chur ar an mbrainse seo. +settings.protect_enable_merge=Cumasaigh Cumaisc +settings.protect_enable_merge_desc=Beidh cead ag aon duine a bhfuil rochtain scríofa aige na hiarratais tarraingte a chumasc leis an mbrainse seo. +settings.protect_whitelist_committers=Brú Srianta ón Liosta Ceadaithe +settings.protect_whitelist_committers_desc=Ní bheidh cead ach úsáideoirí nó foirne liostaithe ceadaithe brú chuig an mbrainse seo (ach gan brú a chur i bhfeidhm). +settings.protect_whitelist_deploy_keys=Eochracha imscartha ón Liosta Ceadaithe le rochtain scríofa chun brú. +settings.protect_whitelist_users=Úsáideoirí ar an Liosta Ceadaithe chun brú a dhéanamh: +settings.protect_whitelist_teams=Foirne ar an Liosta Ceadaithe chun brú a dhéanamh: +settings.protect_force_push_allowlist_users=Úsáideoirí ar an Liosta Ceadaithe le haghaidh brú fórsa a dhéanamh: +settings.protect_force_push_allowlist_teams=Foirne ar an Liosta Ceadaithe le haghaidh brú fórsa a dhéanamh: +settings.protect_force_push_allowlist_deploy_keys=Eochracha imscaradh le rochtain brú ar an Liosta Ceadaithe le haghaidh brú fórsa a dhéanamh. +settings.protect_merge_whitelist_committers=Cumasaigh Liosta Ceadaithe Cumaisc +settings.protect_merge_whitelist_committers_desc=Ní lig ach d'úsáideoirí nó d'fhoirne liostaithe iarratais tarraingthe isteach sa bhrainse seo a chumasc. +settings.protect_merge_whitelist_users=Úsáideoirí ar an Liosta Ceadaithe le haghaidh cumasc: +settings.protect_merge_whitelist_teams=Foirne ar an Liosta Ceadaithe le haghaidh cumasc: +settings.protect_check_status_contexts=Cumasaigh Seiceáil Stádas +settings.protect_status_check_patterns=Patrúin seiceála stádais: +settings.protect_status_check_patterns_desc=Iontráil patrúin chun a shonrú cé na seiceálacha stádais a chaithfidh pas a fháil sular féidir brainsí a chumasc le brainse a chomhoibríonn leis an riail seo. Sonraíonn gach líne patrún. Ní féidir patrúin a bheith folamh. +settings.protect_check_status_contexts_desc=A cheangal ar sheiceálacha stádais pas a fháil roimh chumasc. Nuair a bheidh sé cumasaithe, ní mór gealltanais a bhrú ar dtús chuig brainse eile, ansin iad a chumasc nó a bhrú go díreach chuig brainse a thagann leis an riail seo tar éis do sheiceálacha stádais a bheith caite. Mura ndéantar comhthéacs ar bith a mheaitseáil, ní mór go n-éireodh leis an ngealltanas deiridh beag beann ar an gcomhthéacs. +settings.protect_check_status_contexts_list=Seiceálacha stádais a fuarthas sa tseachtain seo caite don stóras seo +settings.protect_status_check_matched=Comhoiriúnach +settings.protect_invalid_status_check_pattern=Patrún seiceála stádais neamhbhailí: "%s". +settings.protect_no_valid_status_check_patterns=Gan aon phatrúin seiceála stádais bailí. +settings.protect_required_approvals=Ceaduithe riachtanacha: +settings.protect_required_approvals_desc=Ná lig ach iarratas tarraingthe a chumasc le go leor ceaduithe riachtanacha. Tá ceaduithe riachtanacha ó úsáideoirí nó foirne atá ar an liosta ceadaithe nó ó aon duine a bhfuil rochtain scríofa acu. +settings.protect_approvals_whitelist_enabled=Ceaduithe a theorannú le húsáideoirí nó foirne liostaithe +settings.protect_approvals_whitelist_enabled_desc=Ní dhéanfar ach léirmheasanna ó úsáideoirí nó foirne ceadaithe a áireamh chuig na formheasanna riachtanacha. Gan liosta ceadaithe formheasa, áireofar léirmheasanna ó aon duine a bhfuil rochtain scríofa acu ar na ceaduithe riachtanacha. +settings.protect_approvals_whitelist_users=Léirmheastóirí ón Liosta Ceadaithe: +settings.protect_approvals_whitelist_teams=Foirne ar an Liosta Ceadaithe le haghaidh athbhreithnithe: +settings.dismiss_stale_approvals=Déan seancheaduithe a dhíbhe +settings.dismiss_stale_approvals_desc=Nuair a bhrúitear gealltanais nua a athraíonn ábhar an iarratais tarraingthe chuig an mbrainse, déanfar sean-cheaduithe a dhíchur. +settings.ignore_stale_approvals=Déan neamhaird de sheancheaduithe +settings.ignore_stale_approvals_desc=Ná cuir faomhadh a rinneadh ar ghealltanais níos sine (athbhreithnithe seanchaite) san áireamh i dtreo cé mhéad faomhadh atá ag an PR. Ní bhaineann le hábhar má dhéantar athbhreithnithe seanchaite a dhíbhe cheana féin. +settings.require_signed_commits=Ceangaltais Sínithe a cheangal +settings.require_signed_commits_desc=Diúltaigh brú chuig an mbrainse seo má tá siad neamhshínithe nó neamh-fhíoraithe. +settings.protect_branch_name_pattern=Patrún Ainm Brainse Cosanta +settings.protect_branch_name_pattern_desc=Patrúin ainmneacha brainse faoi chosaint. Féach an cháipéisíocht le haghaidh comhréire patrún. Samplaí: príomh, scaoileadh/** +settings.protect_patterns=Patrúin +settings.protect_protected_file_patterns=Patrúin comhaid faoi chosaint (scartha ag baint úsáide as leathchóilín ';'): +settings.protect_protected_file_patterns_desc=Ní cheadaítear comhaid chosanta a athrú go díreach fiú má tá cearta ag an úsáideoir comhaid sa bhrainse seo a chur leis, a chur in eagar nó a scriosadh. Is féidir patrúin iolracha a dheighilt trí úsáid a bhaint as leathstad (';'). Féach ar %[2]s do chomhréir phatrúin. Samplaí: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=Patrúin comhaid gan chosaint (scartha ag baint úsáide as leathchóilín ';'): +settings.protect_unprotected_file_patterns_desc=Comhaid gan chosaint a cheadaítear a athrú go díreach má tá rochtain scríofa ag an úsáideoir, ag seachaint srianadh brú. Is féidir patrúin iolracha a dheighilt trí úsáid a bhaint as leathstad (';'). Féach ar %[2]s do chomhréir phatrúin. Samplaí: .drone.yml, /docs/**/*.txt. +settings.add_protected_branch=Cumasaigh cosaint +settings.delete_protected_branch=Díchumasaigh cosaint +settings.update_protect_branch_success=Tá cosaint brainse don riail "%s" nuashonraithe. +settings.remove_protected_branch_success=Baineadh cosaint brainse don riail "%s". +settings.remove_protected_branch_failed=Theip ar riail cosanta brainse "%s" a bhaint. +settings.protected_branch_deletion=Scrios Cosaint Brainse +settings.protected_branch_deletion_desc=Ligeann cosaint brainse a dhíchumasú d'úsáideoirí a bhfuil cead scríofa acu brú chuig an mbrainse. Lean ar aghaidh? +settings.block_rejected_reviews=Cuir bac ar chumasc ar léirmheasanna diúltaithe +settings.block_rejected_reviews_desc=Ní bheidh cumasc indéanta nuair a iarrann athbhreithnithe oifigiúla athruithe, fiú má tá go leor ceadaithe ann. +settings.block_on_official_review_requests=Cuir bac ar chumasc ar iarratais ar athbhreithniú oifigiúil +settings.block_on_official_review_requests_desc=Ní bheidh sé indéanta cumasc nuair a bhíonn iarratais oifigiúla ar athbhreithniú aige, fiú má tá go leor ceadaithe ann. +settings.block_outdated_branch=Cuir bac ar chumasc má tá an t-iarratas tarraingthe as dáta +settings.block_outdated_branch_desc=Ní bheidh cumasc indéanta nuair a bhíonn ceannbhrainse taobh thiar de bhronnbhrainse. +settings.default_branch_desc=Roghnaigh brainse stóras réamhshocraithe le haghaidh iarratas tarraingte agus geallann an cód: +settings.merge_style_desc=Stíleanna Cumaisc +settings.default_merge_style_desc=Stíl Cumaisc Réamhshocraithe +settings.choose_branch=Roghnaigh brainse… +settings.no_protected_branch=Níl aon bhrainsí cosanta ann. +settings.edit_protected_branch=Cuir in eagar +settings.protected_branch_required_rule_name=Ainm riail riachtanach +settings.protected_branch_duplicate_rule_name=Ainm riail dúblach +settings.protected_branch_required_approvals_min=Ní féidir ceaduithe riachtanacha a bheith diúltach. +settings.tags=Clibeanna +settings.tags.protection=Cosaint Clib +settings.tags.protection.pattern=Patrún Clib +settings.tags.protection.allowed=Ceadaithe +settings.tags.protection.allowed.users=Úsáideoirí ceadaithe +settings.tags.protection.allowed.teams=Foirne ceadaithe +settings.tags.protection.allowed.noone=Níl aon duine +settings.tags.protection.create=Clib a chosaint +settings.tags.protection.none=Níl aon chlibeanna cosanta ann. +settings.tags.protection.pattern.description=Is féidir leat ainm amháin nó patrún glob nó slonn rialta a úsáid chun clibeanna iolracha a mheaitseáil. Léigh tuilleadh sa treoir na gclibeanna cosanta. +settings.bot_token=Comhartha Bota +settings.chat_id=ID Comhrá +settings.thread_id=ID Snáithe +settings.matrix.homeserver_url=URL sheirbhíse baile +settings.matrix.room_id=ID seomra +settings.matrix.message_type=Cineál teachtaireachta +settings.visibility.private.button=Déan Príobháideach +settings.visibility.private.text=Ní amháin go gcuirfidh an infheictheacht a athrú go príobháideach an repo infheicthe amháin do bhaill cheadaithe ach féadfaidh sé an gaol idir é agus forcanna, féachadóirí agus réaltaí a bhaint. +settings.visibility.private.bullet_title=An infheictheacht a athrú go toil phríobháide +settings.visibility.private.bullet_one=Déan an stóras infheicthe do chomhaltaí ceadaithe amháin. +settings.visibility.private.bullet_two=B’fhéidir go mbainfear an gaol idir é agus forcanna, faireoirí, agus réaltaí. +settings.visibility.public.button=Déan Poiblí +settings.visibility.public.text=Má athraíonn an infheictheacht don phobal, beidh an stóras le feiceáil do dhuine ar bith. +settings.visibility.public.bullet_title=Athróidh an infheictheacht go poiblí: +settings.visibility.public.bullet_one=Déan an repo le feiceáil do dhuine ar bith. +settings.visibility.success=Athraigh infheictheacht stóras. +settings.visibility.error=Tharla earráid agus tú ag iarraidh infheictheacht an stóras a athrú. +settings.visibility.fork_error=Ní féidir infheictheacht stóras forcáilte a athrú. +settings.archive.button=Cartlann Stóras +settings.archive.header=Cartlann an Stóras seo +settings.archive.text=Má dhéantar an stóras a chartlannú, beidh sé léite go hiomlán amháin. Beidh sé i bhfolach ón bpainéal. Aon duine (ní fiú tú!) beidh siad in ann tiomantas nua a dhéanamh, nó aon saincheisteanna nó iarratais a tharraingt a oscailt. +settings.archive.success=Rinneadh an stóras a chartlannú go rathúil. +settings.archive.error=Tharla earráid agus tú ag iarraidh an stóras a chartlannú. Féach an logáil le haghaidh tuilleadh sonraí. +settings.archive.error_ismirror=Ní féidir leat stóras scátháin a chartlannú. +settings.archive.branchsettings_unavailable=Níl socruithe brainse ar fáil má tá an stóras i gcartlann. +settings.archive.tagsettings_unavailable=Níl socruithe clibeanna ar fáil má tá an stóras i gcartlann. +settings.archive.mirrors_unavailable=Níl scátháin ar fáil má tá an stóras i gcartlann. +settings.unarchive.button=Stóras gan cartlann +settings.unarchive.header=Díchartlannaigh an stóras seo +settings.unarchive.text=Beidh an stóras a dhícheangal ag athghairm a chumas chun tiomanta agus brúigh a fháil, chomh maith le fadhbanna nua agus iarratais tarraing. +settings.unarchive.success=Rinneadh an stóras a dhíchartlann go rathúil. +settings.unarchive.error=Tharla earráid agus tú ag iarraidh an stóras a dhíchartlannú. Féach an logáil le haghaidh tuilleadh sonraí. +settings.update_avatar_success=Nuashonraíodh avatar an stóras. +settings.lfs=LFS +settings.lfs_filelist=Comhaid LFS a stóráiltear sa stóras seo +settings.lfs_no_lfs_files=Níl aon chomhaid LFS stóráilte sa stóras seo +settings.lfs_findcommits=Aimsigh gealltanais +settings.lfs_lfs_file_no_commits=Níor aimsíodh aon ghealltanais don chomhad LFS seo +settings.lfs_noattribute=Níl an tréith inghlasáilte sa bhrainse réamhshocraithe ag an gcosán seo +settings.lfs_delete=Scrios comhad LFS le OID %s +settings.lfs_delete_warning=D'fhéadfadh earráidí 'níl réad ann 'ar an tseiceáil a bheith ina chúis le comhad LFS a scriosadh. An bhfuil tú cinnte? +settings.lfs_findpointerfiles=Faigh comhaid pointeora +settings.lfs_locks=Glais +settings.lfs_invalid_locking_path=Cosan neamhbhailí: %s +settings.lfs_invalid_lock_directory=Ní féidir eolaire a ghlasáil: %s +settings.lfs_lock_already_exists=Tá an glas ann cheana féin: %s +settings.lfs_lock=Glas +settings.lfs_lock_path=Cosán comhad le haghaidh glasáil... +settings.lfs_locks_no_locks=Gan Glais +settings.lfs_lock_file_no_exist=Níl an comhad faoi ghlas sa bhrainse réamhshocraithe +settings.lfs_force_unlock=Díghlasáil Fórsa +settings.lfs_pointers.found=Aimsíodh %d pointeoir(í) blob - %d bainteach, %d neamhghaolmhar (%d in easnamh ón siopa) +settings.lfs_pointers.sha=SHA Blob +settings.lfs_pointers.oid=OID +settings.lfs_pointers.inRepo=I Stóras +settings.lfs_pointers.exists=Ann sa siopa +settings.lfs_pointers.accessible=Inrochtana don Úsáideoir +settings.lfs_pointers.associateAccessible=Comhlach %d OID inrochtana +settings.rename_branch_failed_exist=Ní féidir brainse a athainmniú toisc go bhfuil spriocbhrainse %s ann. +settings.rename_branch_failed_not_exist=Ní féidir brainse %s a athainmniú toisc nach bhfuil sé ann. +settings.rename_branch_success=Ainmníodh brainse %s go rathúil go %s. +settings.rename_branch_from=sean-ainm brainse +settings.rename_branch_to=ainm brainse nua +settings.rename_branch=Athainmnigh brainse + +diff.browse_source=Brabhsáil Foinse +diff.parent=tuismitheoir +diff.commit=tiomantas +diff.git-notes=Nótaí +diff.data_not_available=Níl Ábhar Difríochtaí Ar Fáil +diff.options_button=Roghanna Diff +diff.show_diff_stats=Taispeáin Staitisticí +diff.download_patch=Íoslódáil an comhad paiste +diff.download_diff=Íoslódáil Comhad Diff +diff.show_split_view=Amharc Scoilt +diff.show_unified_view=Amharc Aontaithe +diff.whitespace_button=Spás bán +diff.whitespace_show_everything=Taispeáin gach athrú +diff.whitespace_ignore_all_whitespace=Déan neamhaird de spás bán nuair a dhéantar comparáid idir línte +diff.whitespace_ignore_amount_changes=Déan neamhaird de athruithe ar an méid spás bán +diff.whitespace_ignore_at_eol=Déan neamhaird ar athruithe ar spás bán ag EOL +diff.stats_desc=D'athraigh %d comhad le %d breiseanna agus %d scriosta +diff.stats_desc_file=%d athruithe: %d breiseanna agus scriosadh %d +diff.bin=BRUSCAIR +diff.bin_not_shown=Ní thaispeántar comhad dénártha. +diff.view_file=Féach ar an gComhad +diff.file_before=Roimhe +diff.file_after=Tar éis +diff.file_image_width=Leithead +diff.file_image_height=Airde +diff.file_byte_size=Méid +diff.file_suppressed=Tá difríocht comhad cosc orthu toisc go bhfuil sé ró-mhór +diff.file_suppressed_line_too_long=Cuirtear difríocht comhad faoi chois toisc go bhfuil líne amháin nó níos mó rófhada +diff.too_many_files=Níor taispeánadh roinnt comhad mar go bhfuil an iomarca comhad athraithe sa difríocht seo +diff.show_more=Taispeáin Tuilleadh +diff.load=Difríocht Luchtaigh +diff.generated=a ghintear +diff.vendored=curtha ar fáil +diff.comment.add_line_comment=Cuir trácht líne leis +diff.comment.placeholder=Fág trácht +diff.comment.markdown_info=Tacaítear le stíliú le marcáil. +diff.comment.add_single_comment=Cuir trácht aonair leis +diff.comment.add_review_comment=Cuir trácht leis +diff.comment.start_review=Tosaigh athbhreithniú +diff.comment.reply=Freagra +diff.review=Léirmheas +diff.review.header=Cuir isteach léirmheas +diff.review.placeholder=Trácht athbhreithnithe diff.review.comment=Trácht - - -branch.branch_already_exists=Tá brainse "%s" ann cheana féin sa stóras seo. - - - - - +diff.review.approve=Ceadú +diff.review.self_reject=Ní féidir le húdair iarratais tarraing athruithe a iarraidh ar a n-iarratas tarraingthe +diff.review.reject=Iarr athruithe +diff.review.self_approve=Ní féidir le húdair iarratais tarraing a n-iarratas tarraingthe féin a chead +diff.committed_by=tiomanta ag +diff.protected=Cosanta +diff.image.side_by_side=Taobh le Taobh +diff.image.swipe=Scaoil +diff.image.overlay=Forleagan +diff.has_escaped=Tá carachtair Unicode i bhfolach ag an líne seo +diff.show_file_tree=Taispeáin crann comhad +diff.hide_file_tree=Folaigh crann comhad + +releases.desc=Rian leaganacha tionscadal agus íoslódálacha. +release.releases=Eisiúintí +release.detail=Sonraí eisithe +release.tags=Clibeanna +release.new_release=Scaoileadh Nua +release.draft=Dréacht +release.prerelease=Réamh-eisiúint +release.stable=Cobhsaí +release.compare=Déan comparáid +release.edit=cuir in eagar +release.ahead.commits=Geallann %d +release.ahead.target=go %s ón scaoileadh seo +tag.ahead.target=chuig %s ón gclib seo +release.source_code=Cód Foinse +release.new_subheader=Eagraíonn eiseachtaí leaganacha tionscadail +release.edit_subheader=Eagraíonn eisiúintí leaganacha tionscadal. +release.tag_name=Ainm chlib +release.target=Sprioc +release.tag_helper=Roghnaigh clib atá ann cheana nó cruthaigh clib nua. +release.tag_helper_new=Clib nua. Cruthófar an chlib seo ón sprioc. +release.tag_helper_existing=Clib atá ann cheana. +release.title=Teideal scaoileadh +release.title_empty=Ní féidir leis an teideal a bheith folamh. +release.message=Déan cur síos ar an eisiúint seo +release.prerelease_desc=Marcáil mar Réamh-eisiúint +release.prerelease_helper=Marcáil an scaoileadh seo mí-oiriúnach le húsáid táirgeachta. +release.cancel=Cealaigh +release.publish=Foilsigh Eisiúint +release.save_draft=Sábháil Dréacht +release.edit_release=Eisiúint Nuashonraithe +release.delete_release=Scrios Scaoilte +release.delete_tag=Scrios Clib +release.deletion=Scrios Scaoilte +release.deletion_desc=Ní bhíonn scaoileadh ag scriosadh ach é ó Gitea. Ní dhéanfaidh sé difear do chlib Git, ar ábhar do stóras nó ar a stair. Lean ar aghaidh? +release.deletion_success=Tá an scaoileadh scriosta. +release.deletion_tag_desc=Scriosfar an chlib seo ón stóras. Ní athraítear inneachar agus stair na stórtha. Lean ort? +release.deletion_tag_success=Tá an chlib scriosta. +release.tag_name_already_exist=Tá eisiúint leis an ainm clib seo ann cheana féin. +release.tag_name_invalid=Níl ainm an chlib bailí. +release.tag_name_protected=Tá ainm an chlib cosanta. +release.tag_already_exist=Tá an t-ainm clib seo ann cheana féin. +release.downloads=Íoslódálacha +release.download_count=Íoslódálacha: %s +release.add_tag_msg=Úsáid teideal agus ábhar an eisiúna mar theachtaireacht chlibe. +release.add_tag=Cruthaigh Clib Amháin +release.releases_for=Eisiúintí do %s +release.tags_for=Clibeanna do %s + +branch.name=Ainm Brainse +branch.already_exists=Tá brainse leis an ainm "%s" ann cheana féin. +branch.delete_head=Scrios +branch.delete=`Scrios Brainse "%s"` +branch.delete_html=Scrios Brainse +branch.delete_desc=Tá brainse a scriosadh buan. Cé go bhféadfadh an brainse scriosta leanúint ar aghaidh ag bheith ann ar feadh tréimhse ghearr sula mbaintear í i ndáiríre, NÍ FÉIDIR é a dhíchur i bhformhór Lean ar aghaidh? +branch.deletion_success=Tá brainse "%s" scriosta. +branch.deletion_failed=Theip ar scriosadh brainse "%s". +branch.delete_branch_has_new_commits=Ní féidir brainse “%s” a scriosadh toisc go bhfuil tiomáintí nua curtha leis tar éis a chumasc. +branch.create_branch=Cruthaigh brainse %s +branch.create_from=`ó "%s"` +branch.create_success=Tá brainse "%s" cruthaithe. +branch.branch_already_exists=Tá brainse "%s" sa stóras seo cheana. +branch.branch_name_conflict=Tagann an t-ainm brainse "%s" leis an mbrainse "%s" atá ann cheana féin. +branch.tag_collision=Ní féidir brainse "%s" a chruthú mar tá clib leis an ainm céanna sa stóras cheana féin. +branch.deleted_by=Scriosta ag %s +branch.restore_success=Tá brainse "%s" curtha ar ais. +branch.restore_failed=Theip ar chur ar ais brainse "%s". +branch.protected_deletion_failed=Tá brainse "%s" cosanta. Ní féidir é a scriosadh. +branch.default_deletion_failed=Is é brainse "%s" an brainse réamhshocraithe. Ní féidir é a scriosadh. +branch.restore=`Athchóirigh Brainse "%s"` +branch.download=`Brainse Íosluchtaithe "%s"` +branch.rename=`Athainmnigh Brainse "%s"` +branch.included_desc=Tá an brainse seo mar chuid den bhrainse réamhshocraithe +branch.included=San áireamh +branch.create_new_branch=Cruthaigh brainse ón mbrainse: +branch.confirm_create_branch=Cruthaigh brainse +branch.warning_rename_default_branch=Tá tú ag athainmniú an bhrainse réamhshocraithe. +branch.rename_branch_to=Athainmnigh "%s" go: +branch.confirm_rename_branch=Athainmnigh brainse +branch.create_branch_operation=Cruthaigh brainse +branch.new_branch=Cruthaigh brainse nua +branch.new_branch_from=`Cruthaigh brainse nua ó "%s"` +branch.renamed=Ainmníodh brainse %s go %s. + +tag.create_tag=Cruthaigh clib %s +tag.create_tag_operation=Cruthaigh clib +tag.confirm_create_tag=Cruthaigh clib +tag.create_tag_from=`Cruthaigh clib nua ó "%s"` + +tag.create_success=Tá clib "%s" cruthaithe. + +topic.manage_topics=Bainistigh topaicí +topic.done=Déanta +topic.count_prompt=Ní féidir leat níos mó ná 25 topaicí a roghnú +topic.format_prompt=Ní mór do thopaicí tosú le litir nó uimhir, is féidir daiseanna ('-') agus poncanna ('.') a áireamh, a bheith suas le 35 carachtar ar fad. Ní mór litreacha a bheith i litreacha beaga. + +find_file.go_to_file=Téigh go dtí an comhad +find_file.no_matching=Níl aon chomhad meaitseála le fáil + +error.csv.too_large=Ní féidir an comhad seo a rinneadh toisc go bhfuil sé ró-mhór. +error.csv.unexpected=Ní féidir an comhad seo a rindreáil toisc go bhfuil carachtar ann gan súil leis i líne %d agus i gcolún %d. +error.csv.invalid_field_count=Ní féidir an comhad seo a rindreáil toisc go bhfuil líon mícheart réimsí i líne %d. +error.broken_git_hook=Is cosúil go bhfuil crúcaí git den stór seo briste. Lean an doiciméadúchán chun iad a cheartú, ansin brúigh roinnt gealltanas chun an stádas a athnuachan. [graphs] +component_loading=Á lódáil %s... +component_loading_failed=Ní fhéadfaí %s a luchtú +component_loading_info=Seans go dtógfaidh sé seo beagán… +component_failed_to_load=Tharla earráid gan choinne. +code_frequency.what=minicíocht cód +contributors.what=ranníocaíochtaí +recent_commits.what=tiomantáin le déanaí [org] +org_name_holder=Ainm na hEagraíochta +org_full_name_holder=Ainm iomlán na hEagraíochta +org_name_helper=Ba cheart go mbeadh ainmneacha eagraíochta gearr agus i gcuimhne. +create_org=Cruthaigh Eagraíocht +repo_updated=Nuashonraithe +members=Comhaltaí +teams=Foirne +code=Cód +lower_members=comhaltaí +lower_repositories=stórais +create_new_team=Foireann Nua +create_team=Cruthaigh Foireann +org_desc=Cur síos +team_name=Ainm Foirne +team_desc=Cur síos +team_name_helper=Ba chóir go mbeadh ainmneacha foirne gearr agus i gcuimhne. +team_desc_helper=Déan cur síos ar chuspóir nó ról na foirne. +team_access_desc=Rochtain stórais +team_permission_desc=Cead +team_unit_desc=Ceadaigh Rochtain ar Rannóga Stóras +team_unit_disabled=(Díchumasaithe) + +form.name_reserved=Tá an t-ainm eagraíochta "%s" curtha in áirithe. +form.name_pattern_not_allowed=Ní cheadaítear an patrún "%s" in ainm eagraíochta. +form.create_org_not_allowed=Níl cead agat eagraíocht a chruthú. +settings=Socruithe +settings.options=Eagraíocht +settings.full_name=Ainm Iomlán +settings.email=Ríomhphost Teagmhála +settings.website=Láithreán Gréasáin +settings.location=Suíomh +settings.permission=Ceadanna +settings.repoadminchangeteam=Is féidir le riarthóir an stórais rochtain d'fhoirne a chur leis agus a bhaint +settings.visibility=Infheictheacht +settings.visibility.public=Poiblí +settings.visibility.limited=Teoranta (Infheicthe d'úsáideoirí fíordheimhnithe amháin) +settings.visibility.limited_shortname=Teoranta +settings.visibility.private=Príobháideach (Infheicthe amháin do bhaill eagraíochta) +settings.visibility.private_shortname=Príobháideach - - - - +settings.update_settings=Nuashonrú Socruithe +settings.update_setting_success=Nuashonraíodh socruithe eagraíochta. +settings.change_orgname_prompt=Nóta: Athróidh ainm na heagraíochta ag athrú URL d'eagraíochta agus saorfar an sean-ainm. +settings.change_orgname_redirect_prompt=Déanfaidh an sean-ainm a atreorú go dtí go n-éilítear é. +settings.update_avatar_success=Nuashonraíodh avatar na heagraíochta. +settings.delete=Scrios Eagraíocht +settings.delete_account=Scrios an Eagraíocht seo +settings.delete_prompt=Bainfear an eagraíocht go buan. NÍ FÉIDIR é seo a chealú! +settings.confirm_delete_account=Deimhnigh scriosadh +settings.delete_org_title=Scrios Eagraíocht +settings.delete_org_desc=Scriosfar an eagraíocht seo go buan. Lean ar aghaidh? +settings.hooks_desc=Cuir crúcaí gréasán in leis a spreagfar do gach stóras faoin eagraíocht seo. + +settings.labels_desc=Cuir lipéid leis ar féidir iad a úsáid ar shaincheisteanna do gach stóras faoin eagraíocht seo. + +members.membership_visibility=Infheictheacht Ballraíochta: +members.public=Infheicthe +members.public_helper=dhéanamh i bhfolach +members.private=I bhfolach +members.private_helper=a dhéanamh le feiceáil +members.member_role=Ról Comhalta: +members.owner=Úinéir +members.member=Comhalta +members.remove=Bain +members.remove.detail=Bain %[1]s de %[2]s? +members.leave=Fágáil +members.leave.detail=Fág %s? +members.invite_desc=Cuir ball nua le %s: +members.invite_now=Tabhair cuireadh Anois + +teams.join=Bígí +teams.leave=Fág +teams.leave.detail=Fág %s? +teams.can_create_org_repo=Cruthaigh stórais +teams.can_create_org_repo_helper=Is féidir le baill stóras nua a chruthú san eagraíocht. Gheobhaidh an cruthaitheoir rochtain riarthóra ar an stóras nua. +teams.none_access=Gan Rochtain +teams.none_access_helper=Ní féidir le baill aon ghníomhaíocht eile a fheiceáil nó a dhéanamh ar an aonad seo. Níl aon éifeacht aige ar stórais phoiblí. +teams.general_access=Rochtain Ginearálta +teams.general_access_helper=Déanfar ceadanna baill a chinneadh ag an tábla ceadanna thíos. +teams.read_access=Léigh +teams.read_access_helper=Is féidir le baill stórais foirne a fheiceáil agus a chlónáil. +teams.write_access=Scríobh +teams.write_access_helper=Is féidir le baill léamh agus brú chuig stórais foirne. +teams.admin_access=Rochtain Riarthóra +teams.admin_access_helper=Is féidir le baill tarraingt agus brú chuig stórais foirne agus comhoibritheoirí a chur leo. +teams.no_desc=Níl aon tuairisc ag an bhfoireann seo +teams.settings=Socruithe +teams.owners_permission_desc=Tá rochtain iomlán ag úinéirí ar gach stórais agus tá rochtain ag an riarthóir ar an eagraíocht. +teams.members=Baill Foirne +teams.update_settings=Nuashonrú Socruithe +teams.delete_team=Scrios Foireann +teams.add_team_member=Cuir Comhalta Foirne leis +teams.invite_team_member=Tabhair cuireadh chuig %s +teams.invite_team_member.list=Cuirí ar Feitheamh +teams.delete_team_title=Scrios Foireann +teams.delete_team_desc=Cúlghairtear rochtain stórais óna baill a scriosadh foirne. Lean ar aghaidh? +teams.delete_team_success=Tá an fhoireann scriosta. +teams.read_permission_desc=Deonaíonn an fhoireann seo rochtain Léamh: is féidir le baill stórtha foirne a fheiceáil agus a chlónáil. +teams.write_permission_desc=Tugann an fhoireann seo rochtain do Scríobh: is féidir le baill léamh ó stórtha foirne agus iad a bhrú chucu. +teams.admin_permission_desc=Tugann an fhoireann seo rochtain do Riarachán: is féidir le baill léamh ó stórtha foirne, brú chucu agus cur leo. +teams.create_repo_permission_desc=Ina theannta sin, tugann an fhoireann seo cead Cruthaigh Stóras: is féidir le baill stórtha nua a chruthú san eagraíocht. +teams.repositories=Stórais Foirne +teams.remove_all_repos_title=Bain gach stórais foirne +teams.remove_all_repos_desc=Bainfidh sé seo gach stórais ón bhfoireann. +teams.add_all_repos_title=Cuir gach stórais leis +teams.add_all_repos_desc=Cuirfidh sé seo stórais uile na heagraíochta leis an bhfoireann. +teams.add_nonexistent_repo=Níl an stóras atá tú ag iarraidh a chur leis ann, cruthaigh é ar dtús. +teams.add_duplicate_users=Is ball foirne é an úsáideoir cheana féin. +teams.repos.none=Ní raibh rochtain ag an bhfoireann seo ar aon stóras. +teams.members.none=Níl aon bhaill ar an bhfoireann seo. +teams.members.blocked_user=Ní féidir an t-úsáideoir a chur leis toisc go bhfuil an eagraíocht bac air. +teams.specific_repositories=Stórais Sonrach +teams.specific_repositories_helper=Ní bheidh rochtain ag comhaltaí ach ar stórtha a cuireadh leis an bhfoireann go sainráite. Ní bhainfear na stórtha a cuireadh leis cheana le Gach stóras go huathoibríoch trí é seo a roghnú. +teams.all_repositories=Gach stórais +teams.all_repositories_helper=Tá rochtain ag an bhfoireann ar gach stórais. Má roghnaíonn sé seo, cuirfear na stórais go léir atá ann cheana leis an bhfoireann. +teams.all_repositories_read_permission_desc=Tugann an fhoireann seo rochtain do Léamh ar gach stórais: is féidir le baill amharc ar stórais agus iad a chlónáil. +teams.all_repositories_write_permission_desc=Tugann an fhoireann seo rochtain do Scríobh ar gach stórais: is féidir le baill léamh ó stórais agus iad a bhrú chucu. +teams.all_repositories_admin_permission_desc=Tugann an fhoireann seo rochtain Riarthóra ar gach stóras: is féidir le comhaltaí léamh, brú a dhéanamh agus comhoibritheoirí a chur le stórtha. +teams.invite.title=Tugadh cuireadh duit dul isteach i bhfoireann %s san eagraíocht %s. +teams.invite.by=Ar cuireadh ó %s +teams.invite.description=Cliceáil ar an gcnaipe thíos le do thoil chun dul isteach san fhoireann. [admin] - +maintenance=Cothabháil +dashboard=Deais +self_check=Féin-sheiceáil +identity_access=Féiniúlacht & Rochtain +users=Cuntais Úsáideora +organizations=Eagraíochtaí +assets=Sócmhainní Cód +repositories=Stórais +hooks=Crúcaí Gréasán +integrations=Comhtháthaithe +authentication=Foinsí Fíordheimhnithe +emails=Ríomhphoist Úsáideoirí +config=Cumraíocht +config_summary=Achoimre +config_settings=Socruithe +notices=Fógraí Córais +monitor=Monatóireacht +first_page=Ar dtús +last_page=Deiridh +total=Iomlán: %d +settings=Socruithe Riaracháin + +dashboard.new_version_hint=Tá Gitea %s ar fáil anois, tá %s á rith agat. Seiceáil an blag le haghaidh tuilleadh sonraí. +dashboard.statistic=Achoimre +dashboard.maintenance_operations=Oibríochtaí Cothabháil +dashboard.system_status=Stádas an Chórais +dashboard.operation_name=Ainm Oibríochta +dashboard.operation_switch=Athraigh +dashboard.operation_run=Rith +dashboard.clean_unbind_oauth=Glan naisc OAuth neamhcheangailte +dashboard.clean_unbind_oauth_success=Scriosadh gach nasc OAuth neamhcheangailte. +dashboard.task.started=Tasc Tosaigh: %[1]s +dashboard.task.process=Tasc: %[1]s +dashboard.task.cancelled=Tasc: %[1]s cealaithe: %[3]s +dashboard.task.error=Earráid sa Tasc: %[1]s: %[3]s +dashboard.task.finished=Tasc: Tá %[1]s tosaithe ag %[2]s críochnaithe +dashboard.task.unknown=Tasc anaithnid: %[1]s +dashboard.cron.started=Cron tosaithe: %[1]s +dashboard.cron.process=Cron: %[1]s +dashboard.cron.cancelled=Cron: %[1]s cealaithe: %[3]s +dashboard.cron.error=Earráid i gCron: %s: %[3]s +dashboard.cron.finished=Cron: %[1]s críochnaithe +dashboard.delete_inactive_accounts=Scrios gach cuntas neamhghníomhach +dashboard.delete_inactive_accounts.started=Tasc scriostha gach cuntas neamhghníomhachtaithe tosaithe. +dashboard.delete_repo_archives=Scrios gach cartlann stórais (ZIP, TAR.GZ, srl.) +dashboard.delete_repo_archives.started=Scrios gach tasc cartlann stórais a thosaigh. +dashboard.delete_missing_repos=Scrios gach stóras atá in easnamh ar a gcuid comhad Git +dashboard.delete_missing_repos.started=Scrios gach stóras atá in easnamh ar a dtasc comhaid Git a thosaigh. +dashboard.delete_generated_repository_avatars=Scrios abhatáranna stórtha ginte +dashboard.sync_repo_branches=Sync brainsí caillte ó shonraí git go bunachair sonraí +dashboard.sync_repo_tags=Clibeanna sioncraigh ó shonraí git go bunachar sonraí +dashboard.update_mirrors=Scátháin a nuashonrú dashboard.sync_repo_licenses=Sioncronaigh ceadúnais repo +users.full_name=Ainm Iomlán +users.list_status_filter.is_active=Gníomhach +orgs.teams=Foirne +repos.owner=Úinéir +packages.owner=Úinéir +defaulthooks=Réamhshocraithe Crúcaí Gréasán +defaulthooks.desc=Déanann Crúcaí Gréasán iarratais HTTP POST go huathoibríoch chuig freastalaí nuair a chuireann imeachtaí áirithe Gitea tús. Is mainneachtainí iad na cuacha gréasáin a shainítear anseo agus déanfar iad a chóipeáil isteach i ngach stórais nua. Léigh tuilleadh sa treoir chúca Crúcaí Gréasán. +defaulthooks.add_webhook=Cuir Crúca Gréasán Réamhshocraithe leis +defaulthooks.update_webhook=Nuashonraigh Réamhshocrú Crúca Gréasán +systemhooks=Córas Crúcaí Gréasán +systemhooks.desc=Déanann Crúcaí Gréasán iarratais HTTP POST go huathoibríoch chuig freastalaí nuair a chuireann imeachtaí áirithe Gitea tús. Gníomhóidh na Crúcaí Gréasán atá sainithe anseo ar gach stóras ar an gcóras, mar sin déan machnamh ar aon impleachtaí feidhmíochta a d’fhéadfadh a bheith aige seo. Léigh tuilleadh sa treoir chúca gréasáin. +systemhooks.add_webhook=Cuir Crúca Gréasán Córas leis +systemhooks.update_webhook=Nuashonraigh Córas Crúca Gréasán +auths.updated=Nuashonraithe +auths.domain=Fearann +config.webhook_config=Cumraíocht Crúca Gréasán @@ -2184,9 +2931,13 @@ dashboard.sync_repo_licenses=Sioncronaigh ceadúnais repo +monitor.desc=Cur síos +monitor.queue.settings.submit=Nuashonrú Socruithe +notices.system_notice_list=Fógraí Córais notices.operations=Oibríochtaí +notices.desc=Cur síos [action] @@ -2202,6 +2953,8 @@ notices.operations=Oibríochtaí [units] [packages] +alpine.repository.branches=Brainsí +alpine.repository.repositories=Stórais [secrets] @@ -2209,16 +2962,31 @@ notices.operations=Oibríochtaí +runners.description=Cur síos +runners.task_list.run=Rith runners.task_list.commit=Tiomantas +runners.status.active=Gníomhach +runners.reset_registration_token=Athshocraigh comhartha clár +runners.reset_registration_token_success=D'éirigh le hathshocrú comhartha clárúcháin an dara háit +runs.all_workflows=Gach Sreafaí Oibre runs.commit=Tiomantas +runs.scheduled=Sceidealaithe +runs.pushed_by=bhrú ag +runs.invalid_workflow_helper=Tá comhad cumraíochta sreabhadh oibre nebhailí. Seiceáil do chomhad cumraithe le do thoil: %s [projects] +type-3.display_name=Tionscadal Eagrúcháin [git.filemode] +changed_filemode=%[1]s → %[2]s ; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +directory=Eolaire +normal_file=Comhad gnáth +executable_file=Comhad infheidhmithe symbolic_link=Nasc siombalach +submodule=Fo-mhodúl diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 6f788737ff5b..41531f7b3de7 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -580,6 +580,8 @@ lang_select_error=Escolha um idioma da lista. username_been_taken=O nome de utilizador já foi tomado. username_change_not_local_user=Utilizadores que não são locais não têm permissão para mudar o nome de utilizador. +change_username_disabled=Alterar o nome de utilizador está desabilitado. +change_full_name_disabled=Alterar o nome completo está desabilitado. username_has_not_been_changed=O nome de utilizador não foi modificado repo_name_been_taken=O nome do repositório já foi usado. repository_force_private=Forçar Privado está habilitado: repositórios privados não podem ser tornados públicos. @@ -705,6 +707,8 @@ public_profile=Perfil público biography_placeholder=Conte-nos um pouco sobre si! (Pode usar Markdown) location_placeholder=Partilhe a sua localização aproximada com outros profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web. +password_username_disabled=Não tem permissão para alterar os nomes de utilizador deles/delas. Entre em contacto com o administrador para saber mais detalhes. +password_full_name_disabled=Não tem permissão para alterar o nome completo deles/delas. Entre em contacto com o administrador para saber mais detalhes. full_name=Nome completo website=Sítio web location=Localização From d6d3c96e6555fc91b3e2ef21f4d8d7475564bb3e Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 8 Oct 2024 17:51:09 +0800 Subject: [PATCH 15/41] Fix bug when a token is given public only (#32204) --- models/user/user.go | 4 + routers/api/packages/api.go | 14 +++ routers/api/v1/api.go | 131 ++++++++++++++-------- routers/api/v1/org/org.go | 2 +- routers/api/v1/repo/issue.go | 2 +- routers/api/v1/repo/repo.go | 7 +- routers/api/v1/user/user.go | 6 + services/context/api.go | 7 +- tests/integration/api_issue_test.go | 34 ++++++ tests/integration/api_repo_branch_test.go | 11 +- tests/integration/api_user_search_test.go | 13 +++ 11 files changed, 176 insertions(+), 55 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index f93fba8ae0ce..d5c4833cdefa 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -408,6 +408,10 @@ func (u *User) IsIndividual() bool { return u.Type == UserTypeIndividual } +func (u *User) IsUser() bool { + return u.Type == UserTypeIndividual || u.Type == UserTypeBot +} + // IsBot returns whether or not the user is of type bot func (u *User) IsBot() bool { return u.Type == UserTypeBot diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 0f42e8f59ebb..d17e4875b13a 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -63,6 +63,20 @@ func reqPackageAccess(accessMode perm.AccessMode) func(ctx *context.Context) { ctx.Error(http.StatusUnauthorized, "reqPackageAccess", "user should have specific permission or be a site admin") return } + + // check if scope only applies to public resources + publicOnly, err := scope.PublicOnly() + if err != nil { + ctx.Error(http.StatusForbidden, "tokenRequiresScope", "parsing public resource scope failed: "+err.Error()) + return + } + + if publicOnly { + if ctx.Package != nil && ctx.Package.Owner.Visibility.IsPrivate() { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public packages") + return + } + } } } diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 5aa8ad44e5e3..883e694e44b7 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -235,6 +235,62 @@ func reqPackageAccess(accessMode perm.AccessMode) func(ctx *context.APIContext) } } +func checkTokenPublicOnly() func(ctx *context.APIContext) { + return func(ctx *context.APIContext) { + if !ctx.PublicOnly { + return + } + + requiredScopeCategories, ok := ctx.Data["requiredScopeCategories"].([]auth_model.AccessTokenScopeCategory) + if !ok || len(requiredScopeCategories) == 0 { + return + } + + // public Only permission check + switch { + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryRepository): + if ctx.Repo.Repository != nil && ctx.Repo.Repository.IsPrivate { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public repos") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryIssue): + if ctx.Repo.Repository != nil && ctx.Repo.Repository.IsPrivate { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public issues") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryOrganization): + if ctx.Org.Organization != nil && ctx.Org.Organization.Visibility != api.VisibleTypePublic { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public orgs") + return + } + if ctx.ContextUser != nil && ctx.ContextUser.IsOrganization() && ctx.ContextUser.Visibility != api.VisibleTypePublic { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public orgs") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryUser): + if ctx.ContextUser != nil && ctx.ContextUser.IsUser() && ctx.ContextUser.Visibility != api.VisibleTypePublic { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public users") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryActivityPub): + if ctx.ContextUser != nil && ctx.ContextUser.IsUser() && ctx.ContextUser.Visibility != api.VisibleTypePublic { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public activitypub") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryNotification): + if ctx.Repo.Repository != nil && ctx.Repo.Repository.IsPrivate { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public notifications") + return + } + case auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryPackage): + if ctx.Package != nil && ctx.Package.Owner.Visibility.IsPrivate() { + ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public packages") + return + } + } + } +} + // if a token is being used for auth, we check that it contains the required scope // if a token is not being used, reqToken will enforce other sign in methods func tokenRequiresScopes(requiredScopeCategories ...auth_model.AccessTokenScopeCategory) func(ctx *context.APIContext) { @@ -250,9 +306,6 @@ func tokenRequiresScopes(requiredScopeCategories ...auth_model.AccessTokenScopeC return } - ctx.Data["ApiTokenScopePublicRepoOnly"] = false - ctx.Data["ApiTokenScopePublicOrgOnly"] = false - // use the http method to determine the access level requiredScopeLevel := auth_model.Read if ctx.Req.Method == "POST" || ctx.Req.Method == "PUT" || ctx.Req.Method == "PATCH" || ctx.Req.Method == "DELETE" { @@ -261,29 +314,28 @@ func tokenRequiresScopes(requiredScopeCategories ...auth_model.AccessTokenScopeC // get the required scope for the given access level and category requiredScopes := auth_model.GetRequiredScopes(requiredScopeLevel, requiredScopeCategories...) - - // check if scope only applies to public resources - publicOnly, err := scope.PublicOnly() + allow, err := scope.HasScope(requiredScopes...) if err != nil { - ctx.Error(http.StatusForbidden, "tokenRequiresScope", "parsing public resource scope failed: "+err.Error()) + ctx.Error(http.StatusForbidden, "tokenRequiresScope", "checking scope failed: "+err.Error()) return } - // this context is used by the middleware in the specific route - ctx.Data["ApiTokenScopePublicRepoOnly"] = publicOnly && auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryRepository) - ctx.Data["ApiTokenScopePublicOrgOnly"] = publicOnly && auth_model.ContainsCategory(requiredScopeCategories, auth_model.AccessTokenScopeCategoryOrganization) - - allow, err := scope.HasScope(requiredScopes...) - if err != nil { - ctx.Error(http.StatusForbidden, "tokenRequiresScope", "checking scope failed: "+err.Error()) + if !allow { + ctx.Error(http.StatusForbidden, "tokenRequiresScope", fmt.Sprintf("token does not have at least one of required scope(s): %v", requiredScopes)) return } - if allow { + ctx.Data["requiredScopeCategories"] = requiredScopeCategories + + // check if scope only applies to public resources + publicOnly, err := scope.PublicOnly() + if err != nil { + ctx.Error(http.StatusForbidden, "tokenRequiresScope", "parsing public resource scope failed: "+err.Error()) return } - ctx.Error(http.StatusForbidden, "tokenRequiresScope", fmt.Sprintf("token does not have at least one of required scope(s): %v", requiredScopes)) + // assign to true so that those searching should only filter public repositories/users/organizations + ctx.PublicOnly = publicOnly } } @@ -295,25 +347,6 @@ func reqToken() func(ctx *context.APIContext) { return } - if true == ctx.Data["IsApiToken"] { - publicRepo, pubRepoExists := ctx.Data["ApiTokenScopePublicRepoOnly"] - publicOrg, pubOrgExists := ctx.Data["ApiTokenScopePublicOrgOnly"] - - if pubRepoExists && publicRepo.(bool) && - ctx.Repo.Repository != nil && ctx.Repo.Repository.IsPrivate { - ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public repos") - return - } - - if pubOrgExists && publicOrg.(bool) && - ctx.Org.Organization != nil && ctx.Org.Organization.Visibility != api.VisibleTypePublic { - ctx.Error(http.StatusForbidden, "reqToken", "token scope is limited to public orgs") - return - } - - return - } - if ctx.IsSigned { return } @@ -879,11 +912,11 @@ func Routes() *web.Router { m.Group("/user/{username}", func() { m.Get("", activitypub.Person) m.Post("/inbox", activitypub.ReqHTTPSignature(), activitypub.PersonInbox) - }, context.UserAssignmentAPI()) + }, context.UserAssignmentAPI(), checkTokenPublicOnly()) m.Group("/user-id/{user-id}", func() { m.Get("", activitypub.Person) m.Post("/inbox", activitypub.ReqHTTPSignature(), activitypub.PersonInbox) - }, context.UserIDAssignmentAPI()) + }, context.UserIDAssignmentAPI(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryActivityPub)) } @@ -939,7 +972,7 @@ func Routes() *web.Router { }, reqSelfOrAdmin(), reqBasicOrRevProxyAuth()) m.Get("/activities/feeds", user.ListUserActivityFeeds) - }, context.UserAssignmentAPI(), individualPermsChecker) + }, context.UserAssignmentAPI(), checkTokenPublicOnly(), individualPermsChecker) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser)) // Users (requires user scope) @@ -957,7 +990,7 @@ func Routes() *web.Router { m.Get("/starred", user.GetStarredRepos) m.Get("/subscriptions", user.GetWatchedRepos) - }, context.UserAssignmentAPI()) + }, context.UserAssignmentAPI(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser), reqToken()) // Users (requires user scope) @@ -1044,7 +1077,7 @@ func Routes() *web.Router { m.Get("", user.IsStarring) m.Put("", user.Star) m.Delete("", user.Unstar) - }, repoAssignment()) + }, repoAssignment(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository)) m.Get("/times", repo.ListMyTrackedTimes) m.Get("/stopwatches", repo.GetStopwatches) @@ -1069,18 +1102,20 @@ func Routes() *web.Router { m.Get("", user.CheckUserBlock) m.Put("", user.BlockUser) m.Delete("", user.UnblockUser) - }, context.UserAssignmentAPI()) + }, context.UserAssignmentAPI(), checkTokenPublicOnly()) }) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser), reqToken()) // Repositories (requires repo scope, org scope) m.Post("/org/{org}/repos", + // FIXME: we need org in context tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization, auth_model.AccessTokenScopeCategoryRepository), reqToken(), bind(api.CreateRepoOption{}), repo.CreateOrgRepoDeprecated) // requires repo scope + // FIXME: Don't expose repository id outside of the system m.Combo("/repositories/{id}", reqToken(), tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository)).Get(repo.GetByID) // Repos (requires repo scope) @@ -1334,7 +1369,7 @@ func Routes() *web.Router { m.Post("", bind(api.UpdateRepoAvatarOption{}), repo.UpdateAvatar) m.Delete("", repo.DeleteAvatar) }, reqAdmin(), reqToken()) - }, repoAssignment()) + }, repoAssignment(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository)) // Notifications (requires notifications scope) @@ -1343,7 +1378,7 @@ func Routes() *web.Router { m.Combo("/notifications", reqToken()). Get(notify.ListRepoNotifications). Put(notify.ReadRepoNotifications) - }, repoAssignment()) + }, repoAssignment(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryNotification)) // Issue (requires issue scope) @@ -1457,7 +1492,7 @@ func Routes() *web.Router { Patch(reqToken(), reqRepoWriter(unit.TypeIssues, unit.TypePullRequests), bind(api.EditMilestoneOption{}), repo.EditMilestone). Delete(reqToken(), reqRepoWriter(unit.TypeIssues, unit.TypePullRequests), repo.DeleteMilestone) }) - }, repoAssignment()) + }, repoAssignment(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryIssue)) // NOTE: these are Gitea package management API - see packages.CommonRoutes and packages.DockerContainerRoutes for endpoints that implement package manager APIs @@ -1468,14 +1503,14 @@ func Routes() *web.Router { m.Get("/files", reqToken(), packages.ListPackageFiles) }) m.Get("/", reqToken(), packages.ListPackages) - }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryPackage), context.UserAssignmentAPI(), context.PackageAssignmentAPI(), reqPackageAccess(perm.AccessModeRead)) + }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryPackage), context.UserAssignmentAPI(), context.PackageAssignmentAPI(), reqPackageAccess(perm.AccessModeRead), checkTokenPublicOnly()) // Organizations m.Get("/user/orgs", reqToken(), tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser, auth_model.AccessTokenScopeCategoryOrganization), org.ListMyOrgs) m.Group("/users/{username}/orgs", func() { m.Get("", reqToken(), org.ListUserOrgs) m.Get("/{org}/permissions", reqToken(), org.GetUserOrgsPermissions) - }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser, auth_model.AccessTokenScopeCategoryOrganization), context.UserAssignmentAPI()) + }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser, auth_model.AccessTokenScopeCategoryOrganization), context.UserAssignmentAPI(), checkTokenPublicOnly()) m.Post("/orgs", tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), reqToken(), bind(api.CreateOrgOption{}), org.Create) m.Get("/orgs", org.GetAll, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization)) m.Group("/orgs/{org}", func() { @@ -1533,7 +1568,7 @@ func Routes() *web.Router { m.Delete("", org.UnblockUser) }) }, reqToken(), reqOrgOwnership()) - }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(true)) + }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(true), checkTokenPublicOnly()) m.Group("/teams/{teamid}", func() { m.Combo("").Get(reqToken(), org.GetTeam). Patch(reqToken(), reqOrgOwnership(), bind(api.EditTeamOption{}), org.EditTeam). @@ -1553,7 +1588,7 @@ func Routes() *web.Router { Get(reqToken(), org.GetTeamRepo) }) m.Get("/activities/feeds", org.ListTeamActivityFeeds) - }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(false, true), reqToken(), reqTeamMembership()) + }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(false, true), reqToken(), reqTeamMembership(), checkTokenPublicOnly()) m.Group("/admin", func() { m.Group("/cron", func() { diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index e848d9518109..9e5874627298 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -191,7 +191,7 @@ func GetAll(ctx *context.APIContext) { // "$ref": "#/responses/OrganizationList" vMode := []api.VisibleType{api.VisibleTypePublic} - if ctx.IsSigned { + if ctx.IsSigned && !ctx.PublicOnly { vMode = append(vMode, api.VisibleTypeLimited) if ctx.Doer.IsAdmin { vMode = append(vMode, api.VisibleTypePrivate) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index c1218440e595..d8c39b0f69bf 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -149,7 +149,7 @@ func SearchIssues(ctx *context.APIContext) { Actor: ctx.Doer, } if ctx.IsSigned { - opts.Private = true + opts.Private = !ctx.PublicOnly opts.AllLimited = true } if ctx.FormString("owner") != "" { diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 6c1a94ee168a..4638e2ba5c3a 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -129,6 +129,11 @@ func Search(ctx *context.APIContext) { // "422": // "$ref": "#/responses/validationError" + private := ctx.IsSigned && (ctx.FormString("private") == "" || ctx.FormBool("private")) + if ctx.PublicOnly { + private = false + } + opts := &repo_model.SearchRepoOptions{ ListOptions: utils.GetListOptions(ctx), Actor: ctx.Doer, @@ -138,7 +143,7 @@ func Search(ctx *context.APIContext) { TeamID: ctx.FormInt64("team_id"), TopicOnly: ctx.FormBool("topic"), Collaborate: optional.None[bool](), - Private: ctx.IsSigned && (ctx.FormString("private") == "" || ctx.FormBool("private")), + Private: private, Template: optional.None[bool](), StarredByID: ctx.FormInt64("starredBy"), IncludeDescription: ctx.FormBool("includeDesc"), diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 2c277a18c739..a9011427fb57 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -9,6 +9,7 @@ import ( activities_model "code.gitea.io/gitea/models/activities" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" @@ -67,12 +68,17 @@ func Search(ctx *context.APIContext) { maxResults = 1 users = []*user_model.User{user_model.NewActionsUser()} default: + var visible []structs.VisibleType + if ctx.PublicOnly { + visible = []structs.VisibleType{structs.VisibleTypePublic} + } users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ Actor: ctx.Doer, Keyword: ctx.FormTrim("q"), UID: uid, Type: user_model.UserTypeIndividual, SearchByEmail: true, + Visible: visible, ListOptions: listOptions, }) if err != nil { diff --git a/services/context/api.go b/services/context/api.go index 84da526e748f..00cfd6afd92d 100644 --- a/services/context/api.go +++ b/services/context/api.go @@ -35,9 +35,10 @@ type APIContext struct { ContextUser *user_model.User // the user which is being visited, in most cases it differs from Doer - Repo *Repository - Org *APIOrganization - Package *Package + Repo *Repository + Org *APIOrganization + Package *Package + PublicOnly bool // Whether the request is for a public endpoint } func init() { diff --git a/tests/integration/api_issue_test.go b/tests/integration/api_issue_test.go index 8bfb6fabe2a4..5b9f16ef96dc 100644 --- a/tests/integration/api_issue_test.go +++ b/tests/integration/api_issue_test.go @@ -75,6 +75,34 @@ func TestAPIListIssues(t *testing.T) { } } +func TestAPIListIssuesPublicOnly(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + owner1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo1.OwnerID}) + + session := loginUser(t, owner1.Name) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue) + link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/issues", owner1.Name, repo1.Name)) + link.RawQuery = url.Values{"state": {"all"}}.Encode() + req := NewRequest(t, "GET", link.String()).AddTokenAuth(token) + MakeRequest(t, req, http.StatusOK) + + repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) + owner2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo2.OwnerID}) + + session = loginUser(t, owner2.Name) + token = getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue) + link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/issues", owner2.Name, repo2.Name)) + link.RawQuery = url.Values{"state": {"all"}}.Encode() + req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) + MakeRequest(t, req, http.StatusOK) + + publicOnlyToken := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue, auth_model.AccessTokenScopePublicOnly) + req = NewRequest(t, "GET", link.String()).AddTokenAuth(publicOnlyToken) + MakeRequest(t, req, http.StatusForbidden) +} + func TestAPICreateIssue(t *testing.T) { defer tests.PrepareTestEnv(t)() const body, title = "apiTestBody", "apiTestTitle" @@ -243,6 +271,12 @@ func TestAPISearchIssues(t *testing.T) { DecodeJSON(t, resp, &apiIssues) assert.Len(t, apiIssues, expectedIssueCount) + publicOnlyToken := getUserToken(t, "user1", auth_model.AccessTokenScopeReadIssue, auth_model.AccessTokenScopePublicOnly) + req = NewRequest(t, "GET", link.String()).AddTokenAuth(publicOnlyToken) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &apiIssues) + assert.Len(t, apiIssues, 15) // 15 public issues + since := "2000-01-01T00:50:01+00:00" // 946687801 before := time.Unix(999307200, 0).Format(time.RFC3339) query.Add("since", since) diff --git a/tests/integration/api_repo_branch_test.go b/tests/integration/api_repo_branch_test.go index b0ac2286c942..63080b308cfe 100644 --- a/tests/integration/api_repo_branch_test.go +++ b/tests/integration/api_repo_branch_test.go @@ -28,9 +28,13 @@ func TestAPIRepoBranchesPlain(t *testing.T) { repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) session := loginUser(t, user1.LowerName) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) + // public only token should be forbidden + publicOnlyToken := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopePublicOnly, auth_model.AccessTokenScopeWriteRepository) link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/org3/%s/branches", repo3.Name)) // a plain repo + MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(publicOnlyToken), http.StatusForbidden) + + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) resp := MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusOK) bs, err := io.ReadAll(resp.Body) assert.NoError(t, err) @@ -42,6 +46,8 @@ func TestAPIRepoBranchesPlain(t *testing.T) { assert.EqualValues(t, "master", branches[1].Name) link2, _ := url.Parse(fmt.Sprintf("/api/v1/repos/org3/%s/branches/test_branch", repo3.Name)) + MakeRequest(t, NewRequest(t, "GET", link2.String()).AddTokenAuth(publicOnlyToken), http.StatusForbidden) + resp = MakeRequest(t, NewRequest(t, "GET", link2.String()).AddTokenAuth(token), http.StatusOK) bs, err = io.ReadAll(resp.Body) assert.NoError(t, err) @@ -49,6 +55,8 @@ func TestAPIRepoBranchesPlain(t *testing.T) { assert.NoError(t, json.Unmarshal(bs, &branch)) assert.EqualValues(t, "test_branch", branch.Name) + MakeRequest(t, NewRequest(t, "POST", link.String()).AddTokenAuth(publicOnlyToken), http.StatusForbidden) + req := NewRequest(t, "POST", link.String()).AddTokenAuth(token) req.Header.Add("Content-Type", "application/json") req.Body = io.NopCloser(bytes.NewBufferString(`{"new_branch_name":"test_branch2", "old_branch_name": "test_branch", "old_ref_name":"refs/heads/test_branch"}`)) @@ -73,6 +81,7 @@ func TestAPIRepoBranchesPlain(t *testing.T) { link3, _ := url.Parse(fmt.Sprintf("/api/v1/repos/org3/%s/branches/test_branch2", repo3.Name)) MakeRequest(t, NewRequest(t, "DELETE", link3.String()), http.StatusNotFound) + MakeRequest(t, NewRequest(t, "DELETE", link3.String()).AddTokenAuth(publicOnlyToken), http.StatusForbidden) MakeRequest(t, NewRequest(t, "DELETE", link3.String()).AddTokenAuth(token), http.StatusNoContent) assert.NoError(t, err) diff --git a/tests/integration/api_user_search_test.go b/tests/integration/api_user_search_test.go index ff4671c54e94..e9805a513934 100644 --- a/tests/integration/api_user_search_test.go +++ b/tests/integration/api_user_search_test.go @@ -38,6 +38,19 @@ func TestAPIUserSearchLoggedIn(t *testing.T) { assert.Contains(t, user.UserName, query) assert.NotEmpty(t, user.Email) } + + publicToken := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser, auth_model.AccessTokenScopePublicOnly) + req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query). + AddTokenAuth(publicToken) + resp = MakeRequest(t, req, http.StatusOK) + results = SearchResults{} + DecodeJSON(t, resp, &results) + assert.NotEmpty(t, results.Data) + for _, user := range results.Data { + assert.Contains(t, user.UserName, query) + assert.NotEmpty(t, user.Email) + assert.True(t, user.Visibility == "public") + } } func TestAPIUserSearchNotLoggedIn(t *testing.T) { From 2e12343fc4ca96a215d6820c4467b619eaa5cbe9 Mon Sep 17 00:00:00 2001 From: cloudchamb3r Date: Wed, 9 Oct 2024 02:27:05 +0900 Subject: [PATCH 16/41] Add null check for responseData.invalidTopics (#32212) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Screenshot 2024-10-08 at 10 49 10 AM `responseData.invalidTopics` can be null but it wasn't handled. --- web_src/js/features/repo-home.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/features/repo-home.ts b/web_src/js/features/repo-home.ts index f3e39ddb3c1a..ed1415d286a8 100644 --- a/web_src/js/features/repo-home.ts +++ b/web_src/js/features/repo-home.ts @@ -60,7 +60,7 @@ export function initRepoTopicBar() { // how to test: input topic like " invalid topic " (with spaces), and select it from the list, then "Save" const responseData = await response.json(); lastErrorToast = showErrorToast(responseData.message, {duration: 5000}); - if (responseData.invalidTopics.length > 0) { + if (responseData.invalidTopics && responseData.invalidTopics.length > 0) { const {invalidTopics} = responseData; const topicLabels = queryElemChildren(topicDropdown, 'a.ui.label'); for (const [index, value] of topics.split(',').entries()) { From f9a9b08896fe6fa88331fd58a1767e3981a79a8d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 9 Oct 2024 00:31:01 +0000 Subject: [PATCH 17/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_fr-FR.ini | 6 +- options/locale/locale_ga-IE.ini | 519 ++++++++++++++++++++++++++++++-- 2 files changed, 505 insertions(+), 20 deletions(-) diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index e64c85b7a4e5..f58ce74564ab 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -580,6 +580,8 @@ lang_select_error=Sélectionnez une langue dans la liste. username_been_taken=Le nom d'utilisateur est déjà pris. username_change_not_local_user=Les utilisateurs non-locaux n'ont pas le droit de modifier leur nom d'utilisateur. +change_username_disabled=Le changement de nom d’utilisateur est désactivé. +change_full_name_disabled=Le changement de nom complet est désactivé. username_has_not_been_changed=Le nom d'utilisateur n'a pas été modifié repo_name_been_taken=Ce nom de dépôt est déjà utilisé. repository_force_private=Force Private est activé : les dépôts privés ne peuvent pas être rendus publics. @@ -1039,6 +1041,7 @@ issue_labels_helper=Sélectionner un jeu de label. license=Licence license_helper=Sélectionner une licence license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence. +multiple_licenses=Licences multiples object_format=Format d'objet object_format_helper=Format d’objet pour ce dépôt. Ne peut être modifié plus tard. SHA1 est le plus compatible. readme=LISEZMOI @@ -1834,7 +1837,7 @@ pulls.is_empty=Les changements sur cette branche sont déjà sur la branche cibl pulls.required_status_check_failed=Certains contrôles requis n'ont pas réussi. pulls.required_status_check_missing=Certains contrôles requis sont manquants. pulls.required_status_check_administrator=En tant qu'administrateur, vous pouvez toujours fusionner cette requête de pull. -pulls.blocked_by_approvals=Cette demande d'ajout n’est pas suffisamment approuvée. %d approbations obtenues sur %d. +pulls.blocked_by_approvals=Cette demande d’ajout n’est pas suffisamment approuvée. %d approbations obtenues sur %d. pulls.blocked_by_approvals_whitelisted=Cette demande d’ajout n’a pas encore assez d’approbations. %d sur %d approbations de la part des utilisateurs ou équipes sur la liste autorisée. pulls.blocked_by_rejection=Cette demande d’ajout nécessite des corrections sollicitées par un évaluateur officiel. pulls.blocked_by_official_review_requests=Cette demande d’ajout a des sollicitations officielles d’évaluation. @@ -2940,6 +2943,7 @@ dashboard.start_schedule_tasks=Démarrer les tâches planifiées dashboard.sync_branch.started=Début de la synchronisation des branches dashboard.sync_tag.started=Synchronisation des étiquettes dashboard.rebuild_issue_indexer=Reconstruire l’indexeur des tickets +dashboard.sync_repo_licenses=Synchroniser les licences du dépôt users.user_manage_panel=Gestion du compte utilisateur users.new_account=Créer un compte diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 82209b1b1180..5ccbc4315f1c 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -2890,17 +2890,167 @@ dashboard.delete_generated_repository_avatars=Scrios abhatáranna stórtha ginte dashboard.sync_repo_branches=Sync brainsí caillte ó shonraí git go bunachair sonraí dashboard.sync_repo_tags=Clibeanna sioncraigh ó shonraí git go bunachar sonraí dashboard.update_mirrors=Scátháin a nuashonrú +dashboard.repo_health_check=Seiceáil sláinte gach stóras +dashboard.check_repo_stats=Seiceáil gach staitisticí stórais +dashboard.archive_cleanup=Scrios sean-chartlanna stórais +dashboard.deleted_branches_cleanup=Brainsí scriosta a ghlanadh +dashboard.update_migration_poster_id=Nuashonraigh ID póstaer imir +dashboard.git_gc_repos=Bailíonn truflais gach stórais +dashboard.resync_all_sshkeys=Nuashonraigh an comhad '.ssh/authorized_keys' le heochracha Gitea SSH. +dashboard.resync_all_sshprincipals=Nuashonraigh an comhad '.ssh/authorized_principals' le príomhphrionsabail Gitea SSH. +dashboard.resync_all_hooks=Athshioncrónaigh crúcaí réamhfhála, nuashonraithe agus iar-fhála na stórtha go léir. +dashboard.reinit_missing_repos=Aththosaigh gach stórais Git atá in easnamh a bhfuil taifid ann dóibh +dashboard.sync_external_users=Sioncrónaigh sonraí úsáideoirí seachtracha +dashboard.cleanup_hook_task_table=Tábla hook_task glantacháin +dashboard.cleanup_packages=Pacáistí glanta in éag +dashboard.cleanup_actions=Gníomhaíochtaí glanta in éag acmhainní +dashboard.server_uptime=Aga fónaimh Freastalaí +dashboard.current_goroutine=Goroutines Reatha +dashboard.current_memory_usage=Úsáid Cuimhne Reatha +dashboard.total_memory_allocated=Cuimhne Iomlán Leithdháilte +dashboard.memory_obtained=Cuimhne Faighte +dashboard.pointer_lookup_times=Amanna Cuardaigh Pointeora +dashboard.memory_allocate_times=Leithdháiltí Cuimhne +dashboard.memory_free_times=Saorálann Cuimhne +dashboard.current_heap_usage=Úsáid Charn Reatha +dashboard.heap_memory_obtained=Cuimhne Charn Faighte +dashboard.heap_memory_idle=Díomhaoin Cuimhne Carn +dashboard.heap_memory_in_use=Cuimhne Carm In Úsáid +dashboard.heap_memory_released=Cuimhne Carn Eisithe +dashboard.heap_objects=Cuspóirí Carn +dashboard.bootstrap_stack_usage=Úsáid Staca Bootstrap +dashboard.stack_memory_obtained=Cuimhne Staca Faighte +dashboard.mspan_structures_usage=Úsáid Struchtúir MSpan +dashboard.mspan_structures_obtained=Struchtúir MSpan a Faightear +dashboard.mcache_structures_usage=Úsáid Struchtúir MCache +dashboard.mcache_structures_obtained=Struchtúir MCache a Faightear +dashboard.profiling_bucket_hash_table_obtained=Tábla Hash Buicéad Próifílithe a Faightear +dashboard.gc_metadata_obtained=Meiteashonraí GC faighte +dashboard.other_system_allocation_obtained=Leithdháileadh Córais Eile a Fuarthas +dashboard.next_gc_recycle=Athchúrsáil GC Eile +dashboard.last_gc_time=Ó Am Deiridh GC +dashboard.total_gc_time=Sos Iomlán GC +dashboard.total_gc_pause=Sos Iomlán GC +dashboard.last_gc_pause=Sos GC Deireanach +dashboard.gc_times=Amanna GC +dashboard.delete_old_actions=Scrios gach sean-ghníomhaíocht ón mbunachar +dashboard.delete_old_actions.started=Scrios na sean-ghníomhaíocht go léir ón mbunachar sonraí tosaithe. +dashboard.update_checker=Seiceoir nuashonraithe +dashboard.delete_old_system_notices=Scrios gach seanfhógra córais ón mbunachar sonraí +dashboard.gc_lfs=Bailigh truflais meta rudaí LFS +dashboard.stop_zombie_tasks=Stad gníomhartha tascanna zombie +dashboard.stop_endless_tasks=Stad gníomhartha tascanna gan deireadh +dashboard.cancel_abandoned_jobs=Cealaigh gníomhartha poist tréigthe +dashboard.start_schedule_tasks=Tosaigh tascanna sceideal gníom +dashboard.sync_branch.started=Thosaigh Brainsí Sioncronú +dashboard.sync_tag.started=Clibeanna Thosaigh Sioncronú +dashboard.rebuild_issue_indexer=Atógáil innéacsóir eisiúna dashboard.sync_repo_licenses=Sioncronaigh ceadúnais repo +users.user_manage_panel=Bainistíocht Cuntas Úsáideora +users.new_account=Cruthaigh cuntas Úsáideora +users.name=Ainm úsáideora users.full_name=Ainm Iomlán +users.activated=Gníomhachtaithe +users.admin=Riarachán +users.restricted=Srianta +users.reserved=In áirithe +users.bot=Bota +users.remote=Iargúlta +users.2fa=2FA +users.repos=Stórais +users.created=Cruthaithe +users.last_login=Sínigh Isteach Deiridh +users.never_login=Ná Sínigh Isteach riamh +users.send_register_notify=Seol Fógra um Chlárú Úsáideora +users.new_success=Tá an cuntas úsáideora "%s" cruthaithe. +users.edit=Eagar +users.auth_source=Foinse Fíordheimhnithe +users.local=Áitiúil +users.auth_login_name=Ainm Síniú Isteach Fíordheimhnithe +users.password_helper=Fág an pasfhocal folamh chun é a choinneáil gan athrú. +users.update_profile_success=Nuashonraíodh an cuntas úsáideora. +users.edit_account=Cuir Cuntas Úsáideora in Eagar +users.max_repo_creation=Uasmhéid Stóras +users.max_repo_creation_desc=(Cuir isteach -1 chun an teorainn réamhshocraithe domhanda a úsáid.) +users.is_activated=Gníomhachtaítear Cuntas Úsáideora +users.prohibit_login=Díchumasaigh Síniú Isteach +users.is_admin=Is Riarthóir +users.is_restricted=Is Srianta +users.allow_git_hook=Féadfaidh Git Hooks a Chruthú +users.allow_git_hook_tooltip=Déantar Git Hooks a fhorghníomhú mar úsáideoir OS a ritheann Gitea agus beidh an leibhéal céanna rochtana óstaigh aige. Mar thoradh air sin, is féidir le húsáideoirí a bhfuil an phribhléid speisialta Git Hook seo acu rochtain a fháil ar gach stór Gitea agus iad a mhodhnú chomh maith leis an mbunachar sonraí a úsáideann Gitea. Dá bharr sin tá siad in ann pribhléidí riarthóra Gitea a fháil freisin. +users.allow_import_local=Is féidir Stórais Áitiúla a Allmhairiú +users.allow_create_organization=Is féidir Eagraíochtaí a Chruthú +users.update_profile=Nuashonraigh Cuntas Úsáideora +users.delete_account=Scrios Cuntas Úsáide +users.cannot_delete_self=Ní féidir leat tú féin a scriosadh +users.still_own_repo=Tá stórais amháin nó níos mó fós ag an úsáideoir seo. Scrios nó aistrigh na stórais seo ar dtús. +users.still_has_org=Is ball d'eagraíocht é an t-úsáideoir seo. Bain an t-úsáideoir ó aon eagraíochtaí ar dtús. +users.purge=Úsáideoir a Ghlanadh +users.purge_help=Scrios go héigeantach úsáideoir agus aon stórais, eagraíochtaí agus pacáistí atá faoi úinéireacht an úsáideora. Scriosfar gach trácht freisin. +users.still_own_packages=Tá pacáiste amháin nó níos mó fós ag an úsáideoir seo, scrios na pacáistí seo ar dtús. +users.deletion_success=Scriosadh an cuntas úsáideora. +users.reset_2fa=Athshocraigh 2FA +users.list_status_filter.menu_text=Scagaire +users.list_status_filter.reset=Athshocraigh users.list_status_filter.is_active=Gníomhach - - +users.list_status_filter.not_active=Neamhghníomhach +users.list_status_filter.is_admin=Riarachán +users.list_status_filter.not_admin=Ní Riarachán +users.list_status_filter.is_restricted=Srianta +users.list_status_filter.not_restricted=Gan Srian +users.list_status_filter.is_prohibit_login=Cosc ar Logáil Isteach +users.list_status_filter.not_prohibit_login=Ceadaigh Logáil isteach +users.list_status_filter.is_2fa_enabled=2FA Cumasaithe +users.list_status_filter.not_2fa_enabled=2FA faoi mhíchumas +users.details=Sonraí Úsáideora + +emails.email_manage_panel=Bainistíocht Ríomhphost Úsáideoir +emails.primary=Bunscoile +emails.activated=Gníomhachtaithe +emails.filter_sort.email=Ríomhphost +emails.filter_sort.email_reverse=Ríomhphost (droim ar ais) +emails.filter_sort.name=Ainm Úsáideora +emails.filter_sort.name_reverse=Ainm Úsáideora (droim ar ais) +emails.updated=Nuashonraíodh an ríomhphost +emails.not_updated=Theip ar an seoladh ríomhphoist iarrtha a nuashonrú: %v +emails.duplicate_active=Tá an seoladh ríomhphoist seo gníomhach cheana féin d'úsáideoir difriúil. +emails.change_email_header=Nuashonraigh Airíonna Ríomhphoist +emails.change_email_text=An bhfuil tú cinnte gur mhaith leat an seoladh ríomhphoist seo a nuashonrú? +emails.delete=Scrios Ríomhphost +emails.delete_desc=An bhfuil tú cinnte gur mhaith leat an seoladh ríomhphoist seo a scriosadh? +emails.deletion_success=Tá an seoladh ríomhphoist scriosta. +emails.delete_primary_email_error=Ní féidir leat an ríomhphost príomhúil a scriosadh. + +orgs.org_manage_panel=Bainistíocht Eagraíochta +orgs.name=Ainm orgs.teams=Foirne +orgs.members=Comhaltaí +orgs.new_orga=Eagraíocht Nua +repos.repo_manage_panel=Bainistíocht Stórais +repos.unadopted=Stórais Neamhghlactha +repos.unadopted.no_more=Níor aimsíodh níos mó stórais neamhghlactha repos.owner=Úinéir - +repos.name=Ainm +repos.private=Príobháideach +repos.issues=Saincheisteanna +repos.size=Méid +repos.lfs_size=Méid LFS + +packages.package_manage_panel=Bainistíocht Pacáiste +packages.total_size=Méid Iomlán: %s +packages.unreferenced_size=Méid gan tagairt: %s +packages.cleanup=Glan suas sonraí in éag +packages.cleanup.success=Glanadh suas sonraí in éag go rathúil packages.owner=Úinéir +packages.creator=Cruthaitheoir +packages.name=Ainm +packages.version=Leagan +packages.type=Cineál +packages.repository=Stóráil +packages.size=Méid +packages.published=Foilsithe defaulthooks=Réamhshocraithe Crúcaí Gréasán defaulthooks.desc=Déanann Crúcaí Gréasán iarratais HTTP POST go huathoibríoch chuig freastalaí nuair a chuireann imeachtaí áirithe Gitea tús. Is mainneachtainí iad na cuacha gréasáin a shainítear anseo agus déanfar iad a chóipeáil isteach i ngach stórais nua. Léigh tuilleadh sa treoir chúca Crúcaí Gréasán. @@ -2912,49 +3062,375 @@ systemhooks.desc=Déanann Crúcaí Gréasán iarratais HTTP POST go huathoibrío systemhooks.add_webhook=Cuir Crúca Gréasán Córas leis systemhooks.update_webhook=Nuashonraigh Córas Crúca Gréasán +auths.auth_manage_panel=Bainistiú Foinse Fíordheimhnithe +auths.new=Cuir Foinse Fíordheimhni +auths.name=Ainm +auths.type=Cineál +auths.enabled=Cumasaithe +auths.syncenabled=Cumasaigh Sioncrónú Úsáideora auths.updated=Nuashonraithe +auths.auth_type=Cineál Fíordheimhnithe +auths.auth_name=Ainm Fíordheimhnithe +auths.security_protocol=Prótacal Slándála auths.domain=Fearann - - - - - +auths.host=Óstach +auths.port=Calafort +auths.bind_dn=Ceangail DN +auths.bind_password=Ceangail Pasfhocal +auths.user_base=Bonn Cuardaigh Úsáideora +auths.user_dn=Úsáideoir DN +auths.attribute_username=Tréith Ainm Úsáideora +auths.attribute_username_placeholder=Fág folamh chun an t-ainm úsáideora a iontráiltear i Gitea a úsáid. +auths.attribute_name=Tréith Céad Ainm +auths.attribute_surname=Tréith Sloinne +auths.attribute_mail=Tréith ríomhphoist +auths.attribute_ssh_public_key=Tréith Eochair SSH Phoiblí +auths.attribute_avatar=Tréith Avatar +auths.attributes_in_bind=Faigh tréithe i gComhthéacs Bind DN +auths.allow_deactivate_all=Lig do thoradh cuardaigh folamh gach úsáideoir a dhíghníomhachtú +auths.use_paged_search=Úsáid Cuardach Leathanaigh +auths.search_page_size=Méid an Leathanaigh +auths.filter=Scagaire Úsáideora +auths.admin_filter=Scagaire Riaracháin +auths.restricted_filter=Scagaire Srianta +auths.restricted_filter_helper=Fág folamh chun aon úsáideoirí a shocrú mar theoranta. Úsáid réiltín ('*') chun gach úsáideoir nach meaitseálann Scagaire Riaracháin a shocrú mar theoranta. +auths.verify_group_membership=Fíoraigh ballraíocht ghrúpa i LDAP (fág an scagaire folamh le scipeáil) +auths.group_search_base=Bonn Cuardaigh Grúpa DN +auths.group_attribute_list_users=Tréith Grúpa ina bhfuil Liosta Úsáideoirí +auths.user_attribute_in_group=Tréith Úsáideora atá Liostaithe i nGrúpa +auths.map_group_to_team=Léarscáil grúpaí LDAP chuig foirne na hEagraíochta (fág an réimse folamh le scipeáil) +auths.map_group_to_team_removal=Bain úsáideoirí ó fhoirne sioncronaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach LDAP +auths.enable_ldap_groups=Cumasaigh grúpaí LDAP +auths.ms_ad_sa=MS AD Tréithe Cuardaigh +auths.smtp_auth=Cineál Fíordheimhnithe SMTP +auths.smtphost=Óstach SMTP +auths.smtpport=SMTP Calafort +auths.allowed_domains=Fearainn Ceadaithe +auths.allowed_domains_helper=Fág folamh chun gach fearann a cheadú. Déan ilfhearann a scaradh le camóg (','). +auths.skip_tls_verify=Scipeáil Fíorú TLS +auths.force_smtps=Fórsa SMTPS +auths.force_smtps_helper=Úsáidtear SMTPS i gcónaí ar chalafort 465. Socraigh é seo chun SMTPS a chur i bhfeidhm ar chalafoirt eile. (Seachas sin úsáidfear STARTTLS ar chalafoirt eile má thacaíonn an t-óstach leis.) +auths.helo_hostname=Ainm Óstach HELO +auths.helo_hostname_helper=Ainm óstach a sheoltar le HELO. Fág bán chun an t-ainm óstach reatha a sheoladh. +auths.disable_helo=Díchumasaigh HELO +auths.pam_service_name=Ainm Seirbhíse PAM +auths.pam_email_domain=Fearann Ríomhphoist PAM (roghnach) +auths.oauth2_provider=Soláthraí OAuth2 +auths.oauth2_icon_url=URL deilbhín +auths.oauth2_clientID=Aitheantas Cliant (Eochair) +auths.oauth2_clientSecret=Rúnda Cliant +auths.openIdConnectAutoDiscoveryURL=URL Fionnachtana Uathoibríoch OpenID Connect +auths.oauth2_use_custom_url=Úsáid URLanna Saincheaptha in ionad URLanna Réamhshocraithe +auths.oauth2_tokenURL=URL Comhartha +auths.oauth2_authURL=Údaraigh URL +auths.oauth2_profileURL=URL Próifíl +auths.oauth2_emailURL=URL ríomhphoist +auths.skip_local_two_fa=Scipeáil 2FA áitiúil +auths.skip_local_two_fa_helper=Ciallaíonn fágáil gan socrú go mbeidh ar úsáideoirí áitiúla a bhfuil tacar 2FA acu 2FA a rith fós chun logáil isteach +auths.oauth2_tenant=Tionónta +auths.oauth2_scopes=Scóipeanna Breise +auths.oauth2_required_claim_name=Ainm Éilimh Riachtanach +auths.oauth2_required_claim_name_helper=Socraigh an t-ainm seo chun logáil isteach ón bhfoinse seo a shrianadh d'úsáideoirí a bhfuil éileamh acu leis an ainm seo +auths.oauth2_required_claim_value=Luach Éilimh Riachtanach +auths.oauth2_required_claim_value_helper=Socraigh an luach seo chun logáil isteach ón bhfoinse seo a shrianadh chuig úsáideoirí a bhfuil éileamh acu leis an ainm agus an luach seo +auths.oauth2_group_claim_name=Ainm éileamh ag soláthar ainmneacha grúpa don fhoinse seo (Roghnach) +auths.oauth2_admin_group=Luach Éilimh Grúpa d'úsáideoirí riarthóra. (Roghnach - teastaíonn ainm éilimh thuas) +auths.oauth2_restricted_group=Luach Éilimh Grúpa d'úsáideoirí srianta. (Roghnach - teastaíonn ainm éilimh thuas) +auths.oauth2_map_group_to_team=Map mhaígh grúpaí chuig foirne Eagraíochta. (Roghnach - éilíonn ainm an éilimh thuas) +auths.oauth2_map_group_to_team_removal=Bain úsáideoirí ó fhoirne sioncronaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach. +auths.enable_auto_register=Cumasaigh Clárú Auto +auths.sspi_auto_create_users=Cruthaigh úsáideoirí go huathoibríoch +auths.sspi_auto_create_users_helper=Lig do mhodh auth SSPI cuntais nua a chruthú go huathoibríoch d'úsáideoirí a logálann isteach den chéad uair +auths.sspi_auto_activate_users=Gníomhachtaigh úsáideoirí go huathoibríoch +auths.sspi_auto_activate_users_helper=Lig modh auth SSPI úsáideoirí nua a ghníomhachtú go huathoibríoch +auths.sspi_strip_domain_names=Bain ainmneacha fearann ó ainm úsáideora +auths.sspi_strip_domain_names_helper=Má dhéantar iad a sheiceáil, bainfear ainmneacha fearainn ó ainmneacha logála isteach (m.sh. Beidh “DOMAIN\ user” agus "user@example.org" araon ní bheidh ach “úsáideoir”). +auths.sspi_separator_replacement=Deighilteoir le húsáid in ionad\,/agus @ +auths.sspi_separator_replacement_helper=An carachtar a úsáidfear chun na deighilteoirí a chur in ionad na n-ainmneacha logála síos-leibhéil (m.sh. an \ i "DOMAIN\úsáideoir") agus ainmneacha príomhoidí úsáideora (m.sh. an @ in "user@example.org"). +auths.sspi_default_language=Teanga úsáideora réamhshocraithe +auths.sspi_default_language_helper=Teanga réamhshocraithe d'úsáideoirí cruthaithe go huathoibríoch ag modh auth SSPI. Fág folamh más fearr leat teanga a bhrath go huathoibríoch. +auths.tips=Leideanna +auths.tips.oauth2.general=OAuth2 Fíordheimhniú +auths.tips.oauth2.general.tip=Agus fíordheimhniú OAuth2 nua á chlárú agat, ba chóir go mbeadh an URL glaonna ais/atreoraithe: +auths.tip.oauth2_provider=Soláthraí OAuth2 +auths.tip.bitbucket=Cláraigh tomhaltóir OAuth nua ar %s agus cuir an cead 'Cuntas' - 'Léigh' leis +auths.tip.nextcloud=`Cláraigh tomhaltóir OAuth nua ar do chás ag baint úsáide as an roghchlár seo a leanas "Socruithe -> Slándáil -> cliant OAuth 2.0"` +auths.tip.dropbox=Cruthaigh feidhmchlár nua ag %s +auths.tip.facebook=Cláraigh feidhmchlár nua ag %s agus cuir an táirge "Facebook Login" leis +auths.tip.github=Cláraigh feidhmchlár OAuth nua ar %s +auths.tip.gitlab_new=Cláraigh feidhmchlár nua ar %s +auths.tip.google_plus=Faigh dintiúir chliaint OAuth2 ó chonsól API Google ag %s +auths.tip.openid_connect=Úsáid URL Fionnachtana OpenID Connect "https://{server}/.well-known/openid-configuration" chun na críochphointí a shonrú +auths.tip.twitter=Téigh go %s, cruthaigh feidhmchlár agus cinntigh go bhfuil an rogha "Ceadaigh úsáid a bhaint as an bhfeidhmchlár seo chun logáil isteach le Twitter" cumasaithe +auths.tip.discord=Cláraigh feidhmchlár nua ar %s +auths.tip.gitea=Cláraigh feidhmchlár OAuth2 nua. Tá treoir le fáil ag %s +auths.tip.yandex=`Cruthaigh feidhmchlár nua ag %s. Roghnaigh na ceadanna seo a leanas ón rannán "Yandex.Passport API": "Rochtain ar sheoladh ríomhphoist", "Rochtain ar avatar úsáideora" agus "Rochtain ar ainm úsáideora, céad ainm agus sloinne, inscne"` +auths.tip.mastodon=Ionchur URL sampla saincheaptha don shampla mastodon is mian leat a fhíordheimhniú leis (nó bain úsáid as an gceann réamhshocraithe) +auths.edit=Cuir Foinse Fíordheimhnithe in Eagar +auths.activated=Tá an Foinse Fíordheimhnithe seo gníomhachtaithe +auths.new_success=Tá an fíordheimhniú "%s" curtha leis. +auths.update_success=Nuashonraíodh an fhoinse fíordheimhnithe. +auths.update=Nuashonraigh Foinse Fíordheimhnithe +auths.delete=Scrios Foinse Fíordheimhnithe +auths.delete_auth_title=Scrios Foinse Fíordheimhnithe +auths.delete_auth_desc=Má scriosann tú foinse fíordheimhnithe cuirtear cosc ​​ar úsáideoirí í a úsáid chun síniú isteach. Lean ort? +auths.still_in_used=Tá an fhoinse fíordheimhnithe fós in úsáid. Tiontaigh nó scrios aon úsáideoir a úsáideann an fhoinse fíordheimhnithe seo ar dtús. +auths.deletion_success=Tá an fhoinse fíordheimhnithe scriosta. +auths.login_source_exist=Tá an fhoinse fíordheimhnithe "%s" ann cheana. +auths.login_source_of_type_exist=Tá foinse fíordheimhnithe den chineál seo ann cheana féin. +auths.unable_to_initialize_openid=Ní féidir Soláthraí Ceangail OpenID a thionscnamh: %s +auths.invalid_openIdConnectAutoDiscoveryURL=URL Neamhbhailí Fionnachtana Uathoibríoch (ní mór gur URL bailí é seo ag tosú le http:// nó https://) + +config.server_config=Cumraíocht Freastalaí +config.app_name=Teideal an Láithreáin +config.app_ver=Leagan Gitea +config.app_url=URL Bonn Gitea +config.custom_conf=Cosán Comhad Cumraíochta +config.custom_file_root_path=Cosán Fréamh Comhad Saincheaptha +config.domain=Fearann ​​Freastalaí +config.offline_mode=Mód Áitiúil +config.disable_router_log=Díchumasaigh Loga an Ródaire +config.run_user=Rith Mar Ainm úsáideora +config.run_mode=Mód Rith +config.git_version=Leagan Git +config.app_data_path=Cosán Sonraí Aip +config.repo_root_path=Cosán Fréimhe Stórála +config.lfs_root_path=Cosán Fréamh LFS +config.log_file_root_path=Cosán Logála +config.script_type=Cineál Script +config.reverse_auth_user=Úsáideoir Fíordheimhnithe Droim ar Ais + +config.ssh_config=Cumraíocht SSH +config.ssh_enabled=Cumasaithe +config.ssh_start_builtin_server=Úsáid Freastalaí Ionsuite +config.ssh_domain=Fearainn Freastalaí SSH +config.ssh_port=Calafort +config.ssh_listen_port=Éist Calafort +config.ssh_root_path=Cosán Fréimhe +config.ssh_key_test_path=Cosán Tástáil Eochair +config.ssh_keygen_path=Keygen ('ssh-keygen') Cosán +config.ssh_minimum_key_size_check=Seiceáil Íosta Méid Eochair +config.ssh_minimum_key_sizes=Méideanna Íosta Eochrach + +config.lfs_config=Cumraíocht LFS +config.lfs_enabled=Cumasaithe +config.lfs_content_path=Cosán Ábhar LFS +config.lfs_http_auth_expiry=Éag Auth LFS HTTP + +config.db_config=Cumraíocht Bunachar Sonraí +config.db_type=Cineál +config.db_host=Óstach +config.db_name=Ainm +config.db_user=Ainm úsáideora +config.db_schema=Scéim +config.db_ssl_mode=SSL +config.db_path=Cosán + +config.service_config=Cumraíocht Seirbhíse +config.register_email_confirm=Deimhniú Ríomhphost a éileamh chun Clárú +config.disable_register=Díchumasaigh Féin-Chlárú +config.allow_only_internal_registration=Ceadaigh Clárú Amháin Trí Gitea féin +config.allow_only_external_registration=Ceadaigh Clárú Trí Sheirbhísí Seachtracha amháin +config.enable_openid_signup=Cumasaigh Féinchlárú OpenID +config.enable_openid_signin=Cumasaigh Síniú isteach OpenID +config.show_registration_button=Taispeáin Cnaipe Cláraithe +config.require_sign_in_view=Teastaíonn Sínigh isteach chun Leathanaigh Amharc +config.mail_notify=Cumasaigh Fógraí Ríomhphoist +config.enable_captcha=Cumasaigh CAPTCHA +config.active_code_lives=Saol Gníomhach ag an gCód +config.reset_password_code_lives=Am Éaga Chóid Aisghabhála Cuntais +config.default_keep_email_private=Folaigh Seoltaí Ríomhphoist de réir Réamhshocrú +config.default_allow_create_organization=Ceadaigh Cruthú Eagraíochtaí de réir Réamhshocrú +config.enable_timetracking=Cumasaigh Rianú Ama +config.default_enable_timetracking=Cumasaigh Rianú Ama de réir Réamhshocrú +config.default_allow_only_contributors_to_track_time=Lig do Rannpháirtithe Amháin Rianú Am +config.no_reply_address=Fearann Ríomhphoist Folaithe +config.default_visibility_organization=Infheictheacht réamhshocraithe d'Eagraíochtaí nua +config.default_enable_dependencies=Cumasaigh Spleáchais Eisithe de réir Réamhshocrú config.webhook_config=Cumraíocht Crúca Gréasán - - - - - - - - - - +config.queue_length=Fad scuaine +config.deliver_timeout=Teorainn Ama Seachadta +config.skip_tls_verify=Scipeáil Fíorú TLS + +config.mailer_config=Cumraíocht Seoltóra +config.mailer_enabled=Cumasaithe +config.mailer_enable_helo=Cumasaigh HELO +config.mailer_name=Ainm +config.mailer_protocol=Prótacal +config.mailer_smtp_addr=Seoladh SMTP +config.mailer_smtp_port=Calafort SMTP +config.mailer_user=Úsáideoir +config.mailer_use_sendmail=Úsáid Sendmail +config.mailer_sendmail_path=Cosán Sendmail +config.mailer_sendmail_args=Argóintí Breise chuig Sendmail +config.mailer_sendmail_timeout=Teorainn Ama Sendmail +config.mailer_use_dummy=Caochadán +config.test_email_placeholder=Ríomhphost (m.sh. test@example.com) +config.send_test_mail=Seol Ríomhphost Tástála +config.send_test_mail_submit=Seol +config.test_mail_failed=Theip ar ríomhphost tástála a sheoladh chuig "%s": %v +config.test_mail_sent=Tá ríomhphost tástála seolta chuig "%s". + +config.oauth_config=Cumraíocht OAuth +config.oauth_enabled=Cumasaithe + +config.cache_config=Cumraíocht taisce +config.cache_adapter=Cuibheoir taisce +config.cache_interval=Eatramh Taisce +config.cache_conn=Ceangal Taisce +config.cache_item_ttl=Mír Taisce TTL +config.cache_test=Taisce Tástáil +config.cache_test_failed=Theip ar an taisce a thaiscéaladh: %v. +config.cache_test_slow=D'éirigh leis an tástáil taisce, ach tá an freagra mall: %s. +config.cache_test_succeeded=D'éirigh leis an tástáil taisce, fuair sé freagra i %s. + +config.session_config=Cumraíocht Seisiúin +config.session_provider=Soláthraí Seisiúin +config.provider_config=Cumraíocht Soláthraí +config.cookie_name=Ainm Fianán +config.gc_interval_time=Am Eatramh GC +config.session_life_time=Am Saoil na Seisiúin +config.https_only=HTTPS Amháin +config.cookie_life_time=Am Saoil Fianán + +config.picture_config=Cumraíocht Pictiúr agus Avatar +config.picture_service=Seirbhís Pictiúr +config.disable_gravatar=Díchumasaigh Gravatar +config.enable_federated_avatar=Cumasaigh Avatars Cónaidhme +config.open_with_editor_app_help=Na heagarthóirí "Oscailte le" don roghchlár Clón. Má fhágtar folamh é, úsáidfear an réamhshocrú. Leathnaigh chun an réamhshocrú a fheiceáil. + +config.git_config=Cumraíocht Git +config.git_disable_diff_highlight=Díchumasaigh Aibhsiú Comhréire Diff +config.git_max_diff_lines=Max Diff Lines (do chomhad amháin) +config.git_max_diff_line_characters=Carachtair Max Diff (le haghaidh líne amháin) +config.git_max_diff_files=Comhaid Max Diff (le taispeáint) +config.git_gc_args=Argóintí GC +config.git_migrate_timeout=Teorainn Ama Imirce +config.git_mirror_timeout=Teorainn Ama Nuashonraithe Scátháin +config.git_clone_timeout=Teorainn Ama Oibríochta Clón +config.git_pull_timeout=Tarraing Am Oibríochta +config.git_gc_timeout=Teorainn Ama Oibriúcháin GC + +config.log_config=Cumraíocht Logáil +config.logger_name_fmt=Logálaí: %s +config.disabled_logger=Díchumasaithe +config.access_log_mode=Mód Logáil Rochtana +config.access_log_template=Teimpléad Logáil Rochtana +config.xorm_log_sql=Logáil SQL + +config.set_setting_failed=Theip ar shocrú %s a shocrú + +monitor.stats=Staitisticí + +monitor.cron=Tascanna Cron +monitor.name=Ainm +monitor.schedule=Sceideal +monitor.next=An chéad uair eile +monitor.previous=Am Roimhe Seo +monitor.execute_times=Forghníomhaíochtaí +monitor.process=Próisis reatha +monitor.stacktrace=Rian cruachta +monitor.processes_count=Próisis %d +monitor.download_diagnosis_report=Íoslódáil tuairisc diagnóis monitor.desc=Cur síos - +monitor.start=Am Tosaigh +monitor.execute_time=Am Forghníomhaithe +monitor.last_execution_result=Toradh +monitor.process.cancel=Cealaigh próiseas +monitor.process.cancel_desc=Má chuirtear próiseas ar ceal d'fhéadfadh go gcaillfí sonraí +monitor.process.cancel_notices=Cealaigh: %s? +monitor.process.children=Leanaí + +monitor.queues=Scuaineanna +monitor.queue=Scuaine: %s +monitor.queue.name=Ainm +monitor.queue.type=Cineál +monitor.queue.exemplar=Cineál Eiseamláire +monitor.queue.numberworkers=Líon na nOibrithe +monitor.queue.activeworkers=Oibrithe Gníomhacha +monitor.queue.maxnumberworkers=Líon Uasta na nOibrithe +monitor.queue.numberinqueue=Uimhir i scuaine +monitor.queue.review_add=Athbhreithniú / Cuir Oibrithe leis +monitor.queue.settings.title=Socruithe Linn +monitor.queue.settings.desc=Fásann linnte go dinimiciúil mar fhreagra ar a gcuid scuaine oibrithe a bhlocáil. +monitor.queue.settings.maxnumberworkers=Uaslíon na n-oibrithe +monitor.queue.settings.maxnumberworkers.placeholder=Faoi láthair %[1]d +monitor.queue.settings.maxnumberworkers.error=Caithfidh uaslíon na n-oibrithe a bheith ina uimhir monitor.queue.settings.submit=Nuashonrú Socruithe +monitor.queue.settings.changed=Socruithe Nuashonraithe +monitor.queue.settings.remove_all_items=Bain gach +monitor.queue.settings.remove_all_items_done=Baineadh na míreanna go léir sa scuaine. notices.system_notice_list=Fógraí Córais +notices.view_detail_header=Féach ar Sonraí Fógra notices.operations=Oibríochtaí +notices.select_all=Roghnaigh Gach +notices.deselect_all=Díroghnaigh Gach +notices.inverse_selection=Roghnú Inbhéartha +notices.delete_selected=Scrios Roghnaithe +notices.delete_all=Scrios Gach Fógra +notices.type=Cineál +notices.type_1=Stóras +notices.type_2=Tasc notices.desc=Cur síos +notices.op=Oibríocht. +notices.delete_success=Scriosadh na fógraí córais. [action] [tool] +now=anois +future=todhchaí +1s=1 soicind +1m=1 nóiméad +1h=1 uair an chloig +1d=1 lá +1w=1 seachtain +1mon=1 mhí +1y=1 bhliain +seconds=%d soicind +minutes=%d nóiméad [dropzone] [notification] +notifications=Fógraí +unread=Gan léamh +read=Léigh +subscriptions=Síntiúis +watching=Ag féachaint +no_subscriptions=Gan síntiúis [gpg] [units] +unit=Aonad [packages] +title=Pacáistí +filter.type=Cineál +filter.type.all=Gach +filter.container.tagged=Clibeáilte +filter.container.untagged=Gan chlib +details=Sonraí +details.author=Údar +dependency.version=Leagan alpine.repository.branches=Brainsí alpine.repository.repositories=Stórais +conan.details.repository=Stóras +container.details.type=Cineál Íomhá +container.details.platform=Ardán +container.multi_arch=Córas Oibriúcháin / Ailtireacht +container.labels=Lipéid +container.labels.key=Eochair +container.labels.value=Luach +debian.repository=Eolas Stóras +debian.repository.components=Comhpháirteanna +debian.repository.architectures=Ailtireachtaí +npm.details.tag=Clib +owner.settings.cleanuprules.enabled=Cumasaithe [secrets] @@ -2962,10 +3438,15 @@ alpine.repository.repositories=Stórais +runners.name=Ainm +runners.owner_type=Cineál runners.description=Cur síos +runners.labels=Lipéid runners.task_list.run=Rith +runners.task_list.repository=Stóras runners.task_list.commit=Tiomantas runners.status.active=Gníomhach +runners.version=Leagan runners.reset_registration_token=Athshocraigh comhartha clár runners.reset_registration_token_success=D'éirigh le hathshocrú comhartha clárúcháin an dara háit From 8bee7fcf7e214ace5e4835556bfb0f96ae3d20fb Mon Sep 17 00:00:00 2001 From: Ehsan Shirvanian <72626662+eshirvana@users.noreply.github.com> Date: Wed, 9 Oct 2024 01:04:34 -0400 Subject: [PATCH 18/41] update git book link to v2 (#32221) Fix the dead link `https://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository` for empty repositories to help how to clone the repository to `https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository` which is v2 of the git book. This also updates download git links --- modules/git/git.go | 4 ++-- templates/repo/empty.tmpl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/git/git.go b/modules/git/git.go index 05ca26085553..a19dd7771ba0 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -111,12 +111,12 @@ func SetExecutablePath(path string) error { func ensureGitVersion() error { if !DefaultFeatures().CheckVersionAtLeast(RequiredVersion) { - moreHint := "get git: https://git-scm.com/download/" + moreHint := "get git: https://git-scm.com/downloads" if runtime.GOOS == "linux" { // there are a lot of CentOS/RHEL users using old git, so we add a special hint for them if _, err := os.Stat("/etc/redhat-release"); err == nil { // ius.io is the recommended official(git-scm.com) method to install git - moreHint = "get git: https://git-scm.com/download/linux and https://ius.io" + moreHint = "get git: https://git-scm.com/downloads/linux and https://ius.io" } } return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", DefaultFeatures().gitVersion.Original(), RequiredVersion, moreHint) diff --git a/templates/repo/empty.tmpl b/templates/repo/empty.tmpl index cb2a5ba1e98e..761364335157 100644 --- a/templates/repo/empty.tmpl +++ b/templates/repo/empty.tmpl @@ -24,7 +24,7 @@
-

{{ctx.Locale.Tr "repo.clone_this_repo"}} {{ctx.Locale.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository"}}

+

{{ctx.Locale.Tr "repo.clone_this_repo"}} {{ctx.Locale.Tr "repo.clone_helper" "http://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository"}}

{{if and .CanWriteCode (not .Repository.IsArchived)}} From 4eacc61f645bbe259e22fba6f7111c8817de0652 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 10 Oct 2024 08:25:46 +0800 Subject: [PATCH 19/41] Fix incorrect "Target branch does not exist" in PR title (#32222) --- routers/web/repo/pull.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index ced0bbc15a00..02d9b429b557 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -166,7 +166,7 @@ func setMergeTarget(ctx *context.Context, pull *issues_model.PullRequest) { ctx.Data["BaseTarget"] = pull.BaseBranch headBranchLink := "" if pull.Flow == issues_model.PullRequestFlowGithub { - b, err := git_model.GetBranch(ctx, ctx.Repo.Repository.ID, pull.HeadBranch) + b, err := git_model.GetBranch(ctx, pull.HeadRepoID, pull.HeadBranch) switch { case err == nil: if !b.IsDeleted { From 368b0881f502dd36a1ae725493c85683803fd816 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 10 Oct 2024 00:30:33 +0000 Subject: [PATCH 20/41] [skip ci] Updated translations via Crowdin --- options/locale/locale_ga-IE.ini | 298 +++++++++++++++++++++++++++++++- 1 file changed, 293 insertions(+), 5 deletions(-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 5ccbc4315f1c..0fae28daeaeb 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -3377,8 +3377,47 @@ notices.desc=Cur síos notices.op=Oibríocht. notices.delete_success=Scriosadh na fógraí córais. +self_check.no_problem_found=Níor aimsíodh aon fhadhb fós. +self_check.startup_warnings=Rabhadh tosaithe: +self_check.database_collation_mismatch=Bí ag súil le comhthiomsú a úsáid sa bhunachar sonraí: %s +self_check.database_collation_case_insensitive=Tá bunachar sonraí ag baint úsáide as comparáid %s, arb é comhdhlúthú neamhíogair. Cé go bhféadfadh Gitea oibriú leis, d'fhéadfadh go mbeadh roinnt cásanna annamh ann nach n-oibríonn mar a bhíothas ag súil leis. +self_check.database_inconsistent_collation_columns=Tá comhthiomsú %s in úsáid ag an mbunachar sonraí, ach tá comhthiomsuithe mímheaitseála á n-úsáid ag na colúin seo. D'fhéadfadh sé a bheith ina chúis le roinnt fadhbanna gan choinne. +self_check.database_fix_mysql=D'úsáideoirí MySQL/MariaDB, d'fhéadfá an t-ordú "gitea doctor convert" a úsáid chun na fadhbanna comhthiomsaithe a réiteach, nó d'fhéadfá an fhadhb a réiteach trí "ALTER ... COLLATE ..." SQLs de láimh freisin. +self_check.database_fix_mssql=I gcás úsáideoirí MSSQL, ní fhéadfá an fhadhb a réiteach ach trí "ALTER ... COLLATE ..." SQLs de láimh faoi láthair. +self_check.location_origin_mismatch=Ní mheaitseálann an URL reatha (%[1]s) an URL atá le feiceáil ag Gitea (%[2]s). Má tá seachfhreastalaí droim ar ais á úsáid agat, cinntigh le do thoil go bhfuil na ceanntásca "Óstríomhaire" agus "X-Forwarded-Proto" socraithe i gceart. [action] +create_repo=stóras cruthaithe %s +rename_repo=stóras athainmnithe ó %[1]s go %[3]s +commit_repo=brú chuig %[3]s ag %[4]s +create_issue=`osclaíodh ceist %[3]s#%[2]s` +close_issue=`eagrán dúnta %[3]s#%[2]s` +reopen_issue=`athoscailt an cheist %[3]s#%[2]s` +create_pull_request=`iarratas tarraingthe cruthaithe %[3]s#%[2]s` +close_pull_request=`iarratas tarraingthe dúnta %[3]s#%[2]s` +reopen_pull_request=`iarratas tarraingthe athoscailte %[3]s#%[2]s` +comment_issue=`trácht ar cheist %[3]s#%[2]s` +comment_pull=`déan trácht ar iarratas tarraingthe %[3]s#%[2]s` +merge_pull_request=`iarratas tarraingthe cumaisc %[3]s#%[2]s` +auto_merge_pull_request=`iarratas tarraingthe cumasctha go huathoibríoch %[3]s#%[2]s` +transfer_repo=aistrithe stóras %s go %s +push_tag=brú %[3]s go %[4]s +delete_tag=scriosta clib %[2]s ó %[3]s +delete_branch=brainse scriosta %[2]s ó %[3]s +compare_branch=Déan comparáid +compare_commits=Déan comparáid idir tiomáintí %d +compare_commits_general=Déan comparáid idir tiomáintí +mirror_sync_push=geallann synced do %[3]s ag %[4]s ón scáthán +mirror_sync_create=sioncronaigh tagairt nua %[3]s do %[4]s ón scáthán +mirror_sync_delete=sioncronaithe agus scriosta an tagairt %[2]s ag %[3]s ón scáthán +approve_pull_request=`ceadaithe %[3]s#%[2]s` +reject_pull_request=`athruithe molta le haghaidh %[3]s#%[2]s` +publish_release=`scaoileadh %[4]s ag %[3]s` +review_dismissed=`léirmheas ó %[4]s le haghaidh %[3]s#%[2]s` +review_dismissed_reason=Cúis: +create_branch=brainse cruthaithe %[3]s i %[4]s +starred_repo=le %[2]s le réalta +watched_repo=thosaigh sé ag breathnú ar %[2]s [tool] now=anois @@ -3392,60 +3431,266 @@ future=todhchaí 1y=1 bhliain seconds=%d soicind minutes=%d nóiméad +hours=%d uair an chloig +days=%d laethanta +weeks=%d seachtain +months=%d míonna +years=%d bliain +raw_seconds=soicind +raw_minutes=nóiméad [dropzone] +default_message=Scaoil comhaid nó cliceáil anseo chun iad a uaslódáil. +invalid_input_type=Ní féidir leat comhaid den chineál seo a uaslódáil. +file_too_big=Sáraíonn méid comhaid ({{filesize}} MB) an t-uasmhéid de ({{maxFilesize}} MB). +remove_file=Bain an comhad [notification] notifications=Fógraí unread=Gan léamh read=Léigh +no_unread=Gan aon fhógraí neamh-léite. +no_read=Gan aon fhógraí léite. +pin=Fógra bioráin +mark_as_read=Marcáil mar léite +mark_as_unread=Marcáil mar neamh-léite +mark_all_as_read=Marcáil gach ceann mar léite subscriptions=Síntiúis watching=Ag féachaint no_subscriptions=Gan síntiúis [gpg] +default_key=Sínithe leis an eochair réamhshocraithe +error.extract_sign=Theip ar an síniú a bhaint +error.generate_hash=Theip ar hash gealltanas a ghiniúint +error.no_committer_account=Níl aon chuntas nasctha le seoladh ríomhphoist an tiomnóra +error.no_gpg_keys_found=Níor aimsíodh aon eochair aithne don síniú seo sa bhunachar +error.not_signed_commit=Ní tiomantas sínithe +error.failed_retrieval_gpg_keys=Theip ar aisghabháil eochair ar bith a bhí ceangailte le cuntas an tiomnóra +error.probable_bad_signature=RABHADH! Cé go bhfuil eochair leis an ID seo sa bhunachar sonraí ní fhíoraíonn sé an tiomantas seo! Tá an tiomantas seo AMHRASACH. +error.probable_bad_default_signature=RABHADH! Cé go bhfuil an t-aitheantas seo ag an eochair réamhshocraithe ní fíoraíonn sé an tiomantas seo! Tá an tiomantas seo AMHRASACH. [units] unit=Aonad +error.no_unit_allowed_repo=Níl cead agat rochtain a fháil ar aon chuid den tiomantas seo. +error.unit_not_allowed=Níl cead agat an rannán stóras seo a rochtain. [packages] title=Pacáistí +desc=Bainistigh pacáistí stórais. +empty=Níl aon phacáistí ann fós. +no_metadata=Gan aon mheiteashonraí. +empty.documentation=Le haghaidh tuilleadh eolais ar chlárlann na bpacáistí, féach ar na doiciméid. +empty.repo=An ndearna tú uaslódáil ar phacáiste, ach nach bhfuil sé léirithe anseo? Téigh go socruithe pacáiste agus nasc leis an stóras seo é. +registry.documentation=Le haghaidh tuilleadh eolais ar chlárlann %s, féach ar na doiciméid. filter.type=Cineál filter.type.all=Gach +filter.no_result=Níor thug do scagaire aon torthaí. filter.container.tagged=Clibeáilte filter.container.untagged=Gan chlib +published_by=Foilsithe %[1]s ag %[3]s +published_by_in=Foilsithe ag %[1]s ag %[3]s in %[5]s +installation=Suiteáil +about=Maidir leis an bpacáiste seo +requirements=Riachtanais +dependencies=Spleithiúlachtaí +keywords=Eochairfhocail details=Sonraí details.author=Údar +details.project_site=Suíomh an Tionscadail +details.repository_site=Suíomh Stóras +details.documentation_site=Suíomh Doiciméadaithe +details.license=Ceadúnas +assets=Sócmhainní +versions=Leaganacha +versions.view_all=Féach ar gach +dependency.id=ID dependency.version=Leagan +alpine.registry=Socraigh an chlár seo tríd an url a chur i do chomhad /etc/apk/repositories: +alpine.registry.key=Íoslódáil eochair RSA poiblí na clárlainne isteach san fhillteán /etc/apk/keys/ chun an síniú innéacs a fhíorú: +alpine.registry.info=Roghnaigh $branch agus $repository ón liosta thíos. +alpine.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +alpine.repository=Eolas Stórais alpine.repository.branches=Brainsí alpine.repository.repositories=Stórais +alpine.repository.architectures=Ailtireachtaí +cargo.registry=Socraigh an clárlann seo sa chomhad cumraíochta lasta (mar shampla ~/.cargo/config.toml): +cargo.install=Chun an pacáiste a shuiteáil ag baint úsáide as Cargo, reáchtáil an t-ordú seo a leanas: +chef.registry=Socraigh an clárlann seo i do chomhad ~/.chef/config.rb: +chef.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +composer.registry=Socraigh an chlár seo i do chomhad ~/.composer/config.json: +composer.install=Chun an pacáiste a shuiteáil ag baint úsáide as Cumadóir, reáchtáil an t-ordú seo a leanas: +composer.dependencies=Spleithiúlachtaí +composer.dependencies.development=Spleithiúlachtaí Forbartha conan.details.repository=Stóras +conan.registry=Socraigh an clárlann seo ón líne ordaithe: +conan.install=Chun an pacáiste a shuiteáil ag úsáid Conan, reáchtáil an t-ordú seo a leanas: +conda.registry=Socraigh an chlár seo mar stóras Conda i do chomhad .condarc: +conda.install=Chun an pacáiste a shuiteáil ag úsáid Conda, reáchtáil an t-ordú seo a leanas: container.details.type=Cineál Íomhá container.details.platform=Ardán +container.pull=Tarraing an íomhá ón líne ordaithe: +container.digest=Díleáigh: container.multi_arch=Córas Oibriúcháin / Ailtireacht +container.layers=Sraitheanna Íomhá container.labels=Lipéid container.labels.key=Eochair container.labels.value=Luach +cran.registry=Cumraigh an chlárlann seo i do chomhad Rprofile.site: +cran.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +debian.registry=Socraigh an clárlann seo ón líne ordaithe: +debian.registry.info=Roghnaigh $distribution agus $component ón liosta thíos. +debian.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: debian.repository=Eolas Stóras +debian.repository.distributions=Dáiltí debian.repository.components=Comhpháirteanna debian.repository.architectures=Ailtireachtaí +generic.download=Íoslódáil pacáiste ón líne ordaithe: +go.install=Suiteáil an pacáiste ón líne ordaithe: +helm.registry=Socraigh an clárlann seo ón líne ordaithe: +helm.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +maven.registry=Socraigh an clárlann seo i do chomhad pom.xml tionscadail: +maven.install=Chun an pacáiste a úsáid cuir na nithe seo a leanas sa bhloc spleáchais sa chomhad pom.xml: +maven.install2=Rith tríd an líne ordaithe: +maven.download=Chun an spleáchas a íoslódáil, rith tríd an líne ordaithe: +nuget.registry=Socraigh an clárlann seo ón líne ordaithe: +nuget.install=Chun an pacáiste a shuiteáil ag úsáid NuGet, reáchtáil an t-ordú seo a leanas: +nuget.dependency.framework=Spriocchreat +npm.registry=Socraigh an chlárlann seo i do chomhad .npmrc do thionscadail: +npm.install=Chun an pacáiste a shuiteáil ag úsáid npm, reáchtáil an t-ordú seo a leanas: +npm.install2=nó cuir leis an gcomhad package.json é: +npm.dependencies=Spleithiúlachtaí +npm.dependencies.development=Spleithiúlachtaí Forbartha +npm.dependencies.bundle=Spleáchais Chuachta +npm.dependencies.peer=Spleithiúlachtaí Piaraí +npm.dependencies.optional=Spleáchais Roghnacha npm.details.tag=Clib +pub.install=Chun an pacáiste a shuiteáil ag úsáid Dart, reáchtáil an t-ordú seo a leanas: +pypi.requires=Teastaíonn Python +pypi.install=Chun an pacáiste a shuiteáil ag úsáid pip, reáchtáil an t-ordú seo a leanas: +rpm.registry=Socraigh an clárlann seo ón líne ordaithe: +rpm.distros.redhat=ar dháileadh bunaithe ar RedHat +rpm.distros.suse=ar dháileadh bunaithe ar SUSE +rpm.install=Chun an pacáiste a shuiteáil, rith an t-ordú seo a leanas: +rpm.repository=Eolas Stóras +rpm.repository.architectures=Ailtireachtaí +rpm.repository.multiple_groups=Tá an pacáiste seo ar fáil i ngrúpaí éagsúla. +rubygems.install=Chun an pacáiste a shuiteáil ag baint úsáide as gem, reáchtáil an t-ordú seo a leanas: +rubygems.install2=nó cuir leis an Gemfile é: +rubygems.dependencies.runtime=Spleáchais Rith-Ama +rubygems.dependencies.development=Spleáchais Forbartha +rubygems.required.ruby=Éilíonn leagan Ruby +rubygems.required.rubygems=Éilíonn leagan RubyGem +swift.registry=Socraigh an clárlann seo ón líne ordaithe: +swift.install=Cuir an pacáiste i do chomhad Package.swift: +swift.install2=agus reáchtáil an t-ordú seo a leanas: +vagrant.install=Chun bosca Vagrant a chur leis, reáchtáil an t-ordú seo a leanas: +settings.link=Nasc an pacáiste seo le stóras +settings.link.description=Má nascann tú pacáiste le stóras, liostaítear an pacáiste i liosta pacáistí an stórais. +settings.link.select=Roghnaigh Stóras +settings.link.button=Nuashonraigh Nasc Stórais +settings.link.success=D'éirigh le nasc an stórais a nuashonrú. +settings.link.error=Theip ar an nasc stóras a nuashonrú. +settings.delete=Scrios pacáiste +settings.delete.description=Tá pacáiste a scriosadh buan agus ní féidir é a chur ar ais. +settings.delete.notice=Tá tú ar tí %s (%s) a scriosadh. Tá an oibríocht seo dochúlaithe, an bhfuil tú cinnte? +settings.delete.success=Tá an pacáiste scriosta. +settings.delete.error=Theip ar an pacáiste a scriosadh. +owner.settings.cargo.title=Innéacs Clárlann Lasta +owner.settings.cargo.initialize=Innéacs a chur i dtosach +owner.settings.cargo.initialize.description=Tá gá le stóras innéacs speisialta Git chun an clárlann Cargo a úsáid. Tríd an rogha seo, cruthófar an stóras (nó athchruthófar é) agus cumrófar é go huathoibríoch. +owner.settings.cargo.initialize.error=Níorbh fhéidir an t-innéacs Cargo a thúsú: %v +owner.settings.cargo.initialize.success=Cruthaíodh an t-innéacs Cargo go rathúil. +owner.settings.cargo.rebuild=Innéacs Atógáil +owner.settings.cargo.rebuild.description=Is féidir atógáil a bheith úsáideach mura bhfuil an t-innéacs sioncronaithe leis na pacáistí Cargo stóráilte. +owner.settings.cargo.rebuild.error=Níorbh fhéidir an t-innéacs Cargo a atógáil: %v +owner.settings.cargo.rebuild.success=D'éirigh leis an innéacs Cargo a atógáil. +owner.settings.cleanuprules.title=Bainistigh Rialacha Glanta +owner.settings.cleanuprules.add=Cuir Riail Glantacháin leis +owner.settings.cleanuprules.edit=Cuir Riail Glantacháin in eagar +owner.settings.cleanuprules.none=Níl aon rialacha glanta ar fáil. Féach ar na doiciméid le do thoil. +owner.settings.cleanuprules.preview=Réamhamharc Riail Glantacháin +owner.settings.cleanuprules.preview.overview=Tá pacáistí %d beartaithe a bhaint. +owner.settings.cleanuprules.preview.none=Ní hionann riail glantacháin agus pacáistí ar bith. owner.settings.cleanuprules.enabled=Cumasaithe +owner.settings.cleanuprules.pattern_full_match=Cuir patrún i bhfeidhm ar ainm an phacáiste iomlán +owner.settings.cleanuprules.keep.title=Coinnítear leaganacha a mheaitseálann leis na rialacha seo, fiú má mheaitseálann siad riail bhaint thíos. +owner.settings.cleanuprules.keep.count=Coinnigh an ceann is déanaí +owner.settings.cleanuprules.keep.count.1=1 leagan in aghaidh an phacáiste +owner.settings.cleanuprules.keep.count.n=Leaganacha %d in aghaidh an phacáiste +owner.settings.cleanuprules.keep.pattern=Coinnigh leaganacha meaitseála +owner.settings.cleanuprules.keep.pattern.container=Coinnítear an leagan is déanaí le haghaidh pacáistí Coimeádán i gcónaí. +owner.settings.cleanuprules.remove.title=Baintear leaganacha a mheaitseálann leis na rialacha seo, mura deir riail thuas iad a choinneáil. +owner.settings.cleanuprules.remove.days=Bain leaganacha níos sine ná +owner.settings.cleanuprules.remove.pattern=Bain leaganacha meaitseála +owner.settings.cleanuprules.success.update=Nuashonraíodh an riail ghlantacháin. +owner.settings.cleanuprules.success.delete=Scriosadh an riail glantacháin. +owner.settings.chef.title=Clárlann Chef +owner.settings.chef.keypair=Gin péire eochair +owner.settings.chef.keypair.description=Tá eochairphéire riachtanach le fíordheimhniú a dhéanamh ar chlárlann an Chef. Má tá péire eochrach ginte agat roimhe seo, má ghinfidh tú eochairphéire nua, scriosfar an seanphéire eochair. [secrets] +secrets=Rúin +description=Cuirfear rúin ar aghaidh chuig gníomhartha áirithe agus ní féidir iad a léamh ar mhalairt. +none=Níl aon rúin ann fós. +creation=Cuir Rúnda leis +creation.name_placeholder=carachtair alfanumair nó íoslaghda amháin nach féidir a thosú le GITEA_ nó GITHUB_ +creation.value_placeholder=Ionchur ábhar ar bith. Fágfar spás bán ag tús agus ag deireadh ar lár. +creation.success=Tá an rún "%s" curtha leis. +creation.failed=Theip ar an rún a chur leis. +deletion=Bain rún +deletion.description=Is buan rún a bhaint agus ní féidir é a chealú. Lean ort? +deletion.success=Tá an rún bainte. +deletion.failed=Theip ar rún a bhaint. +management=Bainistíocht Rúin [actions] +actions=Gníomhartha - - +unit.desc=Bainistigh gníomhartha + +status.unknown=Anaithnid +status.waiting=Ag fanacht +status.running=Ag rith +status.success=Rath +status.failure=Teip +status.cancelled=Cealaíodh +status.skipped=Scipeáilte +status.blocked=Blocáilte + +runners=Reathaitheoirí +runners.runner_manage_panel=Bainistíocht reathaithe +runners.new=Cruthaigh reathaí nua +runners.new_notice=Conas reathaí a thosú +runners.status=Stádas +runners.id=ID runners.name=Ainm runners.owner_type=Cineál runners.description=Cur síos runners.labels=Lipéid +runners.last_online=Am Ar Líne Deiridh +runners.runner_title=Reathaí +runners.task_list=Tascanna le déanaí ar an reathaí seo +runners.task_list.no_tasks=Níl aon tasc ann fós. runners.task_list.run=Rith +runners.task_list.status=Stádas runners.task_list.repository=Stóras runners.task_list.commit=Tiomantas +runners.task_list.done_at=Déanta ag +runners.edit_runner=Cuir Reathaí in Eagar +runners.update_runner=Nuashonrú Athruithe +runners.update_runner_success=Nuashonraíodh an Reathaí +runners.update_runner_failed=Theip ar an reathaí a nuashonrú +runners.delete_runner=Scrios an reathaí seo +runners.delete_runner_success=Scriosadh an reathaí go rathúil +runners.delete_runner_failed=Theip ar an reathaí a scriosadh +runners.delete_runner_header=Deimhnigh an reathaí seo a scriosadh +runners.delete_runner_notice=Má tá tasc ar siúl ar an reathaí seo, cuirfear deireadh leis agus marcáil mar theip. Féadfaidh sé sreabhadh oibre tógála a bhriseadh. +runners.none=Níl aon reathaí ar fáil +runners.status.unspecified=Anaithnid +runners.status.idle=Díomhaoin runners.status.active=Gníomhach +runners.status.offline=As líne runners.version=Leagan runners.reset_registration_token=Athshocraigh comhartha clár runners.reset_registration_token_success=D'éirigh le hathshocrú comhartha clárúcháin an dara háit @@ -3455,11 +3700,54 @@ runs.commit=Tiomantas runs.scheduled=Sceidealaithe runs.pushed_by=bhrú ag runs.invalid_workflow_helper=Tá comhad cumraíochta sreabhadh oibre nebhailí. Seiceáil do chomhad cumraithe le do thoil: %s - - - +runs.no_matching_online_runner_helper=Gan aon reathaí ar líne a mheaitseáil le lipéad: %s +runs.no_job_without_needs=Caithfidh post amháin ar a laghad a bheith sa sreabhadh oibre gan spleáchas. +runs.no_job=Caithfidh post amháin ar a laghad a bheith sa sreabhadh oibre +runs.actor=Aisteoir +runs.status=Stádas +runs.actors_no_select=Gach aisteoir +runs.status_no_select=Gach stádas +runs.no_results=Níor mheaitseáil aon torthaí. +runs.no_workflows=Níl aon sreafaí oibre ann fós. +runs.no_workflows.quick_start=Níl a fhios agam conas tosú le Gitea Actions? Féach an treoirleabhar mear tosaithe. +runs.no_workflows.documentation=Le haghaidh tuilleadh eolais ar Gitea Actions, féach ar na doiciméid. +runs.no_runs=Níl aon rith ag an sreabhadh oibre fós. +runs.empty_commit_message=(teachtaireacht tiomantas folamh) +runs.expire_log_message=Glanadh logaí toisc go raibh siad ró-sean. + +workflow.disable=Díchumasaigh sreabhadh oibre +workflow.disable_success=D'éirigh le sreabhadh oibre '%s' a dhíchumasú. +workflow.enable=Cumasaigh sreabhadh oibre +workflow.enable_success=Cumasaíodh sreabhadh oibre '%s' go rathúil. +workflow.disabled=Tá sreabhadh oibre díchumasaithe +workflow.run=Rith Sreabhadh Oibre +workflow.not_found=Níor aimsíodh sreabhadh oibre '%s'. +workflow.run_success=Ritheann sreabhadh oibre '%s' go rathúil. +workflow.from_ref=Úsáid sreabhadh oibre ó +workflow.has_workflow_dispatch=Tá comhoibriú ag an gcur i bhfeidhm seo le himeacht workflow_dispatch. + +need_approval_desc=Teastaíonn faomhadh chun sreafaí oibre a rith le haghaidh iarratas tarraingt forc. + +variables=Athróga +variables.management=Bainistíocht Athróg +variables.creation=Cuir Athróg leis +variables.none=Níl aon athróga ann fós. +variables.deletion=Bain athróg +variables.deletion.description=Tá athróg a bhaint buan agus ní féidir é a chur ar ais. Lean ar aghaidh? +variables.description=Cuirfear athróga chuig gníomhartha áirithe agus ní féidir iad a léamh ar mhalairt eile. +variables.id_not_exist=Níl athróg le ID %d ann. +variables.edit=Cuir Athróg in Eagar +variables.deletion.failed=Theip ar athróg a bhaint. +variables.deletion.success=Tá an athróg bainte. +variables.creation.failed=Theip ar athróg a chur leis. +variables.creation.success=Tá an athróg "%s" curtha leis. +variables.update.failed=Theip ar athróg a chur in eagar. +variables.update.success=Tá an t-athróg curtha in eagar. [projects] +deleted.display_name=Tionscadal scriosta +type-1.display_name=Tionscadal Aonair +type-2.display_name=Tionscadal Stórais type-3.display_name=Tionscadal Eagrúcháin [git.filemode] From dd83cfcacc989d0e7cbd21ec5eba029fdfcb72dd Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 10 Oct 2024 11:48:21 +0800 Subject: [PATCH 21/41] Refactor CSRF token (#32216) --- routers/web/auth/auth.go | 8 ++- routers/web/auth/oauth.go | 4 +- services/auth/auth.go | 4 +- services/context/csrf.go | 4 +- tests/integration/admin_user_test.go | 4 +- tests/integration/api_httpsig_test.go | 2 +- .../api_packages_container_test.go | 4 +- tests/integration/attachment_test.go | 4 +- tests/integration/auth_ldap_test.go | 6 +- .../integration/change_default_branch_test.go | 4 +- tests/integration/delete_user_test.go | 4 +- tests/integration/editor_test.go | 4 +- tests/integration/empty_repo_test.go | 8 +-- tests/integration/git_test.go | 4 +- tests/integration/integration_test.go | 26 ++++----- tests/integration/issue_test.go | 20 +++---- tests/integration/mirror_push_test.go | 4 +- tests/integration/nonascii_branches_test.go | 2 +- tests/integration/org_project_test.go | 4 +- tests/integration/org_team_invite_test.go | 57 ++++++------------- tests/integration/privateactivity_test.go | 2 +- tests/integration/pull_merge_test.go | 6 +- tests/integration/pull_status_test.go | 6 +- tests/integration/rename_branch_test.go | 2 +- tests/integration/repo_branch_test.go | 9 +-- tests/integration/signin_test.go | 2 - tests/integration/user_avatar_test.go | 2 +- tests/integration/user_test.go | 8 +-- tests/integration/xss_test.go | 2 +- 29 files changed, 90 insertions(+), 126 deletions(-) diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 5cbe2f5388ca..c9ef9193f12e 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -98,7 +98,7 @@ func autoSignIn(ctx *context.Context) (bool, error) { return false, err } - ctx.Csrf.DeleteCookie(ctx) + ctx.Csrf.PrepareForSessionUser(ctx) return true, nil } @@ -359,8 +359,8 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember, obeyRe ctx.Locale = middleware.Locale(ctx.Resp, ctx.Req) } - // Clear whatever CSRF cookie has right now, force to generate a new one - ctx.Csrf.DeleteCookie(ctx) + // force to generate a new CSRF token + ctx.Csrf.PrepareForSessionUser(ctx) // Register last login if err := user_service.UpdateUser(ctx, u, &user_service.UpdateOptions{SetLastLogin: true}); err != nil { @@ -804,6 +804,8 @@ func handleAccountActivation(ctx *context.Context, user *user_model.User) { return } + ctx.Csrf.PrepareForSessionUser(ctx) + if err := resetLocale(ctx, user); err != nil { ctx.ServerError("resetLocale", err) return diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index ccbb3bebf1f5..730d68051be3 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -358,8 +358,8 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model return } - // Clear whatever CSRF cookie has right now, force to generate a new one - ctx.Csrf.DeleteCookie(ctx) + // force to generate a new CSRF token + ctx.Csrf.PrepareForSessionUser(ctx) if err := resetLocale(ctx, u); err != nil { ctx.ServerError("resetLocale", err) diff --git a/services/auth/auth.go b/services/auth/auth.go index a2523a2452e9..43ff95f05302 100644 --- a/services/auth/auth.go +++ b/services/auth/auth.go @@ -103,8 +103,8 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore middleware.SetLocaleCookie(resp, user.Language, 0) - // Clear whatever CSRF has right now, force to generate a new one + // force to generate a new CSRF token if ctx := gitea_context.GetWebContext(req); ctx != nil { - ctx.Csrf.DeleteCookie(ctx) + ctx.Csrf.PrepareForSessionUser(ctx) } } diff --git a/services/context/csrf.go b/services/context/csrf.go index 9b66d613e3b4..7b475a8fd858 100644 --- a/services/context/csrf.go +++ b/services/context/csrf.go @@ -129,10 +129,8 @@ func (c *csrfProtector) PrepareForSessionUser(ctx *Context) { } if needsNew { - // FIXME: actionId. c.token = GenerateCsrfToken(c.opt.Secret, c.id, "POST", time.Now()) - cookie := newCsrfCookie(&c.opt, c.token) - ctx.Resp.Header().Add("Set-Cookie", cookie.String()) + ctx.Resp.Header().Add("Set-Cookie", newCsrfCookie(&c.opt, c.token).String()) } ctx.Data["CsrfToken"] = c.token diff --git a/tests/integration/admin_user_test.go b/tests/integration/admin_user_test.go index 669060c787d4..090e60da291f 100644 --- a/tests/integration/admin_user_test.go +++ b/tests/integration/admin_user_test.go @@ -51,7 +51,7 @@ func testSuccessfullEdit(t *testing.T, formData user_model.User) { func makeRequest(t *testing.T, formData user_model.User, headerCode int) { session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/admin/users/"+strconv.Itoa(int(formData.ID))+"/edit") + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", "/admin/users/"+strconv.Itoa(int(formData.ID))+"/edit", map[string]string{ "_csrf": csrf, "user_name": formData.Name, @@ -72,7 +72,7 @@ func TestAdminDeleteUser(t *testing.T) { session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/admin/users/8/edit") + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", "/admin/users/8/delete", map[string]string{ "_csrf": csrf, }) diff --git a/tests/integration/api_httpsig_test.go b/tests/integration/api_httpsig_test.go index cca477f5e138..b9dc508ad092 100644 --- a/tests/integration/api_httpsig_test.go +++ b/tests/integration/api_httpsig_test.go @@ -95,7 +95,7 @@ func TestHTTPSigCert(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/user/settings/keys") + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", "/user/settings/keys", map[string]string{ "_csrf": csrf, "content": "user1", diff --git a/tests/integration/api_packages_container_test.go b/tests/integration/api_packages_container_test.go index 409e7513a6e6..3905ad1b7036 100644 --- a/tests/integration/api_packages_container_test.go +++ b/tests/integration/api_packages_container_test.go @@ -784,7 +784,7 @@ func TestPackageContainer(t *testing.T) { newOwnerName := "newUsername" req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": newOwnerName, "email": "user2@example.com", "language": "en-US", @@ -794,7 +794,7 @@ func TestPackageContainer(t *testing.T) { t.Run(fmt.Sprintf("Catalog[%s]", newOwnerName), checkCatalog(newOwnerName)) req = NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": user.Name, "email": "user2@example.com", "language": "en-US", diff --git a/tests/integration/attachment_test.go b/tests/integration/attachment_test.go index 11aa03bb7e71..30c394e9b02f 100644 --- a/tests/integration/attachment_test.go +++ b/tests/integration/attachment_test.go @@ -57,14 +57,14 @@ func createAttachment(t *testing.T, session *TestSession, csrf, repoURL, filenam func TestCreateAnonymousAttachment(t *testing.T) { defer tests.PrepareTestEnv(t)() session := emptyTestSession(t) - createAttachment(t, session, GetCSRF(t, session, "/user/login"), "user2/repo1", "image.png", generateImg(), http.StatusSeeOther) + createAttachment(t, session, GetAnonymousCSRFToken(t, session), "user2/repo1", "image.png", generateImg(), http.StatusSeeOther) } func TestCreateIssueAttachment(t *testing.T) { defer tests.PrepareTestEnv(t)() const repoURL = "user2/repo1" session := loginUser(t, "user2") - uuid := createAttachment(t, session, GetCSRF(t, session, repoURL), repoURL, "image.png", generateImg(), http.StatusOK) + uuid := createAttachment(t, session, GetUserCSRFToken(t, session), repoURL, "image.png", generateImg(), http.StatusOK) req := NewRequest(t, "GET", repoURL+"/issues/new") resp := session.MakeRequest(t, req, http.StatusOK) diff --git a/tests/integration/auth_ldap_test.go b/tests/integration/auth_ldap_test.go index 317787f40311..deb79187eb91 100644 --- a/tests/integration/auth_ldap_test.go +++ b/tests/integration/auth_ldap_test.go @@ -156,7 +156,7 @@ func addAuthSourceLDAP(t *testing.T, sshKeyAttribute, groupFilter string, groupM groupTeamMap = groupMapParams[1] } session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/admin/auths/new") + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", "/admin/auths/new", buildAuthSourceLDAPPayload(csrf, sshKeyAttribute, groupFilter, groupTeamMap, groupTeamMapRemoval)) session.MakeRequest(t, req, http.StatusSeeOther) } @@ -252,7 +252,7 @@ func TestLDAPUserSyncWithEmptyUsernameAttribute(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/admin/auths/new") + csrf := GetUserCSRFToken(t, session) payload := buildAuthSourceLDAPPayload(csrf, "", "", "", "") payload["attribute_username"] = "" req := NewRequestWithValues(t, "POST", "/admin/auths/new", payload) @@ -487,7 +487,7 @@ func TestLDAPPreventInvalidGroupTeamMap(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - csrf := GetCSRF(t, session, "/admin/auths/new") + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", "/admin/auths/new", buildAuthSourceLDAPPayload(csrf, "", "", `{"NOT_A_VALID_JSON"["MISSING_DOUBLE_POINT"]}`, "off")) session.MakeRequest(t, req, http.StatusOK) // StatusOK = failed, StatusSeeOther = ok } diff --git a/tests/integration/change_default_branch_test.go b/tests/integration/change_default_branch_test.go index 703834b71296..729eb1e4ce66 100644 --- a/tests/integration/change_default_branch_test.go +++ b/tests/integration/change_default_branch_test.go @@ -22,7 +22,7 @@ func TestChangeDefaultBranch(t *testing.T) { session := loginUser(t, owner.Name) branchesURL := fmt.Sprintf("/%s/%s/settings/branches", owner.Name, repo.Name) - csrf := GetCSRF(t, session, branchesURL) + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", branchesURL, map[string]string{ "_csrf": csrf, "action": "default_branch", @@ -30,7 +30,7 @@ func TestChangeDefaultBranch(t *testing.T) { }) session.MakeRequest(t, req, http.StatusSeeOther) - csrf = GetCSRF(t, session, branchesURL) + csrf = GetUserCSRFToken(t, session) req = NewRequestWithValues(t, "POST", branchesURL, map[string]string{ "_csrf": csrf, "action": "default_branch", diff --git a/tests/integration/delete_user_test.go b/tests/integration/delete_user_test.go index 806b87dc4cef..ad3c88288200 100644 --- a/tests/integration/delete_user_test.go +++ b/tests/integration/delete_user_test.go @@ -33,7 +33,7 @@ func TestUserDeleteAccount(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user8") - csrf := GetCSRF(t, session, "/user/settings/account") + csrf := GetUserCSRFToken(t, session) urlStr := fmt.Sprintf("/user/settings/account/delete?password=%s", userPassword) req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ "_csrf": csrf, @@ -48,7 +48,7 @@ func TestUserDeleteAccountStillOwnRepos(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user2") - csrf := GetCSRF(t, session, "/user/settings/account") + csrf := GetUserCSRFToken(t, session) urlStr := fmt.Sprintf("/user/settings/account/delete?password=%s", userPassword) req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ "_csrf": csrf, diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index f510c79bc6b0..f0f71b80d1b5 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -49,7 +49,7 @@ func TestCreateFileOnProtectedBranch(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { session := loginUser(t, "user2") - csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + csrf := GetUserCSRFToken(t, session) // Change master branch to protected req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ "_csrf": csrf, @@ -84,7 +84,7 @@ func TestCreateFileOnProtectedBranch(t *testing.T) { assert.Contains(t, resp.Body.String(), "Cannot commit to protected branch "master".") // remove the protected branch - csrf = GetCSRF(t, session, "/user2/repo1/settings/branches") + csrf = GetUserCSRFToken(t, session) // Change master branch to protected req = NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/1/delete", map[string]string{ diff --git a/tests/integration/empty_repo_test.go b/tests/integration/empty_repo_test.go index 002aa5600e08..630a3c03af89 100644 --- a/tests/integration/empty_repo_test.go +++ b/tests/integration/empty_repo_test.go @@ -29,7 +29,7 @@ import ( func testAPINewFile(t *testing.T, session *TestSession, user, repo, branch, treePath, content string) *httptest.ResponseRecorder { url := fmt.Sprintf("/%s/%s/_new/%s", user, repo, branch) req := NewRequestWithValues(t, "POST", url, map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "commit_choice": "direct", "tree_path": treePath, "content": content, @@ -63,7 +63,7 @@ func TestEmptyRepoAddFile(t *testing.T) { doc := NewHTMLParser(t, resp.Body).Find(`input[name="commit_choice"]`) assert.Empty(t, doc.AttrOr("checked", "_no_")) req = NewRequestWithValues(t, "POST", "/user30/empty/_new/"+setting.Repository.DefaultBranch, map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "commit_choice": "direct", "tree_path": "test-file.md", "content": "newly-added-test-file", @@ -89,7 +89,7 @@ func TestEmptyRepoUploadFile(t *testing.T) { body := &bytes.Buffer{} mpForm := multipart.NewWriter(body) - _ = mpForm.WriteField("_csrf", GetCSRF(t, session, "/user/settings")) + _ = mpForm.WriteField("_csrf", GetUserCSRFToken(t, session)) file, _ := mpForm.CreateFormFile("file", "uploaded-file.txt") _, _ = io.Copy(file, bytes.NewBufferString("newly-uploaded-test-file")) _ = mpForm.Close() @@ -101,7 +101,7 @@ func TestEmptyRepoUploadFile(t *testing.T) { assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respMap)) req = NewRequestWithValues(t, "POST", "/user30/empty/_upload/"+setting.Repository.DefaultBranch, map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "commit_choice": "direct", "files": respMap["uuid"], "tree_path": "", diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go index ac56cffe5e6d..f024d22c4a19 100644 --- a/tests/integration/git_test.go +++ b/tests/integration/git_test.go @@ -462,7 +462,7 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes func doProtectBranch(ctx APITestContext, branch, userToWhitelistPush, userToWhitelistForcePush, unprotectedFilePatterns string) func(t *testing.T) { // We are going to just use the owner to set the protection. return func(t *testing.T) { - csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings/branches", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) + csrf := GetUserCSRFToken(t, ctx.Session) formData := map[string]string{ "_csrf": csrf, @@ -644,7 +644,7 @@ func doPushCreate(ctx APITestContext, u *url.URL) func(t *testing.T) { func doBranchDelete(ctx APITestContext, owner, repo, branch string) func(*testing.T) { return func(t *testing.T) { - csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/branches", url.PathEscape(owner), url.PathEscape(repo))) + csrf := GetUserCSRFToken(t, ctx.Session) req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/branches/delete?name=%s", url.PathEscape(owner), url.PathEscape(repo), url.QueryEscape(branch)), map[string]string{ "_csrf": csrf, diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index 1f12430fcfbf..f72ac5f51c35 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -486,23 +486,19 @@ func VerifyJSONSchema(t testing.TB, resp *httptest.ResponseRecorder, schemaFile assert.True(t, result.Valid()) } -// GetCSRF returns CSRF token from body -// If it fails, it means the CSRF token is not found in the response body returned by the url with the given session. -// In this case, you should find a better url to get it. -func GetCSRF(t testing.TB, session *TestSession, urlStr string) string { +// GetUserCSRFToken returns CSRF token for current user +func GetUserCSRFToken(t testing.TB, session *TestSession) string { t.Helper() - req := NewRequest(t, "GET", urlStr) - resp := session.MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - csrf := doc.GetCSRF() - require.NotEmpty(t, csrf) - return csrf + cookie := session.GetCookie("_csrf") + require.NotEmpty(t, cookie) + return cookie.Value } -// GetCSRFFrom returns CSRF token from body -func GetCSRFFromCookie(t testing.TB, session *TestSession, urlStr string) string { +// GetUserCSRFToken returns CSRF token for anonymous user (not logged in) +func GetAnonymousCSRFToken(t testing.TB, session *TestSession) string { t.Helper() - req := NewRequest(t, "GET", urlStr) - session.MakeRequest(t, req, http.StatusOK) - return session.GetCookie("_csrf").Value + resp := session.MakeRequest(t, NewRequest(t, "GET", "/user/login"), http.StatusOK) + csrfToken := NewHTMLParser(t, resp.Body).GetCSRF() + require.NotEmpty(t, csrfToken) + return csrfToken } diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 308b82d4b950..df45da84a55d 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -197,21 +197,21 @@ func TestEditIssue(t *testing.T) { issueURL := testNewIssue(t, session, "user2", "repo1", "Title", "Description") req := NewRequestWithValues(t, "POST", fmt.Sprintf("%s/content", issueURL), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": "modified content", "context": fmt.Sprintf("/%s/%s", "user2", "repo1"), }) session.MakeRequest(t, req, http.StatusOK) req = NewRequestWithValues(t, "POST", fmt.Sprintf("%s/content", issueURL), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": "modified content", "context": fmt.Sprintf("/%s/%s", "user2", "repo1"), }) session.MakeRequest(t, req, http.StatusBadRequest) req = NewRequestWithValues(t, "POST", fmt.Sprintf("%s/content", issueURL), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": "modified content", "content_version": "1", "context": fmt.Sprintf("/%s/%s", "user2", "repo1"), @@ -246,11 +246,11 @@ func TestIssueCommentDelete(t *testing.T) { // Using the ID of a comment that does not belong to the repository must fail req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d/delete", "user5", "repo4", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), }) session.MakeRequest(t, req, http.StatusNotFound) req = NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d/delete", "user2", "repo1", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), }) session.MakeRequest(t, req, http.StatusOK) unittest.AssertNotExistsBean(t, &issues_model.Comment{ID: commentID}) @@ -270,13 +270,13 @@ func TestIssueCommentUpdate(t *testing.T) { // Using the ID of a comment that does not belong to the repository must fail req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user5", "repo4", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": modifiedContent, }) session.MakeRequest(t, req, http.StatusNotFound) req = NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": modifiedContent, }) session.MakeRequest(t, req, http.StatusOK) @@ -298,7 +298,7 @@ func TestIssueCommentUpdateSimultaneously(t *testing.T) { modifiedContent := comment.Content + "MODIFIED" req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": modifiedContent, }) session.MakeRequest(t, req, http.StatusOK) @@ -306,13 +306,13 @@ func TestIssueCommentUpdateSimultaneously(t *testing.T) { modifiedContent = comment.Content + "2" req = NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": modifiedContent, }) session.MakeRequest(t, req, http.StatusBadRequest) req = NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{ - "_csrf": GetCSRF(t, session, issueURL), + "_csrf": GetUserCSRFToken(t, session), "content": modifiedContent, "content_version": "1", }) diff --git a/tests/integration/mirror_push_test.go b/tests/integration/mirror_push_test.go index 1c262b334967..6b1c808cf46b 100644 --- a/tests/integration/mirror_push_test.go +++ b/tests/integration/mirror_push_test.go @@ -81,7 +81,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { func doCreatePushMirror(ctx APITestContext, address, username, password string) func(t *testing.T) { return func(t *testing.T) { - csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) + csrf := GetUserCSRFToken(t, ctx.Session) req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{ "_csrf": csrf, @@ -101,7 +101,7 @@ func doCreatePushMirror(ctx APITestContext, address, username, password string) func doRemovePushMirror(ctx APITestContext, address, username, password string, pushMirrorID int) func(t *testing.T) { return func(t *testing.T) { - csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) + csrf := GetUserCSRFToken(t, ctx.Session) req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{ "_csrf": csrf, diff --git a/tests/integration/nonascii_branches_test.go b/tests/integration/nonascii_branches_test.go index a189273eacd8..e5934a148d89 100644 --- a/tests/integration/nonascii_branches_test.go +++ b/tests/integration/nonascii_branches_test.go @@ -17,7 +17,7 @@ import ( func setDefaultBranch(t *testing.T, session *TestSession, user, repo, branch string) { location := path.Join("/", user, repo, "settings/branches") - csrf := GetCSRF(t, session, location) + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", location, map[string]string{ "_csrf": csrf, "action": "default_branch", diff --git a/tests/integration/org_project_test.go b/tests/integration/org_project_test.go index 31d10f16ff11..c3894fd7afde 100644 --- a/tests/integration/org_project_test.go +++ b/tests/integration/org_project_test.go @@ -34,7 +34,7 @@ func TestOrgProjectAccess(t *testing.T) { // change the org's visibility to private session := loginUser(t, "user2") req = NewRequestWithValues(t, "POST", "/org/org3/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/org3/-/projects"), + "_csrf": GetUserCSRFToken(t, session), "name": "org3", "visibility": "2", }) @@ -48,7 +48,7 @@ func TestOrgProjectAccess(t *testing.T) { // disable team1's project unit session = loginUser(t, "user2") req = NewRequestWithValues(t, "POST", "/org/org3/teams/team1/edit", map[string]string{ - "_csrf": GetCSRF(t, session, "/org3/-/projects"), + "_csrf": GetUserCSRFToken(t, session), "team_name": "team1", "repo_access": "specific", "permission": "read", diff --git a/tests/integration/org_team_invite_test.go b/tests/integration/org_team_invite_test.go index 919769a61a25..274fde408505 100644 --- a/tests/integration/org_team_invite_test.go +++ b/tests/integration/org_team_invite_test.go @@ -40,7 +40,7 @@ func TestOrgTeamEmailInvite(t *testing.T) { session := loginUser(t, "user1") teamURL := fmt.Sprintf("/org/%s/teams/%s", org.Name, team.Name) - csrf := GetCSRF(t, session, teamURL) + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", teamURL+"/action/add", map[string]string{ "_csrf": csrf, "uid": "1", @@ -59,7 +59,7 @@ func TestOrgTeamEmailInvite(t *testing.T) { // join the team inviteURL := fmt.Sprintf("/org/invite/%s", invites[0].Token) - csrf = GetCSRF(t, session, inviteURL) + csrf = GetUserCSRFToken(t, session) req = NewRequestWithValues(t, "POST", inviteURL, map[string]string{ "_csrf": csrf, }) @@ -94,7 +94,7 @@ func TestOrgTeamEmailInviteRedirectsExistingUser(t *testing.T) { teamURL := fmt.Sprintf("/org/%s/teams/%s", org.Name, team.Name) req := NewRequestWithValues(t, "POST", teamURL+"/action/add", map[string]string{ - "_csrf": GetCSRF(t, session, teamURL), + "_csrf": GetUserCSRFToken(t, session), "uid": "1", "uname": user.Email, }) @@ -137,7 +137,7 @@ func TestOrgTeamEmailInviteRedirectsExistingUser(t *testing.T) { // make the request req = NewRequestWithValues(t, "POST", test.RedirectURL(resp), map[string]string{ - "_csrf": GetCSRF(t, session, test.RedirectURL(resp)), + "_csrf": GetUserCSRFToken(t, session), }) resp = session.MakeRequest(t, req, http.StatusSeeOther) req = NewRequest(t, "GET", test.RedirectURL(resp)) @@ -165,7 +165,7 @@ func TestOrgTeamEmailInviteRedirectsNewUser(t *testing.T) { teamURL := fmt.Sprintf("/org/%s/teams/%s", org.Name, team.Name) req := NewRequestWithValues(t, "POST", teamURL+"/action/add", map[string]string{ - "_csrf": GetCSRF(t, session, teamURL), + "_csrf": GetUserCSRFToken(t, session), "uid": "1", "uname": "doesnotexist@example.com", }) @@ -210,7 +210,7 @@ func TestOrgTeamEmailInviteRedirectsNewUser(t *testing.T) { // make the redirected request req = NewRequestWithValues(t, "POST", test.RedirectURL(resp), map[string]string{ - "_csrf": GetCSRF(t, session, test.RedirectURL(resp)), + "_csrf": GetUserCSRFToken(t, session), }) resp = session.MakeRequest(t, req, http.StatusSeeOther) req = NewRequest(t, "GET", test.RedirectURL(resp)) @@ -233,22 +233,18 @@ func TestOrgTeamEmailInviteRedirectsNewUserWithActivation(t *testing.T) { } // enable email confirmation temporarily - defer func(prevVal bool) { - setting.Service.RegisterEmailConfirm = prevVal - }(setting.Service.RegisterEmailConfirm) - setting.Service.RegisterEmailConfirm = true - + defer test.MockVariableValue(&setting.Service.RegisterEmailConfirm, true)() defer tests.PrepareTestEnv(t)() org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) - // create the invite + // user1: create the invite session := loginUser(t, "user1") teamURL := fmt.Sprintf("/org/%s/teams/%s", org.Name, team.Name) req := NewRequestWithValues(t, "POST", teamURL+"/action/add", map[string]string{ - "_csrf": GetCSRF(t, session, teamURL), + "_csrf": GetUserCSRFToken(t, session), "uid": "1", "uname": "doesnotexist@example.com", }) @@ -261,53 +257,34 @@ func TestOrgTeamEmailInviteRedirectsNewUserWithActivation(t *testing.T) { assert.NoError(t, err) assert.Len(t, invites, 1) - // accept the invite + // new user: accept the invite + session = emptyTestSession(t) + inviteURL := fmt.Sprintf("/org/invite/%s", invites[0].Token) req = NewRequest(t, "GET", fmt.Sprintf("/user/sign_up?redirect_to=%s", url.QueryEscape(inviteURL))) - inviteResp := MakeRequest(t, req, http.StatusOK) - - doc := NewHTMLParser(t, resp.Body) + session.MakeRequest(t, req, http.StatusOK) req = NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{ - "_csrf": doc.GetCSRF(), "user_name": "doesnotexist", "email": "doesnotexist@example.com", "password": "examplePassword!1", "retype": "examplePassword!1", }) - for _, c := range inviteResp.Result().Cookies() { - req.AddCookie(c) - } - - resp = MakeRequest(t, req, http.StatusOK) + session.MakeRequest(t, req, http.StatusOK) user, err := user_model.GetUserByName(db.DefaultContext, "doesnotexist") assert.NoError(t, err) - ch := http.Header{} - ch.Add("Cookie", strings.Join(resp.Header()["Set-Cookie"], ";")) - cr := http.Request{Header: ch} - - session = emptyTestSession(t) - baseURL, err := url.Parse(setting.AppURL) - assert.NoError(t, err) - session.jar.SetCookies(baseURL, cr.Cookies()) - activateURL := fmt.Sprintf("/user/activate?code=%s", user.GenerateEmailActivateCode("doesnotexist@example.com")) req = NewRequestWithValues(t, "POST", activateURL, map[string]string{ "password": "examplePassword!1", }) - // use the cookies set by the signup request - for _, c := range inviteResp.Result().Cookies() { - req.AddCookie(c) - } - resp = session.MakeRequest(t, req, http.StatusSeeOther) // should be redirected to accept the invite assert.Equal(t, inviteURL, test.RedirectURL(resp)) req = NewRequestWithValues(t, "POST", test.RedirectURL(resp), map[string]string{ - "_csrf": GetCSRF(t, session, test.RedirectURL(resp)), + "_csrf": GetUserCSRFToken(t, session), }) resp = session.MakeRequest(t, req, http.StatusSeeOther) req = NewRequest(t, "GET", test.RedirectURL(resp)) @@ -342,7 +319,7 @@ func TestOrgTeamEmailInviteRedirectsExistingUserWithLogin(t *testing.T) { teamURL := fmt.Sprintf("/org/%s/teams/%s", org.Name, team.Name) req := NewRequestWithValues(t, "POST", teamURL+"/action/add", map[string]string{ - "_csrf": GetCSRF(t, session, teamURL), + "_csrf": GetUserCSRFToken(t, session), "uid": "1", "uname": user.Email, }) @@ -366,7 +343,7 @@ func TestOrgTeamEmailInviteRedirectsExistingUserWithLogin(t *testing.T) { // make the request req = NewRequestWithValues(t, "POST", test.RedirectURL(resp), map[string]string{ - "_csrf": GetCSRF(t, session, test.RedirectURL(resp)), + "_csrf": GetUserCSRFToken(t, session), }) resp = session.MakeRequest(t, req, http.StatusSeeOther) req = NewRequest(t, "GET", test.RedirectURL(resp)) diff --git a/tests/integration/privateactivity_test.go b/tests/integration/privateactivity_test.go index 5362462f7df9..a1fbadec99ed 100644 --- a/tests/integration/privateactivity_test.go +++ b/tests/integration/privateactivity_test.go @@ -48,7 +48,7 @@ func testPrivateActivityDoSomethingForActionEntries(t *testing.T) { func testPrivateActivityHelperEnablePrivateActivity(t *testing.T) { session := loginUser(t, privateActivityTestUser) req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": privateActivityTestUser, "email": privateActivityTestUser + "@example.com", "language": "en-US", diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 9a412329a1c0..c1c8a8bf4e83 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -694,7 +694,7 @@ func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { }) // add protected branch for commit status - csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + csrf := GetUserCSRFToken(t, session) // Change master branch to protected req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ "_csrf": csrf, @@ -777,7 +777,7 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) { }) // add protected branch for commit status - csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + csrf := GetUserCSRFToken(t, session) // Change master branch to protected req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ "_csrf": csrf, @@ -905,7 +905,7 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing. session := loginUser(t, "user1") // add protected branch for commit status - csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + csrf := GetUserCSRFToken(t, session) // Change master branch to protected req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ "_csrf": csrf, diff --git a/tests/integration/pull_status_test.go b/tests/integration/pull_status_test.go index 26e1baeb1130..ac9036ca962f 100644 --- a/tests/integration/pull_status_test.go +++ b/tests/integration/pull_status_test.go @@ -29,7 +29,7 @@ func TestPullCreate_CommitStatus(t *testing.T) { url := path.Join("user1", "repo1", "compare", "master...status1") req := NewRequestWithValues(t, "POST", url, map[string]string{ - "_csrf": GetCSRF(t, session, url), + "_csrf": GetUserCSRFToken(t, session), "title": "pull request from status1", }, ) @@ -129,7 +129,7 @@ func TestPullCreate_EmptyChangesWithDifferentCommits(t *testing.T) { url := path.Join("user1", "repo1", "compare", "master...status1") req := NewRequestWithValues(t, "POST", url, map[string]string{ - "_csrf": GetCSRF(t, session, url), + "_csrf": GetUserCSRFToken(t, session), "title": "pull request from status1", }, ) @@ -152,7 +152,7 @@ func TestPullCreate_EmptyChangesWithSameCommits(t *testing.T) { url := path.Join("user1", "repo1", "compare", "master...status1") req := NewRequestWithValues(t, "POST", url, map[string]string{ - "_csrf": GetCSRF(t, session, url), + "_csrf": GetUserCSRFToken(t, session), "title": "pull request from status1", }, ) diff --git a/tests/integration/rename_branch_test.go b/tests/integration/rename_branch_test.go index 71bfb6b6cb26..576264ba9519 100644 --- a/tests/integration/rename_branch_test.go +++ b/tests/integration/rename_branch_test.go @@ -54,7 +54,7 @@ func testRenameBranch(t *testing.T, u *url.URL) { assert.Equal(t, "main", repo1.DefaultBranch) // create branch1 - csrf := GetCSRF(t, session, "/user2/repo1/src/branch/main") + csrf := GetUserCSRFToken(t, session) req = NewRequestWithValues(t, "POST", "/user2/repo1/branches/_new/branch/main", map[string]string{ "_csrf": csrf, diff --git a/tests/integration/repo_branch_test.go b/tests/integration/repo_branch_test.go index f5217374b00f..6d1cc8afcf10 100644 --- a/tests/integration/repo_branch_test.go +++ b/tests/integration/repo_branch_test.go @@ -27,14 +27,7 @@ import ( ) func testCreateBranch(t testing.TB, session *TestSession, user, repo, oldRefSubURL, newBranchName string, expectedStatus int) string { - var csrf string - if expectedStatus == http.StatusNotFound { - // src/branch/branch_name may not container "_csrf" input, - // so we need to get it from cookies not from body - csrf = GetCSRFFromCookie(t, session, path.Join(user, repo, "src/branch/master")) - } else { - csrf = GetCSRFFromCookie(t, session, path.Join(user, repo, "src", oldRefSubURL)) - } + csrf := GetUserCSRFToken(t, session) req := NewRequestWithValues(t, "POST", path.Join(user, repo, "branches/_new", oldRefSubURL), map[string]string{ "_csrf": csrf, "new_branch_name": newBranchName, diff --git a/tests/integration/signin_test.go b/tests/integration/signin_test.go index 77e19bba9634..886d4a825932 100644 --- a/tests/integration/signin_test.go +++ b/tests/integration/signin_test.go @@ -21,7 +21,6 @@ import ( func testLoginFailed(t *testing.T, username, password, message string) { session := emptyTestSession(t) req := NewRequestWithValues(t, "POST", "/user/login", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/login"), "user_name": username, "password": password, }) @@ -68,7 +67,6 @@ func TestSigninWithRememberMe(t *testing.T) { session := emptyTestSession(t) req := NewRequestWithValues(t, "POST", "/user/login", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/login"), "user_name": user.Name, "password": userPassword, "remember": "on", diff --git a/tests/integration/user_avatar_test.go b/tests/integration/user_avatar_test.go index ec5813df0d52..caca9a3e560c 100644 --- a/tests/integration/user_avatar_test.go +++ b/tests/integration/user_avatar_test.go @@ -37,7 +37,7 @@ func TestUserAvatar(t *testing.T) { } session := loginUser(t, "user2") - csrf := GetCSRF(t, session, "/user/settings") + csrf := GetUserCSRFToken(t, session) imgData := &bytes.Buffer{} diff --git a/tests/integration/user_test.go b/tests/integration/user_test.go index c4544f37aa3a..53d88aeb37b1 100644 --- a/tests/integration/user_test.go +++ b/tests/integration/user_test.go @@ -33,7 +33,7 @@ func TestRenameUsername(t *testing.T) { session := loginUser(t, "user2") req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": "newUsername", "email": "user2@example.com", "language": "en-US", @@ -77,7 +77,7 @@ func TestRenameInvalidUsername(t *testing.T) { t.Logf("Testing username %s", invalidUsername) req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": invalidUsername, "email": "user2@example.com", }) @@ -135,7 +135,7 @@ func TestRenameReservedUsername(t *testing.T) { for _, reservedUsername := range reservedUsernames { t.Logf("Testing username %s", reservedUsername) req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": reservedUsername, "email": "user2@example.com", "language": "en-US", @@ -293,7 +293,7 @@ func TestUserLocationMapLink(t *testing.T) { session := loginUser(t, "user2") req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": "user2", "email": "user@example.com", "language": "en-US", diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go index e575ed3990cc..a8eaa5fc6246 100644 --- a/tests/integration/xss_test.go +++ b/tests/integration/xss_test.go @@ -21,7 +21,7 @@ func TestXSSUserFullName(t *testing.T) { session := loginUser(t, user.Name) req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), + "_csrf": GetUserCSRFToken(t, session), "name": user.Name, "full_name": fullName, "email": user.Email, From c2217670dd7514e17fc9c1f17d7e459b842ea798 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 10 Oct 2024 12:56:49 +0800 Subject: [PATCH 22/41] Move admin routers from /admin to /-/admin (#32189) Resolve #32181 --------- Co-authored-by: wxiaoguang --- models/user/user.go | 1 - routers/api/v1/admin/hooks.go | 4 +- routers/api/v1/utils/hook.go | 4 +- routers/web/admin/admin.go | 4 +- routers/web/admin/applications.go | 4 +- routers/web/admin/auths.go | 8 ++-- routers/web/admin/config.go | 4 +- routers/web/admin/emails.go | 2 +- routers/web/admin/hooks.go | 10 ++--- routers/web/admin/notice.go | 2 +- routers/web/admin/packages.go | 4 +- routers/web/admin/queue.go | 6 +-- routers/web/admin/repos.go | 8 ++-- routers/web/admin/runners.go | 2 +- routers/web/admin/stacktrace.go | 2 +- routers/web/admin/users.go | 22 +++++----- routers/web/repo/setting/runners.go | 2 +- routers/web/repo/setting/variables.go | 2 +- routers/web/repo/setting/webhook.go | 4 +- routers/web/web.go | 2 +- templates/admin/auth/list.tmpl | 6 +-- templates/admin/config.tmpl | 4 +- templates/admin/config_settings.tmpl | 2 +- templates/admin/cron.tmpl | 2 +- templates/admin/dashboard.tmpl | 2 +- templates/admin/emails/list.tmpl | 2 +- templates/admin/navbar.tmpl | 42 +++++++++---------- templates/admin/notice.tmpl | 2 +- templates/admin/packages/list.tmpl | 2 +- templates/admin/repo/list.tmpl | 2 +- templates/admin/repo/unadopted.tmpl | 6 +-- templates/admin/stacktrace.tmpl | 2 +- templates/admin/user/list.tmpl | 2 +- templates/base/footer_content.tmpl | 2 +- templates/base/head_navbar.tmpl | 2 +- templates/shared/user/profile_big_avatar.tmpl | 2 +- tests/integration/admin_config_test.go | 2 +- tests/integration/admin_user_test.go | 12 +++--- tests/integration/auth_ldap_test.go | 10 ++--- tests/integration/user_test.go | 1 - web_src/js/features/admin/config.ts | 2 +- web_src/js/features/admin/selfcheck.ts | 2 +- 42 files changed, 103 insertions(+), 105 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index d5c4833cdefa..c1e3d5d1c76c 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -565,7 +565,6 @@ var ( ".", "..", ".well-known", - "admin", "api", "assets", "attachments", diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index fa60836b7e79..db481fbf594b 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -45,7 +45,7 @@ func ListHooks(ctx *context.APIContext) { } hooks := make([]*api.Hook, len(sysHooks)) for i, hook := range sysHooks { - h, err := webhook_service.ToHook(setting.AppURL+"/admin", hook) + h, err := webhook_service.ToHook(setting.AppURL+"/-/admin", hook) if err != nil { ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) return @@ -83,7 +83,7 @@ func GetHook(ctx *context.APIContext) { } return } - h, err := webhook_service.ToHook("/admin/", hook) + h, err := webhook_service.ToHook("/-/admin/", hook) if err != nil { ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) return diff --git a/routers/api/v1/utils/hook.go b/routers/api/v1/utils/hook.go index f1abd49a7d60..4328878e1961 100644 --- a/routers/api/v1/utils/hook.go +++ b/routers/api/v1/utils/hook.go @@ -100,7 +100,7 @@ func checkCreateHookOption(ctx *context.APIContext, form *api.CreateHookOption) func AddSystemHook(ctx *context.APIContext, form *api.CreateHookOption) { hook, ok := addHook(ctx, form, 0, 0) if ok { - h, err := webhook_service.ToHook(setting.AppSubURL+"/admin", hook) + h, err := webhook_service.ToHook(setting.AppSubURL+"/-/admin", hook) if err != nil { ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) return @@ -268,7 +268,7 @@ func EditSystemHook(ctx *context.APIContext, form *api.EditHookOption, hookID in ctx.Error(http.StatusInternalServerError, "GetSystemOrDefaultWebhook", err) return } - h, err := webhook_service.ToHook(setting.AppURL+"/admin", updated) + h, err := webhook_service.ToHook(setting.AppURL+"/-/admin", updated) if err != nil { ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) return diff --git a/routers/web/admin/admin.go b/routers/web/admin/admin.go index 6fc97c949e45..37c54b5362f3 100644 --- a/routers/web/admin/admin.go +++ b/routers/web/admin/admin.go @@ -185,9 +185,9 @@ func DashboardPost(ctx *context.Context) { } } if form.From == "monitor" { - ctx.Redirect(setting.AppSubURL + "/admin/monitor/cron") + ctx.Redirect(setting.AppSubURL + "/-/admin/monitor/cron") } else { - ctx.Redirect(setting.AppSubURL + "/admin") + ctx.Redirect(setting.AppSubURL + "/-/admin") } } diff --git a/routers/web/admin/applications.go b/routers/web/admin/applications.go index 858339807462..9b48f21eca9f 100644 --- a/routers/web/admin/applications.go +++ b/routers/web/admin/applications.go @@ -23,8 +23,8 @@ var ( func newOAuth2CommonHandlers() *user_setting.OAuth2CommonHandlers { return &user_setting.OAuth2CommonHandlers{ OwnerID: 0, - BasePathList: fmt.Sprintf("%s/admin/applications", setting.AppSubURL), - BasePathEditPrefix: fmt.Sprintf("%s/admin/applications/oauth2", setting.AppSubURL), + BasePathList: fmt.Sprintf("%s/-/admin/applications", setting.AppSubURL), + BasePathEditPrefix: fmt.Sprintf("%s/-/admin/applications/oauth2", setting.AppSubURL), TplAppEdit: tplSettingsOauth2ApplicationEdit, } } diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go index 3b89be0f8fc2..60e2b7c86fcf 100644 --- a/routers/web/admin/auths.go +++ b/routers/web/admin/auths.go @@ -324,7 +324,7 @@ func NewAuthSourcePost(ctx *context.Context) { log.Trace("Authentication created by admin(%s): %s", ctx.Doer.Name, form.Name) ctx.Flash.Success(ctx.Tr("admin.auths.new_success", form.Name)) - ctx.Redirect(setting.AppSubURL + "/admin/auths") + ctx.Redirect(setting.AppSubURL + "/-/admin/auths") } // EditAuthSource render editing auth source page @@ -437,7 +437,7 @@ func EditAuthSourcePost(ctx *context.Context) { log.Trace("Authentication changed by admin(%s): %d", ctx.Doer.Name, source.ID) ctx.Flash.Success(ctx.Tr("admin.auths.update_success")) - ctx.Redirect(setting.AppSubURL + "/admin/auths/" + strconv.FormatInt(form.ID, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/auths/" + strconv.FormatInt(form.ID, 10)) } // DeleteAuthSource response for deleting an auth source @@ -454,11 +454,11 @@ func DeleteAuthSource(ctx *context.Context) { } else { ctx.Flash.Error(fmt.Sprintf("auth_service.DeleteSource: %v", err)) } - ctx.JSONRedirect(setting.AppSubURL + "/admin/auths/" + url.PathEscape(ctx.PathParam(":authid"))) + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/auths/" + url.PathEscape(ctx.PathParam(":authid"))) return } log.Trace("Authentication deleted by admin(%s): %d", ctx.Doer.Name, source.ID) ctx.Flash.Success(ctx.Tr("admin.auths.deletion_success")) - ctx.JSONRedirect(setting.AppSubURL + "/admin/auths") + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/auths") } diff --git a/routers/web/admin/config.go b/routers/web/admin/config.go index 2ae93e9cacc9..d067250a5b6b 100644 --- a/routers/web/admin/config.go +++ b/routers/web/admin/config.go @@ -40,7 +40,7 @@ func SendTestMail(ctx *context.Context) { ctx.Flash.Info(ctx.Tr("admin.config.test_mail_sent", email)) } - ctx.Redirect(setting.AppSubURL + "/admin/config") + ctx.Redirect(setting.AppSubURL + "/-/admin/config") } // TestCache test the cache settings @@ -56,7 +56,7 @@ func TestCache(ctx *context.Context) { } } - ctx.Redirect(setting.AppSubURL + "/admin/config") + ctx.Redirect(setting.AppSubURL + "/-/admin/config") } func shadowPasswordKV(cfgItem, splitter string) string { diff --git a/routers/web/admin/emails.go b/routers/web/admin/emails.go index f0d85550706f..49338fbd7c44 100644 --- a/routers/web/admin/emails.go +++ b/routers/web/admin/emails.go @@ -134,7 +134,7 @@ func ActivateEmail(ctx *context.Context) { ctx.Flash.Info(ctx.Tr("admin.emails.updated")) } - redirect, _ := url.Parse(setting.AppSubURL + "/admin/emails") + redirect, _ := url.Parse(setting.AppSubURL + "/-/admin/emails") q := url.Values{} if val := ctx.FormTrim("q"); len(val) > 0 { q.Set("q", val) diff --git a/routers/web/admin/hooks.go b/routers/web/admin/hooks.go index e40580b6e776..91ca6e3fa7bf 100644 --- a/routers/web/admin/hooks.go +++ b/routers/web/admin/hooks.go @@ -36,8 +36,8 @@ func DefaultOrSystemWebhooks(ctx *context.Context) { sys["Title"] = ctx.Tr("admin.systemhooks") sys["Description"] = ctx.Tr("admin.systemhooks.desc", "https://docs.gitea.com/usage/webhooks") sys["Webhooks"], err = webhook.GetSystemWebhooks(ctx, optional.None[bool]()) - sys["BaseLink"] = setting.AppSubURL + "/admin/hooks" - sys["BaseLinkNew"] = setting.AppSubURL + "/admin/system-hooks" + sys["BaseLink"] = setting.AppSubURL + "/-/admin/hooks" + sys["BaseLinkNew"] = setting.AppSubURL + "/-/admin/system-hooks" if err != nil { ctx.ServerError("GetWebhooksAdmin", err) return @@ -46,8 +46,8 @@ func DefaultOrSystemWebhooks(ctx *context.Context) { def["Title"] = ctx.Tr("admin.defaulthooks") def["Description"] = ctx.Tr("admin.defaulthooks.desc", "https://docs.gitea.com/usage/webhooks") def["Webhooks"], err = webhook.GetDefaultWebhooks(ctx) - def["BaseLink"] = setting.AppSubURL + "/admin/hooks" - def["BaseLinkNew"] = setting.AppSubURL + "/admin/default-hooks" + def["BaseLink"] = setting.AppSubURL + "/-/admin/hooks" + def["BaseLinkNew"] = setting.AppSubURL + "/-/admin/default-hooks" if err != nil { ctx.ServerError("GetWebhooksAdmin", err) return @@ -67,5 +67,5 @@ func DeleteDefaultOrSystemWebhook(ctx *context.Context) { ctx.Flash.Success(ctx.Tr("repo.settings.webhook_deletion_success")) } - ctx.JSONRedirect(setting.AppSubURL + "/admin/hooks") + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/hooks") } diff --git a/routers/web/admin/notice.go b/routers/web/admin/notice.go index 36303cbc06e9..5f7432e62907 100644 --- a/routers/web/admin/notice.go +++ b/routers/web/admin/notice.go @@ -74,5 +74,5 @@ func EmptyNotices(ctx *context.Context) { log.Trace("System notices deleted by admin (%s): [start: %d]", ctx.Doer.Name, 0) ctx.Flash.Success(ctx.Tr("admin.notices.delete_success")) - ctx.Redirect(setting.AppSubURL + "/admin/notices") + ctx.Redirect(setting.AppSubURL + "/-/admin/notices") } diff --git a/routers/web/admin/packages.go b/routers/web/admin/packages.go index 39f064a1be63..2b9edc622d6c 100644 --- a/routers/web/admin/packages.go +++ b/routers/web/admin/packages.go @@ -99,7 +99,7 @@ func DeletePackageVersion(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("packages.settings.delete.success")) - ctx.JSONRedirect(setting.AppSubURL + "/admin/packages?page=" + url.QueryEscape(ctx.FormString("page")) + "&q=" + url.QueryEscape(ctx.FormString("q")) + "&type=" + url.QueryEscape(ctx.FormString("type"))) + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/packages?page=" + url.QueryEscape(ctx.FormString("page")) + "&q=" + url.QueryEscape(ctx.FormString("q")) + "&type=" + url.QueryEscape(ctx.FormString("type"))) } func CleanupExpiredData(ctx *context.Context) { @@ -109,5 +109,5 @@ func CleanupExpiredData(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("admin.packages.cleanup.success")) - ctx.Redirect(setting.AppSubURL + "/admin/packages") + ctx.Redirect(setting.AppSubURL + "/-/admin/packages") } diff --git a/routers/web/admin/queue.go b/routers/web/admin/queue.go index dce8f8077f59..59b17f88e69c 100644 --- a/routers/web/admin/queue.go +++ b/routers/web/admin/queue.go @@ -53,7 +53,7 @@ func QueueSet(ctx *context.Context) { maxNumber, err = strconv.Atoi(maxNumberStr) if err != nil { ctx.Flash.Error(ctx.Tr("admin.monitor.queue.settings.maxnumberworkers.error")) - ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) return } if maxNumber < -1 { @@ -65,7 +65,7 @@ func QueueSet(ctx *context.Context) { mq.SetWorkerMaxNumber(maxNumber) ctx.Flash.Success(ctx.Tr("admin.monitor.queue.settings.changed")) - ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) } func QueueRemoveAllItems(ctx *context.Context) { @@ -85,5 +85,5 @@ func QueueRemoveAllItems(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("admin.monitor.queue.settings.remove_all_items_done")) - ctx.Redirect(setting.AppSubURL + "/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/monitor/queue/" + strconv.FormatInt(qid, 10)) } diff --git a/routers/web/admin/repos.go b/routers/web/admin/repos.go index e7c27145dce9..75e5ee5d86fc 100644 --- a/routers/web/admin/repos.go +++ b/routers/web/admin/repos.go @@ -58,7 +58,7 @@ func DeleteRepo(ctx *context.Context) { log.Trace("Repository deleted: %s", repo.FullName()) ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success")) - ctx.JSONRedirect(setting.AppSubURL + "/admin/repos?page=" + url.QueryEscape(ctx.FormString("page")) + "&sort=" + url.QueryEscape(ctx.FormString("sort"))) + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/repos?page=" + url.QueryEscape(ctx.FormString("page")) + "&sort=" + url.QueryEscape(ctx.FormString("sort"))) } // UnadoptedRepos lists the unadopted repositories @@ -114,7 +114,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) { dirSplit := strings.SplitN(dir, "/", 2) if len(dirSplit) != 2 { - ctx.Redirect(setting.AppSubURL + "/admin/repos") + ctx.Redirect(setting.AppSubURL + "/-/admin/repos") return } @@ -122,7 +122,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) { if err != nil { if user_model.IsErrUserNotExist(err) { log.Debug("User does not exist: %s", dirSplit[0]) - ctx.Redirect(setting.AppSubURL + "/admin/repos") + ctx.Redirect(setting.AppSubURL + "/-/admin/repos") return } ctx.ServerError("GetUserByName", err) @@ -160,5 +160,5 @@ func AdoptOrDeleteRepository(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("repo.delete_preexisting_success", dir)) } - ctx.Redirect(setting.AppSubURL + "/admin/repos/unadopted?search=true&q=" + url.QueryEscape(q) + "&page=" + url.QueryEscape(page)) + ctx.Redirect(setting.AppSubURL + "/-/admin/repos/unadopted?search=true&q=" + url.QueryEscape(q) + "&page=" + url.QueryEscape(page)) } diff --git a/routers/web/admin/runners.go b/routers/web/admin/runners.go index d73290a8dba8..4b89237364ee 100644 --- a/routers/web/admin/runners.go +++ b/routers/web/admin/runners.go @@ -9,5 +9,5 @@ import ( ) func RedirectToDefaultSetting(ctx *context.Context) { - ctx.Redirect(setting.AppSubURL + "/admin/actions/runners") + ctx.Redirect(setting.AppSubURL + "/-/admin/actions/runners") } diff --git a/routers/web/admin/stacktrace.go b/routers/web/admin/stacktrace.go index b3b635af5b6d..ff751be62170 100644 --- a/routers/web/admin/stacktrace.go +++ b/routers/web/admin/stacktrace.go @@ -42,5 +42,5 @@ func Stacktrace(ctx *context.Context) { func StacktraceCancel(ctx *context.Context) { pid := ctx.PathParam("pid") process.GetManager().Cancel(process.IDType(pid)) - ctx.JSONRedirect(setting.AppSubURL + "/admin/monitor/stacktrace") + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/monitor/stacktrace") } diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 48ff8ea04b01..a6b0b5c78bb1 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -215,14 +215,14 @@ func NewUserPost(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name)) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + strconv.FormatInt(u.ID, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + strconv.FormatInt(u.ID, 10)) } func prepareUserInfo(ctx *context.Context) *user_model.User { u, err := user_model.GetUserByID(ctx, ctx.PathParamInt64(":userid")) if err != nil { if user_model.IsErrUserNotExist(err) { - ctx.Redirect(setting.AppSubURL + "/admin/users") + ctx.Redirect(setting.AppSubURL + "/-/admin/users") } else { ctx.ServerError("GetUserByID", err) } @@ -481,7 +481,7 @@ func EditUserPost(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) } // DeleteUser response for deleting a user @@ -495,7 +495,7 @@ func DeleteUser(ctx *context.Context) { // admin should not delete themself if u.ID == ctx.Doer.ID { ctx.Flash.Error(ctx.Tr("admin.users.cannot_delete_self")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) return } @@ -503,16 +503,16 @@ func DeleteUser(ctx *context.Context) { switch { case models.IsErrUserOwnRepos(err): ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) case models.IsErrUserHasOrgs(err): ctx.Flash.Error(ctx.Tr("admin.users.still_has_org")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) case models.IsErrUserOwnPackages(err): ctx.Flash.Error(ctx.Tr("admin.users.still_own_packages")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) case models.IsErrDeleteLastAdminUser(err): ctx.Flash.Error(ctx.Tr("auth.last_admin")) - ctx.Redirect(setting.AppSubURL + "/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + url.PathEscape(ctx.PathParam(":userid"))) default: ctx.ServerError("DeleteUser", err) } @@ -521,7 +521,7 @@ func DeleteUser(ctx *context.Context) { log.Trace("Account deleted by admin (%s): %s", ctx.Doer.Name, u.Name) ctx.Flash.Success(ctx.Tr("admin.users.deletion_success")) - ctx.Redirect(setting.AppSubURL + "/admin/users") + ctx.Redirect(setting.AppSubURL + "/-/admin/users") } // AvatarPost response for change user's avatar request @@ -538,7 +538,7 @@ func AvatarPost(ctx *context.Context) { ctx.Flash.Success(ctx.Tr("settings.update_user_avatar_success")) } - ctx.Redirect(setting.AppSubURL + "/admin/users/" + strconv.FormatInt(u.ID, 10)) + ctx.Redirect(setting.AppSubURL + "/-/admin/users/" + strconv.FormatInt(u.ID, 10)) } // DeleteAvatar render delete avatar page @@ -552,5 +552,5 @@ func DeleteAvatar(ctx *context.Context) { ctx.Flash.Error(err.Error()) } - ctx.JSONRedirect(setting.AppSubURL + "/admin/users/" + strconv.FormatInt(u.ID, 10)) + ctx.JSONRedirect(setting.AppSubURL + "/-/admin/users/" + strconv.FormatInt(u.ID, 10)) } diff --git a/routers/web/repo/setting/runners.go b/routers/web/repo/setting/runners.go index 93e6f518b0be..3141d8f42ad4 100644 --- a/routers/web/repo/setting/runners.go +++ b/routers/web/repo/setting/runners.go @@ -76,7 +76,7 @@ func getRunnersCtx(ctx *context.Context) (*runnersCtx, error) { IsAdmin: true, RunnersTemplate: tplAdminRunners, RunnerEditTemplate: tplAdminRunnerEdit, - RedirectLink: setting.AppSubURL + "/admin/actions/runners/", + RedirectLink: setting.AppSubURL + "/-/admin/actions/runners/", }, nil } diff --git a/routers/web/repo/setting/variables.go b/routers/web/repo/setting/variables.go index 45b6c0f39a64..cc2e619f6624 100644 --- a/routers/web/repo/setting/variables.go +++ b/routers/web/repo/setting/variables.go @@ -74,7 +74,7 @@ func getVariablesCtx(ctx *context.Context) (*variablesCtx, error) { RepoID: 0, IsGlobal: true, VariablesTemplate: tplAdminVariables, - RedirectLink: setting.AppSubURL + "/admin/actions/variables", + RedirectLink: setting.AppSubURL + "/-/admin/actions/variables", }, nil } diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go index 76615997296c..8d548c4e3d1a 100644 --- a/routers/web/repo/setting/webhook.go +++ b/routers/web/repo/setting/webhook.go @@ -100,8 +100,8 @@ func getOwnerRepoCtx(ctx *context.Context) (*ownerRepoCtx, error) { return &ownerRepoCtx{ IsAdmin: true, IsSystemWebhook: ctx.PathParam(":configType") == "system-hooks", - Link: path.Join(setting.AppSubURL, "/admin/hooks"), - LinkNew: path.Join(setting.AppSubURL, "/admin/", ctx.PathParam(":configType")), + Link: path.Join(setting.AppSubURL, "/-/admin/hooks"), + LinkNew: path.Join(setting.AppSubURL, "/-/admin/", ctx.PathParam(":configType")), NewTemplate: tplAdminHookNew, }, nil } diff --git a/routers/web/web.go b/routers/web/web.go index 69258bca1818..80399ec499c5 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -683,7 +683,7 @@ func registerRoutes(m *web.Router) { adminReq := verifyAuthWithOptions(&common.VerifyOptions{SignInRequired: true, AdminRequired: true}) // ***** START: Admin ***** - m.Group("/admin", func() { + m.Group("/-/admin", func() { m.Get("", admin.Dashboard) m.Get("/system_status", admin.SystemStatus) m.Post("", web.Bind(forms.AdminDashboardForm{}), admin.DashboardPost) diff --git a/templates/admin/auth/list.tmpl b/templates/admin/auth/list.tmpl index 174dda1e2afd..705716989576 100644 --- a/templates/admin/auth/list.tmpl +++ b/templates/admin/auth/list.tmpl @@ -3,7 +3,7 @@

{{ctx.Locale.Tr "admin.auths.auth_manage_panel"}} ({{ctx.Locale.Tr "admin.total" .Total}})

@@ -23,12 +23,12 @@ {{range .Sources}} {{.ID}} - {{.Name}} + {{.Name}} {{.TypeName}} {{svg (Iif .IsActive "octicon-check" "octicon-x")}} {{DateTime "short" .UpdatedUnix}} {{DateTime "short" .CreatedUnix}} - {{svg "octicon-pencil"}} + {{svg "octicon-pencil"}} {{end}} diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index 87f18192a6f5..29a5e1b473d3 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -231,7 +231,7 @@
{{ctx.Locale.Tr "admin.config.send_test_mail"}}
-
+ {{.CsrfTokenHtml}}
@@ -263,7 +263,7 @@
{{ctx.Locale.Tr "admin.config.cache_test"}}
- + {{.CsrfTokenHtml}}
diff --git a/templates/admin/config_settings.tmpl b/templates/admin/config_settings.tmpl index 02ab5fd0fbe9..6b9bb8275cca 100644 --- a/templates/admin/config_settings.tmpl +++ b/templates/admin/config_settings.tmpl @@ -24,7 +24,7 @@ {{ctx.Locale.Tr "repository"}}
-
+
{{ctx.Locale.Tr "admin.config.open_with_editor_app_help"}} diff --git a/templates/admin/cron.tmpl b/templates/admin/cron.tmpl index bb412ef146b9..1c16ed00ae2f 100644 --- a/templates/admin/cron.tmpl +++ b/templates/admin/cron.tmpl @@ -4,7 +4,7 @@ {{ctx.Locale.Tr "admin.monitor.cron"}}
- + diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index b82922df0c77..af2349d28892 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -9,7 +9,7 @@ {{ctx.Locale.Tr "admin.dashboard.maintenance_operations"}}
- + {{.CsrfTokenHtml}}
diff --git a/templates/admin/emails/list.tmpl b/templates/admin/emails/list.tmpl index 93fbb9dfc232..835b77ea176a 100644 --- a/templates/admin/emails/list.tmpl +++ b/templates/admin/emails/list.tmpl @@ -80,7 +80,7 @@

{{ctx.Locale.Tr "admin.emails.change_email_text"}}

- + {{$.CsrfTokenHtml}} diff --git a/templates/admin/navbar.tmpl b/templates/admin/navbar.tmpl index 1b3b9d6efce6..4116357d1d23 100644 --- a/templates/admin/navbar.tmpl +++ b/templates/admin/navbar.tmpl @@ -5,10 +5,10 @@
{{ctx.Locale.Tr "admin.maintenance"}} @@ -16,16 +16,16 @@
{{ctx.Locale.Tr "admin.identity_access"}} @@ -34,11 +34,11 @@ {{ctx.Locale.Tr "admin.assets"}} @@ -48,22 +48,22 @@
{{ctx.Locale.Tr "admin.integrations"}}
{{else}} {{if not DisableWebhooks}} - + {{ctx.Locale.Tr "admin.hooks"}} {{end}} {{if .EnableOAuth2}} - + {{ctx.Locale.Tr "settings.applications"}} {{end}} @@ -72,10 +72,10 @@
{{ctx.Locale.Tr "actions.actions"}} @@ -84,30 +84,30 @@
{{ctx.Locale.Tr "admin.config"}}
- + {{ctx.Locale.Tr "admin.notices"}}
{{ctx.Locale.Tr "admin.monitor"}} diff --git a/templates/admin/notice.tmpl b/templates/admin/notice.tmpl index 68703cc88442..6e7eed76785c 100644 --- a/templates/admin/notice.tmpl +++ b/templates/admin/notice.tmpl @@ -31,7 +31,7 @@
- + {{.CsrfTokenHtml}} diff --git a/templates/admin/packages/list.tmpl b/templates/admin/packages/list.tmpl index d1d77b622015..a5ad93b89c04 100644 --- a/templates/admin/packages/list.tmpl +++ b/templates/admin/packages/list.tmpl @@ -5,7 +5,7 @@ {{ctx.Locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}}, {{ctx.Locale.Tr "admin.packages.unreferenced_size" (FileSize .TotalUnreferencedBlobSize)}})
-
+ {{.CsrfTokenHtml}}
diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl index 69031e42ebe7..77a275427ae5 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -3,7 +3,7 @@

{{ctx.Locale.Tr "admin.repos.repo_manage_panel"}} ({{ctx.Locale.Tr "admin.total" .Total}})

diff --git a/templates/admin/repo/unadopted.tmpl b/templates/admin/repo/unadopted.tmpl index a95f6b5120e2..6f26fa529159 100644 --- a/templates/admin/repo/unadopted.tmpl +++ b/templates/admin/repo/unadopted.tmpl @@ -3,7 +3,7 @@

{{ctx.Locale.Tr "admin.repos.unadopted"}}

@@ -31,7 +31,7 @@

{{ctx.Locale.Tr "repo.adopt_preexisting_content" $dir}}

-
+ {{$.CsrfTokenHtml}} @@ -48,7 +48,7 @@

{{ctx.Locale.Tr "repo.delete_preexisting_content" $dir}}

- + {{$.CsrfTokenHtml}} diff --git a/templates/admin/stacktrace.tmpl b/templates/admin/stacktrace.tmpl index e324570c9650..ce03d8055573 100644 --- a/templates/admin/stacktrace.tmpl +++ b/templates/admin/stacktrace.tmpl @@ -8,7 +8,7 @@ {{ctx.Locale.Tr "admin.monitor.stacktrace"}}
- +
{{ctx.Locale.Tr "tool.raw_seconds"}} diff --git a/templates/admin/user/list.tmpl b/templates/admin/user/list.tmpl index bc54d33431b2..bc3d83fc5c37 100644 --- a/templates/admin/user/list.tmpl +++ b/templates/admin/user/list.tmpl @@ -3,7 +3,7 @@

{{ctx.Locale.Tr "admin.users.user_manage_panel"}} ({{ctx.Locale.Tr "admin.total" .Total}})

diff --git a/templates/base/footer_content.tmpl b/templates/base/footer_content.tmpl index 8d0d8e669cca..4b9d9f5bbecf 100644 --- a/templates/base/footer_content.tmpl +++ b/templates/base/footer_content.tmpl @@ -6,7 +6,7 @@ {{if (or .ShowFooterVersion .PageIsAdmin)}} {{ctx.Locale.Tr "version"}}: {{if .IsAdmin}} - {{AppVer}} + {{AppVer}} {{else}} {{AppVer}} {{end}} diff --git a/templates/base/head_navbar.tmpl b/templates/base/head_navbar.tmpl index 7be2d96d7440..951ee590d1cc 100644 --- a/templates/base/head_navbar.tmpl +++ b/templates/base/head_navbar.tmpl @@ -158,7 +158,7 @@ {{if .IsAdmin}}
- + {{svg "octicon-server"}} {{ctx.Locale.Tr "admin_panel"}} diff --git a/templates/shared/user/profile_big_avatar.tmpl b/templates/shared/user/profile_big_avatar.tmpl index 1069209495aa..50d707176d54 100644 --- a/templates/shared/user/profile_big_avatar.tmpl +++ b/templates/shared/user/profile_big_avatar.tmpl @@ -14,7 +14,7 @@
{{if .ContextUser.FullName}}{{.ContextUser.FullName}}{{end}} {{.ContextUser.Name}} {{if .IsAdmin}} - + {{svg "octicon-gear" 18}} {{end}} diff --git a/tests/integration/admin_config_test.go b/tests/integration/admin_config_test.go index 860a92d6a32f..eec7e75fd911 100644 --- a/tests/integration/admin_config_test.go +++ b/tests/integration/admin_config_test.go @@ -17,7 +17,7 @@ func TestAdminConfig(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - req := NewRequest(t, "GET", "/admin/config") + req := NewRequest(t, "GET", "/-/admin/config") resp := session.MakeRequest(t, req, http.StatusOK) assert.True(t, test.IsNormalPageCompleted(resp.Body.String())) } diff --git a/tests/integration/admin_user_test.go b/tests/integration/admin_user_test.go index 090e60da291f..d5d7e70bc7ef 100644 --- a/tests/integration/admin_user_test.go +++ b/tests/integration/admin_user_test.go @@ -19,11 +19,11 @@ func TestAdminViewUsers(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - req := NewRequest(t, "GET", "/admin/users") + req := NewRequest(t, "GET", "/-/admin/users") session.MakeRequest(t, req, http.StatusOK) session = loginUser(t, "user2") - req = NewRequest(t, "GET", "/admin/users") + req = NewRequest(t, "GET", "/-/admin/users") session.MakeRequest(t, req, http.StatusForbidden) } @@ -31,11 +31,11 @@ func TestAdminViewUser(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") - req := NewRequest(t, "GET", "/admin/users/1") + req := NewRequest(t, "GET", "/-/admin/users/1") session.MakeRequest(t, req, http.StatusOK) session = loginUser(t, "user2") - req = NewRequest(t, "GET", "/admin/users/1") + req = NewRequest(t, "GET", "/-/admin/users/1") session.MakeRequest(t, req, http.StatusForbidden) } @@ -52,7 +52,7 @@ func testSuccessfullEdit(t *testing.T, formData user_model.User) { func makeRequest(t *testing.T, formData user_model.User, headerCode int) { session := loginUser(t, "user1") csrf := GetUserCSRFToken(t, session) - req := NewRequestWithValues(t, "POST", "/admin/users/"+strconv.Itoa(int(formData.ID))+"/edit", map[string]string{ + req := NewRequestWithValues(t, "POST", "/-/admin/users/"+strconv.Itoa(int(formData.ID))+"/edit", map[string]string{ "_csrf": csrf, "user_name": formData.Name, "login_name": formData.LoginName, @@ -73,7 +73,7 @@ func TestAdminDeleteUser(t *testing.T) { session := loginUser(t, "user1") csrf := GetUserCSRFToken(t, session) - req := NewRequestWithValues(t, "POST", "/admin/users/8/delete", map[string]string{ + req := NewRequestWithValues(t, "POST", "/-/admin/users/8/delete", map[string]string{ "_csrf": csrf, }) session.MakeRequest(t, req, http.StatusSeeOther) diff --git a/tests/integration/auth_ldap_test.go b/tests/integration/auth_ldap_test.go index deb79187eb91..8c8b6b02d145 100644 --- a/tests/integration/auth_ldap_test.go +++ b/tests/integration/auth_ldap_test.go @@ -157,7 +157,7 @@ func addAuthSourceLDAP(t *testing.T, sshKeyAttribute, groupFilter string, groupM } session := loginUser(t, "user1") csrf := GetUserCSRFToken(t, session) - req := NewRequestWithValues(t, "POST", "/admin/auths/new", buildAuthSourceLDAPPayload(csrf, sshKeyAttribute, groupFilter, groupTeamMap, groupTeamMapRemoval)) + req := NewRequestWithValues(t, "POST", "/-/admin/auths/new", buildAuthSourceLDAPPayload(csrf, sshKeyAttribute, groupFilter, groupTeamMap, groupTeamMapRemoval)) session.MakeRequest(t, req, http.StatusSeeOther) } @@ -187,7 +187,7 @@ func TestLDAPAuthChange(t *testing.T) { addAuthSourceLDAP(t, "", "") session := loginUser(t, "user1") - req := NewRequest(t, "GET", "/admin/auths") + req := NewRequest(t, "GET", "/-/admin/auths") resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) href, exists := doc.Find("table.table td a").Attr("href") @@ -255,11 +255,11 @@ func TestLDAPUserSyncWithEmptyUsernameAttribute(t *testing.T) { csrf := GetUserCSRFToken(t, session) payload := buildAuthSourceLDAPPayload(csrf, "", "", "", "") payload["attribute_username"] = "" - req := NewRequestWithValues(t, "POST", "/admin/auths/new", payload) + req := NewRequestWithValues(t, "POST", "/-/admin/auths/new", payload) session.MakeRequest(t, req, http.StatusSeeOther) for _, u := range gitLDAPUsers { - req := NewRequest(t, "GET", "/admin/users?q="+u.UserName) + req := NewRequest(t, "GET", "/-/admin/users?q="+u.UserName) resp := session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) @@ -488,6 +488,6 @@ func TestLDAPPreventInvalidGroupTeamMap(t *testing.T) { session := loginUser(t, "user1") csrf := GetUserCSRFToken(t, session) - req := NewRequestWithValues(t, "POST", "/admin/auths/new", buildAuthSourceLDAPPayload(csrf, "", "", `{"NOT_A_VALID_JSON"["MISSING_DOUBLE_POINT"]}`, "off")) + req := NewRequestWithValues(t, "POST", "/-/admin/auths/new", buildAuthSourceLDAPPayload(csrf, "", "", `{"NOT_A_VALID_JSON"["MISSING_DOUBLE_POINT"]}`, "off")) session.MakeRequest(t, req, http.StatusOK) // StatusOK = failed, StatusSeeOther = ok } diff --git a/tests/integration/user_test.go b/tests/integration/user_test.go index 53d88aeb37b1..2ba16b3d3628 100644 --- a/tests/integration/user_test.go +++ b/tests/integration/user_test.go @@ -97,7 +97,6 @@ func TestRenameReservedUsername(t *testing.T) { reservedUsernames := []string{ // ".", "..", ".well-known", // The names are not only reserved but also invalid - "admin", "api", "assets", "attachments", diff --git a/web_src/js/features/admin/config.ts b/web_src/js/features/admin/config.ts index 4ccbbacd5b6a..0d130703aeda 100644 --- a/web_src/js/features/admin/config.ts +++ b/web_src/js/features/admin/config.ts @@ -10,7 +10,7 @@ export function initAdminConfigs() { for (const el of elAdminConfig.querySelectorAll('input[type="checkbox"][data-config-dyn-key]')) { el.addEventListener('change', async () => { try { - const resp = await POST(`${appSubUrl}/admin/config`, { + const resp = await POST(`${appSubUrl}/-/admin/config`, { data: new URLSearchParams({key: el.getAttribute('data-config-dyn-key'), value: el.checked}), }); const json = await resp.json(); diff --git a/web_src/js/features/admin/selfcheck.ts b/web_src/js/features/admin/selfcheck.ts index 498c52ffb5ba..925a50130fc8 100644 --- a/web_src/js/features/admin/selfcheck.ts +++ b/web_src/js/features/admin/selfcheck.ts @@ -10,7 +10,7 @@ export async function initAdminSelfCheck() { const elContent = document.querySelector('.page-content.admin .admin-setting-content'); // send frontend self-check request - const resp = await POST(`${appSubUrl}/admin/self_check`, { + const resp = await POST(`${appSubUrl}/-/admin/self_check`, { data: new URLSearchParams({ location_origin: window.location.origin, now: Date.now(), // TODO: check time difference between server and client From 6029d78ab5006e8fb4f42adb5a8c491f19fa7b0a Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 10 Oct 2024 17:04:42 +0800 Subject: [PATCH 23/41] Improve the maintainblity of the reserved username list (#32229) --- models/user/user.go | 56 ++++++++++++++++++---------------- services/user/user_test.go | 8 ++--- tests/integration/user_test.go | 45 ++++++--------------------- 3 files changed, 41 insertions(+), 68 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index c1e3d5d1c76c..c1cb988e43dc 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -565,41 +565,43 @@ var ( ".", "..", ".well-known", - "api", - "assets", - "attachments", - "avatar", - "avatars", + + "api", // gitea api + "metrics", // prometheus metrics api + "v2", // container registry api + + "assets", // static asset files + "attachments", // issue attachments + + "avatar", // avatar by email hash + "avatars", // user avatars by file name + "repo-avatars", + "captcha", - "commits", - "debug", - "error", + "login", // oauth2 login + "org", // org create/manage, or "/org/{org}", BUT if an org is named as "invite" then it goes wrong + "repo", // repo create/migrate, etc + "user", // user login/activate/settings, etc + "explore", - "favicon.ico", - "ghost", "issues", - "login", - "manifest.json", - "metrics", + "pulls", "milestones", - "new", "notifications", - "org", - "pulls", - "raw", - "repo", - "repo-avatars", - "robots.txt", - "search", - "serviceworker.js", - "ssh_info", + + "favicon.ico", + "manifest.json", // web app manifests + "robots.txt", // search engine robots + "sitemap.xml", // search engine sitemap + "ssh_info", // agit info "swagger.v1.json", - "user", - "v2", - "gitea-actions", + + "ghost", // reserved name for deleted users (id: -1) + "gitea-actions", // gitea builtin user (id: -2) } - // DON'T ADD ANY NEW STUFF, WE SOLVE THIS WITH `/user/{obj}` PATHS! + // These names are reserved for user accounts: user's keys, user's rss feed, user's avatar, etc. + // DO NOT add any new stuff! The paths with these names are processed by `/{username}` handler (UsernameSubRoute) manually. reservedUserPatterns = []string{"*.keys", "*.gpg", "*.rss", "*.atom", "*.png"} ) diff --git a/services/user/user_test.go b/services/user/user_test.go index cd0f5975015d..efcbc669c8a3 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -114,12 +114,10 @@ func TestRenameUser(t *testing.T) { }) t.Run("Non usable username", func(t *testing.T) { - usernames := []string{"--diff", "aa.png", ".well-known", "search", "aaa.atom"} + usernames := []string{"--diff", ".well-known", "gitea-actions", "aaa.atom", "aa.png"} for _, username := range usernames { - t.Run(username, func(t *testing.T) { - assert.Error(t, user_model.IsUsableUsername(username)) - assert.Error(t, RenameUser(db.DefaultContext, user, username)) - }) + assert.Error(t, user_model.IsUsableUsername(username), "non-usable username: %s", username) + assert.Error(t, RenameUser(db.DefaultContext, user, username), "non-usable username: %s", username) } }) diff --git a/tests/integration/user_test.go b/tests/integration/user_test.go index 2ba16b3d3628..99e413c6d952 100644 --- a/tests/integration/user_test.go +++ b/tests/integration/user_test.go @@ -5,6 +5,7 @@ package integration import ( "net/http" + "strings" "testing" auth_model "code.gitea.io/gitea/models/auth" @@ -98,41 +99,12 @@ func TestRenameReservedUsername(t *testing.T) { reservedUsernames := []string{ // ".", "..", ".well-known", // The names are not only reserved but also invalid "api", - "assets", - "attachments", - "avatar", - "avatars", - "captcha", - "commits", - "debug", - "error", - "explore", - "favicon.ico", - "ghost", - "issues", - "login", - "manifest.json", - "metrics", - "milestones", - "new", - "notifications", - "org", - "pulls", - "raw", - "repo", - "repo-avatars", - "robots.txt", - "search", - "serviceworker.js", - "ssh_info", - "swagger.v1.json", - "user", - "v2", + "name.keys", } session := loginUser(t, "user2") + locale := translation.NewLocale("en-US") for _, reservedUsername := range reservedUsernames { - t.Logf("Testing username %s", reservedUsername) req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ "_csrf": GetUserCSRFToken(t, session), "name": reservedUsername, @@ -144,11 +116,12 @@ func TestRenameReservedUsername(t *testing.T) { req = NewRequest(t, "GET", test.RedirectURL(resp)) resp = session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) - assert.Contains(t, - htmlDoc.doc.Find(".ui.negative.message").Text(), - translation.NewLocale("en-US").TrString("user.form.name_reserved", reservedUsername), - ) - + actualMsg := strings.TrimSpace(htmlDoc.doc.Find(".ui.negative.message").Text()) + expectedMsg := locale.TrString("user.form.name_reserved", reservedUsername) + if strings.Contains(reservedUsername, ".") { + expectedMsg = locale.TrString("user.form.name_pattern_not_allowed", reservedUsername) + } + assert.Equal(t, expectedMsg, actualMsg) unittest.AssertNotExistsBean(t, &user_model.User{Name: reservedUsername}) } } From cb739f533358a8cf6e1b6875b3d4f0da3bfa7c95 Mon Sep 17 00:00:00 2001 From: cloudchamb3r Date: Fri, 11 Oct 2024 02:12:27 +0900 Subject: [PATCH 24/41] Fix checkbox bug on private/archive filter (#32236) fix #32235 --------- Co-authored-by: wxiaoguang --- web_src/js/components/DashboardRepoList.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue index ce165b1b3df3..986fcc11814e 100644 --- a/web_src/js/components/DashboardRepoList.vue +++ b/web_src/js/components/DashboardRepoList.vue @@ -362,9 +362,9 @@ export default sfc; // activate the IDE's Vue plugin +
+ +

Selection

diff --git a/web_src/css/base.css b/web_src/css/base.css index 223d9fbad65b..8d9f810ef8fa 100644 --- a/web_src/css/base.css +++ b/web_src/css/base.css @@ -1364,6 +1364,10 @@ table th[data-sortt-desc] .svg { min-width: 0; /* make ellipsis work */ } +.ui.multiple.selection.dropdown { + flex-wrap: wrap; +} + .ui.ui.dropdown.selection { min-width: 14em; /* match the default min width */ } From 9df5ddaf44aa5a3f319acba7b18645b7b1d4d8a2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 13 Oct 2024 11:13:55 +0800 Subject: [PATCH 30/41] Only rename a user when they should receive a different name (#32247) Fix #31996 --- services/user/user.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/user/user.go b/services/user/user.go index 2287e36c716a..9aded62a51af 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -32,6 +32,10 @@ import ( // RenameUser renames a user func RenameUser(ctx context.Context, u *user_model.User, newUserName string) error { + if newUserName == u.Name { + return nil + } + // Non-local users are not allowed to change their username. if !u.IsOrganization() && !u.IsLocal() { return user_model.ErrUserIsNotLocal{ @@ -40,10 +44,6 @@ func RenameUser(ctx context.Context, u *user_model.User, newUserName string) err } } - if newUserName == u.Name { - return nil - } - if err := user_model.IsUsableUsername(newUserName); err != nil { return err } From 74664b08a004393ce013e872e47901f52645b65a Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 14 Oct 2024 03:58:13 +0800 Subject: [PATCH 31/41] Support migrating GitHub/GitLab PR draft status (#32242) Resolve #32196 --- modules/migration/pullrequest.go | 1 + services/migrations/gitea_uploader.go | 7 ++++++- services/migrations/github.go | 1 + services/migrations/gitlab.go | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/migration/pullrequest.go b/modules/migration/pullrequest.go index 1435991bd2a8..fbfdff0315e6 100644 --- a/modules/migration/pullrequest.go +++ b/modules/migration/pullrequest.go @@ -37,6 +37,7 @@ type PullRequest struct { ForeignIndex int64 Context DownloaderContext `yaml:"-"` EnsuredSafe bool `yaml:"ensured_safe"` + IsDraft bool `yaml:"is_draft"` } func (p *PullRequest) GetLocalIndex() int64 { return p.Number } diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 4c8e036f057b..eb21b6534b8f 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -760,10 +760,15 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*issues_model pr.Updated = pr.Created } + prTitle := pr.Title + if pr.IsDraft && !issues_model.HasWorkInProgressPrefix(pr.Title) { + prTitle = fmt.Sprintf("%s %s", setting.Repository.PullRequest.WorkInProgressPrefixes[0], pr.Title) + } + issue := issues_model.Issue{ RepoID: g.repo.ID, Repo: g.repo, - Title: pr.Title, + Title: prTitle, Index: pr.Number, Content: pr.Content, MilestoneID: milestoneID, diff --git a/services/migrations/github.go b/services/migrations/github.go index a36b02ca8b22..604ab84b3964 100644 --- a/services/migrations/github.go +++ b/services/migrations/github.go @@ -737,6 +737,7 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq PatchURL: pr.GetPatchURL(), // see below for SECURITY related issues here Reactions: reactions, ForeignIndex: int64(*pr.Number), + IsDraft: pr.GetDraft(), }) // SECURITY: Ensure that the PR is safe diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go index 065b687fa687..295bc7c29f51 100644 --- a/services/migrations/gitlab.go +++ b/services/migrations/gitlab.go @@ -722,6 +722,7 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque PatchURL: pr.WebURL + ".patch", ForeignIndex: int64(pr.IID), Context: gitlabIssueContext{IsMergeRequest: true}, + IsDraft: pr.Draft, }) // SECURITY: Ensure that the PR is safe From 81aec6d621a3ea0dfb02d3b4d20b9be77c30c6ab Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 14 Oct 2024 04:28:32 +0800 Subject: [PATCH 32/41] Update scheduled tasks even if changes are pushed by "ActionsUser" (#32246) Fix #32219 --------- Co-authored-by: delvh --- services/actions/notifier_helper.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index b21d889d0369..323c6a76e422 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -116,11 +116,20 @@ func (input *notifyInput) Notify(ctx context.Context) { } func notify(ctx context.Context, input *notifyInput) error { + shouldDetectSchedules := input.Event == webhook_module.HookEventPush && input.Ref.BranchName() == input.Repo.DefaultBranch if input.Doer.IsActions() { // avoiding triggering cyclically, for example: // a comment of an issue will trigger the runner to add a new comment as reply, // and the new comment will trigger the runner again. log.Debug("ignore executing %v for event %v whose doer is %v", getMethod(ctx), input.Event, input.Doer.Name) + + // we should update schedule tasks in this case, because + // 1. schedule tasks cannot be triggered by other events, so cyclic triggering will not occur + // 2. some schedule tasks may update the repo periodically, so the refs of schedule tasks need to be updated + if shouldDetectSchedules { + return DetectAndHandleSchedules(ctx, input.Repo) + } + return nil } if input.Repo.IsEmpty || input.Repo.IsArchived { @@ -174,7 +183,6 @@ func notify(ctx context.Context, input *notifyInput) error { var detectedWorkflows []*actions_module.DetectedWorkflow actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig() - shouldDetectSchedules := input.Event == webhook_module.HookEventPush && input.Ref.BranchName() == input.Repo.DefaultBranch workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, input.Event, input.Payload, From c4b2808b896dd86323c6a0d119c8cf24752d4d8a Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Tue, 15 Oct 2024 05:23:20 +0800 Subject: [PATCH 33/41] make `show stats` work when only one file changed (#32244) fix https://github.com/go-gitea/gitea/issues/32226 in https://github.com/go-gitea/gitea/pull/27775 , it do some changes to only show diff file tree when more than one file changed. But looks it also break the `diff-file-list` logic, which looks not expected change. so try fix it. /cc @silverwind example view: ![image](https://github.com/user-attachments/assets/281e9c4f-a269-4d36-94eb-a132058aea87) Signed-off-by: a1012112796 <1012112796@qq.com> --- web_src/js/features/repo-diff-filetree.ts | 2 ++ web_src/js/features/repo-diff.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/web_src/js/features/repo-diff-filetree.ts b/web_src/js/features/repo-diff-filetree.ts index 6d9533d0669f..bc275a90f6ab 100644 --- a/web_src/js/features/repo-diff-filetree.ts +++ b/web_src/js/features/repo-diff-filetree.ts @@ -8,7 +8,9 @@ export function initDiffFileTree() { const fileTreeView = createApp(DiffFileTree); fileTreeView.mount(el); +} +export function initDiffFileList() { const fileListElement = document.querySelector('#diff-file-list'); if (!fileListElement) return; diff --git a/web_src/js/features/repo-diff.ts b/web_src/js/features/repo-diff.ts index 5d6388a43e1d..a0bd9955fe46 100644 --- a/web_src/js/features/repo-diff.ts +++ b/web_src/js/features/repo-diff.ts @@ -1,7 +1,7 @@ import $ from 'jquery'; import {initCompReactionSelector} from './comp/ReactionSelector.ts'; import {initRepoIssueContentHistory} from './repo-issue-content.ts'; -import {initDiffFileTree} from './repo-diff-filetree.ts'; +import {initDiffFileTree, initDiffFileList} from './repo-diff-filetree.ts'; import {initDiffCommitSelect} from './repo-diff-commitselect.ts'; import {validateTextareaNonEmpty} from './comp/ComboMarkdownEditor.ts'; import {initViewedCheckboxListenerFor, countAndUpdateViewedFiles, initExpandAndCollapseFilesButton} from './pull-view-file.ts'; @@ -216,6 +216,7 @@ export function initRepoDiffView() { initRepoDiffConversationForm(); if (!$('#diff-file-list').length) return; initDiffFileTree(); + initDiffFileList(); initDiffCommitSelect(); initRepoDiffShowMore(); initRepoDiffReviewButton(); From 5242e520c499bf72ec21a8df2dbdee825f98ed78 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 15 Oct 2024 14:47:07 +0800 Subject: [PATCH 34/41] Make `owner/repo/pulls` handlers use "PR reader" permission (#32254) Fix #32253 (partially) --- routers/web/web.go | 55 ++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/routers/web/web.go b/routers/web/web.go index 80399ec499c5..f28ec82c8f0b 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1461,6 +1461,35 @@ func registerRoutes(m *web.Router) { ) // end "/{username}/{reponame}/activity" + m.Group("/{username}/{reponame}", func() { + m.Group("/pulls/{index}", func() { + m.Get("", repo.SetWhitespaceBehavior, repo.GetPullDiffStats, repo.ViewIssue) + m.Get(".diff", repo.DownloadPullDiff) + m.Get(".patch", repo.DownloadPullPatch) + m.Group("/commits", func() { + m.Get("", context.RepoRef(), repo.SetWhitespaceBehavior, repo.GetPullDiffStats, repo.ViewPullCommits) + m.Get("/list", context.RepoRef(), repo.GetPullCommits) + m.Get("/{sha:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForSingleCommit) + }) + m.Post("/merge", context.RepoMustNotBeArchived(), web.Bind(forms.MergePullRequestForm{}), repo.MergePullRequest) + m.Post("/cancel_auto_merge", context.RepoMustNotBeArchived(), repo.CancelAutoMergePullRequest) + m.Post("/update", repo.UpdatePullRequest) + m.Post("/set_allow_maintainer_edit", web.Bind(forms.UpdateAllowEditsForm{}), repo.SetAllowEdits) + m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest) + m.Group("/files", func() { + m.Get("", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForAllCommitsOfPr) + m.Get("/{sha:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesStartingFromCommit) + m.Get("/{shaFrom:[a-f0-9]{7,40}}..{shaTo:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForRange) + m.Group("/reviews", func() { + m.Get("/new_comment", repo.RenderNewCodeCommentForm) + m.Post("/comments", web.Bind(forms.CodeCommentForm{}), repo.SetShowOutdatedComments, repo.CreateCodeComment) + m.Post("/submit", web.Bind(forms.SubmitReviewForm{}), repo.SubmitReview) + }, context.RepoMustNotBeArchived()) + }) + }) + }, ignSignIn, context.RepoAssignment, repo.MustAllowPulls, reqRepoPullsReader) + // end "/{username}/{reponame}/pulls/{index}": repo pull request + m.Group("/{username}/{reponame}", func() { m.Group("/activity_author_data", func() { m.Get("", repo.ActivityAuthors) @@ -1499,32 +1528,6 @@ func registerRoutes(m *web.Router) { return cancel }) - m.Group("/pulls/{index}", func() { - m.Get("", repo.SetWhitespaceBehavior, repo.GetPullDiffStats, repo.ViewIssue) - m.Get(".diff", repo.DownloadPullDiff) - m.Get(".patch", repo.DownloadPullPatch) - m.Group("/commits", func() { - m.Get("", context.RepoRef(), repo.SetWhitespaceBehavior, repo.GetPullDiffStats, repo.ViewPullCommits) - m.Get("/list", context.RepoRef(), repo.GetPullCommits) - m.Get("/{sha:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForSingleCommit) - }) - m.Post("/merge", context.RepoMustNotBeArchived(), web.Bind(forms.MergePullRequestForm{}), repo.MergePullRequest) - m.Post("/cancel_auto_merge", context.RepoMustNotBeArchived(), repo.CancelAutoMergePullRequest) - m.Post("/update", repo.UpdatePullRequest) - m.Post("/set_allow_maintainer_edit", web.Bind(forms.UpdateAllowEditsForm{}), repo.SetAllowEdits) - m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest) - m.Group("/files", func() { - m.Get("", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForAllCommitsOfPr) - m.Get("/{sha:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesStartingFromCommit) - m.Get("/{shaFrom:[a-f0-9]{7,40}}..{shaTo:[a-f0-9]{7,40}}", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.SetShowOutdatedComments, repo.ViewPullFilesForRange) - m.Group("/reviews", func() { - m.Get("/new_comment", repo.RenderNewCodeCommentForm) - m.Post("/comments", web.Bind(forms.CodeCommentForm{}), repo.SetShowOutdatedComments, repo.CreateCodeComment) - m.Post("/submit", web.Bind(forms.SubmitReviewForm{}), repo.SubmitReview) - }, context.RepoMustNotBeArchived()) - }) - }, repo.MustAllowPulls) - m.Group("/media", func() { m.Get("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.SingleDownloadOrLFS) m.Get("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.SingleDownloadOrLFS) From d50ed0abf731a10741831d4b6dd54791e3e567ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=88=E7=AC=91=E9=A3=8E=E7=94=9F=E9=97=B4?= Date: Wed, 16 Oct 2024 17:10:05 +0800 Subject: [PATCH 35/41] Support requested_reviewers data in comment webhook events (#26178) close #25833 Currently, the information for "requested_reviewers" is only included in the webhook event for reviews. I would like to suggest adding this information to the webhook event for "PullRequest comment" as well, as they both pertain to the "PullRequest" event. Also, The reviewer information for the Pull Request is not displayed when it is approved or rejected. --- modules/structs/hook.go | 15 ++++---- services/webhook/notifier.go | 74 ++++++++++++++++++++---------------- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/modules/structs/hook.go b/modules/structs/hook.go index c55e63db6bcf..db8b20e7e557 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -217,13 +217,14 @@ const ( // IssueCommentPayload represents a payload information of issue comment event. type IssueCommentPayload struct { - Action HookIssueCommentAction `json:"action"` - Issue *Issue `json:"issue"` - Comment *Comment `json:"comment"` - Changes *ChangesPayload `json:"changes,omitempty"` - Repository *Repository `json:"repository"` - Sender *User `json:"sender"` - IsPull bool `json:"is_pull"` + Action HookIssueCommentAction `json:"action"` + Issue *Issue `json:"issue"` + PullRequest *PullRequest `json:"pull_request,omitempty"` + Comment *Comment `json:"comment"` + Changes *ChangesPayload `json:"changes,omitempty"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` + IsPull bool `json:"is_pull"` } // JSONPayload implements Payload diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go index 53b1cc8c9cf7..38fad7f5e8ee 100644 --- a/services/webhook/notifier.go +++ b/services/webhook/notifier.go @@ -59,7 +59,7 @@ func (m *webhookNotifier) IssueClearLabels(ctx context.Context, doer *user_model err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelCleared, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -150,7 +150,7 @@ func (m *webhookNotifier) IssueChangeAssignee(ctx context.Context, doer *user_mo } apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), } @@ -201,7 +201,7 @@ func (m *webhookNotifier) IssueChangeTitle(ctx context.Context, doer *user_model From: oldTitle, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -236,7 +236,7 @@ func (m *webhookNotifier) IssueChangeStatus(ctx context.Context, doer *user_mode // Merge pull request calls issue.changeStatus so we need to handle separately. apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), CommitID: commitID, @@ -307,7 +307,7 @@ func (m *webhookNotifier) NewPullRequest(ctx context.Context, pull *issues_model if err := PrepareWebhooks(ctx, EventSource{Repository: pull.Issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueOpened, Index: pull.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pull, nil), + PullRequest: convert.ToAPIPullRequest(ctx, pull, pull.Issue.Poster), Repository: convert.ToRepo(ctx, pull.Issue.Repo, permission), Sender: convert.ToUser(ctx, pull.Issue.Poster, nil), }); err != nil { @@ -336,7 +336,7 @@ func (m *webhookNotifier) IssueChangeContent(ctx context.Context, doer *user_mod From: oldContent, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -375,17 +375,20 @@ func (m *webhookNotifier) UpdateComment(ctx context.Context, doer *user_model.Us } var eventType webhook_module.HookEventType + var pullRequest *api.PullRequest if c.Issue.IsPull { eventType = webhook_module.HookEventPullRequestComment + pullRequest = convert.ToAPIPullRequest(ctx, c.Issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, c.Issue.Repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentEdited, - Issue: convert.ToAPIIssue(ctx, doer, c.Issue), - Comment: convert.ToAPIComment(ctx, c.Issue.Repo, c), + Action: api.HookIssueCommentEdited, + Issue: convert.ToAPIIssue(ctx, doer, c.Issue), + PullRequest: pullRequest, + Comment: convert.ToAPIComment(ctx, c.Issue.Repo, c), Changes: &api.ChangesPayload{ Body: &api.ChangesFromPayload{ From: oldContent, @@ -403,20 +406,23 @@ func (m *webhookNotifier) CreateIssueComment(ctx context.Context, doer *user_mod issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User, ) { var eventType webhook_module.HookEventType + var pullRequest *api.PullRequest if issue.IsPull { eventType = webhook_module.HookEventPullRequestComment + pullRequest = convert.ToAPIPullRequest(ctx, issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentCreated, - Issue: convert.ToAPIIssue(ctx, doer, issue), - Comment: convert.ToAPIComment(ctx, repo, comment), - Repository: convert.ToRepo(ctx, repo, permission), - Sender: convert.ToUser(ctx, doer, nil), - IsPull: issue.IsPull, + Action: api.HookIssueCommentCreated, + Issue: convert.ToAPIIssue(ctx, doer, issue), + PullRequest: pullRequest, + Comment: convert.ToAPIComment(ctx, repo, comment), + Repository: convert.ToRepo(ctx, repo, permission), + Sender: convert.ToUser(ctx, doer, nil), + IsPull: issue.IsPull, }); err != nil { log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } @@ -440,20 +446,23 @@ func (m *webhookNotifier) DeleteComment(ctx context.Context, doer *user_model.Us } var eventType webhook_module.HookEventType + var pullRequest *api.PullRequest if comment.Issue.IsPull { eventType = webhook_module.HookEventPullRequestComment + pullRequest = convert.ToAPIPullRequest(ctx, comment.Issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, comment.Issue.Repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentDeleted, - Issue: convert.ToAPIIssue(ctx, doer, comment.Issue), - Comment: convert.ToAPIComment(ctx, comment.Issue.Repo, comment), - Repository: convert.ToRepo(ctx, comment.Issue.Repo, permission), - Sender: convert.ToUser(ctx, doer, nil), - IsPull: comment.Issue.IsPull, + Action: api.HookIssueCommentDeleted, + Issue: convert.ToAPIIssue(ctx, doer, comment.Issue), + PullRequest: pullRequest, + Comment: convert.ToAPIComment(ctx, comment.Issue.Repo, comment), + Repository: convert.ToRepo(ctx, comment.Issue.Repo, permission), + Sender: convert.ToUser(ctx, doer, nil), + IsPull: comment.Issue.IsPull, }); err != nil { log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } @@ -525,7 +534,7 @@ func (m *webhookNotifier) IssueChangeLabels(ctx context.Context, doer *user_mode err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelUpdated, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, access_model.Permission{AccessMode: perm.AccessModeOwner}), Sender: convert.ToUser(ctx, doer, nil), }) @@ -567,7 +576,7 @@ func (m *webhookNotifier) IssueChangeMilestone(ctx context.Context, doer *user_m err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestMilestone, &api.PullRequestPayload{ Action: hookAction, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -640,7 +649,7 @@ func (*webhookNotifier) MergePullRequest(ctx context.Context, doer *user_model.U // Merge pull request calls issue.changeStatus so we need to handle separately. apiPullRequest := &api.PullRequestPayload{ Index: pr.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), + PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), Repository: convert.ToRepo(ctx, pr.Issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), Action: api.HookIssueClosed, @@ -668,7 +677,7 @@ func (m *webhookNotifier) PullRequestChangeTargetBranch(ctx context.Context, doe From: oldBranch, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), + PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), Repository: convert.ToRepo(ctx, issue.Repo, mode), Sender: convert.ToUser(ctx, doer, nil), }); err != nil { @@ -703,11 +712,12 @@ func (m *webhookNotifier) PullRequestReview(ctx context.Context, pr *issues_mode return } if err := PrepareWebhooks(ctx, EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ - Action: api.HookIssueReviewed, - Index: review.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), - Repository: convert.ToRepo(ctx, review.Issue.Repo, permission), - Sender: convert.ToUser(ctx, review.Reviewer, nil), + Action: api.HookIssueReviewed, + Index: review.Issue.Index, + PullRequest: convert.ToAPIPullRequest(ctx, pr, review.Reviewer), + RequestedReviewer: convert.ToUser(ctx, review.Reviewer, nil), + Repository: convert.ToRepo(ctx, review.Issue.Repo, permission), + Sender: convert.ToUser(ctx, review.Reviewer, nil), Review: &api.ReviewPayload{ Type: string(reviewHookType), Content: review.Content, @@ -729,7 +739,7 @@ func (m *webhookNotifier) PullRequestReviewRequest(ctx context.Context, doer *us } apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), RequestedReviewer: convert.ToUser(ctx, reviewer, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), @@ -774,7 +784,7 @@ func (m *webhookNotifier) PullRequestSynchronized(ctx context.Context, doer *use if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequestSync, &api.PullRequestPayload{ Action: api.HookIssueSynchronized, Index: pr.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), + PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), Repository: convert.ToRepo(ctx, pr.Issue.Repo, access_model.Permission{AccessMode: perm.AccessModeOwner}), Sender: convert.ToUser(ctx, doer, nil), }); err != nil { From 603fca1e27bc29c1e700cc1bd284eb619d2436c8 Mon Sep 17 00:00:00 2001 From: cloudchamb3r Date: Wed, 16 Oct 2024 21:39:47 +0900 Subject: [PATCH 36/41] Fix null errors on conversation holder (#32258) (#32266) fix #32258 Errors in the issue was due to unhandled null check. so i fixed it. ### Detailed description for Issue & Fix To reproduce that issue, the comment must be deleted on Conversation tab. #### Before Delete image #### After Delete (AS-IS) image gitea already have remove logic for `timeline-item-group`, but because of null ref exception the later logic that removes `timeline-item-group` could be not be called correctly. --- web_src/js/features/repo-issue.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/web_src/js/features/repo-issue.ts b/web_src/js/features/repo-issue.ts index 4377292a64da..e450f561c0a8 100644 --- a/web_src/js/features/repo-issue.ts +++ b/web_src/js/features/repo-issue.ts @@ -187,14 +187,17 @@ export function initRepoIssueCommentDelete() { const path = conversationHolder.getAttribute('data-path'); const side = conversationHolder.getAttribute('data-side'); const idx = conversationHolder.getAttribute('data-idx'); - const lineType = conversationHolder.closest('tr').getAttribute('data-line-type'); - - if (lineType === 'same') { - document.querySelector(`[data-path="${path}"] .add-code-comment[data-idx="${idx}"]`).classList.remove('tw-invisible'); - } else { - document.querySelector(`[data-path="${path}"] .add-code-comment[data-side="${side}"][data-idx="${idx}"]`).classList.remove('tw-invisible'); + const lineType = conversationHolder.closest('tr')?.getAttribute('data-line-type'); + + // the conversation holder could appear either on the "Conversation" page, or the "Files Changed" page + // on the Conversation page, there is no parent "tr", so no need to do anything for "add-code-comment" + if (lineType) { + if (lineType === 'same') { + document.querySelector(`[data-path="${path}"] .add-code-comment[data-idx="${idx}"]`).classList.remove('tw-invisible'); + } else { + document.querySelector(`[data-path="${path}"] .add-code-comment[data-side="${side}"][data-idx="${idx}"]`).classList.remove('tw-invisible'); + } } - conversationHolder.remove(); } From 0196b3583a09131f42dd0a364ad46babd5f12e04 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 17 Oct 2024 10:28:51 +0800 Subject: [PATCH 37/41] Warn users when they try to use a non-root-url to sign in/up (#32272) --- web_src/js/features/common-page.ts | 8 ++++++++ web_src/js/features/user-auth.ts | 7 ++++++- web_src/js/index.ts | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/web_src/js/features/common-page.ts b/web_src/js/features/common-page.ts index 1a4decd752ee..77fe2cc1ca71 100644 --- a/web_src/js/features/common-page.ts +++ b/web_src/js/features/common-page.ts @@ -91,3 +91,11 @@ export function checkAppUrl() { showGlobalErrorMessage(`Your ROOT_URL in app.ini is "${appUrl}", it's unlikely matching the site you are visiting. Mismatched ROOT_URL config causes wrong URL links for web UI/mail content/webhook notification/OAuth2 sign-in.`, 'warning'); } + +export function checkAppUrlScheme() { + const curUrl = window.location.href; + // some users visit "http://domain" while appUrl is "https://domain", COOKIE_SECURE makes it impossible to sign in + if (curUrl.startsWith('http:') && appUrl.startsWith('https:')) { + showGlobalErrorMessage(`This instance is configured to run under HTTPS (by ROOT_URL config), you are accessing by HTTP. Mismatched scheme might cause problems for sign-in/sign-up.`, 'warning'); + } +} diff --git a/web_src/js/features/user-auth.ts b/web_src/js/features/user-auth.ts index f1f34bc806e6..b716287ff27e 100644 --- a/web_src/js/features/user-auth.ts +++ b/web_src/js/features/user-auth.ts @@ -1,4 +1,9 @@ -import {checkAppUrl} from './common-page.ts'; +import {checkAppUrl, checkAppUrlScheme} from './common-page.ts'; + +export function initUserCheckAppUrl() { + if (!document.querySelector('.page-content.user.signin, .page-content.user.signup, .page-content.user.link-account')) return; + checkAppUrlScheme(); +} export function initUserAuthOauth2() { const outer = document.querySelector('#oauth2-login-navigator'); diff --git a/web_src/js/index.ts b/web_src/js/index.ts index db678a25ba38..13dfe1f3efe1 100644 --- a/web_src/js/index.ts +++ b/web_src/js/index.ts @@ -24,7 +24,7 @@ import {initFindFileInRepo} from './features/repo-findfile.ts'; import {initCommentContent, initMarkupContent} from './markup/content.ts'; import {initPdfViewer} from './render/pdf.ts'; -import {initUserAuthOauth2} from './features/user-auth.ts'; +import {initUserAuthOauth2, initUserCheckAppUrl} from './features/user-auth.ts'; import { initRepoIssueDue, initRepoIssueReferenceRepositorySearch, @@ -219,6 +219,7 @@ onDomReady(() => { initCommitStatuses, initCaptcha, + initUserCheckAppUrl, initUserAuthOauth2, initUserAuthWebAuthn, initUserAuthWebAuthnRegister, From 2b8ff419a75afd81b9902c4964e9ad9475000825 Mon Sep 17 00:00:00 2001 From: cloudchamb3r Date: Thu, 17 Oct 2024 14:43:48 +0900 Subject: [PATCH 38/41] Add `gh-access-token` flag into backport script (#32283) The current backport script does not have github access token flag. This patch will be useful when encountered rate limit issue. --- contrib/backport/backport.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/contrib/backport/backport.go b/contrib/backport/backport.go index 9ae4483d8b67..eb194374452c 100644 --- a/contrib/backport/backport.go +++ b/contrib/backport/backport.go @@ -64,6 +64,11 @@ func main() { Value: "", Usage: "Forked user name on Github", }, + &cli.StringFlag{ + Name: "gh-access-token", + Value: "", + Usage: "Access token for GitHub api request", + }, &cli.BoolFlag{ Name: "no-fetch", Usage: "Set this flag to prevent fetch of remote branches", @@ -169,9 +174,10 @@ func runBackport(c *cli.Context) error { fmt.Printf("* Backporting %s to %s as %s\n", pr, localReleaseBranch, backportBranch) sha := c.String("cherry-pick") + accessToken := c.String("gh-access-token") if sha == "" { var err error - sha, err = determineSHAforPR(ctx, pr) + sha, err = determineSHAforPR(ctx, pr, accessToken) if err != nil { return err } @@ -427,13 +433,16 @@ func readVersion() string { return strings.Join(split[:2], ".") } -func determineSHAforPR(ctx context.Context, prStr string) (string, error) { +func determineSHAforPR(ctx context.Context, prStr, accessToken string) (string, error) { prNum, err := strconv.Atoi(prStr) if err != nil { return "", err } client := github.NewClient(http.DefaultClient) + if accessToken != "" { + client = client.WithAuthToken(accessToken) + } pr, _, err := client.PullRequests.Get(ctx, "go-gitea", "gitea", prNum) if err != nil { From 9116665e9c1c01d882c919fb3058f7fdb695350e Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 17 Oct 2024 17:05:38 +0800 Subject: [PATCH 39/41] Always update expiration time when creating an artifact (#32281) Fix #32256 --- models/actions/artifact.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/models/actions/artifact.go b/models/actions/artifact.go index 3d0a288e6287..0bc66ba24e84 100644 --- a/models/actions/artifact.go +++ b/models/actions/artifact.go @@ -69,7 +69,7 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa OwnerID: t.OwnerID, CommitSHA: t.CommitSHA, Status: int64(ArtifactStatusUploadPending), - ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + 3600*24*expiredDays), + ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays), } if _, err := db.GetEngine(ctx).Insert(artifact); err != nil { return nil, err @@ -78,6 +78,13 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPa } else if err != nil { return nil, err } + + if _, err := db.GetEngine(ctx).ID(artifact.ID).Cols("expired_unix").Update(&ActionArtifact{ + ExpiredUnix: timeutil.TimeStamp(time.Now().Unix() + timeutil.Day*expiredDays), + }); err != nil { + return nil, err + } + return artifact, nil } From 08c963c921ad05640890be0fe95711bc36264e9e Mon Sep 17 00:00:00 2001 From: YR Chen Date: Sat, 19 Oct 2024 20:51:55 +0800 Subject: [PATCH 40/41] Update github.com/go-enry/go-enry to v2.9.1 (#32295) `go-enry` v2.9.1 includes latest file patterns from Linguist, which can identify more generated file type, eg. `pdm.lock`. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d85553ac9f26..1005176d29b2 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( github.com/go-chi/chi/v5 v5.0.13 github.com/go-chi/cors v1.2.1 github.com/go-co-op/gocron v1.37.0 - github.com/go-enry/go-enry/v2 v2.8.8 + github.com/go-enry/go-enry/v2 v2.9.1 github.com/go-git/go-billy/v5 v5.5.0 github.com/go-git/go-git/v5 v5.12.0 github.com/go-ldap/ldap/v3 v3.4.6 diff --git a/go.sum b/go.sum index bb185e20c16d..f8d0287dd236 100644 --- a/go.sum +++ b/go.sum @@ -315,8 +315,8 @@ github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= -github.com/go-enry/go-enry/v2 v2.8.8 h1:EhfxWpw4DQ3WEFB1Y77X8vKqZL0D0EDUUWYDUAIv9/4= -github.com/go-enry/go-enry/v2 v2.8.8/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= +github.com/go-enry/go-enry/v2 v2.9.1 h1:G9iDteJ/Mc0F4Di5NeQknf83R2OkRbwY9cAYmcqVG6U= +github.com/go-enry/go-enry/v2 v2.9.1/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo= github.com/go-enry/go-oniguruma v1.2.1/go.mod h1:bWDhYP+S6xZQgiRL7wlTScFYBe023B6ilRZbCAD5Hf4= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= From d638067d3cb0a7f69b4d899f65b9be4940bd3e41 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 19 Oct 2024 22:11:56 +0200 Subject: [PATCH 41/41] API: enhance SearchIssues swagger docs (#32208) this will result in better api clients generated out of the openapi docs ... for SearchIssues --- *Sponsored by Kithara Software GmbH* --- routers/api/v1/repo/issue.go | 51 +++++++++++++++++++----------- templates/swagger/v1_json.tmpl | 58 ++++++++++++++++++++++++---------- 2 files changed, 73 insertions(+), 36 deletions(-) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index d8c39b0f69bf..e86fb3ccb1c5 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -41,80 +41,93 @@ func SearchIssues(ctx *context.APIContext) { // parameters: // - name: state // in: query - // description: whether issue is open or closed + // description: State of the issue // type: string + // enum: [open, closed, all] + // default: open // - name: labels // in: query - // description: comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded + // description: Comma-separated list of label names. Fetch only issues that have any of these labels. Non existent labels are discarded. // type: string // - name: milestones // in: query - // description: comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded + // description: Comma-separated list of milestone names. Fetch only issues that have any of these milestones. Non existent milestones are discarded. // type: string // - name: q // in: query - // description: search string + // description: Search string // type: string // - name: priority_repo_id // in: query - // description: repository to prioritize in the results + // description: Repository ID to prioritize in the results // type: integer // format: int64 // - name: type // in: query - // description: filter by type (issues / pulls) if set + // description: Filter by issue type // type: string + // enum: [issues, pulls] // - name: since // in: query - // description: Only show notifications updated after the given time. This is a timestamp in RFC 3339 format + // description: Only show issues updated after the given time (RFC 3339 format) // type: string // format: date-time - // required: false // - name: before // in: query - // description: Only show notifications updated before the given time. This is a timestamp in RFC 3339 format + // description: Only show issues updated before the given time (RFC 3339 format) // type: string // format: date-time - // required: false // - name: assigned // in: query - // description: filter (issues / pulls) assigned to you, default is false + // description: Filter issues or pulls assigned to the authenticated user // type: boolean + // default: false // - name: created // in: query - // description: filter (issues / pulls) created by you, default is false + // description: Filter issues or pulls created by the authenticated user // type: boolean + // default: false // - name: mentioned // in: query - // description: filter (issues / pulls) mentioning you, default is false + // description: Filter issues or pulls mentioning the authenticated user // type: boolean + // default: false // - name: review_requested // in: query - // description: filter pulls requesting your review, default is false + // description: Filter pull requests where the authenticated user's review was requested // type: boolean + // default: false // - name: reviewed // in: query - // description: filter pulls reviewed by you, default is false + // description: Filter pull requests reviewed by the authenticated user // type: boolean + // default: false // - name: owner // in: query - // description: filter by owner + // description: Filter by repository owner // type: string // - name: team // in: query - // description: filter by team (requires organization owner parameter to be provided) + // description: Filter by team (requires organization owner parameter) // type: string // - name: page // in: query - // description: page number of results to return (1-based) + // description: Page number of results to return (1-based) // type: integer + // minimum: 1 + // default: 1 // - name: limit // in: query - // description: page size of results + // description: Number of items per page // type: integer + // minimum: 0 // responses: // "200": // "$ref": "#/responses/IssueList" + // "400": + // "$ref": "#/responses/error" + // "422": + // "$ref": "#/responses/validationError" before, since, err := context.GetQueryBeforeSince(ctx.Base) if err != nil { diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 2cbd8782d841..a2b75bd87399 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -3444,107 +3444,125 @@ "operationId": "issueSearchIssues", "parameters": [ { + "enum": [ + "open", + "closed", + "all" + ], "type": "string", - "description": "whether issue is open or closed", + "default": "open", + "description": "State of the issue", "name": "state", "in": "query" }, { "type": "string", - "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded", + "description": "Comma-separated list of label names. Fetch only issues that have any of these labels. Non existent labels are discarded.", "name": "labels", "in": "query" }, { "type": "string", - "description": "comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded", + "description": "Comma-separated list of milestone names. Fetch only issues that have any of these milestones. Non existent milestones are discarded.", "name": "milestones", "in": "query" }, { "type": "string", - "description": "search string", + "description": "Search string", "name": "q", "in": "query" }, { "type": "integer", "format": "int64", - "description": "repository to prioritize in the results", + "description": "Repository ID to prioritize in the results", "name": "priority_repo_id", "in": "query" }, { + "enum": [ + "issues", + "pulls" + ], "type": "string", - "description": "filter by type (issues / pulls) if set", + "description": "Filter by issue type", "name": "type", "in": "query" }, { "type": "string", "format": "date-time", - "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format", + "description": "Only show issues updated after the given time (RFC 3339 format)", "name": "since", "in": "query" }, { "type": "string", "format": "date-time", - "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format", + "description": "Only show issues updated before the given time (RFC 3339 format)", "name": "before", "in": "query" }, { "type": "boolean", - "description": "filter (issues / pulls) assigned to you, default is false", + "default": false, + "description": "Filter issues or pulls assigned to the authenticated user", "name": "assigned", "in": "query" }, { "type": "boolean", - "description": "filter (issues / pulls) created by you, default is false", + "default": false, + "description": "Filter issues or pulls created by the authenticated user", "name": "created", "in": "query" }, { "type": "boolean", - "description": "filter (issues / pulls) mentioning you, default is false", + "default": false, + "description": "Filter issues or pulls mentioning the authenticated user", "name": "mentioned", "in": "query" }, { "type": "boolean", - "description": "filter pulls requesting your review, default is false", + "default": false, + "description": "Filter pull requests where the authenticated user's review was requested", "name": "review_requested", "in": "query" }, { "type": "boolean", - "description": "filter pulls reviewed by you, default is false", + "default": false, + "description": "Filter pull requests reviewed by the authenticated user", "name": "reviewed", "in": "query" }, { "type": "string", - "description": "filter by owner", + "description": "Filter by repository owner", "name": "owner", "in": "query" }, { "type": "string", - "description": "filter by team (requires organization owner parameter to be provided)", + "description": "Filter by team (requires organization owner parameter)", "name": "team", "in": "query" }, { + "minimum": 1, "type": "integer", - "description": "page number of results to return (1-based)", + "default": 1, + "description": "Page number of results to return (1-based)", "name": "page", "in": "query" }, { + "minimum": 0, "type": "integer", - "description": "page size of results", + "description": "Number of items per page", "name": "limit", "in": "query" } @@ -3552,6 +3570,12 @@ "responses": { "200": { "$ref": "#/responses/IssueList" + }, + "400": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" } } }