Compare commits

...

85 commits

Author SHA1 Message Date
0ko
3d92c96a94 merge commit: [v13.0/forgejo] January 8th security patches (#10721)
Some checks failed
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10721
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
2026-01-08 07:32:38 +01:00
Mathieu Fenniak
a0f2289bb4
doc: add release notes for Jan 8 security release 2026-01-06 10:57:37 -07:00
Gusted
4508a047f9 fix: load reviewer for pull review dismiss action notifier
This was implicitly loaded during the mail notifications notifier. If
you disable mail notifications on Forgejo then this will result in the
reviewer not being loaded and NPE.
2026-01-06 10:57:37 -07:00
Mathieu Fenniak
a5b4503e2b
test: backport SleepTillNextMinute 2026-01-06 10:57:25 -07:00
Gusted
f42870ceda chore: add integration test
Add a integration test that verifies that only the verified key is shown
in `{user}.gpg`.
2026-01-06 10:40:43 -07:00
Gusted
4944f1db2a fix: use correct GPG key for export
`GPGKeyToEntity` incorrectly assumed that within a keyring with multiple
keys that the first key is verified and should be exported. Look at all
keys and find the one that matches the verified key ID.
2026-01-06 10:40:43 -07:00
Mathieu Fenniak
df370dd0be
fix: reduce memory usage while processing large attachment uploads 2026-01-06 10:40:31 -07:00
Mathieu Fenniak
1da28e9207
fix: incorrect whitespace handling on pre&post receive hooks 2026-01-06 10:39:36 -07:00
Mathieu Fenniak
c385564539
fix: hide user profile anonymous options on public repo APIs 2026-01-06 10:38:14 -07:00
Mathieu Fenniak
f1fe6cb6f5 [v13.0/forgejo] fix: don't duplicate commit status records on workflows with empty name (#10680)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
**Backport:** #10678

(cherry picked from commit 8f63ee9a94)

Fixes #10671.

Cleanup for the inflated number of records in this table will come in a near future change.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10680
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2026-01-05 14:44:30 +01:00
0ko
777416e3cc merge commit: [v13.0/forgejo] i18n: backport of translations from Codeberg Translate (#10703)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10703
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2026-01-05 12:30:52 +01:00
0ko
2bbb6cc4e6 [v13.0/forgejo] i18n: backport of translations from Codeberg Translate and a release note
Translation updates that were relevant to v13 branch were picked from this commit:
e23b3770ce

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: 11xx <11xx@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Kenneth Bruen <kenny@kbruen.ro>
Co-authored-by: Lzebulon <lzebulon@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: Yushu <yushu@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: dobrvlskyi <dobrvlskyi@noreply.codeberg.org>
Co-authored-by: enderice2 <enderice2@noreply.codeberg.org>
Co-authored-by: faoquad <faoquad@noreply.codeberg.org>
Co-authored-by: harryxi <harryxi@noreply.codeberg.org>
Co-authored-by: jimkats <jimkats@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: nikee <nikee@noreply.codeberg.org>
Co-authored-by: shadowmaru <shadowmaru@noreply.codeberg.org>
Co-authored-by: smlxdesign <smlxdesign@noreply.codeberg.org>
Co-authored-by: tace16 <tace16@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: yeager <yeager@noreply.codeberg.org>
2026-01-05 14:45:09 +05:00
0ko
0479ef3447 [v13.0/forgejo] i18n: backport of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
959e4cf138

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Kropotkin <kropotkin@noreply.codeberg.org>
Co-authored-by: Lzebulon <lzebulon@noreply.codeberg.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Vyxie <kitakita@disroot.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: Yushu <yushu@noreply.codeberg.org>
Co-authored-by: anorprogrammer <anorprogrammer@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: futsuuu <futsuuu@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: luthkur <luthkur@noreply.codeberg.org>
Co-authored-by: nitromelon <nitromelon@noreply.codeberg.org>
Co-authored-by: rchk <rchk@noreply.codeberg.org>
Co-authored-by: tace16 <tace16@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: γλωσσολαλιά <glossolalia@noreply.codeberg.org>
Co-authored-by: Кнⷫѧⷷ̈зⷮьⷬ Кропоткинъ <kropotkin@noreply.codeberg.org>
2026-01-05 14:39:54 +05:00
forgejo-backport-action
a060a7f05a [v13.0/forgejo] chore: download git-man over TLS (#10693)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10692

- No need to use http when https is available.

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10693
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2026-01-04 06:33:42 +01:00
forgejo-backport-action
908d949e49 [v13.0/forgejo] fix: build-release workflow stops its own end-to-end checks when run concurrently (#10637)
Some checks failed
Integration tests for the release process / release-simulation (push) Has been cancelled
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10632

`build-release.yml` attempts to run an end-to-end check with a cascading PR, but it doesn't target the currently building branch.  When two releases build simultaneously (eg. `forgejo/v14.0` and `forgejo`), whichever one starts the end-to-end test first is then "cancelled" by the second one as it pushes an update to the same branch.

This will be a bit of an experimental change due to the difficulty in setting up a test environment.  After merge, I intend to watch a v14 and forgejo build and verify that they are independent, and, that both are actually tested with the correct target build.

This introduces a need to backport any changes to `.forgejo/cascading-release-end-to-end` in the future to maintain cascading functionality in all active releases.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10637
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-12-30 09:54:21 +01:00
forgejo-backport-action
b68368d57c [v13.0/forgejo] port(gitea): Fix password leak in log messages (go-gitea/gitea!35584) (#10554)
Some checks failed
testing-integration / test-unit (push) Has been cancelled
/ release (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10550

Link to original PR: https://github.com/go-gitea/gitea/pull/35584
Original Author: https://github.com/shashank-netapp

Co-authored-by: Shiny Nematoda <snematoda.751k2@aleeas.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10554
Reviewed-by: Shiny Nematoda <snematoda@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-12-23 00:43:06 +01:00
forgejo-backport-action
e538f05acc [v13.0/forgejo] fix: don't push LFS when using SSH authentication (#10476)
Some checks failed
/ release (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10475

We would need to understand LFS over SSH, which is not implemented.
Ref: forgejo/forgejo#5925

Skip pushing LFS when SSH authentication is used.
Resolves: Codeberg/Community#2156

Add a test to verify that you can push mirror a LFS repository

Documentation: forgejo/docs!1639

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10476
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-12-19 00:03:05 +01:00
forgejo-backport-action
b5e91db9c9 [v13.0/forgejo] fix: reduce runtime of container cleanup by relying on mass digest cleanup (#10334)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10297

The package cleanup routine checks every container version for whether it is referenced by a multi-platform manifest, which appears to be a performance problem indicated by CPU profiling collected in #9358 on SQLite systems.  This PR removes that check completely, which isn't necessary since #4698 added a much more performant mass-cleanup of these dangling platform versions.

May fix #9358 completely, but it leaves fundamental scalability concerns with SQLite due to long-running transactions.  The transactions will be shorter with this change.  Requires end-user testing to confirm if sufficiently fixed.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10334): <!--number 10334 --><!--line 0 --><!--description Zml4OiByZWR1Y2UgcnVudGltZSBvZiBjb250YWluZXIgY2xlYW51cCBieSByZWx5aW5nIG9uIG1hc3MgZGlnZXN0IGNsZWFudXA=-->fix: reduce runtime of container cleanup by relying on mass digest cleanup<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10334
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-12-05 17:13:41 +01:00
Renovate Bot
841f77f3f1 Update dependency go to v1.25.5 (v13.0/forgejo) (#10306)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [go](https://go.dev/) ([source](https://github.com/golang/go)) | toolchain | patch | `1.25.3` -> `1.25.5` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4yNy41IiwidXBkYXRlZEluVmVyIjoiNDIuMjcuNSIsInRhcmdldEJyYW5jaCI6InYxMy4wL2Zvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10306
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-12-03 02:28:14 +01:00
Renovate Bot
fdb56d5944 Update dependency markdownlint-cli to v0.46.0 (v13.0/forgejo) (#10283)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-12-01 20:37:14 +01:00
Renovate Bot
3e27c75454 Update dependency @vitejs/plugin-vue to v6.0.2 (v13.0/forgejo) (#10282)
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-12-01 20:35:20 +01:00
forgejo-backport-action
11a5ff15bf [v13.0/forgejo] fix: download logs of currently displayed Action run attempt (#10229)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10225

While the page `/{owner}/{repo}/actions/runs/{run}/jobs/{job}/attempt/{attempt}` offers a button to download the logs of the currently displayed Action run attempt, it always sent the logs of the last attempt. For example, if there were two attempts, it was impossible to download the logs of the first attempt. With this fix, the user receives the logs of the attempt currently being displayed.

Users that have the page open while Forgejo is being upgraded will not be able to download logs until they have refreshed the page.

Fixes https://codeberg.org/forgejo/forgejo/issues/10221.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [ ] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10225): <!--number 10225 --><!--line 0 --><!--description ZG93bmxvYWQgbG9ncyBvZiBjdXJyZW50bHkgZGlzcGxheWVkIEFjdGlvbiBydW4gYXR0ZW1wdA==-->download logs of currently displayed Action run attempt<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Andreas Ahlenstorf <andreas@ahlenstorf.ch>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10229
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-25 08:39:04 +01:00
Mathieu Fenniak
5f757d9e83 [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
Partial backport of #9434.

Fixes a bug: it was intended that pushes to a branch and pushes to a pull request would cancel any previous running job from the same workflow, however this functionality only worked on a `on: push` workflow.  This PR fixes it for an `on: pull_request` workflow.

Adds a feature: `concurrency.cancel-in-progress` can be used to override the automatic cancellation behaviour and disable it.

It can be disabled unconditionally in a workflow:
```yaml
concurrency:
    cancel-in-progress: false
```

Or it can be disabled with some logic; for example, keeping the cancel behaviour on PRs but disabling it otherwise:
```yaml
concurrency:
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}
```

Only a small subset of automated tests were applicable for backport, so I supplemented with manual testing in these cases:

|                                                                    | Expected      | Actual        |
| ------------------------------------------------------------------ | ------------- | ------------- |
| Default behaviour:                                                 |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Cancelled     | Cancelled     |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: true                                       |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Cancelled     | Cancelled     |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: false                                      |               |               |
| on: pull_request -- push to a PR when it's already running         | Multiple Runs | Multiple Runs |
| on: push -- push to a branch (eg. main) when it's already running  | Multiple Runs | Multiple Runs |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: ${{ github.event_name == 'pull_request' }} |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Multiple Runs | Multiple Runs |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
  - **TODO:**  Will backport the relevant documentation.
- [ ] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9797): <!--number 9797 --><!--line 0 --><!--description ZmVhdDogYWxsb3cgd29ya2Zsb3dzIHRvIGNvbnRyb2wgY2FuY2VsbGF0aW9uIG9mIGV4aXN0aW5nIGpvYnM=-->feat: allow workflows to control cancellation of existing jobs<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9797
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-11-23 23:01:09 +01:00
Mathieu Fenniak
aaf7960a77 [v13.0/forgejo] 2025-11-21 combined security patches (#10038)
Some checks failed
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
/ release (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
[CVSS 5.3 Medium](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N) -- The `/repos/{owner}/{repo}/issues/{index}/dependencies` APIs allow a user to link an issue in one repository as "depending upon" an issue in another repository.  Forgejo's implementation had an incorrect permission check which would verify only that the user had write permissions on the issue being modified, and not on the issue it was linking to.  Due to the incorrect permission check, it was possible to view limited information (the existence of, and title of) an issue in a private repository that the user does not have access to view.  The permission check has been corrected to take into account visibility of the remote repository.

[CVSS 5.3 Medium](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N) -- Fetching information about a release via the `/repos/{owner}/{repo}/releases/tag/{tag}` API endpoint did not check whether the release was a draft, allowing accessing to information about a draft release to users who could predict an upcoming release tag but didn't have access to view it.  The missing check has been added, returning a 404 response when the release is not published.

[CVSS 6.3 Medium](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N) -- Forgejo's web interface allows deleting tags on a git repository through a form post.  The endpoint for this form post had misconfigured middleware handlers which enforce security rights, allowing an anonymous user, or a logged-in user without the correct permissions, to delete tags on repositories that they did not own by injecting arbitrary internal tag identifiers into the form.  The middleware handler configuration has been corrected.

[CVSS 2.1 Low](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N) -- When the head branch of a pull request matches a branch protection rule, the head branch should be able to be merged or rebased only according to the "Push" rules defined in the protection rule.  An implementation error checked those branch protection rules in the context of the base repository rather than the head repository, allowing users with write access to the base repository to be considered able to push to the branch, bypassing the "Enable push" option's expected security control.

[CVSS 2.1 Low](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N) -- An issue owner can manipulate form inputs to delete the content history of comments they did not create, as long as those comments are on issues that they own.  Although comment content is not affected, the history of edits on the comment can be trimmed.  The validation in the form handler was corrected.

[CVSS 5.1 Medium](https://www.first.org/cvss/calculator/4-0#CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N) -- When a repository is configured with tag protection rules, it should not be possible for a user that is outside the whitelisted users or teams from modifying the protected tags.  An incorrect parameter being passed to a security verification method allowed a user with write access to the repo to delete tags even if they were protected, as long as the tag was originally created by a user who is still authorized by the protection rules.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Security bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 0 --><!--description Zml4KGFwaSk6IGZpeCBkZXBlbmRlbmN5IHJlcG8gcGVybXMgaW4gQ3JlYXRlL1JlbW92ZUlzc3VlRGVwZW5kZW5jeQ==-->fix(api): fix dependency repo perms in Create/RemoveIssueDependency<!--description-->
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 1 --><!--description Zml4KGFwaSk6IGRyYWZ0IHJlbGVhc2VzIGNvdWxkIGJlIHJlYWQgYmVmb3JlIGJlaW5nIHB1Ymxpc2hlZA==-->fix(api): draft releases could be read before being published<!--description-->
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 2 --><!--description bWlzY29uZmlndXJlZCBzZWN1cml0eSBjaGVja3Mgb24gdGFnIGRlbGV0ZSB3ZWIgZm9ybQ==-->misconfigured security checks on tag delete web form<!--description-->
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 3 --><!--description aW5jb3JyZWN0IGxvZ2ljIGluICJVcGRhdGUgUFIiIGRpZCBub3QgZW5mb3JjZSBoZWFkIGJyYW5jaCBwcm90ZWN0aW9uIHJ1bGVzIGNvcnJlY3RseQ==-->incorrect logic in "Update PR" did not enforce head branch protection rules correctly<!--description-->
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 4 --><!--description aXNzdWUgb3duZXIgY2FuIGRlbGV0ZSBhbm90aGVyIHVzZXIncyBjb21tZW50J3MgZWRpdCBoaXN0b3J5IG9uIHNhbWUgaXNzdWU=-->issue owner can delete another user's comment's edit history on same issue<!--description-->
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10038): <!--number 10038 --><!--line 5 --><!--description dGFnIHByb3RlY3Rpb24gcnVsZXMgY2FuIGJlIGJ5cGFzc2VkIGR1cmluZyB0YWcgZGVsZXRlIG9wZXJhdGlvbg==-->tag protection rules can be bypassed during tag delete operation<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Joshua Rogers <MegaManSec@users.noreply.github.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10038
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-11-21 05:28:03 +01:00
viceice
29ed531701 chore: pin node version (#10178)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10178
Co-authored-by: viceice <michael.kriese@gmx.de>
Co-committed-by: viceice <michael.kriese@gmx.de>
2025-11-20 16:07:37 +01:00
Renovate Bot
f50878b073 Update module golang.org/x/crypto to v0.45.0 (v13.0/forgejo) (#10175)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10175
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-11-20 13:00:29 +01:00
forgejo-backport-action
1b13b4dc25 [v13.0/forgejo] fix: support git clone when /tmp has noexec (#10170)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / security-check (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10146

Resolves #9733 (alternative to #10136)

Instead of setting `GIT_ASKPASS`, instruct git to use the credential-store helper with a dedicated file.
I adjusted the tests accordingly.

Co-authored-by: oliverpool <git@olivier.pfad.fr>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10170
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-19 17:25:45 +01:00
forgejo-backport-action
1a9985596b [v13.0/forgejo] fix: get new session from enginegroup instead of masterengine (#10148)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10140

Within Codeberg we are looking into distributing the database queries, we tried forgejo/forgejo!7212 on several occasions but never got it to work.

After a long debugging session in a staging environment I was able to find two bugs that made it impossible for this feature to work: forgejo/docs!1587 which resulted in replica engines never being configured and used if you followed the documentation. The other bug is what this patch intends to fix. In order to do some database operation, you need to the database engine - it will first look if one is set for the context (only useful for transactions) and otherwise create a new session of the engine from the master engine `x`. The problem is that `x` is explicitly set to be the master engine and not the engine group (that includes the replica engines) - Unless the code uses `DefaultContext`, which is almost nowhere used after some great refactoring in Gitea to use the passed context, it did not use the replica engines.

Get engine from the `DefaultContext` (which is set to the enginegroup) and create a new session from that.

20f8572b92/models/db/engine.go (L220-L231)

And `SetDefaultEngine` is called from 20f8572b92/models/db/engine.go (L212)

Where `eng` is the engine group.

## Test

1. Configure database replicas.
2. Start Forgejo.
3. Verify Forgejo loads.
4. Stop the database replicas.
5. Verify Forgejo shows 500 errors.

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10148
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-18 06:28:07 +01:00
Renovate Bot
9a39398948 Update module golang.org/x/crypto to v0.44.0 (v13.0/forgejo) (#10135)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10135
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-11-16 16:14:16 +01:00
0ko
c6575b06e2 merge commit: [v13.0/forgejo] i18n: backport of translations from Codeberg Translate (#10132)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10132
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2025-11-16 14:30:14 +01:00
0ko
bb58a801c3 [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
1eb35114d9

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Arthur Zamarin <arthurzam@gentoo.org>
Co-authored-by: Atthaphinya <atthaphinya@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Bullbagaren <bullbagaren@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Haris <harisdotparis@noreply.codeberg.org>
Co-authored-by: Iced-Codeda07a60a554bc40d1 <iced-codeda07a60a554bc40d1@noreply.codeberg.org>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Lzebulon <lzebulon@noreply.codeberg.org>
Co-authored-by: Mykyta Shcherbyna <mshcherbyna99@noreply.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Tin <hntin@noreply.codeberg.org>
Co-authored-by: Vyxie <kitakita@disroot.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: andreuz <andreu@kindspells.dev>
Co-authored-by: aviallon <aviallon@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: earl-warren <earl-warren@noreply.codeberg.org>
Co-authored-by: fluere <fluere@noreply.codeberg.org>
Co-authored-by: gingermusketeer <gingermusketeer@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: liilliil <liilliil@noreply.codeberg.org>
Co-authored-by: m13o <m13o@noreply.codeberg.org>
Co-authored-by: narodr <narodr@noreply.codeberg.org>
Co-authored-by: smlxdesign <smlxdesign@noreply.codeberg.org>
Co-authored-by: tace16 <tace16@noreply.codeberg.org>
Co-authored-by: tct123 <tct123@noreply.codeberg.org>
Co-authored-by: victordargallo <victordargallo@noreply.codeberg.org>
Co-authored-by: volkan <volkan@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: yeager <yeager@noreply.codeberg.org>
2025-11-16 10:36:32 +05:00
0ko
94d67437bd [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
7f3255a2f7

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: Atthaphinya <atthaphinya@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: VaiTon <vaiton@noreply.codeberg.org>
Co-authored-by: X1SystemError0X <x1systemerror0x@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: earl-warren <earl-warren@noreply.codeberg.org>
Co-authored-by: joxeankoret <joxeankoret@noreply.codeberg.org>
Co-authored-by: m13o <m13o@noreply.codeberg.org>
Co-authored-by: pgmtx <pgmtx@noreply.codeberg.org>
Co-authored-by: tace16 <tace16@noreply.codeberg.org>
Co-authored-by: victordargallo <victordargallo@noreply.codeberg.org>
2025-11-16 10:35:48 +05:00
forgejo-backport-action
287feb3e5a [v13.0/forgejo] fix: less restrictive matrix room_id pattern (#10064)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10056

- Matrix room v12 made the room ID domain-less.
- The exact format varies across room versions, so don't try to give a
new regular expression, simply require the input starts with `!`.
- Resolves forgejo/forgejo#9341

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10064
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-11 07:04:07 +01:00
forgejo-backport-action
8645c12d62 [v13.0/forgejo] fix: prevent orgs from being added as members of orgs (#10027)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9757

Fixes #4167

Changes it to check that the user being added is `User` or `Bot` type before allowing it

Co-authored-by: Cyborus <cyborus@cyborus.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10027
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-08 22:50:35 +01:00
forgejo-backport-action
6df07ecd5c [v13.0/forgejo] fix(api): set all hook event types (#9998)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / security-check (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9997

The `addHook` function (and subsequently all endpoints that add a webhook) did not set the `Package`, `ActionRunFailure`, `ActionRunRecover`, or `ActionRunSuccess` event types on the newly created webhook.

Co-authored-by: Cyborus <cyborus@cyborus.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9998
Reviewed-by: Cyborus <cyborus@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-08 00:44:46 +01:00
forgejo-backport-action
32fbe0dd2e [v13.0/forgejo] fix: endless redirection loop between /user/settings/change_password and /user/settings/security (#10013)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / test-e2e (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/10002

Fixes forgejo/forgejo#9980

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/10002): <!--number 10002 --><!--line 0 --><!--description ZW5kbGVzcyByZWRpcmVjdGlvbiBsb29wIGJldHdlZW4gL3VzZXIvc2V0dGluZ3MvY2hhbmdlX3Bhc3N3b3JkIGFuZCAvdXNlci9zZXR0aW5ncy9zZWN1cml0eQ==-->endless redirection loop between /user/settings/change_password and /user/settings/security<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: zokki <zokki.softwareschmiede@gmail.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10013
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-07 22:38:32 +01:00
forgejo-backport-action
dfdcbaf194 [v13.0/forgejo] fix: add required headers to Pagure migration (#9994)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9973

See https://pagure.io/fedora-infrastructure/issue/12886 for details.

Resolves https://codeberg.org/forgejo/forgejo/issues/9974

## Test
1. Go to https://dev.gusted.xyz/repo/migrate?service_type=10
2. Fill in https://pagure.io/slapi-nis
3. Migrate.
4. Verify the migration succeeded.

Co-authored-by: Alexander Bokovoy <ab@samba.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9994
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-06 14:36:12 +01:00
forgejo-backport-action
f1a497d3c1 [v13.0/forgejo] fix(alt): handle package names with dots in ALT repository (#9938)
Some checks failed
testing-integration / test-unit (push) Has been cancelled
/ release (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9763

Followup to https://codeberg.org/forgejo/forgejo/pulls/6351

Previously, ALT RPM repository did not match packages with dots in their
names, causing 404 errors. Updated the regexp to correctly parse these paths.

Co-authored-by: Alex619829 <alex619829@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9938
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-11-03 03:32:00 +01:00
forgejo-backport-action
8ac5410a62 [v13.0/forgejo] fix: pull request review comment position (#9920)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9914

## Checklist

This PR contains both #9889 and #9912, since it depends on the one, and the other provides a test for it.
The exact reasoning behind its logic is described here: https://codeberg.org/forgejo/forgejo/issues/9473#issuecomment-7976186

This PR should return the behaviour back to how it was before a PR to Gitea changed it.
Only the resulting Database-Entry will reference the line blamed commit, now also with the correct adjusted line.
While the context diff view is pulled from the commit the commenter actually commented on.

Resolves forgejo/forgejo#9473

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [x] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: BtbN <btbn@btbn.de>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9920
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-31 17:18:48 +01:00
forgejo-backport-action
cb0845cd3e [v13.0/forgejo] fix: don't show ConEmu OSC escape sequences (#9919)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9875

- Remove all [ConEMU OSC commands](https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC) from the output of Forgejo action logs when rendering.
- The regex is constructed as followed: Match the prefix `ESC ] 9 ;`. Then matches any number of digits, then match everything up to and including `ST` (this is either `ESC\` or `BELL`).
- Resolves forgejo/forgejo#9244

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9919
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-31 16:15:29 +01:00
forgejo-backport-action
a50968d0de [v13.0/forgejo] fix: set tag message on tag addition (#9918)
Some checks are pending
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / security-check (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9913

- When `SyncReleasesWithTags` is called, the code that synchronizes new tags to the database did not set the Note of the release to the tag's message. This was particularly noticeable when using the migration feature that tags have a empty description.
- Resolves forgejo/forgejo#7647

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9918
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-31 08:28:08 +01:00
forgejo-backport-action
3bc1ae21ac [v13.0/forgejo] fix: construct project links in timeline better (#9901)
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing-integration / test-mariadb (v10.6) (push) Waiting to run
testing-integration / test-mariadb (v11.8) (push) Waiting to run
testing / test-e2e (push) Blocked by required conditions
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9872

- When a issue sees a modification regarding to which project they are assigned, then a timeline event is created for this. The link to the project that is constructed for this timeline event incorrectly assumes the project is a repository project.
- Use the `Link` function to construct the link to the project, this will correctly take into account if the project is a org, user or repo project.
- Resolves forgejo/forgejo#9817

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9901
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-30 08:57:44 +01:00
Mathieu Fenniak
b8448e7cde [v13.0/forgejo] fix: 2025-10-26 Security Patches (#9849)
Some checks failed
/ release (push) Has been cancelled
testing-integration / test-unit (push) Has been cancelled
testing-integration / test-sqlite (push) Has been cancelled
testing-integration / test-mariadb (v10.6) (push) Has been cancelled
testing-integration / test-mariadb (v11.8) (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / security-check (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9849
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-10-26 04:23:20 +01:00
Mathieu Fenniak
fc14793f7d
[v13.0/forgejo] fix: add release notes 9849.md 2025-10-25 09:17:46 -06:00
Earl Warren
fa1a2ba669 [v13.0/forgejo] fix: return on error if an LFS token cannot be parsed
Extracted from https://github.com/go-gitea/gitea/pull/35708
2025-10-25 09:13:47 -06:00
Mathieu Fenniak
afbf1efe02
[v13.0/forgejo] fix: prevent .forgejo/template from being out-of-repo content 2025-10-24 22:11:26 -06:00
Mathieu Fenniak
449b5bf10e
[v13.0/forgejo] fix: prevent writing to out-of-repo symlink destinations while evaluating template repos 2025-10-24 22:11:16 -06:00
Mathieu Fenniak
8885844e72
[v13.0/forgejo] fix: prevent commit API from leaking user's hidden email address on valid GPG signed commits 2025-10-24 22:11:08 -06:00
Earl Warren
a2068a47ce [v13.0/forgejo] i18n: update of translations from Codeberg Translate (#9825)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9825
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-10-24 08:11:42 +02:00
forgejo-backport-action
2c26525a9a [v13.0/forgejo] chore: update go target language version to v1.25.0 (#9827)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9822

Requirement for upcoming work to use APIs added to the standard library in Go 1.25.  I've broken this out into a separate PR to ensure there are no related test failures.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9827
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-23 21:50:33 +02:00
Renovate Bot
6e26d31473 Update data.forgejo.org/oci/golang Docker tag to v1.25 (v13.0/forgejo) (#9824)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [data.forgejo.org/oci/golang](https://hub.docker.com/_/golang) ([source](https://github.com/docker-library/golang)) | stage | minor | `1.24-alpine3.22` -> `1.25-alpine3.22` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTIuOSIsInVwZGF0ZWRJblZlciI6IjQxLjE1Mi45IiwidGFyZ2V0QnJhbmNoIjoidjEzLjAvZm9yZ2VqbyIsImxhYmVscyI6WyJkZXBlbmRlbmN5LXVwZ3JhZGUiLCJ0ZXN0L25vdC1uZWVkZWQiXX0=-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9824
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-10-23 19:30:31 +02:00
0ko
6e60d538bd [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
aad2efdbd6

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Bullbagaren <bullbagaren@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Vyxie <kitakita@disroot.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: X1SystemError0X <x1systemerror0x@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: butterflyoffire <butterflyoffire@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: nykula <nykula@noreply.codeberg.org>
Co-authored-by: stanek <stanek@noreply.codeberg.org>
Co-authored-by: victordargallo <victordargallo@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
2025-10-23 21:18:52 +05:00
0ko
2022feee7d [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
5494d8b3cd

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: anorprogrammer <anorprogrammer@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: butterflyoffire <butterflyoffire@noreply.codeberg.org>
Co-authored-by: emansije <emansije@noreply.codeberg.org>
Co-authored-by: nykula <nykula@noreply.codeberg.org>
Co-authored-by: pgmtx <pgmtx@noreply.codeberg.org>
Co-authored-by: victordargallo <victordargallo@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: yeager <yeager@noreply.codeberg.org>
2025-10-23 21:18:02 +05:00
Renovate Bot
494d5625e2 Update dependency go to v1.25 (v13.0/forgejo) (#9816)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [go](https://go.dev/) ([source](https://github.com/golang/go)) | toolchain | minor | `1.24.7` -> `1.25.3` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTIuOSIsInVwZGF0ZWRJblZlciI6IjQxLjE1Mi45IiwidGFyZ2V0QnJhbmNoIjoidjEzLjAvZm9yZ2VqbyIsImxhYmVscyI6WyJkZXBlbmRlbmN5LXVwZ3JhZGUiLCJ0ZXN0L25vdC1uZWVkZWQiXX0=-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9816
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-10-23 01:37:46 +02:00
Mathieu Fenniak
c7f2d7394b [v13.0/forgejo] fix(perf): add missing index on action_task table (#9795)
**Backport:** #9789

Fixes #9755, performance regression from #9017.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [ ] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9795): <!--number 9795 --><!--line 0 --><!--description Zml4KHBlcmYpOiBhZGQgbWlzc2luZyBpbmRleCBvbiBhY3Rpb25fdGFzayB0YWJsZQ==-->fix(perf): add missing index on action_task table<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9795
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-10-21 18:40:28 +02:00
forgejo-backport-action
76afa21433 [v13.0/forgejo] fix: GLOBAL_TWO_FACTOR_REQUIREMENT all prevents actions/checkout from cloning repositories (#9772)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9764

Resolves: #9738
I hope the test is ok, when not please say what kind of test I should add

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9764): <!--number 9764 --><!--line 0 --><!--description R0xPQkFMX1RXT19GQUNUT1JfUkVRVUlSRU1FTlQgYWxsIHByZXZlbnRzIGFjdGlvbnMvY2hlY2tvdXQgZnJvbSBjbG9uaW5nIHJlcG9zaXRvcmllcw==-->GLOBAL_TWO_FACTOR_REQUIREMENT all prevents actions/checkout from cloning repositories<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: zokki <zokki.softwareschmiede@gmail.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9772
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-20 22:00:02 +02:00
Mathieu Fenniak
d7e08cfb8c [v13.0/forgejo] fix: strict error handling on corrupted DB migration tracking tables (#9776)
**Backport:** #9773

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9776): <!--number 9776 --><!--line 0 --><!--description Zml4OiBzdHJpY3QgZXJyb3IgaGFuZGxpbmcgb24gY29ycnVwdGVkIERCIG1pZ3JhdGlvbiB0cmFja2luZyB0YWJsZXM=-->fix: strict error handling on corrupted DB migration tracking tables<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9776
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-10-20 19:13:50 +02:00
forgejo-backport-action
714b88f8b2 [v13.0/forgejo] fix: db.Iterate can miss records, can return records twice (#9723)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9657

Fixes #9644.

Rewrites `db.Iterate` so that it performs DB queries in this format:
- First: `SELECT ...columns... FROM table ORDER BY id LIMIT ...buffer-size...`
- Subsequent buffer fills: adding a `WHERE id > ...last-id-from-previous...`

This approach:
- Prevents records from being missed or returned twice
- Returns records in a predictable order
- Should be faster, by virtue of using database indexes on the primary key to perform the query
- Doesn't rely on any unpredictable database behaviour when using `LIMIT` and `OFFSET` without an `ORDER BY`
- (Downside: does require reflection to read field values off Go structures for the primary key value)

Expands the automated tests to include the predicted failure case identified in #9644, which verified the previous broken behaviour, as well as verifying that the `cond` parameter is applied which was previously not covered by test automation.

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9723
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-17 06:45:24 +02:00
forgejo-backport-action
d59c49ec52 [v13.0/forgejo] fix: release email links (#9714)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9690

Use correct links (instance.com/owner/repo/archive/tag.extension) links in release emails, instead of the (/owner/repo) incomplete links.

I have manually tested this. Below is a screenshot of an email sent with the new version having correct hyperlinks.

Fixes #9482

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

#### Manual test screenshots

![image](/attachments/f00fb1f9-17f2-4df8-bc0d-3e8f215020cb)

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: VewDev <vewdev@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9714
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-16 18:58:48 +02:00
forgejo-backport-action
48914b9465 [v13.0/forgejo] fix: use scrollHeight for rendered iframe if offsetHeight is unavailable (#9713)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9508

Fixes #9421.

Co-authored-by: Bojidar Marinov <bojidar.marinov.bg@gmail.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9713
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-16 16:53:54 +02:00
forgejo-backport-action
f7603e7356 [v13.0/forgejo] feat: strip EXIF information from uploaded avatars (#9689)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9638

Strips EXIF information from uploaded avatars (excluding the orientation tag), affecting both user & repo avatars.  Adds a new subcommand `forgejo doctor avatar-strip-exif` to perform a retroactive update of avatar files.

Fixes #9608.

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [x] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9689): <!--number 9689 --><!--line 0 --><!--description VXBsb2FkZWQgYXZhdGFyIGltYWdlcyBjYW4gc29tZXRpbWVzIGNvbnRhaW4gdW5leHBlY3RlZCBtZXRhZGF0YSBzdWNoIGFzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQsIG9yIHRoZSBkZXZpY2UgdGhlIGltYWdlIHdhcyBjcmVhdGVkIHdpdGgsIHN0b3JlZCBpbiBhIGZvcm1hdCBjYWxsZWQgRVhJRi4gRm9yZ2VqbyBub3cgcmVtb3ZlcyBFWElGIGRhdGEgd2hlbiBjdXN0b20gdXNlciBhbmQgcmVwb3NpdG9yeSBpbWFnZXMgYXJlIHVwbG9hZGVkIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgcmlzayBvZiBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBiZWluZyBsZWFrZWQgdW5leHBlY3RlZGx5LiBBIG5ldyBDTEkgc3ViY29tbWFuZCBgZm9yZ2VqbyBkb2N0b3IgYXZhdGFyLXN0cmlwLWV4aWZgIGNhbiBiZSB1c2VkIHRvIHN0cmlwIEVYSUYgaW5mb3JtYXRpb24gZnJvbSBhbGwgZXhpc3RpbmcgYXZhdGFyczsgd2UgcmVjb21tZW5kIHRoYXQgYWRtaW5pc3RyYXRvcnMgcnVuIHRoaXMgY29tbWFuZCBvbmNlIGFmdGVyIHVwZ3JhZGUgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhpcyByaXNrIGZvciBleGlzdGluZyBzdG9yZWQgZmlsZXMu-->Uploaded avatar images can sometimes contain unexpected metadata such as the location where the image was created, or the device the image was created with, stored in a format called EXIF. Forgejo now removes EXIF data when custom user and repository images are uploaded in order to reduce the risk of personally identifiable information being leaked unexpectedly. A new CLI subcommand `forgejo doctor avatar-strip-exif` can be used to strip EXIF information from all existing avatars; we recommend that administrators run this command once after upgrade in order to minimize this risk for existing stored files.<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9689
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-15 08:53:51 +02:00
Beowulf
0fda75e08e fix: re-add accidentally removed closing tag of div (#9687)
Regression from b1b99d5c70

# Testing

- Go to a repo
- Try to create an issue
- Check that the page looks correct and the forms are in place

After the fix it is correct again:

![grafik](/attachments/cce2906f-02d2-4f15-a307-8ad0376ec8db)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9687
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Beowulf <beowulf@beocode.eu>
Co-committed-by: Beowulf <beowulf@beocode.eu>
2025-10-14 12:13:02 +02:00
Gusted
08f37b5771 reverts "[v13.0/forgejo] fix: temporarily pin release builds to Go 1.24.7 (#9658)" (#9680)
Go 1.24.9 has been released which fixes the regression from Go 1.24.8

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9680
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-committed-by: Gusted <postmaster@gusted.xyz>
2025-10-14 10:24:35 +02:00
Gusted
b1b99d5c70 [v13.0/forgejo] fix: avoid jumping to begin of page on edit comment action (#9645) (#9674)
**Backport: forgejo/forgejo#9645**

When you edit a comment and the comment already has a markdown editor,
then the code will click on the 'Write' tab, in case you canceled
editting the comment when you were at the 'Preview' tab. In
forgejo/forgejo#2681 I added `href="#"` to the tab items, this causes
that when the 'Write' tab is being clicked by the code the page is
jumped the beginning of the page.

Instead of being clever and trying to make this item interactive via
another way or via javascript avoid this jumping, we do better and make
this element a button. This item is not a link, it's a button that will
perform a action. This entirely avoids the issue of jumping and it's
still interactive.

Resolves forgejo/forgejo#9542

---

Conflict resolution: trivial
(cherry picked from commit d0a6f93f9e)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9674
Reviewed-by: Otto <otto@codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-committed-by: Gusted <postmaster@gusted.xyz>
2025-10-13 23:05:03 +02:00
forgejo-backport-action
5a622f7640 [v13.0/forgejo] chore(e2e): test flakiness in webauthn.test.e2e.ts (#9672)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9662

Test failure:
```
  1) [chromium] › tests/e2e/webauthn.test.e2e.ts:14:1 › WebAuthn register & login flow ─────────────
    Error: page.goto: Navigation to "http://localhost:3003/user/login" is interrupted by another navigation to "http://localhost:3003/"
    Call log:
      - navigating to "http://localhost:3003/user/login", waiting until "load"
      46 |
      47 |   // Login.
    > 48 |   response = await page.goto('/user/login');
         |                         ^
      49 |   expect(response?.status()).toBe(200);
      50 |
      51 |   await page.getByLabel('Username or email address').fill(username);
        at /workspace/forgejo/forgejo/tests/e2e/webauthn.test.e2e.ts:48:25
```

I have not been able to reproduce this locally.

What seems to be happening is that the current code is clicking the "Sign out" menu option, and then while the browser is busy (navigating to `/logout`, redirecting to `/`), the test attempts to navigate directly to `/user/login`.  The two navigations are racey, depending on how fast they work they may result in this error.  The proposed fix is to wait for the sign-out operation to complete by waiting for the URL to land on `/`, before then proceeding with the rest of the test with the second login.

Normally this would be *just* a `waitForURL` call.  But because of the redirect on logout, I've encountered the below error if the code is just invoking `waitForURL`.  So I put the `waitForURL` invocation into an `expect(...).toPass()`.  This isn't technically the correct usage of `toPass` which is intended for *assertions* which will eventually become successful, whereas this is attempting to retry a wait... but... a wait shouldn't need a retry.  (I'd argue this is a Playwright bug.)
```
Error: page.waitForURL: net::ERR_ABORTED; maybe frame was detached?
```

Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9672
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-13 19:56:15 +02:00
forgejo-backport-action
4dbd9c7261 [v13.0/forgejo] fix(ui): add markup class to project descriptions (#9667)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9634

Fixes #9630

### Project page
Before
![project-page-before](/attachments/1a6b15e6-6959-4ec2-978b-241a31958f1c)
After
![project-page-after](/attachments/50fe81a7-6c29-49e5-8336-a8261171c77c)

### Projects list
Before
![project-list-before](/attachments/ec92a7f5-de76-4c36-90b4-4f8951ad14b7)
After
![project-list-after](/attachments/f1d82688-3030-45d6-8ca5-6d601f5cbc8f)

---

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

I'm unsure if this change is substantial enough to warrant that?

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- User Interface bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9634): <!--number 9634 --><!--line 0 --><!--description Zml4KHVpKTogYWRkIGBtYXJrdXBgIGNsYXNzIHRvIHByb2plY3QgZGVzY3JpcHRpb25z-->fix(ui): add `markup` class to project descriptions<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Cyborus <cyborus@cyborus.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9667
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-13 05:14:47 +02:00
Earl Warren
9ff712ee6a [v13.0/forgejo] fix: temporarily pin release builds to Go 1.24.7 (#9658)
Refs: https://codeberg.org/forgejo/forgejo/issues/9656

## Testing

```
$ docker build --progress=plain --tag local:v13-test --load . |& tee /tmp/build
...
#8 [build-env  1/16] FROM data.forgejo.org/oci/golang:1.24.7-alpine3.22@sha256:fc2cff6625f3c1c92e6c85938ac5bd09034ad0d4bc2dfb08278020b68540dbb5
#8 ...

#11 [stage-2 3/9] RUN addgroup     -S -g 1000     git &&   adduser     -S -H -D     -h /data/git     -s /bin/bash     -u 1000     -G git     git &&   echo "git:*" | chpasswd -e
...
#23 59.25 CGO_CFLAGS="-O2 -g -DSQLITE_MAX_VARIABLE_NUMBER=32766" /usr/local/go/bin/go build -trimpath  -tags 'netgo osusergo bindata timetzdata sqlite sqlite_unlock_notify' -ldflags '-linkmode external -extldflags "-static" -buildid= -s -w -X "main.ReleaseVersion=" -X "main.MakeVersion=GNU Make 4.4.1" -X "main.Version=13.0.0-dev-544-f1b30a71b0+gitea-1.22.0" -X "main.Tags=bindata timetzdata sqlite sqlite_unlock_notify" -X "main.ForgejoVersion=13.0.0-dev-544-f1b30a71b0+gitea-1.22.0"' -o gitea
#23 DONE 116.3s

#24 [build-env 14/16] COPY docker/root /tmp/local
#24 DONE 0.0s

#25 [build-env 15/16] RUN chmod 755 /tmp/local/usr/bin/entrypoint               /tmp/local/usr/local/bin/gitea               /tmp/local/etc/s6/gitea/*               /tmp/local/etc/s6/openssh/*               /tmp/local/etc/s6/.s6-svscan/*               /go/src/forgejo.org/gitea               /go/src/forgejo.org/environment-to-ini
#25 DONE 0.3s

#26 [build-env 16/16] RUN chmod 644 /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete
#26 DONE 0.3s

#27 [stage-2 4/9] COPY --from=build-env /tmp/local /
#27 DONE 0.1s

#28 [stage-2 5/9] RUN cd /usr/local/bin ; ln -s gitea forgejo
#28 DONE 0.2s

#29 [stage-2 6/9] COPY --from=build-env /go/src/forgejo.org/gitea /app/gitea/gitea
#29 DONE 0.2s

#30 [stage-2 7/9] RUN ln -s /app/gitea/gitea /app/gitea/forgejo-cli
#30 DONE 0.2s

#31 [stage-2 8/9] COPY --from=build-env /go/src/forgejo.org/environment-to-ini /usr/local/bin/environment-to-ini
#31 DONE 0.0s

#32 [stage-2 9/9] COPY --from=build-env /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
#32 DONE 0.1s

#33 exporting to image
#33 exporting layers
#33 exporting layers 0.2s done
#33 writing image sha256:02eab5877a38b53094d76a138ccfe5f3d8b2032e5e9161329350c7e663acd308 done
#33 naming to docker.io/library/local:v13-test done
#33 DONE 0.2s
```

and then:

```
$ docker run --rm local:v13-test /usr/local/bin/forgejo --version
forgejo version 13.0.0-dev-544-f1b30a71b0+gitea-1.22.0 built with GNU Make 4.4.1, go1.24.7 : bindata, timetzdata, sqlite, sqlite_unlock_notify
```

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9658
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: Earl Warren <contact@earl-warren.org>
Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-10-12 18:46:56 +02:00
forgejo-backport-action
01f0dbde9e [v13.0/forgejo] fix(ui/releases): strech elements apart when no search bar (#9637)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9626

Fix minor visual defect, which is a regression of https://codeberg.org/forgejo/forgejo/pulls/8399.

When viewing individual releases, there's no search bar.

I would have modified `.list-header` directly but blast radius is too large. So just added a helper. It does not affect the display in any other situations.

## Preview

![1](/attachments/5621e544-6d18-4f58-b4f5-f15bf2c10e3b)

![2](/attachments/f6ebc7bb-9168-4a3f-86ba-0b526c2ede89)

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9637
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-11 11:18:20 +02:00
forgejo-backport-action
83e7ff3ba2 [v13.0/forgejo] chore(ci): limit LDAP service container memory usage to 500M (#9620)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9611

This is a noop and will be silently ignored until Forgejo runner v11.2.0 is servicing this repository with https://code.forgejo.org/forgejo/runner/pulls/1079

---

Resolves forgejo/forgejo#9406

Co-authored-by: Earl Warren <contact@earl-warren.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9620
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-10 23:03:41 +02:00
Earl Warren
72a38d19ac [v13.0/forgejo] chore: TestParseGitURLs must use a valid IPv6 address (#9622)
**Backport: https://codeberg.org/forgejo/forgejo/pulls/8908**

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8908
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
(cherry picked from commit 94c068e91e)

```
Conflicts:
	go.mod
  only the IPv6 fix part is needed
```

Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9622
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2025-10-10 20:01:31 +02:00
0ko
72faa337d0 merge commit: [v13.0/forgejo] i18n: update of translations from Codeberg Translate (#9600)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9600
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-10-10 12:31:13 +02:00
0ko
65189bdb3e [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
d5742c31fb

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Lzebulon <lzebulon@noreply.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: Ricky-Tigg <ricky-tigg@noreply.codeberg.org>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Vaibhav Sunder <vaibhavswire@gmail.com>
Co-authored-by: Vyxie <kitakita@disroot.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: X1SystemError0X <x1systemerror0x@noreply.codeberg.org>
Co-authored-by: arifpedia <arifpedia@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: bespinas <bespinas@noreply.codeberg.org>
Co-authored-by: butterflyoffire <butterflyoffire@noreply.codeberg.org>
Co-authored-by: dyniec <dyniec@noreply.codeberg.org>
Co-authored-by: erral <erral@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: m13o <m13o@noreply.codeberg.org>
Co-authored-by: smlxdesign <smlxdesign@noreply.codeberg.org>
Co-authored-by: talu <talu@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
2025-10-09 23:46:41 +05:00
0ko
d6d4033a19 [v13.0/forgejo] i18n: update of translations from Codeberg Translate
Translation updates that were relevant to v13 branch were picked from this commit:
cd7a8f4546

Changes to strings that are only present in the v14 branch were not picked.

Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v14.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: 11xx <11xx@noreply.codeberg.org>
Co-authored-by: Baturax <baturax@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: Salif Mehmed <mail@salif.eu>
Co-authored-by: SomeTr <sometr@noreply.codeberg.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: Xinayder <xinayder@noreply.codeberg.org>
Co-authored-by: matheusgomesms <matheusgomesms@noreply.codeberg.org>
Co-authored-by: smlxdesign <smlxdesign@noreply.codeberg.org>
Co-authored-by: thecoolcats <thecoolcats@noreply.codeberg.org>
2025-10-09 23:45:15 +05:00
Earl Warren
80fcbf165c [v13.0/forgejo] fix: failure to parse on block results in unconditional workflow execution (#9536)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9536
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-10-06 06:50:52 +02:00
forgejo-backport-action
2d3d5048d6 [v13.0/forgejo] fix(ui): reworked file preview placement towards better HTML validity, take 2 (#9540)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9534

Closes: forgejo/forgejo#9472.
Followup of: forgejo/forgejo#9181
Examples with render panic on code.forgejo.org:
- https://code.forgejo.org/forgejo/runner/issues/485#issue-6254
- https://code.forgejo.org/forgejo-helm/forgejo-helm/issues/705#issuecomment-37753

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: Robert Wolff <mahlzahn@posteo.de>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9540
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-06 06:34:09 +02:00
Mathieu Fenniak
029a493779 display pre-execution errors in action view UI
(cherry picked from commit 02ea77c6a0)
2025-10-05 21:21:30 -06:00
Mathieu Fenniak
877726a2bf don't execute workflows when event parsing fails; create a pre-execution error instead
(cherry picked from commit 25ba696b6a)
2025-10-05 21:21:30 -06:00
Mathieu Fenniak
6755ff1631 save pre-execution errors to the DB when workflow execution is prevented by user data
(cherry picked from commit 152b98da90)
2025-10-05 21:21:30 -06:00
Mathieu Fenniak
72abb7079b test: fix 'Missing required prop' warning during RepoActionView frontend tests (#9454)
Fixes warnings in the `RepoActionView.test.js`, introduced in #9444 but caused by the frontend tests not providing all required properties to the component.

```
stderr | web_src/js/components/RepoActionView.test.js > processes ##[group] and ##[endgroup]
[Vue warn]: Missing required prop: "runIndex"
  at <RepoActionView jobIndex="1" attemptNumber="1" initialJobData= {
  state: {
    run: { status: 'success', commit: [Object] },
    currentJob: { steps: [Array] }
  },
  logs: { stepsLog: [] }
}  ... >
  at <VTUROOT>
```

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [ ] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [x] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9454
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
(cherry picked from commit 0b923a03b4)
2025-10-05 21:21:07 -06:00
forgejo-backport-action
7a3fcbabf2 [v13.0/forgejo] fix: allow unactivated users to send recovery mails (#9515)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9504

With forgejo/forgejo#9075 the `GetUserByEmail` now actually only used activated emails. This however broke sending recovery mails to unactivated users, as their email are not yet activated.

Use the newly introduced function `GetUserByEmailSimple` to not care about this activated email requirement and also avoid the no-reply address being a valid email address for this functionality.

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9515
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-03 08:16:44 +02:00
forgejo-backport-action
a674198198 [v13.0/forgejo] fix(ui): improve Pagure migrator private issues clarity (#9506)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9502

Followup to https://codeberg.org/forgejo/forgejo/pulls/8513
More at https://codeberg.org/fedora/forgejo-deployment/issues/186
Related: https://codeberg.org/forgejo/forgejo/pulls/8513#issuecomment-6075304, https://codeberg.org/forgejo/forgejo/pulls/8513/files#issuecomment-6075322

Previously, users were getting confused about the token/private issues
behavior in the Pagure migrator, as the UI didn't clearly explain the
two-repository workflow or the security implications of using an API token.
This commit updates the Pagure migration template to make the behavior
clearer by:

- Adding a collapsible details section for private issues functionality to
  reduce UI clutter since this feature is not expected to be used frequently
- Replacing inline help text with proper Fomantic UI message boxes (blue
  info for description, red warning for security notice)
- Providing clear explanations of the two-step migration process (public
  content first, then private issues archive)
- Adding prominent security warnings about repository visibility when
  importing private content

The private issues section is now hidden by default in a collapsible
element, making the standard migration flow cleaner while still providing
access to advanced functionality when needed.

Co-authored-by: Ryan Lerch <rlerch@redhat.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9506
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-02 17:06:48 +02:00
forgejo-backport-action
d0b820039d [v13.0/forgejo] feat(ui): improve rendering commit links for PR commits, external repos and diffs (#9493)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9146

- fix links to PR commits, e.g. `!7979 (commit 4d968c08e0)`
- show the repo slug for links other than the current repository, e.g. `forgejo/docs@498bd80133`
- truncate long `diff-...` fragments, e.g. `600be26638 (diff-953bb4f01)`
- show `files` query values for compare links, e.g. `8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)`

Closes: #7980
Closes: #9130
Closes: #8023
Ref: #5901

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- User Interface features
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9146): <!--number 9146 --><!--line 0 --><!--description ZmVhdCh1aSk6IGltcHJvdmUgcmVuZGVyaW5nIGNvbW1pdCBsaW5rcyBmb3IgUFIgY29tbWl0cywgZXh0ZXJuYWwgcmVwb3MgYW5kIGRpZmZz-->feat(ui): improve rendering commit links for PR commits, external repos and diffs<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Lucas Schwiderski <lucas@lschwiderski.de>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9493
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-10-01 05:44:52 +02:00
forgejo-backport-action
d452207e50 [v13.0/forgejo] fix: markup rendering panic must not abort the process (#9479)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9478

It must return on error instead, and log a stack trace for forensic analysis.

Refs https://codeberg.org/forgejo/forgejo/issues/9472

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] I do not want this change to show in the release notes.
- [ ] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

Co-authored-by: Earl Warren <contact@earl-warren.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9479
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-09-30 10:26:11 +02:00
forgejo-backport-action
010366d641 [v13.0/forgejo] fix: package cleaned rule fails if the keep count is too high (#9471)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9468

If the keep count of a cleanup rule is greater than the number of available packages, it fails with:

```
panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSliceB})
.../packages/packages.go:175
.../routers/web/org/setting_packages.go:108
```

Regression of https://codeberg.org/forgejo/forgejo/pulls/9219/files

Refs https://codeberg.org/forgejo/forgejo/issues/9461

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Bug fixes
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9468): <!--number 9468 --><!--line 0 --><!--description cGFja2FnZSBjbGVhbmVkIHJ1bGUgZmFpbHMgaWYgdGhlIGtlZXAgY291bnQgaXMgdG9vIGhpZ2g=-->package cleaned rule fails if the keep count is too high<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Earl Warren <contact@earl-warren.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9471
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-09-29 18:01:24 +02:00
forgejo-backport-action
391f9a2f2c [v13.0/forgejo] fix: replace "All pull requests" in repo issue filter (#9445)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/9401

When on the issue page, show "All issues" instead of "All pull requests" inside the "Type" filter.

Co-authored-by: Max Günther <code-mg@mailbox.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9445
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-09-27 17:48:41 +02:00
251 changed files with 21326 additions and 1983 deletions

View file

@ -49,6 +49,7 @@ forgejo.org/models/repo
WatchRepoMode
forgejo.org/models/user
IsErrUserWrongType
IsErrExternalLoginUserAlreadyExist
IsErrExternalLoginUserNotExist
NewFederatedUser

View file

@ -2,6 +2,9 @@
set -ex
# WARNING: Changes to the behaviour of this file should be backported to all active releases, as it is used in
# `build-release.yml` from release branches.
end_to_end=$1
end_to_end_pr=$2
forgejo=$3

View file

@ -13,7 +13,7 @@ runs:
apt-get update -qq
apt-get -q install -y -qq curl ca-certificates
curl -sS -o /tmp/git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb
curl -sS -o /tmp/git-man.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb
curl -sS -o /tmp/git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb
curl -sS -o /tmp/git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb

View file

@ -206,7 +206,7 @@ jobs:
origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }}
origin-token: ${{ secrets.CASCADE_ORIGIN_TOKEN }}
origin-ref: refs/heads/forgejo
origin-ref: ${{ github.ref }}
destination-url: https://code.forgejo.org
destination-fork-repo: ${{ vars.CASCADE_DESTINATION_DOER }}/end-to-end
destination-repo: forgejo/end-to-end

View file

@ -233,6 +233,7 @@ jobs:
options: --tmpfs /bitnami/minio/data
ldap:
image: data.forgejo.org/oci/forgejo-test-openldap:1
options: --memory 500M
pgsql:
image: data.forgejo.org/oci/bitnami/postgresql:16
env:

1
.node-version Normal file
View file

@ -0,0 +1 @@
22.21.1

View file

@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.22 AS build-env
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.25-alpine3.22 AS build-env
ARG GOPROXY
ENV GOPROXY=${GOPROXY:-https://proxy.golang.org,direct}

View file

@ -1,6 +1,6 @@
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.22 AS build-env
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.25-alpine3.22 AS build-env
ARG GOPROXY
ENV GOPROXY=${GOPROXY:-https://proxy.golang.org,direct}

View file

@ -41,7 +41,7 @@ EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-che
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.1 # renovate: datasource=go
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.15 # renovate: datasource=go
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.33.1 # renovate: datasource=go
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasource=go
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go
@ -514,7 +514,7 @@ lint-disposable-emails-fix:
.PHONY: security-check
security-check:
go run $(GOVULNCHECK_PACKAGE) -show color ./...
$(GO) run $(GOVULNCHECK_PACKAGE) -show color ./...
###
# Development and testing targets

File diff suppressed because one or more lines are too long

View file

@ -6,6 +6,8 @@ package cmd
import (
"context"
"fmt"
"image"
"io"
golog "log"
"os"
"path/filepath"
@ -15,11 +17,15 @@ import (
"forgejo.org/models/db"
"forgejo.org/models/migrations"
migrate_base "forgejo.org/models/migrations/base"
repo_model "forgejo.org/models/repo"
user_model "forgejo.org/models/user"
"forgejo.org/modules/container"
"forgejo.org/modules/log"
"forgejo.org/modules/setting"
"forgejo.org/modules/storage"
"forgejo.org/services/doctor"
exif_terminator "code.superseriousbusiness.org/exif-terminator"
"github.com/urfave/cli/v3"
)
@ -34,6 +40,7 @@ func cmdDoctor() *cli.Command {
cmdDoctorCheck(),
cmdRecreateTable(),
cmdDoctorConvert(),
cmdAvatarStripExif(),
},
}
}
@ -98,6 +105,14 @@ You should back-up your database before doing this and ensure that your database
}
}
func cmdAvatarStripExif() *cli.Command {
return &cli.Command{
Name: "avatar-strip-exif",
Usage: "Strip EXIF metadata from all images in the avatar storage",
Action: runAvatarStripExif,
}
}
func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error {
stdCtx, cancel := installSignals(stdCtx)
defer cancel()
@ -230,3 +245,78 @@ func runDoctorCheck(stdCtx context.Context, ctx *cli.Command) error {
}
return doctor.RunChecks(stdCtx, colorize, ctx.Bool("fix"), checks)
}
func runAvatarStripExif(ctx context.Context, c *cli.Command) error {
ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
return err
}
if err := storage.Init(); err != nil {
return err
}
type HasCustomAvatarRelativePath interface {
CustomAvatarRelativePath() string
}
doExifStrip := func(obj HasCustomAvatarRelativePath, name string, target_storage storage.ObjectStorage) error {
if obj.CustomAvatarRelativePath() == "" {
return nil
}
log.Info("Stripping avatar for %s...", name)
avatarFile, err := target_storage.Open(obj.CustomAvatarRelativePath())
if err != nil {
return fmt.Errorf("storage.Avatars.Open: %w", err)
}
_, imgType, err := image.DecodeConfig(avatarFile)
if err != nil {
return fmt.Errorf("image.DecodeConfig: %w", err)
}
// reset io.Reader for exif termination scan
_, err = avatarFile.Seek(0, io.SeekStart)
if err != nil {
return fmt.Errorf("avatarFile.Seek: %w", err)
}
cleanedData, err := exif_terminator.Terminate(avatarFile, imgType)
if err != nil && strings.Contains(err.Error(), "cannot be processed") {
// expected error for an image type that isn't supported by exif_terminator
log.Info("... image type %s is not supported by exif_terminator, skipping.", imgType)
return nil
} else if err != nil {
return fmt.Errorf("error cleaning exif data: %w", err)
}
if err := storage.SaveFrom(target_storage, obj.CustomAvatarRelativePath(), func(w io.Writer) error {
_, err := io.Copy(w, cleanedData)
return err
}); err != nil {
return fmt.Errorf("Failed to create dir %s: %w", obj.CustomAvatarRelativePath(), err)
}
log.Info("... completed %s.", name)
return nil
}
err := db.Iterate(ctx, nil, func(ctx context.Context, user *user_model.User) error {
return doExifStrip(user, fmt.Sprintf("user %s", user.Name), storage.Avatars)
})
if err != nil {
return err
}
err = db.Iterate(ctx, nil, func(ctx context.Context, repo *repo_model.Repository) error {
return doExifStrip(repo, fmt.Sprintf("repo %s", repo.Name), storage.RepoAvatars)
})
if err != nil {
return err
}
return nil
}

View file

@ -237,7 +237,7 @@ Forgejo or set your environment appropriately.`, "")
continue
}
fields := bytes.Fields(scanner.Bytes())
fields := bytes.Split(scanner.Bytes(), []byte(" "))
if len(fields) != 3 {
continue
}
@ -397,7 +397,7 @@ Forgejo or set your environment appropriately.`, "")
continue
}
fields := bytes.Fields(scanner.Bytes())
fields := bytes.Split(scanner.Bytes(), []byte(" "))
if len(fields) != 3 {
continue
}

View file

@ -14,6 +14,9 @@ import (
"testing"
"time"
"forgejo.org/modules/git"
"forgejo.org/modules/json"
"forgejo.org/modules/private"
"forgejo.org/modules/setting"
"forgejo.org/modules/test"
@ -162,6 +165,136 @@ func TestDelayWriter(t *testing.T) {
})
}
func TestRunHookPrePostReceive(t *testing.T) {
// Setup the environment.
defer test.MockVariableValue(&setting.InternalToken, "Random")()
defer test.MockVariableValue(&setting.InstallLock, true)()
defer test.MockVariableValue(&setting.Git.VerbosePush, true)()
t.Setenv("SSH_ORIGINAL_COMMAND", "true")
tests := []struct {
name string
inputLine string
oldCommitID string
newCommitID string
refFullName string
}{
{
name: "base case",
inputLine: "00000000000000000000 00000000000000000001 refs/head/main\n",
oldCommitID: "00000000000000000000",
newCommitID: "00000000000000000001",
refFullName: "refs/head/main",
},
{
name: "nbsp case",
inputLine: "00000000000000000000 00000000000000000001 refs/head/ma\u00A0in\n",
oldCommitID: "00000000000000000000",
newCommitID: "00000000000000000001",
refFullName: "refs/head/ma\u00A0in",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Setup the Stdin.
f, err := os.OpenFile(t.TempDir()+"/stdin", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666)
require.NoError(t, err)
_, err = f.Write([]byte(tt.inputLine))
require.NoError(t, err)
_, err = f.Seek(0, 0)
require.NoError(t, err)
defer test.MockVariableValue(os.Stdin, *f)()
// Setup the server that processes the hooks.
var serverError error
var hookOpts *private.HookOptions
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
serverError = err
w.WriteHeader(500)
return
}
err = json.Unmarshal(body, &hookOpts)
if err != nil {
serverError = err
w.WriteHeader(500)
return
}
w.WriteHeader(200)
resp := &private.HookPostReceiveResult{}
bytes, err := json.Marshal(resp)
if err != nil {
serverError = err
return
}
_, err = w.Write(bytes)
if err != nil {
serverError = err
return
}
}))
defer ts.Close()
defer test.MockVariableValue(&setting.LocalURL, ts.URL+"/")()
t.Run("pre-receive", func(t *testing.T) {
app := cli.Command{}
app.Commands = []*cli.Command{subcmdHookPreReceive()}
finish := captureOutput(t, os.Stdout)
err = app.Run(t.Context(), []string{"./forgejo", "pre-receive"})
require.NoError(t, err)
out := finish()
require.Empty(t, out)
require.NoError(t, serverError)
require.NotNil(t, hookOpts)
require.Len(t, hookOpts.OldCommitIDs, 1)
assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0])
require.Len(t, hookOpts.NewCommitIDs, 1)
assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0])
require.Len(t, hookOpts.RefFullNames, 1)
assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0])
})
// seek stdin back to beginning
_, err = f.Seek(0, 0)
require.NoError(t, err)
// reset state from prev test
serverError = nil
hookOpts = nil
t.Run("post-receive", func(t *testing.T) {
app := cli.Command{}
app.Commands = []*cli.Command{subcmdHookPostReceive()}
finish := captureOutput(t, os.Stdout)
err = app.Run(t.Context(), []string{"./forgejo", "post-receive"})
require.NoError(t, err)
out := finish()
require.Empty(t, out)
require.NoError(t, serverError)
require.NotNil(t, hookOpts)
require.Len(t, hookOpts.OldCommitIDs, 1)
assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0])
require.Len(t, hookOpts.NewCommitIDs, 1)
assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0])
require.Len(t, hookOpts.RefFullNames, 1)
assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0])
})
})
}
}
func TestRunHookUpdate(t *testing.T) {
app := cli.Command{}
app.Commands = []*cli.Command{subcmdHookUpdate()}

32
go.mod
View file

@ -1,8 +1,8 @@
module forgejo.org
go 1.24.0
go 1.25.0
toolchain go1.24.7
toolchain go1.25.5
require (
code.forgejo.org/f3/gof3/v3 v3.11.0
@ -10,13 +10,15 @@ require (
code.forgejo.org/forgejo/go-rpmutils v1.0.0
code.forgejo.org/forgejo/levelqueue v1.0.0
code.forgejo.org/forgejo/reply v1.0.2
code.forgejo.org/forgejo/runner/v11 v11.1.1
code.forgejo.org/forgejo/runner/v11 v11.1.2
code.forgejo.org/go-chi/binding v1.0.1
code.forgejo.org/go-chi/cache v1.0.1
code.forgejo.org/go-chi/captcha v1.0.2
code.forgejo.org/go-chi/session v1.0.2
code.gitea.io/actions-proto-go v0.4.0
code.gitea.io/sdk/gitea v0.21.0
code.superseriousbusiness.org/exif-terminator v0.11.0
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
connectrpc.com/connect v1.18.1
github.com/42wim/httpsig v1.2.3
@ -34,6 +36,7 @@ require (
github.com/djherbis/buffer v1.2.0
github.com/djherbis/nio/v3 v3.0.1
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b
github.com/dustin/go-humanize v1.0.1
github.com/editorconfig/editorconfig-core-go/v2 v2.6.3
github.com/emersion/go-imap v1.2.1
@ -99,13 +102,13 @@ require (
gitlab.com/gitlab-org/api/client-go v0.130.1
go.uber.org/mock v0.6.0
go.yaml.in/yaml/v3 v3.0.4
golang.org/x/crypto v0.42.0
golang.org/x/crypto v0.45.0
golang.org/x/image v0.31.0
golang.org/x/net v0.44.0
golang.org/x/net v0.47.0
golang.org/x/oauth2 v0.31.0
golang.org/x/sync v0.17.0
golang.org/x/sys v0.36.0
golang.org/x/text v0.29.0
golang.org/x/sync v0.18.0
golang.org/x/sys v0.38.0
golang.org/x/text v0.31.0
google.golang.org/protobuf v1.36.9
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
@ -116,6 +119,7 @@ require (
require (
cloud.google.com/go/compute/metadata v0.6.0 // indirect
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 // indirect
dario.cat/mergo v1.0.2 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
@ -160,6 +164,10 @@ require (
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fatih/color v1.18.0 // indirect
@ -167,6 +175,7 @@ require (
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-enry/go-oniguruma v1.2.1 // indirect
github.com/go-errors/errors v1.1.1 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.6.2 // indirect
@ -176,8 +185,10 @@ require (
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.1 // indirect
github.com/go-webauthn/x v0.1.25 // indirect
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
@ -244,11 +255,12 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/time v0.13.0 // indirect
golang.org/x/tools v0.36.0 // indirect
golang.org/x/tools v0.38.0 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

74
go.sum
View file

@ -28,8 +28,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf
code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ=
code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ=
code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U=
code.forgejo.org/forgejo/runner/v11 v11.1.1 h1:CoSfxBOLKLMJZq5VhKd5ZIUc3tCf04iyFx926s+zaMA=
code.forgejo.org/forgejo/runner/v11 v11.1.1/go.mod h1:9f0D2EG7uabL+cv71SWHKrGgo2vmLpvko0QLmtn3RDE=
code.forgejo.org/forgejo/runner/v11 v11.1.2 h1:jM5YsNmScH11VJEwmvsTUiqGjAqtiUzBhQ65BIo8ZOs=
code.forgejo.org/forgejo/runner/v11 v11.1.2/go.mod h1:9f0D2EG7uabL+cv71SWHKrGgo2vmLpvko0QLmtn3RDE=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY=
@ -46,6 +46,12 @@ code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zC
code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas=
code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
code.superseriousbusiness.org/exif-terminator v0.11.0 h1:Hof0MCcsa+1fS17gf86fTTZ8AQnMY9h9kzcc+2C6mVg=
code.superseriousbusiness.org/exif-terminator v0.11.0/go.mod h1:9sutT1axa/kSdlPLlRFjCNKmyo/KNx8eX3XZvWBlAEY=
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 h1:r9uq8StaSHYKJ8DklR9Xy+E9c40G1Z8yj5TRGi8L6+4=
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0/go.mod h1:IK1OlR6APjVB3E9tuYGvf0qXMrwP+TrzcHS5rf4wffQ=
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 h1:I512jiIeXDC4//2BeSPrRM2ZS4wpBKUaPeTPxakMNGA=
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0/go.mod h1:SNHomXNW88o1pFfLHpD4KsCZLfcr4z5dm+xcX5SV10A=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtfU9vS6QJBg77pUvbEb6StRdZO8t1bEY=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM=
connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
@ -209,6 +215,22 @@ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E=
github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8=
github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b h1:NgNuLvW/gAFKU30ULWW0gtkCt56JfB7FrZ2zyo0wT8I=
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb h1:gwjJjUr6FY7zAWVEueFPrcRHhd9+IK81TcItbqw2du4=
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM=
github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA=
github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg=
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c h1:7j5aWACOzROpr+dvMtu8GnI97g9ShLWD72XIELMgn+c=
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E=
github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8=
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e h1:IxIbA7VbCNrwumIYjDoMOdf4KOSkMC6NJE4s8oRbE7E=
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 h1:XVUp6qW3BIkmM3/1EkrHpa6bL56APOynfXcZEmIgOhs=
@ -258,6 +280,10 @@ github.com/go-enry/go-enry/v2 v2.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6n
github.com/go-enry/go-enry/v2 v2.9.2/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-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg=
github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
@ -291,6 +317,8 @@ github.com/go-webauthn/webauthn v0.14.0 h1:ZLNPUgPcDlAeoxe+5umWG/tEeCoQIDr7gE2Zx
github.com/go-webauthn/webauthn v0.14.0/go.mod h1:QZzPFH3LJ48u5uEPAu+8/nWJImoLBWM7iAH/kSVSo6k=
github.com/go-webauthn/x v0.1.25 h1:g/0noooIGcz/yCVqebcFgNnGIgBlJIccS+LYAa+0Z88=
github.com/go-webauthn/x v0.1.25/go.mod h1:ieblaPY1/BVCV0oQTsA/VAo08/TWayQuJuo5Q+XxmTY=
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
@ -308,6 +336,9 @@ github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9v
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d h1:C/hKUcHT483btRbeGkrRjJz+Zbcj8audldIi9tRJDCc=
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@ -404,6 +435,7 @@ github.com/inbucket/html2text v0.9.0 h1:ULJmVcBEMAcmLE+/rN815KG1Fx6+a4HhbUxiDiN+
github.com/inbucket/html2text v0.9.0/go.mod h1:QDaumzl+/OzlSVbNohhmg+yAy5pKjUjzCKW2BMvztKE=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jhillyerd/enmime/v2 v2.2.0 h1:Pe35MB96eZK5Q0XjlvPftOgWypQpd1gcbfJKAt7rsB8=
github.com/jhillyerd/enmime/v2 v2.2.0/go.mod h1:SOBXlCemjhiV2DvHhAKnJiWrtJGS/Ffuw4Iy7NjBTaI=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@ -669,8 +701,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -706,8 +738,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -722,7 +754,11 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@ -734,8 +770,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -756,8 +792,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -793,8 +829,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@ -804,8 +840,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -819,8 +855,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI=
@ -854,8 +890,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -921,8 +957,10 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View file

@ -25,6 +25,18 @@ import (
"xorm.io/builder"
)
type ConcurrencyMode int
const (
// Don't enforce concurrency control. Note that you won't find `UnlimitedConcurrency` implemented directly in the
// code; setting it on an `ActionRun` prevents the other limiting behaviors.
UnlimitedConcurrency ConcurrencyMode = iota
// Queue behind other jobs with the same concurrency group -- to be supported in Forgejo v14
QueueBehind
// Cancel other jobs with the same concurrency group
CancelInProgress
)
// ActionRun represents a run of a workflow file
type ActionRun struct {
ID int64
@ -56,6 +68,10 @@ type ActionRun struct {
Created timeutil.TimeStamp `xorm:"created"`
Updated timeutil.TimeStamp `xorm:"updated"`
NotifyEmail bool
ConcurrencyType ConcurrencyMode `xorm:"-"` // Forgejo v13 note: this is a persisted field in v14+
PreExecutionError string `xorm:"LONGTEXT"` // used to report errors that blocked execution of a workflow
}
func init() {

View file

@ -25,7 +25,7 @@ import (
// ActionTask represents a distribution of job
type ActionTask struct {
ID int64
JobID int64
JobID int64 `xorm:"index"`
Job *ActionRunJob `xorm:"-"`
Steps []*ActionTaskStep `xorm:"-"`
Attempt int64

View file

@ -111,7 +111,13 @@ func GPGKeyToEntity(ctx context.Context, k *GPGKey) (*openpgp.Entity, error) {
if err != nil {
return nil, err
}
return keys[0], err
for _, key := range keys {
if key.PrimaryKey.KeyIdString() == k.KeyID {
return key, nil
}
}
return nil, fmt.Errorf("key with %s id not found", k.KeyID)
}
// parseSubGPGKey parse a sub Key

View file

@ -74,7 +74,7 @@ func GetEngine(ctx context.Context) Engine {
if e := getEngine(ctx); e != nil {
return e
}
return x.Context(ctx)
return DefaultContext.(Engined).Engine().Context(ctx)
}
// getEngine will get a db Engine from this context or return nil

View file

@ -96,9 +96,15 @@ func init() {
}
}
type xormEngineInterface interface {
xorm.EngineInterface
SetDefaultContext(context.Context)
SetConnMaxIdleTime(time.Duration)
}
// newXORMEngineGroup creates an xorm.EngineGroup (with one master and one or more slaves).
// It assumes you have separate master and slave DSNs defined via the settings package.
func newXORMEngineGroup() (Engine, error) {
func newXORMEngineGroup() (xormEngineInterface, error) {
// Retrieve master DSN from settings.
masterConnStr, err := setting.DBMasterConnStr()
if err != nil {
@ -125,6 +131,9 @@ func newXORMEngineGroup() (Engine, error) {
if err != nil {
return nil, fmt.Errorf("failed to load slave DSNs: %w", err)
}
if len(slaveConnStrs) == 0 {
return masterEngine, nil
}
var slaveEngines []*xorm.Engine
// Iterate over all slave DSNs and create engines
@ -147,16 +156,7 @@ func newXORMEngineGroup() (Engine, error) {
if err != nil {
return nil, fmt.Errorf("failed to create engine group: %w", err)
}
return engineGroupWrapper{group}, nil
}
type engineGroupWrapper struct {
*xorm.EngineGroup
}
func (w engineGroupWrapper) AddHook(hook contexts.Hook) bool {
w.EngineGroup.AddHook(hook)
return true
return group, nil
}
// SyncAllTables sync the schemas of all tables
@ -169,46 +169,40 @@ func SyncAllTables() error {
// InitEngine initializes the xorm EngineGroup and sets it as db.DefaultContext
func InitEngine(ctx context.Context) error {
xormEngine, err := newXORMEngineGroup()
eng, err := newXORMEngineGroup()
if err != nil {
return fmt.Errorf("failed to connect to database: %w", err)
}
// Try to cast to the concrete type to access diagnostic methods
if eng, ok := xormEngine.(engineGroupWrapper); ok {
eng.SetMapper(names.GonicMapper{})
// WARNING: for serv command, MUST remove the output to os.Stdout,
// so use a log file instead of printing to stdout.
eng.SetLogger(NewXORMLogger(setting.Database.LogSQL))
eng.ShowSQL(setting.Database.LogSQL)
eng.SetMaxOpenConns(setting.Database.MaxOpenConns)
eng.SetMaxIdleConns(setting.Database.MaxIdleConns)
eng.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
eng.SetConnMaxIdleTime(setting.Database.ConnMaxIdleTime)
eng.SetDefaultContext(ctx)
eng.SetMapper(names.GonicMapper{})
// WARNING: for serv command, MUST remove the output to os.Stdout,
// so use a log file instead of printing to stdout.
eng.SetLogger(NewXORMLogger(setting.Database.LogSQL))
eng.ShowSQL(setting.Database.LogSQL)
eng.SetMaxOpenConns(setting.Database.MaxOpenConns)
eng.SetMaxIdleConns(setting.Database.MaxIdleConns)
eng.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
eng.SetConnMaxIdleTime(setting.Database.ConnMaxIdleTime)
eng.SetDefaultContext(ctx)
if setting.Database.SlowQueryThreshold > 0 {
eng.AddHook(&SlowQueryHook{
Threshold: setting.Database.SlowQueryThreshold,
Logger: log.GetLogger("xorm"),
})
}
errorLogger := log.GetLogger("xorm")
if setting.IsInTesting {
errorLogger = log.GetLogger(log.DEFAULT)
}
eng.AddHook(&ErrorQueryHook{
Logger: errorLogger,
if setting.Database.SlowQueryThreshold > 0 {
eng.AddHook(&SlowQueryHook{
Threshold: setting.Database.SlowQueryThreshold,
Logger: log.GetLogger("xorm"),
})
eng.AddHook(&TracingHook{})
SetDefaultEngine(ctx, eng)
} else {
// Fallback: if type assertion fails, set default engine without extended diagnostics
SetDefaultEngine(ctx, xormEngine)
}
errorLogger := log.GetLogger("xorm")
if setting.IsInTesting {
errorLogger = log.GetLogger(log.DEFAULT)
}
eng.AddHook(&ErrorQueryHook{
Logger: errorLogger,
})
eng.AddHook(&TracingHook{})
SetDefaultEngine(ctx, eng)
return nil
}
@ -363,8 +357,7 @@ func SetLogSQL(ctx context.Context, on bool) {
if sess, ok := ctxEngine.(*xorm.Session); ok {
sess.Engine().ShowSQL(on)
} else if wrapper, ok := ctxEngine.(engineGroupWrapper); ok {
// Handle engineGroupWrapper directly
} else if wrapper, ok := ctxEngine.(xormEngineInterface); ok {
wrapper.ShowSQL(on)
} else if masterEngine, err := GetMasterEngine(ctxEngine); err == nil {
masterEngine.ShowSQL(on)

View file

@ -5,39 +5,82 @@ package db
import (
"context"
"fmt"
"reflect"
"forgejo.org/modules/setting"
"xorm.io/builder"
)
// Iterate iterate all the Bean object
// Iterate iterate all the Bean object. The table being iterated must have a single-column primary key.
func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx context.Context, bean *Bean) error) error {
var start int
var dummy Bean
batchSize := setting.Database.IterateBufferSize
sess := GetEngine(ctx)
table, err := TableInfo(&dummy)
if err != nil {
return fmt.Errorf("unable to fetch table info for bean %v: %w", dummy, err)
}
if len(table.PrimaryKeys) != 1 {
return fmt.Errorf("iterate only supported on a table with 1 primary key field, but table %s had %d", table.Name, len(table.PrimaryKeys))
}
pkDbName := table.PrimaryKeys[0]
var pkStructFieldName string
for _, c := range table.Columns() {
if c.Name == pkDbName {
pkStructFieldName = c.FieldName
break
}
}
if pkStructFieldName == "" {
return fmt.Errorf("iterate unable to identify struct field for primary key %s", pkDbName)
}
var lastPK any
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
beans := make([]*Bean, 0, batchSize)
sess := GetEngine(ctx)
sess = sess.OrderBy(pkDbName)
if cond != nil {
sess = sess.Where(cond)
}
if err := sess.Limit(batchSize, start).Find(&beans); err != nil {
if lastPK != nil {
sess = sess.Where(builder.Gt{pkDbName: lastPK})
}
if err := sess.Limit(batchSize).Find(&beans); err != nil {
return err
}
if len(beans) == 0 {
return nil
}
start += len(beans)
for _, bean := range beans {
if err := f(ctx, bean); err != nil {
return err
}
}
lastBean := beans[len(beans)-1]
lastPK = extractFieldValue(lastBean, pkStructFieldName)
}
}
}
func extractFieldValue(bean any, fieldName string) any {
v := reflect.ValueOf(bean)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
field := v.FieldByName(fieldName)
return field.Interface()
}

View file

@ -5,42 +5,113 @@ package db_test
import (
"context"
"fmt"
"slices"
"testing"
"forgejo.org/models/db"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
"forgejo.org/modules/setting"
"forgejo.org/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"xorm.io/builder"
)
func TestIterate(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
xe, err := unittest.GetXORMEngine()
require.NoError(t, err)
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
db.SetLogSQL(t.Context(), true)
defer test.MockVariableValue(&setting.Database.IterateBufferSize, 50)()
cnt, err := db.GetEngine(db.DefaultContext).Count(&repo_model.RepoUnit{})
require.NoError(t, err)
t.Run("No Modifications", func(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
xe, err := unittest.GetXORMEngine()
require.NoError(t, err)
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
var repoUnitCnt int
err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
repoUnitCnt++
return nil
// Fetch all the repo unit IDs...
var remainingRepoIDs []int64
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
// Ensure that every repo unit ID is found when doing iterate:
err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
return repo.ID == n
})
return nil
})
require.NoError(t, err)
assert.Empty(t, remainingRepoIDs)
})
require.NoError(t, err)
assert.EqualValues(t, cnt, repoUnitCnt)
err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repoUnit *repo_model.RepoUnit) error {
has, err := db.ExistByID[repo_model.RepoUnit](ctx, repoUnit.ID)
if err != nil {
return err
}
if !has {
return db.ErrNotExist{Resource: "repo_unit", ID: repoUnit.ID}
}
return nil
t.Run("Concurrent Delete", func(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
xe, err := unittest.GetXORMEngine()
require.NoError(t, err)
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
// Fetch all the repo unit IDs...
var remainingRepoIDs []int64
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
// Ensure that every repo unit ID is found, even if someone else performs a DELETE on the table while we're
// iterating. In real-world usage the deleted record may or may not be returned, but the important
// subject-under-test is that no *other* record is skipped.
didDelete := false
err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
// While on page 2 (assuming ID ordering, 50 record buffer size)...
if repo.ID == 51 {
// Delete a record that would have been on page 1.
affected, err := db.GetEngine(t.Context()).ID(25).Delete(&repo_model.RepoUnit{})
if err != nil {
return err
} else if affected != 1 {
return fmt.Errorf("expected to delete 1 record, but affected %d records", affected)
}
didDelete = true
}
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
return repo.ID == n
})
return nil
})
require.NoError(t, err)
assert.True(t, didDelete, "didDelete")
assert.Empty(t, remainingRepoIDs)
})
t.Run("Verify cond applied", func(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
xe, err := unittest.GetXORMEngine()
require.NoError(t, err)
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
// Fetch all the repo unit IDs...
var remainingRepoIDs []int64
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
// Remove those that we're not expecting to find based upon `Iterate`'s condition. We'll trim the front few
// records and last few records, which will confirm that cond is applied on all pages.
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
return n <= 15 || n > 1000
})
err = db.Iterate(t.Context(), builder.Gt{"id": 15}.And(builder.Lt{"id": 1000}), func(ctx context.Context, repo *repo_model.RepoUnit) error {
removedRecord := false
// Remove the record from remainingRepoIDs, but track to make sure we did actually remove a record
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
if repo.ID == n {
removedRecord = true
return true
}
return false
})
if !removedRecord {
return fmt.Errorf("unable to find record in remainingRepoIDs for repo %d, indicating a cond application failure", repo.ID)
}
return nil
})
require.NoError(t, err)
assert.Empty(t, remainingRepoIDs)
})
require.NoError(t, err)
}

View file

@ -0,0 +1,24 @@
-
id: 7
owner_id: 2
key_id: C21381CD63F609EE
primary_key_id:
content: xsBNBGjmzbQBCADPn1Cl1LibN3K7+9A+If/RjDdTfFVbGk7A8pEDpkgzkmbIcMsi+WvPypbnoTJWyc4E5rsj7MYU6NKK3HADFX4rI6h/732xLmK/R+ekeT8wv+XKO1ncTtm/YITC5qRl84xeYfg4DuGGikhCc8xj8ZKWrx5r1ekISidyvNDJrrcHFToqlqGX74w9mRSSQJm1RayX+5nDph7qOpV8ZCpZT2LS00BYkYO62OHl2Ecm+qWiLyyA4iDR4DVSR9qyLzlXdEI2qQXf28zLV4YPaHckNWdRnaqlr/Mlbd+rbZt/49IBDgXPc+EGo6OXYmZls7pyPSCyirz/ObIyM/9t0JIh8rFrABEBAAE=
verified: true
can_sign: true
can_encrypt_comms: true
can_encrypt_storage: true
can_certify: true
emails: "[{\"ID\":8,\"UID\":1,\"Email\":\"user2+signingkey@example.com\",\"LowerEmail\":\"user2+signingkey@example.com\",\"IsActivated\":true,\"IsPrimary\":false}]"
-
id: 8
owner_id: 2
key_id: 9836974DF1195913
primary_key_id: C21381CD63F609EE
content: zsBNBGjmzbQBCADUa4mDg7owJwoBGi85flwoNw/QOvZew2LSZh7++dt+ClKcxryDpkAF4jmPsmKZEjhYfe4QE53E6jlYXRhprISONuR7gYPvvgCrvmEQKoh6o/tOlv0I4Ngix3SkE44u/CpFEVOrmFHBUvjgRHreOhwL3eyUao3PVte4kyAmvzZuGCmFFr7e0D48EGVbSLTGGj/GtHArnWPbs96S6qjXU/4qSvHsmNbGousgbovxXF/AxqIzyjvXheNEEQzUPjainDlOi3Z9BPJXr7T3ytt3slp48teKEXAC/uGVvFICwGN3WRCG8XsVwIQLUE23xclVdVqdzkO4Jr1D+Gtg95fYC2PvABEBAAE=
verified: false
can_sign: true
can_encrypt_comms: true
can_encrypt_storage: true
can_certify: true

View file

@ -0,0 +1,37 @@
-
id: 2001
lower_name: user2001
name: user2001
full_name: "user2001"
email: user2001@example.com
keep_email_private: false
email_notifications_preference: onmention
passwd: ZogKvWdyEx:password
passwd_hash_algo: dummy
must_change_password: true
login_source: 0
login_name: user2001
type: 0
salt: ZogKvWdyEx
max_repo_creation: -1
is_active: true
is_admin: false
is_restricted: false
allow_git_hook: false
allow_import_local: false
allow_create_organization: true
prohibit_login: false
avatar: ""
avatar_email: user2001@example.com
use_custom_avatar: true
num_followers: 0
num_following: 0
num_stars: 0
num_repos: 0
num_teams: 0
num_members: 0
visibility: 0
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
created_unix: 1759086716

View file

@ -46,6 +46,7 @@
email: user2@example.com
keep_email_private: true
keep_pronouns_private: true
pronouns: he/him
email_notifications_preference: enabled
passwd: ZogKvWdyEx:password
passwd_hash_algo: dummy

View file

@ -119,6 +119,9 @@ var migrations = []*Migration{
NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying),
// v39 -> v40
NewMigration("Add index for release sha1", AddIndexForReleaseSha1),
// NOTE: v42 -> v43 -- effectively backported into Forgejo v13 as part of backporting
// https://codeberg.org/forgejo/forgejo/pulls/9530, but the migration was omitted to avoid future upgrade conflicts.
// The migration will effectively occur automatically via table `Sync` on DB engine initialization.
}
// GetCurrentDBVersion returns the current Forgejo database version.
@ -171,19 +174,29 @@ func Migrate(x *xorm.Engine) error {
return fmt.Errorf("sync: %w", err)
}
currentVersion := &ForgejoVersion{ID: 1}
has, err := x.Get(currentVersion)
if err != nil {
return fmt.Errorf("get: %w", err)
} else if !has {
// If the version record does not exist we think
// it is a fresh installation and we can skip all migrations.
currentVersion.ID = 0
currentVersion.Version = ExpectedVersion()
if _, err = x.InsertOne(currentVersion); err != nil {
var versionRecords []*ForgejoVersion
if err := x.Find(&versionRecords); err != nil {
return fmt.Errorf("find: %w", err)
}
if len(versionRecords) == 0 {
// If the version record does not exist we think it is a fresh installation and we can skip all migrations;
// engine init calls `SyncAllTables` which will create the fresh database.
upToDate := &ForgejoVersion{ID: 1, Version: ExpectedVersion()}
if _, err := x.InsertOne(upToDate); err != nil {
return fmt.Errorf("insert: %w", err)
}
// continue with the migration routine, but nothing will be applied; this allows transition into the newer
// forgejo_migration library and for it to be configured and populated.
versionRecords = []*ForgejoVersion{upToDate}
} else if len(versionRecords) > 1 {
return fmt.Errorf(
"corrupt migrations: Forgejo database has unexpected records in the table `forgejo_version`; a single record is expected w/ ID=1, but %d records were found",
len(versionRecords))
}
currentVersion := versionRecords[0]
if currentVersion.ID != 1 {
return fmt.Errorf(
"corrupt migrations: Forgejo database has corrupted records in the table `forgejo_version`; a single record with ID=1 is expected, but a record with ID=%d was found instead", currentVersion.ID)
}
v := currentVersion.Version
@ -202,7 +215,7 @@ func Migrate(x *xorm.Engine) error {
// Some migration tasks depend on the git command
if git.DefaultContext == nil {
if err = git.InitSimple(context.Background()); err != nil {
if err := git.InitSimple(context.Background()); err != nil {
return err
}
}
@ -212,11 +225,11 @@ func Migrate(x *xorm.Engine) error {
log.Info("Migration[%d]: %s", v+int64(i), m.description)
// Reset the mapper between each migration - migrations are not supposed to depend on each other
x.SetMapper(names.GonicMapper{})
if err = m.migrate(x); err != nil {
if err := m.migrate(x); err != nil {
return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.description, err)
}
currentVersion.Version = v + int64(i) + 1
if _, err = x.ID(1).Update(currentVersion); err != nil {
if _, err := x.ID(1).Update(currentVersion); err != nil {
return err
}
}

View file

@ -8,6 +8,7 @@ import (
migration_tests "forgejo.org/models/migrations/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -37,3 +38,38 @@ func TestEnsureUpToDate(t *testing.T) {
err = EnsureUpToDate(x)
require.Error(t, err)
}
func TestMigrateFreshDB(t *testing.T) {
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion))
defer deferable()
require.NotNil(t, x)
err := Migrate(x)
require.NoError(t, err)
var versionRecords []*ForgejoVersion
err = x.Find(&versionRecords)
require.NoError(t, err)
require.Len(t, versionRecords, 1)
v := versionRecords[0]
assert.EqualValues(t, 1, v.ID)
assert.EqualValues(t, 40, v.Version)
}
func TestMigrateFailWithCorruption(t *testing.T) {
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion))
defer deferable()
require.NotNil(t, x)
// ID != 1
_, err := x.InsertOne(&ForgejoVersion{ID: 100, Version: 100})
require.NoError(t, err)
err = Migrate(x)
require.ErrorContains(t, err, "corrupted records in the table `forgejo_version`")
// Two versions...
_, err = x.InsertOne(&ForgejoVersion{ID: 1, Version: 1000})
require.NoError(t, err)
err = Migrate(x)
require.ErrorContains(t, err, "unexpected records in the table `forgejo_version`")
}

View file

@ -4,6 +4,7 @@
package forgejo_migrations
import (
"context"
"encoding/xml"
"fmt"
"regexp"
@ -19,7 +20,6 @@ import (
"forgejo.org/modules/packages/maven"
packages_service "forgejo.org/services/packages"
"golang.org/x/net/context"
"xorm.io/xorm"
)

View file

@ -0,0 +1,14 @@
// Copyright 2023 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package migrations
import (
"testing"
migration_tests "forgejo.org/models/migrations/test"
)
func TestMain(m *testing.M) {
migration_tests.MainTest(m)
}

View file

@ -449,27 +449,38 @@ func Migrate(x *xorm.Engine) error {
}
var previousVersion int64
currentVersion := &Version{ID: 1}
has, err := x.Get(currentVersion)
if err != nil {
return fmt.Errorf("get: %w", err)
} else if !has {
// If the version record does not exist, it is a fresh installation, and we can skip all migrations.
// XORM model framework will create all tables when initializing.
currentVersion.ID = 0
currentVersion.Version = maxDBVer
if _, err = x.InsertOne(currentVersion); err != nil {
var versionRecords []*Version
if err := x.Find(&versionRecords); err != nil {
return fmt.Errorf("find: %w", err)
}
if len(versionRecords) == 0 {
// If the version record does not exist we think it is a fresh installation and we can skip all migrations;
// engine init calls `SyncAllTables` which will create the fresh database.
upToDate := &Version{ID: 1, Version: maxDBVer}
if _, err := x.InsertOne(upToDate); err != nil {
return fmt.Errorf("insert: %w", err)
}
// continue with the migration routine, but nothing will be applied; this allows transition into the newer
// forgejo library and for it to be configured and populated.
versionRecords = []*Version{upToDate}
} else if len(versionRecords) > 1 {
return fmt.Errorf(
"corrupt migrations: Forgejo database has unexpected records in the table `version`; a single record is expected w/ ID=1, but %d records were found",
len(versionRecords))
} else {
previousVersion = currentVersion.Version
previousVersion = versionRecords[0].Version
}
currentVersion := versionRecords[0]
if currentVersion.ID != 1 {
return fmt.Errorf(
"corrupt migrations: Forgejo database has corrupted records in the table `version`; a single record with ID=1 is expected, but a record with ID=%d was found instead", currentVersion.ID)
}
curDBVer := currentVersion.Version
// Outdated Forgejo database version is not supported
if curDBVer < minDBVersion {
log.Fatal(`Forgejo no longer supports auto-migration from your previously installed version.
Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`)
Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`)
return nil
}
@ -486,7 +497,7 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
// Some migration tasks depend on the git command
if git.DefaultContext == nil {
if err = git.InitSimple(context.Background()); err != nil {
if err := git.InitSimple(context.Background()); err != nil {
return err
}
}
@ -500,11 +511,11 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
log.Info("Migration[%d]: %s", m.idNumber, m.description)
// Reset the mapper between each migration - migrations are not supposed to depend on each other
x.SetMapper(names.GonicMapper{})
if err = m.Migrate(x); err != nil {
if err := m.Migrate(x); err != nil {
return fmt.Errorf("migration[%d]: %s failed: %w", m.idNumber, m.description, err)
}
currentVersion.Version = migrationIDNumberToDBVersion(m.idNumber)
if _, err = x.ID(1).Update(currentVersion); err != nil {
if _, err := x.ID(1).Update(currentVersion); err != nil {
return err
}
}

View file

@ -6,9 +6,11 @@ package migrations
import (
"testing"
migration_tests "forgejo.org/models/migrations/test"
"forgejo.org/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMigrations(t *testing.T) {
@ -25,3 +27,38 @@ func TestMigrations(t *testing.T) {
assert.Equal(t, []*migration{{idNumber: 71}}, getPendingMigrations(71, preparedMigrations))
assert.Equal(t, []*migration{}, getPendingMigrations(72, preparedMigrations))
}
func TestMigrateFreshDB(t *testing.T) {
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Version))
defer deferable()
require.NotNil(t, x)
err := Migrate(x)
require.NoError(t, err)
var versionRecords []*Version
err = x.Find(&versionRecords)
require.NoError(t, err)
require.Len(t, versionRecords, 1)
v := versionRecords[0]
assert.EqualValues(t, 1, v.ID)
assert.EqualValues(t, 305, v.Version)
}
func TestMigrateFailWithCorruption(t *testing.T) {
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Version))
defer deferable()
require.NotNil(t, x)
// ID != 1
_, err := x.InsertOne(&Version{ID: 100, Version: 100})
require.NoError(t, err)
err = Migrate(x)
require.ErrorContains(t, err, "corrupted records in the table `version`")
// Two versions...
_, err = x.InsertOne(&Version{ID: 1, Version: 1000})
require.NoError(t, err)
err = Migrate(x)
require.ErrorContains(t, err, "unexpected records in the table `version`")
}

View file

@ -510,6 +510,13 @@ func ChangeOrgUserStatus(ctx context.Context, orgID, uid int64, public bool) err
// AddOrgUser adds new user to given organization.
func AddOrgUser(ctx context.Context, orgID, uid int64) error {
isUser, err := user_model.IsUserByID(ctx, uid)
if err != nil {
return err
} else if !isUser {
return user_model.ErrUserWrongType{UID: uid}
}
isAlreadyMember, err := IsOrganizationMember(ctx, orgID, uid)
if err != nil || isAlreadyMember {
return err

View file

@ -142,6 +142,15 @@ func TestAddOrgUser(t *testing.T) {
org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
assert.Equal(t, expectedNumMembers, org.NumMembers)
}
testFailure := func(orgID, userID int64, isPublic bool) {
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
expectedNumMembers := org.NumMembers
require.ErrorIs(t, organization.AddOrgUser(db.DefaultContext, orgID, userID), user_model.ErrUserWrongType{UID: userID})
ou := &organization.OrgUser{OrgID: orgID, UID: userID}
unittest.AssertNotExistsBean(t, ou)
org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
assert.Equal(t, expectedNumMembers, org.NumMembers)
}
setting.Service.DefaultOrgMemberVisible = false
testSuccess(3, 5, false)
@ -149,7 +158,7 @@ func TestAddOrgUser(t *testing.T) {
testSuccess(6, 2, false)
setting.Service.DefaultOrgMemberVisible = true
testSuccess(6, 3, true)
testFailure(6, 3, true)
unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{})
}

View file

@ -50,6 +50,25 @@ func (err ErrUserNotExist) Unwrap() error {
return util.ErrNotExist
}
// ErrUserWrongType is returned if the user is of the wrong type (i.e. is an org when a user was expected)
type ErrUserWrongType struct {
UID int64
}
func IsErrUserWrongType(err error) bool {
_, ok := err.(ErrUserNotExist)
return ok
}
func (err ErrUserWrongType) Error() string {
return fmt.Sprintf("user is the wrong user type [uid: %d]", err.UID)
}
// Unwrap unwraps this error as a ErrNotExist error
func (err ErrUserWrongType) Unwrap() error {
return util.ErrInvalidArgument
}
// ErrUserProhibitLogin represents a "ErrUserProhibitLogin" kind of error.
type ErrUserProhibitLogin struct {
UID int64

View file

@ -35,3 +35,40 @@
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false
-
id: 1042
lower_name: bot01
name: bot01
full_name: Bot01
email: bot01@example.com
keep_email_private: false
email_notifications_preference: onmention
passwd: ZogKvWdyEx:password
passwd_hash_algo: dummy
must_change_password: false
login_source: 0
login_name: bot01
type: 4
salt: ZogKvWdyEx
max_repo_creation: -1
is_active: true
is_admin: false
is_restricted: false
allow_git_hook: false
allow_import_local: false
allow_create_organization: true
prohibit_login: true
avatar: ""
avatar_email: avatarbot01@example.com
use_custom_avatar: false
num_followers: 0
num_following: 0
num_stars: 0
num_repos: 0
num_teams: 0
num_members: 0
visibility: 0
repo_admin_change_team_access: false
theme: ""
keep_activity_private: false

View file

@ -236,7 +236,7 @@ func GetAllAdmins(ctx context.Context) ([]*User, error) {
// MustHaveTwoFactor returns true if the user is a individual and requires 2fa
func (u *User) MustHaveTwoFactor() bool {
if !u.IsIndividual() || setting.GlobalTwoFactorRequirement.IsNone() {
if u.IsActions() || !u.IsIndividual() || setting.GlobalTwoFactorRequirement.IsNone() {
return false
}
@ -461,6 +461,15 @@ func (u *User) IsUser() bool {
return u.Type == UserTypeIndividual || u.Type == UserTypeBot
}
// Returns true if the given user ID belongs to an actual user, not an organization
func IsUserByID(ctx context.Context, uid int64) (bool, error) {
return db.GetEngine(ctx).
Where("id=?", uid).
In("type", UserTypeIndividual, UserTypeBot).
Table("user").
Exist()
}
// IsBot returns whether or not the user is of type bot
func (u *User) IsBot() bool {
return u.Type == UserTypeBot
@ -1194,7 +1203,9 @@ func ValidateCommitsWithEmails(ctx context.Context, oldCommits []*git.Commit) []
return newCommits
}
// GetUserByEmail returns the user object by given e-mail if exists.
// GetUserByEmail returns the user associated with the email, if it exists
// and is activated. If the email is a no-reply address, then the user
// associated with that no-reply address is returned.
func GetUserByEmail(ctx context.Context, email string) (*User, error) {
if len(email) == 0 {
return nil, ErrUserNotExist{Name: email}
@ -1227,6 +1238,26 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) {
return nil, ErrUserNotExist{Name: email}
}
// GetUserByEmailSimple returns the user associated with the email, if it exists.
//
// NOTE: You likely should use `GetUserByEmail`, which handles the no-reply
// address and only uses activated emails to get the user.
func GetUserByEmailSimple(ctx context.Context, email string) (*User, error) {
if len(email) == 0 {
return nil, ErrUserNotExist{Name: email}
}
emailAddress := &EmailAddress{}
has, err := db.GetEngine(ctx).Where("lower_email = ?", strings.ToLower(email)).Get(emailAddress)
if err != nil {
return nil, err
} else if !has {
return nil, ErrUserNotExist{Name: email}
}
return GetUserByID(ctx, emailAddress.UID)
}
// GetUser checks if a user already exists
func GetUser(ctx context.Context, user *User) (bool, error) {
return db.GetEngine(ctx).Get(user)

View file

@ -645,6 +645,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})
restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
ghostUser := user_model.NewGhostUser()
actionsUser := user_model.NewActionsUser()
t.Run("NoneTwoFactorRequirement", func(t *testing.T) {
// this should be the default, so don't have to set the variable
@ -653,6 +654,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
assert.False(t, restrictedUser.MustHaveTwoFactor())
assert.False(t, org.MustHaveTwoFactor())
assert.False(t, ghostUser.MustHaveTwoFactor())
assert.False(t, actionsUser.MustHaveTwoFactor())
})
t.Run("AllTwoFactorRequirement", func(t *testing.T) {
@ -663,6 +665,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
assert.True(t, restrictedUser.MustHaveTwoFactor())
assert.False(t, org.MustHaveTwoFactor())
assert.True(t, ghostUser.MustHaveTwoFactor())
assert.False(t, actionsUser.MustHaveTwoFactor())
})
t.Run("AdminTwoFactorRequirement", func(t *testing.T) {
@ -673,6 +676,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
assert.False(t, restrictedUser.MustHaveTwoFactor())
assert.False(t, org.MustHaveTwoFactor())
assert.False(t, ghostUser.MustHaveTwoFactor())
assert.False(t, actionsUser.MustHaveTwoFactor())
})
}
@ -696,6 +700,7 @@ func TestIsAccessAllowed(t *testing.T) {
restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
prohibitLoginUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 37})
ghostUser := user_model.NewGhostUser()
actionsUser := user_model.NewActionsUser()
// users with enabled WebAuthn
normalWebAuthnUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 32})
@ -711,6 +716,7 @@ func TestIsAccessAllowed(t *testing.T) {
runTest(t, restrictedUser, false, true)
runTest(t, prohibitLoginUser, false, false)
runTest(t, ghostUser, false, false)
runTest(t, actionsUser, false, true)
})
t.Run("enabled 2fa", func(t *testing.T) {
@ -736,6 +742,7 @@ func TestIsAccessAllowed(t *testing.T) {
runTest(t, restrictedUser, false, false)
runTest(t, prohibitLoginUser, false, false)
runTest(t, ghostUser, false, false)
runTest(t, actionsUser, false, true)
})
t.Run("enabled 2fa", func(t *testing.T) {
@ -761,6 +768,7 @@ func TestIsAccessAllowed(t *testing.T) {
runTest(t, restrictedUser, false, true)
runTest(t, prohibitLoginUser, false, false)
runTest(t, ghostUser, false, false)
runTest(t, actionsUser, false, true)
})
t.Run("enabled 2fa", func(t *testing.T) {
@ -999,6 +1007,7 @@ func TestPronounsPrivacy(t *testing.T) {
func TestGetUserByEmail(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
defer test.MockVariableValue(&setting.Service.NoReplyAddress, "noreply.example.org")()
t.Run("Normal", func(t *testing.T) {
u, err := user_model.GetUserByEmail(t.Context(), "user2@example.com")
@ -1017,4 +1026,50 @@ func TestGetUserByEmail(t *testing.T) {
require.NoError(t, err)
assert.EqualValues(t, 1, u.ID)
})
t.Run("No-reply", func(t *testing.T) {
u, err := user_model.GetUserByEmail(t.Context(), "user1@noreply.example.org")
require.NoError(t, err)
assert.EqualValues(t, 1, u.ID)
})
}
func TestGetUserByEmailSimple(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
defer test.MockVariableValue(&setting.Service.NoReplyAddress, "noreply.example.org")()
t.Run("Normal", func(t *testing.T) {
u, err := user_model.GetUserByEmailSimple(t.Context(), "user2@example.com")
require.NoError(t, err)
assert.EqualValues(t, 2, u.ID)
})
t.Run("Not activated", func(t *testing.T) {
u, err := user_model.GetUserByEmailSimple(t.Context(), "user11@example.com")
require.NoError(t, err)
assert.EqualValues(t, 11, u.ID)
})
t.Run("No-reply", func(t *testing.T) {
u, err := user_model.GetUserByEmailSimple(t.Context(), "user1@noreply.example.org")
require.ErrorIs(t, err, user_model.ErrUserNotExist{Name: "user1@noreply.example.org"})
assert.Nil(t, u)
})
}
func TestIsUserConsistency(t *testing.T) {
defer unittest.OverrideFixtures("models/user/fixtures/")()
require.NoError(t, unittest.PrepareTestDatabase())
test := func(userID int64) {
user, err := user_model.GetUserByID(t.Context(), userID)
require.NoError(t, err)
isUser, err := user_model.IsUserByID(t.Context(), userID)
require.NoError(t, err)
assert.Equal(t, user.IsUser(), isUser)
}
test(1)
test(1041)
test(1042)
}

View file

@ -21,9 +21,10 @@ import (
)
type DetectedWorkflow struct {
EntryName string
TriggerEvent *jobparser.Event
Content []byte
EntryName string
TriggerEvent *jobparser.Event
Content []byte
EventDetectionError error
}
func init() {
@ -127,7 +128,8 @@ func DetectWorkflows(
TriggerEvent: &jobparser.Event{
Name: triggedEvent.Event(),
},
Content: content,
Content: content,
EventDetectionError: err,
}
workflows = append(workflows, dwf)
continue

View file

@ -10,6 +10,7 @@ import (
"image"
"image/color"
"image/png"
"io"
_ "image/gif" // for processing gif images
_ "image/jpeg" // for processing jpeg images
@ -17,6 +18,7 @@ import (
"forgejo.org/modules/avatar/identicon"
"forgejo.org/modules/setting"
exif_terminator "code.superseriousbusiness.org/exif-terminator"
"golang.org/x/image/draw"
_ "golang.org/x/image/webp" // for processing webp images
@ -66,15 +68,29 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
return nil, fmt.Errorf("image height is too large: %d > %d", imgCfg.Height, setting.Avatar.MaxHeight)
}
var cleanedBytes []byte
if imgType != "gif" { // "gif" is the only imgType supported above, but not supported by exif_terminator
cleanedData, err := exif_terminator.Terminate(bytes.NewReader(data), imgType)
if err != nil {
return nil, fmt.Errorf("error cleaning exif data: %w", err)
}
cleanedBytes, err = io.ReadAll(cleanedData)
if err != nil {
return nil, fmt.Errorf("error reading cleaned data: %w", err)
}
} else { // gif
cleanedBytes = data
}
// If the origin is small enough, just use it, then APNG could be supported,
// otherwise, if the image is processed later, APNG loses animation.
// And one more thing, webp is not fully supported, for animated webp, image.DecodeConfig works but Decode fails.
// So for animated webp, if the uploaded file is smaller than maxOriginSize, it will be used, if it's larger, there will be an error.
if len(data) < int(maxOriginSize) {
return data, nil
return cleanedBytes, nil
}
img, _, err := image.Decode(bytes.NewReader(data))
img, _, err := image.Decode(bytes.NewReader(cleanedBytes))
if err != nil {
return nil, fmt.Errorf("image.Decode: %w", err)
}
@ -94,7 +110,7 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
// usually the png compression is not good enough, use the original image (no cropping/resizing) if the origin is smaller
if len(data) <= len(resized) {
return data, nil
return cleanedBytes, nil
}
return resized, nil

View file

@ -11,7 +11,10 @@ import (
"testing"
"forgejo.org/modules/setting"
"forgejo.org/modules/test"
jpegstructure "code.superseriousbusiness.org/go-jpeg-image-structure/v2"
"github.com/dsoprea/go-exif/v3"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -30,8 +33,8 @@ func Test_RandomImage(t *testing.T) {
}
func Test_ProcessAvatarPNG(t *testing.T) {
setting.Avatar.MaxWidth = 4096
setting.Avatar.MaxHeight = 4096
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
data, err := os.ReadFile("testdata/avatar.png")
require.NoError(t, err)
@ -41,8 +44,8 @@ func Test_ProcessAvatarPNG(t *testing.T) {
}
func Test_ProcessAvatarJPEG(t *testing.T) {
setting.Avatar.MaxWidth = 4096
setting.Avatar.MaxHeight = 4096
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
data, err := os.ReadFile("testdata/avatar.jpeg")
require.NoError(t, err)
@ -51,17 +54,28 @@ func Test_ProcessAvatarJPEG(t *testing.T) {
require.NoError(t, err)
}
func Test_ProcessAvatarGIF(t *testing.T) {
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
data, err := os.ReadFile("testdata/avatar.gif")
require.NoError(t, err)
_, err = processAvatarImage(data, 262144)
require.NoError(t, err)
}
func Test_ProcessAvatarInvalidData(t *testing.T) {
setting.Avatar.MaxWidth = 5
setting.Avatar.MaxHeight = 5
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)()
_, err := processAvatarImage([]byte{}, 12800)
assert.EqualError(t, err, "image.DecodeConfig: image: unknown format")
}
func Test_ProcessAvatarInvalidImageSize(t *testing.T) {
setting.Avatar.MaxWidth = 5
setting.Avatar.MaxHeight = 5
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)()
data, err := os.ReadFile("testdata/avatar.png")
require.NoError(t, err)
@ -71,8 +85,8 @@ func Test_ProcessAvatarInvalidImageSize(t *testing.T) {
}
func Test_ProcessAvatarImage(t *testing.T) {
setting.Avatar.MaxWidth = 4096
setting.Avatar.MaxHeight = 4096
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
scaledSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
newImgData := func(size int, optHeight ...int) []byte {
@ -135,3 +149,40 @@ func Test_ProcessAvatarImage(t *testing.T) {
_, err = processAvatarImage(origin, 262144)
require.ErrorContains(t, err, "image width is too large: 10 > 5")
}
func safeExifJpeg(t *testing.T, jpeg []byte) {
t.Helper()
parser := jpegstructure.NewJpegMediaParser()
mediaContext, err := parser.ParseBytes(jpeg)
require.NoError(t, err)
sl := mediaContext.(*jpegstructure.SegmentList)
rootIfd, _, err := sl.Exif()
require.NoError(t, err)
err = rootIfd.EnumerateTagsRecursively(func(ifd *exif.Ifd, ite *exif.IfdTagEntry) error {
assert.Equal(t, "Orientation", ite.TagName(), "only Orientation EXIF tag expected")
return nil
})
require.NoError(t, err)
}
func Test_ProcessAvatarExif(t *testing.T) {
t.Run("greater than max origin size", func(t *testing.T) {
data, err := os.ReadFile("testdata/exif.jpg")
require.NoError(t, err)
processedData, err := processAvatarImage(data, 12800)
require.NoError(t, err)
safeExifJpeg(t, processedData)
})
t.Run("smaller than max origin size", func(t *testing.T) {
data, err := os.ReadFile("testdata/exif.jpg")
require.NoError(t, err)
processedData, err := processAvatarImage(data, 128000)
require.NoError(t, err)
safeExifJpeg(t, processedData)
})
}

BIN
modules/avatar/testdata/avatar.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 B

BIN
modules/avatar/testdata/exif.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -133,7 +133,55 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
return err
}
cmd := NewCommandContextNoGlobals(ctx, args...).AddArguments("clone")
cmd := NewCommandContextNoGlobals(ctx, args...)
envs := os.Environ()
parsedFromURL, err := url.Parse(from)
if err == nil {
envs = proxy.EnvWithProxy(parsedFromURL)
}
fromURL := from
sanitizedFrom := from
// If the clone URL has credentials, build a credential file for usage by git-credential-store
// to prevent credential leak in the process list.
// https://git-scm.com/docs/git-credential-store#_storage_format
// credential.helper adjustment must be set before the git subcommand
if strings.Contains(from, "://") && strings.Contains(from, "@") {
sanitizedFrom = util.SanitizeCredentialURLs(from)
if parsedFromURL != nil {
credentialsFile, err := os.CreateTemp("", "forgejo-clone-credentials-")
if err != nil {
return err
}
credentialsPath := credentialsFile.Name()
defer func() {
_ = credentialsFile.Close()
if err := util.Remove(credentialsPath); err != nil {
log.Warn("Unable to remove temporary file %q: %v", credentialsPath, err)
}
}()
_, err = credentialsFile.Write([]byte(parsedFromURL.String()))
if err != nil {
return err
}
err = credentialsFile.Close()
if err != nil {
return err
}
cmd.AddArguments("-c").AddDynamicArguments("credential.helper=store --file=" + credentialsPath)
// remove the password from the URL argument
parsedFromURL.User = url.User(parsedFromURL.User.Username())
fromURL = parsedFromURL.String()
}
}
cmd.AddArguments("clone")
if opts.SkipTLSVerify {
cmd.AddArguments("-c", "http.sslVerify=false")
}
@ -162,81 +210,6 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
cmd.AddArguments("-b").AddDynamicArguments(opts.Branch)
}
envs := os.Environ()
parsedFromURL, err := url.Parse(from)
if err == nil {
envs = proxy.EnvWithProxy(parsedFromURL)
}
fromURL := from
sanitizedFrom := from
// If the clone URL has credentials, sanitize it and store the credentials in
// a temporary file that git will access.
if strings.Contains(from, "://") && strings.Contains(from, "@") {
sanitizedFrom = util.SanitizeCredentialURLs(from)
if parsedFromURL != nil {
if pwd, has := parsedFromURL.User.Password(); has {
parsedFromURL.User = url.User(parsedFromURL.User.Username())
fromURL = parsedFromURL.String()
credentialsFile, err := os.CreateTemp(os.TempDir(), "forgejo-clone-credentials")
if err != nil {
return err
}
credentialsPath := credentialsFile.Name()
defer func() {
_ = credentialsFile.Close()
if err := util.Remove(credentialsPath); err != nil {
log.Warn("Unable to remove temporary file %q: %v", credentialsPath, err)
}
}()
// Make it read-write.
if err := credentialsFile.Chmod(0o600); err != nil {
return err
}
// Write the password.
if _, err := fmt.Fprint(credentialsFile, pwd); err != nil {
return err
}
askpassFile, err := os.CreateTemp(os.TempDir(), "forgejo-askpass")
if err != nil {
return err
}
askpassPath := askpassFile.Name()
defer func() {
_ = askpassFile.Close()
if err := util.Remove(askpassPath); err != nil {
log.Warn("Unable to remove temporary file %q: %v", askpassPath, err)
}
}()
// Make it executable.
if err := askpassFile.Chmod(0o700); err != nil {
return err
}
// Write the password script.
if _, err := fmt.Fprintf(askpassFile, "exec cat %s", credentialsPath); err != nil {
return err
}
// Close it, so that Git can use it and no busy errors arise.
_ = askpassFile.Close()
_ = credentialsFile.Close()
// Use environments to specify that git should ask for credentials, this
// takes precedences over anything else https://git-scm.com/docs/gitcredentials#_requesting_credentials.
envs = append(envs, "GIT_ASKPASS="+askpassPath)
}
}
}
cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, sanitizedFrom, to, opts.Shared, opts.Mirror, opts.Depth))
cmd.AddDashesAndList(fromURL, to)

View file

@ -7,6 +7,8 @@ import (
"errors"
"fmt"
"regexp"
"strconv"
"strings"
)
var (
@ -17,7 +19,7 @@ var (
)
// LineBlame returns the latest commit at the given line
func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit, error) {
func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit, uint64, error) {
res, _, gitErr := NewCommand(repo.Ctx, "blame").
AddOptionFormat("-L %d,%d", line, line).
AddOptionValues("-p", revision).
@ -26,24 +28,40 @@ func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit,
stdErr := gitErr.Stderr()
if stdErr == fmt.Sprintf("fatal: no such path %s in %s\n", file, revision) {
return nil, ErrBlameFileDoesNotExist
return nil, 0, ErrBlameFileDoesNotExist
}
if notEnoughLinesRe.MatchString(stdErr) {
return nil, ErrBlameFileNotEnoughLines
return nil, 0, ErrBlameFileNotEnoughLines
}
return nil, gitErr
return nil, 0, gitErr
}
objectFormat, err := repo.GetObjectFormat()
if err != nil {
return nil, err
return nil, 0, err
}
objectIDLen := objectFormat.FullLength()
if len(res) < objectIDLen {
return nil, fmt.Errorf("output of blame is invalid, cannot contain commit ID: %s", res)
if len(res) < objectIDLen+1 {
return nil, 0, fmt.Errorf("output of blame is invalid, cannot contain commit ID: %s", res)
}
return repo.GetCommit(res[:objectIDLen])
commit, err := repo.GetCommit(res[:objectIDLen])
if err != nil {
return nil, 0, fmt.Errorf("GetCommit: %w", err)
}
endIdxOriginalLineNo := strings.IndexRune(res[objectIDLen+1:], ' ')
if endIdxOriginalLineNo == -1 {
return nil, 0, fmt.Errorf("output of blame is invalid, cannot contain original line number: %s", res)
}
originalLineNo, err := strconv.ParseUint(res[objectIDLen+1:objectIDLen+1+endIdxOriginalLineNo], 10, 64)
if err != nil {
return nil, 0, fmt.Errorf("strconv.ParseUint: %w", err)
}
return commit, originalLineNo, nil
}

View file

@ -4,6 +4,9 @@
package git
import (
"bytes"
"os"
"path"
"path/filepath"
"testing"
@ -17,17 +20,20 @@ func TestLineBlame(t *testing.T) {
require.NoError(t, err)
defer repo.Close()
commit, err := repo.LineBlame("HEAD", "foo/link_short", 1)
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
require.NoError(t, err)
assert.Equal(t, "37991dec2c8e592043f47155ce4808d4580f9123", commit.ID.String())
assert.EqualValues(t, 1, lineno)
commit, err = repo.LineBlame("HEAD", "foo/link_short", 512)
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
assert.Nil(t, commit)
assert.Zero(t, lineno)
commit, err = repo.LineBlame("HEAD", "non-existent/path", 512)
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
assert.Nil(t, commit)
assert.Zero(t, lineno)
})
t.Run("SHA256", func(t *testing.T) {
@ -37,16 +43,68 @@ func TestLineBlame(t *testing.T) {
require.NoError(t, err)
defer repo.Close()
commit, err := repo.LineBlame("HEAD", "foo/link_short", 1)
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
require.NoError(t, err)
assert.Equal(t, "6aae864a3d1d0d6a5be0cc64028c1e7021e2632b031fd8eb82afc5a283d1c3d1", commit.ID.String())
assert.EqualValues(t, 1, lineno)
commit, err = repo.LineBlame("HEAD", "foo/link_short", 512)
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
assert.Nil(t, commit)
assert.Zero(t, lineno)
commit, err = repo.LineBlame("HEAD", "non-existent/path", 512)
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
assert.Nil(t, commit)
assert.Zero(t, lineno)
})
t.Run("Moved line", func(t *testing.T) {
test := func(t *testing.T, objectFormatName string) {
t.Helper()
tmpDir := t.TempDir()
require.NoError(t, InitRepository(t.Context(), tmpDir, false, objectFormatName))
gitRepo, err := OpenRepository(t.Context(), tmpDir)
require.NoError(t, err)
defer gitRepo.Close()
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), []byte("abba\n"), 0o666))
require.NoError(t, AddChanges(tmpDir, true))
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Favourite singer of everyone who follows a automata course"}))
firstCommit, err := gitRepo.GetRefCommitID("HEAD")
require.NoError(t, err)
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), append(bytes.Repeat([]byte("baba\n"), 9), []byte("abba\n")...), 0o666))
require.NoError(t, AddChanges(tmpDir, true))
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Now there's several of them"}))
secondCommit, err := gitRepo.GetRefCommitID("HEAD")
require.NoError(t, err)
commit, lineno, err := gitRepo.LineBlame("HEAD", "ANSWER", 10)
require.NoError(t, err)
assert.Equal(t, firstCommit, commit.ID.String())
assert.EqualValues(t, 1, lineno)
for i := range uint64(9) {
commit, lineno, err = gitRepo.LineBlame("HEAD", "ANSWER", i+1)
require.NoError(t, err)
assert.Equal(t, secondCommit, commit.ID.String())
assert.Equal(t, i+1, lineno)
}
}
t.Run("SHA1", func(t *testing.T) {
test(t, Sha1ObjectFormat.Name())
})
t.Run("SHA256", func(t *testing.T) {
skipIfSHA256NotSupported(t)
test(t, Sha256ObjectFormat.Name())
})
})
}

View file

@ -65,7 +65,6 @@ func TestRepoGetDivergingCommits(t *testing.T) {
func TestCloneCredentials(t *testing.T) {
calledWithoutPassword := false
askpassFile := ""
credentialsFile := ""
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
@ -87,8 +86,7 @@ func TestCloneCredentials(t *testing.T) {
user, password, ok := bytes.Cut(rawAuth, []byte{':'})
assert.True(t, ok)
// First time around Git tries without password (that's specified in the clone URL).
// It demonstrates it doesn't immediately uses askpass.
// First time around Git must try without password (password was removed from the clone URL to not appear as argument).
if len(password) == 0 {
assert.EqualValues(t, "oauth2", user)
calledWithoutPassword = true
@ -103,22 +101,15 @@ func TestCloneCredentials(t *testing.T) {
tmpDir := os.TempDir()
// Verify that the askpass implementation was used.
files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-askpass*")
// Verify that the credential store was used.
files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-clone-credentials-*")
require.NoError(t, err)
for _, fileName := range files {
fileContent, err := os.ReadFile(filepath.Join(tmpDir, fileName))
credentialsFile = filepath.Join(tmpDir, fileName)
fileContent, err := os.ReadFile(credentialsFile)
require.NoError(t, err)
credentialsPath, ok := bytes.CutPrefix(fileContent, []byte(`exec cat `))
assert.True(t, ok)
fileContent, err = os.ReadFile(string(credentialsPath))
require.NoError(t, err)
assert.EqualValues(t, "some_token", fileContent)
askpassFile = filepath.Join(tmpDir, fileName)
credentialsFile = string(credentialsPath)
assert.True(t, bytes.Contains(fileContent, []byte(`http`)), string(fileContent))
}
}))
@ -130,12 +121,9 @@ func TestCloneCredentials(t *testing.T) {
require.NoError(t, Clone(t.Context(), serverURL.String(), t.TempDir(), CloneRepoOptions{}))
assert.True(t, calledWithoutPassword)
assert.NotEmpty(t, askpassFile)
assert.NotEmpty(t, credentialsFile)
// Check that the helper files are gone.
_, err = os.Stat(askpassFile)
require.ErrorIs(t, err, fs.ErrNotExist)
// Check that the credential file is gone.
_, err = os.Stat(credentialsFile)
require.ErrorIs(t, err, fs.ErrNotExist)
}

View file

@ -29,12 +29,12 @@ func TestParseGitURLs(t *testing.T) {
},
},
{
kase: "git@[fe80:14fc:cec5:c174:d88%2510]:go-gitea/gitea.git",
kase: "git@[fe80::14fc:cec5:c174:d88%2510]:go-gitea/gitea.git",
expected: &GitURL{
URL: &url.URL{
Scheme: "ssh",
User: url.User("git"),
Host: "[fe80:14fc:cec5:c174:d88%10]",
Host: "[fe80::14fc:cec5:c174:d88%10]",
Path: "go-gitea/gitea.git",
},
extraMark: 1,
@ -132,11 +132,11 @@ func TestParseGitURLs(t *testing.T) {
},
},
{
kase: "https://[fe80:14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git",
kase: "https://[fe80::14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git",
expected: &GitURL{
URL: &url.URL{
Scheme: "https",
Host: "[fe80:14fc:cec5:c174:d88%10]:20",
Host: "[fe80::14fc:cec5:c174:d88%10]:20",
Path: "/go-gitea/gitea.git",
},
extraMark: 0,

View file

@ -21,6 +21,7 @@ import (
"forgejo.org/modules/process"
"forgejo.org/modules/queue"
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
)
var (
@ -171,12 +172,12 @@ func Init() {
log.Fatal("PID: %d Unable to initialize the bleve Repository Indexer at path: %s Error: %v", os.Getpid(), setting.Indexer.RepoPath, err)
}
case "elasticsearch":
log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), setting.Indexer.RepoConnStr)
log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr))
defer func() {
if err := recover(); err != nil {
log.Error("PANIC whilst initializing repository indexer: %v\nStacktrace: %s", err, log.Stack(2))
log.Error("The indexer files are likely corrupted and may need to be deleted")
log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", setting.Indexer.RepoConnStr)
log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr))
}
}()
@ -186,7 +187,7 @@ func Init() {
cancel()
(*globalIndexer.Load()).Close()
close(waitChannel)
log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), setting.Indexer.RepoConnStr, err)
log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr), err)
}
default:

View file

@ -25,6 +25,7 @@ import (
"forgejo.org/modules/process"
"forgejo.org/modules/queue"
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
)
// IndexerMetadata is used to send data to the queue, so it contains only the ids.
@ -100,7 +101,7 @@ func InitIssueIndexer(syncReindex bool) {
issueIndexer = elasticsearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueIndexerName)
existed, err = issueIndexer.Init(ctx)
if err != nil {
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err)
}
case "db":
issueIndexer = db.NewIndexer()
@ -108,7 +109,7 @@ func InitIssueIndexer(syncReindex bool) {
issueIndexer = meilisearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueConnAuth, setting.Indexer.IssueIndexerName)
existed, err = issueIndexer.Init(ctx)
if err != nil {
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err)
}
default:
log.Fatal("Unknown issue indexer type: %s", setting.Indexer.IssueType)

View file

@ -55,10 +55,13 @@ var (
shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`)
// anyHashPattern splits url containing SHA into parts
anyHashPattern = regexp.MustCompile(`https?://(?:(?:\S+/){3,4}(?:commit|tree|blob)/)([0-9a-f]{7,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
anyHashPattern = regexp.MustCompile(`https?://[^\s/]+/(\S+/(?:commit|tree|blob))/([0-9a-f]{7,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
// comparePattern matches "http://domain/org/repo/compare/COMMIT1...COMMIT2#hash"
comparePattern = regexp.MustCompile(`https?://(?:\S+/){4,5}([0-9a-f]{7,64})(\.\.\.?)([0-9a-f]{7,64})?(#[-+~_%.a-zA-Z0-9]+)?`)
comparePattern = regexp.MustCompile(`https?://[^\s/]+/(?:\S+/)?([^\s/]+/[^\s/]+)/compare/([0-9a-f]{7,64})(\.\.\.?)([0-9a-f]{7,64})?(\?[-+~_%\.a-zA-Z0-9=&/]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
// pullReviewCommitPattern matches "https://domain.tld/<subpath...>/<owner>/<repo>/pulls/<id>/commits/<sha>"
pullReviewCommitPattern = regexp.MustCompile(`https?://[^\s/]+/(?:\S+/)?([^\s/]+/[^\s/]+)/pulls/(\d+)/commits/([0-9a-f]{7,64})(#[-+~_%.a-zA-Z0-9]+)?`)
validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`)
@ -147,6 +150,7 @@ func (p *postProcessError) Error() string {
type processor func(ctx *RenderContext, node *html.Node)
var defaultProcessors = []processor{
pullReviewCommitPatternProcessor,
fullIssuePatternProcessor,
comparePatternProcessor,
filePreviewPatternProcessor,
@ -177,6 +181,7 @@ func PostProcess(
}
var commitMessageProcessors = []processor{
pullReviewCommitPatternProcessor,
fullIssuePatternProcessor,
comparePatternProcessor,
fullHashPatternProcessor,
@ -209,6 +214,7 @@ func RenderCommitMessage(
}
var commitMessageSubjectProcessors = []processor{
pullReviewCommitPatternProcessor,
fullIssuePatternProcessor,
comparePatternProcessor,
fullHashPatternProcessor,
@ -796,6 +802,64 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) {
}
}
// pullReviewCommitPatternProcessor creates links to pull review commits.
func pullReviewCommitPatternProcessor(ctx *RenderContext, node *html.Node) {
next := node.NextSibling
for node != nil && node != next {
m := pullReviewCommitPattern.FindStringSubmatchIndex(node.Data)
if m == nil {
return
}
urlFull := node.Data[m[0]:m[1]]
repoSlug := node.Data[m[2]:m[3]]
id := node.Data[m[4]:m[5]]
sha := base.ShortSha(node.Data[m[6]:m[7]])
// Create an `<a>` node with a text of
// `!123 (commit <code>abcdef1234</code>)`
aNode := &html.Node{
Type: html.ElementNode,
Data: atom.A.String(),
Attr: []html.Attribute{{Key: "href", Val: urlFull}, {Key: "class", Val: "commit"}},
}
text := "!" + id + " (commit "
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
text = repoSlug + "@" + text
}
aNode.AppendChild(&html.Node{
Type: html.TextNode,
Data: text,
})
textNode := &html.Node{
Type: html.TextNode,
Data: sha,
}
codeNode := &html.Node{
Type: html.ElementNode,
Data: atom.Code.String(),
Attr: []html.Attribute{{Key: "class", Val: "nohighlight"}},
}
codeNode.AppendChild(textNode)
aNode.AppendChild(codeNode)
aNode.AppendChild(&html.Node{
Type: html.TextNode,
Data: ")",
})
replaceContent(node, m[0], m[1], aNode)
node = node.NextSibling.NextSibling
}
}
func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) {
if ctx.Metas == nil {
return
@ -952,7 +1016,7 @@ func commitCrossReferencePatternProcessor(ctx *RenderContext, node *html.Node) {
}
}
// fullHashPatternProcessor renders SHA containing URLs
// fullHashPatternProcessor renders URLs that contain a SHA
func fullHashPatternProcessor(ctx *RenderContext, node *html.Node) {
if ctx.Metas == nil {
return
@ -966,37 +1030,103 @@ func fullHashPatternProcessor(ctx *RenderContext, node *html.Node) {
}
urlFull := node.Data[m[0]:m[1]]
text := base.ShortSha(node.Data[m[2]:m[3]])
// 3rd capture group matches a optional path
subpath := ""
if m[5] > 0 {
subpath = node.Data[m[4]:m[5]]
// In most cases, the URL will look like this:
// `https://domain.tld/<owner>/<repo>/<path>/<sha>`.
// The amount of components in `<path>` is variable, but that alone is doable with regexp.
//
// However, Forgejo also allows being hosted on a sub path, i.e.
// `https://domain.tld/<sub>/<owner>/<repo>/<path>/<sha>`.
// And this sub path can also have any amount of components. But fishing out a section
// between two variable length matches is not something regular grammars are capable of.
//
// Instead, the regexp extracts the entire path section before the SHA
// (i.e. `<sub>/<owner>/<repo>/<path>`), and we find the components we need by counting.
// `<sub>` is unknown, but the possible values for `<path>` are defined by us
// (see `router/web/web.go`). So we count from the back.
subPath := node.Data[m[2]:m[3]]
components := strings.Split(subPath, "/")
componentCount := len(components)
// In most cases, the `<owner>` component is right at the start of the path.
ownerIndex := 0
// But if there are more than three components, this could be `<sub>` or an app route
// with two components. Or both.
if componentCount > 3 {
// As mentioned, we count from the back. We decrement for the `<repo>` component, and the one
// component from the app route that's guaranteed to be there.
// We also adjust this to be an array index, so we subtract one more.
ownerIndex = componentCount - 3
// We then check for known app routes that use two components.
// Currently, this checks for:
// - `src/commit`
// - `commits/commit`
//
// This does have one scenario where we cannot figure things out reliably:
// If there is a sub path, and the repository is named like one of the known app routes
// (e.g. `src`), we cannot distinguish between the repo and the app route.
// We assume that naming a repository like that is uncommon, and prioritize the case where its
// part of the app route.
if components[componentCount-1] == "commit" &&
(components[componentCount-2] == "src" || components[componentCount-2] == "commits") {
ownerIndex--
}
}
repoSlug := components[ownerIndex] + "/" + components[ownerIndex+1]
text := base.ShortSha(node.Data[m[4]:m[5]])
// We need to figure out the base of the provided URL, which is up to and including the
// `<owner>/<repo>` slug.
// With that we can determine if it matches the current repo, or if the slug should be shown.
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
text = repoSlug + "@" + text
}
// 3rd capture group matches an optional file path after the SHA
filePath := ""
if m[7] > 0 {
filePath = node.Data[m[6]:m[7]]
}
// 5th capture group matches a optional url hash
hash := ""
if m[9] > 0 {
hash = node.Data[m[8]:m[9]][1:]
if m[11] > 0 {
hash = node.Data[m[10]:m[11]][1:]
// Truncate long diff IDs
if len(hash) > 15 && strings.HasPrefix(hash, "diff-") {
hash = hash[:15]
}
}
start := m[0]
end := m[1]
// If url ends in '.', it's very likely that it is not part of the
// actual url but used to finish a sentence.
// If the URL ends in '.', it's very likely that it is not part of the
// actual URL but used to finish a sentence.
if strings.HasSuffix(urlFull, ".") {
end--
urlFull = urlFull[:len(urlFull)-1]
if hash != "" {
hash = hash[:len(hash)-1]
} else if subpath != "" {
subpath = subpath[:len(subpath)-1]
} else if filePath != "" {
filePath = filePath[:len(filePath)-1]
}
}
if subpath != "" {
text += subpath
if filePath != "" {
decoded, err := url.QueryUnescape(filePath)
if err != nil {
text += decoded
} else {
text += filePath
}
}
if hash != "" {
@ -1019,41 +1149,71 @@ func comparePatternProcessor(ctx *RenderContext, node *html.Node) {
return
}
// Ensure that every group (m[0]...m[7]) has a match
for i := 0; i < 8; i++ {
// Ensure that every group (m[0]...m[9]) has a match
for i := 0; i < 10; i++ {
if m[i] == -1 {
return
}
}
urlFull := node.Data[m[0]:m[1]]
text1 := base.ShortSha(node.Data[m[2]:m[3]])
textDots := base.ShortSha(node.Data[m[4]:m[5]])
text2 := base.ShortSha(node.Data[m[6]:m[7]])
repoSlug := node.Data[m[2]:m[3]]
text1 := base.ShortSha(node.Data[m[4]:m[5]])
textDots := base.ShortSha(node.Data[m[6]:m[7]])
text2 := base.ShortSha(node.Data[m[8]:m[9]])
query := ""
if m[11] > 0 {
query = node.Data[m[10]:m[11]][1:]
}
hash := ""
if m[9] > 0 {
hash = node.Data[m[8]:m[9]][1:]
if m[13] > 0 {
hash = node.Data[m[12]:m[13]][1:]
}
start := m[0]
end := m[1]
// If url ends in '.', it's very likely that it is not part of the
// actual url but used to finish a sentence.
// If the URL ends in '.', it's very likely that it is not part of the
// actual URL but used to finish a sentence.
if strings.HasSuffix(urlFull, ".") {
end--
urlFull = urlFull[:len(urlFull)-1]
if hash != "" {
hash = hash[:len(hash)-1]
} else if query != "" {
query = query[:len(query)-1]
} else if text2 != "" {
text2 = text2[:len(text2)-1]
}
}
text := text1 + textDots + text2
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
text = repoSlug + "@" + text
}
extra := ""
if query != "" {
query, err := url.ParseQuery(query)
if err == nil && query.Has("files") {
extra = query.Get("files")
}
}
if hash != "" {
text += " (" + hash + ")"
if extra != "" {
extra += "#"
}
extra += hash
}
if extra != "" {
text += " (" + extra + ")"
}
replaceContent(node, start, end, createCodeLink(urlFull, text, "compare"))
node = node.NextSibling.NextSibling
@ -1094,7 +1254,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
// Specialized version of replaceContent, so the parent paragraph element is not destroyed from our div
before := node.Data[:(preview.start - offset)]
after := node.Data[(preview.end - offset):]
afterNode := &html.Node{
afterTextNode := &html.Node{
Type: html.TextNode,
Data: after,
}
@ -1103,22 +1263,20 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
case "div", "li", "td", "th", "details":
nextSibling := node.NextSibling
node.Parent.InsertBefore(previewNode, nextSibling)
node.Parent.InsertBefore(afterNode, nextSibling)
node.Parent.InsertBefore(afterTextNode, nextSibling)
case "p", "span", "em", "strong":
nextSibling := node.Parent.NextSibling
node.Parent.Parent.InsertBefore(previewNode, nextSibling)
afterPNode := &html.Node{
nextParentSibling := node.Parent.NextSibling
node.Parent.Parent.InsertBefore(previewNode, nextParentSibling)
afterNode := &html.Node{
Type: html.ElementNode,
Data: node.Parent.Data,
Attr: node.Parent.Attr,
}
afterPNode.AppendChild(afterNode)
node.Parent.Parent.InsertBefore(afterPNode, nextSibling)
siblingNode := node.NextSibling
if siblingNode != nil {
node.NextSibling = nil
siblingNode.PrevSibling = nil
afterPNode.AppendChild(siblingNode)
afterNode.AppendChild(afterTextNode)
node.Parent.Parent.InsertBefore(afterNode, nextParentSibling)
for sibling := node.NextSibling; sibling != nil; sibling = node.NextSibling {
sibling.Parent.RemoveChild(sibling)
afterNode.AppendChild(sibling)
}
default:
matched = false
@ -1126,7 +1284,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
if matched {
offset = preview.end
node.Data = before
node = afterNode
node = afterTextNode
}
}
node = node.NextSibling

View file

@ -303,12 +303,12 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, ctx *Rend
func TestRender_AutoLink(t *testing.T) {
setting.AppURL = TestAppURL
test := func(input, expected string) {
test := func(input, expected, base string) {
var buffer strings.Builder
err := PostProcess(&RenderContext{
Ctx: git.DefaultContext,
Links: Links{
Base: TestRepoURL,
Base: base,
},
Metas: localMetas,
}, strings.NewReader(input), &buffer)
@ -319,7 +319,7 @@ func TestRender_AutoLink(t *testing.T) {
err = PostProcess(&RenderContext{
Ctx: git.DefaultContext,
Links: Links{
Base: TestRepoURL,
Base: base,
},
Metas: localMetas,
IsWiki: true,
@ -328,19 +328,87 @@ func TestRender_AutoLink(t *testing.T) {
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer.String()))
}
// render valid issue URLs
test(util.URLJoin(TestRepoURL, "issues", "3333"),
numericIssueLink(util.URLJoin(TestRepoURL, "issues"), "ref-issue", 3333, "#"))
t.Run("Issue", func(t *testing.T) {
// render valid issue URLs
test(util.URLJoin(TestRepoURL, "issues", "3333"),
numericIssueLink(util.URLJoin(TestRepoURL, "issues"), "ref-issue", 3333, "#"),
TestRepoURL)
})
// render valid commit URLs
tmp := util.URLJoin(TestRepoURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24</code></a>")
tmp += "#diff-2"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>")
t.Run("Commit", func(t *testing.T) {
// render valid commit URLs
tmp := util.URLJoin(TestRepoURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24</code></a>", TestRepoURL)
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">"+TestOrgRepo+"@d8a994ef24</code></a>", "https://localhost/forgejo/forgejo")
test(
tmp+"#diff-2",
"<a href=\""+tmp+"#diff-2\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>",
TestRepoURL,
)
test(
tmp+"#diff-953bb4f01b7c77fa18f0cd54211255051e647dbc",
"<a href=\""+tmp+"#diff-953bb4f01b7c77fa18f0cd54211255051e647dbc\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-953bb4f01b)</code></a>",
TestRepoURL,
)
// render other commit URLs
tmp = "https://external-link.gitea.io/go-gitea/gitea/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>")
// render other commit URLs
tmp = "https://external-link.gitea.io/go-gitea/gitea/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">go-gitea/gitea@d8a994ef24 (diff-2)</code></a>", TestRepoURL)
tmp = "http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
tmp = "http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/sub/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "http://localhost:3000/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "http://localhost:3000/sub1/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
// if the repository happens to be named like one of the known app routes (e.g. `src`),
// we can parse the URL correctly, if there is no sub path
tmp = "http://localhost:3000/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/src@190d949293</code></a>", TestRepoURL)
tmp = "http://localhost:3000/gogits/src/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/src@190d949293</code></a>", TestRepoURL)
// but if there is a sub path, we cannot reliably distinguish the repo name from the app route
tmp = "http://localhost:3000/sub/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">sub/gogits@190d949293</code></a>", TestRepoURL)
})
t.Run("Compare", func(t *testing.T) {
tmp := util.URLJoin(TestRepoURL, "compare", "d8a994ef243349f321568f9e36d5c3f444b99cae..190d9492934af498c3f669d6a2431dc5459e5b20")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">d8a994ef24..190d949293</code></a>", TestRepoURL)
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">"+TestOrgRepo+"@d8a994ef24..190d949293</code></a>", "https://localhost/forgejo/forgejo")
tmp = "http://localhost:3000/sub/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae"
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "http://localhost:3000/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae"
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub1/gogits/gogs")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini"
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>", "https://codeberg.org/forgejo/forgejo")
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>", TestRepoURL)
test(tmp+".", "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>.", TestRepoURL)
tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini#L2"
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini#L2)</code></a>", "https://codeberg.org/forgejo/forgejo")
})
t.Run("Invalid URLs", func(t *testing.T) {
tmp := "https://local host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
test(tmp, "<a href=\"https://local\" class=\"link\">https://local</a> host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20", TestRepoURL)
})
}
func TestRender_IssueIndexPatternRef(t *testing.T) {
@ -429,45 +497,79 @@ func TestRegExp_hashCurrentPattern(t *testing.T) {
func TestRegExp_anySHA1Pattern(t *testing.T) {
testCases := map[string][]string{
"https://github.com/jquery/jquery/blob/a644101ed04d0beacea864ce805e0c4f86ba1cd1/test/unit/event.js#L2703": {
"jquery/jquery/blob",
"a644101ed04d0beacea864ce805e0c4f86ba1cd1",
"/test/unit/event.js",
"",
"#L2703",
},
"https://github.com/jquery/jquery/blob/a644101ed04d0beacea864ce805e0c4f86ba1cd1/test/unit/event.js": {
"jquery/jquery/blob",
"a644101ed04d0beacea864ce805e0c4f86ba1cd1",
"/test/unit/event.js",
"",
"",
},
"https://github.com/jquery/jquery/commit/0705be475092aede1eddae01319ec931fb9c65fc": {
"jquery/jquery/commit",
"0705be475092aede1eddae01319ec931fb9c65fc",
"",
"",
"",
},
"https://github.com/jquery/jquery/tree/0705be475092aede1eddae01319ec931fb9c65fc/src": {
"jquery/jquery/tree",
"0705be475092aede1eddae01319ec931fb9c65fc",
"/src",
"",
"",
},
"https://try.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2": {
"gogs/gogs/commit",
"d8a994ef243349f321568f9e36d5c3f444b99cae",
"",
"",
"#diff-2",
},
"https://codeberg.org/forgejo/forgejo/src/commit/949ab9a5c4cac742f84ae5a9fa186f8d6eb2cdc0/RELEASE-NOTES.md?display=source&w=1#L7-L9": {
"forgejo/forgejo/src/commit",
"949ab9a5c4cac742f84ae5a9fa186f8d6eb2cdc0",
"/RELEASE-NOTES.md",
"?display=source&w=1",
"#L7-L9",
},
"http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
"gogits/gogs/src/commit",
"190d9492934af498c3f669d6a2431dc5459e5b20",
"/path/to/file.go",
"",
"#L2-L3",
},
"http://localhost:3000/sub/gogits/gogs/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
"sub/gogits/gogs/commit",
"190d9492934af498c3f669d6a2431dc5459e5b20",
"/path/to/file.go",
"",
"#L2-L3",
},
"http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
"sub/gogits/gogs/src/commit",
"190d9492934af498c3f669d6a2431dc5459e5b20",
"/path/to/file.go",
"",
"#L2-L3",
},
"http://localhost:3000/sub1/sub2/sub3/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
"sub1/sub2/sub3/gogits/gogs/src/commit",
"190d9492934af498c3f669d6a2431dc5459e5b20",
"/path/to/file.go",
"",
"#L2-L3",
},
}
for k, v := range testCases {
assert.Equal(t, anyHashPattern.FindStringSubmatch(k)[1:], v)
assert.Equal(t, v, anyHashPattern.FindStringSubmatch(k)[1:])
}
for _, v := range []string{"https://codeberg.org/forgejo/forgejo/attachments/774421a1-b0ae-4501-8fba-983874b76811"} {

View file

@ -241,6 +241,45 @@ func TestRender_links(t *testing.T) {
markup.CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes)
}
func TestRender_PullReviewCommitLink(t *testing.T) {
setting.AppURL = markup.TestAppURL
sha := "190d9492934af498c3f669d6a2431dc5459e5b20"
prCommitLink := util.URLJoin(markup.TestRepoURL, "pulls", "1", "commits", sha)
test := func(input, expected, base string) {
buffer, err := markup.RenderString(&markup.RenderContext{
Ctx: git.DefaultContext,
RelativePath: ".md",
Links: markup.Links{
AbsolutePrefix: true,
Base: base,
},
Metas: localMetas,
}, input)
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`, markup.TestRepoURL)
prCommitLink = util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo, "pulls", "1", "commits", sha)
test(
prCommitLink,
`<p><a href="`+prCommitLink+`" rel="nofollow">!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`,
util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo),
)
test(
prCommitLink,
`<p><a href="`+prCommitLink+`" rel="nofollow">`+markup.TestOrgRepo+`@!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`,
markup.TestRepoURL,
)
prCommitLink = "https://codeberg.org/forgejo/forgejo/pulls/7979/commits/4d968c08e0a8d24bd2f3fb2a3a48b37e6d84a327#diff-7649acfa98a9ee3faf0d28b488bbff428317fc72"
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">!7979 (commit <code>4d968c08e0</code>)</a></p>`, "https://codeberg.org/forgejo/forgejo")
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">forgejo/forgejo@!7979 (commit <code>4d968c08e0</code>)</a></p>`, markup.TestRepoURL)
}
func TestRender_email(t *testing.T) {
setting.AppURL = markup.TestAppURL
@ -686,6 +725,9 @@ func TestIssue18471(t *testing.T) {
err := markup.PostProcess(&markup.RenderContext{
Ctx: git.DefaultContext,
Metas: localMetas,
Links: markup.Links{
Base: "http://domain/org/repo",
},
}, strings.NewReader(data), &res)
require.NoError(t, err)
@ -723,6 +765,9 @@ func TestRender_FilePreview(t *testing.T) {
Ctx: git.DefaultContext,
RelativePath: ".md",
Metas: metas,
Links: markup.Links{
Base: markup.TestRepoURL,
},
}, input)
require.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
@ -835,7 +880,7 @@ func TestRender_FilePreview(t *testing.T) {
testRender(
urlWithSub,
`<p><a href="http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3" rel="nofollow"><code>190d949293/path/to/file.go (L2-L3)</code></a></p>`,
`<p><a href="http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3" rel="nofollow"><code>gogits/gogs@190d949293/path/to/file.go (L2-L3)</code></a></p>`,
localMetas,
)
@ -1253,4 +1298,20 @@ func TestRender_FilePreview(t *testing.T) {
localMetas,
)
})
t.Run("file previews followed by new line", func(t *testing.T) {
testRender(
commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine,
"<p></p>"+filePreviewBox+"<p><br/>\nand<br/>\n</p>"+filePreviewBox+"<p></p>",
localMetas,
)
})
t.Run("file previews followed by new line in div", func(t *testing.T) {
testRender(
"<div>"+commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine+"</div>",
"<div>"+filePreviewBox+"\nand\n"+filePreviewBox+"</div>",
localMetas,
)
})
}

View file

@ -17,6 +17,7 @@ import (
"forgejo.org/modules/git"
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
"forgejo.org/modules/util/donotpanic"
"github.com/yuin/goldmark/ast"
)
@ -267,6 +268,15 @@ sandbox="allow-scripts"
return err
}
func postProcessOrCopy(ctx *RenderContext, renderer Renderer, reader io.Reader, writer io.Writer) (err error) {
if r, ok := renderer.(PostProcessRenderer); ok && r.NeedPostProcess() {
err = PostProcess(ctx, reader, writer)
} else {
_, err = io.Copy(writer, reader)
}
return err
}
func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Writer) error {
var wg sync.WaitGroup
var err error
@ -293,7 +303,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
wg.Add(1)
go func() {
err = SanitizeReader(pr2, renderer.Name(), output)
err = donotpanic.SafeFuncWithError(func() error { return SanitizeReader(pr2, renderer.Name(), output) })
_ = pr2.Close()
wg.Done()
}()
@ -303,11 +313,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
wg.Add(1)
go func() {
if r, ok := renderer.(PostProcessRenderer); ok && r.NeedPostProcess() {
err = PostProcess(ctx, pr, pw2)
} else {
_, err = io.Copy(pw2, pr)
}
err = donotpanic.SafeFuncWithError(func() error { return postProcessOrCopy(ctx, renderer, pr, pw2) })
_ = pr.Close()
_ = pw2.Close()
wg.Done()
@ -320,7 +326,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
if r, ok := renderer.(ExternalRenderer); ok && r.DisplayInIFrame() {
// Append a short script to the iframe's contents, which will communicate the scroll height of the embedded document via postMessage, either once loaded (in case the containing page loads first) in response to a postMessage from external.js, in case the iframe loads first
// We use '*' as a target origin for postMessage, because can be certain we are embedded on the same domain, due to X-Frame-Options configured elsewhere. (Plus, the offsetHeight of an embedded document is likely not sensitive data anyway.)
_, _ = pw.Write([]byte("<script>{let postHeight = () => {window.parent.postMessage({frameHeight: document.documentElement.offsetHeight}, '*')}; window.addEventListener('load', postHeight); window.addEventListener('message', (event) => {if (event.source === window.parent && event.data.requestOffsetHeight) postHeight()});}</script>"))
_, _ = pw.Write([]byte("<script>{let postHeight = () => {window.parent.postMessage({frameHeight: document.documentElement.offsetHeight || document.documentElement.scrollHeight}, '*')}; window.addEventListener('load', postHeight); window.addEventListener('message', (event) => {if (event.source === window.parent && event.data.requestOffsetHeight) postHeight()});}</script>"))
}
_ = pw.Close()

View file

@ -1,4 +1,49 @@
// Copyright 2017 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package markup_test
package markup
import (
"bytes"
"errors"
"strings"
"testing"
"forgejo.org/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type failReader struct{}
func (*failReader) Read(p []byte) (n int, err error) {
return 0, errors.New("FAIL")
}
func TestRender_postProcessOrCopy(t *testing.T) {
renderContext := &RenderContext{Ctx: t.Context()}
t.Run("CopyOK", func(t *testing.T) {
input := "SOMETHING"
output := &bytes.Buffer{}
require.NoError(t, postProcessOrCopy(renderContext, nil, strings.NewReader(input), output))
assert.Equal(t, input, output.String())
})
renderer := GetRendererByType("markdown")
t.Run("PostProcessOK", func(t *testing.T) {
input := "SOMETHING"
output := &bytes.Buffer{}
defer test.MockVariableValue(&defaultProcessors, []processor{})()
require.NoError(t, postProcessOrCopy(renderContext, renderer, strings.NewReader(input), output))
assert.Equal(t, input, output.String())
})
t.Run("PostProcessError", func(t *testing.T) {
input := &failReader{}
defer test.MockVariableValue(&defaultProcessors, []processor{})()
assert.ErrorContains(t, postProcessOrCopy(renderContext, renderer, input, &bytes.Buffer{}), "FAIL")
})
}

View file

@ -164,6 +164,7 @@ func PushUpdateAddTag(ctx context.Context, repo *repo_model.Repository, gitRepo
NumCommits: commitsCount,
CreatedUnix: timeutil.TimeStamp(createdAt.Unix()),
IsTag: true,
Note: tag.Message,
}
if author != nil {
rel.PublisherID = author.ID

View file

@ -1,14 +1,20 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
import (
"os"
"path"
"testing"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
"forgejo.org/modules/git"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_calcSync(t *testing.T) {
@ -74,3 +80,56 @@ func Test_calcSync(t *testing.T) {
assert.Equal(t, *gitTags[1], *updates[0], "updates equal")
}
}
func TestSyncReleasesWithTags(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
// Can be any repository that doesn't have the git tag releases.
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
t.Run("SHA1", func(t *testing.T) {
tmpDir := t.TempDir()
require.NoError(t, git.InitRepository(t.Context(), tmpDir, false, git.Sha1ObjectFormat.Name()))
gitRepo, err := git.OpenRepository(t.Context(), tmpDir)
require.NoError(t, err)
defer gitRepo.Close()
require.NoError(t, os.WriteFile(path.Join(tmpDir, "README.md"), []byte("testing the testing"), 0o666))
require.NoError(t, git.AddChanges(tmpDir, true))
require.NoError(t, git.CommitChanges(tmpDir, git.CommitChangesOptions{Message: "Add README"}))
require.NoError(t, gitRepo.CreateAnnotatedTag("v1.0.0", "First release \\o/", "HEAD"))
require.NoError(t, SyncReleasesWithTags(t.Context(), repo, gitRepo))
release := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.0.0"})
assert.Equal(t, "First release \\o/\n", release.Note)
assert.True(t, release.IsTag)
assert.EqualValues(t, 1, release.NumCommits)
})
t.Run("SHA256", func(t *testing.T) {
if !git.SupportHashSha256 {
t.Skip("skipping because installed Git version doesn't support SHA256")
}
tmpDir := t.TempDir()
require.NoError(t, git.InitRepository(t.Context(), tmpDir, false, git.Sha256ObjectFormat.Name()))
gitRepo, err := git.OpenRepository(t.Context(), tmpDir)
require.NoError(t, err)
defer gitRepo.Close()
require.NoError(t, os.WriteFile(path.Join(tmpDir, "README.md"), []byte("testing the testing"), 0o666))
require.NoError(t, git.AddChanges(tmpDir, true))
require.NoError(t, git.CommitChanges(tmpDir, git.CommitChangesOptions{Message: "Add README"}))
require.NoError(t, gitRepo.CreateAnnotatedTag("v2.0.0", "Second release \\o/", "HEAD"))
require.NoError(t, SyncReleasesWithTags(t.Context(), repo, gitRepo))
release := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v2.0.0"})
assert.Equal(t, "Second release \\o/\n", release.Note)
assert.True(t, release.IsTag)
assert.EqualValues(t, 1, release.NumCommits)
})
}

View file

@ -14,8 +14,6 @@ import (
"strings"
"time"
"forgejo.org/modules/log"
"xorm.io/xorm"
)
@ -157,15 +155,6 @@ func DBSlaveConnStrs() ([]string, error) {
dsns = append(dsns, dsn)
}
}
// Fall back to master if no slave DSN was provided.
if len(dsns) == 0 {
master, err := DBMasterConnStr()
if err != nil {
return nil, err
}
log.Debug("Database: No dedicated replica host defined; falling back to primary DSN for replica connections")
dsns = append(dsns, master)
}
return dsns, nil
}

View file

@ -52,3 +52,9 @@ func MockProtect[T any](p *T) (reset func()) {
func SleepTillNextSecond() {
time.Sleep(time.Second - time.Since(time.Now().Truncate(time.Second)))
}
// When this is called, sleep until the truncated unix time to a minute was
// increased by one.
func SleepTillNextMinute() {
time.Sleep(time.Minute - time.Since(time.Now().Truncate(time.Minute)))
}

View file

@ -0,0 +1,28 @@
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package donotpanic
import (
"fmt"
"forgejo.org/modules/log"
)
type FuncWithError func() error
func SafeFuncWithError(fun FuncWithError) (err error) {
defer func() {
if r := recover(); r != nil {
log.Error("PANIC recovered: %v\nStacktrace: %s", r, log.Stack(2))
rErr, ok := r.(error)
if ok {
err = fmt.Errorf("PANIC recover with error: %w", rErr)
} else {
err = fmt.Errorf("PANIC recover: %v", r)
}
}
}()
return fun()
}

View file

@ -0,0 +1,28 @@
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package donotpanic
import (
"errors"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func TestDoNotPanic_SafeFuncWithError(t *testing.T) {
t.Run("OK", func(t *testing.T) {
assert.NoError(t, SafeFuncWithError(func() error { return nil }))
})
t.Run("PanickString", func(t *testing.T) {
errorMessage := "ERROR MESSAGE"
assert.ErrorContains(t, SafeFuncWithError(func() error { panic(errorMessage) }), fmt.Sprintf("recover: %s", errorMessage))
})
t.Run("PanickError", func(t *testing.T) {
errorMessage := "ERROR MESSAGE"
assert.ErrorContains(t, SafeFuncWithError(func() error { panic(errors.New(errorMessage)) }), fmt.Sprintf("recover with error: %s", errorMessage))
})
}

View file

@ -88,7 +88,7 @@ func (r *Route) wrapMiddlewareAndHandler(h []any) ([]func(http.Handler) http.Han
}
}
for _, m := range h {
if h != nil {
if m != nil {
handlerProviders = append(handlerProviders, toHandlerProvider(m))
}
}

View file

@ -23,4 +23,6 @@ signed_in_as = Увайшоў як
enable_javascript = Гэты вэб-сайт патрабуе JavaScript.
toc = Змест
licenses = Ліцэнзіі
return_to_forgejo = Вярнуцца да Forgejo
return_to_forgejo = Вярнуцца да Forgejo
active_stopwatch = Актыўны трэкер часу
tracked_time_summary = Абагульненне падлічанага часу на аснове фільтраў спісу праблем

View file

@ -1887,7 +1887,7 @@ org_full_name_holder = Пълно име на организацията
teams = Екипи
lower_members = участници
lower_repositories = хранилища
settings.repoadminchangeteam = Админ. на хранилището да може да добавя и премахва достъп за екипи
settings.repoadminchangeteam = Админ. на хранилище да може да добавя и премахва достъп за екипи
settings.email = Ел. поща за връзка
settings.delete_account = Изтриване на тази организация
settings.delete_org_title = Изтриване на организацията
@ -1954,6 +1954,9 @@ settings.change_orgname_redirect_prompt.with_cooldown.one = Старото им
teams.add_nonexistent_repo = Хранилището, което се опитвате да добавите, не съществува, моля, първо го създайте.
teams.invite.by = Поканен от %s
teams.can_create_org_repo_helper = Участниците могат да създават нови хранилища в организацията. Създателят ще получи администраторски достъп до новото хранилище.
teams.owners_permission_desc = Притежателите имат пълен достъп до <strong>всички хранилища</strong> и имат <strong>администраторски достъп</strong> до организацията.
[install]
admin_password = Парола
user = Потребителско име
@ -2068,7 +2071,7 @@ projects = Проекти
code = Код
overview = Обзор
watched = Наблюдавани хранилища
unfollow = Прекратяване на следването
unfollow = Отследване
block = Блокиране
settings = Потребителски настройки
starred = Отбелязани хранилища

View file

@ -484,13 +484,13 @@ team_invite.subject = %[1]s us convida a unir-vos a l'organització %[2]s
release.title = Títol: %s
release.downloads = Baixades:
release.download.zip = Codi font (ZIP)
repo.transfer.subject_to_you = %s us vol transferir el repositori "%s"
repo.transfer.subject_to_you = %s us vol transferir el repositori «%s»
repo.collaborator.added.subject = %s us ha afegit a %s com a col·laborador
repo.collaborator.added.text = Us han afegit com a col·laborador al repositori:
issue_assigned.issue = @%[1]s us ha assignat l'incidència %[2]s del repositori %[3]s.
issue.x_mentioned_you = <b>@%s</b> us ha mencionat:
issue.action.new = <b>@%[1]s</b> ha creat #%[2]d.
repo.transfer.subject_to = %s vol transferir el repositori "%s" a %s
repo.transfer.subject_to = %s vol transferir el repositori «%s» a %s
repo.transfer.to_you = tu
register_notify.text_3 = Si algú altre us ha fet aquest compte, necessitareu <a href="%s">configurar la vostra contrasenya</a> abans.
password_change.subject = S'ha canviat la vostra contrasenya
@ -508,6 +508,28 @@ issue.action.approve = <b>@%[1]s</b> ha aprovat aquesta sol·licitud d'extracci
issue.action.reject = <b>@%[1]s</b> ha sol·licitat canvis en aquesta sol·licitud d'extracció.
register_notify.text_2 = Podeu iniciar sessió al vostre compte fent servir el vostre nom d'usuari: %s
register_notify.text_1 = aquest és el vostre correu electrònic de confirmació pel registre de %s!
password_change.text_1 = S'acaba de canviar la contrasenya pel vostre compte.
issue.action.review = <b>@%[1]s</b> ha deixat un comentari a la vostra sol·licitud d'extracció.
issue.action.review_dismissed = <b>@%[1]s</b> ha rebutjat l'última revisió de %[2]s per aquesta sol·licitud d'extracció.
reset_password = Recupereu el vostre compte
reset_password.text = Si heu sigut vós, cliqueu el següent enllaç per recuperar el vostre compte abans de <b>%s</b>:
primary_mail_change.text_1 = S'ha canviat la vostra adreça de correu electrònic principal a %[1]s. Això vol dir que aquesta adreça de correu electrònic no rebrà més notificacions de correu pel vostre compte.
totp_disabled.text_1 = S'han desactivat les contrasenyes d'un sol ús basades en el temps (TOTP) pel vostre compte.
totp_disabled.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor.
removed_security_key.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor.
totp_enrolled.text_1.has_webauthn = Heu habilitat el TOTP per al vostre compte. Això vol dir que, per a totes les futures connexions al vostre compte, podreu utilitzar el TOTP com a mètode d'autenticació en dos passos (2FA) o bé utilitzar qualsevol de les vostres claus de seguretat.
issue.action.force_push = <b>%[1]s</b> ha realitzat un «force push» de <b>%[2]s</b> des de %[3]s fins a %[4]s.
issue.action.push_1 = <b>@%[1]s</b> ha pujat $[3]d commit a %[2]s
issue.action.push_n = <b>@%[1]s</b> ha pujat $[3]d commits a %[2]s
issue.action.ready_for_review = <b>@%[1]s</b> ha marcat aquesta «pull request» com a preparada per a la revisió.
issue.in_tree_path = A %s:
release.new.text = <b>@%[1]s</b> ha publicat %[2]s a %[3]s
release.note = Nota:
release.new.subject = %s a %s publicat
[modal]
yes =
no = No
@ -580,6 +602,32 @@ min_size_error = ` ha de contenir %s caràcters com a mínim.`
max_size_error = ` ha de contenir %s caràcters com a màxim.`
email_domain_is_not_allowed = El domini de l'adreça de correu electrònic <b>%s</b> de l'usuari entra en conflicte amb EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assegureu-vos d'haver introduït l'adreça de correu electrònic correctament.
Website = Lloc web
Location = Ubicació
AdminEmail = Correu electrònic de l'administrador
AccessToken = Testimoni d'accés
CommitSummary = Resum del commit
CommitMessage = Missatge del commit
CommitChoice = Selecció de commit
TreeName = Camí del fitxer
alpha_dash_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-") i barres baixes ("_").`
alpha_dash_dot_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-"), barres baixes ("_") i punts (".").`
regex_pattern_error = ` el patró d'expressió regular no és vàlid: %s.`
required_prefix = L'entrada ha de començar amb "%s"
PayloadUrl = URL de càrrega útil
git_ref_name_error = ` ha de ser un nom correcte de referència de Git.`
size_error = ` ha de tenir una mida de %s.`
include_error = ` ha de contenir la subcadena «%s».`
glob_pattern_error = ` el patró glob no és vàlid: %s.`
username_error = ` només pot contenir caràcters alfanumèrics ("0-9","a-z","A-Z"), guió ("-"), barra baixa ("_") i punt ("."). No pot començar ni acabar amb caràcters no alfanumèrics, i els caràcters no alfanumèrics consecutius també estan prohibits.`
username_error_no_dots = ` només pot contenir caràcters alfanumèrics ("0-9","a-z","A-Z"), guió ("-") i barra baixa ("_"). No pot començar ni acabar amb caràcters no alfanumèrics, i els caràcters no alfanumèrics consecutius tampoc estan permesos.`
invalid_group_team_map_error = ` el mapatge no és vàlid: %s`
username_claiming_cooldown = El nom d'usuari no es pot reservar degut a que el seu període de refredament encara no ha acabat. Es podrà fer servir en %[1]s.
repository_force_private = S'ha activat "Forçar privat": els repositoris privats no es poden fer públics.
[settings]
pronouns = Pronoms
change_username_prompt = Nota: canviar el vostre nom d'usuari també canvia l'URL del vostre compte.
@ -737,7 +785,115 @@ generate_token = Generar el testimoni
generate_token_success = S'ha generat el vostre nou testimoni. Copieu-lo ara, ja que no es tornarà a mostrar.
generate_token_name_duplicate = Ja s'ha usat <strong>%s</strong> com a nom d'aplicació. Si us plau, useu-ne un de nou.
delete_token = Eliminar
access_token_deletion =
access_token_deletion =
biography_placeholder = Explica una mica sobre tu als altres! (Compatible amb Markdown)
delete_email = Eliminar
add_new_email = Afegir una adreça de correu electrònic
add_new_openid = Afegir una nova URI d'OpenID
add_email = Afegir una adreça de correu electrònic
add_openid = Afegir una URI d'OpenID
keep_email_private = Oculta l'adreça de correu electrònic
delete_key = Eliminar
added_on = Afegit el %s
last_used = Usat per últim cop el
can_read_info = Llegir
can_write_info = Escriure
show_openid = Mostrar al perfil
hide_openid = Ocultar del perfil
ssh_disabled = SSH està deshabilitat
access_token_deletion_desc = Eliminar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar?
delete_token_success = S'ha eliminat el testimoni. Les aplicacions que l'estiguin fent servir ja no tenen accés al vostre compte.
regenerate_token = Regenerar
access_token_regeneration = Regenerar un testimoni d'accés
access_token_regeneration_desc = Regenerar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar?
regenerate_token_success = S'ha regenerat el testimoni. Les aplicacions que el fan servir ja no tenen accés al vostre compte i s'han actualitzar al nou testimoni.
permissions_public_only = Només públic
permissions_access_all = Tot (públic, privat i limitat)
select_permissions = Selecció de permisos
permission_no_access = Sense accés
permission_read = Lectura
permission_write = Lectura i escriptura
at_least_one_permission = Heu de seleccionar un permís com a mínim per crear un testimoni
permissions_list = Permisos:
manage_oauth2_applications = Gestionar aplicacions OAuth2
edit_oauth2_application = Modificar aplicació OAuth2
remove_oauth2_application = Eliminar aplicació OAuth2
remove_oauth2_application_success = S'ha eliminat l'aplicació.
create_oauth2_application = Crear una nova aplicació OAuth2
create_oauth2_application_button = Crear aplicació
create_oauth2_application_success = Heu creat amb èxit una nova aplicació OAuth2.
update_oauth2_application_success = Heu actualitzat amb èxit l'aplicació OAuth2.
oauth2_application_name = Nom de l'aplicació
oauth2_redirect_uris = URIs de redirecció. Si us plau, poseu cada URI en una línia nova.
save_application = Guardar
oauth2_client_id = ID del client
oauth2_client_secret = Secret del client
oauth2_regenerate_secret = Regenerar secret
oauth2_regenerate_secret_hint = Heu perdut el vostre secret?
oauth2_application_edit = Edita
authorized_oauth2_applications = Aplicacions OAuth2 autoritzades
authorized_oauth2_applications_description = Heu permès accés al vostre compte personal de Forgejo a aquestes aplicacions de tercers. Si us plau, revoqueu l'accés de les aplicacions que ja no feu servir.
revoke_key = Revocar
revoke_oauth2_grant = Revocar l'accés
revoke_oauth2_grant_description = Revocar l'accés d'aquesta aplicació de tercers impedirà que accedeixi a la vostra informació. N'esteu segurs?
revoke_oauth2_grant_success = L'accés s'ha revocat amb èxit.
twofa_desc = Per protegir el vostre compte del robatori de contrasenyes, podeu fer servir un telèfon intel·ligent o un altre dispositiu per rebre contrasenyes d'un sol ús basades en el temps ("TOTP").
twofa_recovery_tip = Si perdeu el vostre dispositiu, podreu fer servir una clau de recuperació d'un sol ús per recuperar l'accés al vostre compte.
twofa_disable = Desactivar l'autenticació de doble factor
twofa_scratch_token_regenerate = Regenerar la clau de recuperació d'un sol ús
twofa_scratch_token_regenerated = La vostra clau de recuperació d'un sol ús ara és %s. Emmagatzemeu-la en un lloc segur, ja que no es tornarà a mostrar.
twofa_disable_note = L'autenticació de doble factor es pot desactivar si és necessari.
twofa_disable_desc = Desactivar l'autenticació de doble factor farà que el vostre compte sigui menys segur. Voleu continuar?
regenerate_scratch_token_desc = Si heu perdur la vostra clau de recuperació o ja l'heu fet servir per iniciar sessió, la podeu reiniciar aquí.
twofa_disabled = S'ha desactivat l'autenticació de doble factor.
scan_this_image = Escanegeu aquesta imatge amb la vostra aplicació d'autenticació:
or_enter_secret = O introduïu el secret: %s
then_enter_passcode = I introduïu el codi d'accés que es mostra a l'aplicació:
passcode_invalid = El codi d'accés és incorrecte. Intenteu-ho de nou.
twofa_failed_get_secret = No s'ha pogut obtenir el secret.
webauthn_desc = Les claus de seguretat són dispositius que contenen claus criptogràfiques. Es poden fer servir per l'autenticació de doble factor. Les claus de seguretat han de ser compatibles amb l'estàndard <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>.
webauthn_register_key = Afegir una clau de seguretat
webauthn_nickname = Sobrenom
webauthn_delete_key_desc = Si elimineu una clau de seguretat no la podreu fer servir per iniciar sessió. Voleu continuar?
webauthn_key_loss_warning = Si perdeu les vostres claus de seguretat, perdreu també l'accés al vostre compte.
manage_account_links = Comptes vinculats
manage_account_links_desc = Aquests comptes externs estan vinculats al vostre compte de Forgejo.
link_account = Vincular un compte
remove_account_link_desc = Eliminar un compte vinculat revocarà el seu accés al vostre compte de Forgejo. Voleu continuar?
remove_account_link_success = S'ha eliminat el compte vinculat.
orgs_none = No sou membres de cap organització.
repos_none = No sou propietaris de cap repositori.
blocked_users_none = No hi ha cap usuari bloquejat.
delete_account = Eliminar el vostre compte
delete_prompt = Aquest acció eliminarà permanentment el vostre compte. Aquesta acció <strong>no</strong> es pot desfer.
confirm_delete_account = Confirmar l'eliminació
delete_account_title = Eliminar el compte d'usuari
delete_account_desc = Esteu segurs de voler eliminar permanentment aquest compte d'usuari?
email_notifications.enable = Activar les notificacions per correu electrònic
email_notifications.disable = Desactivar les notificacions per correu electrònic
visibility.public_tooltip = Visible per a tothom
visibility.limited_tooltip = Visible només pels usuaris que hagin iniciat sessió
visibility.private_tooltip = Visible només pels membres de les organitzacions a les quals us hàgiu unit
user_unblock_success = S'ha desbloquejat l'usuari amb èxit.
user_block_success = S'ha bloquejat l'usuari amb èxit.
quota.sizes.repos.all = Repositoris
quota.sizes.repos.public = Repositoris públics
quota.sizes.repos.private = Repositoris privats
quota.sizes.git.all = Contingut de Git
quota.sizes.git.lfs = Git LFS
quota.sizes.assets.attachments.all = Fitxers adjunts
quota.sizes.assets.attachments.issues = Fitxers adjunts a incidències
quota.sizes.assets.artifacts = Artefactes
quota.sizes.assets.packages.all = Paquets
enable_custom_avatar = Usa un avatar personalitzat
comment_type_group_assignee = Assignat
primary = Principal
visibility.public = Públic
visibility.limited = Limitat
visibility.private = Privat
[repo]
settings.basic_settings = Configuració bàsica
@ -823,7 +979,7 @@ settings.slack_channel = Canal
settings.web_hook_name_forgejo = Forgejo
settings.web_hook_name_gitea = Gitea
settings.web_hook_name_slack = Slack
settings.web_hook_name_telegram = Discord
settings.web_hook_name_telegram = Telegram
settings.web_hook_name_matrix = Matrix
settings.sourcehut_builds.secrets = Secrets
settings.deploy_key_content = Contingut
@ -914,6 +1070,510 @@ language_other = Altres
delete_preexisting_label = Eliminar
issues.filter_milestone_all = Totes les fites
mirror_sync = sincronitzat
mirror_password_placeholder = (Sense canvis)
mirror_password_blank_placeholder = (No establert)
stargazers = Admiradors
stars = Estrelles
desc.private = Privat
desc.template = Plantilla
desc.internal = Intern
desc.archived = Arxivat
desc.sha256 = SHA256
template.webhooks = Webhooks
template.topics = Temes
template.avatar = Avatar
need_auth = Autorització
migrate_items_wiki = Wiki
migrate_items_milestones = Fites
migrate_items_labels = Etiquetes
migrate_items_issues = Problemes
migrate_items_releases = Publicacions
watch = Segueix
unwatch = Deixa de seguir
star = Estrella
unstar = Treu l'estrella
fork = Bifurca
code = Codi
branches = Branques
tags = Etiquetes
issues = Problemes
packages = Paquets
actions = Accions
releases = Publicacions
labels = Etiquetes
milestones = Fites
org_labels_desc_manage = gestionar
file_raw = Original
file_history = Historial
file_permalink = Enllaç permanent
generated = Generat
commit_graph.monochrome = Mono
commit_graph.color = Color
line = línia
lines = línies
from_comment = (comentari)
editor.or = o
editor.cancel_lower = Cancel·la
editor.cancel = Cancel·la
commits.commits = Commits
commits.author = Autor
commits.message = Missatge
commits.date = Data
commit.operations = Operacions
commit.revert = Reverteix
commitstatus.error = Error
commitstatus.failure = Fallada
commitstatus.pending = Pendent
commitstatus.success = Èxit
projects = Projectes
projects.description_placeholder = Descripció
projects.title = Títol
projects.type.none = Cap
projects.template.desc = Plantilla
projects.column.edit_title = Nom
projects.column.new_title = Nom
projects.column.color = Color
projects.open = Obre
projects.close = Tanca
issues.new.assignees = Assignats
issues.choose.open_external_link = Obre
issues.choose.blank = Predeterminat
issues.deleted_milestone = `(suprimit)`
issues.deleted_project = `(suprimit)`
issues.filter_label = Etiqueta
issues.filter_milestone = Fita
issues.filter_project = Projecte
issues.filter_assignee = Assignat
issues.filter_poster = Autor
issues.filter_type = Tipus
issues.filter_sort = Ordenació
issues.filter_sort.latest = Més recents
issues.filter_sort.oldest = Més antics
issues.action_open = Obre
issues.action_close = Tanca
issues.action_label = Etiqueta
issues.action_milestone = Fita
issues.action_assignee = Assignat
issues.action_check = Marca/Desmarca
issues.previous = Anterior
issues.next = Següent
issues.open_title = Oberts
issues.closed_title = Tancats
issues.draft_title = Esborrany
issues.context.edit = Edita
issues.context.delete = Suprimeix
issues.reopen_issue = Reobre
issues.create_comment = Comenta
issues.author = Autor
issues.role.owner = Propietari
issues.role.member = Membre
issues.role.collaborator = Col·laborador
issues.role.contributor = Contribuïdor
issues.edit = Edita
issues.cancel = Cancel·la
issues.save = Desa
issues.label_title = Nom
issues.label_description = Descripció
issues.label_color = Color
issues.label_exclusive = Exclusiu
issues.label_edit = Edita
issues.label_delete = Suprimeix
issues.label.filter_sort.alphabetically = Alfabèticament
issues.subscribe = Subscriu-me
issues.unsubscribe = Cancel·la la subscripció
issues.lock_confirm = Bloqueja
issues.unlock_confirm = Desbloqueja
issues.delete = Suprimeix
issues.cancel_tracking = Descarta
issues.add_time_cancel = Cancel·la
issues.add_time_hours = Hores
issues.add_time_minutes = Minuts
issues.force_push_compare = Compara
issues.due_date_form = aaaa-mm-dd
issues.due_date_form_edit = Edita
issues.due_date_form_remove = Elimina
issues.due_date_overdue = Endarrerit
issues.dependency.title = Dependències
issues.dependency.cancel = Cancel·la
issues.dependency.remove = Elimina
issues.review.dismissed_label = Descartat
issues.review.pending = Pendent
issues.review.reviewers = Revisors
issues.review.outdated = Obsolet
issues.reference_issue.body = Cos
issues.content_history.edited = editat
issues.content_history.created = creat
issues.content_history.options = Opcions
compare.compare_base = base
compare.compare_head = compara
pulls.has_viewed_file = Vist
pulls.tab_conversation = Conversa
pulls.tab_commits = Commits
pulls.merged = Fusionat
pulls.status_checks_requested = Requerit
pulls.status_checks_details = Detalls
pulls.cmd_instruction_merge_title = Fusiona
pulls.made_using_agit = AGit
pull.deleted_branch = (eliminat):%s
milestones.open = Obre
milestones.close = Tanca
milestones.title = Títol
milestones.desc = Descripció
milestones.clear = Neteja
milestones.cancel = Cancel·la
wiki = Wiki
wiki.page = Pàgina
wiki.new_page = Pàgina
wiki.cancel = Cancel·la
wiki.edit_page_button = Edita
wiki.pages = Pàgines
activity = Activitat
activity.navbar.contributors = Contribuïdors
activity.period.filter_label = Període:
activity.overview = Visió general
activity.merged_prs_label = Fusionat
activity.opened_prs_label = Proposat
activity.closed_issue_label = Tancat
activity.new_issue_label = Obert
activity.unresolved_conv_label = Obre
activity.published_release_label = Publicació
activity.git_stats_and_deletions = i
contributors.contribution_type.commits = Commits
settings.collaboration.write = Escriptura
settings.collaboration.read = Lectura
settings.collaboration.undefined = Indefinit
settings.hooks = Webhooks
settings.mirror_settings.direction = Direcció
settings.mirror_settings.direction.push = Puja
settings.units.units = Unitats
settings.units.overview = Visió general
settings.trust_model.committer =Confirmador
settings.delete_collaborator = Elimina
settings.webhook.response = Resposta
settings.webhook.headers = Capçaleres
settings.webhook.payload = Contingut
settings.webhook.body = Cos
settings.event_delete = Suprimeix
settings.event_fork = Bifurca
settings.event_wiki = Wiki
settings.event_push = Puja
settings.event_repository = Repositori
settings.event_issue_assign = Assignació
settings.event_pull_request_assign = Assignació
settings.event_pull_request_review = Revisions
settings.event_pull_request_sync = Sincronitzat
mirror_prune = Poda
pulls = Sol·licituds d'extracció
project = Projectes
org_labels_desc = Etiquetes de nivell d'organització que es poden usar amb <strong>tots els repositoris</strong> dins d'aquesta organització
released_this = ha publicat això
file_view_source = Veure la font
file_too_large = El fitxer és massa gran per ser mostrat.
invisible_runes_header = `Aquest fitxer conté caràcters Unicode invisibles`
invisible_runes_description = `Aquest fitxer conté caràcters Unicode invisibles que són indistingibles pels humans però que un ordinador pot processar de manera diferent. Si creieu que això és intencional, podeu ignorar aquest avís. Useu el botó Esc per revelar-los.`
ambiguous_runes_header = `Aquest fitxer conté caràcters Unicode ambigus`
ambiguous_runes_description = `Aquest fitxer conté caràcters Unicode que es poden confondre amb d'altres. Si creieu que això és intencional, podeu ignorar aquest avís. Useu el botó Esc per revelar-los.`
invisible_runes_line = `Aquesta línia conté caràcters Unicode invisibles`
ambiguous_runes_line = `Aquesta línia conté caràcters Unicode ambigus`
ambiguous_character = `%[1]c [U+%04[1]X] es pot confondre amb %[2]c [U+%04[2]X]`
file_copy_permalink = Copiar l'enllaç permanent
video_not_supported_in_browser = El vostre navegador no suporta l'etiqueta d'HTML5 "video".
audio_not_supported_in_browser = El vostre navegador no suporta l'etiqueta d'HTML5 "audio".
stored_lfs = Emmagatzemat amb Git LFS
symbolic_link = Enllaç simbòlic
executable_file = Fitxer executable
commit_graph.select = Seleccionar branques
commit_graph.hide_pr_refs = Amaga les sol·licituds d'extracció
commit.contained_in_default_branch = Aquest commit és part de la branca predeterminada
commit.load_referencing_branches_and_tags = Carrega les branques i les etiquetes referenciades en aquest commit
blame = Culpa
download_file = Descarregar el fitxer
normal_view = Vista normal
no_eol.tooltip = Aquest fitxer no conté un caràcter de final de línia.
editor.add_file = Afegir un fitxer
editor.new_file = Nou fitxer
editor.upload_file = Pujar un fitxer
editor.edit_file = Editar el fitxer
editor.preview_changes = Previsualitzar els canvis
editor.cannot_edit_lfs_files = Els fitxers LFS no es poden editar mitjançant la interfície web.
editor.cannot_edit_non_text_files = Els fitxers binaris no es poden editar mitjançant la interfície web.
editor.edit_this_file = Editar el fitxer
editor.this_file_locked = El fitxer està bloquejat
editor.must_be_on_a_branch = Heu de ser en una branca per fer o proposar canvis en aquest fitxer.
editor.fork_before_edit = Heu de bifurcar aquest repositori per fer o proposar canvis en aquest fitxer.
editor.delete_this_file = Eliminar el fitxer
editor.must_have_write_access = Heu de tenir accés d'escriptura per fer o proposar canvis en aquest fitxer.
editor.file_delete_success = S'ha eliminat el fitxer "%s".
editor.name_your_file = Anomeneu el vostre fitxer…
editor.filename_help = Afegiu un directori escrivint el seu nom seguit d'una barra inclinada ("/"). Elimineu un directori prement la tecla de retrocés al principi del camp d'entrada.
editor.add_tmpl = Afegir "<%s>"
editor.add = Afegir %s
editor.delete = Eliminar %s
editor.fail_to_apply_patch = No s'ha pogut aplicar el pedaç "%s"
editor.new_patch = Pedaç nou
editor.commit_message_desc = Afegiu una descripció ampliada opcional…
editor.create_new_branch = Crear una <strong>nova branca</strong> per aquest commit i iniciar una sol·licitud d'extracció.
editor.create_new_branch_np = Crear una <strong>nova branca</strong> per aquest commit.
editor.new_branch_name_desc = Nom de la branca nova…
editor.filename_is_invalid = El nom del fitxer és incorrecte: "%s".
editor.branch_does_not_exist = La branca "%s" no existeix en aquest repositori.
editor.branch_already_exists = La branca "%s" ja existeix en aquest repositori.
editor.directory_is_a_file = El nom del directori "%s" ja està en ús en aquest repositori.
editor.file_is_a_symlink = `"%s" és un enllaç simbòlic. Els enllaços simbòlics no es poden editar mitjançant l'editor web`
editor.filename_is_a_directory = El nom de fitxer "%s" ja està en us per un directori d'aquest repositori.
editor.file_editing_no_longer_exists = El fitxer que està sent editat, "%s", ja no existeix en aquest repositori.
editor.file_deleting_no_longer_exists = El fitxer que s'està eliminant, "%s", ja no existeix en aquest repositori.
editor.no_changes_to_show = No hi ha canvis per mostrar.
editor.fail_to_update_file = No s'ha pogut modificar/crear el fitxer "%s".
editor.fail_to_update_file_summary = Missatge d'error:
editor.push_rejected_summary = Missatge de rebuig complet:
editor.add_subdir = Afegir un directori…
editor.unable_to_upload_files = No s'han pogut pujar fitxers a "%s" degut a aquest error: %v
editor.upload_file_is_locked = El fitxer "%s" està bloquejat per %s.
editor.upload_files_to_dir = Pujar fitxers a "%s"
commits.nothing_to_compare = Aquestes branques són iguals.
commits.search.tooltip = Podeu prefixar les paraules clau amb "author:", "committer:", "after:", o "before:". Per exemple: "revert author:Alice before:2019-01-13".
commits.search_branch = Aquesta branca
commits.search_all = Totes les branques
commits.browse_further = Navega més enllà
commits.signed_by = Signat per
commits.gpg_key_id = ID de la clau GPG
commits.ssh_key_fingerprint = Empremta de la clau SSH
ext_issues = Incidències externes
projects.description = Descripció (opcional)
projects.create = Crear un projecte
projects.new = Nou projecte
projects.create_success = S'ha creat el projecte "%s".
projects.deletion = Eliminar el projecte
projects.deletion_desc = Si s'elimina un projecte, s'eliminarà de totes les incidències relacionades. Voleu continuar?
projects.deletion_success = S'ha eliminat el projecte.
projects.edit = Editar el projecte
projects.modify = Editar el projecte
projects.edit_success = S'ha actualitzat el projecte "%s".
projects.template.desc_helper = Seleccioneu una plantilla de projecte per començar
projects.column.edit = Editar la columna
projects.column.new_submit = Crear una columna
projects.column.new = Nova columna
projects.column.delete = Eliminar la columna
projects.card_type.images_and_text = Imatges i text
projects.card_type.text_only = Només text
issues.filter_no_results = Cap resultat
issues.filter_no_results_placeholder = Proveu a ajustar els filtres de cerca.
issues.new.clear_labels = Netejar les etiquetes
issues.new.clear_projects = Netejar els projectes
issues.new.no_projects = Cap projecte
issues.new.no_items = Cap element
issues.new.clear_milestone = Netejar les fites
issues.choose.ignore_invalid_templates = S'han ignorat les plantilles invàlides
issues.action_milestone_no_select = Cap fita
issues.action_check_all = Marca/Desmarca tots els elements
issues.opened_by = oberta %[1]s per <a href="%[2]s">%[3]s</a>
issues.opened_by_fake = oberta %[1]s per %[2]s
issues.closed_by_fake = per %[2]s ha sigut tancada %[1]s
issues.all_title = Totes
issues.num_comments_1 = %d comentari
issues.num_comments = %d comentaris
issues.num_reviews_one = %d revisió
issues.num_reviews_few = %d revisions
issues.commented_at = `ha comentat <a href="#%s">%s</a>`
issues.delete_comment_confirm = Esteu segurs que voleu eliminar aquest comentari?
issues.reaction.add = Afegir una reacció
issues.reaction.alt_few = %[1]s ha reaccionat %[2]s.
issues.reaction.alt_many = %[1]s i %[2]d més han reaccionat %[3]s.
issues.reaction.alt_remove = Eliminar %[1]s reacció del comentari.
issues.reaction.alt_add = Afegir %[1]s reacció al comentari.
issues.context.copy_link = Copiar l'enllaç
issues.context.quote_reply =
issues.context.reference_issue = Referenciar-la en una nova incidència
issues.no_content = No s'ha proporcionat cap descripció.
issues.close = Tancar la incidència
issues.close_comment_issue = Tancar amb un comentari
issues.reopen_comment_issue = Reobrir amb un comentari
issues.closed_at = `ha tancat aquesta incidència &s`
issues.reopened_at = `ha reobert aquesta incidència %s`
issues.ref_issue_from = `<a href="%[2]s">ha fet referència a aquesta incidència %[3]s</a>%[1]s`
issues.ref_pull_from = `<a href="%[2]s">ha fet referència a aquesta sol·licitud d'extracció %[3]s</a>%[1]s`
issues.ref_closing_from = `<a href="%[2]s">ha fet referència a aquesta incidència en una sol·licitud d'extracció %[3]s que la tancarà</a>, %[1]s`
issues.ref_reopening_from = `<a href="%[2]s">ha fet referència a aquesta incidència en una sol·licitud d'extracció %[3]s que la reobrirà</a>, %[1]s`
issues.author.tooltip.issue = Aquest usuari és l'autor d'aquesta incidència.
issues.author.tooltip.pr = Aquest usuari és l'autor d'aquesta sol·licitud d'extracció.
issues.role.owner_helper = Aquest usuari és el propietari d'aquest repositori.
issues.role.member_helper = Aquest usuari és membre de la organització a la qual pertany aquest repositori.
issues.role.collaborator_helper = S'ha convidat aquest usuari a col·laborar al repositori.
issues.role.first_time_contributor = Col·laborador per primera vegada
issues.role.first_time_contributor_helper = Aquesta és la primera contribució d'aquest usuari al repositori.
issues.re_request_review = Tornar a demanar-ne una revisió
issues.remove_request_review = Eliminar la sol·licitud de revisió
issues.remove_request_review_block = No es pot eliminar la sol·licitud de revisió
issues.dismiss_review = Descartar la revisió
issues.dismiss_review_warning = Esteu segurs de voler descartar aquesta revisió?
issues.sign_in_require_desc = <a href="%s">Inicieu la sessió</a> per unir-vos a aquesta conversa.
issues.label_archive = Arxivar l'etiqueta
issues.label_archived_filter = Mostra les etiquetes arxivades
issues.label_archive_tooltip = Les etiquetes arxivades s'exclouen per defecte dels suggeriments quan es cerca per etiqueta.
issues.label_count = %s etiquetes
issues.label_open_issues = %d incidències/sol·licituds d'extracció obertes
issues.label_modify = Editar l'etiqueta
issues.label_deletion = Eliminar l'etiqueta
issues.label_deletion_desc = Eliminar una etiqueta l'eliminarà de totes les incidències. Voleu continuar?
issues.label_deletion_success = S'ha eliminat l'etiqueta.
issues.attachment.open_tab = `Feu click per veure "%s" en una nova pestanya`
issues.max_pinned = No podeu fixar més incidències
issues.lock = Bloquejar la conversa
issues.unlock = Desbloquejar la conversa
issues.lock.unknown_reason = No es pot bloquejar una incidència amb una causa desconeguda.
issues.lock_duplicate = No es pot bloquejar una incidència dues vegades.
issues.unlock_error = No es pot desbloquejar una incidència que no està bloquejada.
issues.unlock_comment = ha desbloquejat aquesta conversa %s
issues.lock.notice_1 = - Els altres usuaris no podran deixar més comentaris en aquesta incidència.
issues.lock.notice_2 = - Vos i altres col·laboradors amb accés a aquest repositori encara podeu deixar comentaris que els altres poden veure.
issues.lock.notice_3 = - Sempre podeu desbloquejar aquesta incidència una altra vegada més endavant.
issues.unlock.notice_1 = - Tothom podrà tornar a deixar comentaris en aquesta incidència.
issues.unlock.notice_2 = - Sempre podeu bloquejar aquesta incidència una altra vegada més endavant.
issues.comment_on_locked = No es pot deixar un comentari en una incidència bloquejada.
issues.delete.title = Eliminar aquesta incidència?
issues.delete.text = Esteu segurs de voler eliminar aquesta incidència? (Tot el contingut s'eliminarà permanentment. Considereu tancar-la si voleu mantenir-la arxivada)
issues.dependency.blocks_short = Bloqueja
pulls.new = Nova sol·licitud d'extracció
pulls.view = Veure la sol·licitud d'extracció
pulls.compare_changes = Nova sol·licitud d'extracció
pulls.sign_in_require = <a href="%s">Inicieu sessió</a> per crear una nova sol·licitud d'extracció.
pulls.allow_edits_from_maintainers_desc = Els usuaris amb accés d'escriptura a la branca base també poden pujar canvis a aquesta branca
pulls.allow_edits_from_maintainers_err = No s'ha pogut actualitzar
pulls.has_changed_since_last_review = Ha canviat des de la vostra última revisió
pulls.expand_files = Expandir tots els fitxers
pulls.collapse_files = Col·lapsar tots els fitxers
pulls.compare_base = fusionar a
pulls.compare_compare = extreure de
pulls.no_results = No s'ha trobat cap resultat.
pulls.show_changes_since_your_last_review = Mostrar els canvis des de la vostra última revisió
pulls.nothing_to_compare = Aquestes branques són iguals. No cal crear cap sol·licitud d'extracció.
pulls.nothing_to_compare_have_tag = Les branques/etiquetes seleccionades són iguals.
pulls.nothing_to_compare_and_allow_empty_pr = Aquestes branques són iguals. La sol·licitud d'extracció estarà buida.
pulls.has_pull_request = `Ja existeix una sol·licitud d'extracció entre aquestes branques: <a href="%[1]s">%[2]s#%[3]d</a>`
pulls.create = Crear una sol·licitud d'extracció
pulls.change_target_branch_at = `ha canviat la branca de destí de <b>%s</b> a <b>%s</b> %s`
pulls.reopen_to_merge = Si us plau, reobriu aquesta sol·licitud d'extracció per dur a terme una fusió.
pulls.cant_reopen_deleted_branch = Aquesta sol·licitud d'extracció no es pot reobrir perquè la branca s'ha eliminat.
pulls.merged_success = S'ha fusionat i tancat correctament la sol·licitud d'extracció
pulls.closed = S'ha tancat la sol·licitud d'extracció
pulls.manually_merged = S'ha fusionat manualment
pulls.merged_info_text = Ja es pot eliminar la branca %s.
pulls.is_closed = S'ha tancat la sol·licitud d'extracció.
pulls.cannot_merge_work_in_progress = Aquesta sol·licitud d'extracció està marcada com a treball en curs.
pulls.files_conflicted = Aquesta sol·licitud d'extracció té canvis que entren en conflicte amb la branca de destí.
pulls.is_ancestor = Aquesta branca ja està inclosa a la branca de destí. No hi ha res per fusionar.
pulls.blocked_by_approvals = Aquesta sol·licitud d'extracció encara no té prou aprovacions. %d de %d aprovacions concedides.
pulls.blocked_by_rejection = Aquesta sol·licitud d'extracció té canvis sol·licitats per un revisor oficial.
pulls.blocked_by_official_review_requests = Aquesta sol·licitud d'extracció està bloquejada perquè li manquen aprovacions d'un o més revisors oficials.
pulls.blocked_by_outdated_branch = Aquesta sol·licitud d'extracció està bloquejada perquè està desactualitzada.
pulls.blocked_by_changed_protected_files_1 = Aquesta sol·licitud d'extracció està bloquejada perquè modifica un fitxer protegit:
pulls.blocked_by_changed_protected_files_n = Aquesta sol·licitud d'extracció està bloquejada perquè modifica fitxers protegits:
pulls.can_auto_merge_desc = Aquesta sol·licitud d'extracció es pot fusionar automàticament.
pulls.cannot_auto_merge_desc = Aquesta sol·licitud d'extracció no es pot fusionar automàticament degut a conflictes.
pulls.cannot_auto_merge_helper = Fusioneu manualment per resoldre els conflictes.
pulls.approve_count_1 = %d aprovació
pulls.approve_count_n = %s aprovacions
pulls.blocked_by_user = No podeu crear una sol·licitud d'extracció en aquest repositori perquè el seu propietari us ha bloquejat.
pulls.no_merge_desc = Aquesta sol·licitud d'extracció no es pot fusionar perquè totes les opcions de fusió del repositori estan deshabilitades.
pulls.no_merge_helper = Habiliteu les opcions de fusió a la configuració del repositori o feu la fusió de la sol·licitud d'extracció manualment.
pulls.no_merge_wip = Aquesta sol·licitud d'extracció no es pot fusionar perquè està marcada com a treball en curs.
pulls.no_merge_access = No esteu autoritzats per fusionar aquesta sol·licitud d'extracció.
pulls.merge_manually = Fusionada manualment
pulls.invalid_merge_option = No podeu fer servir aquesta opció de fusió per aquesta sol·licitud d'extracció.
pulls.merge_conflict = La fusió ha fallat: hi ha hagut un conflicte durant la fusió. Consell: proveu una estratègia diferent
pulls.merge_conflict_summary = Missatge d'error
pulls.rebase_conflict_summary = Missatge d'error
signing.wont_sign.approved = La fusió no es signarà perquè la sol·licitud d'extracció no està aprovada.
signing.wont_sign.not_signed_in = No heu iniciat sessió.
ext_wiki = Wiki externa
wiki.welcome = Benvingut/da a la wiki.
wiki.welcome_desc = La wiki us permet escriure i compartir documentació amb els col·laboradors.
wiki.page_title = Títol de la pàgina
wiki.page_content = Contingut de la pàgina
wiki.default_commit_message = Escriviu una nota sobre l'edició d'aquesta pàgina (opcional).
wiki.save_page = Guardar la pàgina
wiki.last_commit_info = %s ha editat aquesta pàgina %s
wiki.new_page_button = Nova pàgina
wiki.delete_page_button = Eliminar la pàgina
wiki.delete_page_notice_1 = L'eliminació de la pàgina "%s" de la wiki no es pot desfer. Voleu continuar?
wiki.page_already_exists = Ja existeix una pàgina de la wiki amb aquest mateix nom.
wiki.original_git_entry_tooltip = Veure el fitxer Git original en comptes d'usar un enllaç amigable.
wiki.no_search_results = Cap resultat
activity.period.daily = 1 dia
activity.period.halfweekly = 3 dies
activity.period.weekly = 1 setmana
activity.period.monthly = 1 mes
activity.period.quarterly = 3 mesos
activity.period.semiyearly = 6 mesos
activity.period.yearly = 1 any
activity.merged_prs_count_1 = Sol·licitud d'extracció fusionada
activity.merged_prs_count_n = Sol·licituds d'extracció fusionades
activity.opened_prs_count_1 = Sol·licitud d'extracció proposada
activity.opened_prs_count_n = Sol·licituds d'extracció proposades
activity.title.user_1 = %d usuari
activity.title.user_n = %d usuaris
activity.title.prs_1 = %d sol·licitud d'extracció
activity.title.prs_n = %s sol·licituds d'extracció
activity.title.prs_merged_by = %s fusionat per %s
activity.title.prs_opened_by = %s proposada per %s
activity.closed_issues_count_1 = Incidència tancada
activity.closed_issues_count_n = Incidències tancades
activity.title.issues_1 = %s incidència
activity.title.issues_n = %s incidències
activity.title.issues_closed_from = %s tancades per %s
activity.title.issues_created_by = %s creades per %s
activity.new_issues_count_1 = Nova incidència
activity.new_issues_count_n = Noves incidències
activity.title.unresolved_conv_1 = %s conversa sense resoldre
activity.title.unresolved_conv_n = %s converses sense resoldre
activity.unresolved_conv_desc = Aquestes incidències i sol·licituds d'extracció recentment modificades no han sigut resoltes encara.
activity.title.releases_1 = %d entrega
activity.title.releases_n = %d entregues
activity.title.releases_published_by = %s publicada per %s
activity.published_tag_label = Etiqueta
activity.git_stats_author_1 = %d autor
activity.git_stats_author_n = %d autors
activity.git_stats_pushed_1 = ha pujat
activity.git_stats_pushed_n = han pujat
activity.git_stats_file_1 = %d fitxer
activity.git_stats_file_n = %d fitxers
activity.git_stats_files_changed_1 = ha canviat
activity.git_stats_files_changed_n = han canviat
activity.git_stats_additions = i hi ha hagut
activity.git_stats_addition_1 = %d addició
activity.git_stats_addition_n = %d addicions
activity.git_stats_deletion_1 = %d eliminació
activity.git_stats_deletion_n = %d eliminacions
settings.mirror_settings.docs = Configureu el vostre repositori per sincronitzar automàticament commits, etiquetes i branques amb un altre repositori.
settings.trust_model.collaboratorcommitter = Col·laborador+Confirmador
settings.event_pull_request_enforcement = Aplicació
settings.event_package = Paquet
settings.active = Actiu
settings.slack_token = Testimoni
settings.web_hook_name_gogs = Gogs
settings.web_hook_name_discord = Discord
settings.web_hook_name_dingtalk = DingTalk
settings.web_hook_name_feishu_only = Feishu
settings.web_hook_name_packagist = Packagist
settings.protect_status_check_matched = Coincideix
settings.protect_patterns = Patrons
settings.edit_protected_branch = Edita
settings.tags = Etiquetes
settings.tags.protection.allowed = Permès
settings.lfs = LFS
settings.lfs_pointers.oid = OID
diff.commit = commit
diff.whitespace_button = Espai blanc
diff.bin = BIN
diff.file_before = Abans
diff.file_after = Després
diff.file_image_width = Amplada
diff.file_image_height = Alçada
diff.file_byte_size = Mida
[user]
unblock = Desbloquejar
followers_one = %d seguidor
@ -951,4 +1611,83 @@ public_activity.visibility_hint.self_public = La vostra activitat és visible pe
public_activity.visibility_hint.admin_public = Aquesta activitat és visible per tothom, però com a administrador també podeu veure interaccions en espais privats.
public_activity.visibility_hint.self_private = La vostra activitat és visible només per vós i pels administradors de la instància. <a href="%s">Configurar</a>.
public_activity.visibility_hint.admin_private = Aquesta activitat és visible per vós perquè sou un administrador, però l'usuari vol que romangui privada.
public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. <a href="%s">Configurar</a>.
public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. <a href="%s">Configurar</a>.
change_avatar = Canvieu el vostre avatar…
joined_on = S'ha unit el %s
[org]
settings = Configuració
settings.options = Organització
settings.email = Correu electrònic de contacte
settings.website = Lloc web
settings.location = Ubicació
settings.permission = Permisos
settings.visibility = Visibilitat
settings.visibility.public = Públic
settings.visibility.limited = Limitat (visible només als usuaris amb sessió iniciada)
settings.visibility.limited_shortname = Limitat
settings.visibility.private = Privat (visible només pels membres de l'organització)
settings.visibility.private_shortname = Privat
settings.update_settings = Actualitza la configuració
settings.update_setting_success = S'ha actualitzat la configuració de l'organització.
settings.change_orgname_redirect_prompt = El nom antic redirigirà fins que sigui reclamat.
settings.update_avatar_success = S'ha actualitzat l'avatar de l'organització.
settings.delete = Eliminar la organtizació
settings.delete_account = Eliminar aquesta organització
settings.delete_prompt = L'organització s'eliminarà permanentment. Aquesta acció <strong>NO</strong> es pot desfer!
settings.confirm_delete_account = Confirmar-ne l'eliminació
settings.delete_org_title = Eliminar l'organització
settings.delete_org_desc = Aquesta organització s'eliminarà permanentment. Voleu continuar?
settings.labels_desc = Afegiu etiquetes que poden ser usades a totes les incidències de <strong>tots els repositoris</strong> d'aquesta organització.
members.private = Ocult
members.member_role = Funció del membre:
members.owner = Propietari
members.member = Membre
members.remove = Eliminar
members.remove.detail = Eliminar %[1]s de %[2]s?
members.leave.detail = Esteu segurs de voler marxar de l'organització "%s"?
teams.join = Unir-s'hi
teams.leave = Marxar
teams.leave.detail = Esteu segurs de voler marxar de l'equip "%s"?
teams.can_create_org_repo = Crear repositoris
teams.can_create_org_repo_helper = Els membres poden crear nous repositoris a l'organització. El creador tindrà accés d'administrador al nou repositori.
teams.none_access = Sense accés
teams.none_access_helper = L'opció de "sense accés" té efecte només en repositoris privats.
teams.general_access = Accés personalitzat
teams.general_access_helper = Els permisos dels membres es determinaran segons la taula de permisos següent.
teams.read_access = Lectura
teams.write_access = Escriptura
teams.admin_access = Accés d'administrador
teams.no_desc = Aquest equip no té cap descripció
teams.settings = Configuració
teams.owners_permission_desc = Els propietaris tenen accés complet a <strong>tots els repositoris</strong> i tenen <strong>accés d'administrador</strong> a l'organització.
teams.update_settings = Actualitza la configuració
teams.delete_team = Eliminar l'equip
teams.add_team_member = Afegir un membre a l'equip
teams.invite_team_member = Convidar a %s
teams.invite_team_member.list = Invitacions pendents
teams.delete_team_title = Eliminar l'equip
[admin]
dashboard.cron.finished = Cron: %[1]s ha finalitzat
dashboard.delete_inactive_accounts = Suprimir tots els comptes no activats
dashboard.delete_inactive_accounts.started = S'ha iniciat la tasca per suprimir tots els comptes no activats.
dashboard.delete_repo_archives = Suprimir tots els arxius dels repositoris (ZIP, TAR.GZ, etc.)
dashboard.delete_repo_archives.started = S'ha iniciat la tasca per suprimir tots els arxius dels repositoris.
dashboard.delete_missing_repos = Suprimir tots els repositoris que no tinguin els fitxers de Git
dashboard.delete_missing_repos.started = S'ha iniciat la tasca per suprimir tots els repositoris que no tinguin els fitxers de Git.
dashboard.update_mirrors = Actualitzar les rèpliques
dashboard.archive_cleanup = Suprimir els arxius de repositori antics
dashboard.memory_allocate_times = Assignacions de memòria
[git.filemode]
executable_file = Fitxer executable
symbolic_link = Enllaç simbòlic
submodule = Submòdul
[markup]
filepreview.truncated = La vista prèvia s'ha truncat
[translation_meta]
test = Aquest és un text de prova. No es mostra a l'interfície d'usuari de Forgejo, però s'utilitza amb finalitats de prova. Pots introduir "d'acord" per a estalviar temps (o alguna frase divertida al teu gust) i arribar a la dolça fita del 100% :)

View file

@ -3683,7 +3683,7 @@ owner.settings.cleanuprules.keep.count=Zachovat nejnovější
owner.settings.cleanuprules.keep.count.1=1 verze na balíček
owner.settings.cleanuprules.keep.count.n=%d verzí na balíček
owner.settings.cleanuprules.keep.pattern=Ponechat odpovídající verze
owner.settings.cleanuprules.keep.pattern.container=U balíčků Container je vždy zachována <code>nejnovější</code> verze.
owner.settings.cleanuprules.keep.pattern.container=U balíčků Container je vždy zachována <code>nejnovější</code> verze.
owner.settings.cleanuprules.remove.title=Verze, které odpovídají těmto pravidlům, jsou odstraněny, pokud výše uvedené pravidlo neukládá jejich zachování.
owner.settings.cleanuprules.remove.days=Odstranit verze starší než
owner.settings.cleanuprules.remove.pattern=Odstranit odpovídající verze
@ -3691,7 +3691,7 @@ owner.settings.cleanuprules.success.update=Pravidlo pro čištění bylo aktuali
owner.settings.cleanuprules.success.delete=Pravidlo pro čištění bylo odstraněno.
owner.settings.chef.title=Registr Chef
owner.settings.chef.keypair=Generovat pár klíčů
owner.settings.chef.keypair.description=Žádosti odeslané do registru Chef musí být kryptograficky podepsané jako způsob ověření. Při generování páru klíčů je ve službě Forgejo uložen pouze veřejný klíč. Soukromý klíč je poskytnut vám, abyste jej mohli použít s programem knife. Vygenerováním nového páru klíčů přepíšete ten předchozí.
owner.settings.chef.keypair.description=Žádosti odeslané do registru Chef musí být kryptograficky podepsané jako způsob ověření. Při generování páru klíčů je ve službě Forgejo uložen pouze veřejný klíč. Soukromý klíč je poskytnut vám, abyste jej mohli použít s programem knife. Vygenerováním nového páru klíčů přepíšete ten předchozí.
owner.settings.cargo.rebuild.description = Opětovné sestavení může být užitečné, pokud není index synchronizován s uloženými balíčky Cargo.
owner.settings.cargo.rebuild.no_index = Opětovné vytvoření selhalo, nebyl inicializován žádný index.
npm.dependencies.bundle = Přidružené závislosti
@ -3726,7 +3726,7 @@ secrets=Tajné klíče
description=Tejné klíče budou předány určitým akcím a nelze je přečíst jinak.
none=Zatím zde nejsou žádné tajné klíče.
creation=Přidat tajný klíč
creation.name_placeholder=nerozlišovat velká a malá písmena, pouze alfanumerické znaky nebo podtržítka, nemohou začínat na GITEA_ nebo GITHUB_
creation.name_placeholder=nerozlišovat velká a malá písmena, pouze alfanumerické znaky nebo podtržítka, nemohou začínat na GITEA_ nebo GITHUB_
creation.value_placeholder=Vložte jakýkoliv obsah. Mezery na začátku a konci budou vynechány.
creation.success=Tajný klíč „%s“ byl přidán.
creation.failed=Nepodařilo se přidat tajný klíč.

View file

@ -776,7 +776,7 @@ activate_email=Aktivierung senden
activations_pending=Aktivierung ausstehend
can_not_add_email_activations_pending=Es gibt eine ausstehende Aktivierung, versuche es in ein paar Minuten erneut, wenn du eine neue E-Mail hinzufügen möchtest.
delete_email=Löschen
email_deletion=E-Mail-Adresse löschen
email_deletion=E-Mail-Adresse entfernen
email_deletion_desc=Diese E-Mail-Adresse und die damit verbundenen Informationen werden von deinem Konto entfernt. Git-Commits von dieser E-Mail-Addresse bleiben unverändert. Fortfahren?
email_deletion_success=Die E-Mail-Adresse wurde entfernt.
theme_update_success=Deine Theme-Auswahl wurde gespeichert.
@ -1653,8 +1653,8 @@ issues.add_time=Zeit manuell hinzufügen
issues.del_time=Diese Zeiterfassung löschen
issues.add_time_short=Zeit hinzufügen
issues.add_time_cancel=Abbrechen
issues.add_time_history=`hat %s den Zeitaufwand hinzugefügt`
issues.del_time_history=`hat %s den Zeitaufwand gelöscht`
issues.add_time_history=`hat den Zeitaufwand von %s hinzugefügt`
issues.del_time_history=`hat den Zeitaufwand von %s gelöscht`
issues.add_time_hours=Stunden
issues.add_time_minutes=Minuten
issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben.
@ -3523,7 +3523,7 @@ mark_as_read=Als gelesen markieren
mark_as_unread=Als ungelesen markieren
mark_all_as_read=Alle als gelesen markieren
subscriptions=Abonnements
watching=Gefolgt
watching=Beobachtet
no_subscriptions=Keine Abonnements
[gpg]

View file

@ -49,7 +49,7 @@ webauthn_error_unable_to_process=Ο διακομιστής δεν μπόρεσε
webauthn_error_duplicated=Το κλειδί ασφαλείας δεν επιτρέπεται για αυτό το αίτημα. Βεβαιωθείτε ότι το κλειδί δεν έχει ήδη καταχωρηθεί.
webauthn_error_empty=Πρέπει να ορίσετε ένα όνομα για αυτό το κλειδί.
webauthn_error_timeout=Το χρονικό όριο έφτασε πριν το κλειδί να διαβαστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.
repository=Repository
repository=Αποθετήριο
organization=Οργανισμός
mirror=Αντίγραφο
new_mirror=Νέο είδωλο
@ -122,7 +122,7 @@ archived=Αρχειοθετήθηκε
concept_system_global=Γενικό
concept_user_individual=Ατομικό
concept_code_repository=Repository
concept_code_repository=Αποθετήριο
concept_user_organization=Οργανισμός
show_timestamps=Εμφάνιση χρονοσημάνσεων
@ -153,11 +153,11 @@ invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v
test = Τεστ
copy_generic = Αντιγραφή στο πρόχειρο
error413 = Έχετε εξαντλήσει τους διαθέσιμους πόρους σας.
new_repo.link = Νέο repository
new_repo.link = Νέο αποθετήριο
new_migrate.link = Νέα μεταφορά
new_org.link = Νέος οργανισμός
new_migrate.title = Νέα μεταφορά
new_repo.title = Νέο repository
new_repo.title = Νέο αποθετήριο
new_org.title = Νέος οργανισμός
copy_path = Αντιγραφή τοποθεσίας
@ -2028,8 +2028,8 @@ activity.git_stats_deletion_n=%d διαγραφές
contributors.contribution_type.commits=Υποβολές
settings=Ρυθμίσεις
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το repository
settings.options=Repository
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το αποθετήριο
settings.options=Αποθετήριο
settings.collaboration=Συνεργάτες
settings.collaboration.admin=Διαχειριστής
settings.collaboration.write=Εγγραφή
@ -2235,9 +2235,9 @@ settings.event_wiki_desc=Η σελίδα Wiki δημιουργήθηκε, μετ
settings.event_release=Κυκλοφορία
settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο.
settings.event_push=Push
settings.event_push_desc=Git push σε ένα repository.
settings.event_repository=Repository
settings.event_repository_desc=Το repository δημιουργήθηκε ή διαγράφηκε.
settings.event_push_desc=Git push σε ένα αποθετήριο.
settings.event_repository=Αποθετήριο
settings.event_repository_desc=Το αποθετήριο δημιουργήθηκε ή διαγράφηκε.
settings.event_header_issue=Συμβάντα ζητημάτων
settings.event_issues=Τροποιποίηση
settings.event_issues_desc=Το ζήτημα άνοιξε, έκλεισε, ανοίχθηκε εκ νέου ή επεξεργάστηκε.
@ -2305,7 +2305,7 @@ settings.packagist_api_token=Διακριτικό API
settings.packagist_package_url=URL πακέτων Packagist
settings.deploy_keys=Κλειδιά διάθεσης
settings.add_deploy_key=Προσθήκη κλειδιού διάθεσης
settings.deploy_key_desc=Τα κλειδιά διάθεσης έχουν πρόσβαση μόνο-ανάγνωσης στο repository.
settings.deploy_key_desc=Τα κλειδιά διάθεσης μπορούν να έχουν πρόσβαση μόνο-ανάγνωσης ή μόνο-εγγραφής στο αποθετήριο.
settings.is_writable=Ενεργοποίηση πρόσβασης εγγραφής
settings.is_writable_info=Επιτρέψτε σε αυτό το κλειδί διάθεσης να <strong>ωθήσει</strong> στο repository.
settings.no_deploy_keys=Δεν υπάρχουν ακόμα κλειδιά διάθεσης.
@ -3108,7 +3108,7 @@ packages.creator=Δημιουργός
packages.name=Όνομα
packages.version=Έκδοση
packages.type=Τύπος
packages.repository=Repository
packages.repository=Αποθετήριο
packages.size=Μέγεθος
packages.published=Δημοσιευμένα
@ -3415,7 +3415,7 @@ notices.inverse_selection=Αντιστροφή επιλογής
notices.delete_selected=Διαγραφή επιλεγμένων
notices.delete_all=Διαγραφή όλων των ειδοποιήσεων
notices.type=Τύπος
notices.type_1=Repository
notices.type_1=Αποθετήριο
notices.type_2=Εργασία
notices.desc=Περιγραφή
notices.op=Λειτ.
@ -3454,7 +3454,7 @@ monitor.duration = Διάρκεια (δ)
[action]
create_repo=δημιούργησε το αποθετήριο <a href="%s">%s</a>
rename_repo=μετονόμασε το repository από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
rename_repo=μετονόμασε το αποθετήριο από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
commit_repo=ώθησε στο <a href="%[2]s">%[3]s</a> του <a href="%[1]s">%[4]s</a>
create_issue=`άνοιξε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
close_issue=`έκλεισε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
@ -3466,7 +3466,7 @@ comment_issue=`άφησε σχόλιο στο ζήτημα <a href="%[1]s">%[3]s
comment_pull=`σχολίασε στο pull request <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request=`συγχώνευσε το pull request <a href="%[1]s">%[3]s#%[2]s</a>`
auto_merge_pull_request=`αυτόματη συγχώνευση του pull request <a href="%[1]s">%[3]s#%[2]s</a>`
transfer_repo=μετέφερε το repository <code>%s</code> σε <a href="%s">%s</a>
transfer_repo=μετέφερε το αποθετήριο <code>%s</code> σε <a href="%s">%s</a>
push_tag=ώθησε την ετικέτα <a href="%[2]s">%[3]s</a> σε <a href="%[1]s">%[4]s</a>
delete_tag=διέγραψε την ετικέτα %[2]s από <a href="%[1]s">%[3]s</a>
delete_branch=διέγραψε το κλάδο <code>%[2]s</code> από <a href="%[1]s">%[3]s</a>
@ -3765,7 +3765,7 @@ runners.task_list=Πρόσφατες εργασίες στον εκτελεστ
runners.task_list.no_tasks=Δεν υπάρχει καμία εργασία ακόμα.
runners.task_list.run=Εκτέλεση
runners.task_list.status=Κατάσταση
runners.task_list.repository=Repository
runners.task_list.repository=Αποθετήριο
runners.task_list.commit=Υποβολή
runners.task_list.done_at=Έτοιμο στις
runners.edit_runner=Επεξεργασία Εκτελεστή

View file

@ -1579,6 +1579,7 @@ issues.filter_poster = Author
issues.filter_poster_no_select = All authors
issues.filter_type = Type
issues.filter_type.all_pull_requests = All pull requests
issues.filter_type.all_issues = All issues
issues.filter_type.assigned_to_you = Assigned to you
issues.filter_type.created_by_you = Created by you
issues.filter_type.mentioning_you = Mentioning you

View file

@ -98,7 +98,7 @@ ok = Bone
download_logs = Elsuti protokolojn
unknown = Nekonata
issues = Eraroj
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong>, <strong>estis forigita</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong>, <strong>estas forigita</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
retry = Reprovi
activities = Aktivecoj
confirm_delete_selected = Konfirmi forigon de ĉiu elektito?
@ -142,9 +142,11 @@ new_org.link = Novan organizaĵon
error413 = Vi plenkonsumis vian kvoton.
twofa_scratch = Sukuranta kodo por duobla aŭtentikigo
copy_path = Kopii dosiervojon
[editor]
buttons.list.ordered.tooltip = Aldoni nombran liston
buttons.bold.tooltip = Aldoni grasan tekston
buttons.bold.tooltip = Aldoni grasan tekston (Ctrl+B / ⌘B)
buttons.quote.tooltip = Citi tekston
buttons.code.tooltip = Aldoni kodtekston
buttons.list.unordered.tooltip = Aldoni punktan liston
@ -154,7 +156,7 @@ buttons.ref.tooltip = Citi eraron aŭ tirpeton
buttons.list.task.tooltip = Aldoni liston de taskoj
buttons.enable_monospace_font = Ŝalti egallarĝan signoformaron
buttons.mention.tooltip = Mencii uzanton aŭ grupon
buttons.italic.tooltip = Aldoni oblikvan tekston
buttons.italic.tooltip = Aldoni oblikvan tekston (Ctrl+I / ⌘I)
buttons.link.tooltip = Aldoni ligilon
buttons.disable_monospace_font = Malsalti egallarĝan signoformaron
buttons.indent.tooltip = Krommarĝeni erojn je unu nivelo
@ -167,6 +169,10 @@ table_modal.label.rows = Horizontaloj
table_modal.label.columns = Vertikaloj
link_modal.description = Priskribo
link_modal.header = Aldoni ligilon
link_modal.url = Url
link_modal.paste_reminder = Aludo: kun URL en via tondujo, vi povas alglui senpere al la redaktilo por krei ligilon.
[aria]
navbar = Esplora breto
footer.software = Pri ĉi tiu programaro
@ -203,6 +209,8 @@ lightweight_desc = Forgejo ne penigos vian servilon, kaj eĉ ruleblas je Raspber
platform = Plursistema
license_desc = Ek, prenu <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejon</a>! Aliĝu kaj <a target="_blank" rel="noopener noreferrer" href="%[2]s">helpu</a> nin plibonigi la projekton. Ne timu kontribui!
platform_desc = Forgejo estas konfirmita ruli sur liberaj operaciumoj kiel Linukso kaj FreeBSD, kaj malsamaj arkitekturprocesoroj. Elektu tion, kion vi preferas.
[install]
title = Komenca agordado
install = Instalado
@ -311,7 +319,7 @@ enable_update_checker = Aktivigi novversian kontrolanton
password_algorithm = Pasvorthaketiga algoritmo
env_config_keys = Mediagordoj
invalid_password_algorithm = Malvalida pasvorthakeita algoritmo
password_algorithm_helper = Agordas la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
password_algorithm_helper = Agordu la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
internal_token_failed = Malsukcesis krei internan ĵetonon: %v
smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas
allow_only_external_registration = Permesi registriĝon nur per fremdaj servoj
@ -398,7 +406,7 @@ openid_register_title = Krei novan konton
email_domain_blacklisted = Vi ne povas registriĝi per via retpoŝtadreso.
verify = Konfirmi
oauth_signup_submit = Finfari konton
prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti vian retejestron por regajni aliron.
prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti la retejestron por regajni aliron.
openid_connect_desc = La elektita OpenID URI estas nekonata. Ligu ĝin al nova konto ĉi tie.
oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparoli la retejestron.
invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis.
@ -428,7 +436,7 @@ hint_login = Ĉu vi jam havas konton? <a href="%s">Salutu nun!</a>
hint_register = Ĉu vi bezonas konton? <a href="%s">Reĝistriĝi nun.</a>
sign_up_button = Reĝistriĝi nun.
sign_in_openid = Daŭrigi kun OpenID
back_to_sign_in = Reen en la saluton
back_to_sign_in = Reen en la ensaluton
use_onetime_code = Uzi unufojan kodon
[mail]
@ -484,7 +492,7 @@ password_change.text_1 = La pasvorto de via konto ĵus ŝanĝiĝis.
primary_mail_change.subject = Via ĉefa retpoŝtadreso ŝanĝiĝis
totp_disabled.text_1 = La tempobazita unufoja pasvorto (TOTP) en via konto ĵus malaktiviĝis.
admin.new_user.text = Bonvolu <a href="%s">klaki ĉi tie</a> por konduki ĉi tiun uzanton el la administranta agordilo.
removed_security_key.subject = Sekureca ŝlosilo estas forigita
removed_security_key.subject = Sekurŝlosilo estas forigita
removed_security_key.text_1 = La sekureca ŝlosilo "%[1]s" ĵus estas forigita de via konton.
totp_enrolled.text_1.has_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi povus uzi TOTP-n kiel 2FA metodo aŭ ajnan sekurecan ŝlosilon.
totp_enrolled.text_1.no_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi devos uzi TOTP-n kiel 2FA metodo.
@ -492,6 +500,13 @@ removed_security_key.no_2fa = Ne estas aliaj 2FA agorditaj metodoj, tio estas ke
totp_disabled.no_2fa = Ne estas plu aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti.
account_security_caution.text_1 = Se tio estis vi, vi povas sekure ignori ĉi tiun retmesaĝon.
account_security_caution.text_2 = Se ne estis vi, via konto estas kompromitata. Bonvolu kontakti la administrantojn de la retpaĝaro.
totp_enrolled.subject = Vi aktivigis TOTP-n kiel 2FA metodo
issue_assigned.pull = @%[1]s asignis al vi la tirpeton %[2]s en la deponejo %[3]s.
issue_assigned.issue = @%[1]s asignis al vi ĉi tiun eraron %[2]s en la deponejo %[3]s.
issue.action.review_dismissed = <b>@%[1]s</b> maldungis la lastan revizion de %[2]s por ĉi tiu tirpeto.
repo.transfer.subject_to_you = %s volas reposedigi la deponejon "%s" al vi
[form]
TeamName = Gruponomo
RepoName = Deponejonomo
@ -560,6 +575,16 @@ last_org_owner = Vi ne povas forigi la lastan uzanton de la «posendantoj» grup
still_has_org = "Via konto anas de almenaŭ unu organizaĵoj, forlasu ilin unue."
invalid_ssh_key = Ne povis konfirmi vian SSH-ŝlosilon: %s
FullName = Plena nomo
Description = Priskribo
Pronouns = Pronomoj
Biography = Biografio
Website = Retpaĝaro
Location = Kieo
To = Branĉonomo
AccessToken = Atingoĵetono
required_prefix = La enigaĵo devas komenciĝi per "%s"
[modal]
confirm = Konfirmi
no = Ne
@ -728,6 +753,91 @@ permission_write = Lega kaj Skriba
key_content = Enhavo
key_signature_gpg_placeholder = Komenciĝas per «-----BEGIN PGP SIGNATURE-----»
storage_overview = Stokada superrigardo
quota = Kvoto
pronouns = Pronomoj
pronouns_unspecified = Nespecifitaj
change_username_redirect_prompt.with_cooldown.one = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tago. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo.
change_username_redirect_prompt.with_cooldown.few = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tagoj. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo.
language.title = Defaŭlta lingvo
language.description = Ĉi tiu lingvo estos konservota en via konto kaj estos uzota kiel defaŭlta post kiam vi ensalutos.
language.localization_project = Helpu nin traduki Forgejo-n en via lingvo! <a href="%s">Lerni plu</a>.
hints = Sugestoj
update_hints = Ĝisdatigi la sugestojn
update_hints_success = La sugestoj ĝisdatiĝis.
hidden_comment_types.ref_tooltip = Komentoj, kie ĉi tiu eraro estas referencita de alia eraro/enmeto/…
comment_type_group_reference = Referenco
comment_type_group_milestone = Celo
comment_type_group_assignee = Asignito
comment_type_group_lock = Rigli staton
comment_type_group_review_request = Revizia peto
comment_type_group_issue_ref = Referenco de la eraro
keep_activity_private = Kaŝi la aktivecon de la profilpaĝo
keep_activity_private.description = Via <a href="%s">publika aktiveco</a> nur videblos al vi kaj la instancaj administrantoj.
enable_custom_avatar = Uzi propran profilbildon
change_password = Ŝanĝi pasvorton
keep_pronouns_private = Montri pronomojn nur al la aŭtentikigitaj uzantoj
keep_pronouns_private.description = Tio maskos viajn pronomojn kontraŭ neaŭtentikigitaj vizitantoj.
add_new_principal =
gpg_token_required = Vi devas disponigi signaturon por la malsupran ĵetono
gpg_token = Ĵetono
gpg_token_help = Vi povas generi signaturon uzante:
ssh_token_required = Vi devas disponigi signaturon for la malsupran ĵetono
ssh_token = Ĵetono
ssh_token_help = Vi povas generi signaturon uzante:
no_activity = Neniu ĵusa aktiveco
token_state_desc = Ĉi tiu ĵetono estis uzata dum la 7 lastaj tagoj
manage_access_token = Atingoĵetonoj
generate_new_token = Generi novan ĵetonon
token_name = Ĵetono-nomo
generate_token = Generi ĵetonon
generate_token_success = Via nova ĵetono estas generita. Kopiu ĝin nun, ĉar ĝi ne estos montrata ree.
access_token_deletion = Forigi atingoĵetonon
delete_token_success = La ĵetono estas forigita. Aplikaĵoj uzantaj ĝin ne atingos plu vian konton.
regenerate_token = Regeneri
access_token_regeneration = Regeneri atingoĵetonon
at_least_one_permission = Vi devas selekti almenaŭ unu permeson por krei ĵetonon
remove_oauth2_application = Forigi OAuth2-aplikaĵon
remove_oauth2_application_success = La aplikaĵo estas forigita.
create_oauth2_application = Krei novan OAuth2-aplikaĵon
create_oauth2_application_button = Krei aplikaĵon
create_oauth2_application_success = Vi sukcese kreis novan OAuth2 aplikaĵon.
update_oauth2_application_success = Vi sukcese ĝisdatigis la OAuth2 aplikaĵon.
oauth2_application_name = Aplikaĵonomo
save_application = Konservi
oauth2_client_id = Klienta ID
oauth2_client_secret = Klienta sekreto
oauth2_regenerate_secret = Regeneri sekreton
oauth2_regenerate_secret_hint = Ĉu vi perdis vian sekreton?
oauth2_application_edit = Redakti
authorized_oauth2_applications = Permesitaj OAuth2-aplikaĵoj
visibility = Uzanta videbleco
visibility.public = Publika
visibility.public_tooltip = Videbla al ĉiuj
visibility.limited = Limigata
visibility.limited_tooltip = Videbla nur al ensalutitaj uzantoj
visibility.private = Privata
visibility.private_tooltip = Videbla nur al membroj de organizaĵoj, kiujn vi aliĝis
blocked_since = Blokata ekde %s
user_unblock_success = La uzanto sukcese estas malblokita.
user_block_success = La uzanto sukcese estas blokita.
user_block_yourself = Vi ne povas bloki vin mem.
quota.applies_to_user = La sekvantaj kvotaj reguloj aplikiĝas al via konto
quota.applies_to_org = La sekvantaj kvotaj reguloj aplikiĝas al ĉi tiu organizaĵo
quota.rule.exceeded = Superita
quota.sizes.all = Ĉio
quota.sizes.repos.all = Deponejoj
quota.sizes.repos.public = Publikaj deponejoj
quota.sizes.repos.private = Privataj deponejoj
quota.sizes.git.all = Git-enhavo
quota.sizes.git.lfs = Git LFS
quota.sizes.assets.attachments.all = Kunsendaĵoj
quota.sizes.assets.attachments.issues = Kunsendaĵoj de eraro
quota.sizes.assets.attachments.releases = Kunsendaĵoj de eldono
quota.sizes.assets.artifacts = Artfaritaĵoj
quota.sizes.assets.packages.all = Pakaĵoj
quota.sizes.wiki = Vikio
[user]
form.name_reserved = La uzantonomo «%s» estas protektita.
joined_on = Aliĝis je %s
@ -756,6 +866,22 @@ block_user = Bloki uzanton
change_avatar = Ŝanĝi vian profilbildon…
activity = Publika aktiveco
followers.title.one = Sekvanto
followers.title.few = Sekvantoj
following.title.one = Sekvata
following.title.few = Sekvataj
followers_one = %d sekvanto
following_one = %d sekvataj
overview = Superrigardo
disabled_public_activity = Ĉi tiu uzanto malaktivigis la publikan videblecon de sia aktiveco.
public_activity.visibility_hint.self_public = Via aktiveco videblas al ĉiuj, escepte de interagoj en privataj spacoj. <a href="%s">Agordi</a>.
public_activity.visibility_hint.admin_public = Ĉi tiu aktiveco videblas al ĉiuj, sed kiel administranto vi povas ankaŭ vidi interagojn en privataj spacoj.
public_activity.visibility_hint.self_private = Via aktiveco nur videblas al vi kaj la instancaj administrantoj. <a href="%s">Agordi</a>.
public_activity.visibility_hint.admin_private = Ĉi tiu aktiveco videblas al vi ĉar vi estas administranto, sed la uzanto volas ke ĝi restu privata.
public_activity.visibility_hint.self_private_profile = Via aktiveco nur videblas al vi kaj la instancaj administrantoj, ĉar via profilo estas privata. <a href="%s">Agordi</a>.
form.name_pattern_not_allowed = La ŝablono "%s" ne estas permesata en uzantnomo.
[repo]
editor.add_file = Aldoni dosieron
settings.tags = Etikedoj
@ -803,6 +929,8 @@ settings.archive.text = Arĥivigi la deponejon igus ĝin sole legebla. Ĝi kaŝi
migrate_items_releases = Eldonoj
commits.commits = Enmetoj
rss.must_be_on_branch = Vi devas esti en branĉo por havi RSS-fluon.
[org]
code = Fontkodo
settings = Agordoj
@ -837,4 +965,27 @@ regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
fuzzy = Svaga
branch_kind = Serĉi disbranĉigojn…
runner_kind = Serĉi rulantojn…
pull_kind = Serĉi tirpetojn…
pull_kind = Serĉi tirpetojn…
[actions]
variables.creation.success = La variablo "%s" estas aldonita.
variables.update.failed = Ne eblas redakti la variablon.
variables.update.success = La variablo estas redaktita.
[projects]
deleted.display_name = Forigita projekto
type-1.display_name = Persona projekto
type-2.display_name = Deponejoprojekto
[git.filemode]
changed_filemode = %[1]s → %[2]s
directory = Dosierujo
normal_file = Normala dosiero
executable_file = Rulebla dosiero
symbolic_link = Simbola ligilo
submodule = Submodulo
[markup]
filepreview.line = Linio %[1]d en %[2]s
filepreview.lines = Linioj %[1]d ĝis %[2]d en %[3]s
filepreview.truncated = La superrigardo estas mallongigita

View file

@ -124,8 +124,8 @@ filter = Filter
filter.clear = Tühjenda filtrid
filter.is_archived = Arhiveeritud
filter.not_archived = Arhiveerimata
filter.is_fork = Koodiharud
filter.not_fork = Pole koodiharud
filter.is_fork =
filter.not_fork =
filter.is_mirror = Peegelpildid
filter.not_mirror = Pole peegelpilte
filter.is_template = Mallid
@ -186,7 +186,7 @@ contributions_one = kaastöö
[editor]
buttons.heading.tooltip = Lisa pealkiri
buttons.italic.tooltip = Lisa kaldkirjas tekst
buttons.italic.tooltip = Lisa kaldkirjas tekst (Ctrl+I / ⌘I)
buttons.quote.tooltip = Tsiteeri teksti
buttons.code.tooltip = Lisa kood
buttons.link.tooltip = Lisa link
@ -198,7 +198,7 @@ buttons.switch_to_legacy.tooltip = Selle asemel kasuta pärandredaktorit
buttons.enable_monospace_font = Kasuta püsisammkirja
buttons.disable_monospace_font = Lülita püsisammkiri välja
buttons.indent.tooltip = Liiguta objekte ühe taseme võrra
buttons.bold.tooltip = Lisa paks tekst
buttons.bold.tooltip = Lisa paks tekst (Ctrl+B / ⌘B)
buttons.mention.tooltip = Maini kasutajat või tiimi
buttons.unindent.tooltip = Võta tagasi objektide liigutamine ühe taseme võrra
buttons.new_table.tooltip = Lisa tabel
@ -352,6 +352,9 @@ Password = Salasõna
username_password_incorrect = Kassutajanimi või salasõna pole õige.
required_prefix = Sisendi alguses peab olema „&s“
To = Haru nimi
NewBranchName = Haru uus nimi
[settings]
retype_new_password = Korda uut salasõna
password_incorrect = Senine salasõna pole õige.
@ -360,6 +363,8 @@ update_password = Muuda salasõna
old_password = Senine salasõna
new_password = Uus salasõna
comment_type_group_branch = Koodiharu
[repo]
mirror_sync_on_commit = Sünkrooni sissekannete tegemisel
mirror_interval_invalid = Peegelpildi välp pole korrektne.
@ -371,7 +376,7 @@ mirror_password_help = Salvestatud salasõna kustutamiseks muuda kasutajanime.
mirror_address = Klooni võrguaadressilt
mirror_password_blank_placeholder = (Seadistamata)
commits.message = Sõnum
commits.search_all = Kõik harud
commits.search_all = Kõik koodiharud
commits.author = Autor
commits.browse_further = Sirvi edasi
commits.renamed_from = Nimi muudetud, vana nimi oli „%s“
@ -379,7 +384,7 @@ commits.date = Kuupäev
commits.older = Vanemad
commits.newer = Uuemad
commitstatus.error = Viga
commits.search_branch = See haru
commits.search_branch = See koodiharu
projects = Projektid
commitstatus.failure = Tõrge
commitstatus.pending = Ootel
@ -390,6 +395,32 @@ issues.choose.get_started = Alustame
issues.start_tracking_short = Käivita taimer
issues.filter_sort.feweststars = Kõike vähem tärne
rss.must_be_on_branch = RSS-voo jaoks pead asuma koodiharus.
all_branches = Kõik koodiharud
default_branch = Vaikimisi koodiharu
default_branch_label = vaikimisi
code.desc = Ligipääs lähtekoodile, failidele, sissekannetele ja koodiharudele.
filter_branch_and_tag = Filtreeri koodiharu või sildi alusel
branches = Koodiharud
n_branch_one = %s koodiharu
n_branch_few = %s koodiharu
commit_graph.select = Vali koodiharud
commit.contained_in_default_branch = See sissekanne on vaikimisi koodiharu osa
editor.new_branch_name_desc = Koodiharu uus nimi…
commits.nothing_to_compare = Need koodiharud on võrdsed.
issues.no_ref = Ühtegi koodiharu/silti pole määratud
pulls.merged_info_text = Koodiharu %s võid nüüd kustutada.
pulls.update_branch_success = Koodiharu uuendamine õnnestus
pulls.update_not_allowed = Sul pole õigust koodiharu uuendada
pull.deleted_branch = (kustutatud):%s
settings.branches.update_default_branch = Uuenda vaikimisi koodiharu
settings.branches.add_new_rule = Lisa uus reegel
settings.event_create_desc = Koodiharu või silt on loodud.
settings.event_delete_desc = Koodiharu või silt on kustutatud.
settings.branches = Kooduharud
settings.protected_branch.save_rule = Salvesta reegel
settings.protected_branch.delete_rule = Kustuta reegel
[actions]
variables = Muutujad
variables.deletion = Eemalda muutuja

View file

@ -1 +1,142 @@
[common]
home = Etxea
dashboard = Aginte-taula
explore = Esploratu
help = Laguntza
logo = Logoa
sign_in = Hasi saioa
sign_in_with_provider = Hasi saioa %s-ekin
sign_in_or = Edo
sign_out = Saioa itxi
sign_up = Erregistratu
link_account = Lotu kontua
register = Erregistratu
version = Bertsioa
powered_by = %s-k bultzatuta
page = Orria
notifications = Jakinarazpenak
create_new = Sortu…
user_profile_and_more = Profila eta ezarpenak…
signed_in_as = Erabilitako saio-izena
enable_javascript = Web-orrialde honek JavaScript behar du.
toc = Edukien taula
licenses = Lizentziak
return_to_forgejo = Itzuli Forgejora
toggle_menu = Menua ezkutatu/erakutsi
more_items = Item gehiago
username = Erabiltzailea
email = Email helbidea
password = Pasahitza
access_token = Sarbide-tokena
re_type = Berretsi pasahitza
captcha = CAPTCHA
twofa = Bi faktoreko autentifikazioa
twofa_scratch = Bi faktoreko marradura-kodea
passcode = Pasakodea
webauthn_insert_key = Sartu zure segurtasun-gakoa
webauthn_sign_in = Sakatu botoia zure segurtasun-gakoan. Zure segurtasun-gakoak ez badu botoirik, sartu berriro.
webauthn_press_button = Mesedez, sakatu botoia zure segurtasun-gakoan…
webauthn_use_twofa = Erabili zure telefonoko bi faktoreko kodea
webauthn_error = Ezin izan da irakurri zure segurtasun-gakoa.
webauthn_unsupported_browser = Zure nabigatzaileak ez du WebAuthn onartzen.
webauthn_error_unknown = Akats ezezagun bat gertatu da. Mesedez, saiatu berriro.
webauthn_error_insecure = WebAuthnek konexio seguruak baino ez ditu onartzen. HTTP bidez probatzeko, "localhost" edo "127.0.0.1" jatorria erabil daiteke
webauthn_error_unable_to_process = Zerbitzariak ezin izan du zure eskaera prozesatu.
webauthn_error_duplicated = Segurtasun-gakorik ez da onartzen eskaera honetarako. Mesedez, ziurtatu giltza ea dagoela erregistratuta.
webauthn_error_empty = Gako honetarako izen bat jarri behar duzu.
webauthn_error_timeout = Zure gakoa irakurri aurretik denbora-muga gainditu da. Kargatu berriro orrialde hau eta saiatu berriro.
repository = Biltegia
new_fork = Biltegi-adar berria
new_project_column = Zutabe berria
admin_panel = Lekuaren kudeaketa
settings = Ezarpenak
your_profile = Profila
your_starred = Izardunak
your_settings = Ezarpenak
new_repo.title = Biltegi berria
new_migrate.title = Migrazio berria
new_org.title = Erakunde berria
new_repo.link = Biltegi berria
new_migrate.link = Migrazio berria
new_org.link = Erakunde berria
all = Dena
sources = Iturriak
mirrors = Ispiluak
collaborative = Elkarlanean
forks = Adarrak
activities = Jarduerak
issues = Arazoak
milestones = Mugarriak
ok = Ados
cancel = Utzi
retry = Saiatu berriro
rerun = Berriz exekutatu
rerun_all = Berriz exekutatu lan guztiak
save = Gorde
add = Gehitu
add_all = Gehitu guztiak
remove = Kendu
remove_all = Kendu guztiak
remove_label_str = Kendu "%s" itema
edit = Editatu
view = Ikusi
enabled = Gaituta
disabled = Ezgaituta
locked = Blokeatuta
copy = Kopiatu
copy_url = Kopiatu URLa
copy_hash = Kopiatu hasha
copy_path = Kopiatu bidea
copy_content = Kopiatu edukia
copy_branch = Kopiatu adarraren izena
copy_success = Kopiatuta!
copy_error = Kopiatzeak huts egin du
copy_type_unsupported = Ezin da kopiatu artxibo mota hau
write = Idatzi
preview = Aurreikusi
loading = Kargatzen…
error = Akatsa
error404 = Ikusi nahi duzun orria <strong>ez da existitzen</strong>, <strong>ezabatu egin da</strong> edo <strong>ez duzu baimenik</strong> ikusteko.
error413 = Kuota agortu duzu.
go_back = Joan Atzera
invalid_data = Datu baliogabeak: %v
never = Inoiz ez
unknown = Ezezaguna
rss_feed = RSS jarioa
pin = Finkatu
unpin = Kendu
artifacts = Artefaktuak
confirm_delete_artifact = Ziur zaude ezabatu nahi duzula "%s" artefaktua?
archived = Artxibatuta
concept_system_global = Globala
concept_user_individual = Banakakoa
concept_code_repository = Biltegia
concept_user_organization = Erakundea
show_timestamps = Erakutsi denbora-zigiluak
show_log_seconds = Erakutsi segundoak
show_full_screen = Pantaila osoa erakutsi
download_logs = Deskargatu logak
confirm_delete_selected = Baieztatzen duzu aukeratutako itemak ezabatu nahi dituzula?
name = Izena
value = Balioa
filter = Filtroa
filter.clear = Kendu filtroak
filter.is_archived = Artxibatuta
filter.not_archived = Ez artxibatuta
filter.is_fork = Adarrak
filter.not_fork = Adarrik ez
filter.is_mirror = Ispiluak
filter.not_mirror = Ispilurik ez
filter.is_template = Txantiloiak
filter.not_template = Txantiloirik ez
filter.public = Publikoa
filter.private = Pribatua
[search]
search = Bilatu…
type_tooltip = Bilatzeko modua
repo_kind = Bilatu biltegiak…
user_kind = Bilatu erabiltzaileak…
org_kind = Bilatu erakundeak…
team_kind = Bilatu taldeak…
code_kind = Bilatu kodea…

View file

@ -40,7 +40,7 @@ webauthn_use_twofa=Käytä kaksivaihesta todennusta puhelimestasi
webauthn_error=Turva-avainta ei voitu lukea.
webauthn_unsupported_browser=Selaimesi ei tällä hetkellä tue WebAuthnia.
webauthn_error_unknown=Tuntematon virhe. Yritä uudelleen.
webauthn_error_insecure=WebAuthn tukee vain suojattuja yhteyksiä. Testatessa HTTP-yhteydellä voit käyttää osoitetta "localhost" tai "127.0.0.1"
webauthn_error_insecure=WebAuthn tukee vain turvallisia yhteyksiä. Testaamista varten HTTP-välityksellä voit käyttää alkuperää "localhost" tai "127.0.0.1"
webauthn_error_unable_to_process=Palvelin ei pystynyt käsittelemään pyyntöä.
webauthn_error_duplicated=Turva-avainta ei ole sallittu tässä pyynnössä. Varmista, ettei avainta ole jo rekisteröity.
webauthn_error_empty=Sinun täytyy asettaa nimi tälle avaimelle.
@ -848,7 +848,7 @@ twofa_enroll=Ota kaksivaiheinen todennus käyttöön
twofa_disabled=Kaksivaiheinen todennus on otettu pois käytöstä.
scan_this_image=Skannaa tämä kuva todennussovelluksellasi:
or_enter_secret=Tai kirjoita salainen avain: %s
twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen todennus. Ota kertakäyttöinen palautusavain (%s) talteen turvalliseen paikkaan, sillä se näytetään vain kerran!
twofa_enrolled=Tilisi on otettu mukaan onnistuneesti. Säilytä kertakäyttöistä palautusavainta (%s) turvallisessa paikassa, sillä sitä ei enää näytetä.
webauthn_nickname=Nimimerkki
@ -963,7 +963,7 @@ quota.sizes.assets.attachments.all = Liitteet
quota.applies_to_user = Seuraavia kiintiösääntöjä sovelletaan tiliisi
user_block_yourself = Et voi estää itseäsi.
quota = Kiintiö
storage_overview = Tallennustilan yleisnäkymä
storage_overview = Tallennustilan yhteenveto
quota.applies_to_org = Seuraavia kiintiösääntöjä sovelletaan tähän organisaatioon
quota.rule.exceeded = Ylitetty
quota.rule.no_limit = Rajoittamaton
@ -1013,6 +1013,8 @@ ssh_principal_deletion_success = Prinsipaali on poistettu.
principal_state_desc = Tätä prinsipaalia on käytetty viimeisen seitsemän päivän aikana
regenerate_token_success = Poletti on luotu uudelleen. Sovellukset, jotka käyttivät polettia, eivät enää pääse tilillesi. Kyseiset sovellukset tulee päivittää uudella poletilla.
quota.sizes.assets.all = Resurssit
[repo]
owner=Omistaja
owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu.
@ -1072,7 +1074,7 @@ migrate_items_pullrequests=Vetopyynnöt
migrate_items_releases=Julkaisut
migrate_repo=Suorita tietovaraston migraatio
migrate.clone_address=Migraatio/kloonaus URL-osoitteesta
migrate.github_token_desc=Voit laittaa yhden tai useamman pääsypoletin pilkulla erotellen tähän nopeuttaaksesi migraatiota GitHubin rajapinnan tahtirajojen takia. VAROITUS: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan ehtoja ja johtaa tilin estämiseen.
migrate.github_token_desc=Voit lisätä tähän yhden tai useamman tunnuksen pilkuilla erotettuna nopeuttaaksesi migraatiota kiertämällä GitHub API:n nopeusrajoituksen. Varoitus: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan käytäntöä ja johtaa tiliesi sulkemiseen.
migrate.permission_denied=Paikallisten tietovarastojen tuominen ei ole sallittua.
migrate.failed=Migraatio epäonnistui: %v
migrate.migrate_items_options=Lisäkohteiden migraatiota varten vaaditaan pääsypoletti
@ -1081,7 +1083,7 @@ migrate.migrating_failed=Migraatio lähteestä <b>%s</b> epäonnistui.
migrate.migrating_git=Suoritetaan Git-datan migraatiota
mirror_from=peili kohteelle
forked_from=forkattu lähteestä
forked_from=forkattu tietovarastosta
unwatch=Lopeta tarkkailu
watch=Tarkkaile
unstar=Poista tähti
@ -1117,7 +1119,7 @@ file_permalink=Pysyväislinkki
video_not_supported_in_browser=Selaimesi ei tue HTML5:n video-tagia.
audio_not_supported_in_browser=Selaimesi ei tue HTML5:n audio-tagia.
blame=Blame
blame=Syyllistynyt
download_file=Lataa tiedosto
normal_view=Normaali näkymä
line=rivi
@ -1180,7 +1182,7 @@ projects.open=Avaa
projects.close=Sulje
issues.desc=Ongelmien, tehtävien ja merkkipaalujen hallinta.
issues.filter_assignees=Suodata käyttäjiä
issues.filter_assignees=Suodata vastuuhenkilö
issues.filter_milestones=Suodata merkkipaalu
issues.new=Uusi ongelma
issues.new.labels=Nimilaput
@ -1215,7 +1217,7 @@ issues.self_assign_at=`itse otti tämän käsittelyyn %s`
issues.change_title_at=`muutti otsikon <b><strike>%s</strike></b> otsikoksi <b>%s</b> %s`
issues.delete_branch_at=`poisti haaran <b>%s</b> %s`
issues.filter_label=Nimilappu
issues.filter_label_exclude=`Käytä <code>alt</code> + <code>napsautus/rivinvaihto</code> poissulkeaksesi nimilappuja`
issues.filter_label_exclude=Käytä <kbd>Alt</kbd> + <kbd>Click</kbd>-näppäinyhdistelmää nimiöiden poissulkemiseksi
issues.filter_label_no_select=Kaikki nimilaput
issues.filter_milestone=Merkkipaalu
issues.filter_project=Projekti
@ -1264,9 +1266,9 @@ issues.close_comment_issue=Kommentoi ja sulje
issues.reopen_issue=Avaa uudelleen
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
issues.create_comment=Kommentoi
issues.closed_at=`sulki tämän ongelman %s`
issues.reopened_at=`uudelleenavasi tämän ongelman %s`
issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s`
issues.closed_at=`sulki tämän tukipyynnön %s`
issues.reopened_at=`avasi tämän tukipyynnön uudelleen %s`
issues.commit_ref_at=`viittasi tähän tukipyyntöön sitoumuksesta %s`
issues.author=Tekijä
issues.role.owner=Omistaja
issues.role.member=Jäsen
@ -1547,7 +1549,7 @@ settings.web_hook_name_larksuite_only =Lark Suite
settings.web_hook_name_packagist=Packagist
settings.deploy_keys=Toimitusavaimet
settings.add_deploy_key=Lisää toimitusavain
settings.deploy_key_desc=Toimitusavaimilla on pelkkä lukuoikeus tietovarastoon.
settings.deploy_key_desc=Käyttöönottoavaimilla voi olla vain luku- tai luku-kirjoitusoikeudet tietovarastoon.
settings.is_writable_info=Salli tämän toimitusavaimen <strong>työntää</strong> tietovarastoon.
settings.no_deploy_keys=Toimitusavaimia ei ole käytössä vielä.
settings.title=Otsikko
@ -1586,7 +1588,7 @@ settings.archive.header=Arkistoi tämä tietovarasto
settings.archive.tagsettings_unavailable=Tagi-asetukset eivät ole käytettävissä arkistoiduissa tietovarastoissa.
settings.lfs=LFS
settings.lfs_filelist=Tähän tietovarastoon tallennetut LFS-tiedostot
settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän tietovarastoon.
settings.lfs_no_lfs_files=Tähän tietovarastoon ei ole tallennettu LFS-tiedostoja
settings.lfs_findcommits=Etsi kommitteja
settings.lfs_lfs_file_no_commits=Tälle LFS-tiedostolle ei löytynyt kommitteja
settings.lfs_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa
@ -2148,7 +2150,7 @@ issues.add_label = lisäsi nimilapun %s %s
issues.due_date_added = lisäsi eräpäivän %s %s
issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s
issues.ref_pull_from = `<a href="%[2]s">viittasi tähän vetopyyntöön %[3]s</a> %[1]s`
pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s`
pulls.commit_ref_at = `viittasi tähän vetopyyntöön sitoumuksesta %s`
issues.review.comment = katselmoi %s
issues.add_labels = lisäsi nimilaput %s %s
issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s
@ -2329,9 +2331,9 @@ wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ova
pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty:
pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia
pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä
pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s`
pulls.reopened_at = `avasi tämän vetopyynnön uudelleen %s`
pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat
signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa.
signing.wont_sign.error = Tapahtui virhe tarkistettaessa, voiko sitoumus allekirjoittaa.
signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa.
pulls.data_broken = Tämä vetopyyntö on rikki johtuen puuttuvasta forkkitiedosta.
pulls.files_conflicted = Tämä vetopyyntö sisältää muutoksia, jotka ovat ristiriidassa kohdehaaran kanssa.
@ -2545,6 +2547,21 @@ settings.protected_branch_required_rule_name = Vaadittu säännön nimi
issues.pin_comment = kiinnitti tämän %s
issues.unpin_comment = poist tämän kiinnityksen %s
issues.review.content.empty = Sinun täytyy jättää kommentti, joka kuvaa pyydettyjä muutoksia.
comment.blocked_by_user = Kommentointi ei ole mahdollista, koska tietovaraston omistaja tai tekijä on estänyt sinut.
pulls.nothing_to_compare_have_tag = Valitut haarat/tagit ovat yhtäläiset.
ambiguous_runes_header = `Tämä tiedosto sisältää tulkinnanvaraisia Unicode-merkkejä`
ambiguous_runes_line = `Tällä rivillä on tulkinnanvaraisia Unicode-merkkejä`
ambiguous_character = `%[1]c [U+%04[1]X] on mahdollista sekoittaa merkkiin %[2]c [U+%04[2]X]`
commitstatus.failure = Epäonnistui
commitstatus.success = Onnistui
projects.deletion_desc = Projektin poistaminen poistaa sen kaikilta siihen liittyviltä ongelmilta. Jatketaanko?
issues.lock.unknown_reason = Ongelmaa ei voi lukita tuntemattomalla syyllä.
issues.unlock_error = Ongelmaa, jota ei ole lukittu, ei voi avata lukituksesta.
[graphs]
component_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe.
@ -3051,7 +3068,7 @@ auths.attribute_username_placeholder = Jätä tyhjäksi käyttääksesi Forgejo:
auths.oauth2_authURL = Valtuutuksen URL-osoite
auths.new_success = Todennus "%s" on lisätty.
users.still_own_repo = Tämä käyttäjä omistaa yhden tai useamman tietovaraston. Poista tai siirrä nämä tietovarastot ensin.
dashboard.cleanup_hook_task_table = Siivoa hook_task-taulu
dashboard.cleanup_hook_task_table = Siivoa koukku -_tehtävätaulukko
dashboard.delete_old_actions = Poista kaikki vanhat aktiviteetit tietokannasta
auths.attribute_mail = Sähköpostiosoitteen attribuutti
auths.attribute_ssh_public_key = Julkisen SSH-avaimen attribuutti
@ -3119,7 +3136,7 @@ dashboard.resync_all_sshprincipals = Päivitä ".ssh/authorized_principals"-tied
create_repo=loi tietovaraston <a href="%s">%s</a>
rename_repo=asetti tietovaraston <code>%[1]s</code> uudeksi nimeksi <a href="%[2]s">%[3]s</a>
transfer_repo=siirsi tietovaraston <code>%s</code> käyttäjälle <a href="%s">%s</a>
push_tag=työnsi tagin <a href="%[2]s">%[3]s</a> kohteeseen <a href="%[1]s">%[4]s</a>
push_tag=työnsi tagin <a href="%[2]s">%[3]s</a> tietovarastoon <a href="%[1]s">%[4]s</a>
delete_tag=poisti tagin %[2]s kohteesta <a href="%[1]s">%[3]s</a>
compare_commits_general=Vertaa kommitteja
create_branch=loi haaran <a href="%[2]s">%[3]s</a> tietovarastossa <a href="%[1]s">%[4]s</a>
@ -3143,6 +3160,8 @@ approve_pull_request = `hyväksyi <a href="%[1]s">%[3]s#%[2]s</a>`
starred_repo = lisäsi tähden tietovarastolle <a href="%[1]s">%[2]s</a>
reject_pull_request = `ehdotti muutoksia kohteeseen <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release = `julkaisi <a href="%[2]s">%[4]s</a> tietovarastossa <a href="%[1]s">%[3]s</a>`
[tool]
now=nyt
1s=1 sekunti
@ -3233,7 +3252,7 @@ helm.install = Asenna paketti komennolla:
owner.settings.chef.keypair = Luo avainpari
settings.delete.error = Paketin poistaminen epäonnistui.
requirements = Vaatimukset
published_by_in = Julkaistu %[1]s, julkaisija <a href="%[2]s">%[3]s</a> projektissa <a href="%[4]s"><strong>%[5]s</strong></a>
published_by_in = Julkaistu %[1]s, julkaisija <a href="%[2]s">%[3]s</a> tietovarastossa <a href="%[4]s"><strong>%[5]s</strong></a>
pypi.requires = Vaatii Pythonin
alpine.install = Asenna paketti seuraavalla komennolla:
debian.repository.components = Komponentit
@ -3356,6 +3375,8 @@ conda.registry = Määritä tämä rekisteri Conda-tietovarastoksi <code>.condar
container.labels = Nimilaput
settings.link.description = Jos linkität paketin tietovarastoon, paketti listataan tietovaraston pakettilistalla.
assets = Resurssit
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
deletion = Poista salaisuus
@ -3523,4 +3544,4 @@ wiki.write = <b>Kirjoita:</b> Luo, päivitä ja poista integroidun wikin sivuja.
filepreview.truncated = Esikatselu on typistetty
[translation_meta]
test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :) :) :)
test = Tämä on testimerkkijono. Sitä ei näytetä Forgejo-käyttöliittymässä, mutta sitä käytetään testaustarkoituksiin. Voit vapaasti kirjoittaa "selvä" säästääksesi aikaa (tai käyttää hauskaa faktaa) ja saavuttaaksesi sen makean 100 %:n valmistumisrajan :)

View file

@ -3916,4 +3916,4 @@ issues.write = <b>Écrire :</b> Fermer des tickets et gérer les métadonnées t
pulls.read = <b>Lire :</b> Lire et créer des demandes de tirage.
[translation_meta]
test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-)
test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-

View file

@ -7,7 +7,7 @@ logo = Logo
sign_in = Iniciar sesión
sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou
sign_out = Pechar Sesión
sign_out = Pechar sesión
sign_up = Rexistrarse
link_account = Vincular conta
register = Rexistro
@ -44,7 +44,7 @@ repository = Repositorio
organization = Organización
mirror = Espello
new_mirror = Novo Espello
new_fork = Nova Bifurcación do Repositorio
new_fork = Nova bifurcación do repositorio
new_project = Novo proxecto
new_project_column = Nova columna
admin_panel = Administración da páxina

View file

@ -139,6 +139,10 @@ confirm_delete_artifact = למחוק את הארטיפקט "%s"?
toggle_menu = הצגת\הסתרת תפריט
re_type = סיסמה (שוב)
tracked_time_summary = סיכום זמן מעקב בהתבסס על מסננים של רשימת סוגיות
webauthn_use_twofa = השתמש בקוד אימות דו־שלבי מהטלפון שלך
error413 = מיצית את ההגבלה שלך.
[search]
search = חיפוש...
type_tooltip = סוג חיפוש
@ -466,7 +470,7 @@ uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה.
[repo]
new_advanced = הגדרות מתקדמות
new_advanced_expand =
new_advanced_expand =
owner = בעלים
repo_name = שם הקרפיף
repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים.

View file

@ -224,4 +224,99 @@ confirm_password = पासवर्ड पक्का करें
admin_email = ईमेल एड्रेस
config_location_hint = ये सञ्चालन के तरीके यहाँ सेव होंगे :
install_btn_confirm = इनस्टॉल फॉरगेजो
test_git_failed = git कमांड टेस्ट नहीं हुई: %v
test_git_failed = git कमांड टेस्ट नहीं हुई: %v
sqlite3_not_available = इस फॉरगेजो के वर्शन में SQLite३ नहीं है। कृपया डाउनलोड करें बाइनरी वर्शन यहाँ से %s (“gobuild” वर्शन नहीं करें)।
invalid_db_setting = ये डेटाबेस सेटिंग्स मान्य नहीं हैं %v
invalid_db_table = डेटाबेस टेबल “%s” मान्य नहीं: %v
invalid_repo_path = इस रिपॉजिटरी की मूल पथ मान्य नहीं है: %v
invalid_app_data_path = एप्प की डाटा पथ अमान्य है: %v
run_user_not_match = “यूजर को ऐसे चलाएं” उसरनाम अभी का उसरनाम नहीं है: %s -> %s
internal_token_failed = अंदरूनी टोकन बना नहीं पाए: %v
secret_key_failed = गुप्त चाभी बना नहीं पाए: %v
save_config_failed = संरूपण को सेव नहीं कर पाए: %v
enable_update_checker_helper_forgejo = ये समय-समय पर चेक करेगा फॉरगेजो वर्शन नया है की नहीं TXT DNS रिकॉर्ड से यहाँ release.forgejo.org।
invalid_admin_setting = प्रशासक अकाउंट सेटिंग अमान्य है: %v
invalid_log_root_path = लॉग का रास्ता अमान्य है: %v
no_reply_address = गुप्त ईमेल डोमेन
no_reply_address_helper = डोमेन का नाम उसेर्स के गुप्त ईमेल पते से हैं। जैसे की, जब यूजर “जोई” लॉग करेगा Git पे “जोई@noreply.example.org” अगर गुप्त ईमेल पता पड़ा है “noreply.example.org”।
password_algorithm = पासवर्ड का हैश कलन विधि (algorithm)
invalid_password_algorithm = अमान्य पासवर्ड का हैश कलन विधि (algorithm)
password_algorithm_helper = पासवर्ड हैश अल्गोरिथम सेट करें। अल्गोरिथ्म्स की अलग-अलग ज़रूरतें और मज़बूतियाँ हैं। आर्गन2 अल्गोरिथम मज़बूत है पर मेमोरी ज़्यादा लेता है और छोटे सिस्टम्स के लिए सही नहीं होता।
enable_update_checker = अपडेट चेकर चालू करें
env_config_keys = पर्यावरण संरूपण
env_config_keys_prompt = पर्यावरण वेरिएबल्स को संरूपण फाइल पर भी लागू किया जायेगा:
[home]
uname_holder = उसरनाम या ईमेल एड्रेस
switch_dashboard_context = डैशबोर्ड का सन्दर्भ बदलें
my_repos = रेपोसिटोरिएस
my_orgs = संस्थाएं
view_home = व्यू: %s
filter = बाकी फिल्टर्स
filter_by_team_repositories = फ़िल्टर करें टीम रेपोसिट्रीज़ से
feed_of = फीड इसकी "%s"
show_archived = संग्रहीत
show_both_archived_unarchived = संग्रहीत और असंग्रहीत देखिए
show_only_archived = सिर्फ संग्रहीत देखिए
show_only_unarchived = सिर्फ असंग्रहीत देखिए
show_private = निजी
show_both_private_public = निजी और सार्वजनिक देखिए
show_only_private = सिर्फ निजी देखिए
show_only_public = सिर्फ सार्वजनिक देखिए
issues.in_your_repos = आपकी रेपोसिटोरिस में
[explore]
repos = रेपोसिटोरिस
users = उसेर्स
stars_one = %d सितारा
stars_few = %d सितारे
forks_one = %d फोर्क
forks_few = %d फोर्कस
organizations = संस्थाएं
go_to = जाएं इधर
code = कोड
code_last_indexed_at = आखरी संस्थापित %s
relevant_repositories_tooltip = रेपोसिटोरिस जो की फोर्क्स या जिनका शीर्षक नहीं है, आइकॉन नहीं और विश्लेषण नहीं गुप्त हैं।
relevant_repositories = सिर्फ इस काम की रेपोस्टिरिस दिखाई जा रहीं हैं. <a href="%s">बिना फ़िल्टर के रिजल्ट दिखाएं</a>।
[auth]
create_new_account = अकाउंट रजिस्टर करें
disable_register_prompt = रजिस्ट्रेशन खुला नहीं। कृपया साइट प्रशासक से बात करें।
disable_register_mail = ईमेल से रजिस्ट्रेशन पक्का करना बंद हैं अभी।
manual_activation_only = अपने साइट प्रशासक बात करें एक्टिवेशन पूरा करने के लिए।
remember_me = इस डिवाइस को याद रखें
forgot_password_title = पासवर्ड भूल गए
forgot_password = पासवर्ड भूल गए?
hint_login = पहले से अकाउंट है? <a href="%s">अभी सिग्न इन करें!</a>
hint_register = अकाउंट चाहिए? <a href="%s">रजिस्टर करें</a>
sign_up_button = अभी रजिस्टर करें।
sign_up_successful = अकाउंट बन गया है। स्वागत!
back_to_sign_in = sign in में फिर से जाएं
sign_in_openid = OpenID के साथ आगे बढ़ें
[mail]
link_not_working_do_paste = क्या कड़ी चल नहीं पाई? उसे कॉपी करके URL बार में जोड़ें।
hi_user_x = नमस्ते <b>%s</b>,
activate_account = कृपया अपना खाता चालू करें
activate_account.text_1 = नमस्ते <b>%[1]s</b>, संपादित करने के लिए शुक्रिया यहां %[2]s!
activate_account.text_2 = कृपया यहां की कड़ी को क्लिक करें अपने अकाउंट को चालू करने के लिए <b>%s</b>:
activate_email = अपना ईमेल एड्रेस पुख्ता करें
activate_email.text = कृपया इस कड़ी को क्लिक करें अपना अकाउंट पुख्ता करने के लिए <b>%s</b>:
admin.new_user.subject = नया यूजर %s अभी sign up हुआ
admin.new_user.user_info = यूजर की जानकारी
admin.new_user.text = कृपया <a href="%s"> क्लिक करें यहाँ </a> अपने यूजर को प्रशासक पैनल से चलाने के लिए।
register_notify = स्वागत है %s
register_notify.text_1 = ये आपका रजिस्टर्ड ईमेल पुख्ता करने के लिए है %s!
register_notify.text_2 = आप अपने अकाउंट में हस्ताक्षर कर सकते हैं इस उसर-नाम के साथ: %s
register_notify.text_3 = अगर किसी और ने आपका अकाउंट बनाया है, तो आपको चाहिए <a href="%s"> पासवर्ड संरक्षित करें </a> पहले।
reset_password = अपना अकाउंट निकाल पाएं
reset_password.text = अगर ये आप थे, कृपया इस कड़ी को क्लिक करें अपने अकाउंट को फिर से चालू करने को <b>%s</b>:
password_change.subject = आपका पासवर्ड बदला गया
password_change.text_1 = आपके अकाउंट का पासवर्ड बदला गया है।
primary_mail_change.subject = आपका प्राथमिक ईमेल बदला गया है
primary_mail_change.text_1 = आपका प्राथमिक ईमेल बदला गया है इससे %[1]s. यानी इस ईमेल एड्रेस से आप ईमेल अधिसूचना प्राप्त नहीं कर पाएंगे।
totp_disabled.subject = टीओटीपी रोक दिया गया
totp_disabled.text_1 = समय निर्धारित एक बार के पासवर्ड (टीओटीपी) आपके अकाउंट पर रोक दिया गया।
totp_disabled.no_2fa = और कोई 2FA के तरीके संचालित नहीं हैं, यानी आपके अकाउंट पर 2FA से लॉगिन की ज़रुरत नहीं होगी।
removed_security_key.subject = सुरक्षक चाभी हटाई गई
removed_security_key.text_1 = सुरक्षक चाभी "%[1]s" अभी-अभी आपके अकाउंट से हटाई गई।

View file

@ -7,7 +7,7 @@ sign_in=Masuk
sign_in_or=atau
sign_out=Keluar
sign_up=Daftar
link_account=Tautan Akun
link_account=Tautkan Akun
register=Daftar
version=Versi
powered_by=Diberdayakan oleh %s
@ -133,6 +133,10 @@ filter.not_archived = Tidak Diarsipkan
filter.public = Publik
filter.private = Pribadi
logo = Logo
sign_in_with_provider = Masuk menggunakan %s
active_stopwatch = Pelacak Waktu Aktif
[aria]
navbar = Bar Navigasi
footer = Footer

View file

@ -0,0 +1,7 @@
[common]
home = Dom
dashboard = Tablo
explore = Razvědati
help = Pomoč
logo = Logo
sign_in = Vhoditi

View file

@ -786,7 +786,7 @@ add_key=Aggiungi chiave
ssh_desc=Queste chiavi SSH pubbliche sono associate al tuo profilo. Le corrispondenti chiavi private consentono l'accesso completo ai tuoi progetti. Le chiavi SSH che sono state verificate possono essere usate per verificare commit Git firmati tramite SSH.
principal_desc=Queste entità di certificato SSH sono associate al tuo profilo e forniscono l'accesso completo ai tuoi repositori.
gpg_desc=Queste chiavi GPG pubbliche sono associate con il tuo profilo e sono usate per verificare i tuoi commit. Proteggi le tue chiavi private perché permettono di firmare i commit con la tua identità.
ssh_helper=<strong> Hai bisogno di aiuto?</strong> Dài un'occhiata alla guida per<a href="%s">creare le tue chiavi SSH </a> o risolvere quei <a href="%s"> problemi comuni </a> in cui potresti imbatterti utilizzando SSH.
ssh_helper=<strong> Hai bisogno di aiuto?</strong> Dai un'occhiata alla guida per <a href="%s">creare le tue chiavi SSH </a> o risolvere quei <a href="%s"> problemi comuni </a> in cui potresti imbatterti utilizzando SSH.
gpg_helper=<strong>Hai bisogno di aiuto?</strong> Dai un'occhiata alla guida di GitHub <a href="%s">riguardo il GPG</a>.
key_content_ssh_placeholder=Inizia con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com"
key_content_gpg_placeholder=Inizia con "-----BEGIN PGP PUBLIC KEY BLOCK-----"
@ -948,12 +948,12 @@ profile_desc = Su di te
email_desc = Il tuo indirizzo email principale sarà usato per inviarti notifiche, ripristino di password e, se non è stato nascosto, per le operazioni Git effettuate da web.
add_email_confirmation_sent = Una email di conferma è stata inviata a "%s". Verifica la posta in arrivo entro %s per confermare il tuo indirizzo email.
hidden_comment_types_description = I tipi di commenti spuntati qui non saranno mostrati nelle pagine delle segnalazioni. Per esempio, spuntare "Etichetta" rimuove tutti i commenti "<utente> ha aggiunto/rimosso <etichetta>".
hidden_comment_types.ref_tooltip = Commenti in cui questa issue è stata citata da un altra issue/commit/…
hidden_comment_types.ref_tooltip = Commenti in cui questa segnalazione è stata citata da un'altra segnalazione/commit/…
verify_ssh_key_success = La chiave SSH "%s" è stata verificata.
valid_until_date = Valido fino a %s
ssh_signonly = SSH è attualmente disabilitato quindi queste chiavi sono usate solo per la firma di verifica dei commit.
permission_write = Leggi e scrivi
access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie <a href="%[1]s" target="_blank">API</a>. Leggi la <a href="%[2]s" target="_blank">documentazione</a> per ulteriori informazioni.
access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle rotte <a href="%[1]s" target="_blank">API</a> corrispondenti. Leggi la <a href="%[2]s" target="_blank">documentazione</a> per ulteriori informazioni.
create_oauth2_application_success = Hai correttamente creato una nuova applicazione OAuth2.
update_oauth2_application_success = Hai correttamente aggiornato l'applicazione OAuth2.
oauth2_redirect_uris = URI per la reindirizzazione. Usa una nuova riga per ogni URI.
@ -981,7 +981,7 @@ oauth2_client_secret_hint = Il segreto non verrà mostrato nuovamente dopo che l
oauth2_application_remove_description = Rimuovere un'applicazione OAuth2 le impedirà di accedere a profili utenti autorizzati su questa istanza. Continuare?
oauth2_application_locked = Forgejo preregistra alcune applicazioni OAuth2 all'avvio, se abilitato nella configurazione. Per prevenire comportamenti imprevisti, queste non possono essere né modificate né rimosse. Fai riferimento alla documentazione di OAuth2 per ulteriori informazioni.
hooks.desc = Aggiungi richiami HTTP che saranno innescati per <strong>tutti i progetti</strong> che possiedi.
repos_none = Non possiedi alcun progetto.
repos_none = Non possiedi alcun repositorio.
blocked_users_none = Non ci sono utenti bloccati.
keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle richieste di modifica e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo.
verify_gpg_key_success = La chiave GPG "%s" è stata verificata.
@ -1147,7 +1147,7 @@ migrate_items_releases=Rilasci
migrate_repo=Migra repositorio
migrate.clone_address=Migra / Clona da URL
migrate.clone_address_desc=URL HTTP(S) o Git "clone" di un repositorio esistente
migrate.github_token_desc=È possibile mettere uno o più token con virgola separati qui per rendere la migrazione più veloce a causa del limite di velocità API GitHub. ATTENZIONE: L'abuso di questa funzione potrebbe violare la politica del fornitore di servizi e portare al blocco dell'account.
migrate.github_token_desc=È possibile mettere uno o più token con virgola separati qui per rendere la migrazione più veloce a causa del limite di richieste alle API GitHub. ATTENZIONE: L'abuso di questa funzione potrebbe violare la politica del fornitore di servizi e portare al blocco dell'utenza.
migrate.clone_local_path=o un percorso del server locale
migrate.permission_denied=Non è consentito importare repositori locali.
migrate.permission_denied_blocked=Non è possibile importare da host non consentiti, si prega di chiedere all'amministratore di controllare ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS impostazioni.
@ -1698,9 +1698,9 @@ pulls.rebase_conflict_summary=Messaggio di errore
pulls.unrelated_histories=Unione fallita: gli Head del ramo da unire e la base non condividono una storia cronologica in comune. Suggerimento: prova una strategia diversa
pulls.merge_out_of_date=Unione fallita: Durante la generazione del merge, la base è stata aggiornata. Suggerimento: Riprova.
pulls.head_out_of_date=Unione non riuscita: durante la generazione della fusione, la testa è stata aggiornata. Suggerimento: Riprova.
pulls.push_rejected=Immissione respinta. Rivedi gli hooks Git per questo progetto.
pulls.push_rejected=Immissione respinta. Rivedi gli hooks Git per questo repositorio.
pulls.push_rejected_summary=Messaggio Di Rifiuto Completo
pulls.push_rejected_no_message=Immissione respinta: nessun messaggio remoto. Controlla gli hooks di Git per questo progetto
pulls.push_rejected_no_message=Immissione respinta: nessun messaggio remoto. Controlla gli hooks di Git per questo repositorio
pulls.open_unmerged_pull_exists=`Non è possibile riaprire questa pull request perché ne esiste un'altra (#%d) con proprietà identiche.`
pulls.status_checking=Alcuni controlli sono in sospeso
pulls.status_checks_success=Tutti i controlli sono stati effettuati con successo
@ -1959,14 +1959,14 @@ settings.wiki_delete_desc=L'eliminazione dei dati della wiki del repository è p
settings.wiki_delete_notices_1=-Questa operazione eliminerà permanentemente e disabiliterà la wiki repository per %s.
settings.confirm_wiki_delete=Elimina dati wiki
settings.wiki_deletion_success=I dati della repository wiki sono stati eliminati.
settings.delete=Elimina questo progetto
settings.delete=Elimina questo repositorio
settings.delete_desc=L'eliminazione di un repository è un'operazione permanente e non può essere annullata.
settings.delete_notices_1=-Questa operazione <strong>NON PUÒ</strong> essere annullata.
settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repositorio <strong>%s</strong>, inclusi codice, segnalazioni commenti, dati della wiki e impostazioni collaboranti.
settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione.
settings.deletion_success=Il repository è stato eliminato.
settings.update_settings_success=Le impostazioni del repository sono state aggiornate.
settings.confirm_delete=Elimina progetto
settings.confirm_delete=Elimina repositorio
settings.add_collaborator=Aggiungi collaborante
settings.add_collaborator_success=Lə collaborante è statə aggiuntə.
settings.add_collaborator_inactive_user=Non posso aggiungere un*utente inattivə come collaborante.
@ -2019,7 +2019,7 @@ settings.event_desc=Innesco su:
settings.event_push_only=Immetti eventi
settings.event_send_everything=Tutti gli eventi
settings.event_choose=Eventi personalizzati…
settings.event_header_repository=Eventi del progetto
settings.event_header_repository=Eventi del repositorio
settings.event_create=Crea
settings.event_create_desc=Ramo o tag creato.
settings.event_delete=Elimina
@ -2094,7 +2094,7 @@ settings.packagist_api_token=API token
settings.packagist_package_url=Url pacchetto pacchetti
settings.deploy_keys=Chiavi di distribuzione
settings.add_deploy_key=Aggiungi chiave di distribuzione
settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository.
settings.deploy_key_desc=Le chiavi di distribuzione possono avere l'accesso in sola lettura o in lettura e scrittura al repositorio.
settings.is_writable=Abilita accesso scrittura
settings.is_writable_info=Permetti a questa deploy key di <strong>pushare</strong> nella repository.
settings.no_deploy_keys=Non sono ancora presenti deploy key.
@ -2162,8 +2162,8 @@ settings.chat_id=ID chat
settings.matrix.homeserver_url=URL Homeserver
settings.matrix.room_id=ID della stanza
settings.matrix.message_type=Tipo di messaggio
settings.archive.button=Archivia progetto
settings.archive.header=Archivia questo progetto
settings.archive.button=Archivia repositorio
settings.archive.header=Archivia questo repositorio
settings.archive.success=Il repo è stato archiviato con successo.
settings.archive.error=Si è verificato un errore durante il tentativo di archiviare il repo. Vedi il log per maggiori dettagli.
settings.archive.error_ismirror=Non puoi archiviare un mirror repo.
@ -2257,9 +2257,9 @@ releases.desc=Tenere traccia di versioni e download del progetto.
release.releases=Rilasci
release.detail=Dettagli rilascio
release.tags=Etichette
release.new_release=Nuovo Rilascio
release.new_release=Nuovo rilascio
release.draft=Bozza
release.prerelease=Pre-Rilascio
release.prerelease=Pre-rilascio
release.stable=Stabile
release.compare=Confronta
release.edit=modifica
@ -2274,8 +2274,8 @@ release.tag_helper=Scegli un tag esistente o crea un nuovo tag.
release.prerelease_desc=Contrassegna come pre-release
release.prerelease_helper=Contrassegna questa release come inadatta per l'uso di produzione.
release.cancel=Annulla
release.publish=Pubblica Rilascio
release.save_draft=Salva Bozza
release.publish=Pubblica rilascio
release.save_draft=Salva bozza
release.edit_release=Aggiorna release
release.delete_release=Elimina release
release.delete_tag=Elimina tag
@ -2412,10 +2412,10 @@ editor.new_branch_name = Dài un nome al nuovo ramo per questo commit
editor.branch_already_exists = C'è gia un ramo "%s" nel repositorio.
editor.directory_is_a_file = Il nome cartella "%s" è già usato come nome file in questo repositorio.
editor.file_is_a_symlink = `"%s" è un collegamento simbolico. I collegamenti simbolici non possono essere modificati nell'editor web`
editor.filename_is_a_directory = Il nome file "%s" è già usato come nome cartella in questo progetto.
editor.file_editing_no_longer_exists = Il file in modifica, "%s", non esiste più in questo progetto.
editor.file_deleting_no_longer_exists = Il file in eliminazione, "%s", non esiste più in questo progetto.
editor.file_already_exists = Un file chiamato "%s" esiste già in questo progetto.
editor.filename_is_a_directory = Il nome file "%s" è già usato come nome cartella in questo repositorio.
editor.file_editing_no_longer_exists = Il file in modifica, "%s", non esiste più in questo repositorio.
editor.file_deleting_no_longer_exists = Il file in eliminazione, "%s", non esiste più in questo repositorio.
editor.file_already_exists = Un file chiamato "%s" esiste già in questo repositorio.
editor.fail_to_update_file = Impossibile aggiornare/creare il file "%s".
editor.upload_file_is_locked = Il file "%s" è bloccato da %s.
editor.cannot_commit_to_protected_branch = Non si possono fare commit sul ramo protetto "%s".
@ -2462,8 +2462,8 @@ activity.navbar.pulse = Battito
activity.navbar.code_frequency = Frequenza del codice
activity.navbar.recent_commits = Commit recenti
contributors.contribution_type.filter_label = Tipi di contributo:
settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altra repo.
settings.mirror_settings.docs.no_new_mirrors = Il tuo progetto sta specchiando i cambiamenti a/da un altro progetto. Tieni a mente che non puoi creare nuovi specchi al momento.
settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altro repositorio.
settings.mirror_settings.docs.no_new_mirrors = Il tuo repositorio sta specchiando i cambiamenti a/da un altro repositorio. Tieni a mente che non puoi creare nuovi specchi al momento.
settings.mirror_settings.docs.can_still_use = Nonostante tu non possa modificare specchi esistenti o crearne di nuovi puoi comunque il tuo specchio esistente.
settings.mirror_settings.docs.pull_mirror_instructions = Per impostare uno specchio di prelievo consulta:
settings.mirror_settings.docs.doc_link_title = Come specchio progetti?
@ -2492,18 +2492,18 @@ branch.rename_branch_to = Rinomina "%s" come:
branch.new_branch_from = Crea nuovo ramo da "%s"
tag.create_tag_from = Crea nuova etichetta da "%s"
tag.create_success = L'etichetta "%s" è stata creata.
settings.unarchive.button = Disarchivia progetto
settings.unarchive.button = Disarchivia repositorio
release.tags_for = Etichette per %s
branch.delete = Elimina ramo "%s"
issues.role.first_time_contributor_helper = Questa non è il primo contributo di questo utente al progetto.
issues.role.contributor_helper = Questo utente ha precedentemente fatto commit al progetto.
issues.role.first_time_contributor_helper = Questo non è il primo contributo di questo utente al repositorio.
issues.role.contributor_helper = Questo utente ha precedentemente fatto commit in questo repositorio.
pulls.blocked_by_official_review_requests = Questa richiesta di modifica è bloccata perché manca l'approvazione di unə o più revisorɜ ufficiali.
pulls.blocked_by_changed_protected_files_1 = Questa richiesta di modifica è bloccata perché tocca un file protetto:
pulls.blocked_by_changed_protected_files_n = Questa richiesta di modifica è bloccata perché tocca file protetti:
pulls.has_merged = Errore: la richiesta di modifica è stata fusa, non puoi fonderla di nuovo o cambiarne il ramo di destinazione.
milestones.filter_sort.latest_due_date = Scadenza più lontana
settings.mirror_settings.docs = Imposta il tuo repo in modo che sincronizzi automaticamente commit, tag e rami con un altro repo.
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Imposta il tuo progetto in modo che immetta commit, etichette e rami in un altro progetto automaticamente. Gli specchi di prelievo sono stati disabilitati dall'amministratore del sito.
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Imposta il tuo progetto in modo che immetta commit, etichette e rami in un altro repositorio automaticamente. Gli specchi di prelievo sono stati disabilitati dall'amministratore del sito.
settings.mirror_settings.docs.disabled_push_mirror.info = Gli specchi di immissione sono stati disabilitati dall'amministratore del sito.
settings.mirror_settings.docs.more_information_if_disabled = Puoi scoprire di più riguardo specchi di prelievo e di immissione qui:
commits.view_path = Vista a questo punto nella cronologia
@ -2511,7 +2511,7 @@ issues.action_check_all = Seleziona/deseleziona tutti gli elementi
issues.num_comments_1 = %d commento
issues.no_content = Descrizione non fornita.
issues.unpin_issue = Sblocca segnalazione
new_repo_helper = Un repositorio contiene tutti i file, inclusa la cronologia delle revisioni. Ne hai già uno altrove? <a href="%s">Migra il progetto</a>.
new_repo_helper = Un repositorio contiene tutti i file, inclusa la cronologia delle revisioni. Ne hai già uno altrove? <a href="%s">Migra il repositorio</a>.
projects.card_type.images_and_text = Immagini e testo
object_format_helper = Formato oggetti del repositorio. Non può essere cambiato in seguito. SHA1 è il più compatibile.
editor.file_delete_success = Il file "%s" è stato eliminato.
@ -2521,7 +2521,7 @@ commits.renamed_from = Rinomina da %s
invisible_runes_description = `Questo file contiene caratteri Unicode invisibili che sono indistinguibili agli umani ma potrebbero essere processati diversamente da un computer. Se pensi che questo sia intenzionale puoi tranquillamente ignorare questo avviso. Usa il tasto Escape per rivelarli.`
issues.filter_type.reviewed_by_you = Revisionati da te
projects.edit_success = Il progetto "%s" è stato aggiornato.
issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto.
issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al repositorio.
pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s`
settings.thread_id = ID della discussione
release.title = Titolo del rilascio
@ -2544,7 +2544,7 @@ issues.choose.ignore_invalid_templates = I modelli non validi sono stati ignorat
issues.choose.invalid_templates = trovati %v modello/i non valido/i
issues.choose.invalid_config = La configurazione della segnalazione contiene errori:
issues.label_templates.fail_to_load_file = Impossibile caricare file di modello etichetta "%s": %v
issues.role.member_helper = questo utente è un membro dell'organizzazione che possiede questo progetto.
issues.role.member_helper = Questo utente è un membro dell'organizzazione che possiede questo repositorio.
issues.review.pending.tooltip = Questo commento non è attualmente visibile ad altri utenti. Per inviare il tuo commento in attesa selezione "%s" -> "%s/%s/%s" in cima alla pagina.
pulls.blocked_by_approvals = Questa richiesta di modifica non ha ancora un numero di approvazioni sufficienti. %d di %d approvazioni concesse.
pulls.blocked_by_rejection = Un revisore ufficiale ha richiesto dei cambiamenti su questa richiesta di modifica.
@ -2563,14 +2563,14 @@ settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sin
settings.units.units = Sezioni del repositorio
settings.units.add_more = Aggiungi ancora...
settings.wiki_globally_editable = Consenti a tutti di modificare la wiki
settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s.
settings.push_mirror_sync_in_progress = Immettendo cambiamenti al progetto remoto %s.
settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal repositorio remoto %s.
settings.push_mirror_sync_in_progress = Immettendo cambiamenti al repositorio remoto %s.
settings.update_mirror_settings = Aggiorna impostazioni dello specchio
settings.branches.switch_default_branch = Passa al ramo predefinito
settings.branches.add_new_rule = Aggiungi una nuova regola
settings.actions_desc = Abilita azioni del progetto
settings.actions_desc = Abilita pipeline CI/CD integrate con Forgejo Actions
settings.new_owner_blocked_doer = Il nuovo proprietario ti ha bloccato.
settings.update_settings_no_unit = Ili progetto dovrebbe consentire almeno qualche tipo di interazione.
settings.update_settings_no_unit = Il repositorio dovrebbe consentire almeno qualche tipo di interazione.
settings.add_collaborator_owner = Non si può aggiungere unə proprietariə come collaborante.
branch.delete_desc = L'eliminazione di un ramo è definitiva. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÒ essere annullata in molti casi. Continuare?
editor.invalid_commit_mail = Email invalida per creare un commit.
@ -2596,10 +2596,10 @@ branch.create_from = da "%s"
branch.create_success = Il ramo "%s" è stato creato.
branch.download = Scarica il ramo "%s"
branch.rename = Rinomina il ramo "%s"
issues.blocked_by_user = Non puoi creare una segnalazione su questo progetto perché sei bloccato dal proprietario.
settings.archive.text = Archiviare il progetto lo renderà unicamente di sola lettura. Sarà nascosto nel pannello di controllo. Nessuno (neanche tu!) potrai fare nuovi commit, o aprire segnalazioni o richieste di modifica.
settings.unarchive.header = Disarchivia questo progetto
settings.archive.mirrors_unavailable = Gli specchi non sono disponibile se il progetto è archiviato.
issues.blocked_by_user = Non puoi creare una segnalazione su questo repositorio perché sei bloccato dal proprietario.
settings.archive.text = Archiviare il repositorio lo renderà unicamente di sola lettura. Sarà nascosto nel pannello di controllo. Nessuno (neanche tu!) potrà fare nuovi commit, o aprire segnalazioni o richieste di modifica.
settings.unarchive.header = Disarchivia questo repositorio
settings.archive.mirrors_unavailable = Gli specchi non sono disponibili se il repositorio è archiviato.
issues.role.owner_helper = Questo utente è il proprietariə di questo progetto.
issues.label_exclusive_warning = Ogni etichetta in conflitto in un ambito sarà rimossa durante la modifica di un'etichetta di una segnalazione o di una richiesta di modifica.
pulls.show_changes_since_your_last_review = Mostra cambiamenti dalla tua ultima revisione
@ -2609,9 +2609,9 @@ settings.pulls.default_allow_edits_from_maintainers = Consenti modifica dai manu
settings.trust_model.committer.desc = Firme valide saranno etichettate "fidata" se corrispondo all'autore del commit, altrimenti saranno etichettate "non corrisponde". Questo costringe Forgejo ad esse l'autore dei commit firmati, con il vero autore etichettato con le sequenze Co-authored-by: e Co-commited-by: nel commit. La chiave predefinita di Forgejo deve corrispondere ad un utente nella base di dati.
signing.wont_sign.pubkey = Il commit non verrà firmato perché non hai una chiave pubblica associata al tuo profilo.
settings.releases_desc = Abilita rilasci nel repositorio
settings.unarchive.text = Disarchiviare il progetto ripristinerà la sua abilità di ricevere commit e immissioni, oltre che nuove segnalazioni e richieste di modifica.
settings.unarchive.success = Il progetto è stato disarchiviato correttamente.
settings.unarchive.error = Si è verificato un errore durante la disarchiviazione del progetto. Vedi il log per ulteriori dettagli.
settings.unarchive.text = Disarchiviare il repositorio ripristinerà la sua abilità di ricevere commit e immissioni, oltre che nuove segnalazioni e richieste di modifica.
settings.unarchive.success = Il repositorio è stato disarchiviato correttamente.
settings.unarchive.error = Si è verificato un errore durante la disarchiviazione del repositorio. Vedi il log per ulteriori dettagli.
release.title_empty = Il titolo non può essere vuoto.
release.releases_for = Rilasci per %s
diff.comment.add_line_comment = Aggiungi riga commento
@ -2620,7 +2620,7 @@ diff.hide_file_tree = Nascondi albero dei file
tag.ahead.target = a %s da questa etichetta
release.tag_helper_new = Nuovo tag. Questo tag sarà creato dalla destinazione.
release.tag_helper_existing = Tag esistente.
release.deletion_desc = La rimozione di un rilascio lo rimuove solo da Forgejo. Non influenza il tag Git, i contenuti del tuo progetto o la sua cronologia. Continuare?
release.deletion_desc = La rimozione di un rilascio lo rimuove soltanto da Forgejo. Non influenza il tag Git, i contenuti del tuo repositorio o la sua cronologia. Continuare?
branch.already_exists = Esiste già un ramo chiamato "%s".
settings.merge_style_desc = Modalità di fusione
settings.remove_protected_branch_failed = Impossibile rimuovere la regola di protezione del ramo "%s".
@ -2688,8 +2688,8 @@ project = Progetti
issues.edit.already_changed = Impossibile salvare le modifiche alla segnalazione. Sembra che il contenuto sia già stato modificato da un*altrə utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche
subscribe.pull.guest.tooltip = Accedi per iscriverti a questa richiesta di modifica.
subscribe.issue.guest.tooltip = Accedere per seguire questa segnalazione.
n_release_one = rilascio %s
n_release_few = rilasci %s
n_release_one = %s rilascio
n_release_few = %s rilasci
issues.author.tooltip.pr = Quest'utente è l'autorə di questa richiesta di modifica.
release.hide_archive_links = Nascondi automaticamente gli archivi generati
settings.federation_settings = Impostazioni di federazione
@ -2843,9 +2843,9 @@ settings.labels_desc=Aggiungi i webhooks che verranno attivati per <strong>tutti
members.membership_visibility=Visibilità appartenenza:
members.public=Visibile
members.public_helper=nascondi
members.public_helper=Nascondi
members.private=Nascosto
members.private_helper=rendi visibile
members.private_helper=Rendi visibile
members.member_role=Ruolo del membro:
members.owner=Proprietario
members.member=Membro
@ -2898,7 +2898,7 @@ form.name_pattern_not_allowed = La sequenza "%s" non è consentita nel nome di u
settings.change_orgname_prompt = Nota: cambiare il nome dell'organizzazione cambierà anche l'URL dell'organizzazione e libererà il vecchio nome.
teams.invite_team_member = Invita in %s
teams.invite_team_member.list = Inviti in sospeso
teams.add_nonexistent_repo = Il progetto che stai cercando di aggiungere non esiste, crealo prima.
teams.add_nonexistent_repo = Il repositorio che stai cercando di aggiungere non esiste, crealo prima.
teams.invite.title = Sei stato invitato ad unirti alla squadra <strong>%s</strong> nell'organizzazione <strong>%s</strong>.
teams.invite.by = Invitato da %s
teams.invite.description = Clicca il tasto sotto per entrare nella squadra.
@ -3023,7 +3023,7 @@ users.prohibit_login=Disattiva accesso
users.is_admin=È amministratore
users.is_restricted=È limitato
users.allow_git_hook=Può creare hook Git
users.allow_git_hook_tooltip=Gli hook Git sono eseguiti come l'utente OS che esegue Forgejo e avrà lo stesso livello di accesso host. Di conseguenza, gli utenti con questo speciale privilegio hook Git, possono accedere e modificare tutti i repository Forgejo e il database utilizzato da Forgejo. Di conseguenza sono anche in grado di ottenere privilegi di amministratore Forgejo.
users.allow_git_hook_tooltip=Gli hook Git sono eseguiti come l'utente OS che esegue Forgejo e avrà lo stesso livello di accesso host. Di conseguenza, gli utenti con questo speciale privilegio hook Git, possono accedere e modificare tutti i repositori Forgejo e il database utilizzato da Forgejo. Di conseguenza sono anche in grado di ottenere privilegi di amministratore Forgejo.
users.allow_import_local=Può importare progetti locali
users.allow_create_organization=Può creare organizzazioni
users.update_profile=Aggiorna profilo utente
@ -3068,7 +3068,7 @@ orgs.new_orga=Nuova organizzazione
repos.repo_manage_panel=Gestisci progetti
repos.unadopted=Progetti non adottati
repos.unadopted.no_more=Nessun repository non adottato trovato
repos.unadopted.no_more=Nessun repositorio non adottato trovato.
repos.owner=Proprietario
repos.name=Nome
repos.private=Privati
@ -3205,7 +3205,7 @@ config.disable_router_log=Disattivare log del router
config.run_user=Nome utente con cui eseguire
config.run_mode=Modalità di esecuzione
config.git_version=Versione Git
config.repo_root_path=Percorso radice del progetto
config.repo_root_path=Percorso radice del repositorio
config.lfs_root_path=Percorso radice LFS
config.log_file_root_path=Percorso dei log
config.script_type=Tipo di script
@ -3622,8 +3622,8 @@ rubygems.required.rubygems=Richiede la versione RubyGem
swift.registry=Configura questo registro dalla riga di comando:
settings.link=Collega questo pacchetto a un repository
settings.link.description=Se si collega un pacchetto a un repository, il pacchetto è elencato nell'elenco dei pacchetti del repository.
settings.link.select=Seleziona Repository
settings.link.button=Aggiorna Collegamento Repository
settings.link.select=Seleziona repositorio
settings.link.button=Aggiorna collegamento repositorio
settings.link.success=Il link del repository è stato aggiornato correttamente.
settings.link.error=Impossibile aggiornare il link del repository.
settings.delete=Elimina pacchetto
@ -3640,26 +3640,26 @@ alpine.repository.architectures = Architetture
debian.repository.distributions = Distribuzioni
empty.documentation = Per ulteriori informazioni sul registro dei pacchetti vedi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a>.
registry.documentation = Per ulteriori informazioni sul registro %s vedi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a>.
details.repository_site = Sito del progetto
details.repository_site = Sito del repositorio
details.documentation_site = Sito della documentazione
alpine.registry = Imposta questo registro aggiungendo l'URL nel tuo file <code>/etc/apk/repositories</code>:
alpine.registry.key = Scarica la chiave RSA pubblica del registro nella cartella <code>/etc/apk/keys/</code> per verificare la firma dell'indice:
alpine.repository = Informazioni sul progetto
alpine.repository = Informazioni sul repositorio
cargo.registry = Imposta il registro nel file di configurazione di Cargo (per esempio <code>~/.cargo/config.toml</code>):
chef.registry = Imposta questo registro nel tuo file <code>~/.chef/config.rb</code>:
conda.registry = Imposta questo registro come un progetto Conda nel tuo file <code>.condarc</code>:
conda.registry = Imposta questo registro come un repositorio Conda nel tuo file <code>.condarc</code>:
conda.install = Per installare il pacchetto usando conda, esegui il comando seguente:
debian.registry.info = Scegli $distribuzione e $componente dalla lista sotto.
debian.repository = Informazioni sul progetto
debian.repository = Informazioni sul repositorio
go.install = Installa il pacchetto dalla riga di comando:
rpm.distros.suse = sulle distribuzioni basate su SUSE
rpm.repository = Informazioni sul progetto
rpm.repository = Informazioni sul repositorio
swift.install = Aggiungi il pacchetto nel tuo file <code>Package.swift</code>:
swift.install2 = ed esegui il comando seguente:
vagrant.install = Per aggiungere una scatola Vagrant esegui il comando seguente:
owner.settings.cargo.initialize = Inizializza indice
rpm.distros.redhat = sulle distribuzione basate su RedHat
alpine.registry.info = scegli $ramo e $progetto dalla lista sotto.
alpine.registry.info = scegli $ramo e $repositorio dalla lista sotto.
cargo.install = Per installare il pacchetto usando Cargo esegui il comando seguente:
cran.registry = Imposta questo registro nel tuo file <code>Rprofile.site</code>:
rpm.repository.multiple_groups = Questo pacchetto è disponibile in molteplici gruppi.
@ -3689,7 +3689,7 @@ owner.settings.cleanuprules.title = Gestisci regole di pulizia
owner.settings.cargo.rebuild.success = L'indice di Cargo è stato ricostruito correttamente.
owner.settings.cargo.rebuild.error = Impossibile ricostruire l'indice di Cargo: %v
owner.settings.cleanuprules.keep.title = Le versioni che soddisfano queste regole sono mantenute, anche se soddisfano una regola di rimozione sotto.
owner.settings.cargo.initialize.description = Uno speciale progetto Git di indice è necessario per usare il registro di Cargo. usare questa opzione (ri-)creerà il progetto e lo configurerà automaticamente.
owner.settings.cargo.initialize.description = Per utilizzare il registro Cargo è necessario un repositorio Git con un indice speciale. Utilizzando questa opzione, il repositorio verrà (ri)creato e configurato automaticamente.
owner.settings.chef.keypair.description = Per autenticarsi al registro Chef è necessaria una coppia di chiavi. Se hai già generato una coppia di chiavi la generazione di una nuova coppia scarterà la vecchia.
owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato correttamente.
owner.settings.cargo.rebuild.no_index = Impossibile ricostruire, nessun indice è inizializzato.
@ -3792,7 +3792,7 @@ runners.update_runner_failed = Impossibile aggiornare l'esecutore
runners.update_runner_success = Esecutore aggiornato correttamente
runners.update_runner = Aggiorna cambiamenti
runners.edit_runner = Modifica esecutore
runners.task_list.done_at = Fatto a
runners.task_list.done_at = Eseguito
runners.task_list.no_tasks = Non c'è ancora nessuna attività.
runners.last_online = Ultima volta online
runners.new_notice = Come avviare un esecutore

View file

@ -105,7 +105,7 @@ preview=プレビュー
loading=読み込み中…
error=エラー
error404=アクセスしようとしたページは<strong>存在しない</strong>か閲覧が<strong>許可されていません</strong>。
error404=アクセスしようとしたページは<strong>存在しない</strong>か<strong>削除された</strong>か、あるいは閲覧が<strong>許可されていません</strong>。
go_back=戻る
never=無し
@ -179,8 +179,8 @@ contributions_format = {month} {day}, {year} に {contributions}
[editor]
buttons.heading.tooltip=見出し追加
buttons.bold.tooltip=太字追加
buttons.italic.tooltip=イタリック体追加
buttons.bold.tooltip=太字追加 (Ctrl+B / ⌘B)
buttons.italic.tooltip=イタリック体追加 (Ctrl+I / ⌘I)
buttons.quote.tooltip=引用
buttons.code.tooltip=コード追加
buttons.link.tooltip=リンク追加
@ -3733,7 +3733,7 @@ submodule=サブモジュール
[search]
search = 検索...
search = 検索
type_tooltip = 検索タイプ
org_kind = 組織を検索…
code_kind = コードを検索…
@ -3759,6 +3759,8 @@ regexp_tooltip = 検索語句を正規表現として解釈する
regexp = 正規表現
union = フレーズ一致
[munits.data]
pib = PiB
tib = TiB

View file

@ -1,6 +1,3 @@
[common]
home = Agejdan
username = Isem n useqdac
@ -43,7 +40,7 @@ captcha = CAPČA
passcode = Angal n wadduf
settings = Iɣewwaren
your_profile = Amaɣnu
your_settings = Iɣewwaren
your_settings = Tawila
activities = Irmad
ok = Ih
view = Wali
@ -56,6 +53,19 @@ concept_system_global = Amatu
concept_user_organization = Tuddsa
filter = Imsizdeg
your_starred = S yitran
new_repo.title = Akufi amaynut
new_repo.link = Akufi amaynut
issues = Uguren
preview = Taskant
loading = Aɛebbi…
sign_in = Qqen
sign_out = Senser tuqqna
link_account = Qqen amiḍan
email = Tansa imayl
access_token = Ajuṭu n unekcum
[user]
code = Tangalt
repositories = Ikufan
@ -69,9 +79,20 @@ following.title.one = Yeṭṭafaṛ
following.title.few = Yeṭṭafaṛ
unfollow = Ur ṭṭafar ara
overview = Tamuɣli s umata
[org]
code = Tanglat
org_desc = Aglam
team_desc = Aglam
lower_repositories = Ikufan
settings.options = Tuddsa
settings.website = Asmel web
members.remove = Kkes
teams.settings = Iɣewwaren
[repo]
release.source_code = Tangalt taɣbalut
settings.slack_username = Isem n useqdac
@ -125,6 +146,127 @@ projects.title = Azwel
projects.type.none = Ula yiwen
projects.template.desc = Tamudemt
repo_name = Isem n ukufi
repo_size = Tiddi n ukufi
create_repo = Snulfu-d akufi
mirror_sync = yemtawa
migrate_items_issues = Uguren
star = Rnu-yas itri
no_desc = Ur yesɛi ara aglam
branches = Tiṣeḍwa
issues = Uguren
projects.description = Aglam (d afrayan)
projects.column.edit_title = Isem
projects.column.new_title = Isem
projects.column.color = Ini
projects.open = Ldi
projects.close = Mdel
issues.new.labels = Tibzimin
issues.new.projects = Isenfaren
issues.choose.open_external_link = Ldi
issues.choose.blank = Amezwer
issues.new_label_desc_placeholder = Aglam
issues.filter_label = Tabzimt
issues.filter_project = Asenfar
issues.filter_poster = Ameskar
issues.filter_type = Tawsit
issues.filter_sort = Semyizwer
issues.action_open = Ldi
issues.action_close = Mdel
issues.action_label = Tabzimt
issues.previous = Uzwir
issues.next = Uḍfir
issues.all_title = Akk
issues.draft_title = Arewway
issues.context.edit = Ẓreg
issues.context.delete = Kkes
issues.reopen_issue = Ales tulya
issues.create_comment = Awennit
issues.author = Ameskar
issues.role.owner = Bab-is
issues.role.member = Aɛeggal
issues.role.contributor = Amɛiwen
issues.edit = Ẓreg
issues.cancel = Semmet
issues.save = Sekles
issues.label_title = Isem
issues.label_description = Aglam
issues.label_color = Ini
issues.label_edit = Ẓreg
issues.label_delete = Kkes
issues.label.filter_sort.alphabetically = S ugemmay
issues.delete = Kkes
issues.add_time_cancel = Semmet
issues.add_time_hours = Isragen
issues.due_date_form = yyyy-mm-dd
issues.due_date_form_edit = Ẓreg
issues.dependency.cancel = Semmet
issues.content_history.options = Tixtiṛiyin
pulls.made_using_agit = AGit
milestones.open = Ldi
milestones.close = Mdel
milestones.title = Azwel
milestones.desc = Aglam
milestones.clear = Sfeḍ
milestones.cancel = Semmet
milestones.filter_sort.name = Isem
wiki = Awiki
wiki.page = Asebter
wiki.new_page = Asebter
wiki.cancel = Semmet
wiki.edit_page_button = Ẓreg
wiki.pages = Isebtar
activity = Armud
activity.navbar.contributors = Iwiziwen
activity.overview = Tamuɣli s umata
settings.delete = Kkes akufi-a
settings.confirm_delete = Kkes akufi
settings.slack_color = Ini
all_branches = Akk tiseḍwa
editor.add_file = Rnu afaylu
editor.new_file = Afaylu amaynut
editor.upload_file = Sali afaylu
editor.edit_file = Ẓreg afaylu
editor.edit_this_file = Ẓreg afaylu
editor.delete_this_file = Kkes afaylu
commits.search_branch = Taseṭṭa-a
commits.search_all = Akk tiseḍwa
issues.filter_project_all = Akk isenfaren
issues.due_date_form_remove = Kkes
issues.dependency.remove = Kkes
pulls.filter_branch = Sizdeg taseṭṭa
activity.period.daily = 1 n wass
activity.period.halfweekly = 3 n wussan
activity.period.weekly = 1 n umalas
activity.period.monthly = 1 n wayyur
activity.period.quarterly = 3 n wayyuren
activity.period.semiyearly = 6 n wayyuren
activity.period.yearly = 1 n useggas
activity.git_stats_on_default_branch = Ɣef %s,
settings.site = Asmel web
settings.delete_collaborator = Kkes
settings.webhook.payload = Agbur
settings.event_issue_comment = Iwenniten
settings.event_pull_request_comment = Iwenniten
settings.web_hook_name_gitea = Gitea
settings.web_hook_name_forgejo = Forgejo
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 = Telegram
settings.web_hook_name_matrix = Matrix
settings.web_hook_name_feishu_only = Feishu
settings.web_hook_name_packagist = Packagist
settings.title = Azwel
settings.deploy_key_content = Agbur
settings.branches = Tiṣeḍwa
settings.edit_protected_branch = Ẓreg
release.edit = Ẓreg
release.cancel = Semmet
release.downloads = Isidar
[install]
admin_password = Awal n uɛeddi
password = Awal n uɛeddi
@ -135,6 +277,8 @@ db_schema = Azenziɣ
ssl_mode = SSL
path = Abrid
db_name = Isem n taffa n yisefka
[admin]
notices.type_1 = Akufi
packages.repository = Akufi
@ -142,6 +286,26 @@ config.db_user = Isem n useqdac
users.name = Isem n useqdac
emails.filter_sort.name = Isem n useqdac
orgs.name = Isem
repos.name = Isem
packages.name = Isem
auths.name = Isem
config.db_name = Isem
config.mailer_name = Isem
monitor.name = Isem
monitor.queue.name = Isem
notices.desc = Aglam
dashboard = Tafelwit n usenqed
organizations = Tuddsiwin
repositories = Ikufan
config = Tawila
config_summary = Agzul
config_settings = Iɣewwaren
dashboard.statistic = Agzul
users.2fa = 2FA
config.db_ssl_mode = SSL
[search]
code_kind = Nadi tangalt…
search = Nadi…
@ -160,11 +324,19 @@ table_modal.label.columns = Tigejda
link_modal.url = Url
link_modal.description = Aglam
table_modal.placeholder.header = Aqeṛṛu
table_modal.label.rows = Izirigen
buttons.new_table.tooltip = Rnu tafelwit
table_modal.header = Rnu tafelwit
[explore]
code = Tanglat
repos = Ikufan
users = Iseqdacen
organizations = Tuddsiwin
[form]
UserName = Isem n useqdac
Password = Awal n uɛeddi
@ -174,6 +346,12 @@ Content = Agbur
Biography = Tameddurt
Location = Asun
RepoName = Isem n ukufi
TeamName = Isem n terbaɛt
Email = Tansa imayl
Retype = Sentem awal n uɛeddi
[aria]
footer.links = Iseɣwan
footer = Aḍar n usebter
@ -184,14 +362,20 @@ more = Ugar
[startpage]
lightweight = D afessas
license = Aɣbalu yeldin
[home]
my_repos = Ikufan
show_private = Uslig
my_orgs = Tuddsiwin
[auth]
openid_connect_submit = Tuqqna
verify = Senqed
login_userpass = Qqen
[modal]
yes = Ih
no = Uhu
@ -234,4 +418,43 @@ quota.sizes.all = Akk
quota.sizes.repos.all = Ikufan
quota.sizes.assets.attachments.all = Imeddayen
quota.sizes.assets.packages.all = Ikemmusen
quota.sizes.wiki = Wiki
quota.sizes.wiki = Wiki
appearance = Udem
avatar = Avataṛ
orgs = Tuddsiwin
organization = Tuddsiwin
quota = Amur
location = Asun
comment_type_group_reference = Tamsisɣelt
visibility.private = Uslig
quota.rule.no_limit = War talast
quota.sizes.assets.all = Igburen
update_language = Beddel tutlayt
language.title = Tutlayt tamezwarut
delete_email = Kkes
[packages]
alpine.repository.branches = Tiṣeḍwa
alpine.repository.repositories = Ikufan
arch.version.description = Aglam
settings.link.select = Fren akufi
alpine.repository.architectures = Tisegda
container.images.title = Tugniwin
container.details.platform = Tiɣerɣert
debian.repository.architectures = Tisegda
rpm.repository.architectures = Tisegda
alt.repository.architectures = Tisegda
[actions]
runners.name = Isem
runners.description = Aglam
runners.task_list.repository = Akufi
[projects]
type-2.display_name = Asenfar n ukufi
[error]
network_error = Tuccḍa deg uẓeṭṭa

View file

@ -0,0 +1,7 @@
[common]
home = Domus
dashboard = Tabula
explore = Explora
help = Auxilium
logo = Logotipus
sign_in = Intra

View file

@ -1249,7 +1249,7 @@ file_history=Vēsture
file_view_source=Skatīt avotu
file_view_rendered=Skatīt atveidojumu
file_view_raw=Apskatīt neapstrādātu
file_permalink=Patstāvīgā saite
file_permalink=Pastāvīgā saite
file_too_large=Datne ir pārāk liela, lai to parādītu.
invisible_runes_header=Šī datne satur neredzamas unikoda rakstzīmes
invisible_runes_description=`Šī datne satur neredzamas unikoda rakstzīmes, kas ir neatšķiramas cilvēkiem, bet dators tās var apstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
@ -1921,7 +1921,7 @@ milestones.filter_sort.least_issues=Vismazāk pieteikumu
signing.will_sign=Šis iesūtījums tiks parakstīts ar atslēgu "%s".
signing.wont_sign.error=Atgadījās kļūda pārbaudot, vai iesūtījums var tikt parakstīts.
signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo iesūtījumu.
signing.wont_sign.nokey=Šajā serverī nav atslēgas, ar ko parakstīt šo iesūtījumu.
signing.wont_sign.never=Iesūtījumi nekad netiek parakstīti.
signing.wont_sign.always=Iesūtījumi vienmēr tiek parakstīti.
signing.wont_sign.pubkey=Iesūtījums netiks parakstīts, jo kontam nav piesaistīta publiska atslēga.
@ -2307,7 +2307,7 @@ settings.packagist_api_token=API pilnvara
settings.packagist_package_url=Packagist pakotnes URL
settings.deploy_keys=Izvietošanas atslēgas
settings.add_deploy_key=Pievienot izvietošanas atslēgu
settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve glabātavai.
settings.deploy_key_desc=Izvietošanas atslēgām var būt tikai lasīšanas vai lasīšanas un rakstīšanas piekļuve glabātavai.
settings.is_writable=Iespējot rakstīšanas piekļuvi
settings.is_writable_info=Atļaut šai izvietošanas atslēgai <strong>aizgādāt</strong> uz glabātavu.
settings.no_deploy_keys=Pagaidām nav nevienas izvietošanas atslēgas.
@ -2364,7 +2364,7 @@ settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus a
settings.protect_protected_file_patterns_desc=Aizsargātās datnes nav ļauts tiešā veidā mainīt, pat ja lietotājam šajā zarā ir tiesības pievienot, labot vai izdzēst datnes. Vairākus paraugus var atdalīt ar semikolu (";"). Paraugu pieraksts ir skatāms <a href="%[1]s">%[2]s</a> dokumentācijā. Piemēri: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.protect_unprotected_file_patterns=Neaizsargāto datņu paraugs (vairākus atdala ar semikolu ";")
settings.protect_unprotected_file_patterns_desc=Neaizsargātās datnes, kuras ir ļauts izmainīt tiešā veidā, apejot aizgādāšanas ierobežojumu, ja lietotājam ir rakstīšanas piekļuve. Vairāki paraugi ir atdalāmi ar semikolu (";"). Paraugu pierakstu skatīt <a href="%[1]s">%[2]s</a> dokumentācijā. Piemēri: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.update_protect_branch_success=Zara aizsargāšanas kārtula "%s" tika atjaunināta.
settings.update_protect_branch_success=Zara aizsargāšanas kārtula “%s” tika atjaunināta.
settings.remove_protected_branch_success=Zara aizsargāšanas kārtula "%s" tika noņemta.
settings.remove_protected_branch_failed=Zara aizsargāšanas kārtulas "%s" noņemšana neizdevās.
settings.protected_branch_deletion=Izdzēst zara aizsargāšanu

View file

@ -179,9 +179,54 @@ oauth_signup_tab = Registrer ny konto
oauth_signup_title = Fullfør ny konto
oauth_signup_submit = Fullfør konto
create_new_account = Registrer konto
disable_register_prompt = Registrering er skrudd av. Kontakt din nettside adminstrator.
disable_register_mail = E-post bekreftning for registrering er skrudd av.
manual_activation_only = Kontakt din nettside administrator for å gjøre aktiveringen ferdig.
remember_me = Husk denne enheten
forgot_password_title = Glemt passord
forgot_password = Glemt passordet?
hint_login = Har allerede en konto? <a href="%s">Logg inn nå!</a>
hint_register = Trenger en konto? <a href="%s">Registrer nå.</a>
sign_up_successful = Kontoen er dannet. Velkommen!
confirmation_mail_sent_prompt = En bekreftnings e-post har blitt sent til <b>%s</b>. For å gjøre ferdig registreringen, sjekk din e-post innboks og gå på linken i løpet av de neste %s. Hvis e-posten er feil, kan du logge deg inn og forespørre en ny e-post som kan bli sendt til et annet adresse.
must_change_password = Oppdater passordet ditt
allow_password_change = Påby brukeren å endre passordet (anbefalt)
reset_password_mail_sent_prompt = En bekreftnings e-post har blitt sendt til <b>%s</b>. For å gjøre ferdig kontogjenopprettingen, følg linken som blei sendt på din innboks i løpet av de neste %s.
active_your_account = Aktiver din konto
account_activated = Kontoen har blitt aktivert
prohibit_login = Kontoen er utestengt
prohibit_login_desc = Din konto har blitt utestengt fra å delta med instansen. Kontakt instans administratoren for å få tilbake tilgang.
resent_limit_prompt = Du har nylig allerede forespurt en aktiverings e-post. Vent minst 3 minutter og prøv igjen.
has_unconfirmed_mail = Hei %s, du har en ubekreftet e-post adresse (<b>%s</b>). Hvis du har ikke fått en bekreftnings e-post eller trenger å få en ny tilsendt, trykk på knappen under.
change_unconfirmed_email_summary = Bekreftning av ndring av e-post adressen er tilsendt.
change_unconfirmed_email = Hvis du har oppgitt feil e-post adresse gjennom registreringen, kan du endre den under, og en ny e-post vil bli sendt på den nye adressen istendenfor.
resend_mail = Trykk her for å få aktiverings e-posten tilsendt på nytt
send_reset_mail = Send gjenopprettings e-post
reset_password = Kontogjenoppretting
invalid_code = Din bekreftningskode er ugyldig eller har utløpt.
invalid_code_forgot_password = Din bekreftningskode er ugyldig eller har utløpt. Trykk <a href="%s">her</a> for å starte ny økt.
[home]
uname_holder = Brukernavn eller e-postadresse
switch_dashboard_context = Bytt dashboard miljø
my_repos = Repositorier
my_orgs = Organisasjoner
view_home = Vis %s
filter = Andre filtre
filter_by_team_repositories = Filtrer etter team-repositorier
feed_of = Feed av "%s"
show_archived = Arkivert
show_both_archived_unarchived = Viser både arkiverte og ikke arkiverte
show_only_archived = Viser kun arkiverte
show_only_unarchived = Vis kun ikke arkiverte
show_private = Privat
show_both_private_public = Vis både offentlige og private
show_only_private = Vis kun private
show_only_public = Vis kun offentlige
issues.in_your_repos = I dine repositorier
[heatmap]
contributions_zero = Ingen bidrag
number_of_contributions_in_the_last_12_months = %s bidrag de siste 12 månedene
@ -193,8 +238,8 @@ more = Mer
[editor]
buttons.heading.tooltip = Legg til overskrift
buttons.bold.tooltip = Legg til uthevet tekst
buttons.italic.tooltip = Legg til kursiv text
buttons.bold.tooltip = Legg til uthevet tekst (Ctrl+B / ⌘B)
buttons.italic.tooltip = Legg til kursiv text (Ctrl+I / ⌘I)
buttons.list.unordered.tooltip = Legg til punktliste
buttons.list.ordered.tooltip = Legg til nummerert liste
buttons.link.tooltip = Legg til link
@ -255,6 +300,102 @@ sqlite_helper = Sti til SQLite3-databasen.<br>Bruk absolutt filsti dersom Forgej
reinstall_error = Du prøver å installere i en eksisterende Forgejo-database
reinstall_confirm_message = Å installere på nytt med en eksisterende Forgejo-database kan føre til problemer. I de fleste tilfeller bør du bruke din eksisterende "app.ini" for å kjøre Forgejo. Hvis du vet hva du gjør, og vil fortsette, bekreft følgende:
reinstall_confirm_check_1 = Data kryptert av SECRET_KEY i app.ini-filen kan mistes: brukere vil ikke ha mulighet til å logge inn med 2FA/OTP og mirrorene vil kanskje ikke fungere korrekt. Etter det å ha markert boksen bekrefter du at nåværende app.ini-filen har den korrekte SECRET_KEY.
reinstall_confirm_check_2 = Repositoriene og innstillingene kan trenge en re-synkronisering. Ved å markere denne boksen bekrefter du at du vil re-synkronisere hookene til repositoriene og authorized_keys filen manuelt. Du bekrefter at du vil sjekke at repositorie- og speilinnstilingene er korrekte.
reinstall_confirm_check_3 = Du bekrefter at du er absolutt sikker på at Forgejo kjører med den korrekte app.ini lokasjonen og at du er sikker på at du må gjøre en re-install. Du bekrefter at du forstår risikoene nevnt ovenfor.
err_empty_db_path = Filplasseringen til SQLite3 database kan ikke være tom.
no_admin_and_disable_registration = Du kan ikke skru av bruker selv-registrering uten å ha laget en administrator konto.
err_empty_admin_password = Administratorpassordet kan ikke være tomt.
err_empty_admin_email = Administrator-e-posten kan ikke være tom.
err_admin_name_is_reserved = Administrator brukernavn utilgjengelig, brukernavn reservert
err_admin_name_pattern_not_allowed = Administrator brukernavnet er utilgjengelig, brukernavnet passer til det reserverte brukernavnmønsteret
err_admin_name_is_invalid = Administrator brukernavnet er utilgjengelig
general_title = Generelle innstillinger
app_name = Instans tittel
app_name_helper = Skriv inn navnet på instansen din. Den vil bli vist på alle sider.
app_slogan = Instans motto
app_slogan_helper = Skriv inn instans mottoen her. La den være tom om du vil skru av instans motto.
repo_path = Repositorie root filplassering
repo_path_helper = Fjerntilgjenelige Git repositorie vil være lagret på denne filplasseringen.
lfs_path = Git LFS root filplassering
lfs_path_helper = Filer kontrollert av Git LFS vil være lagret på denne filplasseringen. La være tomt om du vil skru den av.
run_user = Kjøre bruker som
run_user_helper = Operativsystemets brukernavn som Forgejo kjører som. Merk at brukeren må ha tilgang til repositoriens root filplassering.
domain = Server domene
domain_helper = Domene eller host adresse til serveren.
ssh_port = SSH server port
ssh_port_helper = Port nummer som blir brukt av SSH serveren. La være tomt om du vil skru av SSH server.
http_port = HTTP listen port
http_port_helper = Port nummer som vil bli brukt av Forgejo web server.
app_url = Hoved-URL
app_url_helper = Hovedadresse for HTTP(S) klone-URLer og e-post varslinger.
log_root_path = Logg filplassering
log_root_path_helper = Loggfiler blir lagret i denne mappen.
optional_title = Valgfrie innstillinger
email_title = E-post innstilinger
smtp_addr = SMTP host
smtp_port = SMTP port
smtp_from = Send e-post som
smtp_from_invalid = "Send e-post som" adresse er ugyldig
smtp_from_helper = E-post adresse Forgejo skal bruke. Skriv inn vanlig e-post adresse eller bruke "Navn" <email@example.com> format.
mailer_user = SMTP brukernavn
mailer_password = SMTP passord
register_confirm = Påby e-post bekreftning for å registrere
mail_notify = Skru på e-post varslinger
server_service_title = Server og tredje-parts tjeneste innstillinger
offline_mode = Skru på lokalmodus
offline_mode.description = Skru av tredje-parts innholdsleveringsnettverk og servere alle resursene lokalt.
disable_gravatar = Skru av Gravatar
disable_gravatar.description = Skru av bruken av Gravatar eller andre tredje-parts avatar-kilder. Default bilder vil blir brukt for brukeravatarer utenom om de opplaster eget avatar til instansen.
federated_avatar_lookup = Skru på federative avatarer
federated_avatar_lookup.description = Søk opp avatarer med Libravatar.
disable_registration = Skru av selv-registrering
disable_registration.description = Kun instans-adiministratorer kan skape nye brukerkontoer. Det er sterkt anbefalt å ha den skrudd på, med mindre du har tenkt å host-e en offentlig instans for alle og er klar til å ta i mot store mengder av spamkontoer.
allow_only_external_registration = Tillatt registrering kun via eksterne tjenester
allow_only_external_registration.description = Brukere kan kun lage nye brukerkontroer ved å bruke konfigurerte eksterene tjenester.
openid_signin = Skru på OpenID pålogging
openid_signin.description = Tilatter bruker å logge inn via OpenID.
openid_signup = Skru på OpenID selv-registrering
openid_signup.description = Tillater brukere å danne nye kontroer via OpenID hvis selv-registrering er skrudd på.
enable_captcha = Skru på CAPTCHA-registrerting
enable_captcha.description = Påby brukere å gjennomgå CAPTCHA for å danne nye kontoer.
require_sign_in_view = Påby pålogging for å se instans-innhold
require_sign_in_view.description = Limiterer innholdstilgang til kun pålogget brukere. Gjester vil kun ha tilgang til å besøke påloggingsidene.
default_keep_email_private = Gjem e-post adresser på default
default_keep_email_private.description = Skru på e-post adresser gjemming for nye bruker på default sånn at informasjon ikke er lekket rett etter registrering.
default_allow_create_organization = Tilatt skaping av organisasjoner på default
default_allow_create_organization.description = Tilatt nye bruker å danne organisasjoner på default. Når denne innstillingen er skrudd av, må en admin gi tillatelse til nye brukere om de vil danne organiasjoner.
default_enable_timetracking = Skru på tids-tracking på default
default_enable_timetracking.description = Tilatt bruken av tids-tracking funksjonen for nye repositorier på default.
admin_title = Administrator brukertinnstillinger
admin_setting.description = Å lage en administratorbruker er helt valgfritt. Den første registrerte brukeren blir automatisk en administrator.
admin_name = Administrator brukernavn
admin_password = Passord
confirm_password = Bekreft passordet
admin_email = E-post adresse
config_location_hint = Disse innstillingene vil blir lagret i:
install_btn_confirm = Installer Forgejo
test_git_failed = Kunne ikke teste "git" kommandoen: %v
sqlite3_not_available = Denne Forgejo-versjonen støtter ikke SQLite3. Last ned den offisielle programversjonen fra %s (ikke velg "gobuild"-versjonen).
invalid_db_setting = Database instillingene er ugyldige: %v
invalid_db_table = Database tabellen "%s" er ugyldig: %v
invalid_repo_path = Repositorie root filplasseringen er ugyldig: %v
invalid_app_data_path = Appdata filplassering er ugyldig: %v
run_user_not_match = Brukernavnet i "Kjører bruker som" er ikke det nåværende brukernavnet: %s -> %s
internal_token_failed = Feilet å generere intern-toke: %v
save_config_failed = Feilet å lagre innstillingene: %v
enable_update_checker_helper_forgejo = Den vil periodisk sjekke for nye Forgejo-versjoner ved å sjekke en TXT DNS-record på release.forgejo.org.
invalid_admin_setting = Administrator konto innstilling er ugyldig: %v
invalid_log_root_path = Loggfilplasseringen er ugyldig: %v
no_reply_address = Gjemmet e-post domene
no_reply_address_helper = Domenenavn for bruker med en gjemt e-post adresse. For eksempel, vil brukeren "joe" være logget inn på Git som "joe@noreply.example.org" om den gjemmet e-post domenen er satt på "noreply.example.org".
password_algorithm = Passord hash-algoritme
invalid_password_algorithm = Ugyldig passord hash-algoritme
password_algorithm_helper = Sett passord hashings-algoritme. Algoritmene har ulike krav og styrker. argon2-algoritmen er nokså sikker men bruker mye minne og kan være upassende for små datasystemer.
enable_update_checker = Skru på oppdaterings-sjekking
env_config_keys = Miljøkonfigurering
env_config_keys_prompt = Følgende miljøvariabler vil være satt på konfigureringsfil:
[startpage]
install = Enkel å installere
platform = Plattformuavhengig
@ -264,4 +405,14 @@ app_desc = En enkel Git-tjeneste du kan drifte selv
lightweight = Lettvekt
license = Åpen kildekode
platform_desc = Forgejo fungerer på frie operativsystemer som Linux og FreeBSD, og støtter flere CPU-arkitekturer. Velg den plattformen du foretrekker!
license_desc = Last ned <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Bli med ved å <a target="_blank" rel="noopener noreferrer" href="%[2]s">bidra</a> for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter!
license_desc = Last ned <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Bli med ved å <a target="_blank" rel="noopener noreferrer" href="%[2]s">bidra</a> for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter!
[explore]
repos = Repositorier
users = Brukere
organizations = Organisasjoner
go_to = Gå til
code = Kode
code_last_indexed_at = Sist indeksert %s
relevant_repositories_tooltip = Repositorier som er forker eller har ingen tema, ingen ikon, og ingen beskrivelse er gjemt.
relevant_repositories = Kun relevante repositorier er vist, <a href="%s">vis ufiltrerte resultater</a>.

View file

@ -178,7 +178,7 @@ contributions_format = {contributions} op {month} {day}, {year}
[editor]
buttons.heading.tooltip = Koptekst toevoegen
buttons.bold.tooltip = Vetgedrukte tekst toevoegen
buttons.bold.tooltip = Vetgedrukte tekst toevoegen (Ctrl+B / ⌘B)
buttons.quote.tooltip = Tekst citeren
buttons.code.tooltip = Code toevoegen
buttons.link.tooltip = Link toevoegen
@ -188,7 +188,7 @@ buttons.mention.tooltip = Vermeld een gebruiker of team
buttons.ref.tooltip = Verwijs naar een issue of pull verzoek
buttons.switch_to_legacy.tooltip = Gebruik in plaats daarvan de oude editor
buttons.enable_monospace_font = Lettertype monospace inschakelen
buttons.italic.tooltip = Schuingedrukte tekst toevoegen
buttons.italic.tooltip = Schuingedrukte tekst toevoegen (Ctrl+I / ⌘I)
buttons.list.task.tooltip = Een lijst met taken toevoegen
buttons.disable_monospace_font = Lettertype monospace uitschakelen
buttons.indent.tooltip = Items één niveau lager plaatsen
@ -2035,7 +2035,7 @@ settings.packagist_api_token=API token
settings.packagist_package_url=Packagist pakket URL
settings.deploy_keys=Deploy sleutels
settings.add_deploy_key=Deploy sleutel toevoegen
settings.deploy_key_desc=Deploy keys hebben alleen-lezen pull-toegang tot de repository.
settings.deploy_key_desc=Deploy sleutels kunnen alleen-lezen of alleen-lezen-schrijftoegang hebben tot de repository.
settings.is_writable=Schrijftoegang inschakelen
settings.is_writable_info=Sta deze deploy toets toe om te <strong>pushen</strong> naar de repository.
settings.no_deploy_keys=Er zijn nog geen deploy sleutels.
@ -2656,7 +2656,7 @@ n_branch_one = %s branch
n_branch_few = %s branches
n_tag_one = %s tag
n_tag_few = %s tags
n_commit_one = %d commit
n_commit_one = %s commit
issues.num_participants_one = %d deelnemer
size_format = %[1]s: %[2]s, %[3]s: %[4]s
settings.enforce_on_admins = Handhaaf deze regel voor repository admins

View file

@ -91,7 +91,7 @@ preview=Podgląd
loading=Ładowanie…
error=Błąd
error404=Strona, do której próbujesz dotrzeć <strong>nie istnieje</strong> lub <strong>nie jesteś autoryzowany</strong> aby go zobaczyć.
error404=Strona, do której próbujesz dotrzeć <strong>nie istnieje</strong>, <strong>została usunięta</strong> albo <strong>nie jesteś autoryzowany</strong> aby jej zobaczyć.
never=Nigdy
@ -178,8 +178,8 @@ contributions_few = kontrybucji
[editor]
buttons.heading.tooltip = Dodaj nagłówek
buttons.bold.tooltip = Dodaj pogrubiony tekst
buttons.italic.tooltip = Dodaj pochyły tekst
buttons.bold.tooltip = Dodaj pogrubiony tekst (Ctrl+B / ⌘B)
buttons.italic.tooltip = Dodaj pochyły tekst (Ctrl+I / ⌘I)
buttons.quote.tooltip = Zacytuj tekst
buttons.code.tooltip = Dodaj kod
buttons.link.tooltip = Dodaj odnośnik
@ -200,6 +200,10 @@ table_modal.label.rows = Wiersze
table_modal.label.columns = Kolumny
buttons.unindent.tooltip = Usuń jeden poziom zagnieżdżenia
link_modal.header = Dodaj link
link_modal.url = Url
link_modal.description = Opis
[filter]
string.asc = A - Z
string.desc = Z - A
@ -3808,7 +3812,7 @@ normal_file = Zwykły plik
[search]
search = Wyszukaj...
search = Wyszukaj
type_tooltip = Typ wyszukiwania
fuzzy = Przybliżone
package_kind = Wyszukaj pakiety…

View file

@ -147,7 +147,7 @@ filter.is_fork = Forks
filter.is_mirror = Espelhos
toggle_menu = Alternar menu
filter.not_archived = Não arquivado
filter.not_fork = Sem forks
filter.not_fork = Não são forks
filter.not_mirror = Sem espelhos
filter.not_template = Sem modelos
copy_generic = Copiar para a área de transferência
@ -222,7 +222,7 @@ platform=Multi-plataforma
lightweight=Leve e rápido
lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina!
license=Código aberto
license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir!
license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Junte-se a nós e <a target="_blank" rel="noopener noreferrer" href="%[2]s">contribua</a> para tornar este projeto ainda melhor. Não tenha vergonha de contribuir!
install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="%[1]s">rode o binário</a> para a sua plataforma, execute-o com <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, ou obtenha-o <a target="_blank" rel="noopener noreferrer" href="%[3]s">empacotado</a>.
platform_desc = Forgejo roda em sistemas operacionais livres, como Linux e FreeBSD, assim como em diferentes arquiteturas de processador. Escolha o seu sistema preferido!
@ -528,7 +528,7 @@ totp_disabled.subject = A autenticação em dois fatores foi desabilitada
removed_security_key.subject = Uma chave de segurança foi removida
removed_security_key.text_1 = A chave de segurança "%[1]s" foi removida de sua conta.
account_security_caution.text_1 = Caso tenha sido você, este e-mail pode ser ignorado.
totp_enrolled.subject = Você ativou TOTP como método 2FA
totp_enrolled.subject = Você ativou TOTP como método de autenticação em dois fatores
totp_disabled.text_1 = A senha de uso único baseada em tempo (TOTP) na sua conta foi desativada.
totp_disabled.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA.
removed_security_key.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA.
@ -644,7 +644,7 @@ email_domain_is_not_allowed = O domínio do endereço de email da conta <b>%s</b
[user]
change_avatar=Altere seu avatar...
change_avatar=Altere seu avatar
joined_on=Inscreveu-se em %s
repositories=Repositórios
activity=Atividade pública
@ -681,7 +681,7 @@ following.title.one = seguindo
followers.title.one = seguidor
followers.title.few = seguidores
public_activity.visibility_hint.self_private = Sua atividade está visível apenas para você e para os administradores da instância. <a href="%s">Configurar</a>.
public_activity.visibility_hint.self_public = Sua atividade está visível para todos, exceto interações em espaços privados. <a href="%s">Configurar</a>.
public_activity.visibility_hint.self_public = Sua atividade está visível para todos, exceto as interações em espaços privados. <a href="%s">Clique para configurar</a>.
public_activity.visibility_hint.admin_public = Sua atividade está visível para todos, mas como um administrador você também pode ver interações em espaços privados.
public_activity.visibility_hint.admin_private = Essa atividade está visível para você porque você é um administrador, mas o usuário dejesa que ela seja mantida em privado.
public_activity.visibility_hint.self_private_profile = Sua atividade só é visível para você e para os administradores do servidor porque seu perfil é privado. <a href="%s">Configurar</a>.
@ -992,7 +992,7 @@ pronouns_unspecified = Não especificado
language.title = Idioma padrão
additional_repo_units_hint = Sugira habilitar unidades de repositório adicionais
additional_repo_units_hint_description = Exibir uma sugestão para "Habilitar mais" em repositórios que não possuem todas as unidades disponíveis habilitadas.
update_hints = Dicas de atualização
update_hints = Atualizar dicas
update_hints_success = As dicas foram atualizadas.
keep_activity_private.description = A sua <a href="%s">atividade pública</a> estará visível apenas para si e para os administradores do servidor.
language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! <a href="%s">Mais informações</a>.
@ -1303,14 +1303,14 @@ editor.patch=Aplicar correção
editor.patching=Corrigindo:
editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"`
editor.new_patch=Novo patch
editor.commit_message_desc=Adicione uma descrição detalhada (opcional)...
editor.commit_message_desc=Adicione uma descrição detalhada (opcional)
editor.signoff_desc=Adicione um assinado-por-committer no final do log do commit.
editor.commit_directly_to_this_branch=Commit diretamente no branch <strong class="%[2]s">%[1]s</strong>.
editor.create_new_branch=Crie um <strong>novo branch</strong> para este commit e crie um pull request.
editor.create_new_branch_np=Crie um <strong>novo branch</strong> para este commit.
editor.propose_file_change=Propor alteração de arquivo
editor.new_branch_name=Nome do novo branch para este commit
editor.new_branch_name_desc=Novo nome do branch...
editor.new_branch_name_desc=Nome do novo ramo…
editor.cancel=Cancelar
editor.filename_cannot_be_empty=Nome do arquivo não pode ser em branco.
editor.filename_is_invalid=O nome do arquivo é inválido: "%s".
@ -1331,7 +1331,7 @@ editor.fail_to_update_file_summary=Mensagem de erro:
editor.push_rejected_no_message=A alteração foi rejeitada pelo servidor sem uma mensagem. Por favor, verifique os Git hooks .
editor.push_rejected=A alteração foi rejeitada pelo servidor. Por favor, verifique os Git hooks .
editor.push_rejected_summary=Mensagem completa de rejeição:
editor.add_subdir=Adicionar um subdiretório...
editor.add_subdir=Adicionar uma pasta…
editor.unable_to_upload_files=Ocorreu um erro ao enviar arquivos para "%s": %v
editor.upload_file_is_locked=Arquivo "%s" está bloqueado por %s.
editor.upload_files_to_dir=`Enviar arquivos para "%s"`
@ -1523,7 +1523,7 @@ issues.action_assignee_no_select=Sem responsável
issues.action_check=Marcar/Desmarcar
issues.action_check_all=Marcar/Desmarcar todos os itens
issues.opened_by=aberto por <a href="%[2]s">%[3]s</a> %[1]s
pulls.merged_by=por <a href="%[2]s">%[3]s</a> foi aplicado em %[1]s
pulls.merged_by=por <a href="%[2]s">%[3]s</a> foi aplicado %[1]s
pulls.merged_by_fake=por %[2]s foi aplicado %[1]s
issues.closed_by=por <a href="%[2]s">%[3]s</a> foi fechada %[1]s
issues.opened_by_fake=%[1]s abertas por %[2]s
@ -2258,7 +2258,7 @@ settings.packagist_api_token=Token de API
settings.packagist_package_url=URL do pacote do Packagist
settings.deploy_keys=Chaves de deploy
settings.add_deploy_key=Adicionar chave de deploy
settings.deploy_key_desc=As chaves de deploy possuem somente acesso de leitura (pull) ao repositório.
settings.deploy_key_desc=As chaves de deploy podem ter acesso ao repositório somente para leitura ou para leitura e escrita.
settings.is_writable=Habilitar acesso de escrita
settings.is_writable_info=Permitir que esta chave de deploy faça <strong>push</strong> para o repositório.
settings.no_deploy_keys=Não há nenhuma chave de deploy ainda.
@ -2321,7 +2321,7 @@ settings.block_outdated_branch_desc=O merge não será possível quando o branch
settings.default_branch_desc=Selecione um branch padrão para pull requests e commits de código:
settings.merge_style_desc=Estilos de merge
settings.default_merge_style_desc=Estilo de merge padrão
settings.choose_branch=Escolha um branch...
settings.choose_branch=Escolha um ramo…
settings.no_protected_branch=Não há branches protegidos.
settings.edit_protected_branch=Editar
settings.protected_branch_required_rule_name=Nome da regra é obrigatório
@ -2663,7 +2663,7 @@ mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de
mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha.
mirror_public_key = Chave SSH pública
mirror_use_ssh.text = Usar autenticação por SSH
mirror_use_ssh.not_available = A autenticação via SSH não está disponível.
mirror_use_ssh.not_available = A autenticação SSH não está disponível.
settings.push_mirror_sync_in_progress = Fazendo push das mudanças para o remoto %s nesse momento.
settings.federation_apapiurl = URL de federação deste repositório. Copie e cole isso nas Configurações de Federação de outro repositório como uma URL de um Repositório Seguidor.
pulls.agit_explanation = Criado usando o fluxo de trabalho AGit. AGit permite que contribuidores proponham mudanças usando "git push" sem criar um fork ou novo branch.
@ -2768,8 +2768,8 @@ issues.filter_no_results_placeholder = Tente ajustar seus filtros de pesquisa.
archive.nocomment = Não é possível comentar pois o repositório foi arquivado.
migrate.repo_desc_helper = Deixe em branco para importar a descrição existente
comment.blocked_by_user = Não é possível comentar pois você foi bloqueado pelo dono ou autor do repositório.
sync_fork.branch_behind_few = Este branch está %[1]d commits atrás de %[2]s
sync_fork.branch_behind_one = Este branch está %[1]d commit atrás de %[2]s
sync_fork.branch_behind_few = Este ramo está %[1]d commits atrás de %[2]s
sync_fork.branch_behind_one = Esta branch está %[1]d commit atrás de %[2]s
sync_fork.button = Sincronizar
settings.event_header_action = Eventos de execução de Actions
settings.event_action_failure = Falha
@ -3001,9 +3001,9 @@ dashboard.delete_old_actions.started=A exclusão de todas as atividades antigas
dashboard.update_checker=Verificador de atualização
dashboard.delete_old_system_notices=Excluir todos os avisos de sistema antigos do banco de dados
dashboard.gc_lfs=Coletar lixos dos meta-objetos LFS
dashboard.stop_zombie_tasks=Parar tarefas de actions zumbi
dashboard.stop_endless_tasks=Parar tarefas infinitas de actions
dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de actions
dashboard.stop_zombie_tasks=Parar tarefas de Actions zumbis
dashboard.stop_endless_tasks=Parar tarefas de Actions intermináveis
dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de Actions
users.user_manage_panel=Gerenciar contas de usuário
users.new_account=Criar conta de usuário
@ -3406,7 +3406,7 @@ notices.delete_success=Os avisos do sistema foram excluídos.
identity_access = Identidade e acesso
settings = Configurações de administrador
users.bot = Robô
dashboard.start_schedule_tasks = Iniciar tarefas de actions programadas
dashboard.start_schedule_tasks = Iniciar tarefas de Actions programadas
users.reserved = Reservado
emails.change_email_text = Tem certeza de que deseja atualizar este endereço de e-mail?
self_check = Autoverificação
@ -3817,7 +3817,7 @@ variables.id_not_exist = A variável com o ID %d não existe.
variables.deletion.failed = Falha ao remover a variável.
variables.creation.failed = Falha ao adicionar a variável.
runs.no_results = Nenhum resultado.
variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma.
variables.description = As variáveis serão passadas para certas Actions e não poderão ser lidas de outra forma.
workflow.dispatch.trigger_found = Este workflow tem um disparador de evento <c>workflow_dispatch</c>.
workflow.dispatch.run = Executar workflow
runs.no_runs = O workflow ainda não foi executado.

View file

@ -2319,7 +2319,7 @@ settings.packagist_api_token=Código da API
settings.packagist_package_url=URL do pacote Packagist
settings.deploy_keys=Chaves de instalação
settings.add_deploy_key=Adicionar chave de instalação
settings.deploy_key_desc=Chaves de instalação têm acesso para puxar do repositório apenas em modo de leitura.
settings.deploy_key_desc=Chaves de instalação podem ter acesso ao repositório apenas para leitura ou de leitura e escrita.
settings.is_writable=Habilitar acesso de escrita
settings.is_writable_info=Permitir a esta chave de instalação <strong>enviar</strong> para o repositório.
settings.no_deploy_keys=Ainda não existem quaisquer chaves de instalação.

View file

@ -275,6 +275,11 @@ require_sign_in_view.description = Limitează accesul la conținut către utiliz
invalid_db_setting = Setările pentru bază de date sunt invalide: %v
no_reply_address = Domeniu pentru adrese de email ascunse
host = Gazdă
app_name_helper = Introdu numele instanței aici. Va fi afișat pe fiecare pagină.
app_slogan = Sloganul instanței
app_slogan_helper = Introdu sloganul instanței aici. Lasă gol pentru a dezactiva.
[search]
user_kind = Căutați utilizatori…
team_kind = Căutați echipe…

View file

@ -80,7 +80,7 @@ rerun_all=Перезапустить все задания
save=Сохранить
add=Добавить
add_all=Включить все
remove=Исключить
remove=Удалить
remove_all=Исключить все
remove_label_str=Удалить элемент «%s»
edit=Изменить
@ -1092,7 +1092,7 @@ mirror_password_placeholder=(Неизменный)
mirror_password_blank_placeholder=(Отменено)
mirror_password_help=Смените имя пользователя для удаления пароля.
watchers=Наблюдатели
stargazers=Звездочеты
stargazers=Добавившие в избранное
stars_remove_warning=Данное действие удалит все звёзды из этого репозитория.
forks=Ответвления
reactions_more=и ещё %d
@ -2271,7 +2271,7 @@ settings.packagist_api_token=Токен API
settings.packagist_package_url=Ссылка на пакет Packagist
settings.deploy_keys=Ключи развёртывания
settings.add_deploy_key=Добавить ключ развёртывания
settings.deploy_key_desc=Ключи развёртывания предоставляют доступ к репозиторию только для чтения.
settings.deploy_key_desc=Ключи развёртывания дают доступ к просмотру репозитория и опционально к отправке изменений.
settings.is_writable=Разрешить запись
settings.is_writable_info=Может ли этот ключ быть использован для выполнения <strong>push</strong> в репозиторий? Ключи развёртывания всегда имеют доступ на pull.
settings.no_deploy_keys=Вы не добавляли ключи развёртывания.

View file

@ -3,20 +3,20 @@ home=Почетна
dashboard=Контролни панел
explore=Преглед
help=Помоћ
sign_in=Пријавите Се
sign_in=Пријави се
sign_out=Одјава
register=Регистрација
register=Региструј се
version=Верзија
page=Страница
template=Шаблон
language=Језик
signed_in_as=Пријављени сте као
signed_in_as=Пријављен си као
username=Корисничко име
password=Лозинка
repository=Спремиште
repository=Репозиторијум
organization=Организација
mirror=Огледало
new_mirror=Ново огледало
@ -24,60 +24,81 @@ settings=Подешавања
activities=Активности
pull_requests=Захтеви за спајање
pull_requests=Pull requesti
issues=Дискусије
cancel=Откажи
cancel=Прекини
logo = Лого
sign_in_with_provider = Пријавите се уз %s
sign_in_or = или
sign_up = Региструјте се
link_account = Повежите рачун
powered_by = Успостављено са %s
notifications = Обавештења
passcode = ПИН ко̑д
webauthn_insert_key = Прикључите Ваш физички сигурносни кључ
webauthn_sign_in = Притисните дугме на Вашем сигурносном кључу. Уколико Ваш кључ нема дугме, искључите и поново укључите га.
webauthn_press_button = Молимо притисните дугме на Вашем сигурносном кључу…
webauthn_use_twofa = Користите дво-факторски ко̑д са вашег мобитела
webauthn_error = Сигурносни кључ се не да исчитати.
webauthn_unsupported_browser = Ваш веб-прегледач тренутно не подржава "WebAuthn".
webauthn_error_unknown = Непозната грешка се догодила. Молимо Вас да покушате поново.
webauthn_error_insecure = "WebAuthn" једино подржава сигурне везе. За тестирање путем ХТТП, можете корисити извор "localhost" или "127.0.0.1"
webauthn_error_unable_to_process = Сервер не може обрадити Ваш захтев.
webauthn_error_duplicated = Сигурносни кључ није дозвољен за овај захтев. Уверите се да кључ није већ регистрован.
webauthn_error_empty = Морате унети име за овај кључ.
webauthn_error_timeout = Захтев је истекао пре што је очитавање Вашег кључа успео. Молимо Вас да актуализирате ову веб-страницу и покушате поново.
[error]
[startpage]
[install]
install=Инсталација
db_title=Подешавања базе
db_title=Подешавање базе података
db_type=Тип базе података
host=Хост
host=Сервер
password=Лозинка
db_name=Име базе података
path=Пут
path=Пут (path)
repo_path=Пут до корена спремишта
repo_path=Пут до корена репозиторијума
log_root_path=Пут до журнала
optional_title=Напредна подешавања
optional_title=Даљна подешавања
admin_password=Лозинка
confirm_password=Потврдите лозинку
install_btn_confirm=Успостави Forgejo
confirm_password=Потврди лозинку
install_btn_confirm=Инсталирај Forgejo
test_git_failed=Команда 'git' није успела: %v
[home]
switch_dashboard_context=Пребаците контекст контролној панели
my_orgs=Моје организације
switch_dashboard_context=Пребаци контекст контролног панела
my_orgs=Организације
view_home=Прикажи %s
issues.in_your_repos=У вашим спремиштима
issues.in_your_repos=У вашим Репозиторијумима
[explore]
repos=Спремишта
repos=Репозиторијуми
users=Корисници
[auth]
active_your_account=Активирајте ваш налог
has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (<b>%s</b>). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
resend_mail=Кликните овде да поново пошаљете писмо
active_your_account=Активирајте Ваш кориснички рачун
has_unconfirmed_mail=Здраво, %s! Имате непотврђену имејл адресу (<b>%s</b>). Ако Вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните пратеће дугме.
resend_mail=Кликни овде да поново пошаљеш писмо
[mail]
activate_account=Молимо вас активирајте ваш налог
activate_account=Молимо активирајте Ваш кориснички рачун
activate_email=Потврдите вашу адресу е-поште
activate_email=Потврди твоју адресу е-поште
@ -93,44 +114,113 @@ no=Не
[form]
UserName=Корисничко име
RepoName=Име спремишта
Email=Адреса ел. поште
RepoName=Име репозиторијума
Email=Имејл адреса
Password=Лозинка
PayloadUrl=URL адреса за слање
TeamName=Име тима
AuthName=Ауторизацијско име
AdminEmail=Адреса е-поште администратора
AuthName=Назив ауторизације
AdminEmail=Имејл адреса администратора
NewBranchName=Име нове гране
CommitSummary=Опис за ревизију
CommitMessage=Ревизни текст
CommitSummary=Опис ревизије
CommitMessage=Текст ревизије
CommitChoice=Избор ревизије
TreeName=Пут до датотеке
Content=Садржај
require_error=` не може бити празно.`
require_error=` не сме бити празно.`
size_error=` мора бити величине %s.`
min_size_error=` мора да садржи најмање %s карактера.`
max_size_error=` мора да садржи највише %s карактера.`
email_error=` није важећа адреса е-поште.`
min_size_error=` мора да садржи најмање %s знакова.`
max_size_error=` мора да садржи највише %s знакова.`
email_error=` није важећа имејл адреса.`
url_error=` није исправна URL адреса.`
include_error=` мора да садржи текст '%s'.`
unknown_error=Непозната грешка:
auth_failed=Грешка идентитета: %v
auth_failed=Грешка аутентикације: %v
target_branch_not_exist=Ова грана не постоји.
target_branch_not_exist=Циљна грана не постоји.
Biography = Биографија
Website = Веб-сајт
Location = Место
Retype = Потврди лозинку
To = Име гране
alpha_dash_error = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_"). `
alpha_dash_dot_error = ` сме само да садржи слова, бројки, црта ("-"), доњих црта ("_") као и тачки ("."). `
username_error = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_") као и тачки ("."). Не сме да почне или заврши са другим знаком од слоба или бројке, и те друге знакове не смеју бити један за другим. `
username_error_no_dots = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_"). Не сме да почне или заврши са другим знаком од слоба или бројке, и те друге знакове не смеју бити један за другим. `
captcha_incorrect = CAPTCHA ко̑д је погрешан.
password_not_match = Лозинке нису једнаке.
lang_select_error = Изабери језик са листе.
username_been_taken = Корисничко име је већ заузето.
username_change_not_local_user = Корисници који нису локални не смеју да мењају корисничко име.
username_claiming_cooldown = Корисничко име не може се изабрати јер је у заштићеном периоду. Оно стоји на располагању од/за %[1]s.
repo_name_been_taken = Име репозиторијума је већ заузето.
org_name_been_taken = Име организације је већ заузето.
team_name_been_taken = Име тима је већ заузето.
team_no_units_error = Тим мора имати приступ барем једној секцији репозиторијума.
email_been_used = Та имејл адреса се већ користи.
email_invalid = Та имејл адреса је неважећа.
email_domain_is_not_allowed = Домена имејл адресе корисника <b>%s</b> је у сукобу са EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Провери да ли је имејл адреса исправна.
openid_been_used = ОпенИД адреса "%s" се већ користи.
username_password_incorrect = Корисничко име или лозинка је неисправна.
password_complexity = Лозинка није у складу са захтевима комплексности:
password_lowercase_one = Најмање једно мало слово
password_uppercase_one = Најмање једно велико слово
password_digit_one = Најмање једна бројка
password_special_one = Најмање један посебан знак (пунктуација, заграде, наводници, итд.)
enterred_invalid_repo_name = Име репозиторијума је неважећ.
enterred_invalid_org_name = Име организације је неважећ.
enterred_invalid_owner_name = Ново име власника је неважећ.
enterred_invalid_password = Уписана лозинка је неважећа.
unset_password = Корисник нема спремљену лозинку.
unsupported_login_type = Начин пријаве не подржава брисанје корисничког рачуна.
user_not_exist = Корисник не постоји.
team_not_exist = Тим не постоји.
last_org_owner = Не може се избрисати задњи корисник из тима власника. Мора бити најмање један власник у организацији.
cannot_add_org_to_team = Организација не може бити члан у тимовима.
duplicate_invite_to_team = Корисник је већ позван да буде члан тима.
organization_leave_success = Излазак из организације %s је био успешан.
invalid_ssh_key = Твој ССХ кључ се не да проверити: %s
invalid_gpg_key = Твој ГПГ кључ се не да проверити: %s
must_use_public_key = Наведен кључ је приватни кључ. Молимо Вас да не преносите било где на интернет свој приватан кључ. Користите јаван кљил за те сврхе.
unable_verify_ssh_key = Неможемо потврдити ССХ кључ, проверите га да нема грешки.
still_own_repo = Ваш кориснички рачун је власник једног или више репозиторијума, прво их обришите или предајте другом кориснику.
still_has_org = Ваш кориснички рачун је члан једне или више организација, молимо прво да из њих изађете.
still_own_packages = Ваш кориснички рачун је власник једног или више пакета, молимо прво да их обришете.
org_still_own_repo = Та организација је власник једног или више репозиторијума, молимо прво да их обришете.
org_still_own_packages = Та организација је власник једног или више пакета, молимо прво да их обришете.
admin_cannot_delete_self = Не можеш самог себе избрисати док си администратор. Молимо прво да укинеш своја администраторска права.
[user]
repositories=Спремишта
activity=Активности
repositories=Репозиторијуми
activity=Јавне активности
follow=Прати
unfollow=Престани да пратиш
unfollow=Престани пратити
change_avatar = Измени слику профила…
joined_on = Приступео/ла %s
followers.title.one = Пратилац
followers.title.few = Пратиоци
following.title.one = Прати
following.title.few = Прате
followers_one = %d пратилац
followers_few = %d пратиоца
following_one = %d пратим
following_few = %d пратим
block_user = Блокирај корисника
block_user.detail = Молимо обратите пажњу да блокирати корисника има даљњих последица, као на пример:
block_user.detail_1 = Престаћете пратити и нећете више моћи пратити један другога.
block_user.detail_2 = Тај корисник неће моћи интерагирати са репозиторијумима које Ви поседујете, као и са задатцима и коментарима које сте ви написали.
block_user.detail_3 = Нећете моћи додати један другога као сарадника у репозиторијумима.
follow_blocked_user = Не можете пратити овог корисника јер сте блокирали тог корисника или је тај корисник Вас блокирао.
[settings]
profile=Профил
password=Лозинка
@ -147,15 +237,15 @@ cancel=Откажи
enable_custom_avatar=Укључи ваш аватар
choose_new_avatar=Изаберите нови аватар
delete_current_avatar=Обришите тренутни аватар
delete_current_avatar=Обришите тренутну слику профила
old_password=Тренутна лозинка
new_password=Нова лозинка
email_desc=Ваша главна адреса ће се користити за обавештења и других операција.
email_desc=Ваша главна адреса ће се користити за обавештења, подршку код изгубљене лозинке као и, уколико није сакривено, Гит операције путем веба.
primary=Главно
manage_ssh_keys=Управљање SSH кључева
manage_ssh_keys=Управљање ССХ кључева
add_key=Додај кључ
key_name=Име кључа
key_content=Садржај
@ -172,25 +262,25 @@ delete_token=Уклони
delete_account=Уклоните ваш налог
delete_account=Уклоните ваш рачун
confirm_delete_account=Потврдите брисање
[repo]
owner=Власник
repo_name=Име спремишта
repo_name=Име репозиторијума
visibility=Видљивост
fork_repo=Креирај огранак спремишта
fork_repo=Креирај огранак репозиторијума
fork_from=Огранак од
repo_desc=Опис
repo_lang=Језик
license=Лиценца
create_repo=Ново спремиште
create_repo=Створи нов репозиторијум
default_branch=Главна грана
mirror_prune=Очисти
watchers=Посматрачи
stargazers=Пратиоци
stargazers=Фаворисано од
forks=Огранци
@ -198,8 +288,8 @@ forks=Огранци
migrate_repo=Мигрирајте спремиште
migrate.permission_denied=Немате права на увезете локално спремиште.
migrate_repo=Мигрирајте репозиторијум
migrate.permission_denied=Немате права да импортирате локалан репозиторијум.
migrate.failed=Миграција није успела: %v
mirror_from=огледало од
@ -212,7 +302,7 @@ fork=Креирај огранак
no_desc=Нема описа
quick_guide=Кратак водич
clone_this_repo=Клонирај спремиште
clone_this_repo=Клонирај репозиторијум
code=Код
branch=Грана
@ -242,12 +332,12 @@ editor.delete=Уклони '%s'
editor.commit_directly_to_this_branch=Изврши комит директно на <strong class="%[2]s">%[1]s</strong> грану.
editor.create_new_branch=Креирај <strong>нову грану</strong> за овај комит и поднеси захтев за спајање.
editor.cancel=Откажи
editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
editor.branch_already_exists=Грана '%s' већ постоји за овај репозиторијум.
editor.no_changes_to_show=Нема никаквих промена.
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
commits.commits=Комити
commits.commits=Ревизије
commits.author=Аутор
commits.message=Порука
commits.date=Датум
@ -292,12 +382,12 @@ issues.next=Следеће
issues.open_title=Отворено
issues.closed_title=Затворено
issues.num_comments=%d коментара
issues.commented_at=`коментирира <a href="#%s">%s</a>`
issues.commented_at=`је коментирио/ла <a href="#%s">%s</a>`
issues.delete_comment_confirm=Да ли желите да избришете овај коментар?
issues.no_content=Још нема садржаја.
issues.reopen_issue=Поново отвори
issues.create_comment=Коментирај
issues.commit_ref_at=`поменуо овај задатак у комит %s`
issues.create_comment=Коментирајте
issues.commit_ref_at=`поменуо овај задатак у ревизији %s`
issues.sign_in_require_desc=<a href="%s">Пријавите се</a> да се прикључе у овом разговору.
issues.edit=Уреди
issues.cancel=Откажи
@ -317,7 +407,7 @@ pulls.filter_branch=Филтер по грани
pulls.no_results=Нема резултата.
pulls.create=Поднеси захтев за спајање
pulls.tab_conversation=Дискусија
pulls.tab_commits=Комити
pulls.tab_commits=Ревизије
pulls.merged=Спојено
pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски.
@ -364,17 +454,17 @@ settings.tracker_url_format=Спољни формат везе система з
settings.tracker_issue_style.numeric=Нумерично
settings.tracker_issue_style.alphanumeric=Алфанумерично
settings.danger_zone=Опасна зона
settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име.
settings.new_owner_has_same_repo=Нови власник већ има репозиторијум под истим именом. Молимо Вас да изаберете друго име.
settings.transfer_owner=Нови власник
settings.delete=Уклони ово спремиште
settings.delete_notices_1=- Ова операција <strong>НЕЋЕ МОЧИ</strong> бити укинута.
settings.delete=Уклони овај репозиторијум
settings.delete_notices_1=- Ова операција <strong>НЕ МОЖЕ СЕ</strong> накнадно повући.
settings.add_webhook=Додај Webhook
settings.webhook.test_delivery=Провери испоруку
settings.webhook.request=Захтев
settings.webhook.response=Одговор
settings.webhook.headers=Наслови
settings.webhook.body=Тело
settings.githook_edit_desc=о Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
settings.githook_edit_desc=о "Webhook" није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
settings.githook_name=Име Hook-а
settings.githook_content=Садржај Hook-а
settings.update_githook=Ажурирај Hook
@ -382,7 +472,7 @@ settings.secret=Тајна
settings.slack_username=Корисничко име
settings.slack_icon_url=URL адреса иконице
settings.event_create=Креирај
settings.event_pull_request=Захтев за спајање
settings.event_pull_request=Измене
settings.update_webhook=Ажурирај Webhook
settings.recent_deliveries=Недавне испоруке
settings.hook_type=Тип Hook-а
@ -429,7 +519,7 @@ create_org=Створи Организацију
repo_updated=Ажурирано
teams=Тимови
lower_members=чланови
lower_repositories=спремишта
lower_repositories=репозиторијуми
org_desc=Опис
team_name=Име тима
team_desc=Опис
@ -461,14 +551,14 @@ teams.no_desc=Овај тим нема описа
teams.settings=Подешавања
teams.members=Чланови тима
teams.update_settings=Примени промене
teams.add_team_member=Додај члан тиму
teams.add_team_member=Додајте члан тиму
teams.repositories=Тимска спремишта
teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите.
teams.add_nonexistent_repo=Овакав репозиторијум не постоји, молимо Вас прво да га направите.
[admin]
dashboard=Контролни панел
organizations=Организације
repositories=Спремишта
repositories=Репозиторијуми
config=Подешавања
notices=Системска обавештења
monitor=Праћење
@ -487,7 +577,7 @@ dashboard.memory_obtained=Коришћена меморија
dashboard.pointer_lookup_times=Захтева показивача
dashboard.current_heap_usage=Тренутна употреба динамичке меморије
dashboard.heap_memory_obtained=Слободно динамичке меморије
dashboard.heap_memory_idle=Неактиво динамичке меморије
dashboard.heap_memory_idle=Некориштена динамичка меморија
dashboard.heap_memory_in_use=Динамичка меморија у употреби
dashboard.heap_memory_released=Ослобођено динамичке меморије
dashboard.heap_objects=Објекти динамичке меморије
@ -497,7 +587,7 @@ dashboard.mspan_structures_usage=Употреба структуре MSpan
dashboard.mspan_structures_obtained=Добијено структуре MSpan
dashboard.mcache_structures_usage=Употреба структурa MCache
dashboard.mcache_structures_obtained=Добијено структурa MCache
dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket
dashboard.profiling_bucket_hash_table_obtained=Хеш-табела постигнуто за Profiling Bucket
dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа
dashboard.other_system_allocation_obtained=Добијено друга системска меморија
dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа
@ -508,7 +598,7 @@ dashboard.gc_times=Времена cакупљању смећа
users.activated=Активиран
users.admin=Администратор
users.repos=Спремишта
users.repos=репоси
users.created=Креирано
users.edit=Уреди
users.auth_source=Извор аутентикације
@ -530,9 +620,9 @@ auths.name=Име
auths.type=Тип
auths.enabled=Омогућено
auths.updated=Ажурирано
auths.auth_type=Врста провере аутентичности
auths.auth_name=Име провере аутентичности
auths.security_protocol=Протокол безбедности
auths.auth_type=Врста аутентикације
auths.auth_name=Назив аутентикације
auths.security_protocol=Сигурносни протокол
auths.domain=Домен
auths.host=Хост
auths.port=Порт
@ -552,19 +642,19 @@ auths.tips=Савети
config.server_config=Конфигурација сервера
config.disable_router_log=Онемогући журнал рутера
config.run_mode=Режим извршавања
config.repo_root_path=Пут до корена спремишта
config.repo_root_path=Пут до корена репозиторијума
config.script_type=Врста скрипта
config.reverse_auth_user=Корисничко име при обрнуту аутентикацију
config.reverse_auth_user=Корисничко име за обрнуту аутентикацију (reverse proxy)
config.ssh_config=SSH конфигурација
config.ssh_enabled=Омогућено
config.ssh_config=ССХ конфигурација
config.ssh_enabled=Активирано
config.ssh_port=Порт
config.ssh_listen_port=Порт за слушање
config.ssh_root_path=Основни пут
config.ssh_key_test_path=Пут до кључу
config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen')
config.ssh_minimum_key_size_check=Минимална величина провера кључа
config.ssh_minimum_key_sizes=Минимална величина кључева
config.ssh_key_test_path=Пут до кључа
config.ssh_keygen_path=Пут до генератора кључева ('ssh-keygen')
config.ssh_minimum_key_size_check=Провера минималне величине кључа
config.ssh_minimum_key_sizes=Минимална величина кључа
config.db_config=Конфигурација базе података
@ -575,7 +665,7 @@ config.db_path=Пут
config.service_config=Подешавања сервиса
config.show_registration_button=Прикажи дугме за регистрацију
config.active_code_lives=Дужина живота активних кодова
config.active_code_lives=Дужина трајанја активацијског кода
config.webhook_config=Подешавања Webhook
config.queue_length=Дужина реда
@ -608,10 +698,10 @@ config.enable_federated_avatar=Омогући Federated Avatars
config.git_config=Git конфигурација
config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике
config.git_max_diff_lines=Максималан број различитих редова (у датотеци)
config.git_max_diff_line_characters=Максималан број различитих карактера (у реду)
config.git_max_diff_lines=Максималан број редова с разликама по фајлу
config.git_max_diff_line_characters=Максималан број карактера с разликама по реду
config.git_max_diff_files=Максималан број измењених датотека (приказаних)
config.git_gc_args=Аргументи на cакупљање смећа
config.git_gc_args=Аргументи упљања смећа (GC)
config.git_migrate_timeout=Време до отказања миграције
config.git_mirror_timeout=Време до отазање синхронизацији огледала
config.git_clone_timeout=Време до отказивања клонирањем
@ -638,14 +728,14 @@ notices.inverse_selection=Обрна селекција
notices.delete_selected=Избриши изабране
notices.delete_all=Уклони сва обавештења
notices.type=Тип
notices.type_1=Спремиште
notices.type_1=Репозиторијум
notices.desc=Опис
notices.op=Oп.
[action]
create_repo=креира спремиште <a href="%s">%s</a>
rename_repo=преимензје спремиште од <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
transfer_repo=преноси спремиште <code>%s</code> на <a href="%s">%s</a>
create_repo=је креирао/ла репозиторијум <a href="%s">%s</a>
rename_repo=преименовао/ла је репозиторијум од <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
transfer_repo=пренео је репозиторијум <code>%s</code> на <a href="%s">%s</a>
[tool]
now=сада

View file

@ -182,8 +182,8 @@ buttons.quote.tooltip = Citera text
buttons.code.tooltip = Lägg till kod
buttons.link.tooltip = Lägg till en länk
buttons.heading.tooltip = Lägg till rubrik
buttons.bold.tooltip = Lägg till fetstilt text
buttons.italic.tooltip = Lägg till kursiv text
buttons.bold.tooltip = Lägg till fetstilt text (CTRL+B / ⌘B)
buttons.italic.tooltip = Lägg till kursiv text (CTRL+I / ⌘I)
buttons.list.unordered.tooltip = Lägg till en punktlista
buttons.list.ordered.tooltip = Lägg till en numrerad lista
buttons.list.task.tooltip = Lägg till en lista med sysslor
@ -203,6 +203,8 @@ buttons.disable_monospace_font = Avaktivera jämnbrett typsnitt
link_modal.paste_reminder = Tips: Med ett URL i ditt klippbord, kan du klistra in direkt i textredigeraren för att skapa en länk.
buttons.enable_monospace_font = Aktivera jämnbrett typsnitt
buttons.indent.tooltip = Inplacera föremål med en nivå
[filter]
string.asc = A - Ö
string.desc = Ö - A
@ -321,7 +323,7 @@ app_slogan_helper = Skriv in din slogan här. Lämna tom för att stänga av.
domain = Serverdomän
domain_helper = Domän eller värdadress för servern.
reinstall_error = Du försöker att installera i en existerande Forgejo-databas
password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrka. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system.
password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrkor. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system.
config_location_hint = Dessa konfigurationsinställningar kommer att sparas i:
invalid_db_table = Databastabellen "%s" är ogiltig: %v
secret_key_failed = Misslyckades att generera hemlig nyckel: %v
@ -335,6 +337,13 @@ invalid_password_algorithm = Ogiltig hashalgoritm för lösenord
env_config_keys_prompt = Följande miljövariabler kommer också att tillämpas på din konfigurationsfil:
smtp_from_invalid = "Skicka E-post som" adressen är ogiltig
reinstall_confirm_check_1 = Data krypterad av HEMLIG_NYCKEL i app.ini kan gå förlorad: användare kommer kanske inte att kunna logga in med 2FA/OTP & speglar funkar kanske inte korrekt. Genom att kryssa i rutan godkänner du att den nuvarande app.ini innehåller korrekta HEMLIG_NYCKEL.
reinstall_confirm_check_2 = Kodkatalogerna och inställningarna kan behövas omsynkroniseras. Genom att kryssa i rutan bekräftar du att du kommer omsynkronisera hakarna för kodkatalogerna och befogade_nycklar filen manuellt. Du bekräfar att du säkerställer att kodkatalogen och spegel inställningarna är korrekt.
run_user_helper = Operativsystemets användarnamn som Forgejo körs som. Notera att denna användare måste ha tillgång till utvecklingskatalogens rotsökväg.
enable_update_checker_helper_forgejo = Den kommer periodiskt kolla efter nya Forgejo-versionser genom att kolla ett TXT-DNS-record på release.forgejo.org.
[home]
uname_holder=Användarnamn eller e-postadress
switch_dashboard_context=Växla visad instrumentpanel
@ -356,6 +365,8 @@ show_only_public=Visar endast publika
issues.in_your_repos=I dina utvecklingskataloger
filter_by_team_repositories = Filtrera efter lagutvecklingskataloger
feed_of = Flöde av "%s"
[explore]
repos=Utvecklingskataloger
users=Användare
@ -367,6 +378,8 @@ go_to = Gå till
relevant_repositories = Endast relevanta utvecklingskataloger visas, <a href="%s">visa ofiltrerade resultat</a>.
stars_few = %d stjärnor
relevant_repositories_tooltip = Utvecklingskataloger som är gafflingar eller inte har ämne, ikon, och beskrivning är dolda.
[auth]
create_new_account=Registrera konto
disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör.
@ -433,6 +446,9 @@ password_pwned = Lösenordet du valde finns på en <a target="_blank" rel="noope
sign_up_button = Registrera dig.
sign_up_successful = Kontot skapades. Välkommen!
change_unconfirmed_email = Om du har fått fel e-post-adress under registrering kan du ändra den nedan och ett konfirmationsmejl kommer skickas till den nya e-posten istället.
unauthorized_credentials = Inloggningsuppgifterna är felaktiga eller har gått ut. Försök kommandot igen eller se %s för mer information
[mail]
activate_account=Vänligen aktivera ditt konto
@ -493,12 +509,16 @@ repo.transfer.subject_to_you = %s vill överföra förrådet ”%s” till dig
release.title = Titel: %s
[modal]
yes=Ja
no=Nej
cancel=Avbryt
modify=Uppdatera
confirm = Bekräfta
[form]
UserName=Användarnamn
RepoName=Utvecklingskatalogens namn
@ -572,6 +592,13 @@ still_has_org = Ditt konto är medlem i en eller flera organisationer. Lämna de
still_own_packages = Ditt konto har ett eller flera paket, ta bort dem först.
FullName = Fullständigt namn
Description = Beskrivning
Biography = Biografi
Website = Webbplats
Location = Plats
To = Grennamn
[user]
change_avatar=Byt din avatar…
repositories=Utvecklingskataloger
@ -594,6 +621,14 @@ settings = Användarinställningar
block = Blockera
followers.title.one = Följare
followers.title.few = Följare
following.title.one = Följer
following.title.few = Följer
followers_one = %d följare
following_one = %d följer
block_user = Blockera användare
[settings]
profile=Profil
account=Konto
@ -650,7 +685,7 @@ activate_email=Skicka aktivering
activations_pending=Väntar på aktivering
delete_email=Ta Bort
email_deletion=Ta bort e-postadress
email_deletion_desc=Mejladressen och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta?
email_deletion_desc=Denna mejladress och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta?
email_deletion_success=Mejladressen har tagits bort.
theme_update_success=Ditt tema ändrades.
theme_update_error=Det valda temat finns inte.
@ -790,6 +825,24 @@ permission_write = Läs och skriv
user_block_yourself = Du kan inte blockera dig själv.
gpg_token_help = Du kan skapa en signatur med hjälp av:
appearance = Utseende
blocked_users = Blockerade användare
profile_desc = Om dig
update_language = Ändra språk
language.title = Standardspråk
hints = Tips
update_hints = Uppdatera tips
comment_type_group_reference = Referens
comment_type_group_label = Etikett
comment_type_group_milestone = Milstolpe
comment_type_group_branch = Gren
comment_type_group_dependency = Beroende
comment_type_group_project = Projekt
webauthn_nickname = Smeknamn
quota.sizes.all = Alla
quota.sizes.assets.packages.all = Paket
quota.sizes.wiki = Wiki
[repo]
owner=Ägare
repo_name=Utvecklingskatalogens namn
@ -822,7 +875,7 @@ license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod.
readme=README
readme_helper=Välj en mall för README-filen
readme_helper_desc=Här kan du skriva en fullständig beskrivning för ditt projekt.
auto_init=Initiera utvecklingskatalog (Lägger till .gitignore, License and README)
auto_init=Initiera utvecklingskatalog
create_repo=Skapa utvecklingskatalog
default_branch=Standardgren
default_branch_helper=Den förvalda grenen är bas-gren för pull requests och kod-commits.
@ -866,7 +919,7 @@ migrate_items_wiki=Wiki
migrate_items_milestones=Milstenar
migrate_items_labels=Etiketter
migrate_items_issues=Ärenden
migrate_items_pullrequests=Pull Requester
migrate_items_pullrequests=Pull-förfrågningar
migrate_items_merge_requests=Begäran om sammanslagning
migrate_items_releases=Releaser
migrate_repo=Migrera utvecklingskatalog
@ -966,7 +1019,7 @@ editor.propose_file_change=Föreslå filändring
editor.new_branch_name_desc=Nytt branchnamn…
editor.cancel=Avbryt
editor.filename_cannot_be_empty=Filnamnet kan inte vara tomt.
editor.file_changed_while_editing=Filens innehåll har ändrats sedan du påbörjade din ändring.<a target="_blank" rel="noopener noreferrer" href="%s">Klicka här</a> för att se ändringarna eller <strong>commita ändringarna igen</strong> för att skriva över dem.
editor.file_changed_while_editing=Filens innehåll har ändrats sedan du öppnade filen.<a target="_blank" rel="noopener noreferrer" href="%s">Klicka här</a> för att se ändringarna eller <strong>commita ändringarna igen</strong> för att skriva över dem.
editor.commit_empty_file_header=Committa en tom fil
editor.commit_empty_file_text=Filen du vill committa är tom. Vill du fortsätta?
editor.no_changes_to_show=Det finns inga ändringar att visa.
@ -1062,7 +1115,7 @@ issues.remove_self_assignment=`tog bort sin tilldelning %s`
issues.change_title_at='ändrade titeln från <b><strike>%s</strike></b> till <b>%s</b> %s'
issues.delete_branch_at='tog bort grenen <b>%s</b> %s'
issues.filter_label=Etikett
issues.filter_label_exclude=`Använd <code>alt</code> + <code>klicka/enter</code> för att exkludera etiketter`
issues.filter_label_exclude=Använd <kbd>Alt</kbd> + <kbd>klicka/enter</kbd> för att exkludera etiketter
issues.filter_label_no_select=Alla etiketter
issues.filter_milestone=Milsten
issues.filter_project_none=Inget projekt
@ -1700,7 +1753,106 @@ open_with_editor = Öppna med %s
admin.manage_flags = Hantera flaggor
admin.update_flags = Uppdatera flaggor
object_format = Objektformat
default_branch_label = standard
stars = Stjärnor
transfer.accept = Acceptera överföring
desc.sha256 = SHA256
find_tag = Hitta tagg
project = Projekt
packages = Paket
file_view_source = Visa källa
file_copy_permalink = Kopiera permalänk
commit_graph.select = Välj grenar
commit_graph.color = Färg
download_file = Ladda ner fil
from_comment = (kommentar)
editor.add_file = Lägg till fil
editor.add_tmpl.filename = filnamn
editor.add = Lägg till %s
editor.update = Uppdatera %s
editor.delete = Ta bort %s
commits.search_branch = Denna gren
commitstatus.error = Fel
projects.column.edit = Redigera kolumn
projects.column.new_submit = Skapa kolumn
projects.column.new = Ny kolumn
projects.column.delete = Ta bort kolumn
projects.column.color = Färg
projects.card_type.text_only = Endast text
issues.filter_label_select_no_label = Inget etikett
issues.filter_project = Projekt
issues.filter_project_all = Alla projekt
issues.filter_sort.relevance = Relevans
issues.all_title = Alla
issues.label_archive = Arkivera etikett
issues.content_history.edited = redigerad
issues.content_history.created = skapad
compare.compare_head = jämför
pulls.has_viewed_file = Visad
pulls.merge_conflict_summary = Felmeddelande
pulls.rebase_conflict_summary = Felmeddelande
pulls.status_checks_details = Detaljer
pulls.editable = Redigerbar
milestones.filter_sort.name = Namn
ext_wiki = Extern Wiki
wiki.page_title = Sidtitel
wiki.page_content = Sidinnehåll
wiki.cancel = Avbryt
wiki.search = Sök wiki
wiki.no_search_results = Inga resultat
activity.navbar.pulse = Puls
activity.navbar.code_frequency = Kodfrekvens
activity.published_tag_label = Tagg
settings.mirror_settings.direction = Riktning
settings.mirror_settings.last_update = Senaste uppdatering
settings.mirror_settings.push_mirror.none_ssh = Ingen
settings.units.overview = Översikt
settings.units.add_more = Aktivera fler
settings.transfer.button = Överför ägarskap
settings.transfer.modal.title = Överför ägarskap
settings.transfer_abort = Avbryt överföring
settings.add_team = Lägg till team
settings.slack_color = Färg
settings.event_issue_label = Etikett
settings.event_issue_milestone = Målstolpe
settings.event_pull_request_label = Etikett
settings.event_pull_request_milestone = Målstolpar
settings.event_pull_request_comment = Kommentarer
settings.event_package = Paket
settings.graphql_url = GraphQL-URL
settings.web_hook_name_slack = Slack
settings.web_hook_name_discord = Discord
settings.web_hook_name_telegram = Telegram
settings.packagist_api_token = API-token
settings.sourcehut_builds.secrets = Hemligheter
settings.protected_branch.save_rule = Spara regel
settings.protected_branch.delete_rule = Ta bort regel
settings.protect_patterns = Mönster
settings.tags = Taggar
settings.tags.protection.allowed.users = Tillåtna användare
settings.tags.protection.allowed.teams = Tillåtna team
settings.tags.protection.allowed.noone = Ingen
settings.tags.protection.create = Lägg till regel
settings.thread_id = Tråd-ID
settings.rename_branch = Döp om gren
diff.show_more = Visa mer
release.tags = Taggar
release.tag_helper_existing = Existerande tagg.
release.delete_tag = Ta bort tagg
release.add_tag = Skapa tagg
release.asset_external_url = Extern URL
branch.create_from = från "%s"
branch.confirm_create_branch = Skapa gren
branch.create_branch_operation = Skapa gren
tag.create_tag_operation = Skapa tagg
tag.confirm_create_tag = Skapa tagg
[graphs]
component_loading = Laddar %s…
code_frequency.what = kodfrekvens
[org]
org_name_holder=Organisationsnamn
@ -1796,6 +1948,13 @@ teams.specific_repositories_helper=Medlemmar kommer endast ha tillgång till utv
teams.all_repositories=Alla utvecklingskataloger
teams.all_repositories_helper=Teamet har tillgång till alla utvecklingskataloger. När du väljer detta komma <strong>alla nuvarande utvecklingskataloger</strong> läggas till i teamet.
code = Kod
settings.visibility.limited_shortname = Begränsad
teams.none_access = Ingen åtkomst
teams.general_access = Anpassad åtkomst
teams.write_access = Skriv
teams.invite_team_member.list = Väntande inbjudningar
[admin]
dashboard=Instrumentpanel
users=Användarkonton
@ -2133,6 +2292,29 @@ users.is_restricted = Begränsat konto
self_check.database_inconsistent_collation_columns = Databasen använder kollateringen %s, men dessa kolumner använder felanpassade kollateringar. Det kan komma att orsaka oväntade problem.
hooks = Webhooks
integrations = Integrationer
config_settings = Inställningar
settings = Admininställningar
users.list_status_filter.menu_text = Filter
users.list_status_filter.not_admin = Inte admin
users.list_status_filter.not_prohibit_login = Tillåt inloggning
users.details = Användardetaljer
emails.updated = E-post uppdaterad
packages.package_manage_panel = Hantera paket
packages.creator = Skapare
packages.version = Version
auths.force_smtps = Tvinga SMTPS
auths.oauth2_icon_url = Ikon-URL
auths.tips.gmail_settings = Gmail-inställningar:
config.domain = Serverdomän
config.lfs_config = LFS-konfiguration
config.mailer_protocol = Protokoll
config.send_test_mail_submit = Skicka
monitor.stats = Statistik
monitor.last_execution_result = Resultat
monitor.queue.settings.remove_all_items = Ta bort alla
[action]
create_repo=skapade utvecklingskatalog <a href="%s"> %s</a>
rename_repo=döpte om utvecklingskalatogen från <code>%[1]s</code> till <a href="%[2]s">%[3]s</a>
@ -2148,6 +2330,8 @@ create_branch = skapade grenen <a href="%[2]s">%[3]s</a> i <a href="%[1]s">%[4]s
starred_repo = stjärnmärkte <a href="%[1]s">%[2]s</a>
watched_repo = började följa <a href="%[1]s">%[2]s</a>
review_dismissed_reason = Orsak:
[tool]
now=nu
future=framtiden
@ -2185,6 +2369,9 @@ mark_as_read=Markera som läst
mark_as_unread=Markera som oläst
mark_all_as_read=Markera alla som lästa
subscriptions = Prenumerationer
no_subscriptions = Inga prenumerationer
[gpg]
default_key=Signerad med standard nyckeln
error.extract_sign=Det gick inte att extrahera signatur
@ -2207,7 +2394,44 @@ alpine.repository.repositories=Utvecklingskataloger
conan.details.repository=Utvecklingskatalog
owner.settings.cleanuprules.enabled=Aktiv
title = Paket
filter.type.all = Alla
installation = Installation
requirements = Krav
dependencies = Beroenden
details = Detaljer
details.license = Licens
versions = Versioner
versions.view_all = Visa alla
dependency.id = ID
dependency.version = Version
alpine.repository.architectures = Arkitekturer
arch.version.description = Beskrivning
arch.version.groups = Grupp
arch.version.conflicts = Konflikter
arch.version.replaces = Ersätter
composer.dependencies = Beroenden
container.images.title = Bilder
container.details.type = Bildtyp
container.details.platform = Plattform
container.layers = Bildlager
container.labels = Etiketter
container.labels.key = Nyckel
container.labels.value = Värde
debian.repository.components = Komponenter
debian.repository.architectures = Arkitekturer
npm.dependencies = Beroenden
npm.details.tag = Tagg
pypi.requires = Kräver Python
rpm.repository.architectures = Arkitekturer
alt.repository.architectures = Arkitekturer
settings.delete = Ta bort paket
[secrets]
secrets = Hemligheter
creation = Lägg till hemlighet
deletion = Ta bort hemlighet
management = Hantera hemligheter
[actions]
runners.name=Namn
@ -2223,13 +2447,34 @@ runs.commit=Commit
status.unknown = Okänd
status.waiting = Väntar
runners.status = Status
runners.id = ID
runners.labels = Etiketter
runners.task_list.status = Status
runners.update_runner = Uppdatera ändringar
runners.status.unspecified = Okänd
runners.status.offline = Offline
runners.version = Version
runs.status = Status
variables = Variabler
variables.management = Hantera variabler
variables.creation = Lägg till variabel
variables.deletion = Ta bort variabel
variables.edit = Redigera variabel
[projects]
type-1.display_name = Individuellt projekt
[git.filemode]
symbolic_link=Symbolisk länk
normal_file = Normal fil
submodule = Submodul
[search]
exact = Exakt
exact_tooltip = Inkludera bara resultat som exakt matchar söktermen
@ -2247,7 +2492,7 @@ team_kind = Sök team…
org_kind = Sök organisationer…
issue_kind = Sök ärenden…
regexp_tooltip = Tolka söktermen som ett reguljärt uttryck
code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören.
code_search_unavailable = Kodsökning är för närvarande inte tillgängligt. Vänligen kontakta webbplatsadministratören.
fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen
no_results = Inga matchande resultat hittades.
fuzzy = Ungefärlig
@ -2259,4 +2504,13 @@ keyword_search_unavailable = Sökning på nyckelord är för närvarande inte ti
[translation_meta]
test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nå upp till 100% komplett :)
test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nå upp till 100% komplett :)
[munits.data]
b = B
kib = KiB
mib = MiB
gib = GiB
tib = TiB
pib = PiB
eib = EiB

3684
options/locale/locale_ta.ini Normal file

File diff suppressed because it is too large Load diff

3684
options/locale/locale_th.ini Normal file

File diff suppressed because it is too large Load diff

View file

@ -4,12 +4,12 @@ dashboard=Pano
explore=Keşfet
help=Yardım
logo=Logo
sign_in=Giriş Yap
sign_in=Oturum aç
sign_in_with_provider=%s ile oturum aç
sign_in_or=veya
sign_out=Çıkış Yap
sign_out=Çıkış yap
sign_up=Kaydol
link_account=Bağlantı hesabı
link_account=Hesap bağla
register=Üye Ol
version=Sürüm
powered_by=%s tarafından desteklenen
@ -17,7 +17,7 @@ page=Sayfa
template=Şablon
language=Dil
notifications=Bildirimler
active_stopwatch=Etkin Zaman Takipçisi
active_stopwatch=Etkin zaman takipçisi
tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti
create_new=Oluştur…
user_profile_and_more=Profil ve ayarlar…
@ -30,7 +30,7 @@ return_to_forgejo=Forgejo'ya Dön
username=Kullanıcı Adı
email=E-posta adresi
password=Parola
access_token=Erişim Kodu
access_token=Erişim jetonu
re_type=Parolayı doğrula
captcha=CAPTCHA
twofa=İki aşamalı doğrulama
@ -53,7 +53,7 @@ repository=Depo
organization=Organizasyon
mirror=Yansı
new_mirror=Yeni yansıma
new_fork=Yeni Depo Çatalı
new_fork=Yeni depo çatalı
new_project=Yeni proje
new_project_column=Yeni sütun
admin_panel=Site yönetimi
@ -69,7 +69,7 @@ collaborative=İşbirlikçi
forks=Çatallar
activities=Etkinlikler
pull_requests=Değişiklik istekleri
pull_requests=Birleştirme istekleri
issues=Konular
milestones=Kilometre Taşları
@ -83,7 +83,7 @@ add=Ekle
add_all=Tümünü ekle
remove=Kaldır
remove_all=Tümünü kaldır
remove_label_str=`"%s" öğesini kaldır`
remove_label_str="%s" öğesini kaldır
edit=Düzenle
view=Görüntüle
@ -111,7 +111,7 @@ go_back=Geri Git
never=Asla
unknown=Bilinmiyor
rss_feed=RSS yayını
rss_feed=RSS akışı
pin=Sabitle
unpin=Sabitlemeyi kaldır
@ -135,9 +135,9 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz
name=İsim
value=Değer
copy_generic = Panoya kopyala
filter = Filtrele
filter = Süzgeç
filter.not_archived = Arşivlenmemiş
filter.clear = Filtreleri Temizle
filter.clear = Süzgeçleri temizle
filter.is_archived = Arşivlenmiş
filter.is_mirror = Yansılar
filter.is_fork = Çatallar
@ -155,11 +155,11 @@ new_org.title = Yeni organizasyon
new_repo.link = Yeni depo
new_org.link = Yeni organizasyon
error413 = Kotanızı doldurdunuz.
toggle_menu = Menüyü aç-kapa
new_migrate.title = Yeni göç
new_migrate.link = Yeni göç
toggle_menu = Menüyü aç-kapat
new_migrate.title = Taşıma
new_migrate.link = Taşıma
copy_path = Dizini kopyala
confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinizden emin misiniz?
confirm_delete_artifact = "%s" yapısını silmek istediğinize emin misiniz?
[aria]
navbar=Gezinti çubuğu
@ -178,8 +178,8 @@ contributions_format = {day} {month} {year} tarihinde {contributions} katkı
[editor]
buttons.heading.tooltip=Başlık ekle
buttons.bold.tooltip=Kalın metin ekle
buttons.italic.tooltip=Eğik metin ekle
buttons.bold.tooltip=Kalın metin ekle (Ctrl+B / ⌘B)
buttons.italic.tooltip=Eğik metin ekle (Ctrl+I / ⌘I)
buttons.quote.tooltip=Metni alıntıla
buttons.code.tooltip=Kod ekle
buttons.link.tooltip=Bağlantı ekle
@ -228,7 +228,7 @@ platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür işletim sistemlerinde
[install]
install=Kurulum
title=Başlangıç Yapılandırması
title=Başlangıç yapılandırması
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
db_title=Veritabanı ayarları
@ -256,52 +256,52 @@ err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullan
err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz
general_title=Genel ayarlar
app_name=Site Başlığı
app_name_helper=Şirket adınızı buraya girebilirsiniz.
app_name=Oluşum başlığı
app_name_helper=Buraya örnek adınızı girin. Her sayfada görüntülenecektir.
repo_path=Depo kök dizini
repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir.
lfs_path=Git LFS kök dizini
lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boş bırakın.
run_user=Şu Kullanıcı Olarak Çalıştır
run_user=Çalıştıracak olan kullanıcı
run_user_helper=Forgejo'nin çalışacağı işletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna erişiminin olması gerektiğini unutmayın.
domain=Sunucu alan adı
domain_helper=Sunucu için alan adı veya ana bilgisayar adresi.
ssh_port=SSH Sunucu Portu
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. Etkisizleştimek için boş bırakın.
http_port=Forgejo HTTP Dinleme Portu
http_port_helper=Forgejo'nın web sunucusunun dinleyeceği port numarası.
app_url=Forgejo Kök URL
ssh_port=SSH sunucu portu
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. SSH sunucusunu devre dışı bırakmak için boş bırakın.
http_port=HTTP dinleme portu
http_port_helper=Forgejo web sunucusunun kullanacağı port numarası.
app_url=Taban URL
app_url_helper=HTTP(S) kopyalama URL'leri ve e-posta bildirimleri için temel adres.
log_root_path=Günlük Dosyaları Yolu
log_root_path=Kayıt dizini
log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir.
optional_title=İsteğe Bağlı Ayarlar
optional_title=İsteğe bağlı ayarlar
email_title=E-posta ayarları
smtp_addr=SMTP sunucusu
smtp_port=SMTP portu
smtp_from=E-posta Gönderen
smtp_from=E-posta gönderen
smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" <eposta@ornek.com> biçimini kullanın.
mailer_user=SMTP kullanıcı adı
mailer_password=SMTP parolası
register_confirm=Kayıt için E-posta Doğrulaması Gereksin
register_confirm=Kayıt olmak için e-posta doğrulaması gereksin
mail_notify=E-Posta bildirimlerini etkinleştir
server_service_title=Sunucu ve Diğer Servis Ayarları
offline_mode=Yerel Kipi Etkinleştir
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
server_service_title=Sunucu ve üçüncü parti servis ayarları
offline_mode=Yerel modu etkinleştir
offline_mode.description=Üçüncü parti içerik teslim ağlarını devre dışı bırak ve bütün kaynakları yerelden sun.
disable_gravatar=Gravatar'ı Devre Dışı Bırak
disable_gravatar.description=Gravatar ve diğer üçüncü parti profil resmi kaynaklarını kullanma. Kullanıcı bir profil resmi yüklemediği zaman varsayılan bir resim kullanılacaktır.
federated_avatar_lookup=Birleştirilmiş Avatarları Etkinleştir
federated_avatar_lookup=Birleştirilmiş profil resimlerini etkinleştir
federated_avatar_lookup.description=Libravatar kullanarak federe profil resmi aramasını etkinleştirin.
disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak
disable_registration.description=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluşturabilecek.
disable_registration=Kullanıcı kaydını devre dışı bırak
disable_registration.description=Sadece oluşum yöneticileri yeni kullanıcı hesapları oluşturabilecek. Herkese açık bir oluşum oluşturup yüksek miktarda spam hesapla uğraşmaya hazır değilseniz kayıt olmanın kapatılması şiddetle önerilir.
allow_only_external_registration.description=Sadece belirlenen dış hizmetler aracılığıyla kullanıcı kaydına izin ver.
openid_signin=OpenID Oturum Açmayı Etkinleştir
openid_signin.description=OpenID ile kullanıcı girişini etkinleştir.
openid_signup=OpenID ile Kendi Kendine Kaydı Etkinleştir
openid_signup.description=OpenID Tabanlı Kendi Kendi Kullanıcı Kaydını Etkinleştir.
openid_signup=OpenID ile kayıt olmayı etkinleştir
openid_signup.description=Eğer kayıt olma açık ise kullanıcılara OpenID ile hesap oluşturma seçeneği sunar.
enable_captcha=CAPTCHA kaydını etkinleştir
enable_captcha.description=Kullanıcının kendi kendine kaydolması için captcha doğrulaması gereksin.
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
enable_captcha.description=Hesap oluşturmak için CAPTCHA'yı zorunlu tut.
require_sign_in_view=Oluşum içeriğini görüntülemek için giriş yapmayı zorunlu kıl
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıt olan kullanıcı kendiliğinden yönetici olacaktır.
admin_title=Yönetici hesabı ayarları
@ -310,13 +310,13 @@ admin_password=Parola
confirm_password=Parolayı doğrula
admin_email=E-posta adresi
install_btn_confirm=Forgejo'u Kur
test_git_failed='git' komut testi başarısız: %v
sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü değil) indirin.
test_git_failed="git" komutu test edilemedi: %v
sqlite3_not_available=Bu Forgejo sürümü SQLite3'ü desteklemiyor. Lütfen resmi sürümü %s adresinden indirin ("gobuild" versiyonunu değil).
invalid_db_setting=Veritabanı ayarları geçersiz: %v
invalid_db_table=`"%s" veritabanı tablosu geçersiz: %v`
invalid_repo_path=Depo kök dizini geçersiz: %v
invalid_app_data_path=Uygulama veri yolu geçersiz: %v
run_user_not_match='Birlikte çalıştır' kullanıcı adı şimdiki kullanıcı adından farklıdır: %s -> %s
run_user_not_match="Çalıştıracak olan kullanıcı" şu anki kullanıcı adı değil: %s -> %s
internal_token_failed=Dahili belirteç oluşturulamadı: %v
secret_key_failed=Gizli anahtar oluşturulamadı: %v
save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
@ -324,15 +324,15 @@ invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
invalid_log_root_path=Log dosya yolu geçersiz: %v
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
default_enable_timetracking.description=Yeni depolar için zaman takibini varsayılan olarak etkinleştir.
no_reply_address=Gizlenecek E-Posta Alan Adı
no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için alan adı. Örneğin 'ali' kullanıcı adı, gizlenmiş e-postalar için alan adı 'yanityok.ornek.org' olarak ayarlandığında Git günlüğüne 'ali@yanityok.ornek.org' olarak kaydedilecektir.
password_algorithm=Parola Hash Algoritması
default_allow_create_organization=Organizasyonların oluşturulmasına varsayılan olarak izin ver
default_allow_create_organization.description=Yeni kullanıcıların organizasyon olmasına varsayılan olarak izin ver. Bu ayar kapatıldığında yeni kullanıcıların organizasyon açabilmeleri için bir yöneticiden izin almış olmaları gerekmektedir.
default_enable_timetracking=Zaman takibini varsayılan olarak etkinleştir
default_enable_timetracking.description=Yeni depolar için zaman takibi özelliğini varsayılan olarak etkinleştir.
no_reply_address=Gizli e-posta alan adı
no_reply_address_helper=Gizli e-posta adresine sahip kullanıcılar için alan adı. Örneğin "ali" kullanıcı adı, bu alan adı "yanityok.ornek.org" olarak ayarlandığında Git kayıtlarında "ali@yanityok.ornek.org" olarak gözükecektir.
password_algorithm=Şifre hash algoritması
invalid_password_algorithm=Hatalı parola hash algoritması
password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
password_algorithm_helper=Şifre hashleme algoritmasını ayarlayın. Her algoritma farklı gereksinimlere ve güce sahip. Argon2 algoritması gayet güçlü ancak yüksek miktarda bellek tüketmekte ve küçük sistemler için uygun olmayabilir.
enable_update_checker=Güncelleme denetleyicisini etkinleştir
env_config_keys=Ortam Yapılandırma
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
@ -347,11 +347,11 @@ config_location_hint = Bu yapılandırma seçenekleri şuraya kaydedilecek:
[home]
uname_holder=Kullanıcı adı veya e-posta adresi
switch_dashboard_context=Panoya Geçiş Yap
switch_dashboard_context=Pano bağlamını değiştir
my_repos=Depolar
my_orgs=Organizasyonlarım
my_orgs=Organizasyonlar
view_home=%s Görüntüle
filter=Diğer Süzgeçler
filter=Diğer süzgeçler
filter_by_team_repositories=Takım depolarına göre süz
feed_of=`"%s" beslemesi`
@ -455,6 +455,8 @@ hint_login = Mevcut hesabın var mı? <a href="%s">Hemen giriş yap!</a>
use_onetime_code = Tek kullanımlık kod kullan
change_unconfirmed_email = Kayıt sırasında yanlış e-posta adresi verdiyseniz, aşağıdan değiştirebilirsiniz; yeni adresinize bir onay mesajı gönderilecektir.
unauthorized_credentials = Kimlik bilgileri yanlış veya sona ermiş. Komutunuzu tekrar deneyin veya daha fazla bilgi için %s ziyaret edin
[mail]
view_it_on=%s üzerinde görüntüle
reply=veya doğrudan bu e-postayı yanıtlayın
@ -529,6 +531,13 @@ admin.new_user.user_info = Kullanıcı bilgisi
admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için <a href="%s">buraya tıklayın</a>.
password_change.text_1 = Hesabınızın parolası değişti.
primary_mail_change.text_1 = Hesabınızın ana e-posta adresi, %[1]s olarak değiştirildi. Bundan dolayı bu e-posta adresi hesabınızla alakalı e-posta bildirimlerini almayacak.
totp_disabled.no_2fa = Artık herhangi bir iki aşamalı giriş yönteminiz ayarlanmış bulunmamakta, yani hesabınıza giriş yaparken iki aşamalı giriş yapmanıza gerek kalmamıştır.
removed_security_key.no_2fa = Artık herhangi bir iki aşamalı giriş yönteminiz ayarlanmış bulunmamakta, yani hesabınıza giriş yaparken iki aşamalı giriş yapmanıza gerek kalmamıştır.
totp_enrolled.subject = TOTP, 2 aşamalı giriş yöntemi olarak aktifleştirildi
totp_enrolled.text_1.no_webauthn = TOTP'yi hesabınız için aktifleştirdiniz. Bundan dolayı gelecekte hesabınıza giriş yaparken 2 aşamalı giriş yöntemi olarak TOTP kullanmanız gerekecek.
totp_enrolled.text_1.has_webauthn = TOTP'yi hesabınız için aktifleştirdiniz. Bu sayede gelecekte hesabınıza giriş yaparken 2 aşamalı giriş yöntemi olarak güvenlik anahtarlarınızın yanında TOTP'yi de kullanabilirsiniz.
[modal]
yes=Evet
no=Hayır
@ -637,6 +646,8 @@ unset_password = Oturum açma kullanıcısı parola belirlemedi.
unsupported_login_type = Oturum açma türü hesap silmeyi desteklemiyor.
email_domain_is_not_allowed = Kullanıcı e-posta adresi <b>%s</b> alan adı EMAIL_DOMAIN_ALLOWLIST veya EMAIL_DOMAIN_BLOCKLIST ile çelişiyor. Lütfen işleminizin beklendiğinden emin olun.
username_claiming_cooldown = Bu kullanıcı adı hala korunma döneminde olduğundan bu kullanıcı adını alamazsınız. Ancak %[1]s tarihinde bu kullanıcı adını edinebilirsiniz.
[user]
change_avatar=Profil resmini değiştir…
joined_on=%s tarihinde katıldı
@ -644,7 +655,7 @@ repositories=Depolar
activity=Genel Aktivite
followers_few=%d takipçiler
starred=Yıldızlanmış depolar
watched=İzlenen Depolar
watched=İzlenen depolar
code=Kod
projects=Projeler
overview=Genel Bakış
@ -655,7 +666,7 @@ user_bio=Biyografi
disabled_public_activity=Bu kullanıcı, etkinliğin herkese görünür olmasını devre dışı bıraktı.
email_visibility.limited=E-posta adresiniz giriş yapmış tüm kullanıcılar tarafından görünür
show_on_map=Bu yeri harita üzerinde göster
settings=Kullanıcı Ayarları
settings=Kullanıcı ayarları
form.name_reserved=`"%s" kullanıcı adı rezerve edilmiş.`
form.name_pattern_not_allowed=Kullanıcı adında "%s" deseni kullanılamaz.
@ -678,6 +689,9 @@ block_user.detail_2 = Bu kullanıcı sahip olduğunuz depolar, açtığınız so
block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz.
block_user.detail = Bu kullanıcıyı engellediğinizde:
block_user.detail_3 = Birbirinizi depo işbirlikçileri olarak ekleyemeyeceksiniz.
public_activity.visibility_hint.self_private_profile = Profilin gizli olduğundan etkinliğin sadece sana ve oluşum yöneticilerine görünür. <a href="%s">Ayarla</a>.
[settings]
profile=Profil
account=Hesap
@ -685,18 +699,18 @@ appearance=Görünüm
password=Parola
security=Güvenlik
avatar=Avatar
ssh_gpg_keys=SSH / GPG Anahtarları
ssh_gpg_keys=SSH / GPG anahtarları
applications=Uygulamalar
orgs=Kuruluşlar
repos=Depolar
delete=Hesabı sil
twofa=İki aşamalı doğrulama
twofa=İki aşamalı doğrulama (TOTP)
organization=Organizasyonlar
uid=UID
webauthn=Güvenlik Anahtarları
public_profile=Herkese açık profil
biography_placeholder=Bize kendiniz hakkında birşeyler söyleyin! (Markdown kullanabilirsiniz)
biography_placeholder=Diğerlerine kendiniz hakkında birşeyler söyleyin! (Markdown destekleniyor)
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.
@ -705,7 +719,7 @@ website=Web Sitesi
location=Konum
update_theme=Temayı Güncelle
update_profile=Profili Güncelle
update_language=Dili Güncelle
update_language=Dili değiştir
update_language_not_found=`"%s" dili mevcut değil.`
update_language_success=Dil güncellendi.
update_profile_success=Profil resminiz güncellendi.
@ -784,7 +798,7 @@ add_email_confirmation_sent=`"%s" adresine bir doğrulama e-postası gönderildi
add_email_success=Yeni e-posta adresi eklendi.
email_preference_set_success=E-posta tercihi başarıyla ayarlandı.
add_openid_success=Yeni OpenID adresi eklendi.
keep_email_private=E-posta Adresini Gizle
keep_email_private=E-posta adresini gizle
keep_email_private_popup=Bu, e-posta adresinizi profilde, değişiklik isteği yaptığınızda veya web arayüzünde dosya düzenlediğinizde gizleyecektir. İtilen işlemeler değişmeyecektir.
openid_desc=OpenID, kimlik doğrulama işlemini harici bir sağlayıcıya devretmenize olanak sağlar.
@ -983,6 +997,44 @@ hints = İpuçları
language.description = Bu dil giriş yaptığınızda varsayılan dil olarak kullanılmak üzere hesabınıza kaydedilecektir.
keep_activity_private.description = Şu anki <a href="%s">halka açık aktiviteniz</a> sadece size ve oluşum yöneticilerine açık olacaktır.
storage_overview = Depolamaya genel bakış
quota = Kota
change_username_redirect_prompt.with_cooldown.one = Eski kullanıcı adı %[1]d günlük korunma döneminin ardından herkes tarafından kullanılabilir hale gelecek. Korunma dönemi süresince eski kullanıcı adını tekrar alabilirsin.
change_username_redirect_prompt.with_cooldown.few = Eski kullanıcı adı %[1]d günlük korunma döneminin ardından herkes tarafından kullanılabilir hale gelecek. Korunma dönemi süresince eski kullanıcı adını tekrar alabilirsin.
language.localization_project = Forgejo'yu kendi lisanında çevirmemize yardımcı ol! <a href="%s">Daha fazla bilgi edin</a>.
additional_repo_units_hint = Ek depo birimlerini etkinleştirmeyi öner
additional_repo_units_hint_description = Tüm birimleri etkinleştirmemiş depolar için "Dahasını etkinleştir" ipucunu göster.
update_hints = İpuçlarını güncelle
update_hints_success = İpuçları güncellendi.
keep_pronouns_private = Zamirleri sadece giriş yapan kullanıcılara göster
keep_pronouns_private.description = Bu giriş yapmamış ziyaretçilerden zamirleri gizleyecektir.
ssh_token_help_ssh_agent = veya bir SSH agent kullanıyorsanız (SSH_AUTH_SOCK değişkeni ayarlanmış olarak):
regenerate_token = Yeniden oluştur
access_token_regeneration = Erişim jetonunu tekrar oluştur
access_token_regeneration_desc = Bir jetonu yeniden oluşturmak, o jetonu kullanan uygulamaların hesabınıza erişimini kesecektir. Bu işlem geri alınamaz. Devam edilsin mi?
regenerate_token_success = Jeton yeniden oluşturuldu. Jetonu kullanan uygulamaların artık hesabınıza erişimi kesilmiştir ve yeni jeton ile güncellenmeleri gerekmektedir.
blocked_users_none = Engellenmiş kullanıcı yok.
blocked_since = %s tarihinden beri engellenmiş
user_block_yourself = Kendini engelleyemezsin.
quota.applies_to_user = Aşağıdaki kota kuralları hesabınızda geçerlidir
quota.applies_to_org = Aşağıdaki kota kuralları bu organizasyonda geçerlidir
quota.rule.exceeded = ıldı
quota.rule.exceeded.helper = Bu kural için nesnelerin toplam boyutu kotayı aştı.
quota.rule.no_limit = Sınırsız
quota.sizes.all = Tümü
quota.sizes.repos.all = Depolar
quota.sizes.repos.public = Herkese açık depolar
quota.sizes.repos.private = Gizli depolar
quota.sizes.git.all = Git içeriği
quota.sizes.git.lfs = Git LFS
quota.sizes.assets.all = Varlıklar
quota.sizes.assets.attachments.all = Ekler
quota.sizes.assets.attachments.issues = Sorun ekleri
quota.sizes.assets.attachments.releases = Sürüm ekleri
quota.sizes.assets.artifacts = Yapılar
quota.sizes.assets.packages.all = Paketler
quota.sizes.wiki = Viki
[repo]
new_repo_helper=Bir depo, sürüm geçmişi dahil tüm proje dosyalarını içerir. Zaten başka bir yerde mi barındırıyorsunuz? <a href="%s">Depoyu taşıyın.</a>
owner=Sahibi
@ -1074,9 +1126,9 @@ tree_path_not_found.commit=%[1]s yolu, %[2]s işlemesinde mevcut değil
tree_path_not_found.branch=%[1]s yolu, %[2]s dalında mevcut değil
tree_path_not_found.tag=%[1]s yolu, %[2]s etiketinde mevcut değil
transfer.accept=Aktarımı Kabul Et
transfer.accept=Aktarımı kabul Et
transfer.accept_desc=`"%s" tarafına aktar`
transfer.reject=Aktarımı Reddet
transfer.reject=Aktarımı reddet
transfer.reject_desc=`"%s" tarafına aktarımı iptal et`
transfer.no_permission_to_accept=Bu aktarımı kabul etme izniniz yok.
transfer.no_permission_to_reject=Bu aktarımı reddetme izniniz yok.
@ -1087,41 +1139,41 @@ desc.template=Şablon
desc.internal=Dahili
desc.archived=Arşivlenmiş
template.items=Şablon Öğeleri
template.git_content=Git İçeriği (Varsayılan Dal)
template.git_hooks=Git İstemcileri
template.git_hooks_tooltip=Eklendikten sonra Git İstemcilerini değiştirmek veya kaldırmak mümkün değildir. Bunu yalnızca şablon deposuna güveniyorsanız seçin.
template.items=Şablon öğeleri
template.git_content=Git içeriği (Varsayılan dal)
template.git_hooks=Git kancaları
template.git_hooks_tooltip=Şu anda bir kere eklendikten sonra Git kancalarını düzenleyemez veya kaldıramazsın. Bunu yalnızca şablon deposuna güveniyorsanız seçin.
template.webhooks=Web İstemcileri
template.topics=Konular
template.avatar=Profil Resmi
template.issue_labels=Konu Etiketleri
template.issue_labels=Sorun etiketleri
template.one_item=En az bir şablon öğesi seçmelisiniz
template.invalid=Bir şablon deposu seçmelisiniz
archive.title=Bu depo arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız.
archive.title_date=Bu depo %s tarihinde arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız.
archive.title=Bu depo arşivlendi. Dosyaları görüntüleyip klonlayabilirsiniz ancak katkılar gönderemez, yeni sorun ve birleştirme isteği oluşturamaz veya yorum yapamazsınız yani durumunu değiştiremezsiniz.
archive.title_date=Bu depo %s tarihinde arşivlendi. Dosyaları görüntüleyip klonlayabilirsiniz ancak katkılar gönderemez, yeni sorun ve birleştirme isteği oluşturamaz veya yorum yapamazsınız yani durumunu değiştiremezsiniz.
form.reach_limit_of_creation_1=Zaten %d depo limitinize ulaştınız.
form.reach_limit_of_creation_n=Zaten %d depo limitinize ulaştınız.
form.name_reserved=Depo adı "%s" rezerve edilmiş.
form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz.
need_auth=Yetkilendirme
migrate_options=Göç seçenekleri
migrate_options=Taşıma ayarları
migrate_options_mirror_helper=Bu depo bir yansı olacaktır
migrate_options_lfs=LFS dosyalarını taşı
migrate_options_lfs_endpoint.label=LFS Uç Noktası
migrate_options_lfs_endpoint.label=LFS uç noktası
migrate_options_lfs_endpoint.description=Taşıma, <a target="_blank" rel="noopener noreferrer" href="%s"> LFS sunucusunu belirlemek</a> için Git uzak sunucusunu kullanmaya çalışacak. Eğer LFS veri deposu başka yerdeyse özel bir uç nokta da belirtebilirsiniz.
migrate_options_lfs_endpoint.description.local=Yerel bir sunucu yolu da destekleniyor.
migrate_options_lfs_endpoint.placeholder=Boş bırakılırsa, uç nokta klon URL'sinden türetilecektir
migrate_items=Göç öğeleri
migrate_items=Taşıma öğeleri
migrate_items_wiki=Wiki
migrate_items_milestones=Kilometre Taşları
migrate_items_labels=Etiketler
migrate_items_issues=Konular
migrate_items_pullrequests=Değişiklik İstekleri
migrate_items_merge_requests=Birleştirme İstekleri
migrate_items_pullrequests=Birleştirme istekleri
migrate_items_merge_requests=Birleştirme istekleri
migrate_items_releases=Sürümler
migrate_repo=Depoyu Göç Ettir
migrate_repo=Depoyu taşı
migrate.clone_address=URL'den Taşı / Klonla
migrate.clone_address_desc=Varolan bir deponun HTTP(S) veya Git 'klonlama' URL'si
migrate.github_token_desc=GitHub API hız sınırı nedeniyle göçü hızlandırmak için buraya virgülle ayrılmış bir veya daha fazla erişm anahtarı koyabilirsiniz. UYARI: Bu özelliğin kötüye kullanılması, hizmet sağlayıcının politikasını ihlal edebilir ve hesabın engellenmesine yol açabilir.
@ -1140,7 +1192,7 @@ migrate.migrating_failed=<b>%s</b> konumundan taşıma başarısız oldu.
migrate.migrating_failed.error=Göç yapılamadı: %s
migrate.migrating_failed_no_addr=Göç başarısız oldu.
migrate.migrating_git=Git Verilerini Taşıma
migrate.migrating_topics=Konuları Tıma
migrate.migrating_topics=Konuları tıma
migrate.migrating_milestones=Kilometre Taşlarını Taşıma
migrate.migrating_labels=Etiketleri Taşıma
migrate.migrating_releases=Sürümleri Taşıma
@ -1162,10 +1214,10 @@ unstar=Yıldızı Kaldır
star=Yıldızla
fork=Çatalla
download_archive=Depoyu İndir
more_operations=Daha Fazla İşlem
more_operations=Diğer işlemler
no_desc=ıklama Yok
quick_guide=Hızlı Başlangıç Kılavuzu
no_desc=ıklama yok
quick_guide=Hızlı başlangıç kılavuzu
clone_this_repo=Bu depoyu klonla
cite_this_repo=Bu depoya atıf ver
create_new_repo_command=Komut satırında yeni bir depo oluşturuluyor
@ -1224,7 +1276,7 @@ symbolic_link=Sembolik Bağlantı
executable_file=Çalıştırılabilir Dosya
commit_graph=İşleme Grafiği
commit_graph.select=Dalları seç
commit_graph.hide_pr_refs=Değişiklik İsteklerini Gizle
commit_graph.hide_pr_refs=Değişiklik isteklerini gizle
commit_graph.monochrome=Siyah Beyaz
commit_graph.color=Renk
commit.contained_in=Bu işleme şunda yer alıyor:
@ -1670,10 +1722,10 @@ issues.review.dismissed=%s incelemesini %s reddetti
issues.review.dismissed_label=Reddedildi
issues.review.left_comment=bir yorum yaptı
issues.review.content.empty=İstenen değişiklik(ler)i belirten bir yorum bırakmanız gerekir.
issues.review.reject=%s değişiklik istedi
issues.review.reject=%s değişiklik talep etti
issues.review.wait=için %s inceleme isteği
issues.review.add_review_request=%s tarafından %s inceleme istedi
issues.review.remove_review_request=%s %s için inceleme isteği kaldırıldı
issues.review.add_review_request=%[2]s, %[1]s tarafından incelenmesi talep etti
issues.review.remove_review_request=%[2]s, %[1]s tarafından incelenme talebini kaldırdı
issues.review.remove_review_request_self=%s incelemeyi reddetti
issues.review.pending=Beklemede
issues.review.pending.tooltip=Bu yorum başkaları tarafından görünmüyor. Bekleyen yorumlarınızı göndermek için, sayfanın üstünde "%s" -> "%s/%s/%s" seçin.
@ -2447,7 +2499,7 @@ diff.review.reject=Değişiklik iste
diff.review.self_approve=Değişiklik isteği sahipleri kendi değişiklik isteklerini onaylayamazlar
diff.committed_by=işlemeyi yapan:
diff.protected=Korumalı
diff.image.side_by_side=Yan Yana
diff.image.side_by_side=Yan yana
diff.image.swipe=Kaydır
diff.image.overlay=Arayüz
diff.has_escaped=Bu satırda gizli evrensel kod karakterler var
@ -2616,6 +2668,55 @@ issues.filter_no_results_placeholder = Arama filtrelerini değiştirmeyi deneyin
issues.filter_no_results = Sonuç yok
issues.num_participants_one = %d katılımcı
new_from_template = Bir şablon kullan
new_from_template_description = Bu oluşumda bulunan bir depo şablonunu seçip ayarlarını uygulayabilirsiniz.
new_advanced = Gelişmiş ayarlar
new_advanced_expand = Genişletmek için tıklayın
size_format = %[1]s: %[2]s; %[3]s: %[4]s
object_format_helper = Deponun nesne biçimi. Sonradan değiştirilemez. SHA1 en uyumlu olanıdır.
auto_init_description = Git geçmişini bir README dosyası ve isteğe bağlı olarak License ve .gitignore dosyalarıyla başlat.
summary_card_alt = %s deposunun özet kartı
archive.nocomment = Depo arşivlenmiş olduğu için yorum yapılamıyor.
archive.pull.noreview = Bu depo arşivlenmiş. Birleştirme isteklerini inceleyemezsin.
sync_fork.branch_behind_one = Bu dal, %[2]s dalından %[1]d katkı geride
sync_fork.branch_behind_few = Bu dal, %[2]s dalından %[1]d katkı geride
sync_fork.button = Senkronize et
form.string_too_long = Verilen dize %d karakterden uzun.
migrate.repo_desc_helper = Var olan açıklamayı içe aktarmak için boş bırakınız
subscribe.issue.guest.tooltip = Bu soruna abone olmak için oturum açın.
subscribe.pull.guest.tooltip = Bu birleştirme isteğine abone olmak için oturum açın.
project = Projeler
n_commit_one = %s katkı
n_tag_one = %s etiket
n_release_one = %s sürüm
n_release_few = %s sürüm
file_follow = Sembolik bağlantıyı takip et
no_eol.text = EOL bulunamadı
no_eol.tooltip = Bu dosya, en sonunda satır sonu karakterini içermiyor.
editor.invalid_commit_mail = Katkı oluşturmak için geçersiz e-posta.
editor.commit_id_not_matching = Siz bu dosyayı düzenlerken dosya değiştirildi. Yeni bir dalda katkı yap ve sonra birleştir.
editor.commit_email = Katkı e-postası
commits.view_single_diff = Bu dosyaya bu katkıda gelen değişiklikleri görüntüle
issues.new.assign_to_me = Kendime ata
issues.filter_type.all_pull_requests = Tüm birleştirme istekleri
issues.filter_sort.relevance = Alakalılık
issues.all_title = Tümü
issues.num_reviews_one = %d inceleme
issues.num_reviews_few = %d inceleme
issues.reaction.add = Tepki ekle
issues.reaction.alt_few = %[1]s, %[2]s ile tepki verdi.
issues.reaction.alt_many = %[1]s ve %[2]d dahası %[3]s ile tepki verdiler.
issues.reaction.alt_remove = %[1]s tepkisini yorumdan kaldır.
issues.reaction.alt_add = %[1]s tepkisini yoruma ekle.
issues.context.menu = Yorum menüsü
issues.author.tooltip.issue = Bu kullanıcı, bu sorunun sahibi.
issues.author.tooltip.pr = Bu kullanıcı, bu birleştirme isteğinin sahibi.
issues.archived_label_description = (Arşivlenmiş) %s
issues.review.add_review_requests = %[2]s, %[1]s tarafından incelenmesi talep etti
issues.review.remove_review_requests = %[2]s, %[1]s tarafından incelenme talebini kaldırdı
release.hide_archive_links = Otomatik oluşturulmuş arşivleri gizle
release.hide_archive_links_helper = Bu sürüm için otomatik oluşturulmuş kaynak kodu arşivlerini gizle. Örneğin, kendi kaynak dosyalarınızı yüklemek isterseniz.
[graphs]
component_loading = %s yükleniyor...
component_loading_failed = %s yüklenemedi
@ -3043,7 +3144,7 @@ auths.tip.google_plus=OAuth2 istemci kimlik bilgilerini %s adresindeki Google AP
auths.tip.openid_connect=Bitiş noktalarını belirlemek için OpenID Connect Discovery URL'sini kullanın (<server>/.well-known/openid-configuration)
auths.tip.twitter=%s adresine gidin, bir uygulama oluşturun ve “Bu uygulamanın Twitter ile oturum açmak için kullanılmasına izin ver” seçeneğinin etkin olduğundan emin olun
auths.tip.discord=%s adresinde yeni bir uygulama kaydedin
auths.tip.gitea=Yeni bir OAuth2 uygulaması kaydedin. Rehber %s adresinde bulunabilir
auths.tip.gitea=Yeni bir OAuth2 uygulaması kaydet. Rehber %s adresinde bulunabilir
auths.tip.yandex=`%s adresinde yeni bir uygulama oluşturun. "Yandex.Passport API'sı" bölümünden aşağıdaki izinleri seçin: "E-posta adresine erişim", "Kullanıcı avatarına erişim" ve "Kullanıcı adına, ad ve soyadına, cinsiyete erişim"`
auths.tip.mastodon=Kimlik doğrulaması yapmak istediğiniz mastodon örneği için özel bir örnek URL girin (veya varsayılan olanı kullanın)
auths.edit=Kimlik Doğrulama Kaynağı Düzenle
@ -3119,7 +3220,7 @@ config.mail_notify=E-Posta Bildirimlerini Etkinleştir
config.enable_captcha=CAPTCHA'yı Etkinleştir
config.active_code_lives=Kod Yaşamlarını Aktifleştir
config.reset_password_code_lives=Hesap Kodunun Sona Erme Zamanını Kurtar
config.default_keep_email_private=E-posta Adreslerini Varsayılan Olarak Gizle
config.default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
config.default_allow_create_organization=Varsayılan Olarak Organizasyonların Oluşturulmasına İzin Ver
config.enable_timetracking=Zaman İzlemeyi Etkinleştir
config.default_enable_timetracking=Varsayılan Olarak Zaman İzlemeyi Etkinleştir
@ -3657,10 +3758,10 @@ pull_kind = Birleştirme isteklerini ara…
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahil et
fuzzy = Bulanık
exact = Tam
regexp = Düzenliİfade
regexp = RegExp
regexp_tooltip = Arama terimini düzenli ifade olarak yorumla
union = Anahtar sözcük

File diff suppressed because it is too large Load diff

View file

@ -140,6 +140,10 @@ view = Xem
test = Thử
more_items = Thêm
active_stopwatch = Theo dõi thời gian hoạt động
tracked_time_summary = Tóm tắt thời gian theo dõi dựa vào bộ lọc danh sách vấn đề
artifacts = Các đầu ra
[search]
search = Tìm kiếm…
type_tooltip = Kiểu tìm
@ -164,6 +168,8 @@ issue_kind = Tìm vấn đề…
keyword_search_unavailable = Tìm kiếm bằng từ khoá hiện không khả dụng. Vui lòng liên hệ quản trị viên trang mạng.
pull_kind = Tìm lượt kéo…
commit_kind = Tìm kiếm thay đổi…
[aria]
navbar = Thanh điều hướng
footer = Chân trang
@ -178,6 +184,8 @@ contributions_few = đóng góp
less = Bớt
more = Thêm
contributions_format = {contributions} trong {day} {month}, {year}
[editor]
buttons.heading.tooltip = Thêm đề mục
buttons.bold.tooltip = Tô đậm (Ctrl+B / ⌘B)
@ -204,6 +212,9 @@ link_modal.description = Mô tả
link_modal.paste_reminder = Gợi ý: Với một URL trong bảng tạm, bạn có thể dán trực tiếp vào trình soạn thảo để tạo liên kết.
buttons.ref.tooltip = Đề cập một vấn đề hoặc yêu cầu kéo
buttons.enable_monospace_font = Bật phông chữ đơn cách
buttons.disable_monospace_font = Tắt phông chữ đơn cách
[error]
occurred = Đã xảy ra lỗi
report_message = Nếu bạn tin đây là lỗi Forgejo, vui lòng tìm vấn đề trên <a href="%s" target="_blank">Codeberg</a> hoặc mở vấn đề mới nếu cần thiết.
@ -221,6 +232,8 @@ license = Mã nguồn mở
license_desc = Hãy cài đặt <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Tham gia với chúng tôi bằng cách <a target="_blank" rel="noopener noreferrer" href="%[2]s">đóng góp</a> để kiến dự án này trở nên tốt đẹp hơn nữa. Đừng ngại trở thành người đóng góp!
install_desc = Chỉ cần <a target="_blank" rel="noopener noreferrer" href="%[1]s">chạy tệp chương trình</a> dành cho nền tảng của bạn, cài vào <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, hay cài đặt bằng <a target="_blank" rel="noopener noreferrer" href="%[3]s">gói</a>.
app_desc = Một giải pháp Git dễ chạy và dễ dùng
[install]
install = Cài đặt
title = Thiết lập ban đầu
@ -299,7 +312,7 @@ default_keep_email_private = Ẩn địa chỉ thư điện tử theo mặc đ
default_keep_email_private.description = Bật ẩn địa chỉ thư điện tử cho người dùng mới theo mặt định để khiến thông tin này không bị lộ ngay sau khi đăng kí.
default_allow_create_organization = Cho phép tạo tổ chức theo mặc định
default_allow_create_organization.description = Cho phép người dùng mới tạo tổ chức theo mặc định. Khi tuỳ chọn này bị vô hiệu hoá, quản trị viên sẽ phải cấp quyền tạo tổ chức cho người dùng mới.
default_enable_timetracking =
default_enable_timetracking =Bật theo dõi thời gian theo mặc định
admin_title = Cài đặt tài khoản quản trị viên
admin_setting.description = Việc tạo tài khoản quản trị viên là không bắt buộc. Người dùng đăng kí đầu tiên sẽ tự động trở thành quản trị viên.
admin_name = Tên người dùng quản trị viên
@ -330,6 +343,13 @@ sqlite3_not_available = Phiên bản Forgejo này không hỗ trợ SQLite3. Vui
reinstall_confirm_check_1 = Dữ liệu được mã hoá bằng SECRET_KEY trong app.ini có thể bị mất: người dùng có thể không đăng nhập được bằng 2FA/OTP & các bản sao có thể không hoạt động đúng cách. Bằng cách đánh dấu vào ô này bạn xác nhận rằng tệp app.ini hiện tại có SECRET_KEY đúng.
secret_key_failed = Tạo mã bí mật thất bại: %v
db_schema = Khung
reinstall_confirm_check_2 = Các kho mã và cài đặt có thể sẽ được đồng bộ lại. Sau khi đánh dấu ô này, bạn xác nhận rằng sẽ thủ công đồng bộ các hooks cho các kho mã và tệp tin authorized_keys. Bạn xác nhận sẽ bảo đảm các cài đặt giữa kho mã và bản sao (mirror) khớp nhau.
lfs_path_helper = Các tệp theo dõi bởi Git LFS sẽ được lưu vào thư mục này. Để mục trống để vô hiệu hóa.
federated_avatar_lookup = Bật ảnh đại diện liên kết (federated avatars)
default_enable_timetracking.description = Mặc định cho phép các kho mã sau này sử dụng tính năng theo dõi thời gian.
internal_token_failed = Lỗi khi tạo mã xác thực nội bộ: %v
[home]
uname_holder = Tên người dùng hoặc địa chỉ thư điện tử
switch_dashboard_context = Chuyển bối cảnh bảng điều khiển
@ -348,6 +368,8 @@ show_only_private = Chỉ hiện riêng tư
show_only_public = Chỉ hiện công khai
issues.in_your_repos = Trong các kho mã của bạn
feed_of = Cập nhật mới từ "%s"
[explore]
repos = Kho mã
users = Người dùng
@ -436,6 +458,8 @@ use_scratch_code = Dùng mã xác thực hai lớp dự phòng
twofa_passcode_incorrect = Mã xác thực hai lớp của bạn chưa đúng. Nếu bạn đã để sai thiết bị, dùng mã xác thực hai lớp dự phòng của bạn để đăng nhập.
twofa_scratch_token_incorrect = Mã xác thực hai lớp dự phòng của bạn chưa đúng.
twofa_scratch_used = Bạn đã dùng mã xác thực dự phòng. Bạn được chuyển tới trang cài đặt xác thực hai lớp để bạn có thể bỏ đăng ký thiết bị hoặc tạo mới mã xác thực dự phòng.
[mail]
view_it_on = Xem trên %s
reply = hoặc trả lời trực tiếp thư này
@ -502,6 +526,9 @@ issue.action.force_push = <b>%[1]s</b> đã ép đẩy <b>%[2]s</b> từ %[3]s
issue.action.approve = <b>@%[2]s</b> đã phê duyệt yêu cầu kéo này.
issue.action.reject = <b>@%[1]s</b> đã yêu cầu thay đổi đến yêu cầu kéo này.
issue.action.push_1 = <b>@%[1]s</b> đã đẩy %[3]d thay đổi tới %[2]s
issue.action.push_n = <b>@%[1]s</b> đã đẩy nhiều %[3]d thay đổi tới %[2]s
[modal]
yes =
no = Không
@ -594,6 +621,15 @@ required_prefix = Đầu vào phải bắt đầu bằng "%s"
glob_pattern_error = ` mẫu glob không hợp lệ: %s.`
AccessToken = Mã truy cập
PayloadUrl = URL nhận dữ liệu
CommitSummary = Tóm tắt thay đổi
CommitMessage = Thông tin thay đổi
CommitChoice = Lựa chọn thay đổi
git_ref_name_error = ` phải là tên tham chiếu Git đúng định dạng. `
invalid_group_team_map_error = ` ánh xạ sai: %s `
invalid_ssh_principal = Sai chủ thể: %s
must_use_public_key = Khóa bạn vừa nhập là khóa bí mật. Hãy chắc chắn không được đăng tải khóa bí mật lên bất cứ đâu. Thay vào đó hãy dùng khóa công khai của bạn.
[user]
change_avatar = Đổi ảnh hồ sơ…
joined_on = Đã tham gia từ %s
@ -684,7 +720,7 @@ update_hints = Cập nhật các gợi ý
update_hints_success = Đã cập nhật các gợi ý.
hidden_comment_types = Loại bình luận bị ẩn
hidden_comment_types_description = Các loại bình luận được chọn ở đây sẽ không hiện trên các trang vấn đề. Ví dụ: Chọn "Nhãn" thì sẽ loại bỏ tất cả các bình luận "<user> đã thêm/bỏ <label>".
hidden_comment_types.ref_tooltip =
hidden_comment_types.ref_tooltip =
hidden_comment_types.issue_ref_tooltip = Các bình luận mà người dùng đổi nhánh/nhãn gắn với vấn đề
comment_type_group_reference = Đề cập
comment_type_group_label = Nhãn
@ -732,7 +768,7 @@ activations_pending = Đang chờ kích hoạt
can_not_add_email_activations_pending = Có một lượt kích hoạt đang chờ, thử lại trong vài phút, nếu bạn muốn thêm một thư điện tử mới.
delete_email = Gỡ
email_deletion = Gỡ địa chỉ thư điện tử
email_deletion_desc =
email_deletion_desc =Địa chỉ email và các thông tin liên quan sẽ được xóa khỏi tài khoản của bạn. Các bản ghi Git từ địa chỉ này vẫn giữ nguyên. Tiếp tục?
email_deletion_success = Đã gỡ địa chỉ thư điện tử.
theme_update_success = Đã cập nhật chủ đề của bạn.
theme_update_error = Chủ đề đã chọn không tồn tại.
@ -760,7 +796,7 @@ key_content_gpg_placeholder = Bắt đầu bằng "-----BEGIN PGP PUBLIC KEY BLO
ssh_key_been_used = Mã SSH này đã được thêm vào máy chủ rồi.
ssh_key_name_used = Một mã SSH cùng tên đã tồn tại trong tài khoản của bạn.
gpg_key_id_used = Một mã GPG công khai cùng ID đã tồn tại.
gpg_no_key_email_found =
gpg_no_key_email_found =
gpg_key_matched_identities = Các danh tính khớp:
gpg_key_verify = Xác thực
gpg_token_help = Bạn có thể tạo chữ kí bằng:
@ -781,7 +817,7 @@ delete_key = Gỡ
ssh_key_deletion = Gỡ mã SSH
gpg_key_deletion = Gỡ mã GPG
ssh_key_deletion_desc = Việc gỡ mã SSH sẽ tước quyền truy cập của nó đến tài khoản của bạn. Tiếp tục?
gpg_key_deletion_desc =
gpg_key_deletion_desc =
ssh_key_deletion_success = Đã gỡ mã SSH.
gpg_key_deletion_success = Đã gỡ mã GPG.
added_on = Đã được thêm từ %s
@ -898,6 +934,15 @@ manage_access_token = Mã truy cập
access_token_deletion = Xoá mã truy cập
access_token_regeneration = Tái tạo mã truy cập
quota = Hạn mức
comment_type_group_time_tracking = Theo dõi thời gian
comment_type_group_dependency = Mô-đun
comment_type_group_pull_request_push = Bản ghi đã thêm
manage_ssh_principals = Quản lý danh sách chứng chỉ SSH
add_key = Thêm khóa
ssh_desc = Các khóa SSH công khai này sẽ liên kết với tài khoản của bạn. Các khóa riêng tư tương ứng cho phép truy cập đầy đủ vào kho mã của bạn. Những khóa SSH đã xác minh có thể dùng để xác nhận các bản ghi Git được ký bởi SSH.
principal_desc = Những chứng chỉ SSH này được liên kết với tài khoản của bạn và được phép truy cập toàn diện vào các kho mã của bạn.
[repo]
admin.manage_flags = Quản lí nhãn
admin.enabled_flags = Nhãn được bật cho kho mã:
@ -1470,4 +1515,11 @@ filter.container.untagged = Không được gắn nhãn
npm.details.tag = Nhãn
[actions]
runs.pushed_by = đẩy bởi
runs.pushed_by = đẩy bởi
[filter]
string.asc = A - Z
string.desc = Z - A
[translation_meta]
test = Đây là đoạn chữ kiểm thử. Nó sẽ không hiển thị trên giao diện của Forgejo nhưng sẽ được dùng vào các mục đích kiểm thử. Hãy thoải mái ấn "ok" để tiết kiệm thời gian để lấy cái mốc hoàn thành 100% ấy (1 điều vui nhỏ) :)

View file

@ -21,7 +21,7 @@ active_stopwatch=活跃时间跟踪器
tracked_time_summary=议题列表过滤器的跟踪时间摘要
create_new=创建…
user_profile_and_more=个人信息与设置…
signed_in_as=已登录用户
signed_in_as=已登录
enable_javascript=此网站需要 JavaScript。
toc=目录
licenses=许可证
@ -173,8 +173,8 @@ contributions_zero=没有贡献
less=较少
more=较多
contributions_format = {year}年{month}{day}日有{contributions}
contributions_few = 贡献
contributions_one = 贡献
contributions_few = 贡献
contributions_one = 贡献
[editor]
buttons.heading.tooltip=添加标题
@ -328,7 +328,7 @@ default_allow_create_organization=默认情况下允许创建组织
default_allow_create_organization.description=默认允许新用户创建组织。禁用此选项时,管理员必须向新用户授予创建组织的权限。
default_enable_timetracking=默认情况下启用时间跟踪
default_enable_timetracking.description=默认允许新仓库使用时间跟踪功能。
no_reply_address=隐藏电子邮件
no_reply_address=隐藏电子邮件域名
no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如如果用于隐藏电子邮件地址的域名设为“noreply.example.org”则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。
password_algorithm=密码哈希算法
invalid_password_algorithm=无效的密码哈希算法
@ -445,8 +445,8 @@ password_pwned=此密码出现在 <a target="_blank" rel="noopener noreferrer" h
password_pwned_err=无法完成对 HaveIBeenPwned 的请求
last_admin=您不能删除最后一个管理员。必须至少保留一个管理员。
change_unconfirmed_email = 如果您在注册时提供了错误的邮箱地址,您可以在下方修改,激活邮件会发送到修改后的邮箱地址。
change_unconfirmed_email_summary = 修改用来接收激活邮件的邮箱地址。
change_unconfirmed_email_error = 无法修改邮箱地址:%v
change_unconfirmed_email_summary = 更改接收激活邮件的电子邮件地址。
change_unconfirmed_email_error = 无法更改电子邮件地址:%v
hint_login = 已经有账户了吗?<a href="%s">立即登录!</a>
back_to_sign_in = 返回登录
sign_in_openid = 继续使用 OpenID
@ -616,7 +616,7 @@ invalid_ssh_key=无法验证您的 SSH 密钥:%s
invalid_gpg_key=无法验证您的 GPG 密钥:%s
invalid_ssh_principal=无效的规则:%s
must_use_public_key=您提供的密钥是私钥。不要在任何地方上传您的私钥,请改用您的公钥。
unable_verify_ssh_key=无法验证 SSH 钥,请仔细检查是否有错误。
unable_verify_ssh_key=无法验证 SSH 钥,请仔细检查是否有错误。
auth_failed=授权验证失败:%v
still_own_repo=此帐户仍拥有至少一个仓库,您需要先删除或转移它们。
@ -692,7 +692,7 @@ appearance=外观
password=修改密码
security=安全
avatar=头像设置
ssh_gpg_keys=SSH / GPG
ssh_gpg_keys=SSH / GPG
applications=应用
orgs=组织
repos=仓库列表
@ -762,7 +762,7 @@ password_incorrect=当前密码不正确。
change_password_success=您的密码已更新。从现在开始请使用您的新密码登录。
password_change_disabled=非本地帐户不能通过 Forgejo 的 web 界面更改密码。
manage_emails=管理邮箱地址
manage_emails=管理电子邮件地址
manage_themes=默认主题
manage_openid=OpenID 地址
email_desc=您的主要电子邮件地址将用于通知、密码恢复基于网页界面的Git操作只要它不是设置为隐藏的
@ -783,31 +783,31 @@ theme_update_error=所选主题不存在。
openid_deletion=移除 OpenID 地址
openid_deletion_desc=删除此 OpenID 地址将会阻止你使用它进行登录。你确定要继续吗?
openid_deletion_success=OpenID地址已被移除。
add_new_email=添加邮箱地址
add_new_email=添加电子邮件地址
add_new_openid=添加新的 OpenID URI
add_email=加电子邮件地址
add_email=加电子邮件地址
add_openid=添加 OpenID URI
add_email_confirmation_sent=确认邮件已发送至“%s”。请检查您的收件箱并在接下来的 %s 内点击提供的链接以确认您的电子邮件地址。
add_email_success=新的电子邮件地址已添加。
email_preference_set_success=电子邮件首选项已成功设置。
add_openid_success=新的 OpenID 地址已添加。
keep_email_private=隐藏邮箱地址
keep_email_private=隐藏电子邮件地址
keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。
openid_desc=OpenID 让你可以将认证转发到外部服务。
manage_ssh_keys=管理 SSH
manage_ssh_keys=管理 SSH
manage_ssh_principals=管理SSH证书规则
manage_gpg_keys=管理 GPG 密钥
add_key=增加密钥
ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的仓库的权限,且已验证的 SSH 密钥可以用于验证 SSH 签名的 Git 提交。
ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的仓库的权限,且已验证的 SSH 密钥可以验证 SSH 签名的 Git 提交。
principal_desc=这些SSH证书规则已关联到你的账号将允许完全访问你的所有仓库。
gpg_desc=这些 GPG 公钥已经关联到你的账号,并用于验证您的提交。请妥善保管你的私钥,因为这些私钥可以用于以你的身份签名提交。
ssh_helper=<strong>需要帮助?</strong> 请查看有关 <a href="%s">如何生成 SSH 密钥</a><a href="%s">常见 SSH 问题</a> 寻找答案。
gpg_desc=这些 GPG 公钥已经关联到你的账号,并用于验证您的提交。请妥善保管你的私钥,因为这些私钥可以以你的身份签名提交。
ssh_helper=<strong>需要帮助?</strong>请查看<a href="%s">如何生成 SSH 密钥</a><a href="%s">常见 SSH 问题</a>寻找答案。
gpg_helper=<strong>需要帮助吗?</strong>建议看一看 GitHub 的 <a href="%s">关于GPG</a> 的指导。
key_content_ssh_placeholder=以“ssh-ed25519”、“ssh-rsa”、“ecdsa-sha2-nistp256”、“ecdsa-sha2-nistp384”、“ecdsa-sha2-nistp521”、“sk-ecdsa-sha2-nistp256@openssh.com” 或 “sk-ssh-ed25519@openssh.com” 开头
key_content_gpg_placeholder=以 “-----BEGIN PGP PUBLIC KEY BLOCK-----” 开头
add_new_principal=添加规则
ssh_key_been_used=此 SSH 密钥已添加到服务器。
ssh_key_been_used=此 SSH 公钥已被添加到此服务器。
ssh_key_name_used=使用相同名称的SSH公钥已存在。
ssh_principal_been_used=此规则已经加入到了服务器。
gpg_key_id_used=具有相同 ID 的 GPG 公钥已存在。
@ -824,32 +824,32 @@ gpg_token_help=您可以使用以下方式生成签名:
gpg_token_signature=GPG 增强签名
key_signature_gpg_placeholder=以 “-----BEGIN PGP SIGNATURE-----” 开头
verify_gpg_key_success=GPG 密钥 %s 已被验证。
ssh_key_verified=已验证的
ssh_key_verified_long=密钥已经用令牌进行了验证,并且可以用来验证匹配此用户任何已激活电子邮件地址的提交。
ssh_key_verified=已验证的
ssh_key_verified_long=公钥已由令牌进行了验证,并且可以用来验证匹配此用户任何已激活电子邮件地址的提交。
ssh_key_verify=验证
ssh_invalid_token_signature=提供的 SSH 钥、签名或令牌不匹配或令牌已过期。
ssh_invalid_token_signature=提供的 SSH 钥、签名或令牌不匹配或令牌已过期。
ssh_token_required=您必须为下面的令牌提供签名
ssh_token=令牌
ssh_token_help=您可以使用以下方式生成签名:
ssh_token_signature=增强 SSH 签名
key_signature_ssh_placeholder=以 “-----BEGIN SSH SIGNATURE -----” 开头
verify_ssh_key_success=SSH 密钥 %s 已被验证。
verify_ssh_key_success=SSH 公钥 %s 已通过验证。
subkeys=子项
key_id=键ID
key_name=密钥名称
key_content=密钥内容
principal_content=内容
add_key_success=SSH 密钥 %s 添加成功
add_key_success=SSH 公钥 %s 已被成功添加
add_gpg_key_success=GPG 密钥 %s 添加成功。
add_principal_success=SSH证书规则 %s 添加成功。
delete_key=删除
ssh_key_deletion=删除 SSH
ssh_key_deletion=删除 SSH
gpg_key_deletion=删除 GPG 密钥
ssh_principal_deletion=删除 SSH 证书规则
ssh_key_deletion_desc=删除 SSH 公钥将取消对应的私钥对您的 Forgejo 帐户的访问权限。继续?
gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应私钥签名的提交,继续?
ssh_principal_deletion_desc=删除此 SSH 证书规则将取消它对您的账户的访问权限。继续?
ssh_key_deletion_success=SSH 钥已被删除。
ssh_key_deletion_success=SSH 钥已被删除。
gpg_key_deletion_success=GPG 密钥已被删除。
ssh_principal_deletion_success=此规则删除成功。
added_on=添加于 %s
@ -865,8 +865,8 @@ principal_state_desc=7 天内使用过该规则
show_openid=在个人信息上显示
hide_openid=在个人信息上隐藏
ssh_disabled=SSH 已禁用
ssh_signonly=SSH 目前已禁用,因此这些密钥仅用于提交签名验证
ssh_externally_managed=此 SSH 密钥是由外部管理的
ssh_signonly=SSH 目前已被禁用,因此这些公钥仅用于验证提交签名
ssh_externally_managed=此 SSH 公钥是由外部服务所管理的
manage_access_token=访问令牌
generate_new_token=生成新的令牌
tokens_desc=这些令牌拥有通过 Forgejo API 对您的帐户的访问权限。
@ -939,7 +939,7 @@ passcode_invalid=密码不正确。再试一次。
twofa_enrolled=你的账号已经启用了两步验证。请保存初始令牌(%s到一个安全的地方此令牌仅当前显示一次。
twofa_failed_get_secret=获取 secret 失败。
webauthn_desc=安全密钥是包含加密密钥的硬件设备。它们可以用于双因素身份验证。安全密钥必须支持 <a rel="noreferrer" target="_blank" href="%s">WebAuthn 身份验证器</a> 标准。
webauthn_desc=安全密钥是包含加密密钥的硬件设备。它们可以用于双因素身份验证。安全密钥必须支持 <a rel="noreferrer" target="_blank" href="%s">WebAuthn 身份验证器</a>标准。
webauthn_register_key=添加安全密钥
webauthn_nickname=昵称
webauthn_delete_key=移除安全密钥
@ -1086,7 +1086,7 @@ mirror_sync = 已同步
mirror_sync_on_commit=推送提交时同步
mirror_address=从 URL 克隆
mirror_address_desc=在授权框中输入必要的凭据。
mirror_address_url_invalid=URL无效。请检查所输入URL的所有部分是否被正确地转
mirror_address_url_invalid=URL无效。请检查所输入URL的所有部分是否被正确地转
mirror_address_protocol_invalid=提供的URL无效。只能使用https://或git://地址进行镜像操作。
mirror_lfs=大文件存储LFS
mirror_lfs_desc=镜像 LFS 数据。
@ -1246,7 +1246,7 @@ tag=Git标签
released_this=发布
file.title=%s 位于 %s
file_raw=原始文件
file_history=文件历史
file_history=历史
file_view_source=源码模式
file_view_rendered=渲染模式
file_view_raw=查看原始文件
@ -1260,8 +1260,8 @@ invisible_runes_line=`此行含有不可见的 unicode 字符`
ambiguous_runes_line=`此行有模棱两可的 unicode 字符`
ambiguous_character=`%[1]c [U+%04[1]X] 容易和 %[2]c [U+%04[2]X] 混淆`
escape_control_characters=Escape
unescape_control_characters=Unescape
escape_control_characters=转义
unescape_control_characters=反转义
file_copy_permalink=复制固定链接
view_git_blame=查看 Git Blame
video_not_supported_in_browser=您的浏览器不支持 HTML5 “video” 标签。
@ -1489,11 +1489,11 @@ issues.change_ref_at=`将引用从 <b><strike>%s</strike></b> 更改为了 <b>%s
issues.remove_ref_at=`删除了引用 <b>%s</b> %s`
issues.add_ref_at=`添加了引用 <b>%s</b> %s`
issues.delete_branch_at=`于 %[2]s 删除了分支 <b>%[1]s</b>`
issues.filter_label=标签筛选
issues.filter_label=标签
issues.filter_label_exclude=使用 <kbd>Alt</kbd> + <kbd>单击</kbd> 排除标签
issues.filter_label_no_select=所有标签
issues.filter_label_select_no_label=无标签
issues.filter_milestone=里程碑筛选
issues.filter_milestone=里程碑
issues.filter_milestone_all=所有里程碑
issues.filter_milestone_none=无里程碑
issues.filter_milestone_open=进行中的里程碑
@ -1501,12 +1501,12 @@ issues.filter_milestone_closed=已关闭的里程碑
issues.filter_project=项目
issues.filter_project_all=所有项目
issues.filter_project_none=暂无项目
issues.filter_assignee=指派人筛选
issues.filter_assignee=指派人
issues.filter_assginee_no_select=所有指派成员
issues.filter_assginee_no_assignee=未指派
issues.filter_poster=作者
issues.filter_poster_no_select=所有作者
issues.filter_type=类型筛选
issues.filter_type=类型
issues.filter_type.all_issues=所有议题
issues.filter_type.assigned_to_you=指派给您的
issues.filter_type.created_by_you=由您创建的
@ -1536,8 +1536,8 @@ issues.action_assignee_no_select=未指派
issues.action_check=选中/取消选中
issues.action_check_all=选中/取消选中所有项目
issues.opened_by=由 <a href="%[2]s">%[3]s</a> 于 %[1]s创建
pulls.merged_by=由 <a href="%[2]s">%[3]s</a> 创建,合并于 %[1]s
pulls.merged_by_fake=由 %[2]s 创建,合并于 %[1]s
pulls.merged_by=由 <a href="%[2]s">%[3]s</a> 创建,合并于 %[1]s
pulls.merged_by_fake=由 %[2]s 创建,合并于 %[1]s
issues.closed_by=由 <a href="%[2]s">%[3]s</a> 创建,被关闭于 %[1]s
issues.opened_by_fake=由 %[2]s 于 %[1]s 打开
issues.closed_by_fake=由 %[2]s 创建,被关闭于 %[1]s
@ -1670,7 +1670,7 @@ issues.push_commit_1=于 %[2]s 推送了 %[1]d 个提交
issues.push_commits_n=于 %[2]s 推送了 %[1]d 个提交
issues.force_push_codes=`于 %[6]s 强制推送 %[1]s从 <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> %[8]s至 <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[9]s`
issues.force_push_compare=比较
issues.due_date_form=yyyy-mm-dd
issues.due_date_form=yyyy年mm月dd日
issues.due_date_form_edit=编辑
issues.due_date_form_remove=删除
issues.due_date_not_set=未设置到期时间。
@ -1818,8 +1818,8 @@ pulls.approve_count_1=%d 项批准
pulls.approve_count_n=%d 项批准
pulls.reject_count_1=%d 变更请求
pulls.reject_count_n=%d 变更请求
pulls.waiting_count_1=%d 个正在等待评审
pulls.waiting_count_n=%d 个正在等待评审
pulls.waiting_count_1=正等待 %d 人评审
pulls.waiting_count_n=正等待 %d 人评审
pulls.wrong_commit_id=提交 ID 必须是目标分支上的提交的 ID
pulls.no_merge_desc=由于未启用合并选项,此合并请求无法被合并。
@ -1848,7 +1848,7 @@ pulls.push_rejected=合并失败:推送被拒绝。请查看此仓库的 Git
pulls.push_rejected_summary=详细拒绝信息
pulls.push_rejected_no_message=推送失败:此推送被拒绝但未提供其他信息。请检查此仓库的 Git 钩子
pulls.open_unmerged_pull_exists=`您不能执行重新打开操作, 因为已经存在相同的合并请求(#%d。`
pulls.status_checking=一些检测仍在等待运行
pulls.status_checking=仍在等待一些检测
pulls.status_checks_success=所有检测均成功
pulls.status_checks_warning=一些检测报告了警告
pulls.status_checks_failure=一些检测失败了
@ -2315,7 +2315,7 @@ settings.packagist_api_token=API 令牌
settings.packagist_package_url=Packagist 软件包 URL
settings.deploy_keys=部署密钥
settings.add_deploy_key=添加部署密钥
settings.deploy_key_desc=部署密钥具有对仓库的只读拉取权限。
settings.deploy_key_desc=部署密钥对仓库可具有只读或读写访问权限。
settings.is_writable=启用写权限
settings.is_writable_info=允许此部署密钥 <strong>推送</strong> 提交到仓库。
settings.no_deploy_keys=没有部署密钥。
@ -2718,7 +2718,7 @@ activity.commit = 提交活动
pulls.cmd_instruction_merge_warning = <b>警告:</b>未启用此仓库的“自动检测手动合并”设置,您之后必须将此合并请求标记为手动合并。
settings.protect_new_rule = 创建新的分支保护规则
mirror_denied_combination = 不能同时使用公钥和基于密码的验证。
mirror_public_key = 公共 SSH
mirror_public_key = 公共 SSH
mirror_use_ssh.text = 使用 SSH 验证
mirror_use_ssh.helper = 选择此选项后Forgejo 将通过 SSH 以 Git 方式镜像仓库,并为您创建一个密钥对。您必须确保已授权生成的公钥推送到目标仓库。选择此选项时,不能使用基于密码的授权。
settings.mirror_settings.push_mirror.copy_public_key = 复制公钥
@ -2783,9 +2783,9 @@ tree_path_not_found.branch = 路径 %[1]s 在分支 %[2]s 中不存在
tree_path_not_found.tag = 路径 %[1]s 在标签 %[2]s 中不存在
[graphs]
component_loading=正在加载 %s…
component_loading_failed=无法加载 %s
component_loading_info=这可能需要一点
component_loading=正在加载%s…
component_loading_failed=无法加载%s
component_loading_info=这可能需要一点时间
component_failed_to_load=意外的错误发生了。
contributors.what=贡献
recent_commits.what = 近期提交
@ -2924,7 +2924,7 @@ integrations=集成
authentication=认证源
emails=用户邮件
config=应用配置
notices=系统提示
notices=系统通知
monitor=监控面板
first_page=首页
last_page=末页
@ -3072,7 +3072,7 @@ users.list_status_filter.is_prohibit_login=禁止登录
users.list_status_filter.not_prohibit_login=允许登录
users.list_status_filter.is_2fa_enabled=已启用 2FA
users.list_status_filter.not_2fa_enabled=未启用 2FA
users.details=用户详细信息
users.details=用户详
emails.email_manage_panel=管理用户邮件地址
emails.primary=主要的
@ -3298,7 +3298,7 @@ config.enable_timetracking=启用时间跟踪
config.default_enable_timetracking=默认情况下启用时间跟踪
config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。
config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间
config.no_reply_address=隐藏电子邮件域名
config.no_reply_address=隐藏电子邮件域名
config.default_visibility_organization=新组织的默认可见性
config.default_enable_dependencies=默认情况下启用议题依赖
@ -3320,7 +3320,7 @@ config.mailer_sendmail_path=Sendmail 路径
config.mailer_sendmail_args=Sendmail 的额外参数
config.mailer_sendmail_timeout=Sendmail 超时
config.mailer_use_dummy=Dummy
config.test_email_placeholder=电子邮址(例如test@example.com
config.test_email_placeholder=电子邮址(例如test@example.com
config.send_test_mail=发送测试邮件
config.send_test_mail_submit=发送
config.test_mail_failed=发送测试邮件至 "%s" 时失败:%v
@ -3411,8 +3411,8 @@ monitor.queue.settings.changed=设置已更新
monitor.queue.settings.remove_all_items=移除全部
monitor.queue.settings.remove_all_items_done=队列中的所有项目已被移除。
notices.system_notice_list=系统提示管理
notices.view_detail_header=查看提示详情
notices.system_notice_list=系统通知
notices.view_detail_header=通知详情
notices.operations=操作
notices.select_all=选中全部
notices.deselect_all=取消全选
@ -3879,7 +3879,7 @@ issue_kind = 搜索议题…
pull_kind = 搜索合并请求…
exact_tooltip = 仅包含与搜索词精确匹配的结果
union_tooltip = 包括与以空格分隔的关键字中任意一个相匹配的结果
union = 关键字
union = 交集
regexp = 正则表达式
regexp_tooltip = 将搜索内容解释为正则表达式

View file

@ -4,5 +4,122 @@
"home.welcome.activity_hint": "У вашай стужцы пакуль што нічога няма. Вашыя дзеяньні ды падзеі з рэпазыторыяў зьявяцца тут.",
"home.explore_repos": "Агляд рэпазыторыяў",
"home.explore_users": "Агляд карыстальнікаў",
"home.explore_orgs": "Агляд арганізацый"
"home.explore_orgs": "Агляд арганізацый",
"stars.list.none": "Ніхто не пазначыў гэты рэпазіторый зоркай.",
"watch.list.none": "Ніхто не назірае за гэтым рэпазіторыем.",
"followers.incoming.list.self.none": "Ніхто не падпісаўся на ваш профіль.",
"followers.incoming.list.none": "Ніхто не падпісаўся на гэтага карыстальніка.",
"followers.outgoing.list.self.none": "Вы нікога не спягледзіце.",
"followers.outgoing.list.none": "%s не падпісаны на каго-небудзь.",
"relativetime.now": "зараз",
"relativetime.future": "у будучыні",
"relativetime.1day": "учора",
"relativetime.2days": "два дні таму",
"relativetime.1week": "на мінулай тыдні",
"relativetime.2weeks": "два тыдні таму",
"relativetime.1month": "у мінулым месяцы",
"relativetime.2months": "два месяцы таму",
"relativetime.1year": "у мінулым годзе",
"relativetime.2years": "два гады таму",
"repo.pulls.already_merged": "Зліццё не ўдалося: гэты запыт на зліццё ўжо быў зліты.",
"repo.form.cannot_create": "Усе прасторы, у якіх вы можаце ствараць рэпазітарыі, дасягнулі ліміту рэпазітараў.",
"migrate.form.error.url_credentials": "URL утрымлівае ўліковыя запісы, увядзіце іх адпаведна ў палях імя карыстальніка і пароля",
"migrate.github.description": "Міграцыя дадзеных з github.com або сервера GitHub Enterprise.",
"migrate.git.description": "Міграцыя рэпазітарыя толькі з любога Git-сервісу.",
"migrate.gitea.description": "Міграцыя дадзеных з gitea.com або іншых экземпляраў Gitea.",
"migrate.gitlab.description": "Міграцыя дадзеных з gitlab.com або іншых экземпляраў GitLab.",
"migrate.gogs.description": "Міграцыя дадзеных з notabug.org або іншых экземпляраў Gogs.",
"migrate.onedev.description": "Міграцыя дадзеных з code.onedev.io або іншых экземпляраў OneDev.",
"migrate.gitbucket.description": "Міграцыя дадзеных з экземпляраў GitBucket.",
"migrate.codebase.description": "Міграцыя дадзеных з codebasehq.com.",
"migrate.forgejo.description": "Міграцыя дадзеных з codeberg.org або іншых экземпляраў Forgejo.",
"repo.issue_indexer.title": "Індэксатар праблем",
"search.milestone_kind": "Пошук мільгамаў…",
"repo.settings.push_mirror.branch_filter.label": "Фільтр галін (неабавязкова)",
"repo.settings.push_mirror.branch_filter.description": "Галіны, якія трэба адлюстраваць. Пакіньце пустым, каб адлюстраваць усе галіны. Глядзіце <a href=\"%[1]s\">%[2]s дакументацыю</a> для сінтаксісу. Прыклады: <code>main, release/*</code>",
"incorrect_root_url": "Гэты экземпляр Forgejo настаўлены на службу на \"%s\". Зараз вы пераглядаеце Forgejo праз іншы URL, што можа прывесці да збояў у частках прыкладання. Кананічны URL кантралюецца адміністратарамі Forgejo праз наладу ROOT_URL у файле app.ini.",
"themes.names.forgejo-auto": "Forgejo (падаўжыць сістэмную тэму)",
"themes.names.forgejo-light": "Forgejo светлая",
"themes.names.forgejo-dark": "Forgejo цёмная",
"error.not_found.title": "Старонка не знойдзена",
"warning.repository.out_of_sync": "Прадстаўленне гэтага рэпазіторыя ў базе дадзеных не сінхронізавана. Калі гэта папярэджанне застаецца пасля пуша каміта ў гэты рэпазіторый, звяжыцеся з адміністратарам.",
"alert.asset_load_failed": "Не ўдалося загрузіць файлы рэсурсаў з {path}. Калі ласка, пераканайцеся, што файлы рэсурсаў даступныя.",
"alert.range_error": " павінна быць лікам паміж %[1]s і %[2]s.",
"install.invalid_lfs_path": "Немагчыма стварыць корань LFS па указаным шляху: %[1]s",
"profile.actions.tooltip": "Больш дзеянняў",
"profile.edit.link": "Рэдагаваць профіль",
"feed.atom.link": "Канал Atom",
"keys.ssh.link": "SSH-ключы",
"keys.gpg.link": "GPG-ключы",
"admin.config.moderation_config": "Наладкі мадэрацыі",
"admin.moderation.moderation_reports": "Спісы мадэрацыі",
"admin.moderation.reports": "Спісы",
"admin.moderation.no_open_reports": "На цяперашні момант адкрытых спісаў няма.",
"admin.moderation.deleted_content_ref": "Паведамлены змест тыпу %[1]v і ідэнтыфікатара %[2]d больш не існуе",
"moderation.report_abuse": "Паведаміць аб злым ужыванні",
"moderation.report_content": "Паведаміць аб змесце",
"moderation.report_abuse_form.header": "Паведаміць аб злым ужыванні адміністратару",
"moderation.report_abuse_form.details": "Гэтая форма павінна выкарыстоўвацца для паведамлення пра карыстальнікаў, якія ствараюць спам-профілі, рэпазітарыі, праблемы, каментары або паводзяцца няўжыткова.",
"moderation.report_abuse_form.invalid": "Няправільныя аргументы",
"moderation.report_abuse_form.already_reported": "Вы ўжо паведамілі пра гэты змест",
"moderation.abuse_category": "Катэгорыя",
"moderation.abuse_category.placeholder": "Выберыце катэгорыю",
"moderation.abuse_category.spam": "Спам",
"moderation.abuse_category.illegal_content": "Незаконны змест",
"moderation.abuse_category.other_violations": "Іншыя парушэнні правіл платформы",
"moderation.report_remarks": "Заўвагі",
"moderation.report_remarks.placeholder": "Калі ласка, падрабязна апішыце злаўжыванне, якое вы паведамляеце.",
"moderation.submit_report": "Адправіць паведамленне",
"moderation.reporting_failed": "Немагчыма адправіць новае паведамленне аб злаўжыванні: %v",
"moderation.reported_thank_you": "Дзякуем за ваша паведамленне. Адміністрацыя была апавешчана.",
"mail.actions.successful_run_after_failure_subject": "Працэс %[1]s адноўлены ў рэпазіторы %[2]s",
"mail.actions.not_successful_run_subject": "Працэс %[1]s не ўдалося ў рэпазіторы %[2]s",
"mail.actions.successful_run_after_failure": "Працэс %[1]s адноўлены ў рэпазіторы %[2]s",
"mail.actions.not_successful_run": "Працэс %[1]s не ўдалося ў рэпазіторы %[2]s",
"mail.actions.run_info_cur_status": "Стан гэтага запуску: %[1]s (толькі што абноўлена з %[2]s)",
"mail.actions.run_info_previous_status": "Стан папярэдняга запуску: %[1]s",
"mail.actions.run_info_sha": "Каміт: %[1]s",
"mail.actions.run_info_trigger": "Запушчана таму што: %[1]s кіраўніком: %[2]s",
"repo.diff.commit.next-short": "Наступны",
"repo.diff.commit.previous-short": "Папярэдні",
"discussion.locked": "Гэта абмеркаванне заблакавана. Каментаванне абмежавана ўдзельнікамі.",
"discussion.sidebar.reference": "Спасылка",
"editor.textarea.tab_hint": "Радок ужо ўцягнуты. Націсніце <kbd>Tab</kbd> яшчэ раз або <kbd>Escape</kbd>, каб выйсці з рэдактара.",
"editor.textarea.shift_tab_hint": "Няма ўцягвання на гэтым радку. Націсніце <kbd>Shift</kbd> + <kbd>Tab</kbd> яшчэ раз або <kbd>Escape</kbd>, каб выйсці з рэдактара.",
"admin.auths.allow_username_change": "Дазволіць змяненне імя карыстальніка",
"admin.auths.allow_username_change.description": "Дазволіць карыстальнікам змяняць імя карыстальніка ў наладах профілю",
"admin.dashboard.cleanup_offline_runners": "Ачысціць афлайн-выканальнікі",
"admin.dashboard.remove_resolved_reports": "Выдаліць вырашаныя справаздачы",
"admin.config.security": "Налады бяспекі",
"admin.config.global_2fa_requirement.title": "Глабальны патрабаванне двухфактарнай аўтэнтыфікацыі",
"admin.config.global_2fa_requirement.none": "Не",
"admin.config.global_2fa_requirement.all": "Усе карыстальнікі",
"admin.config.global_2fa_requirement.admin": "Адміністратары",
"settings.visibility.description": "Відавочнасць профілю ўплывае на магчымасць іншых атрымаць доступ да вашых непрыватных рэпазіторыяў. <a href=\"%s\" target=\"_blank\">Даведацца больш</a>.",
"settings.twofa_unroll_unavailable": "Для вашага акаўнта патрабуецца двухфактарная аўтэнтыфікацыя і яна не можа быць адключаная.",
"settings.twofa_reenroll": "Паўторна ўключыць двухфактарную аўтэнтыфікацыю",
"settings.twofa_reenroll.description": "Паўторна ўключыць вашу двухфактарную аўтэнтыфікацыю",
"settings.must_enable_2fa": "Гэты экземпляр Forgejo патрабуе, каб карыстальнікі ўключылі двухфактарную аўтэнтыфікацыю, перш чым яны змогуць атрымаць доступ да сваіх уліковых запісаў.",
"error.must_enable_2fa": "Гэты экземпляр Forgejo патрабуе, каб карыстальнікі ўключылі двухфактарную аўтэнтыфікацыю, перш чым яны змогуць атрымаць доступ да сваіх уліковых запісаў. Уключыце яе там: %s",
"avatar.constraints_hint": "Кастамны аватар не павінен перавышаць памер %[1]s ці быць большым за %[2]dх%[3]d пікселяў",
"user.ghost.tooltip": "Гэты карыстальнік быў выдалены ці не можа быць знайдзены.",
"og.repo.summary_card.alt_description": "Зводная картка рэпазіторыя %[1]s, апісаная як: %[2]s",
"repo.commit.load_tags_failed": "Не ўдалося загрузіць тэгі з-за ўнутранай памылкі",
"compare.branches.title": "Параўнаць галінкі",
"migrate.pagure.description": "Міграцыя дадзеных з pagure.io ці іншых экземпляраў Pagure.",
"migrate.pagure.incorrect_url": "Пададзены няправільны URL-адрас крынічнага рэпазіторыя",
"migrate.pagure.project_url": "URL-адрас праекта Pagure",
"migrate.pagure.project_example": "URL-адрас праекта Pagure, напр. https://pagure.io/pagure",
"migrate.pagure.token_label": "Токен API Pagure",
"migrate.pagure.private_issues.summary": "Прыватныя праблемы (неабавязкова)",
"migrate.pagure.private_issues.description": "Гэтая магчымасць прызначана для стварэння другога рэпазіторыя, які ўтрымлівае толькі прыватныя праблемы з вашага праекта Pagure, для архівацыі. Спачатку выканайце звычайную міграцыю (без токена), каб імпартаваць усё публічнае змест. Потым, калі ў вас ёсць прыватныя праблемы, якія трэба захаваць, стварыце асобны рэпазіторый, выкарыстоўваючы гэтую опцыю токена, каб архіваваць гэтыя прыватныя праблемы.",
"migrate.pagure.private_issues.warning": "Пераканайцеся, што ўсталюйце бачнасць рэпазіторыя вышэй у стан «Прыватны», калі вы выкарыстоўваеце ключ API для імпарту прыватных праблем. Гэта папярэджае выпадковыя раскрыцці прыватнага зместу ў публічным рэпазіторыі.",
"migrate.pagure.token.placeholder": "Толькі для стварэння архіва прыватных праблем",
"actions.runs.run_attempt_label": "Спроба запуску #%[1]s (%[2]s)",
"actions.runs.viewing_out_of_date_run": "Вы пераглядаеце застарэлы запуск гэтай задачы, які быў выкананы %[1]s.",
"actions.runs.view_most_recent_run": "Праглядзець апошні запуск",
"actions.workflow.job_parsing_error": "Немагчыма разабраць заданні ў працэсе: %v",
"actions.workflow.event_detection_error": "Немагчыма разабраць падтрымліваемыя падзеі ў працэсе: %v",
"actions.workflow.pre_execution_error": "Працэс не быў выкананы з-за памылкі, якая заблакавала спробу выканання.",
"meta.last_line": "Слава вялікай бульбе! Лукашэнка, гары ў адку! Kiss"
}

View file

@ -74,7 +74,7 @@
"keys.ssh.link": "Claus SSH",
"keys.gpg.link": "Claus GPG",
"admin.config.moderation_config": "Configuració de la moderació",
"admin.moderation.reports": "Informes",
"admin.moderation.reports": "Denúncies",
"admin.moderation.moderation_reports": "Informes de moderació",
"admin.moderation.no_open_reports": "No hi ha cap denúncia oberta.",
"moderation.report_abuse": "Denunciar abús",
@ -133,7 +133,7 @@
"admin.config.global_2fa_requirement.admin": "Administradors",
"settings.visibility.description": "La visibilitat del perfil afecta la capacitat dels altres per accedir als vostres repositoris no privats. <a href=\"%s\" target=\"_blank\">Saber-ne més</a>.",
"settings.twofa_unroll_unavailable": "El vostre compte requereix l'autenticació de doble factor i no es pot desactivar.",
"settings.twofa_reenroll.description": "Torneu-vos a inscriure a l'autenticació de doble factor",
"settings.twofa_reenroll.description": "Torneu-vos a inscriure a la vostra autenticació de doble factor",
"settings.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes.",
"error.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes. Habiliteu-la a: %s",
"avatar.constraints_hint": "Els avatars personalitzats no poden pesar més de %[1]s ni tenir una dimensió superior a %[2]dx%[3]d píxels",
@ -143,7 +143,24 @@
"migrate.pagure.incorrect_url": "S'ha proporcionat una URL del repositori font incorrecta",
"migrate.pagure.project_url": "URL del projecte de Pagure",
"migrate.pagure.project_example": "L'URL del projecte de pagure, per exemple: https://pagure.io/pagure",
"migrate.pagure.token_label": "Testimoni",
"migrate.pagure.token_label": "Testimoni de l'API de Pagure",
"migrate.pagure.token_body_a": "Proporcioneu un testimoni d'API de Pagure amb accés a les incidències privades per crear un repositori que contingui només les incidències privades",
"meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important."
"meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important.",
"relativetime.future": "en el futur",
"admin.dashboard.cleanup_offline_runners": "Neteja els executors fora de línia",
"settings.twofa_reenroll": "Torneu-vos a inscriure a l'autenticació de doble factor",
"user.ghost.tooltip": "Aquest usuari ha sigut eliminat, o no es pot trobar.",
"migrate.pagure.private_issues.summary": "Incidències privades (opcional)",
"migrate.pagure.private_issues.description": "Aquesta funció està pensada per crear un segon repositori amb només les incidències privades del vostre projecte de Pragure amb la finalitat d'arxivar-lo. Primer, feu una migració normal (sense cap testimoni) per importar tot el contingut públic. Després, si teniu incidències privades que voleu preservar, creeu un repositori separat emprant aquesta opció de testimoni per arxivar-les.",
"migrate.pagure.private_issues.warning": "Assegureu-vos de configurar la visibilitat del repositori com a privada si esteu usant la clau API per importar incidències privades. Això evitarà exposar accidentalment el contingut privat en un repositori públic.",
"migrate.pagure.token.placeholder": "Només per crear un arxiu d'incidències privades",
"actions.runs.run_attempt_label": "Intent d'execució #%[1]s (%[2]s)",
"actions.runs.viewing_out_of_date_run": "Esteu veient una execució desactualitzada d'aquesta tasca que va ser executada %[1]s.",
"actions.runs.view_most_recent_run": "Veure l'execució més recent",
"actions.workflow.job_parsing_error": "No s'han pogut analitzar les tasques al flux de treball: %v",
"actions.workflow.pre_execution_error": "No s'ha executat el flux de treball degut a un error que ha bloquejat l'intent d'execució.",
"stars.list.none": "Ningú ha marcat aquest repositori com a favorit.",
"mail.actions.run_info_trigger": "Activat per: %[1]s per: %[2]s",
"og.repo.summary_card.alt_description": "La targeta de resum del repositori %[1]s, descrita com a: %[2]s",
"actions.workflow.event_detection_error": "No s'han pogut analitzar els esdeveniments compatibles al flux de treball: %v"
}

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