Compare commits

...

27 commits

Author SHA1 Message Date
David Rotermund
d48ff06b06 Merge branch 'forgejo' into upload_with_path_structure
Some checks are pending
Integration tests for the release process / release-simulation (push) Waiting to run
2025-06-16 16:05:15 +02:00
Robert Wolff
877fa8cec1 feat(ui): fediverse handle markup via redirect server (#8185)
This implements the fediverse handle markup as discussed in https://codeberg.org/forgejo/forgejo/issues/7942#issuecomment-5152173 by adding links to the https://fedirect.toolforge.org server.

It’s likely a temporary solution that will be reverted by proper federation implementation.

I wasn’t sure, but because I already had the implementation ready, I put the code here. I won’t be offended if we just close it.

(Also it relies on external server, that could be done configurable, but given that this is likely to be temporary it may not be worth the further implementation?)

### 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.
- [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.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8185
Reviewed-by: Lucas <sclu1034@noreply.codeberg.org>
Co-authored-by: Robert Wolff <mahlzahn@posteo.de>
Co-committed-by: Robert Wolff <mahlzahn@posteo.de>
2025-06-16 14:55:17 +02:00
Renovate Bot
5e157d40df Update renovate to v40.57.1 (forgejo) (#8194)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8194
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-06-16 11:54:29 +02:00
Renovate Bot
65bb09a332 Lock file maintenance (forgejo) (#8195)
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency versions.

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiI0MC40OC40IiwidXBkYXRlZEluVmVyIjoiNDAuNDguNCIsInRhcmdldEJyYW5jaCI6ImZvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8195
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-06-16 11:42:27 +02:00
Paweł Bogusławski
7380eac5a2 fix: improve dashboard loading performances (#7604)
Generating dashboard page takes too long when table `action` contains
many records and error log contains message like

```
2025/04/21 21:21:07 ...activities/action.go:470:GetFeeds() [W] [Slow SQL Query] SELECT `action`.* FROM `action` INNER JOIN `repository` ON `repository`.id = `action`.repo_id WHERE user_id=? AND is_deleted=? ORDER BY `action`.`created_unix` DESC LIMIT 20 [12 false] - 2m8.393454675s
```

This mod removes unnecessary inner join like proposed
in https://github.com/go-gitea/gitea/pull/32127

For complete solution index(user_id, is_deleted) for action table
should be created also like in https://github.com/go-gitea/gitea/pull/32333
(not included in this mod).

Related: https://github.com/go-gitea/gitea/pull/32127
Related: https://github.com/go-gitea/gitea/pull/32333
Author-Change-Id: IB#1160173

## 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.
- [ ] 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/7604
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Paweł Bogusławski <pboguslawski@noreply.codeberg.org>
Co-committed-by: Paweł Bogusławski <pboguslawski@noreply.codeberg.org>
2025-06-14 23:01:56 +02:00
Gusted
90f8239448 fix: make test suite run on older git version (#8188)
Ref: forgejo/forgejo#8140, forgejo/forgejo#8144
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8188
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-committed-by: Gusted <postmaster@gusted.xyz>
2025-06-14 19:50:58 +02:00
Thomas Böhler
53d5e6d754 feat(ui): show size constraints of custom avatar (#7998)
Closes #7862
This adds a note for the user profile settings page about the avatar constraints.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7998
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Thomas Böhler <witcher@wiredspace.de>
Co-committed-by: Thomas Böhler <witcher@wiredspace.de>
2025-06-14 16:35:50 +02:00
Renovate Bot
6cdf2cd66e Update module github.com/go-sql-driver/mysql to v1.9.3 (forgejo) (#8186)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | require | patch | `v1.9.2` -> `v1.9.3` |

---

### Release Notes

<details>
<summary>go-sql-driver/mysql (github.com/go-sql-driver/mysql)</summary>

### [`v1.9.3`](https://github.com/go-sql-driver/mysql/releases/tag/v1.9.3)

[Compare Source](https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.9.3)

#### What's Changed

-   \[1.9] test stability improvement. by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1699
-   \[1.9] Transaction Commit/Rollback returns conn's cached error by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1702
-   backport benchmark_test by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1706
-   \[1.9] optimize readPacket ([#&#8203;1705](https://github.com/go-sql-driver/mysql/issues/1705)) by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1707
-   \[1.9] fix PING on compressed connections by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1723
-   release v1.9.3 by [@&#8203;methane](https://github.com/methane) in https://github.com/go-sql-driver/mysql/pull/1725

**Full Changelog**: https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.9.3

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), 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:eyJjcmVhdGVkSW5WZXIiOiI0MC40OC40IiwidXBkYXRlZEluVmVyIjoiNDAuNDguNCIsInRhcmdldEJyYW5jaCI6ImZvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8186
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-06-14 07:54:51 +02:00
Earl Warren
35e051aaee fix: Dockerfile should re-use bindata files when possible (#8176)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8176
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2025-06-13 21:59:56 +02:00
Lucas Schwiderski
44de50fcac Update environment-to-ini README (#8183)
The README is linked to by the docs, but has become outdated.
This brings the file back in line with the tool's description, fixes the
left over Gitea branding and improves the wording in some places.

## 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.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8183
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Lucas Schwiderski <lucas@lschwiderski.de>
Co-committed-by: Lucas Schwiderski <lucas@lschwiderski.de>
2025-06-13 21:59:26 +02:00
Earl Warren
07cc5802bf API: new GET /repos/{owner}/{repo}/git/blobs endpoint to retrieve multiple blobs at once (#8179)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8179
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-06-13 14:39:51 +02:00
Renovate Bot
2fdddcb04e Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.3.5 (forgejo) (#8181)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://data.forgejo.org/forgejo/forgejo-build-publish](https://data.forgejo.org/forgejo/forgejo-build-publish) | action | patch | `v5.3.4` -> `v5.3.5` |

---

### Release Notes

<details>
<summary>forgejo/forgejo-build-publish (https://data.forgejo.org/forgejo/forgejo-build-publish)</summary>

### [`v5.3.5`](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.3.4...v5.3.5)

[Compare Source](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.3.4...v5.3.5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), 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:eyJjcmVhdGVkSW5WZXIiOiI0MC40OC40IiwidXBkYXRlZEluVmVyIjoiNDAuNDguNCIsInRhcmdldEJyYW5jaCI6ImZvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8181
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-06-13 14:22:21 +02:00
Earl Warren
fd2f9e6842
fix: Dockerfile should re-use bindata files when possible
- Revert "fix: use zstd.WithLowerEncoderMem for generate-bindata
- Re-use bindata files when available instead of ignoring them in Dockerfile
- Add missing  modules/migration/bindata.go to go sources in the Makefile

Closes forgejo/forgejo#8165
2025-06-13 14:00:57 +02:00
oliverpool
a4ea74020f feat: API GET /repos/{owner}/{repo}/git/blobs 2025-06-13 13:52:56 +02:00
Renovate Bot
42514a4744 Update dependency minimatch to v10.0.3 (forgejo) (#8174)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [minimatch](https://github.com/isaacs/minimatch) | dependencies | patch | [`10.0.2` -> `10.0.3`](https://renovatebot.com/diffs/npm/minimatch/10.0.2/10.0.3) |

---

### Release Notes

<details>
<summary>isaacs/minimatch (minimatch)</summary>

### [`v10.0.3`](https://github.com/isaacs/minimatch/compare/v10.0.2...v10.0.3)

[Compare Source](https://github.com/isaacs/minimatch/compare/v10.0.2...v10.0.3)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), 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:eyJjcmVhdGVkSW5WZXIiOiI0MC40OC40IiwidXBkYXRlZEluVmVyIjoiNDAuNDguNCIsInRhcmdldEJyYW5jaCI6ImZvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8174
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
Co-committed-by: Renovate Bot <forgejo-renovate-action@forgejo.org>
2025-06-13 13:24:14 +02:00
oliverpool
09699c1506 feat: always publish the link to the commit status (#8177)
See https://codeberg.org/forgejo/forgejo/pulls/4801#issuecomment-5094525 and #8152 for more context.

The current implementation is limited to self-hosted actions and buggy as soon as multiple repos are involved, like for the homepage (because each permission must be fetched individually).

Ideally this feature should work for all kind of status (with some setting indicating which collaborator can access with status). Probably inside the `git_model.ParseCommitsWithStatus` function.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8177
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: oliverpool <git@olivier.pfad.fr>
Co-committed-by: oliverpool <git@olivier.pfad.fr>
2025-06-13 12:41:34 +02:00
Earl Warren
c21d271358
Revert "fix: use zstd.WithLowerEncoderMem for generate-bindata (#8172)"
This reverts commit 402a85a9b6.
2025-06-13 12:24:06 +02:00
oliverpool
07e8684a61 api: GitBlob consistent naming 2025-06-13 11:35:14 +02:00
Earl Warren
402a85a9b6 fix: use zstd.WithLowerEncoderMem for generate-bindata (#8172)
Closes forgejo/forgejo#8165

The test that matters will happen on the next integration build.

A manual test was run in the integration repository:

* commit 82c419a85e
* run that builds bindata for v6 https://codeberg.org/forgejo-integration/forgejo/actions/runs/10219#jobstep-9-5286

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8172
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Earl Warren <contact@earl-warren.org>
Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-06-12 23:23:37 +02:00
Earl Warren
563d8f1564 chore(ci): skip tests if TEST_{MINIO_ENDPOINT,ELASTICSEARCH_URL} is not set (#8166)
This allows the daily tests to work instead of failing because elasticsearch & minio are not present.

* [Minio](https://codeberg.org/forgejo-integration/forgejo/actions/runs/10172#jobstep-5-353)
* [Elasticsearch](https://codeberg.org/forgejo-integration/forgejo/actions/runs/10172#jobstep-5-272)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8166
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Earl Warren <contact@earl-warren.org>
Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-06-12 21:13:52 +02:00
Renovate Bot
4a06153709 Update dependency postcss to v8.5.5 (forgejo) (#8160)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8160
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-06-12 17:35:25 +02:00
Earl Warren
e2cf8520bc fix: do not mix urfave v2 with urfave v3 (#8168)
[Spotted](https://codeberg.org/forgejo/forgejo/pulls/8137#issuecomment-5079471) by @nilsph

## 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.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8168
Reviewed-by: Otto <otto@codeberg.org>
Co-authored-by: Earl Warren <contact@earl-warren.org>
Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-06-12 15:38:03 +02:00
Earl Warren
db99d8d09e Update module github.com/minio/minio-go/v7 to v7.0.93 (forgejo) (#8162)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8162
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-06-12 14:02:52 +02:00
Earl Warren
6753480ab1
Update module github.com/minio/minio-go/v7 to v7.0.93 (licenses) 2025-06-12 13:35:55 +02:00
Earl Warren
442f11995c i18n: update of translations from Codeberg Translate (#8077)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8077
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-06-12 12:46:36 +02:00
Codeberg Translate
fe28f128df
i18n: update of translations from Codeberg Translate
Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: BlackSpirits <blackspirits@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: Salif Mehmed <mail@salif.eu>
Co-authored-by: Shihfu Juan <xlion@xlion.tw>
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: earl-warren <earl-warren@noreply.codeberg.org>
Co-authored-by: gedankenstuecke <gedankenstuecke@noreply.codeberg.org>
Co-authored-by: justbispo <justbispo@noreply.codeberg.org>
Co-authored-by: nightfurysl2001 <nightfurysl2001@noreply.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: yeager <yeager@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/bg/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_PT/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/sv/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hans/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hant/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/bg/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/de/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fil/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_BR/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_PT/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hant/
Translation: Forgejo/forgejo
Translation: Forgejo/forgejo-next
2025-06-12 10:09:11 +00:00
Renovate Bot
2d436a5244 Update module github.com/minio/minio-go/v7 to v7.0.93 2025-06-12 02:03:08 +00:00
86 changed files with 1746 additions and 821 deletions

View file

@ -37,13 +37,9 @@ coverage.all
coverage/
cpu.out
/modules/migration/bindata.go
/modules/migration/bindata.go.hash
/modules/options/bindata.go
/modules/options/bindata.go.hash
/modules/public/bindata.go
/modules/public/bindata.go.hash
/modules/templates/bindata.go
/modules/templates/bindata.go.hash
*.db

View file

@ -164,7 +164,7 @@ jobs:
- name: build container & release
if: ${{ secrets.TOKEN != '' }}
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -183,7 +183,7 @@ jobs:
- name: build rootless container
if: ${{ secrets.TOKEN != '' }}
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"

View file

@ -44,7 +44,7 @@ jobs:
- uses: https://data.forgejo.org/actions/checkout@v4
- name: copy & sign
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.5
with:
from-forgejo: ${{ vars.FORGEJO }}
to-forgejo: ${{ vars.FORGEJO }}

View file

@ -28,7 +28,7 @@ jobs:
runs-on: docker
container:
image: data.forgejo.org/renovate/renovate:40.48.4
image: data.forgejo.org/renovate/renovate:40.57.1
steps:
- name: Load renovate repo cache

View file

@ -91,6 +91,7 @@ jobs:
RACE_ENABLED: 'true'
TAGS: bindata
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
TEST_MINIO_ENDPOINT: minio:9000
test-e2e:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker

View file

@ -33,10 +33,10 @@ RUN apk --no-cache add build-base git nodejs npm
COPY . ${GOPATH}/src/forgejo.org
WORKDIR ${GOPATH}/src/forgejo.org
RUN make clean
RUN make clean-no-bindata
RUN make frontend
RUN go build contrib/environment-to-ini/environment-to-ini.go && xx-verify environment-to-ini
RUN LDFLAGS="-buildid=" make RELEASE_VERSION=$RELEASE_VERSION GOFLAGS="-trimpath" go-check generate-backend static-executable && xx-verify gitea
RUN LDFLAGS="-buildid=" make FORGEJO_GENERATE_SKIP_HASH=true RELEASE_VERSION=$RELEASE_VERSION GOFLAGS="-trimpath" go-check generate-backend static-executable && xx-verify gitea
# Copy local files
COPY docker/root /tmp/local

View file

@ -33,10 +33,10 @@ RUN apk --no-cache add build-base git nodejs npm
COPY . ${GOPATH}/src/forgejo.org
WORKDIR ${GOPATH}/src/forgejo.org
RUN make clean
RUN make clean-no-bindata
RUN make frontend
RUN go build contrib/environment-to-ini/environment-to-ini.go && xx-verify environment-to-ini
RUN make RELEASE_VERSION=$RELEASE_VERSION go-check generate-backend static-executable && xx-verify gitea
RUN make FORGEJO_GENERATE_SKIP_HASH=true RELEASE_VERSION=$RELEASE_VERSION go-check generate-backend static-executable && xx-verify gitea
# Copy local files
COPY docker/rootless /tmp/local

View file

@ -48,7 +48,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.34.0 # renovate: datasource=go
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.18.1 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@40.48.4 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
RENOVATE_NPM_PACKAGE ?= renovate@40.57.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...
@ -129,7 +129,7 @@ WEBPACK_CONFIGS := webpack.config.js tailwind.config.js
WEBPACK_DEST := public/assets/js/index.js public/assets/css/index.css
WEBPACK_DEST_ENTRIES := public/assets/js public/assets/css public/assets/fonts
BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
BINDATA_DEST := modules/migration/bindata.go modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST))
GENERATED_GO_DEST := modules/charset/invisible_gen.go modules/charset/ambiguous_gen.go
@ -325,8 +325,12 @@ clean-all: clean
rm -rf $(WEBPACK_DEST_ENTRIES) node_modules
.PHONY: clean
clean:
rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) $(BINDATA_HASH) \
clean: clean-no-bindata
rm -rf $(BINDATA_DEST) $(BINDATA_HASH)
.PHONY: clean-no-bindata
clean-no-bindata:
rm -rf $(EXECUTABLE) $(DIST) \
integrations*.test \
e2e*.test \
tests/integration/gitea-integration-* \

File diff suppressed because one or more lines are too long

View file

@ -22,12 +22,19 @@ import (
"github.com/klauspost/compress/zstd"
)
func needsUpdate(dir, filename string) (bool, []byte) {
needRegen := false
func fileExists(filename string) bool {
_, err := os.Stat(filename)
if err != nil {
needRegen = true
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
panic(err)
}
func needsUpdate(dir, filename string) (bool, []byte) {
needRegen := !fileExists(filename)
oldHash, err := os.ReadFile(filename + ".hash")
if err != nil {
@ -73,10 +80,14 @@ func main() {
useGlobalModTime, _ = strconv.ParseBool(os.Args[4])
}
update, newHash := needsUpdate(dir, filename)
if os.Getenv("FORGEJO_GENERATE_SKIP_HASH") == "true" && fileExists(filename) {
fmt.Printf("bindata %s already exists and FORGEJO_GENERATE_SKIP_HASH=true\n", packageName)
return
}
update, newHash := needsUpdate(dir, filename)
if !update {
fmt.Printf("bindata for %s already up-to-date\n", packageName)
fmt.Printf("bindata %s already exists and the checksum is a match\n", packageName)
return
}

View file

@ -1,45 +1,46 @@
Environment To Ini
==================
Multiple docker users have requested that the Gitea docker is changed
to permit arbitrary configuration via environment variables.
This tool allows defining Forgejo's entire configuration via environment
variables, mostly geared towards usage in Docker.
Gitea needs to use an ini file for configuration because the running
environment that starts the docker may not be the same as that used
by the hooks. An ini file also gives a good default and means that
users do not have to completely provide a full environment.
Forgejo needs to use an INI file for configuration because the running
environment that starts the container may not be the same as the one used
by the hooks. An INI file also gives a good default and means that
users do not have to provide the entire set of environment variables.
With those caveats above, this command provides a generic way of
converting suitably structured environment variables into any ini
value.
To use the command is very simple just run it and the default gitea
app.ini will be rewritten to take account of the variables provided,
however there are various options to give slightly different
behavior and these can be interrogated with the `-h` option.
When run, `environment-to-ini` will write the config files based on the
environment variables provided.
Check with the `-h` flag for several options to alter this behaviour.
The environment variables should be of the form:
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
will be mapped to the ini section "[section_name]" and the key
"KEY_NAME" with the value as provided.
GITEA__SECTION_NAME__KEY_NAME
Note, SECTION_NAME in the notation above is case-insensitive.
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME__FILE"
will be mapped to the ini section "[section_name]" and the key
"KEY_NAME" with the value loaded from the specified file.
Environment variables are usually restricted to a reduced character
set "0-9A-Z_" - in order to allow the setting of sections with
characters outside of that set, they should be escaped as following:
"_0X2E_" for "." and "_0X2D_" for "-". The entire section and key names
can be escaped as a UTF8 byte string if necessary. E.g. to configure:
"_0X2E_" for ".". The entire section and key names can be escaped as
a UTF8 byte string if necessary. E.g. to configure:
"""
...
[log.console]
COLORIZE=false
STDERR=true
...
"""
"""
...
[log.console]
COLORIZE=false
STDERR=true
...
"""
You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false"
and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
on the configuration cheat sheet.
To build locally, run:

10
go.mod
View file

@ -48,7 +48,7 @@ require (
github.com/go-git/go-git/v5 v5.13.2
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.21.0
github.com/go-sql-driver/mysql v1.9.2
github.com/go-sql-driver/mysql v1.9.3
github.com/go-webauthn/webauthn v0.13.0
github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
@ -76,7 +76,7 @@ require (
github.com/meilisearch/meilisearch-go v0.31.0
github.com/mholt/archiver/v3 v3.5.1
github.com/microcosm-cc/bluemonday v1.0.27
github.com/minio/minio-go/v7 v7.0.91
github.com/minio/minio-go/v7 v7.0.93
github.com/msteinert/pam/v2 v2.1.0
github.com/nektos/act v0.2.52
github.com/niklasfasching/go-org v1.8.0
@ -92,7 +92,6 @@ require (
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
github.com/ulikunitz/xz v0.5.12
github.com/urfave/cli/v2 v2.27.6
github.com/urfave/cli/v3 v3.3.3
github.com/valyala/fastjson v1.6.4
github.com/yohcop/openid-go v1.0.1
@ -152,7 +151,6 @@ require (
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cyphar/filepath-securejoin v0.3.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
@ -209,6 +207,7 @@ require (
github.com/nwaples/rardecode v1.1.3 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pjbgf/sha1cd v0.3.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
@ -220,14 +219,13 @@ require (
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.3.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/tinylib/msgp v1.3.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/zeebo/assert v1.3.0 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
go.etcd.io/bbolt v1.4.0 // indirect

20
go.sum
View file

@ -152,8 +152,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
@ -247,8 +245,8 @@ github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9Z
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
@ -413,8 +411,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY
github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc=
github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go=
github.com/minio/minio-go/v7 v7.0.93 h1:lAB4QJp8Nq3vDMOU0eKgMuyBiEGMNlXQ5Glc8qAxqSU=
github.com/minio/minio-go/v7 v7.0.93/go.mod h1:71t2CqDt3ThzESgZUlU1rBN54mksGGlkLcFgguDnnAc=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -457,6 +455,8 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY=
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
@ -495,8 +495,6 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
@ -525,12 +523,12 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
@ -541,8 +539,6 @@ github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js=

View file

@ -21,7 +21,7 @@ import (
_ "forgejo.org/modules/markup/markdown"
_ "forgejo.org/modules/markup/orgmode"
"github.com/urfave/cli/v2"
"github.com/urfave/cli/v3"
)
// these flags will be set by the build flags

View file

@ -467,11 +467,8 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, err
return nil, 0, err
}
sess := db.GetEngine(ctx).Where(cond).
Select("`action`.*"). // this line will avoid select other joined table's columns
Join("INNER", "repository", "`repository`.id = `action`.repo_id")
opts.SetDefaultValues()
sess := db.GetEngine(ctx).Where(cond)
sess = db.SetSessionPagination(sess, &opts)
actions := make([]*Action, 0, opts.PageSize)

View file

@ -226,24 +226,6 @@ func TestNotifyWatchers(t *testing.T) {
})
}
func TestGetFeedsCorrupted(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
ID: 8,
RepoID: 1700,
})
actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
RequestedUser: user,
Actor: user,
IncludePrivate: true,
})
require.NoError(t, err)
assert.Empty(t, actions)
assert.Equal(t, int64(0), count)
}
func TestConsistencyUpdateAction(t *testing.T) {
if !setting.Database.Type.IsSQLite3() {
t.Skip("Test is only for SQLite database.")

View file

@ -59,14 +59,6 @@
created_unix: 1603011540 # grouped with id:7
- id: 8
user_id: 1
op_type: 12 # close issue
act_user_id: 1
repo_id: 1700 # dangling intentional
is_private: false
created_unix: 1603011541
- id: 9
user_id: 34
op_type: 12 # close issue
act_user_id: 34

View file

@ -179,25 +179,6 @@ func (status *CommitStatus) LocaleString(lang translation.Locale) string {
return lang.TrString("repo.commitstatus." + status.State.String())
}
// HideActionsURL set `TargetURL` to an empty string if the status comes from Gitea Actions
func (status *CommitStatus) HideActionsURL(ctx context.Context) {
if status.RepoID == 0 {
return
}
if status.Repo == nil {
if err := status.loadRepository(ctx); err != nil {
log.Error("loadRepository: %v", err)
return
}
}
prefix := fmt.Sprintf("%s/actions", status.Repo.Link())
if strings.HasPrefix(status.TargetURL, prefix) {
status.TargetURL = ""
}
}
// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
if len(statuses) == 0 {
@ -453,11 +434,19 @@ type SignCommitWithStatuses struct {
*asymkey_model.SignCommit
}
// ParseCommitsWithStatus checks commits latest statuses and calculates its worst status state
func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.SignCommit, repo *repo_model.Repository) []*SignCommitWithStatuses {
newCommits := make([]*SignCommitWithStatuses, 0, len(oldCommits))
// ParseCommitsWithStatus converts git commits into SignCommitWithStatuses (checks signature and calculates its worst status state)
func ParseCommitsWithStatus(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses {
commitsWithSignature := asymkey_model.ParseCommitsWithSignature(
ctx,
user_model.ValidateCommitsWithEmails(ctx, commits),
repo.GetTrustModel(),
func(user *user_model.User) (bool, error) {
return repo_model.IsOwnerMemberCollaborator(ctx, repo, user.ID)
},
)
for _, c := range oldCommits {
commitsWithStatus := make([]*SignCommitWithStatuses, 0, len(commitsWithSignature))
for _, c := range commitsWithSignature {
commit := &SignCommitWithStatuses{
SignCommit: c,
}
@ -469,43 +458,12 @@ func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.Sig
commit.Status = CalcCommitStatus(statuses)
}
newCommits = append(newCommits, commit)
commitsWithStatus = append(commitsWithStatus, commit)
}
return newCommits
return commitsWithStatus
}
// hashCommitStatusContext hash context
func hashCommitStatusContext(context string) string {
return fmt.Sprintf("%x", sha1.Sum([]byte(context)))
}
// ConvertFromGitCommit converts git commits into SignCommitWithStatuses
func ConvertFromGitCommit(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses {
return ParseCommitsWithStatus(ctx,
asymkey_model.ParseCommitsWithSignature(
ctx,
user_model.ValidateCommitsWithEmails(ctx, commits),
repo.GetTrustModel(),
func(user *user_model.User) (bool, error) {
return repo_model.IsOwnerMemberCollaborator(ctx, repo, user.ID)
},
),
repo,
)
}
// CommitStatusesHideActionsURL hide Gitea Actions urls
func CommitStatusesHideActionsURL(ctx context.Context, statuses []*CommitStatus) {
idToRepos := make(map[int64]*repo_model.Repository)
for _, status := range statuses {
if status == nil {
continue
}
if status.Repo == nil {
status.Repo = idToRepos[status.RepoID]
}
status.HideActionsURL(ctx)
idToRepos[status.RepoID] = status.Repo
}
}

View file

@ -4,11 +4,9 @@
package git_test
import (
"fmt"
"testing"
"time"
actions_model "forgejo.org/models/actions"
"forgejo.org/models/db"
git_model "forgejo.org/models/git"
repo_model "forgejo.org/models/repo"
@ -246,26 +244,3 @@ func TestFindRepoRecentCommitStatusContexts(t *testing.T) {
assert.Equal(t, "compliance/lint-backend", contexts[0])
}
}
func TestCommitStatusesHideActionsURL(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: 791, RepoID: repo.ID})
require.NoError(t, run.LoadAttributes(db.DefaultContext))
statuses := []*git_model.CommitStatus{
{
RepoID: repo.ID,
TargetURL: fmt.Sprintf("%s/jobs/%d", run.Link(), run.Index),
},
{
RepoID: repo.ID,
TargetURL: "https://mycicd.org/1",
},
}
git_model.CommitStatusesHideActionsURL(db.DefaultContext, statuses)
assert.Empty(t, statuses[0].TargetURL)
assert.Equal(t, "https://mycicd.org/1", statuses[1].TargetURL)
}

View file

@ -802,7 +802,7 @@ func (c *Comment) LoadPushCommits(ctx context.Context) (err error) {
}
defer closer.Close()
c.Commits = git_model.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo)
c.Commits = git_model.ParseCommitsWithStatus(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo)
c.CommitsNum = int64(len(c.Commits))
}

View file

@ -38,6 +38,7 @@ var (
InvertedGitFlushEnv bool // 2.43.1
SupportCheckAttrOnBare bool // >= 2.40
SupportGitMergeTree bool // >= 2.38
SupportGrepMaxCount bool // >= 2.38
HasSSHExecutable bool
@ -191,6 +192,7 @@ func InitFull(ctx context.Context) (err error) {
InvertedGitFlushEnv = CheckGitVersionEqual("2.43.1") == nil
SupportGitMergeTree = CheckGitVersionAtLeast("2.38") == nil
SupportGrepMaxCount = CheckGitVersionAtLeast("2.38") == nil
if setting.LFS.StartServer {
if CheckGitVersionAtLeast("2.1.2") != nil {

View file

@ -98,8 +98,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
// --max-count requires at least git 2.38
if CheckGitVersionAtLeast("2.38.0") == nil {
if SupportGrepMaxCount {
cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile))
} else {
log.Warn("git-grep: --max-count requires at least git 2.38")

View file

@ -59,48 +59,55 @@ func TestGrepSearch(t *testing.T) {
},
}, res)
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1})
require.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "i-am-a-python.p",
LineNumbers: []int{1},
LineCodes: []string{"## This is a simple file to do a hello world"},
HighlightedRanges: [][3]int{{0, 39, 44}},
},
{
Filename: "java-hello/main.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
{
Filename: "main.vendor.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
{
Filename: "python-hello/hello.py",
LineNumbers: []int{1},
LineCodes: []string{"## This is a simple file to do a hello world"},
HighlightedRanges: [][3]int{{0, 39, 44}},
},
}, res)
t.Run("Max count", func(t *testing.T) {
if !SupportGrepMaxCount {
t.Skip("Skipping, git grep --max-count is not supported")
return
}
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{
MatchesPerFile: 1,
Filename: "java-hello/",
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1})
require.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "i-am-a-python.p",
LineNumbers: []int{1},
LineCodes: []string{"## This is a simple file to do a hello world"},
HighlightedRanges: [][3]int{{0, 39, 44}},
},
{
Filename: "java-hello/main.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
{
Filename: "main.vendor.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
{
Filename: "python-hello/hello.py",
LineNumbers: []int{1},
LineCodes: []string{"## This is a simple file to do a hello world"},
HighlightedRanges: [][3]int{{0, 39, 44}},
},
}, res)
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{
MatchesPerFile: 1,
Filename: "java-hello/",
})
require.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "java-hello/main.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
}, res)
})
require.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "java-hello/main.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
}, res)
res, err = GrepSearch(t.Context(), repo, "no-such-content", GrepOptions{})
require.NoError(t, err)

View file

@ -251,10 +251,14 @@ func TestGitAttributeCheckerError(t *testing.T) {
cancel()
ac, err := gitRepo.GitAttributeChecker("8fee858da5796dfb37704761701bb8e800ad9ef3", "linguist-language")
require.NoError(t, err)
if SupportCheckAttrOnBare {
require.NoError(t, err)
_, err = ac.CheckPath("i-am-a-python.p")
require.Error(t, err)
_, err = ac.CheckPath("i-am-a-python.p")
require.Error(t, err)
} else {
require.Error(t, err)
}
})
t.Run("Cancelled/DuringRun", func(t *testing.T) {

View file

@ -16,16 +16,10 @@ import (
)
func TestElasticsearchIndexer(t *testing.T) {
// The elasticsearch instance started by testing.yml > test-unit > services > elasticsearch
url := "http://elastic:changeme@elasticsearch:9200"
if os.Getenv("CI") == "" {
// Make it possible to run tests against a local elasticsearch instance
url = os.Getenv("TEST_ELASTICSEARCH_URL")
if url == "" {
t.Skip("TEST_ELASTICSEARCH_URL not set and not running in CI")
return
}
url := os.Getenv("TEST_ELASTICSEARCH_URL")
if url == "" {
t.Skip("TEST_ELASTICSEARCH_URL not set")
return
}
require.Eventually(t, func() bool {

View file

@ -69,6 +69,10 @@ var (
// https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type%3Demail)
emailRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+)(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))")
// Fediverse handle regex (same as emailRegex but with additonal @ or !
// at start)
fediRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([@!]([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+)@([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+))(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))")
// blackfriday extensions create IDs like fn:user-content-footnote
blackfridayExtRegex = regexp.MustCompile(`[^:]*:user-content-`)
@ -153,6 +157,7 @@ var defaultProcessors = []processor{
issueIndexPatternProcessor,
commitCrossReferencePatternProcessor,
hashCurrentPatternProcessor,
fediAddressProcessor,
emailAddressProcessor,
emojiProcessor,
emojiShortCodeProcessor,
@ -1237,6 +1242,21 @@ func hashCurrentPatternProcessor(ctx *RenderContext, node *html.Node) {
}
}
// fediAddressProcessor replaces raw fediverse handles with toolforge links
func fediAddressProcessor(ctx *RenderContext, node *html.Node) {
next := node.NextSibling
for node != nil && node != next {
m := fediRegex.FindStringSubmatchIndex(node.Data)
if m == nil {
return
}
fedihandle := node.Data[m[2]:m[3]]
replaceContent(node, m[2], m[3], createLink("https://fedirect.toolforge.org/?id="+url.QueryEscape(fedihandle), fedihandle, "fedihandle"))
node = node.NextSibling.NextSibling
}
}
// emailAddressProcessor replaces raw email addresses with a mailto: link.
func emailAddressProcessor(ctx *RenderContext, node *html.Node) {
next := node.NextSibling

View file

@ -307,6 +307,19 @@ func TestRender_email(t *testing.T) {
test(
"email@domain..com",
`<p>email@domain..com</p>`)
// Test fediverse handle
test(
"@forgejo@floss.social",
`<p><a href="https://fedirect.toolforge.org/?id=%40forgejo%40floss.social" rel="nofollow">@forgejo@floss.social</a></p>`)
test(
"!forgejo@programming.dev",
`<p><a href="https://fedirect.toolforge.org/?id=%21forgejo%40programming.dev" rel="nofollow">!forgejo@programming.dev</a></p>`)
test(
"@#&@forgejo.org",
`<p><a href="https://fedirect.toolforge.org/?id=%40%23%26%40forgejo.org" rel="nofollow">@#&amp;@forgejo.org</a></p>`)
}
func TestRender_emoji(t *testing.T) {

View file

@ -18,13 +18,14 @@ import (
)
func TestMinioStorageIterator(t *testing.T) {
if os.Getenv("CI") == "" {
t.Skip("minioStorage not present outside of CI")
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
if endpoint == "" {
t.Skip("TEST_MINIO_ENDPOINT not set")
return
}
testStorageIterator(t, setting.MinioStorageType, &setting.Storage{
MinioConfig: setting.MinioStorageConfig{
Endpoint: "minio:9000",
Endpoint: endpoint,
AccessKeyID: "123456",
SecretAccessKey: "12345678",
Bucket: "gitea",
@ -34,13 +35,14 @@ func TestMinioStorageIterator(t *testing.T) {
}
func TestVirtualHostMinioStorage(t *testing.T) {
if os.Getenv("CI") == "" {
t.Skip("minioStorage not present outside of CI")
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
if endpoint == "" {
t.Skip("TEST_MINIO_ENDPOINT not set")
return
}
testStorageIterator(t, setting.MinioStorageType, &setting.Storage{
MinioConfig: setting.MinioStorageConfig{
Endpoint: "minio:9000",
Endpoint: endpoint,
AccessKeyID: "123456",
SecretAccessKey: "12345678",
Bucket: "gitea",
@ -85,13 +87,14 @@ func TestMinioStoragePath(t *testing.T) {
}
func TestS3StorageBadRequest(t *testing.T) {
if os.Getenv("CI") == "" {
t.Skip("S3Storage not present outside of CI")
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
if endpoint == "" {
t.Skip("TEST_MINIO_ENDPOINT not set")
return
}
cfg := &setting.Storage{
MinioConfig: setting.MinioStorageConfig{
Endpoint: "minio:9000",
Endpoint: endpoint,
AccessKeyID: "123456",
SecretAccessKey: "12345678",
Bucket: "bucket",

View file

@ -3,8 +3,8 @@
package structs
// GitBlobResponse represents a git blob
type GitBlobResponse struct {
// GitBlob represents a git blob
type GitBlob struct {
Content string `json:"content"`
Encoding string `json:"encoding"`
URL string `json:"url"`

View file

@ -11,7 +11,7 @@ copy_content = Копиране на съдържанието
user_profile_and_more = Профил и настройки…
view = Преглед
your_settings = Настройки
mirrors = Огледала
mirrors = Огледални
explore = Разглеждане
write = Писане
twofa = Двуфакторно удостоверяване
@ -36,7 +36,7 @@ dashboard = Табло
logo = Лого
toc = Съдържание
copy_url = Копиране на URL
new_mirror = Ново огледало
new_mirror = Ново огледално
re_type = Потвърдете паролата
copy = Копиране
enabled = Включено
@ -61,7 +61,7 @@ ok = Добре
manage_org = Управление на организациите
new_repo = Ново хранилище
register = Регистрация
mirror = Огледало
mirror = Огледално
username = Потребителско име
password = Парола
template = Шаблон
@ -69,7 +69,7 @@ signed_in_as = Влезли сте като
sign_up = Регистриране
enable_javascript = Този сайт изисква JavaScript.
home = Начало
email = Адрес на ел. поща
email = Адрес за ел. поща
issues = Задачи
retry = Повторен опит
remove = Премахване
@ -93,8 +93,8 @@ filter.not_fork = Не разклонения
filter.is_template = Шаблони
filter.not_template = Не шаблони
filter.private = Частни
filter.is_mirror = Огледала
filter.not_mirror = Не огледала
filter.is_mirror = Огледални
filter.not_mirror = Не огледални
copy_hash = Копиране на контролната сума
artifacts = Артефакти
show_log_seconds = Показване на секундите
@ -102,7 +102,7 @@ remove_all = Премахване на всичко
test = Проба
remove_label_str = Премахване на елемента „%s“
copy_branch = Копиране на името на клона
error404 = Страницата, която се опитвате да отворите, или <strong>не съществува</strong> или <strong>не сте упълномощени</strong> да я видите.
error404 = Страницата, която се опитвате да отворите, или <strong>не съществува</strong>, или <strong>е премахната</strong>, или <strong>не сте упълномощени</strong> да я видите.
new_repo.link = Ново хранилище
new_migrate.title = Нова миграция
new_repo.title = Ново хранилище
@ -112,6 +112,35 @@ new_org.link = Нова организация
copy_generic = Копиране в клипборда
copy_error = Неуспешно копиране
copy_path = Копиране на пътя
toggle_menu = Превключване на менюто
confirm_delete_artifact = Сигурни ли сте, че искате да изтриете артефакта „%s“?
more_items = Още елементи
twofa_scratch = Резервен код за двуфакторно удостоверяване
webauthn_use_twofa = Използвайте двуфакторен код от телефона си
webauthn_error_insecure = WebAuthn поддържа само сигурни връзки. За тестване през HTTP можете да използвате произход „localhost“ или „127.0.0.1“
error413 = Изчерпали сте квотата си.
go_back = Връщане
invalid_data = Невалидни данни: %v
archived = Архивирано
concept_system_global = Глобално
concept_user_individual = Индивидуално
show_full_screen = Показване на цял екран
show_timestamps = Показване на времеви отпечатъци
rerun = Повторно изпълнение
copy_type_unsupported = Този тип файл не може да бъде копиран
webauthn_error_unknown = Възникна неизвестна грешка. Моля, опитайте отново.
webauthn_error_unable_to_process = Сървърът не можа да обработи заявката ви.
webauthn_error_empty = Трябва да зададете име за този ключ.
webauthn_error_timeout = Времето за изчакване изтече преди ключът ви да бъде прочетен. Моля, презаредете страницата и опитайте отново.
return_to_forgejo = Връщане към Forgejo
unknown = Неизвестно
confirm_delete_selected = Потвърждавате ли изтриването на всички избрани елементи?
webauthn_insert_key = Поставете вашия ключ за сигурност
webauthn_press_button = Моля, натиснете бутона на вашия ключ за сигурност…
webauthn_sign_in = Натиснете бутона на вашия ключ за сигурност. Ако ключът ви за сигурност няма бутон, поставете го отново.
webauthn_error = Неуспешно прочитане на вашия ключ за сигурност.
webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn.
webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран.
[settings]
ui = Тема
@ -157,7 +186,7 @@ account = Акаунт
update_avatar = Обновяване на профилната снимка
ssh_gpg_keys = SSH / GPG ключове
comment_type_group_milestone = Етап
manage_emails = Управление на адресите на ел. поща
manage_emails = Управление на адресите за ел. поща
permission_read = Четене
update_password = Обновяване на паролата
biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун)
@ -183,7 +212,7 @@ user_block_success = Потребителят е блокиран успешно
update_profile_success = Профилът ви е обновен.
update_user_avatar_success = Профилната снимка на потребителя е обновена.
remove_oauth2_application_success = Приложението е изтрито.
email_deletion_success = Адресът на ел. поща е премахнат.
email_deletion_success = Адресът за ел. поща е премахнат.
update_avatar_success = Профилната ви снимка е обновена.
change_username = Потребителското ви име е променено.
comment_type_group_assignee = Изпълнител
@ -191,22 +220,22 @@ enable_custom_avatar = Използване на персонализирана
requires_activation = Изисква активиране
activated = Активиран
primary = Основен
email_deletion = Премахване на адреса на ел. поща
add_new_email = Добавяне на нов адрес на ел. поща
add_email = Добавяне на адрес на ел. поща
email_deletion = Премахване на адреса за ел. поща
add_new_email = Добавяне на нов адрес за ел. поща
add_email = Добавяне на адрес за ел. поща
key_content_gpg_placeholder = Започва с „-----BEGIN PGP PUBLIC KEY BLOCK-----“
comment_type_group_title = Заглавие
comment_type_group_label = Етикет
change_username_prompt = Забележка: Промяната на потребителското ви име променя също URL на вашия акаунт.
change_username_prompt = Бележка: Промяната на потребителското ви име променя също URL на вашия акаунт.
update_language_not_found = Езикът „%s“ не е наличен.
keep_activity_private_popup = Вашата дейност ще бъде видима само за вас и администраторите на сайта
uploaded_avatar_not_a_image = Каченият файл не е изображение.
uploaded_avatar_is_too_big = Размерът на качения файл (%d KiB) надвишава максималния размер (%d KiB).
change_password_success = Паролата ви е обновена. Влизайте с новата си парола от сега нататък.
change_password_success = Паролата ви е обновена. Отсега нататък използвайте новата си парола, за да влезете.
manage_themes = Тема по подразбиране
manage_openid = OpenID адреси
primary_email = Да е основен
keep_email_private = Скриване на адреса на ел. поща
keep_email_private = Скриване на адреса за ел. поща
theme_update_error = Избраната тема не съществува.
theme_update_success = Темата ви е обновена.
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“
@ -227,7 +256,7 @@ saved_successfully = Настройките бяха запазени успеш
no_activity = Няма скорошна дейност
theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли.
keep_activity_private = Скриване на дейността от профилната страница
lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща
lookup_avatar_by_mail = Търсене на профилна снимка по адреса за ел. поща
password_incorrect = Текущата парола е неправилна.
change_username_redirect_prompt = Старото потребителско име ще се пренасочва, докато някой не го вземе.
principal_content = Съдържание
@ -246,7 +275,7 @@ delete_prompt = Тази операция ще изтрие перманентн
email_notifications.disable = Изключване на известията по ел. поща
delete_account = Изтриване на акаунта ви
confirm_delete_account = Потвърждаване на изтриването
email_notifications.onmention = Ел. поща само при споменаване
email_notifications.onmention = Ел. писмо само при споменаване
pronouns_unspecified = Непосочени
pronouns = Местоимения
gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
@ -254,8 +283,103 @@ language.title = Език по подразбиране
language.localization_project = Помогнете ни да преведем Forgejo на вашия език! <a href="%s">Научете повече</a>.
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
pronouns_custom = Персонализирани
visibility.limited_tooltip = Видимо само за влезли потребители
visibility.limited_tooltip = Видим само за влезли потребители
pronouns_custom_label = Персонализирани местоимения
comment_type_group_review_request = Искане за рецензия
ssh_key_been_used = Този SSH ключ вече е добавен към сървъра.
create_oauth2_application = Създаване на ново OAuth2 приложение
update_oauth2_application_success = Успешно обновихте OAuth2 приложението.
authorized_oauth2_applications = Упълномощени OAuth2 приложения
manage_account_links = Свързани акаунти
revoke_oauth2_grant = Отнемане на достъпа
added_on = Добавен на %s
comment_type_group_dependency = Зависимост
update_hints_success = Подсказките са обновени.
manage_oauth2_applications = Управление на OAuth2 приложения
gpg_key_id_used = Вече съществува публичен GPG ключ със същото ID.
oauth2_applications_desc = OAuth2 приложенията позволяват на вашето приложение от трета страна да удостоверява сигурно потребители в тази инстанция на Forgejo.
blocked_since = Блокиран от %s
hidden_comment_types.ref_tooltip = Коментари, в които тази задача е спомената от друга задача/подаване/…
create_oauth2_application_success = Успешно създадохте ново OAuth2 приложение.
quota.applies_to_org = Следните правила за квота се прилагат за тази организация
keep_activity_private.description = Вашата <a href="%s">публична дейност</a> ще бъде видима само за вас и администраторите на инстанцията.
ssh_helper = <strong>Нуждаете се от помощ?</strong> Разгледайте ръководството за <a href="%s">създаване на собствени SSH ключове</a> или за решаване на <a href="%s">често срещани проблеми</a>, които може да срещнете при използване на SSH.
twofa_desc = За да защитите акаунта си от кражба на парола, можете да използвате смартфон или друго устройство за получаване на еднократни пароли, базирани на време („TOTP“).
scan_this_image = Сканирайте това изображение с вашето приложение за удостоверяване:
quota.rule.exceeded.helper = Общият размер на обектите за това правило надвиши квотата.
password_change_disabled = Нелокални потребители не могат да обновяват паролата си през уеб интерфейса на Forgejo.
twofa_disable_note = Можете да изключите двуфакторното удостоверяване, ако е необходимо.
hooks.desc = Добавете уеб-куки, които ще се задействат за <strong>всички хранилища</strong>, които притежавате.
delete_account_desc = Сигурни ли сте, че искате да изтриете перманентно този потребителски акаунт?
last_used = Последно използван на
revoke_oauth2_grant_description = Отнемането на достъпа за това приложение от трета страна ще му попречи да има достъп до вашите данни. Сигурни ли сте?
password_username_disabled = Нелокални потребители не могат да променят потребителското си име. Моля, свържете се с администратора на сайта за повече подробности.
change_username_redirect_prompt.with_cooldown.one = Старото потребителско име ще бъде достъпно за всички след период на изчакване от %[1]d ден. Все още можете да си върнете старото потребителско име по време на периода на изчакване.
change_username_redirect_prompt.with_cooldown.few = Старото потребителско име ще бъде достъпно за всички след период на изчакване от %[1]d дни. Все още можете да си върнете старото потребителско име по време на периода на изчакване.
generate_token_name_duplicate = <strong>%s</strong> вече е използвано като име на приложение. Моля, използвайте ново.
quota.rule.exceeded = Надвишена
repo_and_org_access = Достъп до хранилища и организации
permissions_public_only = Само публични
permissions_list = Разрешения:
edit_oauth2_application = Редактиране на OAuth2 приложение
remove_oauth2_application = Премахване на OAuth2 приложение
twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта.
visibility.private_tooltip = Видим само за членове на организации, в които участвате
quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт
quota.rule.no_limit = Неограничена
hints = Подсказки
comment_type_group_issue_ref = Препратка към задача
activate_email = Изпращане на активация
ssh_disabled = SSH е изключен
twofa_disable_desc = Изключването на двуфакторното удостоверяване ще направи акаунта ви по-малко сигурен. Продължаване?
keep_pronouns_private = Показване на местоименията само на удостоверени потребители
keep_pronouns_private.description = Това ще скрие вашите местоимения от посетители, които не са влезли в системата.
gpg_helper = <strong>Нуждаете се от помощ?</strong> Разгледайте ръководството <a href="%s">относно GPG</a>.
valid_until_date = Валиден до %s
ssh_externally_managed = Този SSH ключ се управлява външно за този потребител
regenerate_scratch_token_desc = Ако сте загубили ключа си за възстановяване или вече сте го използвали, за да влезете, можете да го нулирате тук.
create_oauth2_application_button = Създаване на приложение
revoke_oauth2_grant_success = Достъпът е отнет успешно.
comment_type_group_deadline = Краен срок
comment_type_group_time_tracking = Проследяване на времето
activations_pending = Чакащи активации
valid_forever = Валиден завинаги
key_state_desc = Този ключ е използван през последните 7 дни
revoke_key = Отнемане
delete_account_title = Изтриване на потребителския акаунт
update_hints = Обновяване на подсказките
permissions_access_all = Всички (публични, частни и ограничени)
oauth2_application_name = Име на приложението
visibility.public_tooltip = Видим за всички
user_block_yourself = Не можете да блокирате себе си.
hidden_comment_types.issue_ref_tooltip = Коментари, в които потребителят променя клона/маркера, свързан със задачата
comment_type_group_reference = Препратка
comment_type_group_branch = Клон
comment_type_group_pull_request_push = Добавени подавания
quota = Квота
webauthn_delete_key = Премахване на ключ за сигурност
webauthn_register_key = Добавяне на ключ за сигурност
webauthn_nickname = Прякор
webauthn_delete_key_desc = Ако премахнете ключ за сигурност, вече няма да можете да влизате с него. Продължаване?
additional_repo_units_hint = Предлагане за включване на допълнителни елементи на хранилището
twofa_is_enrolled = Вашият акаунт в момента е <strong>включен</strong> в двуфакторно удостоверяване.
twofa_not_enrolled = Вашият акаунт в момента не е включен в двуфакторно удостоверяване.
webauthn_key_loss_warning = Ако загубите ключовете си за сигурност, ще загубите достъп до акаунта си.
email_desc = Вашият основен адрес за ел. поща ще се използва за известия, възстановяване на парола и, при условие че не е скрит, за уеб-базирани Git операции.
email_preference_set_success = Предпочитанията за ел. поща са зададени успешно.
add_email_confirmation_sent = Изпратено е ел. писмо за потвърждение до „%s“. За да потвърдите адреса си за ел. поща, моля, проверете входящата си кутия и последвайте предоставената връзка в рамките на следващите %s.
additional_repo_units_hint_description = Показване на подсказка „Включване на повече“ за хранилища, които нямат включени всички налични елементи.
email_notifications.submit = Задаване на предпочит. за ел. поща
email_notifications.andyourown = И вашите собствени известия
email_deletion_desc = Адресът за ел. поща и свързаната информация ще бъдат премахнати от вашия акаунт. Git подаванията от този адрес за ел. поща ще останат непроменени. Продължаване?
add_email_success = Новият адрес за ел. поща е добавен.
remove_account_link = Премахване на свързан акаунт
webauthn_alternative_tip = Може да искате да конфигурирате допълнителен метод за удостоверяване.
hidden_comment_types_description = Типовете коментари, отметнати тук, няма да се показват в страниците на задачите. Например, отмятането на „Етикет“ премахва всички коментари от типа „<потребител> добави/премахна <етикет>“.
hidden_comment_types = Скрити типове коментари
comment_type_group_lock = Състояние на заключване
can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща.
storage_overview = Преглед на съхранението
[packages]
container.labels.value = Стойност
@ -287,6 +411,33 @@ generic.download = Изтеглете пакета от командния ре
container.details.type = Тип образ
alpine.repository = За хранилището
container.images.title = Образи
arch.version.description = Описание
search_in_external_registry = Търсене в %s
filter.type = Тип
filter.container.untagged = Без маркер
filter.type.all = Всички
registry.documentation = За повече информация относно регистъра %s, вижте <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a>.
filter.no_result = Вашият филтър не даде резултати.
filter.container.tagged = С маркер
arch.pacman.repo.multi = %s има същата версия в различни дистрибуции.
arch.pacman.helper.gpg = Добавете доверителен сертификат за pacman:
alpine.repository.architectures = Архитектури
arch.version.provides = Доставя
arch.version.groups = Група
details.project_site = Уебсайт на проекта
arch.pacman.conf = Добавете сървър със свързаната дистрибуция и архитектура към <code>/etc/pacman.conf</code> :
arch.pacman.sync = Синхронизирайте пакета с pacman:
details.repository_site = Уебсайт на хранилището
arch.version.depends = Зависимости
arch.version.optdepends = Допълнителни зависимости
arch.version.replaces = Заменя
go.install = Инсталирайте пакета от командния ред:
cargo.registry = Настройте този регистър в конфигурационния файл на Cargo (например <code>~/.cargo/config.toml</code>):
cargo.install = За да инсталирате пакета с Cargo, изпълнете следната команда:
details.documentation_site = Уебсайт на документацията
arch.version.conflicts = В конфликт
alpine.repository.branches = Клонове
arch.pacman.repo.multi.item = Конфигурация за %s
[tool]
hours = %d часа
@ -447,7 +598,7 @@ projects.template.desc = Шаблон
projects.card_type.text_only = Само текст
projects.card_type.images_and_text = Изображения и текст
wiki = Уики
wiki.welcome = Добре дошли в Уикито.
wiki.welcome = Добре дошли в уикито.
wiki.create_first_page = Създаване на първата страница
editor.upload_file = Качване на файл
projects.column.color = Цвят
@ -644,7 +795,7 @@ milestones.filter_sort.latest_due_date = Най-далечен краен сро
diff.view_file = Преглед на файла
release.deletion_success = Изданието е изтрито.
projects.column.delete = Изтриване на колоната
migrate.migrating = Мигриране от <b>%s</b> ...
migrate.migrating = Мигриране от <b>%s</b>
escape_control_characters = Екраниране
issues.label_deletion_success = Етикетът е изтрит.
pulls.is_closed = Заявката за сливане е затворена.
@ -1025,7 +1176,7 @@ issues.content_history.edited = редактирано
pulls.title_desc_one = иска да слее %[1]d подаване от <code>%[2]s</code> в <code id="%[4]s">%[3]s</code>
pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s
pulls.merged_title_desc_one = сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s
pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане.
pulls.no_merge_access = Не сте упълномощени да слеете тази заявка за сливане.
activity.navbar.code_frequency = Честота на промените
activity.git_stats_pushed_1 = е изтласкал
activity.git_stats_push_to_branch = към %s и
@ -1139,7 +1290,7 @@ issues.review.review = Рецензия
issues.review.comment = рецензира %s
branch.deleted_by = Изтрит от %s
branch.restore = Възстановяване на клона „%s“
archive.title_date = Това хранилище е архивирано на %s. Можете да преглеждате файлове и да го клонирате, но не можете да изтласквате или отваряте задачи или заявки за сливане.
archive.title_date = Това хранилище е архивирано на %s. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари.
release.download_count_one = %s изтегляне
release.download_count_few = %s изтегляния
branch.restore_success = Клонът „%s“ е възстановен.
@ -1156,7 +1307,7 @@ pulls.reopen_to_merge = Моля, отворете наново тази зая
pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит.
pulls.status_checks_hide_all = Скриване на всички проверки
pulls.status_checks_failure = Някои проверки са неуспешни
issues.review.add_review_request = поиска рецензия от %s %s
issues.review.add_review_request = поиска рецензия от %[1]s %[2]s
wiki.no_search_results = Няма резултати
wiki.search = Търсене в уикито
issues.author.tooltip.pr = Този потребител е авторът на тази заявка за сливане.
@ -1290,6 +1441,140 @@ issues.reaction.alt_few = %[1]s реагира с %[2]s.
issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s.
issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара.
issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара.
already_forked = Вече сте разклонили %s
generated_from = генерирано от
clear_ref = `Изчистване на текущата препратка`
file_follow = Последване на символната връзка
commitstatus.failure = Неуспех
issues.filter_label_exclude = `Използвайте <code>alt</code> + <code>click/enter</code>, за да изключите етикети`
migrate.migrating_failed = Мигрирането от <b>%s</b> е неуспешно.
migrate.migrating_issues = Мигриране на задачи
mirror_from = огледално на
fork_from_self = Не можете да разклоните хранилище, което притежавате.
commit_graph.hide_pr_refs = Скриване на заявките за сливане
generated = Генерирано
broken_message = Git данните, лежащи в основата на това хранилище, не могат да бъдат прочетени. Свържете се с администратора на тази инстанция или изтрийте това хранилище.
editor.file_is_a_symlink = `„%s“ е символна връзка. Символните връзки не могат да се редактират в уеб редактора`
commits.browse_further = Разглеждане нататък
commits.older = По-стари
form.reach_limit_of_creation_n = Притежателят вече е достигнал лимита от %d хранилища.
issues.edit.already_changed = Неуспешно запазване на промените в задачата. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
transfer.accept_desc = Прехвърляне към „%s“
archive.title = Това хранилище е архивирано. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари.
form.reach_limit_of_creation_1 = Притежателят вече е достигнал лимита от %d хранилище.
editor.patching = Прилагане на кръпка:
editor.fail_to_apply_patch = Неуспешно прилагане на кръпка „%s“
commits.no_commits = Няма общи подавания. „%s“ и „%s“ имат напълно различни истории.
migrate.migrating_pulls = Мигриране на заявки за сливане
migrate.migrating_topics = Мигриране на теми
projects.desc = Управлявайте задачи и заявки за сливане в проектни табла.
issues.choose.invalid_templates = %v невалидни шаблона са намерени
pulls.edit.already_changed = Неуспешно запазване на промените в заявката за сливане. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
migrate.gitbucket.description = Мигриране на данни от GitBucket инстанции.
migrate.migrating_git = Мигриране на Git данни
commits.newer = По-нови
issues.choose.blank_about = Създаване на задача от стандартен шаблон.
issues.filter_no_results = Няма резултати
issues.filter_no_results_placeholder = Опитайте да коригирате филтрите си за търсене.
archive.nocomment = Коментирането не е възможно, тъй като хранилището е архивирано.
migrate.gitlab.description = Мигриране на данни от gitlab.com или други GitLab инстанции.
transfer.no_permission_to_accept = Нямате разрешение да приемете това прехвърляне.
transfer.no_permission_to_reject = Нямате разрешение да отхвърлите това прехвърляне.
editor.file_changed_while_editing = Съдържанието на файла е променено, откакто сте го отворили. <a target="_blank" rel="noopener noreferrer" href="%s">Щракнете тук</a>, за да го видите, или <strong>Подайте промените отново</strong>, за да ги презапишете.
sync_fork.button = Синхронизиране
migrate.onedev.description = Мигриране на данни от code.onedev.io или други OneDev инстанции.
migrate.codebase.description = Мигриране на данни от codebasehq.com.
migrate.migrating_labels = Мигриране на етикети
migrate.migrating_releases = Мигриране на издания
editor.push_rejected_no_message = Промяната беше отхвърлена от сървъра без съобщение. Моля, проверете Git куките.
issues.choose.open_external_link = Отваряне
comments.edit.already_changed = Неуспешно запазване на промените в коментара. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
commits.nothing_to_compare = Тези клонове са равни.
transfer.reject_desc = Отказ от прехвърляне към „%s“
subscribe.pull.guest.tooltip = Влезте, за да се абонирате за тази заявка за сливане.
commit.contained_in_default_branch = Това подаване е част от стандартния клон
normal_view = Нормален изглед
issues.context.menu = Меню за коментара
form.name_reserved = Името на хранилището „%s“ е резервирано.
need_auth = Упълномощаване
subscribe.issue.guest.tooltip = Влезте, за да се абонирате за тази задача.
commitstatus.pending = В очакване
commitstatus.success = Успех
editor.cannot_commit_to_protected_branch = Не може да се подава в защитения клон „%s“.
editor.no_commit_to_branch = Не може да се подава директно в клона, защото:
editor.push_rejected = Промяната беше отхвърлена от сървъра. Моля, проверете Git куките.
cite_this_repo = Цитиране на това хранилище
migrate.gitea.description = Мигриране на данни от gitea.com или други Gitea инстанции.
editor.push_rejected_summary = Пълно съобщение на отхвърлянето:
sync_fork.branch_behind_one = Този клон е %[1]d подаване зад %[2]s
sync_fork.branch_behind_few = Този клон е %[1]d подавания зад %[2]s
form.string_too_long = Даденият низ е по-дълъг от %d знака.
editor.commit_id_not_matching = Файлът е променен, докато сте го редактирали. Подайте в нов клон и след това слейте.
editor.user_no_push_to_branch = Потребителят не може да изтласква в клона
archive.pull.noreview = Това хранилище е архивирано. Не можете да рецензирате заявки за сливане.
migrate.migrating_failed.error = Неуспешно мигриране: %s
migrate.github.description = Мигриране на данни от github.com или GitHub Enterprise сървър.
migrate.forgejo.description = Мигриране на данни от codeberg.org или други Forgejo инстанции.
migrate.gogs.description = Мигриране на данни от notabug.org или други Gogs инстанции.
migrate.migrating_milestones = Мигриране на етапи
migrate.failed = Мигрирането е неуспешно: %v
pulls.nothing_to_compare_and_allow_empty_pr = Тези клонове са равни. Тази заявка за сливане ще бъде празна.
pulls.has_pull_request = `Вече съществува заявка за сливане между тези клонове: <a href="%[1]s">%[2]s#%[3]d</a>`
pulls.is_checking = Проверката за конфликти при сливане е в ход. Опитайте отново след няколко минути.
pulls.cannot_merge_work_in_progress = Тази заявка за сливане е отбелязана като в процес на работа.
pulls.blocked_by_approvals = Тази заявка за сливане все още няма достатъчно одобрения. Дадени са %d от %d одобрения.
pulls.blocked_by_rejection = Тази заявка за сливане има поискани промени от официален рецензент.
pulls.waiting_count_1 = %d чакаща рецензия
pulls.status_checks_requested = Задължително
pulls.update_branch_success = Обновяването на клона е успешно
pulls.cannot_auto_merge_helper = Слейте ръчно, за да разрешите конфликтите.
migrate.clone_address_desc = HTTP(S) или Git „clone“ URL на съществуващо хранилище
pulls.add_prefix = Добавете префикс <strong>%s</strong>
pulls.merge_pull_request = Създаване на подаване със сливане
pulls.waiting_count_n = %d чакащи рецензии
pulls.is_ancestor = Този клон вече е включен в целевия клон. Няма какво да се слива.
pulls.required_status_check_missing = Някои задължителни проверки липсват.
pulls.change_target_branch_at = `промени целевия клон от <b>%s</b> на <b>%s</b> %s`
issues.time_spent_total = Общо изразходвано време
issues.del_time_history = `изтри изразходваното време %s`
pulls.nothing_to_compare_have_tag = Избраните клон/маркер са равни.
pulls.cannot_auto_merge_desc = Тази заявка за сливане не може да бъде слята автоматично поради конфликти.
issues.tracker_auto_close = Таймерът ще бъде спрян автоматично, когато тази задача бъде затворена
issues.force_push_codes = `изтласка принудително %[1]s от <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> към <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
pulls.blocked_by_official_review_requests = Тази заявка за сливане е блокирана, защото липсва одобрение от един или повече официални рецензенти.
issues.tracker = Проследяване на времето
issues.add_time_history = `добави изразходвано време %s`
migrate.repo_desc_helper = Оставете празно, за да внесете съществуващото описание
migrate.git.description = Мигриране само на хранилище от всяка Git услуга.
mirror_sync = синхронизирано
migrate_repo = Мигриране на хранилище
migrate_options = Опции за мигрирането
editor.fork_before_edit = Трябва да разклоните това хранилище, за да направите или предложите промени в този файл.
editor.must_have_write_access = Трябва да имате право на запис, за да правите или предлагате промени в този файл.
editor.new_branch_name = Дайте име на новия клон за това подаване
editor.invalid_commit_mail = Невалидна ел. поща за създаване на подаване.
pulls.required_status_check_failed = Някои задължителни проверки не са успешни.
issues.time_spent_from_all_authors = `Общо изразходвано време: %s`
issues.attachment.download = `Щракнете, за да изтеглите „%s“`
issues.attachment.open_tab = `Щракнете, за да видите „%s“ в нов раздел`
pulls.update_branch = Обновяване на клона чрез сливане
migrate_items = Елементи за мигриране
commit.load_referencing_branches_and_tags = Зареждане на клонове и маркери, препращащи към това подаване
pulls.files_conflicted = Тази заявка за сливане има промени, които са в конфликт с целевия клон.
pulls.still_in_progress = Все още е в процес на работа?
pulls.ready_for_review = Готово е за рецензиране?
pulls.is_empty = Промените в този клон вече са в целевия клон. Това ще бъде празно подаване.
issues.start_tracking = Започване на проследяване на времето
migrate_options_mirror_helper = Това хранилище ще бъде огледално
migrate_options_lfs = Мигриране на LFS файлове
editor.upload_file_is_locked = Файлът „%s“ е заключен от %s.
issues.tracking_already_started = `Вече сте започнали проследяване на времето по <a href="%s">друга задача</a>!`
pulls.remove_prefix = Премахнете префикса <strong>%s</strong>
author_search_tooltip = Показва максимум 30 потребители
migrate.migrating_failed_no_addr = Мигрирането е неуспешно.
issues.force_push_compare = Сравняване
pulls.status_checking = Някои проверки са в очакване
pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане.
[modal]
confirm = Потвърждаване
@ -1319,6 +1604,11 @@ table_modal.placeholder.content = Съдържание
table_modal.placeholder.header = Заглавка
buttons.new_table.tooltip = Добавяне на таблица
table_modal.header = Добавяне на таблица
link_modal.description = Описание
link_modal.header = Добавяне на връзка
buttons.indent.tooltip = Вмъкване на елементи с едно ниво
buttons.unindent.tooltip = Изваждане на елементи с едно ниво
link_modal.paste_reminder = Подсказка: С URL адрес в клипборда можете да поставите директно в редактора, за да създадете връзка.
[org]
teams.write_access = Писане
@ -1393,11 +1683,12 @@ members.private_helper = Да е видим
teams.no_desc = Този екип няма описание
settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване?
open_dashboard = Отваряне на таблото
settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име.
[install]
admin_password = Парола
user = Потребителско име
admin_email = Адрес на ел. поща
admin_email = Адрес за ел. поща
path = Път
password = Парола
host = Хост
@ -1427,13 +1718,17 @@ admin_title = Настройки на администраторския ака
err_empty_admin_password = Администраторската парола не може да бъде празна.
docker_helper = Ако стартирате Forgejo в Docker, моля, прочетете <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a> преди да промените настройки.
sqlite_helper = Път на файла за SQLite3 базата данни.<br>Въведете абсолютен път, ако стартирате Forgejo като service.
err_empty_admin_email = Администраторският адрес на ел. поща не може да бъде празен.
err_empty_admin_email = Администраторският адрес за ел. поща не може да бъде празен.
password_algorithm = Алгоритъм за хеш. на паролите
default_keep_email_private = Скриване на адресите на ел. поща по подразбиране
default_keep_email_private = Скриване на адресите за ел. поща по подразбиране
invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите
err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано
err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон
err_admin_name_is_invalid = Потребителското име на администратора е невалидно
db_schema_helper = Оставете празно за схемата по подразбиране на базата данни („public“).
reinstall_error = Опитвате се да инсталирате върху съществуваща Forgejo база данни
reinstall_confirm_message = Преинсталирането със съществуваща Forgejo база данни може да причини множество проблеми. В повечето случаи трябва да използвате съществуващия си „app.ini“, за да стартирате Forgejo. Ако знаете какво правите, потвърдете следното:
app_slogan = Слоган на инстанцията
[filter]
string.asc = А - Я
@ -1462,8 +1757,8 @@ link_not_working_do_paste = Ако връзката не работи, опит
activate_account = Моля, активирайте своя акаунт
admin.new_user.subject = Нов потребител %s току-що се регистрира
activate_account.text_1 = Здравейте, <b>%[1]s</b>, благодарим ви за регистрацията в %[2]s!
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на <b>%s</b>:
activate_email = Потвърдете своя адрес на ел. поща
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес за ел. поща в рамките на <b>%s</b>:
activate_email = Потвърдете своя адрес за ел. поща
activate_account.text_2 = Моля, щракнете върху следната връзка, за да активирате своя акаунт в рамките на <b>%s</b>:
issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s.
issue.action.push_n = <b>@%[1]s</b> изтласка %[3]d подавания към %[2]s
@ -1473,6 +1768,28 @@ issue.action.merge = <b>@%[1]s</b> сля #%[2]d в %[3]s.
issue_assigned.pull = @%[1]s ви възложи заявката за сливане %[2]s в хранилище %[3]s.
issue.action.ready_for_review = <b>@%[1]s</b> отбеляза тази заявка за сливане като готова за рецензиране.
repo.transfer.subject_to = %s иска да прехвърли хранилище "%s" към %s
password_change.subject = Вашата парола е променена
admin.new_user.text = Моля, <a href="%s">щракнете тук</a>, за да управлявате този потребител от администраторския панел.
password_change.text_1 = Паролата за вашия акаунт току-що беше променена.
reset_password = Възстановете своя акаунт
account_security_caution.text_1 = Ако това сте били вие, можете спокойно да игнорирате това ел. писмо.
issue.action.force_push = <b>%[1]s</b> изтласка принудително <b>%[2]s</b> от %[3]s към %[4]s.
team_invite.text_3 = Бележка: Тази покана е предназначена за %[1]s. Ако не сте очаквали тази покана, можете да игнорирате това ел. писмо.
view_it_on = Вижте го на %s
register_notify.text_1 = това е ел. писмо за потвърждение на вашата регистрация в %s!
register_notify.text_2 = Можете да влезете в акаунта си с потребителско име: %s
register_notify.text_3 = Ако някой друг е създал този акаунт за вас, първо ще трябва да <a href="%s">зададете парола</a>.
repo.collaborator.added.subject = %s ви добави към %s като сътрудник
primary_mail_change.text_1 = Основният адрес за ел. поща на вашия акаунт току-що беше променен на %[1]s. Това означава, че този адрес за ел. поща повече няма да получава известия по ел. поща за вашия акаунт.
team_invite.text_2 = Моля, щракнете върху следната връзка, за да се присъедините към екипа:
repo.transfer.body = За да го приемете или отхвърлите, посетете %s или просто го игнорирайте.
repo.collaborator.added.text = Бяхте добавени като сътрудник в хранилище:
team_invite.subject = %[1]s ви покани да се присъедините към организацията %[2]s
team_invite.text_1 = %[1]s ви покани да се присъедините към екип %[2]s в организация %[3]s.
reply = или отговорете директно на това ел. писмо
reset_password.text = Ако това сте вие, моля, щракнете върху следната връзка, за да възстановите акаунта си в рамките на <b>%s</b>:
primary_mail_change.subject = Основният ви адрес за ел. поща е променен
account_security_caution.text_2 = Ако това не сте били вие, акаунтът ви е компрометиран. Моля, свържете се с администраторите на този сайт.
[user]
joined_on = Присъединени на %s
@ -1493,7 +1810,7 @@ follow = Последване
followers_few = %d последователи
block_user = Блокиране на потребителя
change_avatar = Променете профилната си снимка…
email_visibility.limited = Вашият адрес на ел. поща е видим за всички удостоверени потребители
email_visibility.limited = Вашият адрес за ел. поща е видим за всички удостоверени потребители
disabled_public_activity = Този потребител е изключил публичната видимост на дейността.
email_visibility.private = Вашият адрес на ел. поща е видим само за вас и администраторите
show_on_map = Показване на това място на картата
@ -1507,6 +1824,15 @@ public_activity.visibility_hint.self_public = Вашата дейност е в
form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
form.name_reserved = Потребителското име "%s" е резервирано.
public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. <a href="%s">Конфигуриране</a>.
block_user.detail = Моля, имайте предвид, че блокирането на потребител има и други ефекти, като например:
block_user.detail_2 = Този потребител няма да може да взаимодейства с хранилищата, които притежавате, или със задачите и коментарите, които сте създали.
block_user.detail_3 = Няма да можете да се добавяте един друг като сътрудници на хранилище.
public_activity.visibility_hint.self_private = Вашата дейност е видима само за вас и администраторите на инстанцията. <a href="%s">Конфигуриране</a>.
form.name_chars_not_allowed = Потребителското име „%s“ съдържа невалидни знаци.
public_activity.visibility_hint.admin_private = Тази дейност е видима за вас, защото сте администратор, но потребителят иска тя да остане частна.
public_activity.visibility_hint.admin_public = Тази дейност е видима за всички, но като администратор можете да виждате и взаимодействия в частни пространства.
follow_blocked_user = Не можете да последвате този потребител, защото сте го блокирали или той ви е блокирал.
block_user.detail_1 = Ще спрете да се следвате един друг и няма да можете да се последвате отново.
[home]
filter = Други филтри
@ -1530,6 +1856,7 @@ view_home = Преглед на %s
collaborative_repos = Съвместни хранилища
switch_dashboard_context = Превключване на контекста на таблото
show_only_public = Показване само на публични
filter_by_team_repositories = Филтриране по хранилища на екипа
[admin]
packages.version = Версия
@ -1587,7 +1914,7 @@ config.server_config = Сървърна конфигурация
packages.size = Размер
settings = Админ. настройки
users = Потребителски акаунти
emails.duplicate_active = Този адрес на ел. поща вече е активен за друг потребител.
emails.duplicate_active = Този адрес за ел. поща вече е активен за друг потребител.
config.app_ver = Forgejo версия
config.custom_conf = Път на конфигурационния файл
config.git_version = Git версия
@ -1606,16 +1933,20 @@ users.details = Потребителски данни
packages.total_size = Общ размер: %s
dashboard.new_version_hint = Forgejo %s вече е наличен, вие изпълнявате %s. Проверете <a target="_blank" rel="noreferrer" href="%s">блога</a> за повече подробности.
total = Общо: %d
config.db_type = Тип
monitor.queue.type = Тип
notices.type = Тип
[error]
not_found = Целта не може да бъде намерена.
report_message = Ако смятате, че това е грешка на Forgejo, моля, потърсете в задачите на <a href="%s" target="_blank">Codeberg</a> или отворете нова задача, ако е необходимо.
network_error = Мрежова грешка
occurred = Възникна грешка
server_internal = Вътрешна грешка на сървъра
[form]
UserName = Потребителско име
Email = Адрес на ел. поща
Email = Адрес за ел. поща
Password = Парола
RepoName = Име на хранилището
username_been_taken = Потребителското име вече е заето.
@ -1633,8 +1964,8 @@ url_error = `„%s“ не е валиден URL.`
Content = Съдържание
team_not_exist = Екипът не съществува.
TeamName = Име на екипа
email_error = ` не е валиден адрес на ел. поща.`
email_invalid = Адресът на ел. поща е невалиден.
email_error = ` не е валиден адрес за ел. поща.`
email_invalid = Адресът за ел. поща е невалиден.
SSHTitle = Име на SSH ключ
repo_name_been_taken = Името на хранилището вече е използвано.
team_name_been_taken = Името на екипа вече е заето.
@ -1647,6 +1978,44 @@ Pronouns = Местоимения
Biography = Биография
Website = Уебсайт
Location = Местоположение
cannot_add_org_to_team = Организация не може да бъде добавена като член на екип.
auth_failed = Неуспешно удостоверяване: %v
team_no_units_error = Разрешете достъп до поне една секция на хранилището.
password_uppercase_one = Поне един голям знак
CommitSummary = Обобщение на подаването
username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
duplicate_invite_to_team = Потребителят вече е поканен като член на екипа.
must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ.
org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте.
admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии.
To = Име на клон
CommitMessage = Съобщение на подаването
include_error = ` трябва да съдържа подниз „%s“.`
alpha_dash_error = ` трябва да съдържа само буквено-цифрови знаци, тире („-“) и долна черта („_“).`
alpha_dash_dot_error = ` трябва да съдържа само буквено-цифрови знаци, тире („-“), долна черта („_“) и точка („.“).`
size_error = ` трябва да е с размер %s.`
min_size_error = ` трябва да съдържа поне %s знака.`
max_size_error = ` трябва да съдържа най-много %s знака.`
invalid_group_team_map_error = ` съпоставянето е невалидно: %s`
password_complexity = Паролата не отговаря на изискванията за сложност:
password_lowercase_one = Поне един малък знак
password_digit_one = Поне една цифра
password_special_one = Поне един специален знак (препинателни знаци, скоби, кавички и др.)
enterred_invalid_repo_name = Името на хранилището, което въведохте, е неправилно.
enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно.
enterred_invalid_password = Паролата, която въведохте, е неправилна.
organization_leave_success = Успешно напуснахте организацията %s.
still_has_org = Вашият акаунт е член на една или повече организации, първо ги напуснете.
org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете.
target_branch_not_exist = Целевият клон не съществува.
glob_pattern_error = ` glob шаблонът е невалиден: %s.`
openid_been_used = OpenID адресът „%s“ вече е използван.
unknown_error = Неизвестна грешка:
TreeName = Път до файла
AdminEmail = Администраторски адрес за ел. поща
email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя <b>%s</b> е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща.
email_been_used = Адресът за ел. поща вече се използва.
[action]
close_issue = `затвори задача <a href="%[1]s">%[3]s#%[2]s</a>`
@ -1709,11 +2078,38 @@ sign_up_button = Регистрирайте се.
back_to_sign_in = Назад към Вход
sign_in_openid = Продължаване с OpenID
send_reset_mail = Изпращане на ел. писмо за възстановяване
authorize_application = Упълномощаване на приложение
password_pwned_err = Неуспешно завършване на заявката към HaveIBeenPwned
last_admin = Не можете да премахнете последния администратор. Трябва да има поне един администратор.
allow_password_change = Изискване потребителят да смени паролата си (препоръчително)
authorize_title = Упълномощавате ли „%s“ да има достъп до вашия акаунт?
reset_password_mail_sent_prompt = Изпратено е ел. писмо за потвърждение до <b>%s</b>. За да завършите процеса по възстановяване на акаунта, моля, проверете входящата си поща и последвайте предоставената връзка в рамките на следващите %s.
reset_password_wrong_user = Вие сте влезли като %s, но връзката за възстановяване на акаунта е предназначена за %s
authorize_redirect_notice = Ще бъдете пренасочени към %s, ако упълномощите това приложение.
authorize_application_description = Ако предоставите достъп, то ще може да осъществява достъп и да записва цялата информация за вашия акаунт, включително частни хранилища и организации.
twofa_scratch_used = Използвали сте своя резервен код. Пренасочени сте към страницата с настройки за двуфакторно удостоверяване, за да можете да премахнете регистрацията на устройството си или да генерирате нов резервен код.
reset_password_helper = Възстановяване на акаунт
invalid_password = Вашата парола не съвпада с паролата, използвана за създаване на акаунта.
invalid_code = Вашият код за потвърждение е невалиден или е изтекъл.
invalid_code_forgot_password = Вашият код за потвърждение е невалиден или е изтекъл. Щракнете <a href="%s">тук</a>, за да започнете нова сесия.
scratch_code = Резервен код
use_scratch_code = Използвайте резервен код
use_onetime_code = Използвайте еднократен код
twofa_scratch_token_incorrect = Вашият резервен код е неправилен.
authorize_application_created_by = Това приложение е създадено от %s.
authorization_failed = Неуспешно упълномощаване
resent_limit_prompt = Вече сте поискали ел. писмо за активация наскоро. Моля, изчакайте 3 минути и опитайте отново.
has_unconfirmed_mail = Здравейте, %s, имате непотвърден адрес за ел. поща (<b>%s</b>). Ако не сте получили ел. писмо за потвърждение или трябва да изпратите ново, моля, щракнете върху бутона по-долу.
change_unconfirmed_email_error = Неуспешна промяна на адреса за ел. поща: %v
resend_mail = Щракнете тук, за повторно изпращане на ел. писмо за активация
change_unconfirmed_email_summary = Промяна на адреса, на който се изпраща ел. писмо за активация.
change_unconfirmed_email = Ако сте въвели грешен адрес за ел. поща по време на регистрацията, можете да го промените по-долу и потвърждение ще бъде изпратено на новия адрес.
[aria]
footer.software = Относно този софтуер
footer.links = Връзки
footer = Долен колонтитул
navbar = Навигационна лента
[startpage]
install = Лесен за инсталиране
@ -1780,6 +2176,7 @@ runs.no_workflows.help_no_write_access = За да научите повече
variables.management = Управление на променливи
variables.not_found = Променливата не е открита.
variables.id_not_exist = Променлива с идентификатор %d не съществува.
runners.owner_type = Тип
[heatmap]
less = По-малко
@ -1809,9 +2206,10 @@ invalid_input_type = Не можете да качвате файлове от
component_loading_failed = Неуспешно зареждане на %s
contributors.what = приноси
recent_commits.what = скорошни подавания
component_loading = Зареждане на %s...
component_loading = Зареждане на %s
component_loading_info = Това може да отнеме известно време…
code_frequency.what = честота на промените
component_failed_to_load = Възникна неочаквана грешка.
[projects]
type-1.display_name = Индивидуален проект
@ -1820,20 +2218,29 @@ deleted.display_name = Изтрит проект
[search]
no_results = Няма намерени съответстващи резултати.
team_kind = Търсене на екипи...
repo_kind = Търсене на хранилища...
org_kind = Търсене на организации...
user_kind = Търсене на потребители...
code_kind = Търсене на код...
commit_kind = Търсене на подавания...
project_kind = Търсене на проекти...
package_kind = Търсене на пакети...
search = Търсене...
branch_kind = Търсене на клонове...
pull_kind = Търсене на заявки за сливане...
issue_kind = Търсене на задачи...
team_kind = Търсене на екипи
repo_kind = Търсене на хранилища
org_kind = Търсене на организации
user_kind = Търсене на потребители
code_kind = Търсене на код
commit_kind = Търсене на подавания
project_kind = Търсене на проекти
package_kind = Търсене на пакети
search = Търсене
branch_kind = Търсене на клонове
pull_kind = Търсене на заявки за сливане
issue_kind = Търсене на задачи
fuzzy = Приблизително
exact = Прецизно
regexp = Регекс
regexp_tooltip = Третиране на термина за търсене като регулярен израз
fuzzy_tooltip = Включване на резултати, които също съвпадат приблизително с термина за търсене
exact_tooltip = Включване само на резултати, които съвпадат точно с термина за търсене
code_search_unavailable = Търсенето на код в момента не е достъпно. Моля, свържете се с администратора на сайта.
keyword_search_unavailable = Търсенето по ключова дума в момента не е достъпно. Моля, свържете се с администратора на сайта.
union_tooltip = Включване на резултати, които съвпадат с някоя от ключовите думи, разделени с интервал
union = Обединение
type_tooltip = Тип търсене
[markup]
filepreview.lines = Редове от %[1]d до %[2]d в %[3]s

View file

@ -493,11 +493,11 @@ use_onetime_code = Použít jednorázový kód
view_it_on=Zobrazit na %s
reply=nebo přímo odpovědět na tento e-mail
link_not_working_do_paste=Odkaz nefunguje? Zkuste jej zkopírovat a vložit do adresního řádku svého prohlížeče.
hi_user_x=Ahoj <b>%s</b>,
hi_user_x=Dobrý den, uživateli <b>%s</b>,
activate_account=Prosíme, aktivujte si váš účet
activate_account.title=%s, prosím aktivujte si váš účet
activate_account.text_1=Ahoj <b>%[1]s</b>, děkujeme za registraci na %[2]s!
activate_account.text_1=Dobrý den, uživateli <b>%[1]s</b>, děkujeme za registraci ve službě %[2]s!
activate_account.text_2=Pro aktivaci vašeho účtu klikněte <b>%s</b> na následující odkaz :
activate_email=Ověřte vaši e-mailovou adresu
@ -932,7 +932,7 @@ generate_new_token=Vygenerovat nový token
tokens_desc=Tyto tokeny umožňují přístup k vašemu účtu pomocí Forgejo API.
token_name=Název tokenu
generate_token=Vygenerovat token
generate_token_success=Nový token byl vygenerován. Zkopírujte jej nyní, jelikož již nebude znovu zobrazen.
generate_token_success=Nový token byl vygenerován. Zkopírujte si jej nyní, jelikož již nebude znovu zobrazen.
generate_token_name_duplicate=<strong>%s</strong> byl již použit jako název aplikace. Použijte prosím nový.
delete_token=Smazat
access_token_deletion=Odstranit přístupový token

View file

@ -2917,6 +2917,13 @@ comment.blocked_by_user = Kommentieren ist nicht möglich, da du vom Repository-
sync_fork.branch_behind_one = Dieser Branch ist %[1]d Commit hinter %[2]s
sync_fork.branch_behind_few = Dieser Branch ist %[1]d Commits hinter %[2]s
sync_fork.button = Sync
settings.event_action_failure_desc = Action-Run endete im Fehlschlag.
settings.event_action_success_desc = Action-Run war erfolgreich.
settings.event_action_failure = Fehlschlag
settings.event_action_success = Erfolg
settings.event_header_action = Action-Run-Ereignisse
settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist.
settings.event_action_recover = Wiederherstellen
[graphs]
component_loading_failed = Konnte %s nicht laden

View file

@ -2773,6 +2773,10 @@ comment.blocked_by_user = Hindi posible ang pagkomento dahil hinarang ka ng may-
sync_fork.button = I-sync
sync_fork.branch_behind_one = Ang branch na ito ay %[1]d commit sa likod ng %[2]s
sync_fork.branch_behind_few = Ang branch na ito ay %[1]d mga commit sa likod ng %[2]s
settings.event_header_action = Mga event sa run ng aksyon
settings.event_action_failure = Pagkabigo
settings.event_action_failure_desc = Natapos ang action run bilang pagkabigo.
settings.event_action_recover = I-recover
[search]
commit_kind = Maghanap ng mga commit…

View file

@ -9,7 +9,7 @@ sign_in_with_provider=Se connecter avec %s
sign_in_or=ou
sign_out=Déconnexion
sign_up=S'inscrire
link_account=Lier un Compte
link_account=Lier un compte
register=S'inscrire
version=Version
powered_by=Propulsé par %s
@ -1516,7 +1516,7 @@ issues.desc=Organiser les rapports de bug, les tâches et les jalons.
issues.filter_assignees=Filtrer par assignation
issues.filter_milestones=Filtrer le jalon
issues.filter_projects=Filtrer par projet
issues.filter_labels=Filtrer par labels
issues.filter_labels=Filtrer par étiquettes
issues.filter_reviewers=Filtrer par évaluateur
issues.new=Nouveau ticket
issues.new.title_empty=Le titre ne peut pas être vide
@ -4090,4 +4090,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 l'interface de Forgejo 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 doux 100 % de complétion. :-)
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo 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

@ -2913,6 +2913,13 @@ comment.blocked_by_user = Piebilžu pievienošana nav iespējama, jo glabātavas
sync_fork.branch_behind_one = Šis zars ir %[1]d iesūtījumu aiz %[2]s
sync_fork.button = Sinhronizēt
sync_fork.branch_behind_few = Šis zars ir %[1]d iesūtījumus aiz %[2]s
settings.event_action_failure = Kļūme
settings.event_action_failure_desc = Darbības izpilde beidzās ar kļūmi.
settings.event_header_action = Darbības izpildes notikumi
settings.event_action_recover = Atgūt
settings.event_action_recover_desc = Darbības izpilde bija sekmīga pēc kļūmes iepriekšējā darbības izpildē tajā pašā darbplūsmā.
settings.event_action_success = Sekmīgi
settings.event_action_success_desc = Darbības izpilde bija sekmīga.
[graphs]
component_loading=Ielādē %s…

View file

@ -2913,6 +2913,13 @@ comment.blocked_by_user = Não é possível comentar pois você foi bloqueado pe
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.button = Sincronizar
settings.event_header_action = Eventos de execução de Actions
settings.event_action_failure = Falha
settings.event_action_failure_desc = Execução da Action terminou com falha.
settings.event_action_recover = Recuperar
settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado.
settings.event_action_success = Sucesso
settings.event_action_success_desc = A execução da Action foi bem sucedida.
[graphs]
component_loading = Carregando %s…

View file

@ -31,7 +31,7 @@ username=Nome de utilizador
email=Endereço de email
password=Senha
access_token=Código de acesso
re_type=Confirme a senha
re_type=Confirme a palavra-passe
captcha=CAPTCHA
twofa=Autenticação com dois passos
twofa_scratch=Código de uso único em dois passos
@ -2915,6 +2915,13 @@ comment.blocked_by_user = Não é possível comentar porque está bloqueado pelo
sync_fork.branch_behind_few = Este ramo está %[1]d cometimentos atrás de %[2]s
sync_fork.button = Sincronizar
sync_fork.branch_behind_one = Este ramo está %[1]d cometimento atrás de %[2]s
settings.event_action_failure = Falha
settings.event_action_failure_desc = A execução da ação terminou com falha.
settings.event_action_recover = Recuperar
settings.event_header_action = Eventos da execução de ações
settings.event_action_recover_desc = A execução de ação foi bem sucedida depois da última execução de ação na mesma sequência de trabalho ter falhado.
settings.event_action_success = Sucesso
settings.event_action_success_desc = A Execução de ação foi bem sucedida.
[graphs]
component_loading=A carregar %s…

View file

@ -1450,7 +1450,7 @@ commit.cherry-pick-content=Выбрать ветвь для переноса:
commitstatus.error=Ошибка
commitstatus.failure=Неудача
commitstatus.pending=Ожидание
commitstatus.success=Успешно
commitstatus.success=Успех
ext_issues=Внешние задачи
ext_issues.desc=Ссылка на внешнюю систему отслеживания задач.
@ -2916,6 +2916,13 @@ comment.blocked_by_user = Комментирование невозможно,
sync_fork.branch_behind_few = Эта ветвь отстаёт от %[2]s на %[1]d коммитов
sync_fork.button = Синхронизировать
sync_fork.branch_behind_one = Эта ветвь отстаёт от %[2]s на %[1]d коммит
settings.event_header_action = События выполнений Действий
settings.event_action_failure = Неудача
settings.event_action_failure_desc = Выполнение завершилось неудачно.
settings.event_action_recover = Восстановлен
settings.event_action_recover_desc = После неудачи повторное выполнение рабочего потока было успешно.
settings.event_action_success = Успех
settings.event_action_success_desc = Выполнение завершилось успешно.
[graphs]
component_loading_failed = Не удалось загрузить %s
@ -3914,10 +3921,10 @@ unit.desc=Управление встроенными конвейерами CI/
status.unknown=Неизвестно
status.waiting=Ожидает
status.running=Запущено
status.success=Успешно
status.success=Успех
status.failure=Неудача
status.cancelled=Отменено
status.skipped=Пропущено
status.skipped=Пропущен
status.blocked=Заблокировано
runners=Исполнители
@ -3938,7 +3945,7 @@ runners.task_list.run=Запуск
runners.task_list.status=Состояние
runners.task_list.repository=Репозиторий
runners.task_list.commit=Коммит
runners.task_list.done_at=Время завершения
runners.task_list.done_at=Завершено
runners.edit_runner=Изменить исполнитель
runners.update_runner=Обновить изменения
runners.update_runner_success=Исполнитель успешно обновлён
@ -3960,7 +3967,7 @@ runners.reset_registration_token_success=Токен регистрации ис
runs.all_workflows=Все рабочие потоки
runs.commit=коммит
runs.scheduled=Запланировано
runs.pushed_by=отправлено
runs.pushed_by=отправлен
runs.invalid_workflow_helper=Файл конфигурации рабочего потока некорректен. Пожалуйста, проверьте конфигурационный файл: %s
runs.actor=Автор
runs.status=Состояние

View file

@ -2856,12 +2856,12 @@ dashboard.current_memory_usage=Поточне використання пам'я
dashboard.total_memory_allocated=Виділено пам'яті загалом
dashboard.memory_obtained=Отримано пам'яті
dashboard.pointer_lookup_times=Пошуків вказівника
dashboard.memory_allocate_times=Виділення пам'яті
dashboard.memory_allocate_times=Виділень пам'яті
dashboard.memory_free_times=Звільнень пам'яті
dashboard.current_heap_usage=Поточне використання динамічної пам'яті
dashboard.heap_memory_obtained=Отримано динамічної пам'яті
dashboard.heap_memory_idle=Не використовується динамічною пам'яттю
dashboard.heap_memory_in_use=Використовується динамічною пам'яттю
dashboard.heap_memory_idle=Динамічної пам'яті простоює
dashboard.heap_memory_in_use=Динамічної пам'яті використовується
dashboard.heap_memory_released=Звільнено динамічної пам'яті
dashboard.heap_objects=Об'єктів динамічної пам'яті
dashboard.bootstrap_stack_usage=Використання стеку Bootstrap
@ -3625,6 +3625,8 @@ runners.runner_title = Ранер
runners.task_list = Нещодавні завдання ранера
runners.update_runner_success = Ранер оновлено
runners.delete_runner_header = Підтвердіть видалення ранера
runners.status.offline = Неактивний
runners.status.idle = Простоює

View file

@ -2915,6 +2915,13 @@ comment.blocked_by_user = 您无法评论,因为您已被仓库所有者或作
sync_fork.button = 同步
sync_fork.branch_behind_one = 此分支落后于 %[2]s %[1]d 个提交
sync_fork.branch_behind_few = 此分支落后于 %[2]s %[1]d 个提交
settings.event_action_failure = 失败
settings.event_action_recover = 恢复
settings.event_action_recover_desc = Action运行在同一工作流上次失败后成功。
settings.event_action_success = 成功
settings.event_action_success_desc = Action运行以成功结束。
settings.event_action_failure_desc = Action运行以失败结束。
settings.event_header_action = Action运行事件
[graphs]
component_loading=正在加载 %s…

View file

@ -209,6 +209,7 @@ buttons.unindent.tooltip = 使項目取消縮排一層
link_modal.header = 新增連結
link_modal.url = 網址
link_modal.description = 描述
link_modal.paste_reminder = 提示:當您的剪貼簿中有網址時,可以直接貼到編輯器中來建立連結。
[filter]
string.asc=A - Z
@ -220,7 +221,7 @@ missing_csrf=錯誤的請求:未提供 CSRF 符記
invalid_csrf=錯誤的請求:無效的 CSRF 符記
not_found=找不到目標。
network_error=網路錯誤
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個新問題。
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關議題,或在必要時提出一個新議題。
server_internal = 伺服器內部錯誤
[startpage]
@ -713,7 +714,7 @@ show_on_map = 在地圖上顯示這個地點
settings = 使用者設定
block_user = 封鎖使用者
block_user.detail_1 = 你們將停止互相關注,並且無法互相關注。
block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的題和評論進行互動。
block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的題和評論進行互動。
followers_one = %d 位追蹤者
following_one = 追蹤 %d 個人
block_user.detail_3 = 你們將無法互相新增為儲存庫協作者。
@ -1013,7 +1014,7 @@ uploaded_avatar_is_too_big = 上傳檔案的大小 %d KiB超過了上限
select_permissions = 選擇權限
permission_write = 讀寫
permissions_list = 權限:
add_email_confirmation_sent = 我們已發送一封確認信至 「%s」。請檢查您的信箱並在 %s 內確認您的信箱地址
add_email_confirmation_sent = 確認信已發送至「%s」。請在接下來的 %s 內前往收件匣查看該郵件,並點擊其中的連結以完成電子郵件地址的確認
repo_and_org_access = 儲存庫和組織存取權
permissions_public_only = 僅公開
permissions_access_all = 全部(公開、私有和受限)
@ -1027,9 +1028,9 @@ unbind_success = 已成功移除該社群帳號。
create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。
change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。
change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。
visibility.limited_tooltip = 只有已登入的使用者能看
visibility.limited_tooltip = 僅對已登入的使用者可
visibility.private_tooltip = 只有您加入的組織之成員能看見
keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號
keep_email_private_popup = 您的電子郵件地址不會顯示在個人資料頁面中,也不會成為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄
ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。
email_desc = 您的主要電子信箱將被用於通知、密碼復原、和網頁 Git 操作(如果您的信箱不是隱藏的)。
pronouns_custom = 自訂
@ -1076,6 +1077,20 @@ quota.sizes.assets.attachments.all = 附件
quota.sizes.assets.artifacts = 製品
quota.sizes.wiki = 百科
quota = 配額
access_token_regeneration = 重新產生存取符記
access_token_regeneration_desc = 重新產生存取符記將會撤銷使用該符記的應用程式對您帳號的存取權限,此操作無法還原。是否繼續?
regenerate_token_success = 符記已重新產生。使用該符記的應用程式將不再具有你帳號的存取權限,必須更新為新的符記後才能繼續使用。
quota.applies_to_user = 以下配額規則適用於您的帳號
quota.applies_to_org = 以下配額規則適用於此組織
quota.rule.exceeded.helper = 符合此規則的物件總大小已超出配額限制。
quota.sizes.repos.public = 公開儲存庫
quota.sizes.repos.private = 私有儲存庫
quota.sizes.git.all = Git 內容
quota.sizes.git.lfs = Git LFS
quota.sizes.assets.attachments.issues = 問題附件
quota.sizes.assets.attachments.releases = 版本發布附件
keep_pronouns_private = 僅向已驗證的使用者顯示代名詞
keep_pronouns_private.description = 這將對未登入的訪客隱藏您的代名詞。
[repo]
owner=所有者
@ -1147,7 +1162,7 @@ forks=分叉
reactions_more=和其他 %d 個
unit_disabled=網站管理員已經停用這個儲存庫區域。
language_other=其他
adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
adopt_preexisting_label=接管檔案
adopt_preexisting=接管既有的檔案
adopt_preexisting_content=從 %s 建立儲存庫
@ -1362,7 +1377,7 @@ editor.filename_cannot_be_empty=檔案名稱不能為空。
editor.filename_is_invalid=檔名無效:「%s」。
editor.branch_does_not_exist=此儲存庫沒有名為「%s」的分支。
editor.branch_already_exists=此儲存庫已有名為「%s」的分支。
editor.file_changed_while_editing=檔案內容在您編輯時已被更改。<a target="_blank" rel="noopener noreferrer" href="%s">按一下此處</a>來檢視被更改的地方或<strong>再次提交</strong>以覆蓋這些變更
editor.file_changed_while_editing=檔案內容自您開啟後已有變更。<a target="_blank" rel="noopener noreferrer" href="%s">點此查看</a>,或<strong>再次提交變更</strong>以覆寫原內容
editor.file_already_exists=此儲存庫已有名為「%s」的檔案。
editor.commit_empty_file_header=提交空白檔案
editor.commit_empty_file_text=你準備提交的檔案是空白的,是否繼續?
@ -1581,7 +1596,7 @@ issues.commented_at=`已留言 <a href="#%s"> %s</a>`
issues.delete_comment_confirm=您確定要刪除這則留言嗎?
issues.context.copy_link=複製連結
issues.context.quote_reply=引用回覆
issues.context.reference_issue=新增問題並參考
issues.context.reference_issue=在新問題中引用
issues.context.edit=編輯
issues.context.delete=刪除
issues.close=關閉問題
@ -1594,8 +1609,8 @@ issues.reopened_at=`重新開放了這個問題 <a id="%[1]s" href="#%[1]s">%[2]
issues.commit_ref_at=`在提交中關聯了這個問題 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_issue_from=`<a href="%[3]s">關聯了這個問題 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_pull_from=`<a href="%[3]s">關聯了這個合併請求 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closing_from=`<a href="%[3]s">關聯了合併請求 %[4]s 將關閉這個問題</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopening_from=`<a href="%[3]s">關聯了合併請求 %[4]s 將重新開放這個問題</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closing_from=<a href="%[3]s">從將關閉此問題的拉取請求 %[4]s 中提及了此問題</a><a id="%[1]s" href="#%[1]s">%[2]s</a>
issues.ref_reopening_from=<a href="%[3]s">從將重新開啟此問題的拉取請求 %[4]s 中提及了此問題</a><a id="%[1]s" href="#%[1]s">%[2]s</a>
issues.ref_closed_from=`<a href="%[3]s">關閉了這個問題 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopened_from=`<a href="%[3]s">重新開放了這個問題 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_from=`自 %[1]s`
@ -1644,8 +1659,8 @@ issues.unlock=解鎖對話
issues.lock.unknown_reason=由於未知的原因而無法鎖定問題。
issues.lock_duplicate=問題無法被鎖定兩次。
issues.unlock_error=無法解鎖未被鎖定的問題。
issues.lock_with_reason=因為 <strong>%s</strong> 而鎖定,並將對話設為協作者限定 %s
issues.lock_no_reason=鎖定並將對話設為協作者限定 %s
issues.lock_with_reason=因為 <strong>%s</strong> 而鎖定,並將對話限制為協作者 %s
issues.lock_no_reason=鎖定並將對話限制為協作者 %s
issues.unlock_comment=解鎖這個對話 %s
issues.lock_confirm=鎖定
issues.unlock_confirm=解除鎖定
@ -1739,8 +1754,8 @@ issues.review.left_comment=留下了回應
issues.review.content.empty=您必須留下訊息指出需要修正的地方。
issues.review.reject=請求了變更 %s
issues.review.wait=被請求進行審核 %s
issues.review.add_review_request=請求了 %s 來審核 %s
issues.review.remove_review_request=移除了對 %s 的審核請求 %s
issues.review.add_review_request=請求 %[1]s 進行審查 %[2]s
issues.review.remove_review_request=移除了對 %[1]s 的審查請求 %[2]s
issues.review.remove_review_request_self=拒絕了審核 %s
issues.review.pending=待處理
issues.review.review=審核
@ -1824,7 +1839,7 @@ pulls.reject_count_1=%d 個變更請求
pulls.reject_count_n=%d 個變更請求
pulls.waiting_count_1=%d 個正在等待審核
pulls.waiting_count_n=%d 個正在等待審核
pulls.wrong_commit_id=提交 id 必須存在於目標分支上
pulls.wrong_commit_id=提交 ID 必須存在於目標分支上
pulls.no_merge_desc=無法進行合併,因為所有儲存庫的合併選項已被停用。
pulls.no_merge_helper=在儲存庫設定啟用合併選項或手動合併該合併請求。
@ -1840,13 +1855,13 @@ pulls.merge_commit_id=合併提交 ID
pulls.require_signed_wont_sign=該分支需要經簽署的提交,但此合併將不會被簽署
pulls.invalid_merge_option=您無法對此合併請求使用這個合併選項。
pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試不同的策略
pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試其他的合併策略
pulls.merge_conflict_summary=錯誤訊息
pulls.rebase_conflict=合併失敗Rebase 提交時發生衝突:%[1]s。 提示:請嘗試不同的策略
pulls.rebase_conflict=合併失敗Rebase 提交時發生衝突:%[1]s。 提示:請嘗試其他的合併策略
pulls.rebase_conflict_summary=錯誤訊息
pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試不同的策略
pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試其他的合併策略
pulls.merge_out_of_date=合併失敗:產生合併時,基底已被更新。提示:再試一次。
pulls.head_out_of_date=合併失敗:產生合併時,head 已被更新。提示:再試一次。
pulls.head_out_of_date=合併失敗:產生合併時,HEAD 已被更新。提示:再試一次。
pulls.push_rejected=合併失敗:此推送被拒絕。請檢查此儲存庫的 Git Hook。
pulls.push_rejected_summary=完整的拒絕訊息
pulls.push_rejected_no_message=推送失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook
@ -2082,7 +2097,7 @@ settings.pulls.default_allow_edits_from_maintainers=預設允許維護者進行
settings.releases_desc=啟用儲存庫版本發佈
settings.packages_desc=啟用儲存庫軟體包註冊中心
settings.projects_desc=啟用儲存庫專案
settings.actions_desc=啟用儲存庫 Actions
settings.actions_desc=啟用與 Forgejo Actions 整合的 CI/CD 流程
settings.admin_settings=管理員設定
settings.admin_enable_health_check=啟用儲存庫的健康檢查git fsck
settings.admin_code_indexer=程式碼索引器
@ -2181,7 +2196,7 @@ settings.webhook.payload=內容
settings.webhook.body=本體
settings.webhook.replay.description=再次執行此 Webhook。
settings.webhook.delivery.success=已將事件加入到傳送佇列,可能需要等待幾分鐘才會出現於傳送紀錄。
settings.githooks_desc=Git Hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
settings.githooks_desc=Git hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
settings.githook_edit_desc=如果 Hook 未啟動,則會顯示範例文件中的內容。如果想要刪除某個 Hook則送出空白內容即可。
settings.githook_name=Hook 名稱
settings.githook_content=Hook 內容
@ -2232,15 +2247,15 @@ settings.event_pull_request_desc=建立、編輯、關閉及重新開放合併
settings.event_pull_request_assign=指派
settings.event_pull_request_assign_desc=指派或取消指派合併請求。
settings.event_pull_request_label=標籤
settings.event_pull_request_label_desc=更新或清除合併請求標籤。
settings.event_pull_request_label_desc=已新增或移除合併請求的標籤。
settings.event_pull_request_milestone=里程碑
settings.event_pull_request_milestone_desc=里程碑已新增、已移除或已修改。
settings.event_pull_request_comment=評註
settings.event_pull_request_comment_desc=建立、編輯或刪除合併請求的留言。
settings.event_pull_request_review=審核
settings.event_pull_request_review_desc=核准、退回或提出審核留言
settings.event_pull_request_review_desc=合併請求已被核准、拒絕,或已有審查留言新增
settings.event_pull_request_sync=同步
settings.event_pull_request_sync_desc=合併請求同步
settings.event_pull_request_sync_desc=分支已自動與目標分支同步更新
settings.event_package=軟體包
settings.event_package_desc=已在儲存庫中建立或刪除軟體包。
settings.branch_filter=分支篩選
@ -2352,7 +2367,7 @@ settings.choose_branch=選擇一個分支…
settings.no_protected_branch=沒有受保護的分支。
settings.edit_protected_branch=編輯
settings.protected_branch_required_rule_name=必須填寫規則名稱
settings.protected_branch_duplicate_rule_name=規則名稱已存在
settings.protected_branch_duplicate_rule_name=已經存在一條針對這組分支的規則
settings.protected_branch_required_approvals_min=需要的核可數量不能為負數。
settings.tags=標籤
settings.tags.protection=標籤保護
@ -2486,7 +2501,7 @@ release.tag_helper=新增或選擇現有的標籤。
release.tag_helper_new=新標籤,將在目標上建立此標籤。
release.tag_helper_existing=現有的標籤。
release.title_empty=標題不可為空。
release.prerelease_desc=標記為 Pre-Release
release.prerelease_desc=標記為預發行
release.prerelease_helper=標記此版本不適合生產使用。
release.cancel=取消
release.publish=發佈發行
@ -2629,10 +2644,10 @@ issues.filter_milestone_all = 所有里程碑
issues.author_helper = 此使用者是作者。
pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。
wiki.search = 搜尋百科
settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定您的儲存庫以自動推送提交、標簽、和分支至另一個儲存庫。Pull 鏡像已被您的管理員停用
settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定你的專案使其自動將提交、標籤與分支推送到另一個儲存庫。您的網站管理員已停用拉取鏡像功能
settings.mirror_settings.docs = 設定您的儲存庫以自動與另一個儲存庫同步提交、標籤、和分支。
settings.mirror_settings.docs.disabled_push_mirror.info = 推送鏡像已被您的網站管理員停用。
settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個 pull 鏡像,請參閱:
settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個拉取鏡像,請參閱:
blame.ignore_revs = <a href="%s">.git-blame-ignore-revs</a> 中的修訂已被忽略。點擊<a href="%s">這裡</a>來檢視一般的責任歸屬界面。
editor.file_is_a_symlink = `「%s」是一個符號連結。網頁編輯器無法編輯符號連結`
issues.label_archive = 封存標籤
@ -2644,7 +2659,7 @@ pulls.showing_only_single_commit = 只顯示提交 %[1]s 的變更
pulls.cmd_instruction_merge_desc = 合併更改並在 Forgejo 上更新。
signing.wont_sign.pubkey = 無法簽署該提交,因為您沒有與您帳號連結的公鑰。
signing.wont_sign.twofa = 您必須啟用兩步驟認證才能簽署提交。
signing.wont_sign.basesigned = 因為 base 提交沒有被簽署,無法簽署該提交
signing.wont_sign.basesigned = 合併將不會被簽署,因為其基礎提交尚未簽署
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = 目前,這個操作只能在「新的遷移」目錄完成。如需更多資訊,請參閱:
settings.mirror_settings.docs.disabled_push_mirror.instructions = 設定您的儲存庫以自動從另一個儲存庫拉取提交、標籤和分支。
issues.role.contributor_helper = 該使用者過去曾經提交至此儲存庫。
@ -2657,14 +2672,14 @@ signing.wont_sign.error = 在檢查是否能簽署提交時發生錯誤。
issues.num_participants_one = %d 位參與者
pulls.showing_specified_commit_range = 只顯示 %[1]s 至 %[2]s 之間的變更
blame.ignore_revs.failed = 忽略 <a href="%s">.git-blame-ignore-revs</a> 中的修訂失敗。
issues.blocked_by_user = 因為您被該儲存庫的所有者封鎖,您不能提出一個新的問題。
issues.blocked_by_user = 因為您已被儲存庫擁有者封鎖,您無法在此儲存庫中建立問題。
pulls.blocked_by_user = 因為您被這個儲存庫的所有者封鎖,您不能在這裡開啟一個合併請求。
pulls.has_merged = 失敗:該合併請求已被合併,您無法再合併一次或更改目標分支。
wiki.cancel = 取消
activity.navbar.code_frequency = 寫程式頻率
settings.mirror_settings.docs.no_new_mirrors = 您的儲存庫目前是另一個儲存庫的鏡像。請記住,您目前不能建立新的鏡像。
settings.mirror_settings.docs.can_still_use = 雖然您不能建立新的鏡像,您還是可以使用既有的鏡像。
pulls.reopen_failed.base_branch = 因為這個合併請求的 base 分支不存在,它無法被開啟。
pulls.reopen_failed.base_branch = 因為這個合併請求的基礎分支不存在,它無法被開啟。
issues.label_archive_tooltip = 在預設情況下,標籤搜尋時會排除被封存的標籤。
signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不會被簽署。
activity.navbar.recent_commits = 最近的提交
@ -2679,7 +2694,7 @@ editor.push_out_of_date = 該推送似乎過期了。
issues.cancel_tracking_history = `已取消時間追蹤 %s`
issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。
pulls.commit_ref_at = `在提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 引用了這個合併請求`
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更
pulls.cmd_instruction_merge_title = 合併
pulls.ready_for_review = 可以開始審閱了嗎?
pulls.cmd_instruction_hint = `檢視命令列指示`
@ -2704,7 +2719,7 @@ pulls.blocked_by_changed_protected_files_1 = 這個合併請求被暫止,因
pulls.blocked_by_changed_protected_files_n = 這個合併請求被暫止,因為它更改了這些受保護的檔案:
pulls.status_checks_hide_all = 隱藏所有檢查
pulls.status_checks_show_all = 顯示所有檢查
pulls.reopen_failed.head_branch = 因為這個合併請求的 head 分支不存在,它無法被開啟
pulls.reopen_failed.head_branch = 因為這個合併請求的 HEAD 分支不存在,無法重新開啟此合併請求
activity.navbar.pulse = 動態
signing.will_sign = 將以金鑰「%s」簽署這個提交。
signing.wont_sign.headsigned = 因為 head 提交沒有被簽署,這個合併不會被簽署。
@ -2721,7 +2736,7 @@ pulls.show_changes_since_your_last_review = 顯示自您上次審閱的變更
pulls.blocked_by_rejection = 這個合併請求有正式審閱者所請求的更改。
pulls.blocked_by_official_review_requests = 因為這個合併請求還缺少至少一個正式審閱者的核可,它已被暫止。
wiki.original_git_entry_tooltip = 與其使用友善連結,檢視原始 Git 檔案。
settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於 push 和 pull 鏡像的資訊:
settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於推送和拉取鏡像的資訊:
settings.mirror_settings.docs.doc_link_title = 如何建立儲存庫鏡像?
settings.mirror_settings.docs.pulling_remote_title = 從遠端儲存庫拉取
issues.author.tooltip.pr = 此使用者是這個合併請求的作者。
@ -2872,12 +2887,40 @@ settings.units.units = 功能
diff.git-notes.add = 增加註釋
diff.git-notes.remove-header = 移除註釋
settings.event_pull_request_enforcement = 執行
sync_fork.branch_behind_few = 此分支落後 %[2]s %[1]d 次提交
sync_fork.branch_behind_few = 此分支落後 %[2]s %[1]d 次提交
sync_fork.button = 同步
sync_fork.branch_behind_one = 此分支落後 %[2]s %[1]d 次提交
issues.review.remove_review_requests = 移除了對 %[1]s 的審查請求 %[2]s
issues.filter_no_results_placeholder = 嘗試調整您的搜尋篩選條件。
issues.reaction.alt_add = 對留言添加 %[1]s 個反應。
issues.reopen.blocked_by_user = 您無法重新開啟此問題,因為您已被儲存庫擁有者或此問題的發佈者封鎖。
issues.filter_no_results = 沒有結果
archive.nocomment = 您無法留言,因為此儲存庫已被封存。
migrate.repo_desc_helper = 如欲匯入現有描述請留空
comment.blocked_by_user = 您無法留言,因為您已被儲存庫擁有者或作者封鎖。
pulls.editable_explanation = 此合併請求允許維護者進行編輯。您可以直接參與貢獻。
pulls.agit_explanation = 此合併請求使用 AGit 工作流程建立。AGit 允許貢獻者透過「git push」提出變更無需建立分支或分叉。
issues.review.add_remove_review_requests = 請求 %[1]s 進行審查,並取消了對 %[2]s 的審查請求 %[3]s
pulls.cmd_instruction_merge_warning = <b>警告:</b>此儲存庫尚未啟用「自動偵測手動合併」設定,您之後需要手動標記此合併請求為已合併。
issues.review.add_review_requests = 請求 %[1]s 進行審查 %[2]s
settings.event_header_action = Action 執行事件
settings.event_action_failure = 失敗
settings.event_action_recover = 恢復
settings.event_action_recover_desc = Action 執行成功,先前同一工作流程中的 Action 執行曾經失敗。
settings.event_action_success = 成功
settings.event_action_success_desc = Action 執行成功。
settings.sourcehut_builds.manifest_path = 建置清單路徑
settings.sourcehut_builds.visibility = 作業可見性
settings.event_action_failure_desc = Action 執行以失敗結束。
settings.protect_branch_name_pattern_desc = 受保護分支名稱的模式。請參閱<a href="%s">文件說明</a>以了解模式語法。範例main、release/**
settings.sourcehut_builds.access_token_helper = 具有 JOBS:RW 權限的存取權杖。請在 meta.sr.ht 上產生一個 <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht 權杖</a>,或一個 <a target="_blank" rel="noopener noreferrer" href="%s">具有機密存取權限的 builds.sr.ht 權杖</a>。
settings.matrix.room_id_helper = 可從 Element 網頁版客戶端取得 Room ID進入房間設定 > 進階 > Internal room ID。範例%s。
settings.web_hook_name_sourcehut_builds = SourceHut Builds
diff.git-notes.remove-body = 此注釋將會被移除。
settings.sourcehut_builds.secrets_helper = 授權此作業存取建置機密(需要 SECRETS:RO 權限)
[graphs]
component_loading = %s載入中…
component_loading = 正在載入 %s
code_frequency.what = 寫程式頻率
recent_commits.what = 最近的提交
contributors.what = 貢獻
@ -2920,7 +2963,7 @@ settings.permission=權限
settings.repoadminchangeteam=儲存庫管理者可增加與移除團隊權限
settings.visibility=瀏覽權限
settings.visibility.public=公開
settings.visibility.limited=受限(只有已驗證的使用者才可以看到
settings.visibility.limited=受限(僅對已登入使用者可見
settings.visibility.limited_shortname=受限
settings.visibility.private=私有(只有組織成員才能看到)
settings.visibility.private_shortname=私有
@ -3096,8 +3139,8 @@ dashboard.total_gc_time=總 GC 暫停時間
dashboard.total_gc_pause=總 GC 暫停時間
dashboard.last_gc_pause=上次 GC 暫停時間
dashboard.gc_times=GC 執行次數
dashboard.delete_old_actions=從資料庫刪除所有舊行為
dashboard.delete_old_actions.started=從資料庫刪除所有舊行為的任務已啟動。
dashboard.delete_old_actions=從資料庫刪除所有舊操作紀錄
dashboard.delete_old_actions.started=從資料庫刪除所有舊操作紀錄的任務已啟動。
dashboard.update_checker=更新檢查器
dashboard.delete_old_system_notices=從資料庫刪除所有舊系統提示
dashboard.gc_lfs=對 LFS meta objects 進行垃圾回收
@ -3117,7 +3160,7 @@ users.repos=儲存庫數
users.created=建立時間
users.last_login=上次登入
users.never_login=從未登入
users.send_register_notify=寄送使用者註冊通知
users.send_register_notify=透過電子郵件傳送註冊通知
users.new_success=已建立新帳號「%s」。
users.edit=編輯
users.auth_source=認證來源
@ -3133,7 +3176,7 @@ users.prohibit_login=已停權帳號
users.is_admin=管理員帳號
users.is_restricted=受限制的帳號
users.allow_git_hook=可以建立 Git Hook
users.allow_git_hook_tooltip=Git Hook 將以和 Forgejo 相同的作業系統使用者執行,並擁有同等的主機存取權限。因此擁有此特殊 Git Hook 權限的使用者可存取和修改所有的 Forgejo 儲存庫和 Forgejo 的資料庫。他們甚至能取得 Forgejo 的管理員權限
users.allow_git_hook_tooltip=Git hooks 會以執行 Forgejo 的作業系統使用者身分執行,並擁有相同等級的主機存取權限。因此,擁有此特殊 Git hook 權限的使用者,可以存取並修改所有 Forgejo 儲存庫,以及 Forgejo 使用的資料庫。換句話說,他們也具備取得 Forgejo 管理員權限的能力
users.allow_import_local=可以匯入本地儲存庫
users.allow_create_organization=可以建立組織
users.update_profile=更新使用者帳號
@ -3335,7 +3378,7 @@ config.custom_file_root_path=自訂檔案根路徑
config.domain=伺服器域名
config.offline_mode=本地模式
config.disable_router_log=停用路由日誌
config.run_user=以使用者名稱執行
config.run_user=以使用者執行
config.run_mode=執行模式
config.git_version=Git 版本
config.repo_root_path=儲存庫根路徑
@ -3440,8 +3483,8 @@ config.enable_federated_avatar=啟用聯邦式大頭貼
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=GC 參數
config.git_migrate_timeout=遷移逾時
@ -3599,7 +3642,7 @@ mirror_sync_create=從鏡像同步了新參考 <a href="%[2]s">%[3]s</a> 到 <a
mirror_sync_delete=已從鏡像同步並從 <a href="%[1]s">%[3]s</a> 刪除了參考 <code>%[2]s</code>
approve_pull_request=`核可了 <a href="%[1]s">%[3]s#%[2]s</a>`
reject_pull_request=`提出了修改建議 <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release=`發布了 <a href="%[1]s">%[3]s</a> 的 <a href="%[2]s"> "%[4]s" </a>`
publish_release=`已於 <a href="%[1]s">%[3]s</a> 發佈 <a href="%[2]s">%[4]s</a>`
review_dismissed=`取消了 <b>%[4]s</b> 對 <a href="%[1]s">%[3]s#%[2]s</a> 的審核`
review_dismissed_reason=原因:
create_branch=在 <a href="%[1]s">%[4]s</a> 中建立了分支 <a href="%[2]s">%[3]s</a>
@ -3817,7 +3860,7 @@ arch.version.depends = 依賴
owner.settings.cargo.rebuild.no_index = 無法重建,未初始化任何索引。
cran.registry = 在你的 <code>Rprofile.site</code> 檔案中設定此註冊表:
debian.repository.distributions = 發行版
owner.settings.chef.keypair.description = 需要金鑰對才能向 Chef 註冊表進行身份驗證。如果你之前已經產生過金鑰對,產生新的金鑰對將會丟棄舊的金鑰對
owner.settings.chef.keypair.description = 送往 Chef 註冊表的請求必須經過加密簽署,以作為驗證身分的方式。在產生金鑰對時,只有公鑰會儲存在 Forgejo 上,私鑰則會提供給你用於 knife 工具。產生新的金鑰對將會覆蓋先前的金鑰
owner.settings.cargo.initialize.description = 使用 Cargo 註冊表需要一個特殊的索引 Git 儲存庫。使用此選項將會(重新)建立儲存庫並自動配置它。
rpm.repository.multiple_groups = 此套件可以在多個群組中使用。
rpm.distros.suse = 在基於 SUSE 的發行版上
@ -3839,6 +3882,7 @@ registry.documentation = 有關 %s 註冊表的更多資訊,請參閱<a target
alt.registry.install = 若要安裝軟體包,執行以下命令:
alt.repository.multiple_groups = 此軟體包在多個群組中可用。
alt.setup = 新增儲存庫至已連接的儲存庫清單選擇必要的架構結構而非「_arch_」
arch.version.makedepends = 編譯依賴
[secrets]
secrets=Secret
@ -3999,9 +4043,9 @@ commit_kind = 搜尋提交…
code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引可能會有更好的結果。
exact = 精確
milestone_kind = 搜尋里程碑...
issue_kind = 搜尋題…
issue_kind = 搜尋題…
exact_tooltip = 只包含與搜尋詞完全相符的結合
pull_kind = 搜尋拉取
pull_kind = 搜尋合併請求
regexp = 正規表示式
regexp_tooltip = 將搜尋詞解釋為正規表示式
union = 關鍵字
@ -4027,4 +4071,20 @@ test = 好的
[repo.permissions]
ext_issues = 存取外部問題追蹤器的連結。權限由外部管理。
ext_wiki = 存取外部百科的連結。權限由外部管理。
ext_wiki = 存取外部百科的連結。權限由外部管理。
issues.read = <b>讀取:</b>查看並建立問題與留言。
releases.write = <b>寫入:</b>發布、編輯與刪除發行版本及其資源。
wiki.read = <b>讀取:</b>查看整合的 Wiki 及其歷史紀錄。
code.write = <b>寫入:</b>推送到儲存庫,建立分支與標籤。
code.read = <b>讀取:</b>存取並複製此儲存庫的原始碼。
issues.write = <b>寫入:</b>關閉問題,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
pulls.read = <b>讀取:</b>查看並建立合併請求。
pulls.write = <b>寫入:</b>關閉合併請求,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
releases.read = <b>讀取:</b>檢視並下載發行版本。
wiki.write = <b>寫入:</b>在整合的 Wiki 中建立、更新與刪除頁面。
projects.read = <b>讀取:</b>存取儲存庫的專案看板。
packages.write = <b>寫入:</b>發布與刪除指派給此儲存庫的套件。
projects.write = <b>寫入:</b>建立專案與欄位,並編輯它們。
packages.read = <b>讀取:</b>檢視並下載指派給此儲存庫的套件。
actions.read = <b>讀取:</b>查看整合的 CI/CD 流程及其紀錄。
actions.write = <b>寫入:</b>手動觸發、重新啟動、取消或核准待處理的 CI/CD 流程。

View file

@ -1,10 +1,89 @@
{
"repo.pulls.merged_title_desc": {
"one": "сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s",
"other": "сля %[1]d подавания от <code>%[2]s</code> в <code>%[3]s</code> %[4]s"
},
"repo.pulls.title_desc": {
"one": "иска да слее %[1]d подаване от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>",
"other": "иска да слее %[1]d подавания от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>"
}
"repo.pulls.merged_title_desc": {
"one": "сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s",
"other": "сля %[1]d подавания от <code>%[2]s</code> в <code>%[3]s</code> %[4]s"
},
"repo.pulls.title_desc": {
"one": "иска да слее %[1]d подаване от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>",
"other": "иска да слее %[1]d подавания от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>"
},
"mail.actions.run_info_ref": "Клон: %[1]s (%[2]s)",
"mail.actions.run_info_trigger": "Задействано поради: %[1]s от: %[2]s",
"meta.last_line": "В България расте най-старото дърво в страната, Байкушевата мура, на възраст над 1300 години.",
"relativetime.1day": "вчера",
"relativetime.2months": "преди два месеца",
"home.explore_repos": "Разглеждане на хранилища",
"home.explore_users": "Разглеждане на потребители",
"home.explore_orgs": "Разглеждане на организации",
"relativetime.mins": {
"one": "преди %d минута",
"other": "преди %d минути"
},
"repo.form.cannot_create": "Всички пространства, в които можете да създавате хранилища, са достигнали лимита си на хранилища.",
"moderation.report_remarks": "Подробности",
"moderation.submit_report": "Изпращане на доклада",
"followers.incoming.list.self.none": "Никой не следва вашия профил.",
"followers.incoming.list.none": "Никой не следва този потребител.",
"relativetime.now": "сега",
"home.welcome.no_activity": "Няма дейност",
"relativetime.1year": "миналата година",
"moderation.abuse_category": "Категория",
"moderation.abuse_category.illegal_content": "Незаконно съдържание",
"home.welcome.activity_hint": "Все още няма нищо в емисията ви. Вашите действия и дейност от хранилищата, които наблюдавате, ще се появят тук.",
"stars.list.none": "Никой не е отбелязал това хранилище със звезда.",
"moderation.report_abuse_form.invalid": "Невалидни аргументи",
"moderation.report_abuse_form.already_reported": "Вече сте докладвали това съдържание",
"moderation.abuse_category.placeholder": "Изберете категория",
"moderation.abuse_category.spam": "Спам",
"repo.issue_indexer.title": "Индексатор на задачи",
"moderation.report_abuse_form.details": "Този формуляр трябва да се използва за докладване на потребители, които създават спам профили, хранилища, задачи, коментари или се държат неподходящо.",
"moderation.report_remarks.placeholder": "Моля, предоставете подробности относно злоупотребата, за която докладвате.",
"moderation.reporting_failed": "Не може да се изпрати новият доклад за злоупотреба: %v",
"moderation.reported_thank_you": "Благодарим ви за доклада. Администрацията е уведомена.",
"error.not_found.title": "Страницата не е намерена",
"incorrect_root_url": "Тази инстанция на Forgejo е конфигурирана да се сервира на \"%s\". В момента разглеждате Forgejo през друг URL адрес, което може да доведе до неправилно функциониране на части от приложението. Каноничният URL адрес се контролира от администраторите на Forgejo чрез настройката ROOT_URL в app.ini.",
"themes.names.forgejo-dark": "Forgejo тъмна",
"themes.names.forgejo-auto": "Forgejo (следване на системната тема)",
"themes.names.forgejo-light": "Forgejo светла",
"watch.list.none": "Никой не наблюдава това хранилище.",
"followers.outgoing.list.self.none": "Не следвате никого.",
"followers.outgoing.list.none": "%s не следва никого.",
"relativetime.future": "в бъдеще",
"relativetime.2days": "преди два дни",
"relativetime.1week": "миналата седмица",
"relativetime.2weeks": "преди две седмици",
"relativetime.1month": "миналия месец",
"relativetime.2years": "преди две години",
"moderation.report_abuse_form.header": "Докладване на злоупотреба до администратора",
"moderation.abuse_category.malware": "Зловреден софтуер",
"moderation.abuse_category.other_violations": "Други нарушения на правилата на платформата",
"alert.asset_load_failed": "Неуспешно зареждане на файлове с ресурси от {path}. Моля, уверете се, че файловете с ресурси са достъпни.",
"alert.range_error": " трябва да бъде число между %[1]s и %[2]s.",
"install.invalid_lfs_path": "Не може да се създаде LFS корен в посочения път: %[1]s",
"search.milestone_kind": "Търсене на етапи…",
"admin.config.moderation_config": "Конфигурация на модерацията",
"moderation.report_abuse": "Докладване на злоупотреба",
"moderation.report_content": "Докладване на съдържание",
"relativetime.hours": {
"one": "преди %d час",
"other": "преди %d часа"
},
"relativetime.days": {
"one": "преди %d ден",
"other": "преди %d дни"
},
"relativetime.weeks": {
"one": "преди %d седмица",
"other": "преди %d седмици"
},
"relativetime.months": {
"one": "преди %d месец",
"other": "преди %d месеца"
},
"relativetime.years": {
"one": "преди %d година",
"other": "преди %d години"
},
"editor.textarea.tab_hint": "Редът вече е с отстъп. Натиснете отново <kbd>Tab</kbd> или <kbd>Escape</kbd>, за да излезете от редактора.",
"editor.textarea.shift_tab_hint": "Няма отстъп на този ред. Натиснете отново <kbd>Shift</kbd> + <kbd>Tab</kbd> или <kbd>Escape</kbd>, за да излезете от редактора."
}

View file

@ -100,5 +100,7 @@
"stars.list.none": "Tento repozitář si nikdo nepřidal do oblíbených.",
"followers.outgoing.list.self.none": "Nikoho nesledujete.",
"editor.textarea.tab_hint": "Řádek je již odsazen. Pro opuštění editoru stiskněte znovu <kbd>Tab</kbd> nebo <kbd>Escape</kbd>.",
"editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu <kbd>Shift</kbd> + <kbd>Tab</kbd> nebo <kbd>Escape</kbd>."
"editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu <kbd>Shift</kbd> + <kbd>Tab</kbd> nebo <kbd>Escape</kbd>.",
"admin.dashboard.cleanup_offline_runners": "Vymazat offline runnery",
"settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. <a href=\"%s\" target=\"_blank\">Zjistit více</a>"
}

View file

@ -92,5 +92,6 @@
"stars.list.none": "Niemand hat dieses Repo favorisiert.",
"followers.incoming.list.none": "Niemand folgt diesem Benutzer.",
"editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen.",
"editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals <kbd>Shift</kbd> + <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen."
"editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals <kbd>Shift</kbd> + <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen.",
"admin.dashboard.cleanup_offline_runners": "Aufräumen der offline Runner"
}

View file

@ -94,5 +94,6 @@
"editor.textarea.shift_tab_hint": "No indentation on this line. Press <kbd>Shift</kbd> + <kbd>Tab</kbd> again or <kbd>Escape</kbd> to leave the editor.",
"admin.dashboard.cleanup_offline_runners": "Cleanup offline runners",
"settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. <a href=\"%s\" target=\"_blank\">Learn more</a>",
"avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels",
"meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it."
}

View file

@ -92,5 +92,7 @@
"followers.outgoing.list.self.none": "Hindi ka sumusunod ng anumang tao.",
"followers.outgoing.list.none": "Hindi sinusundan ni %s ang sinuman.",
"editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang <kbd>Tab</kbd> o <kbd>Escape</kbd> para umalis sa editor.",
"editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang <kbd>Shift</kbd> + <kbd>Tab</kbd> ulit o <kbd>Escape</kbd> para umalis sa editor."
"editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang <kbd>Shift</kbd> + <kbd>Tab</kbd> ulit o <kbd>Escape</kbd> para umalis sa editor.",
"admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner",
"settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. <a href=\"%s\" target=\"_blank\">Matuto pa</a>"
}

View file

@ -100,5 +100,7 @@
"stars.list.none": "Neviens šo glabātavu nav atzīmējis ar zvaigzni.",
"followers.incoming.list.self.none": "Neviens neseko Tavam profilam.",
"editor.textarea.tab_hint": "Rinda jau ir ar atkāpi. Spied <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!",
"editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied <kbd>Shift</kbd> + <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!"
"editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied <kbd>Shift</kbd> + <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!",
"admin.dashboard.cleanup_offline_runners": "Notīrīt bezsaistes izpildītājus",
"settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. <a href=\"%s\" target=\"_blank\">Uzzināt vairāk</a>"
}

View file

@ -92,5 +92,7 @@
"followers.outgoing.list.self.none": "Du gahst nüms na.",
"stars.list.none": "Nüms hett up deesem Repositorium eenen Steern sett.",
"editor.textarea.tab_hint": "Rieg al inschuven. Drück weer <kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten.",
"editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer <kbd>Umschalt</kbd>+<kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten."
"editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer <kbd>Umschalt</kbd>+<kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten.",
"admin.dashboard.cleanup_offline_runners": "Nich verbunnen Lopers uprümen",
"settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. <a href=\"%s\" target=\"_blank\">Mehr unnerhören</a>"
}

View file

@ -100,5 +100,6 @@
"followers.outgoing.list.self.none": "Não está a seguir ninguém.",
"editor.textarea.tab_hint": "Linha já indentada. Pressione <kbd>Tab</kbd> novamente ou <kbd>Escape</kbd> para sair do editor.",
"editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione <kbd>Shift</kbd> + <kbd>Tab</kbd> novamente ou <kbd>Escape</kbd> para sair do editor.",
"stars.list.none": "Ninguém juntou este repositório aos favoritos."
"stars.list.none": "Ninguém juntou este repositório aos favoritos.",
"admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline"
}

View file

@ -100,5 +100,6 @@
"moderation.report_abuse_form.invalid": "Невалидные аргументы",
"moderation.report_abuse_form.header": "Жалоба администрации",
"editor.textarea.tab_hint": "Отступ уже добавлен. Нажмите <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор.",
"editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите <kbd>Shift</kbd> + <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор."
"editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите <kbd>Shift</kbd> + <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор.",
"admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей"
}

View file

@ -1,5 +1,97 @@
{
"repo.pulls.merged_title_desc": "sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s",
"repo.pulls.title_desc": "vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>",
"search.milestone_kind": "Sök milstolpar..."
"repo.pulls.merged_title_desc": {
"one": "sammanfogade %[1]d incheckning från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s",
"other": "sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s"
},
"repo.pulls.title_desc": {
"one": "vill sammanfoga %[1]d incheckning från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>",
"other": "vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>"
},
"search.milestone_kind": "Sök milstolpar…",
"mail.actions.not_successful_run_subject": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
"discussion.locked": "Denna diskussion har låsts. Kommentarer är begränsade till bidragsgivare.",
"relativetime.now": "nu",
"relativetime.1day": "igår",
"relativetime.2days": "för två dagar sedan",
"relativetime.days": {
"one": "%d dag sedan",
"other": "%d dagar sedan"
},
"admin.dashboard.cleanup_offline_runners": "Städa upp offline runners",
"repo.issue_indexer.title": "Indexerare för utgåvor",
"moderation.reported_thank_you": "Tack för din rapport. Administrationen har gjorts uppmärksam på det.",
"themes.names.forgejo-light": "Forgejo ljus",
"themes.names.forgejo-dark": "Forgejo mörk",
"themes.names.forgejo-auto": "Forgejo (följ systemets tema)",
"moderation.submit_report": "Skicka in rapport",
"moderation.reporting_failed": "Det gick inte att skicka in den nya övergreppsrapporten: %v",
"mail.actions.run_info_cur_status": "Status för denna körning: %[1]s (just uppdaterad från %[2]s)",
"mail.actions.run_info_previous_status": "Status för föregående körning: %[1]s",
"mail.actions.run_info_ref": "Gren: %[1]s (%[2]s)",
"mail.actions.run_info_trigger": "Utlöses på grund av: %[1]s av: %[2]s",
"alert.asset_load_failed": "Misslyckades med att läsa in resursfiler från {path}. Kontrollera att resursfilerna är åtkomliga.",
"install.invalid_lfs_path": "Det gick inte att skapa LFS-roten på den angivna sökvägen: %[1]s",
"alert.range_error": " måste vara ett tal mellan %[1]s och %[2]s.",
"stars.list.none": "Ingen har stjärnmarkerat detta förråd.",
"watch.list.none": "Ingen tittar på det här förrådet.",
"followers.incoming.list.self.none": "Ingen följer din profil.",
"followers.incoming.list.none": "Ingen följer den här användaren.",
"followers.outgoing.list.self.none": "Du följer inte någon.",
"followers.outgoing.list.none": "%s följer inte någon.",
"relativetime.future": "i framtiden",
"relativetime.1week": "förra veckan",
"relativetime.2weeks": "för två veckor sedan",
"relativetime.1month": "senaste månaden",
"relativetime.2months": "för två månader sedan",
"relativetime.1year": "förra året",
"relativetime.2years": "för två år sedan",
"repo.form.cannot_create": "Alla utrymmen där du kan skapa förråd har nått gränsen för antal förråd.",
"incorrect_root_url": "Denna Forgejo-instans är konfigurerad att serveras på \"%s\". Du tittar för närvarande på Forgejo via en annan URL, vilket kan leda till att delar av applikationen bryts. Den kanoniska webbadressen styrs av Forgejo-administratörer via inställningen ROOT_URL i app.ini.",
"error.not_found.title": "Sidan hittades inte",
"moderation.abuse_category.illegal_content": "Olagligt innehåll",
"moderation.abuse_category.other_violations": "Andra överträdelser av plattformsreglerna",
"moderation.report_remarks": "Anmärkningar",
"moderation.report_remarks.placeholder": "Ge några detaljer om det övergrepp som du rapporterar.",
"mail.actions.successful_run_after_failure_subject": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
"mail.actions.successful_run_after_failure": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
"mail.actions.not_successful_run": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
"editor.textarea.shift_tab_hint": "Ingen indragning på den här raden. Tryck på <kbd>Shift</kbd> + <kbd>Tab</kbd> igen eller <kbd>Escape</kbd> för att lämna redigeringsläget.",
"meta.last_line": "Tack för att du översatte Forgejo! Daniel Nylander heter jag. https://www.danielnylander.se",
"editor.textarea.tab_hint": "Raden är redan indragen. Tryck på <kbd>Tab</kbd> igen eller <kbd>Escape</kbd> för att lämna redigeringsläget.",
"home.welcome.no_activity": "Ingen aktivitet",
"home.welcome.activity_hint": "Det finns inget i ditt flöde ännu. Dina åtgärder och aktivitet från förråd som du bevakar kommer att visas här.",
"home.explore_repos": "Utforska förråd",
"home.explore_users": "Utforska användare",
"home.explore_orgs": "Utforska organisationer",
"relativetime.mins": {
"one": "%d minut sedan",
"other": "%d minuter sedan"
},
"relativetime.hours": {
"one": "%d timme sedan",
"other": "%d timmar sedan"
},
"relativetime.weeks": {
"one": "%d vecka sedan",
"other": "%d veckor sedan"
},
"relativetime.months": {
"one": "%d månad sedan",
"other": "%d månader sedan"
},
"relativetime.years": {
"one": "%d år sedan",
"other": "%d år sedan"
},
"admin.config.moderation_config": "Konfiguration av moderering",
"moderation.report_abuse": "Rapportera missbruk",
"moderation.report_content": "Rapportera innehåll",
"moderation.report_abuse_form.header": "Rapportera missbruk till administratör",
"moderation.report_abuse_form.details": "Detta formulär ska användas för att rapportera användare som skapar skräpprofiler, förråd, problem, kommentarer eller beter sig olämpligt.",
"moderation.report_abuse_form.invalid": "Ogiltiga argument",
"moderation.report_abuse_form.already_reported": "Du har redan rapporterat detta innehåll",
"moderation.abuse_category": "Kategori",
"moderation.abuse_category.placeholder": "Välj en kategori",
"moderation.abuse_category.spam": "Skräppost",
"moderation.abuse_category.malware": "Skadlig kod"
}

View file

@ -100,5 +100,7 @@
"stars.list.none": "Ніхто не додав цей репозиторій в обрані.",
"watch.list.none": "Ніхто не спостерігає за цим репозиторієм.",
"editor.textarea.tab_hint": "У рядку вже є відступ. Натисніть <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора.",
"editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть <kbd>Shift</kbd> + <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора."
"editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть <kbd>Shift</kbd> + <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора.",
"admin.dashboard.cleanup_offline_runners": "Очистити неактивні раннери",
"settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. <a href=\"%s\" target=\"_blank\">Дізнатися більше</a>"
}

View file

@ -68,5 +68,6 @@
"stars.list.none": "没有人点赞这个仓库。",
"followers.incoming.list.self.none": "没有人关注你的个人资料。",
"editor.textarea.tab_hint": "此行已缩进。再次按 <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。",
"editor.textarea.shift_tab_hint": "此行无缩进。再次按 <kbd>Shift</kbd> + <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。"
"editor.textarea.shift_tab_hint": "此行无缩进。再次按 <kbd>Shift</kbd> + <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。",
"admin.dashboard.cleanup_offline_runners": "清理离线运行器"
}

View file

@ -67,5 +67,6 @@
"moderation.report_abuse_form.header": "向管理員回報濫用",
"moderation.report_abuse_form.details": "這個表單是用來檢舉用戶建立垃圾帳號、儲存庫、問題、留言,或其他不當行為。",
"moderation.report_abuse_form.invalid": "無效參數",
"moderation.report_abuse_form.already_reported": "您已檢舉此內容"
"moderation.report_abuse_form.already_reported": "您已檢舉此內容",
"meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam."
}

732
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -32,11 +32,11 @@
"katex": "0.16.22",
"mermaid": "11.6.0",
"mini-css-extract-plugin": "2.9.2",
"minimatch": "10.0.2",
"minimatch": "10.0.3",
"monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
"postcss": "8.5.4",
"postcss": "8.5.5",
"postcss-loader": "8.1.1",
"postcss-nesting": "13.0.2",
"pretty-ms": "9.0.0",

View file

@ -1310,6 +1310,7 @@ func Routes() *web.Route {
m.Get("/refs", repo.GetGitAllRefs)
m.Get("/refs/*", repo.GetGitRefs)
m.Get("/trees/{sha}", repo.GetTree)
m.Get("/blobs", repo.GetBlobs)
m.Get("/blobs/{sha}", repo.GetBlob)
m.Get("/tags/{sha}", repo.GetAnnotatedTag)
m.Group("/notes/{sha}", func() {

View file

@ -5,11 +5,54 @@ package repo
import (
"net/http"
"strings"
"forgejo.org/services/context"
files_service "forgejo.org/services/repository/files"
)
// GetBlobs gets multiple blobs of a repository.
func GetBlobs(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/git/blobs repository GetBlobs
// ---
// summary: Gets multiplbe blobs of a repository.
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: shas
// in: query
// description: a comma separated list of blob-sha (mind the overall URL-length limit of ~2,083 chars)
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/GitBlobList"
// "400":
// "$ref": "#/responses/error"
shas := ctx.FormString("shas")
if len(shas) == 0 {
ctx.Error(http.StatusBadRequest, "", "shas not provided")
return
}
if blobs, err := files_service.GetBlobsBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, strings.Split(shas, ",")); err != nil {
ctx.Error(http.StatusBadRequest, "", err)
} else {
ctx.JSON(http.StatusOK, blobs)
}
}
// GetBlob get the blob of a repository file.
func GetBlob(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/git/blobs/{sha} repository GetBlob
@ -30,12 +73,12 @@ func GetBlob(ctx *context.APIContext) {
// required: true
// - name: sha
// in: path
// description: sha of the commit
// description: sha of the blob to retrieve
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/GitBlobResponse"
// "$ref": "#/responses/GitBlob"
// "400":
// "$ref": "#/responses/error"
// "404":

View file

@ -231,11 +231,18 @@ type swaggerGitTreeResponse struct {
Body api.GitTreeResponse `json:"body"`
}
// GitBlobResponse
// swagger:response GitBlobResponse
type swaggerGitBlobResponse struct {
// GitBlob
// swagger:response GitBlob
type swaggerGitBlob struct {
// in: body
Body api.GitBlobResponse `json:"body"`
Body api.GitBlob `json:"body"`
}
// GitBlobList
// swagger:response GitBlobList
type swaggerGitBlobList struct {
// in: body
Body []api.GitBlob `json:"body"`
}
// Commit

View file

@ -313,6 +313,9 @@ func editUserCommon(ctx *context.Context) {
ctx.Data["DisableMigrations"] = setting.Repository.DisableMigrations
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
}
// EditUser show editing user page

View file

@ -50,6 +50,9 @@ func Settings(ctx *context.Context) {
ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess
ctx.Data["ContextUser"] = ctx.ContextUser
ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
err := shared_user.LoadHeaderCount(ctx)
if err != nil {

View file

@ -70,11 +70,6 @@ func Branches(ctx *context.Context) {
ctx.ServerError("LoadBranches", err)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
for key := range commitStatuses {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
}
}
commitStatus := make(map[string]*git_model.CommitStatus)
for commitID, cs := range commitStatuses {

View file

@ -16,7 +16,6 @@ import (
"forgejo.org/models/db"
git_model "forgejo.org/models/git"
repo_model "forgejo.org/models/repo"
unit_model "forgejo.org/models/unit"
user_model "forgejo.org/models/user"
"forgejo.org/modules/base"
"forgejo.org/modules/charset"
@ -84,7 +83,7 @@ func Commits(ctx *context.Context) {
ctx.ServerError("CommitsByRange", err)
return
}
ctx.Data["Commits"] = processGitCommits(ctx, commits)
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
@ -202,7 +201,7 @@ func SearchCommits(ctx *context.Context) {
return
}
ctx.Data["CommitCount"] = len(commits)
ctx.Data["Commits"] = processGitCommits(ctx, commits)
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
ctx.Data["Keyword"] = query
if all {
@ -267,7 +266,7 @@ func FileHistory(ctx *context.Context) {
}
}
ctx.Data["Commits"] = processGitCommits(ctx, commits)
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
@ -375,9 +374,6 @@ func Diff(ctx *context.Context) {
if err != nil {
log.Error("GetLatestCommitStatus: %v", err)
}
if !ctx.Repo.CanRead(unit_model.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, statuses)
}
ctx.Data["CommitStatus"] = git_model.CalcCommitStatus(statuses)
ctx.Data["CommitStatuses"] = statuses
@ -456,20 +452,6 @@ func RawDiff(ctx *context.Context) {
}
}
func processGitCommits(ctx *context.Context, gitCommits []*git.Commit) []*git_model.SignCommitWithStatuses {
commits := git_model.ConvertFromGitCommit(ctx, gitCommits, ctx.Repo.Repository)
if !ctx.Repo.CanRead(unit_model.TypeActions) {
for _, commit := range commits {
if commit.Status == nil {
continue
}
commit.Status.HideActionsURL(ctx)
git_model.CommitStatusesHideActionsURL(ctx, commit.Statuses)
}
}
return commits
}
func SetCommitNotes(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.CommitNotesForm)

View file

@ -654,7 +654,7 @@ func PrepareCompareDiff(
return false
}
commits := processGitCommits(ctx, ci.CompareInfo.Commits)
commits := git_model.ParseCommitsWithStatus(ctx, ci.CompareInfo.Commits, ctx.Repo.Repository)
ctx.Data["Commits"] = commits
ctx.Data["CommitCount"] = len(commits)

View file

@ -348,11 +348,6 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
ctx.ServerError("GetIssuesAllCommitStatus", err)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
for key := range commitStatuses {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
}
}
if err := issues.LoadAttributes(ctx); err != nil {
ctx.ServerError("issues.LoadAttributes", err)
@ -1799,15 +1794,6 @@ func ViewIssue(ctx *context.Context) {
ctx.ServerError("LoadPushCommits", err)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
for _, commit := range comment.Commits {
if commit.Status == nil {
continue
}
commit.Status.HideActionsURL(ctx)
git_model.CommitStatusesHideActionsURL(ctx, commit.Statuses)
}
}
} else if comment.Type == issues_model.CommentTypeAddTimeManual ||
comment.Type == issues_model.CommentTypeStopTracking ||
comment.Type == issues_model.CommentTypeDeleteTimeManual {

View file

@ -515,9 +515,6 @@ func PrepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue)
ctx.ServerError("GetLatestCommitStatus", err)
return nil
}
if !ctx.Repo.CanRead(unit.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
}
if len(commitStatuses) != 0 {
ctx.Data["LatestCommitStatuses"] = commitStatuses
@ -581,9 +578,6 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
ctx.ServerError("GetLatestCommitStatus", err)
return nil
}
if !ctx.Repo.CanRead(unit.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
}
if len(commitStatuses) > 0 {
ctx.Data["LatestCommitStatuses"] = commitStatuses
@ -677,9 +671,6 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
ctx.ServerError("GetLatestCommitStatus", err)
return nil
}
if !ctx.Repo.CanRead(unit.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
}
if len(commitStatuses) > 0 {
ctx.Data["LatestCommitStatuses"] = commitStatuses
@ -847,7 +838,7 @@ func ViewPullCommits(ctx *context.Context) {
ctx.Data["Username"] = ctx.Repo.Owner.Name
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
commits := processGitCommits(ctx, prInfo.Commits)
commits := git_model.ParseCommitsWithStatus(ctx, prInfo.Commits, ctx.Repo.Repository)
ctx.Data["Commits"] = commits
ctx.Data["CommitCount"] = len(commits)

View file

@ -693,9 +693,6 @@ func SearchRepo(ctx *context.Context) {
ctx.JSON(http.StatusInternalServerError, nil)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, latestCommitStatuses)
}
results := make([]*repo_service.WebSearchRepository, len(repos))
for i, repo := range repos {

View file

@ -64,6 +64,9 @@ func SettingsCtxData(ctx *context.Context) {
ctx.Data["DisableNewPushMirrors"] = setting.Mirror.DisableNewPush
ctx.Data["DefaultMirrorInterval"] = setting.Mirror.DefaultInterval
ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
signing, _ := asymkey_service.SigningKey(ctx, ctx.Repo.Repository.RepoPath())
ctx.Data["SigningKeyAvailable"] = len(signing) > 0

View file

@ -369,9 +369,6 @@ func loadLatestCommitData(ctx *context.Context, latestCommit *git.Commit) bool {
if err != nil {
log.Error("GetLatestCommitStatus: %v", err)
}
if !ctx.Repo.CanRead(unit_model.TypeActions) {
git_model.CommitStatusesHideActionsURL(ctx, statuses)
}
ctx.Data["LatestCommitStatus"] = git_model.CalcCommitStatus(statuses)
ctx.Data["LatestCommitStatuses"] = statuses

View file

@ -393,7 +393,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry)
ctx.ServerError("CommitsByFileAndRange", err)
return nil, nil
}
ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commitsHistory, ctx.Repo.Repository)
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commitsHistory, ctx.Repo.Repository)
pager := context.NewPagination(int(commitsCount), setting.Git.CommitsRangeSize, page, 5)
pager.SetDefaultParams(ctx)

View file

@ -16,7 +16,6 @@ import (
activities_model "forgejo.org/models/activities"
asymkey_model "forgejo.org/models/asymkey"
"forgejo.org/models/db"
git_model "forgejo.org/models/git"
issues_model "forgejo.org/models/issues"
"forgejo.org/models/organization"
repo_model "forgejo.org/models/repo"
@ -611,11 +610,6 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
ctx.ServerError("GetIssuesLastCommitStatus", err)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
for key := range commitStatuses {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
}
}
// -------------------------------
// Fill stats to post to ctx.Data.

View file

@ -13,10 +13,8 @@ import (
activities_model "forgejo.org/models/activities"
"forgejo.org/models/db"
git_model "forgejo.org/models/git"
issues_model "forgejo.org/models/issues"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unit"
"forgejo.org/modules/base"
"forgejo.org/modules/log"
"forgejo.org/modules/optional"
@ -311,11 +309,6 @@ func NotificationSubscriptions(ctx *context.Context) {
ctx.ServerError("GetIssuesAllCommitStatus", err)
return
}
if !ctx.Repo.CanRead(unit.TypeActions) {
for key := range commitStatuses {
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
}
}
ctx.Data["CommitLastStatus"] = lastStatus
ctx.Data["CommitStatuses"] = commitStatuses
ctx.Data["Issues"] = issues

View file

@ -51,6 +51,9 @@ func Profile(ctx *context.Context) {
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
ctx.Data["CommonPronouns"] = commonPronouns
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
ctx.HTML(http.StatusOK, tplSettingsProfile)
}

View file

@ -250,8 +250,25 @@ func GetContents(ctx context.Context, repo *repo_model.Repository, treePath, ref
return contentsResponse, nil
}
// GetBlobBySHA get the GitBlobResponse of a repository using a sha hash.
func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlobResponse, error) {
// GetBlobsBySHA gets multiple GitBlobs of a repository by sha hash.
func GetBlobsBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, shas []string) ([]*api.GitBlob, error) {
if len(shas) > setting.API.MaxResponseItems {
shas = shas[:setting.API.MaxResponseItems]
}
blobs := make([]*api.GitBlob, 0, len(shas))
for _, sha := range shas {
blob, err := GetBlobBySHA(ctx, repo, gitRepo, sha)
if err != nil {
return nil, err
}
blobs = append(blobs, blob)
}
return blobs, nil
}
// GetBlobBySHA get the GitBlob of a repository using a sha hash.
func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlob, error) {
gitBlob, err := gitRepo.GetBlob(sha)
if err != nil {
return nil, err
@ -263,7 +280,7 @@ func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git
return nil, err
}
}
return &api.GitBlobResponse{
return &api.GitBlob{
SHA: gitBlob.ID.String(),
URL: repo.APIURL() + "/git/blobs/" + url.PathEscape(gitBlob.ID.String()),
Size: gitBlob.Size(),

View file

@ -192,7 +192,7 @@ func TestGetBlobBySHA(t *testing.T) {
defer gitRepo.Close()
gbr, err := GetBlobBySHA(db.DefaultContext, repo, gitRepo, "65f1bf27bc3bf70f64657658635e66094edbcb4d")
expectedGBR := &api.GitBlobResponse{
expectedGBR := &api.GitBlob{
Content: "dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK",
Encoding: "base64",
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/blobs/65f1bf27bc3bf70f64657658635e66094edbcb4d",
@ -202,3 +202,43 @@ func TestGetBlobBySHA(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, expectedGBR, gbr)
}
func TestGetBlobsBySHA(t *testing.T) {
unittest.PrepareTestEnv(t)
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
gitRepo, err := gitrepo.OpenRepository(db.DefaultContext, repo)
require.NoError(t, err)
defer gitRepo.Close()
gbr, err := GetBlobsBySHA(db.DefaultContext, repo, gitRepo, []string{
"ea82fc8777a24b07c26b3a4bf4e2742c03733eab", // Home.md
"6395b68e1feebb1e4c657b4f9f6ba2676a283c0b", // line.svg
"26f842bcad37fa40a1bb34cbb5ee219ee35d863d", // test.xml
})
expectedGBR := []*api.GitBlob{
{
Content: "IyBIb21lIHBhZ2UKClRoaXMgaXMgdGhlIGhvbWUgcGFnZSEK",
Encoding: "base64",
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/ea82fc8777a24b07c26b3a4bf4e2742c03733eab",
SHA: "ea82fc8777a24b07c26b3a4bf4e2742c03733eab",
Size: 36,
},
{
Content: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CgogIDxsaW5lIHgxPSIwIiB5MT0iNyIgeDI9IjEwIiB5Mj0iNyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPC9zdmc+",
Encoding: "base64",
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/6395b68e1feebb1e4c657b4f9f6ba2676a283c0b",
SHA: "6395b68e1feebb1e4c657b4f9f6ba2676a283c0b",
Size: 246,
},
{
Content: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHRlc3Q+VGhpcyBpcyBYTUw8L3Rlc3Q+Cg==",
Encoding: "base64",
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/26f842bcad37fa40a1bb34cbb5ee219ee35d863d",
SHA: "26f842bcad37fa40a1bb34cbb5ee219ee35d863d",
Size: 64,
},
}
require.NoError(t, err)
assert.Equal(t, expectedGBR, gbr)
}

View file

@ -208,6 +208,7 @@
<div class="inline field tw-pl-4">
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
</div>
<div class="field">

View file

@ -94,6 +94,7 @@
<div class="inline field">
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
</div>
<div class="field">

View file

@ -56,6 +56,7 @@
<div class="inline field">
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
</div>
<div class="field">
<button class="ui primary button">{{ctx.Locale.Tr "settings.update_avatar"}}</button>

View file

@ -7616,6 +7616,49 @@
}
}
},
"/repos/{owner}/{repo}/git/blobs": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Gets multiplbe blobs of a repository.",
"operationId": "GetBlobs",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
},
{
"type": "string",
"description": "a comma separated list of blob-sha (mind the overall URL-length limit of ~2,083 chars)",
"name": "shas",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/GitBlobList"
},
"400": {
"$ref": "#/responses/error"
}
}
}
},
"/repos/{owner}/{repo}/git/blobs/{sha}": {
"get": {
"produces": [
@ -7643,7 +7686,7 @@
},
{
"type": "string",
"description": "sha of the commit",
"description": "sha of the blob to retrieve",
"name": "sha",
"in": "path",
"required": true
@ -7651,7 +7694,7 @@
],
"responses": {
"200": {
"$ref": "#/responses/GitBlobResponse"
"$ref": "#/responses/GitBlob"
},
"400": {
"$ref": "#/responses/error"
@ -24864,8 +24907,8 @@
},
"x-go-package": "forgejo.org/modules/structs"
},
"GitBlobResponse": {
"description": "GitBlobResponse represents a git blob",
"GitBlob": {
"description": "GitBlob represents a git blob",
"type": "object",
"properties": {
"content": {
@ -29119,10 +29162,19 @@
"$ref": "#/definitions/GeneralUISettings"
}
},
"GitBlobResponse": {
"description": "GitBlobResponse",
"GitBlob": {
"description": "GitBlob",
"schema": {
"$ref": "#/definitions/GitBlobResponse"
"$ref": "#/definitions/GitBlob"
}
},
"GitBlobList": {
"description": "GitBlobList",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/GitBlob"
}
}
},
"GitHook": {

View file

@ -138,6 +138,7 @@
<div class="inline field tw-pl-4">
<label for="new-avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
<input id="new-avatar" name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
</div>
<div class="field">

View file

@ -37,7 +37,7 @@ func TestAPIReposGitBlobs(t *testing.T) {
// Test a public repo that anyone can GET the blob of
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/blobs/%s", user2.Name, repo1.Name, repo1ReadmeSHA)
resp := MakeRequest(t, req, http.StatusOK)
var gitBlobResponse api.GitBlobResponse
var gitBlobResponse api.GitBlob
DecodeJSON(t, resp, &gitBlobResponse)
assert.NotNil(t, gitBlobResponse)
expectedContent := "dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK"

View file

@ -32,10 +32,15 @@ func TestPatchStatus(t *testing.T) {
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
session := loginUser(t, user2.Name)
var objectFormat optional.Option[string]
if git.SupportHashSha256 {
objectFormat = optional.Some("sha256")
}
repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, user2, tests.DeclarativeRepoOptions{
AutoInit: optional.Some(true),
EnabledUnits: optional.Some([]unit_model.Type{unit_model.TypeCode}),
ObjectFormat: optional.Some("sha256"),
ObjectFormat: objectFormat,
Files: optional.Some([]*files_service.ChangeRepoFile{
{
Operation: "create",

View file

@ -25,6 +25,10 @@ import (
)
func TestRepoSSHSignedTags(t *testing.T) {
if git.CheckGitVersionAtLeast("2.34") != nil {
t.Skip("Skipping, does not support SSH signing")
return
}
defer tests.PrepareTestEnv(t)()
// Preparations

View file

@ -155,3 +155,51 @@ func TestSettingSecurityAuthSource(t *testing.T) {
assert.Contains(t, resp.Body.String(), `gitlab-active`)
assert.Contains(t, resp.Body.String(), `gitlab-inactive`)
}
func TestUserAvatarSizeNotice(t *testing.T) {
defer tests.PrepareTestEnv(t)()
session := loginUser(t, "user1")
req := NewRequest(t, "GET", "/user/settings")
resp := session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
assert.Contains(t,
htmlDoc.doc.Find("form div:has(input#new-avatar) .help").Text(),
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
}
func TestRepoAvatarSizeNotice(t *testing.T) {
defer tests.PrepareTestEnv(t)()
session := loginUser(t, "user2")
req := NewRequest(t, "GET", "/user2/repo1/settings")
resp := session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
assert.Contains(t,
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
}
func TestOrgAvatarSizeNotice(t *testing.T) {
defer tests.PrepareTestEnv(t)()
session := loginUser(t, "user2")
req := NewRequest(t, "GET", "/org/org3/settings")
resp := session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
assert.Contains(t,
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
}
func TestAdminAvatarSizeNotice(t *testing.T) {
defer tests.PrepareTestEnv(t)()
session := loginUser(t, "user1")
req := NewRequest(t, "GET", "/admin/users/2/edit")
resp := session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
assert.Contains(t,
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
}

View file

@ -42,6 +42,10 @@ func TestInstanceSigning(t *testing.T) {
defer test.MockProtect(&setting.Repository.Signing.CRUDActions)()
t.Run("SSH", func(t *testing.T) {
if git.CheckGitVersionAtLeast("2.34") != nil {
t.Skip("Skipping, does not support git SSH signing")
return
}
defer tests.PrintCurrentTest(t)()
pubKeyContent, err := os.ReadFile("tests/integration/ssh-signing-key.pub")

View file

@ -494,12 +494,12 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.15.30",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz",
"integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==",
"version": "24.0.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz",
"integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
"undici-types": "~7.8.0"
}
},
"node_modules/@types/vinyl": {
@ -1086,9 +1086,9 @@
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@ -1249,9 +1249,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001721",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
"integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
"version": "1.0.30001723",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
"integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
"funding": [
{
"type": "opencollective",
@ -1969,9 +1969,9 @@
}
},
"node_modules/editorconfig/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@ -2005,9 +2005,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.165",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
"integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
"version": "1.5.167",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz",
"integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@ -5019,9 +5019,9 @@
}
},
"node_modules/js-beautify/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@ -8226,9 +8226,9 @@
}
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
"license": "MIT"
},
"node_modules/union-value": {