Compare commits

...

107 commits

Author SHA1 Message Date
Matthias Riße
1f4fe5bfe6 Use annexed content for comparison in diffs (#57)
Some checks failed
/ build-oci-image (rootful) (push) Has been cancelled
/ build-oci-image (rootless) (push) Has been cancelled
/ release (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
This makes it such that annexed files are treated like plain git files
in comparisons (e.g. the diff of a commit).

It also changes the image diff viewer to show a more reasonable error
message when one of the annexed files under comparison is missing.

Fixes #56.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/57
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-31 00:43:20 +00:00
Matthias Riße
e118cb9485 Invalidate outdated annex UUID cache entries (#60)
Some checks are pending
/ build-oci-image (rootful) (push) Waiting to run
/ build-oci-image (rootless) (push) Waiting to run
/ release (push) Waiting to run
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
The previous implementation could lead to errors e.g. when a repository
was removed and a new one with a new UUID was created under the same
name. This now checks the validity of the retrieved cache entry every
time and invalidates the cache if necessary.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/60
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-30 16:44:59 +00:00
Matthias Riße
1fc2fcd438 Pre-populate the git-annex UUID cache at startup (#59)
This eliminates the wait time for the first p2phttp connection since
server startup at the cost of adding that time to the startup itself.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/59
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-30 10:50:48 +00:00
Michael Kriese
b0a9f56508 ci: fix go version check (#6646)
Some checks failed
/ build-oci-image (rootful) (push) Has been cancelled
/ build-oci-image (rootless) (push) Has been cancelled
Integration tests for the release process / release-simulation (push) Has been cancelled
/ release (push) Has been cancelled
testing / backend-checks (push) Has been cancelled
testing / frontend-checks (push) Has been cancelled
testing / test-unit (push) Has been cancelled
testing / test-e2e (push) Has been cancelled
testing / test-remote-cacher (redis) (push) Has been cancelled
testing / test-remote-cacher (valkey) (push) Has been cancelled
testing / test-remote-cacher (garnet) (push) Has been cancelled
testing / test-remote-cacher (redict) (push) Has been cancelled
testing / test-mysql (push) Has been cancelled
testing / test-pgsql (push) Has been cancelled
testing / test-sqlite (push) Has been cancelled
testing / security-check (push) Has been cancelled
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6646
2025-01-27 15:27:03 +01:00
Matthias Riße
05daede0ef Cache git-annex UUID to repository path mappings (#54)
Always walking the filesystem and searching for UUIDs slowed p2phttp
operations down significantly on a production server with more than a
handful of repositories. This caching strategy ensures that only the
first call is rather slow, and subsequent ones should be much faster.

This should better be implemented as a background job, but for now this
is a simple solution to the problem.

Fixes #53.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/54
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
fa5b158a5a Explicitly set http(s) default ports in annex.url (#55)
Otherwise, git-annex tries to use its own default port (9417) and fails.

Fixes #52.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/55
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
ede91562df Fix Forgejo version in published OCI images (#51)
The Forgejo version is derived from the git history, so the image build
needs to happen in the context of a full repository clone.

Also, the post-processing of the version string needs to remove the
second occurrence of "-g", as the first one is now part of the added
"-git-annex" part.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/51
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
525eadc70e Add an OCI image build and publish workflow (#50)
Fixes #49.

Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/50
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
4bc7f3df34 Simplify git blob to annex key lookup (#43)
Fixes #27.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/43
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
fa7d976b2e Add git-annex p2phttp support (#42)
This adds a new endpoint under `/git-annex-p2phttp` which acts as an
authenticating proxy to git-annex' p2phttp server. This makes it
possible to set `annex+<server-url>/git-annex-p2phttp` as
`remote.<name>.annexurl` and use git-annex fully over http(s) with the
normal credentials and access tokens provided by Forgejo.

Fixes #25.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/42
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
319b4fc997 Add tests for git annex drop (#47)
This adds some rudimentary tests that drop files in a repository's clone
as well as from a repository on Forgejo.

Fixes #4.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/47
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
790fc7c792 Add git-annex' testremote to the test suite (#48)
The `git annex testremote` command runs a built-in set of tests against
a remote. It cannot hurt to check our implementation of a git-annex
remote against it too.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/48
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
989949b5cc Only upload to annex in doAnnexUploadTest (#46)
The previous implementation both uploaded to the annex and pushed to the
git repository. This meant that the tests checking that uploads without
permission fail actually could pass when the git push failed but the
git-annex upload didn't. The tests didn't catch the situation where
unauthorized users could modify the annex.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/46
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
8af2afa30f Use PATH when looking for git commands (#44)
This fixes some issues when using a git-annex that is installed in a
different location than where git is installed, e.g. when using the
git-annex-standalone release or one installed with nix.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/44
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
ad7e1e7a9f Allow anonymous HEAD requests to annex/objects (#41)
Git-annex emits HEAD requests for keys while trying to drop them from a
repository that was cloned via http. Forgejo asked for authentication
for these HEAD requests. This meant that cloning and getting files was
possible without authentication, but dropping was not.

Since the response to a HEAD request is a subset of the response to a
GET request it is safe to make those unauthenticated as well. That is
what this change does, although limited to the
:username/:reponame/annex/objects endpoint.

Fixes #40.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/41
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Michael Hanke
7a03796fe5 Elevate external markup renderer interface for annexed file content (#36)
Previously, an external renderer that matched on an annexed file would
only see its content streamed via `STDIN`, or a temporary file with a copy
of its content would be generated and passed-by-filepath (with
`IS_INPUT_FILE=true`). Whether that happens, is also subject to
`MAX_DISPLAY_FILE_SIZE` (which defaults to 8MB).

This was problematic, because annexed files tend to be large. Moreover,
if present, they already exist as write-protected files on the
file-system. Creating a copy is both expensive and serves no particular
purpose.

This commit changes how external renderers are called.

1) With `IS_INPUT_FILE=true`, the renderer is passed the true location
   of an annex key, if present, and an empty path, if not.
2) The original, repository-relative path of the rendering target is
   made available to the renderer via the `GITEA_RELATIVE_PATH`
   environment variable.

To achieve a lean implementation, the `Blob` of the rendering target
is passed on to the `RenderContext` (because the implementation of
the annex-related functionality is centered on this dtype.

This change makes it less costly to increase `MAX_DISPLAY_FILE_SIZE`,
in order to make large, annexed files eligible for markup rendering,
because no content copies will be made any longer.

External renderers can now use the original file path, with the full
original filename, including extensions, for decision making. For
example, to detect particular compression formats based in a file name
extension, or to alter the rendering based on contextual information
encoded in the file path (e.g., a multi-file data structure with a
particular organization pattern).

Apart from the additional environment variable, there is no change to
the handling of renderers that take their input via `STDIN` (i.e.,
`IS_INPUT_FILE=false`).

Fixes #35.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/36
Reviewed-by: matrss <matrss@noreply.codeberg.org>
Co-authored-by: Michael Hanke <michael.hanke@gmail.com>
Co-committed-by: Michael Hanke <michael.hanke@gmail.com>
2025-01-27 10:44:01 +01:00
Matthias Riße
b643725cb6 Change the icon for annexed files to file-binary (#29)
Fixes #26.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/29
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
5891313b0b Improve views for annexed but missing files (#28)
Previously, trying to view files that were annexed, but missing, just
led to an uninformative error 500. This was rather confusing.

With these changes it now shows the pointer target instead of the
(missing) content of the file, and also indicates this situation in the
"stored with git-annex" message. For semantic correctness views for
missing files return a 404 instead of a 200, as they would with the
content present.

Fixes #7, fixes #13.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/28
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Michael Hanke
6a3858160f Add git-annex also to the rootless container (#24)
Same as 89f8aa0bf5, but for the rootless container.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/24
Reviewed-by: matrss <matrss@noreply.codeberg.org>
Co-authored-by: Michael Hanke <michael.hanke@gmail.com>
Co-committed-by: Michael Hanke <michael.hanke@gmail.com>
2025-01-27 10:44:01 +01:00
Matthias Riße
5fdcb8a7a1 Git-annex web uploads (#21)
This implements support for uploading files into the annex using the web
interface.

If a repository is a git-annex-enabled repository all files will be
added to it using git annex add. This means that the repository's
configuration for what to put into the annex (annex.largefiles in
gitattributes) will be respected.

Plain git repositories without git-annex will work as before, directly
uploading to git.

Fixes #5.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/21
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:44:01 +01:00
Matthias Riße
83f8fdb142 Error if git-annex is enabled but missing (#16)
Copied from https://github.com/neuropoly/gitea/pull/47

This adds a check so that if `setting.Annex.Enabled` is true and git-annex is not in the PATH Forgejo will abort on startup with a reasonable error message.

Fixes #15.

Reviewed-on: https://codeberg.org/matrss/forgejo-aneksajo/pulls/16
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:42:20 +01:00
Matthias Riße
a5e712f002 Add git-annex to docker image 2025-01-27 10:42:20 +01:00
Matthias Riße
4c12a2ecee Adapt patch to upstream changes
Test with different objectFormats.
2025-01-27 10:42:20 +01:00
Nick
9ffebb2f84 git-annex: views for annex files
This updates the repo index/file view endpoints so annex files match the way
LFS files are rendered, making annexed files accessible via the web instead of
being black boxes only accessible by git clone.

This mostly just duplicates the existing LFS logic. It doesn't try to combine itself
with the existing logic, to make merging with upstream easier. If upstream ever
decides to accept, I would like to try to merge the redundant logic.

The one bit that doesn't directly copy LFS is my choice to hide annex-symlinks.
LFS files are always _pointer files_ and therefore always render with the "file"
icon and no special label, but annex files come in two flavours: symlinks or
pointer files. I've conflated both kinds to try to give a consistent experience.

The tests in here ensure the correct download link (/media, from the last PR)
renders in both the toolbar and, if a binary file (like most annexed files will be),
in the main pane, but it also adds quite a bit of code to make sure text files
that happen to be annexed are dug out and rendered inline like LFS files are.
2025-01-27 10:42:20 +01:00
Matthias Riße
ce1660d41b Adapt patch to upstream changes
Use tests.FileCmp instead of util.FileCmp.
2025-01-27 10:42:20 +01:00
Matthias Riße
db5eaa1a24 Adapt patch to upstream changes
Test with different objectFormats.
2025-01-27 10:42:20 +01:00
Nick
7ed9add4c5 git-annex: make /media/ download annexed content
Previously, Gitea's LFS support allowed direct-downloads of LFS content,
via http://$HOSTNAME:$PORT/$USER/$REPO/media/branch/$BRANCH/$FILE
Expand that grace to git-annex too. Now /media should provide the
relevant *content* from the .git/annex/objects/ folder.

This adds tests too. And expands the tests to try symlink-based annexing,
since /media implicitly supports both that and pointer-file-based annexing.
2025-01-27 10:42:20 +01:00
Matthias Riße
cb218de0d2 Adapt patch to upstream changes
The git repository must be closed after using it. Without this change
some tests started to fail due to the lingering repository running into
a timeout.
2025-01-27 10:42:20 +01:00
Nick
5651c5a69d git-annex: create modules/annex
This moves the `annexObjectPath()` helper out of the tests and into a
dedicated sub-package as `annex.ContentLocation()`, and expands it with
`.Pointer()` (which validates using `git annex examinekey`),
`.IsAnnexed()` and `.Content()` to make it a more useful module.

The tests retain their own wrapper version of `ContentLocation()`
because I tried to follow close to the API modules/lfs uses, which in
terms of abstract `git.Blob` and `git.TreeEntry` objects, not in terms
of `repoPath string`s which are more convenient for the tests.
2025-01-27 10:42:20 +01:00
Matthias Riße
0371c78a77 Adapt patch to upstream changes
The "context_service" import was changed to use the default name of just
"context". The patch set had to be adapted for that.
2025-01-27 10:42:20 +01:00
Matthias Riße
768a3a9c83 Adapt patch to upstream changes
Usage of `path` was replaced by `path/filepath` in upstream forgejo, and
it made sense to use that as well where `path` was previously used. The
`setHeaderCacheForever` function and the `sendFile` method had their
signature changed.
2025-01-27 10:42:20 +01:00
Matthias Riße
f863511a14 Fix exit code check for git command
The err.IsExitCode method was changed to a function IsErrorExitCode
taking err as its first argument in
1e7a6483b8.
2025-01-27 10:42:20 +01:00
Matthias Riße
0bdc572df9 Replace m.GetOptions with m.Methods
This applies the same changes that were done in
265cd70bdb to the git-annex specific
routes as well.
2025-01-27 10:42:20 +01:00
Nick
48f21fd213 git-annex: support downloading over HTTP
This makes HTTP symmetric with SSH clone URLs.

This gives us the fancy feature of _anonymous_ downloads,
so people can access datasets without having to set up an
account or manage ssh keys.

Previously, to access "open access" data shared this way,
users would need to:

  1. Create an account on gitea.example.com
  2. Create ssh keys
  3. Upload ssh keys (and make sure to find and upload the correct file)
  4. `git clone git@gitea.example.com:user/dataset.git`
  5. `cd dataset`
  6. `git annex get`

This cuts that down to just the last three steps:

  1. `git clone https://gitea.example.com/user/dataset.git`
  2. `cd dataset`
  3. `git annex get`

This is significantly simpler for downstream users, especially for those
unfamiliar with the command line.

Unfortunately there's no uploading. While git-annex supports uploading
over HTTP to S3 and some other special remotes, it seems to fail on a
_plain_ HTTP remote. See https://github.com/neuropoly/gitea/issues/7
and https://git-annex.branchable.com/forum/HTTP_uploads/#comment-ce28adc128fdefe4c4c49628174d9b92.

This is not a major loss since no one wants uploading to be anonymous anyway.

To support private repos, I had to hunt down and patch a secret extra security
corner that Gitea only applies to HTTP for some reason (services/auth/basic.go).

This was guided by https://git-annex.branchable.com/tips/setup_a_public_repository_on_a_web_site/

Fixes https://github.com/neuropoly/gitea/issues/3

Co-authored-by: Mathieu Guay-Paquet <mathieu.guaypaquet@polymtl.ca>
2025-01-27 10:42:20 +01:00
Nick
ffae358704 git-annex: add configuration setting [annex].ENABLED
Fixes https://github.com/neuropoly/gitea/issues/8

Co-authored-by: Mathieu Guay-Paquet <mathieu.guaypaquet@gmail.com>
2025-01-27 10:42:20 +01:00
Matthias Riße
ca881e7e31 Fix failing tests
Multiple tests that worked fine on v1.20.4-1 started to fail after the
rebase onto v1.20.5-1. These tests are:
- TestGitAnnexPermissions/Private/Owner/HTTP/Init
- TestGitAnnexPermissions/Private/Owner/HTTP/Download
- TestGitAnnexPermissions/Private/Writer/HTTP/Init
- TestGitAnnexPermissions/Private/Writer/HTTP/Download
- TestGitAnnexPermissions/Private/Reader/HTTP/Init
- TestGitAnnexPermissions/Private/Reader/HTTP/Download

What these tests have in common is that they all operate on a private
repository via http with authentication.

They broke at some point between v1.20.4-1 and v1.20.5-1, so I did a
bisect between these two points running the offending tests. This
brought me to the conclusion that
ee48c0d5ea introduced the issue.

The thing is, this commit does not change any code, it only changes the
test environment. Among other things that didn't look as suspicious, it
changes the container image from a bespoke test_env image based on
debian bullseye to a node image based on debian bookworm. Obviously,
this means that there are many version differences between the two.

The first one I looked at was git. The previous bullseye image used a
manually installed git version 2.40.0, while the bookworm image has
2.39.2 installed. Updating git in the new image did not fix the issue,
however.

The next thing I looked at was the git-annex version. Bullseye had
8.20210223 installed and worked, while bookworm used 10.20230126 when
the tests broke. So I tried my luck upgrading to a more recent version
via neurodebian (10.20240227-1~ndall+1). This still worked fine on
bullseye and now also works fine on bookworm.

I have no idea why this specific version of git-annex broke the tests,
but at least there was a commit to pinpoint this to, which isn't always
the case with docker images silently changing beneath you...

Below are the versions as they are reported by git and git-annex:

bullseye (works):

    git version 2.30.2
    git-annex version: 8.20210223
    build flags: Assistant Webapp Pairing Inotify DBus DesktopNotify TorrentParser MagicMime Feeds Testsuite S3 WebDAV
    dependency versions: aws-0.22 bloomfilter-2.0.1.0 cryptonite-0.26 DAV-1.3.4 feed-1.3.0.1 ghc-8.8.4 http-client-0.6.4.1 persistent-sqlite-2.10.6.2 torrent-10000.1.1 uuid-1.3.13 yesod-1.6.1.0
    key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 BLAKE2B256E BLAKE2B256 BLAKE2B512E BLAKE2B512 BLAKE2B160E BLAKE2B160 BLAKE2B224E BLAKE2B224 BLAKE2B384E BLAKE2B384 BLAKE2BP512E BLAKE2BP512 BLAKE2S256E BLAKE2S256 BLAKE2S160E BLAKE2S160 BLAKE2S224E BLAKE2S224 BLAKE2SP256E BLAKE2SP256 BLAKE2SP224E BLAKE2SP224 SHA1E SHA1 MD5E MD5 WORM URL X*
    remote types: git gcrypt p2p S3 bup directory rsync web bittorrent webdav adb tahoe glacier ddar git-lfs httpalso borg hook external
    operating system: linux x86_64
    supported repository versions: 8
    upgrade supported from repository versions: 0 1 2 3 4 5 6 7

bullseye + git-annex from neurodebian (works):

    git version 2.30.2
    git-annex version: 10.20240227-1~ndall+1
    build flags: Assistant Webapp Pairing Inotify DBus DesktopNotify TorrentParser MagicMime Benchmark Feeds Testsuite S3 WebDAV
    dependency versions: aws-0.22.1 bloomfilter-2.0.1.0 cryptonite-0.29 DAV-1.3.4 feed-1.3.2.1 ghc-9.0.2 http-client-0.7.13.1 persistent-sqlite-2.13.1.0 torrent-10000.1.1 uuid-1.3.15 yesod-1.6.2.1
    key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 BLAKE2B256E BLAKE2B256 BLAKE2B512E BLAKE2B512 BLAKE2B160E BLAKE2B160 BLAKE2B224E BLAKE2B224 BLAKE2B384E BLAKE2B384 BLAKE2BP512E BLAKE2BP512 BLAKE2S256E BLAKE2S256 BLAKE2S160E BLAKE2S160 BLAKE2S224E BLAKE2S224 BLAKE2SP256E BLAKE2SP256 BLAKE2SP224E BLAKE2SP224 SHA1E SHA1 MD5E MD5 WORM URL X*
    remote types: git gcrypt p2p S3 bup directory rsync web bittorrent webdav adb tahoe glacier ddar git-lfs httpalso borg hook external
    operating system: linux x86_64
    supported repository versions: 8 9 10
    upgrade supported from repository versions: 0 1 2 3 4 5 6 7 8 9 10

bookworm (fails):

    git version 2.39.2
    git-annex version: 10.20230126
    build flags: Assistant Webapp Pairing Inotify DBus DesktopNotify TorrentParser MagicMime Benchmark Feeds Testsuite S3 WebDAV
    dependency versions: aws-0.22.1 bloomfilter-2.0.1.0 cryptonite-0.29 DAV-1.3.4 feed-1.3.2.1 ghc-9.0.2 http-client-0.7.13.1 persistent-sqlite-2.13.1.0 torrent-10000.1.1 uuid-1.3.15 yesod-1.6.2.1
    key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 BLAKE2B256E BLAKE2B256 BLAKE2B512E BLAKE2B512 BLAKE2B160E BLAKE2B160 BLAKE2B224E BLAKE2B224 BLAKE2B384E BLAKE2B384 BLAKE2BP512E BLAKE2BP512 BLAKE2S256E BLAKE2S256 BLAKE2S160E BLAKE2S160 BLAKE2S224E BLAKE2S224 BLAKE2SP256E BLAKE2SP256 BLAKE2SP224E BLAKE2SP224 SHA1E SHA1 MD5E MD5 WORM URL X*
    remote types: git gcrypt p2p S3 bup directory rsync web bittorrent webdav adb tahoe glacier ddar git-lfs httpalso borg hook external
    operating system: linux x86_64
    supported repository versions: 8 9 10
    upgrade supported from repository versions: 0 1 2 3 4 5 6 7 8 9 10

bookworm + git-annex from neurodebian (works):

    git version 2.39.2
    git-annex version: 10.20240227-1~ndall+1
    build flags: Assistant Webapp Pairing Inotify DBus DesktopNotify TorrentParser MagicMime Benchmark Feeds Testsuite S3 WebDAV
    dependency versions: aws-0.22.1 bloomfilter-2.0.1.0 cryptonite-0.29 DAV-1.3.4 feed-1.3.2.1 ghc-9.0.2 http-client-0.7.13.1 persistent-sqlite-2.13.1.0 torrent-10000.1.1 uuid-1.3.15 yesod-1.6.2.1
    key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 BLAKE2B256E BLAKE2B256 BLAKE2B512E BLAKE2B512 BLAKE2B160E BLAKE2B160 BLAKE2B224E BLAKE2B224 BLAKE2B384E BLAKE2B384 BLAKE2BP512E BLAKE2BP512 BLAKE2S256E BLAKE2S256 BLAKE2S160E BLAKE2S160 BLAKE2S224E BLAKE2S224 BLAKE2SP256E BLAKE2SP256 BLAKE2SP224E BLAKE2SP224 SHA1E SHA1 MD5E MD5 WORM URL X*
    remote types: git gcrypt p2p S3 bup directory rsync web bittorrent webdav adb tahoe glacier ddar git-lfs httpalso borg hook external
    operating system: linux x86_64
    supported repository versions: 8 9 10
    upgrade supported from repository versions: 0 1 2 3 4 5 6 7 8 9 10
2025-01-27 10:42:20 +01:00
Matthias Riße
7b7c804ea4 Install git-annex in the testing workflow 2025-01-27 10:42:20 +01:00
Matthias Riße
8cd079ae15 Adapt patch to upstream changes 2025-01-27 10:42:20 +01:00
Matthias Riße
90f53a4e7c Adapt patch to upstream changes
A dead code check started to complain because FileCmp was only used in
tests. Moved the function to test_utils.
2025-01-27 10:42:20 +01:00
Matthias Riße
b5fc00042b Adapt patch to upstream changes
Repository creation now expects an objectFormat to be specified for git.
2025-01-27 10:42:20 +01:00
Nick
b3fe6dc4a1 git-annex tests
Fixes https://github.com/neuropoly/gitea/issues/11

Tests:

* `git annex init`
* `git annex copy --from origin`
* `git annex copy --to origin`

over:

* ssh

for:

* the owner
* a collaborator
* a read-only collaborator
* a stranger

in a

* public repo
* private repo

And then confirms:

* Deletion of the remote repo (to ensure lockdown isn't messing with us: https://git-annex.branchable.com/internals/lockdown/#comment-0cc5225dc5abe8eddeb843bfd2fdc382)

------

To support all this:

* Add util.FileCmp()
* Patch withKeyFile() so it can be nested in other copies of itself

-------

Many thanks to Mathieu for giving style tips and catching several bugs,
including a subtle one in util.filecmp() which neutered it.

Co-authored-by: Mathieu Guay-Paquet <mathieu.guay-paquet@polymtl.ca>
Co-authored-by: Matthias Riße <m.risse@fz-juelich.de>
2025-01-27 10:41:41 +01:00
Nick Guenther
d1788bd267 git-annex support
[git-annex](https://git-annex.branchable.com/) is a more complicated cousin to
git-lfs, storing large files in an optional-download side content.  Unlike lfs,
it allows mixing and matching storage remotes, so the content remote(s) doesn't
need to be on the same server as the git remote, making it feasible to scatter
a collection across cloud storage, old harddrives, or anywhere else storage can
be scavenged.  Since this can get complicated, fast, it has a content-tracking
database (`git annex whereis`) to help find everything later.

The use-case we imagine for including it in Gitea is just the simple case, where
we're primarily emulating git-lfs: each repo has its large content at the same URL.

Our motivation is so we can self-host https://www.datalad.org/ datasets, which
currently are only hostable by fragilely scrounging together cloud storage --
and having to manage all the credentials associated with all the pieces -- or at
https://openneuro.org which is fragile in its own ways.

Supporting git-annex also allows multiple Gitea instance to be annex remotes for
each other, mirroring the content or otherwise collaborating the split up the
hosting costs.

Enabling
--------

TODO

HTTP
----

TODO

Permission Checking
-------------------

This tweaks the API in routers/private/serv.go to expose the calling user's
computed permission, instead of just returning HTTP 403.

This doesn't fit in super well. It's the opposite from how the git-lfs support is
done, where there's a complete list of possible subcommands and their matching
permission levels, and then the API compares the requested with the actual level
and returns HTTP 403 if the check fails.

But it's necessary. The main git-annex verbs, 'git-annex-shell configlist' and
'git-annex-shell p2pstdio' are both either read-only or read-write operations,
depending on the state on disk on either end of the connection and what the user
asked it to ask for, with no way to know before git-annex examines the situation.
So tell the level via GIT_ANNEX_READONLY and trust it to handle itself.

In the older Gogs version, the permission was directly read in cmd/serv.go:

```
mode, err = db.UserAccessMode(user.ID, repo)
```
- 966e925cf3/internal/cmd/serv.go (L334)

but in Gitea permission enforcement has been centralized in the API layer.
(perhaps so the cmd layer can avoid making direct DB connections?)

Deletion
--------

git-annex has this "lockdown" feature where it tries
really quite very hard to prevent you deleting its
data, to the point that even an rm -rf won't do it:
each file in annex/objects/ is nested inside a
folder with read-only permissions.

The recommended workaround is to run chmod -R +w when
you're sure you actually want to delete a repo. See
https://git-annex.branchable.com/internals/lockdown

So we edit util.RemoveAll() to do just that, so now
it's `chmod -R +w && rm -rf` instead of just `rm -rf`.
2025-01-20 18:04:24 +01:00
Matthias Riße
b3f62a9af2 Fix name in package-lock.json
The frontend-checks job started failing because the declared name does
not match the repository name.
2025-01-20 18:04:24 +01:00
Matthias Riße
6020be2c8a Run testing workflow unconditionally 2025-01-20 18:04:17 +01:00
forgejo-backport-action
39843ee2b3 [v10.0/forgejo] fix: avoid Gitea migration warnings (take 2) (#6578)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/6577

274bc480b4 introduced a regression in https://codeberg.org/forgejo/forgejo/pulls/6343

Trying to remove fields that have already been removed by

dd1523c72e/models/forgejo_migrations/v14.go

Is a noop for SQLite and went undetected by the upgrade tests.

Fixes: https://codeberg.org/forgejo/forgejo/issues/6575
Co-authored-by: Earl Warren <contact@earl-warren.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6578
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-01-15 22:48:56 +00:00
Earl Warren
3b7ed0cda2 [v10.0/forgejo] chore(ci): upgrade forgejo-build-publish/build@v5.3.1 (#6574)
**Backport**: https://codeberg.org/forgejo/forgejo/pulls/6573

So that it does not use docker.io

(cherry picked from commit 69ce414f7e39559a804c9fd23b25146f7b281250)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6574
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Earl Warren <contact@earl-warren.org>
Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-01-15 21:36:53 +00:00
Renovate Bot
2b1e74a76f Update module github.com/alecthomas/chroma/v2 to v2.15.0 (v10.0/forgejo) (#6553)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) | require | minor | `v2.14.0` -> `v2.15.0` |

---

### Release Notes

<details>
<summary>alecthomas/chroma (github.com/alecthomas/chroma/v2)</summary>

### [`v2.15.0`](https://github.com/alecthomas/chroma/releases/tag/v2.15.0)

[Compare Source](https://github.com/alecthomas/chroma/compare/v2.14.0...v2.15.0)

#### What's Changed

-   AQL: Add builtin functions introduced in v3.12 by [@&#8203;Simran-B](https://github.com/Simran-B) in https://github.com/alecthomas/chroma/pull/968
-   chore(styles): add evergarden inspired style by [@&#8203;comfysage](https://github.com/comfysage) in https://github.com/alecthomas/chroma/pull/970
-   chore(deps): update dependency svu to v2 by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/971
-   chore(deps): update dependency watchexec to v2 by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/962
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/955
-   styles: Fix Gleam alias by [@&#8203;jmooring](https://github.com/jmooring) in https://github.com/alecthomas/chroma/pull/973
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/974
-   chore(deps): update dependency python3 to v3.12.3 by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/976
-   added the nordic theme via chroma/styles/nordic.xml by [@&#8203;avih7531](https://github.com/avih7531) in https://github.com/alecthomas/chroma/pull/977
-   Update the Materialize lexer by [@&#8203;arusahni](https://github.com/arusahni) in https://github.com/alecthomas/chroma/pull/978
-   feat(lexers/hare): add done keyword by [@&#8203;wackbyte](https://github.com/wackbyte) in https://github.com/alecthomas/chroma/pull/979
-   pygments2chroma: escape regex.words by [@&#8203;oliverpool](https://github.com/oliverpool) in https://github.com/alecthomas/chroma/pull/982
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/981
-   Add JSONata Lexer by [@&#8203;DevDimov](https://github.com/DevDimov) in https://github.com/alecthomas/chroma/pull/983
-   Go lexer: single line comment without consuming endline, disable EnsureNL by [@&#8203;msorc](https://github.com/msorc) in https://github.com/alecthomas/chroma/pull/984
-   Update the Materialize lexer by [@&#8203;arusahni](https://github.com/arusahni) in https://github.com/alecthomas/chroma/pull/987
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/985
-   Add Gleam to README by [@&#8203;Nicd](https://github.com/Nicd) in https://github.com/alecthomas/chroma/pull/990
-   Port Minecraft lexers from Pygments by [@&#8203;kofuk](https://github.com/kofuk) in https://github.com/alecthomas/chroma/pull/992
-   Don't output extra whitespace in YAML multiline by [@&#8203;Gusted](https://github.com/Gusted) in https://github.com/alecthomas/chroma/pull/993
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/991
-   add beef syntax and tests by [@&#8203;Booklordofthedings](https://github.com/Booklordofthedings) in https://github.com/alecthomas/chroma/pull/995
-   Update GitHub light color palette by [@&#8203;konradreiche](https://github.com/konradreiche) in https://github.com/alecthomas/chroma/pull/998
-   chore(deps): update module github.com/alecthomas/kong to v1 by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/999
-   Update the Materialize lexer by [@&#8203;arusahni](https://github.com/arusahni) in https://github.com/alecthomas/chroma/pull/1001
-   Update TypeScript lexer to allow nested generics by [@&#8203;fredrare](https://github.com/fredrare) in https://github.com/alecthomas/chroma/pull/1002
-   Pager friendly terminal formatting by [@&#8203;walles](https://github.com/walles) in https://github.com/alecthomas/chroma/pull/1006
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/997
-   Add Typst Lexer by [@&#8203;oliverpool](https://github.com/oliverpool) in https://github.com/alecthomas/chroma/pull/1007
-   Add Jsonnet Lexer by [@&#8203;jolheiser](https://github.com/jolheiser) in https://github.com/alecthomas/chroma/pull/1011
-   fix: add underscore parsing in numbers for haskell by [@&#8203;Gusted](https://github.com/Gusted) in https://github.com/alecthomas/chroma/pull/1020
-   Add CSV lexer by [@&#8203;walles](https://github.com/walles) in https://github.com/alecthomas/chroma/pull/1005
-   fix(typescript): highlight string literal type parameters by [@&#8203;SKalt](https://github.com/SKalt) in https://github.com/alecthomas/chroma/pull/1010
-   add any as a builtin type for go by [@&#8203;quartercastle](https://github.com/quartercastle) in https://github.com/alecthomas/chroma/pull/1021
-   chore(deps): update all non-major dependencies by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/1013
-   Remove whitespace tokenizing rule in markdown lexer by [@&#8203;cloudchamb3r](https://github.com/cloudchamb3r) in https://github.com/alecthomas/chroma/pull/1008
-   feat(JSON): support `.jsonc` extension by [@&#8203;CarterLi](https://github.com/CarterLi) in https://github.com/alecthomas/chroma/pull/1022
-   Add Eclipse ATL language (https://eclipse.dev/atl/) by [@&#8203;dwagelaar](https://github.com/dwagelaar) in https://github.com/alecthomas/chroma/pull/1024
-   Import NSIS Lexer from Pygments by [@&#8203;JakobDev](https://github.com/JakobDev) in https://github.com/alecthomas/chroma/pull/1026
-   chore(deps): update module github.com/alecthomas/kong to v1.5.1 by [@&#8203;renovate](https://github.com/renovate) in https://github.com/alecthomas/chroma/pull/1025
-   fix(nix): nix lexor missing '=' operator by [@&#8203;FlyingStitchman](https://github.com/FlyingStitchman) in https://github.com/alecthomas/chroma/pull/1031
-   Add WebVTT lexer ([#&#8203;707](https://github.com/alecthomas/chroma/issues/707)) by [@&#8203;dschuessler](https://github.com/dschuessler) in https://github.com/alecthomas/chroma/pull/1032

#### New Contributors

-   [@&#8203;comfysage](https://github.com/comfysage) made their first contribution in https://github.com/alecthomas/chroma/pull/970
-   [@&#8203;avih7531](https://github.com/avih7531) made their first contribution in https://github.com/alecthomas/chroma/pull/977
-   [@&#8203;wackbyte](https://github.com/wackbyte) made their first contribution in https://github.com/alecthomas/chroma/pull/979
-   [@&#8203;oliverpool](https://github.com/oliverpool) made their first contribution in https://github.com/alecthomas/chroma/pull/982
-   [@&#8203;DevDimov](https://github.com/DevDimov) made their first contribution in https://github.com/alecthomas/chroma/pull/983
-   [@&#8203;msorc](https://github.com/msorc) made their first contribution in https://github.com/alecthomas/chroma/pull/984
-   [@&#8203;Nicd](https://github.com/Nicd) made their first contribution in https://github.com/alecthomas/chroma/pull/990
-   [@&#8203;Booklordofthedings](https://github.com/Booklordofthedings) made their first contribution in https://github.com/alecthomas/chroma/pull/995
-   [@&#8203;konradreiche](https://github.com/konradreiche) made their first contribution in https://github.com/alecthomas/chroma/pull/998
-   [@&#8203;fredrare](https://github.com/fredrare) made their first contribution in https://github.com/alecthomas/chroma/pull/1002
-   [@&#8203;SKalt](https://github.com/SKalt) made their first contribution in https://github.com/alecthomas/chroma/pull/1010
-   [@&#8203;quartercastle](https://github.com/quartercastle) made their first contribution in https://github.com/alecthomas/chroma/pull/1021
-   [@&#8203;cloudchamb3r](https://github.com/cloudchamb3r) made their first contribution in https://github.com/alecthomas/chroma/pull/1008
-   [@&#8203;CarterLi](https://github.com/CarterLi) made their first contribution in https://github.com/alecthomas/chroma/pull/1022
-   [@&#8203;dwagelaar](https://github.com/dwagelaar) made their first contribution in https://github.com/alecthomas/chroma/pull/1024
-   [@&#8203;FlyingStitchman](https://github.com/FlyingStitchman) made their first contribution in https://github.com/alecthomas/chroma/pull/1031
-   [@&#8203;dschuessler](https://github.com/dschuessler) made their first contribution in https://github.com/alecthomas/chroma/pull/1032

**Full Changelog**: https://github.com/alecthomas/chroma/compare/v2.14.0...v2.15.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - "* 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:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMDYuMCIsInVwZGF0ZWRJblZlciI6IjM5LjEwNi4wIiwidGFyZ2V0QnJhbmNoIjoidjEwLjAvZm9yZ2VqbyIsImxhYmVscyI6WyJkZXBlbmRlbmN5LXVwZ3JhZGUiLCJ0ZXN0L25vdC1uZWVkZWQiXX0=-->

Co-authored-by: viceice <michael.kriese@gmx.de>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6553
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-01-14 21:40:06 +00:00
0ko
c439e26c33 i18n: update of translations from Codeberg Translate (#6566)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6566
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-01-14 07:48:07 +00:00
0ko
317559fdd9 i18n: update of translations from Codeberg Translate
Backport: https://codeberg.org/forgejo/forgejo/issues/6515

Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: Edgarsons <edgarsons@users.noreply.translate.codeberg.org>
Co-authored-by: div72 <div72@users.noreply.translate.codeberg.org>
Co-authored-by: tkbremnes <tkbremnes@users.noreply.translate.codeberg.org>
Co-authored-by: artnay <artnay@users.noreply.translate.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@users.noreply.translate.codeberg.org>
Co-authored-by: Protestant <protestant@users.noreply.translate.codeberg.org>
Co-authored-by: micash <micash@users.noreply.translate.codeberg.org>
Co-authored-by: Ikuyo Mita <ikuyo@users.noreply.translate.codeberg.org>
Co-authored-by: tacaly <frederick@tacaly.com>
Co-authored-by: burakozaydin <burakozaydin@users.noreply.translate.codeberg.org>
Co-authored-by: kdh8219 <kdh8219@monamo.dev>
Co-authored-by: Juno Takano <jutty@users.noreply.translate.codeberg.org>
Co-authored-by: earl-warren <earl-warren@users.noreply.translate.codeberg.org>
Co-authored-by: justbispo <justbispo@users.noreply.translate.codeberg.org>

(semi-automatically picked from commit d717c78ea0)
2025-01-14 11:57:02 +05:00
forgejo-backport-action
b88cd0c111 [v10.0/forgejo] port(gitea#31954): Add lock for parallel maven upload (#6517)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/6513

Backport #31851
Fix #30171

---

Fixes https://github.com/go-gitea/gitea/issues/30171, this is also a
issue in Forgejo. Backport the implementation that uses the existing
sync module which does not work for multiple instances which is
perfectly fine for Forgejo for now.

(cherry picked from commit 9c990ac043a0167dc59f1c822988ed2316f7c1df)

Co-authored-by: Gusted <gusted@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6517
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-01-09 18:10:54 +00:00
0ko
5326183693 [v10.0/forgejo] i18n: update of translations from Codeberg Translate (#6514)
Backport: https://codeberg.org/forgejo/forgejo/pulls/6451

Co-authored-by: earl-warren <earl-warren@users.noreply.translate.codeberg.org>
Co-authored-by: Edgarsons <edgarsons@users.noreply.translate.codeberg.org>
Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: div72 <div72@users.noreply.translate.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@users.noreply.translate.codeberg.org>
Co-authored-by: Salif Mehmed <mail@salif.eu>
Co-authored-by: tacaly <frederick@tacaly.com>
Co-authored-by: revi <yewon@revi.email>
Co-authored-by: lordwektabyte <lordwektabyte@users.noreply.translate.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: artnay <artnay@users.noreply.translate.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: Juno Takano <jutty@users.noreply.translate.codeberg.org>
Co-authored-by: justbispo <justbispo@users.noreply.translate.codeberg.org>
Co-authored-by: Atalanttore <atalanttore@users.noreply.translate.codeberg.org>
Co-authored-by: SomeTr <sometr@users.noreply.translate.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: banaanihillo <banaanihillo@users.noreply.translate.codeberg.org>
Co-authored-by: emansije <emansije@users.noreply.translate.codeberg.org>
Co-authored-by: Caesar Schinas <caesar@caesarschinas.com>
Co-authored-by: Marti <marti@users.noreply.translate.codeberg.org>
Co-authored-by: mahlzahn <mahlzahn@posteo.de>

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6514
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-01-09 08:57:11 +00:00
Earl Warren
5b6e0ca99c [v10.0/forgejo] fix: upgrade gof3 package and driver (#6493)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6493
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-01-07 21:31:55 +00:00
Earl Warren
90730e83ba fix: upgrade gof3 version
(cherry picked from commit 7189da15f2)
2025-01-07 20:52:48 +00:00
limiting-factor
775770ad81 fix: f3: label color must start with #
(cherry picked from commit 604c21ffd7)
2025-01-07 20:52:48 +00:00
limiting-factor
4eb7e0fe08 fix: f3: update milestone is_closed & deadline_unix
(cherry picked from commit 63204e8edf)
2025-01-07 20:52:48 +00:00
limiting-factor
597d806753 fix: f3: update issue is_locked
(cherry picked from commit 946b77115e)
2025-01-07 20:52:48 +00:00
limiting-factor
2b6a4137d5 fix: f3: update issue labels
(cherry picked from commit 168c1d806b)
2025-01-07 20:52:48 +00:00
limiting-factor
35266133d8 fix: f3: update issue assignees
The ID must be obtained from the repository ID and the index,
otherwise it is zero and the assignees are not updated.

(cherry picked from commit d8f71b513c)
2025-01-07 20:52:48 +00:00
limiting-factor
dab3121c65 fix: f3: support modify milestone
(cherry picked from commit 16564fd9e8)
2025-01-07 20:52:48 +00:00
Renovate Bot
3ce1a6562d Update module github.com/go-git/go-git/v5 to v5.13.1 (v10.0/forgejo) (#6496)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) | require | minor | `v5.11.0` -> `v5.13.1` |

---

### Release Notes

<details>
<summary>go-git/go-git (github.com/go-git/go-git/v5)</summary>

### [`v5.13.1`](https://github.com/go-git/go-git/releases/tag/v5.13.1)

[Compare Source](https://github.com/go-git/go-git/compare/v5.13.0...v5.13.1)

#### What's Changed

-   build: bump github.com/go-git/go-billy/v5 from 5.6.0 to 5.6.1 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1327
-   build: bump github.com/elazarl/goproxy from 1.2.1 to 1.2.2 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1329
-   build: bump github.com/elazarl/goproxy from 1.2.2 to 1.2.3 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1340
-   Revert "plumbing: transport/ssh, Add support for SSH [@&#8203;cert-authority](https://github.com/cert-authority)." by [@&#8203;pjbgf](https://github.com/pjbgf) in [#&#8203;1346](https://github.com/go-git/go-git/issues/1346)

**Full Changelog**: https://github.com/go-git/go-git/compare/v5.13.0...v5.13.1

### [`v5.13.0`](https://github.com/go-git/go-git/releases/tag/v5.13.0)

[Compare Source](https://github.com/go-git/go-git/compare/v5.12.0...v5.13.0)

#### What's Changed

-   build: bump github.com/go-git/go-git/v5 from 5.11.0 to 5.12.0 in /cli/go-git by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1065
-   build: bump golang.org/x/net from 0.22.0 to 0.23.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1068
-   build: bump golang.org/x/net from 0.23.0 to 0.24.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1071
-   Properly support skipping of non-mandatory extensions  by [@&#8203;codablock](https://github.com/codablock) in https://github.com/go-git/go-git/pull/1066
-   git: Refine some codes in test and non-test. by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1077
-   plumbing: protocol/packp, client-side filter capability support by [@&#8203;edigaryev](https://github.com/edigaryev) in https://github.com/go-git/go-git/pull/1000
-   build: bump golang.org/x/net from 0.22.0 to 0.23.0 in /cli/go-git by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1078
-   plumbing: fix sideband demux on flush by [@&#8203;aymanbagabas](https://github.com/aymanbagabas) in https://github.com/go-git/go-git/pull/1084
-   storage: dotgit, head reference usually comes first by [@&#8203;aymanbagabas](https://github.com/aymanbagabas) in https://github.com/go-git/go-git/pull/1085
-   build: bump golang.org/x/text from 0.14.0 to 0.15.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1091
-   build: bump golang.org/x/crypto from 0.22.0 to 0.23.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1094
-   build: bump golang.org/x/net from 0.24.0 to 0.25.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1093
-   git: Added an example for Repository.Branches by [@&#8203;johnmatthiggins](https://github.com/johnmatthiggins) in https://github.com/go-git/go-git/pull/1088
-   git: worktree_commit, Modify checking empty commit. Fixes [#&#8203;723](https://github.com/go-git/go-git/issues/723) by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1050
-   plumbing: transport/http, Wrap http errors to return reason. Fixes [#&#8203;1097](https://github.com/go-git/go-git/issues/1097) by [@&#8203;ggambetti](https://github.com/ggambetti) in https://github.com/go-git/go-git/pull/1100
-   build: bump golang.org/x/sys from 0.20.0 to 0.21.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1106
-   build: bump golang.org/x/text from 0.15.0 to 0.16.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1107
-   Bumps Go versions and go-billy by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1056
-   \_examples: Fixed a dead link COMPATIBILITY.md by [@&#8203;gecko655](https://github.com/gecko655) in https://github.com/go-git/go-git/pull/1109
-   build: bump github.com/jessevdk/go-flags from 1.5.0 to 1.6.1 in /cli/go-git by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1115
-   build: bump github.com/elazarl/goproxy from v0.0.0-20230808193330-2592e75ae04a to v0.0.0-20240618083138-03be62527ccb by [@&#8203;hbelmiro](https://github.com/hbelmiro) in https://github.com/go-git/go-git/pull/1124
-   build: bump golang.org/x/net from 0.25.0 to 0.26.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1104
-   Add option approximating `git clean -x` flag. by [@&#8203;msuozzo](https://github.com/msuozzo) in https://github.com/go-git/go-git/pull/995
-   Revert "Add option approximating `git clean -x` flag." by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1129
-   Fix reference updated concurrently error for the filesystem storer by [@&#8203;Javier-varez](https://github.com/Javier-varez) in https://github.com/go-git/go-git/pull/1116
-   build: bump golang.org/x/net from 0.26.0 to 0.27.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1134
-   utils: merkletrie, Align error message with upstream by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1142
-   plumbing: transport/file, Change paths to absolute by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1141
-   plumbing: gitignore, Fix loading of ignored .gitignore files. by [@&#8203;Achilleshiel](https://github.com/Achilleshiel) in https://github.com/go-git/go-git/pull/1114
-   build: bump github.com/skeema/knownhosts from 1.2.2 to 1.3.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1147
-   plumbing: transport/ssh, Add support for SSH [@&#8203;cert-authority](https://github.com/cert-authority). by [@&#8203;Javier-varez](https://github.com/Javier-varez) in https://github.com/go-git/go-git/pull/1157
-   build: run example tests during CI workflow by [@&#8203;crazybolillo](https://github.com/crazybolillo) in https://github.com/go-git/go-git/pull/1030
-   storage: filesystem, Fix object cache not working due to uninitialised objects being put into cache by [@&#8203;SatelliteMind](https://github.com/SatelliteMind) in https://github.com/go-git/go-git/pull/1138
-   git: Fix fetching missing commits by [@&#8203;AriehSchneier](https://github.com/AriehSchneier) in https://github.com/go-git/go-git/pull/1032
-   plumbing: format/packfile, remove duplicate checks in findMatch() by [@&#8203;edigaryev](https://github.com/edigaryev) in https://github.com/go-git/go-git/pull/1152
-   git: worktree, Fix file reported as `Untracked` while it is committed by [@&#8203;rodrigocam](https://github.com/rodrigocam) in https://github.com/go-git/go-git/pull/1023
-   build: bump golang.org/x/sys from 0.22.0 to 0.23.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1160
-   plumbing: filemode, Remove check for setting size of .git/index file  by [@&#8203;nicholasSUSE](https://github.com/nicholasSUSE) in https://github.com/go-git/go-git/pull/1159
-   build: bump golang.org/x/net from 0.27.0 to 0.28.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1163
-   Fix some lint warning and increase stalebot to 180 days by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1128
-   adjust path extracted from file: url on Windows by [@&#8203;tomqwpl](https://github.com/tomqwpl) in https://github.com/go-git/go-git/pull/416
-   build: bump golang.org/x/sys from 0.23.0 to 0.24.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1164
-   Add RestoreStaged to Worktree that mimics the behaviour of git restore --staged <file>... by [@&#8203;ben-tbotlabs](https://github.com/ben-tbotlabs) in https://github.com/go-git/go-git/pull/493
-   plumbing: signature, support the same x509 signature formats as git by [@&#8203;yoavamit](https://github.com/yoavamit) in https://github.com/go-git/go-git/pull/1169
-   fix: allow discovery of non bare repos in fsLoader by [@&#8203;jakobmoellerdev](https://github.com/jakobmoellerdev) in https://github.com/go-git/go-git/pull/1170
-   build: bump golang.org/x/sys from 0.24.0 to 0.25.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1178
-   build: bump golang.org/x/text from 0.17.0 to 0.18.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1179
-   build: bump golang.org/x/net from 0.28.0 to 0.29.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1184
-   Consume push URLs when they are provided by [@&#8203;mcepl](https://github.com/mcepl) in https://github.com/go-git/go-git/pull/1191
-   \*: use gocheck's MkDir instead of TempDir for tests. Fixes [#&#8203;807](https://github.com/go-git/go-git/issues/807) by [@&#8203;uragirii](https://github.com/uragirii) in https://github.com/go-git/go-git/pull/1194
-   build: bump golang.org/x/net from 0.29.0 to 0.30.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1200
-   worktree: .git/index not correctly generated when running on Windows by [@&#8203;BeChris](https://github.com/BeChris) in https://github.com/go-git/go-git/pull/1198
-   git: worktree, Fix sparse reset. Fixes [#&#8203;90](https://github.com/go-git/go-git/issues/90) by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1101
-   git: worktree, Pass context on updateSubmodules. Fixes [#&#8203;1098](https://github.com/go-git/go-git/issues/1098) by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1154
-   build: bump github.com/go-git/go-billy/v5 from 5.5.1-0.20240427054813-8453aa90c6ec to 5.6.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1211
-   Update contributing guidelines by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1217
-   build: bump github.com/ProtonMail/go-crypto from 1.0.0 to 1.1.1 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1222
-   build: bump golang.org/x/sys from 0.26.0 to 0.27.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1223
-   build: bump golang.org/x/crypto from 0.28.0 to 0.29.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1221
-   build: bump github.com/ProtonMail/go-crypto from 1.1.1 to 1.1.2 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1226
-   build: bump github.com/stretchr/testify from 1.9.0 to 1.10.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1232
-   build: bump github.com/ProtonMail/go-crypto from 1.1.2 to 1.1.3 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1231
-   build: General improvements around fuzzing by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1229
-   build: bump golang.org/x/net from 0.30.0 to 0.32.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1241
-   build: group dependabot updates for golang.org by [@&#8203;AriehSchneier](https://github.com/AriehSchneier) in https://github.com/go-git/go-git/pull/1243
-   build: bump github/codeql-action from 2.22.11 to 3.27.6 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1244
-   build: bump golang.org/x/crypto from 0.21.0 to 0.31.0 in /cli/go-git by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1246
-   build: bump golang.org/x/crypto from 0.30.0 to 0.31.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1247
-   build: bump github.com/gliderlabs/ssh from 0.3.7 to 0.3.8 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1248
-   add comment preventing people from creating invalid trees by [@&#8203;petar](https://github.com/petar) in https://github.com/go-git/go-git/pull/732
-   build: bump github/codeql-action from 3.27.6 to 3.27.9 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1250
-   plumbing: Properly encode index version 4 by [@&#8203;BeChris](https://github.com/BeChris) in https://github.com/go-git/go-git/pull/1251
-   Fix typos by [@&#8203;deining](https://github.com/deining) in https://github.com/go-git/go-git/pull/1148
-   Fix reset files in subfolders by [@&#8203;linglo](https://github.com/linglo) in https://github.com/go-git/go-git/pull/1177
-   git: update switch cases by [@&#8203;hezhizhen](https://github.com/hezhizhen) in https://github.com/go-git/go-git/pull/1182
-   build: bump golang.org/x/net from 0.32.0 to 0.33.0 in the golang-org group by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1256
-   fix(1212): Fix invalid reference name error while cloning branches containing /- by [@&#8203;varmakarthik12](https://github.com/varmakarthik12) in https://github.com/go-git/go-git/pull/1257
-   pktline : accept upercase hexadecimal value as pktline length information by [@&#8203;BeChris](https://github.com/BeChris) in https://github.com/go-git/go-git/pull/1220
-   build: bump github/codeql-action from 3.27.9 to 3.28.0 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1260
-   build: bump github.com/elazarl/goproxy from 0.0.0-20240618083138-03be62527ccb to 1.2.1 by [@&#8203;dependabot](https://github.com/dependabot) in https://github.com/go-git/go-git/pull/1262
-   git: worktree_commit, sanitize author and commiter name and email before creating the commit object. Fixes [#&#8203;680](https://github.com/go-git/go-git/issues/680) by [@&#8203;BeChris](https://github.com/BeChris) in https://github.com/go-git/go-git/pull/1261

#### New Contributors

-   [@&#8203;johnmatthiggins](https://github.com/johnmatthiggins) made their first contribution in https://github.com/go-git/go-git/pull/1088
-   [@&#8203;ggambetti](https://github.com/ggambetti) made their first contribution in https://github.com/go-git/go-git/pull/1100
-   [@&#8203;gecko655](https://github.com/gecko655) made their first contribution in https://github.com/go-git/go-git/pull/1109
-   [@&#8203;hbelmiro](https://github.com/hbelmiro) made their first contribution in https://github.com/go-git/go-git/pull/1124
-   [@&#8203;msuozzo](https://github.com/msuozzo) made their first contribution in https://github.com/go-git/go-git/pull/995
-   [@&#8203;Javier-varez](https://github.com/Javier-varez) made their first contribution in https://github.com/go-git/go-git/pull/1116
-   [@&#8203;Achilleshiel](https://github.com/Achilleshiel) made their first contribution in https://github.com/go-git/go-git/pull/1114
-   [@&#8203;crazybolillo](https://github.com/crazybolillo) made their first contribution in https://github.com/go-git/go-git/pull/1030
-   [@&#8203;SatelliteMind](https://github.com/SatelliteMind) made their first contribution in https://github.com/go-git/go-git/pull/1138
-   [@&#8203;rodrigocam](https://github.com/rodrigocam) made their first contribution in https://github.com/go-git/go-git/pull/1023
-   [@&#8203;nicholasSUSE](https://github.com/nicholasSUSE) made their first contribution in https://github.com/go-git/go-git/pull/1159
-   [@&#8203;tomqwpl](https://github.com/tomqwpl) made their first contribution in https://github.com/go-git/go-git/pull/416
-   [@&#8203;ben-tbotlabs](https://github.com/ben-tbotlabs) made their first contribution in https://github.com/go-git/go-git/pull/493
-   [@&#8203;yoavamit](https://github.com/yoavamit) made their first contribution in https://github.com/go-git/go-git/pull/1169
-   [@&#8203;uragirii](https://github.com/uragirii) made their first contribution in https://github.com/go-git/go-git/pull/1194
-   [@&#8203;petar](https://github.com/petar) made their first contribution in https://github.com/go-git/go-git/pull/732
-   [@&#8203;deining](https://github.com/deining) made their first contribution in https://github.com/go-git/go-git/pull/1148
-   [@&#8203;linglo](https://github.com/linglo) made their first contribution in https://github.com/go-git/go-git/pull/1177
-   [@&#8203;varmakarthik12](https://github.com/varmakarthik12) made their first contribution in https://github.com/go-git/go-git/pull/1257

**Full Changelog**: https://github.com/go-git/go-git/compare/v5.12.0...v5.13.0

### [`v5.12.0`](https://github.com/go-git/go-git/releases/tag/v5.12.0)

[Compare Source](https://github.com/go-git/go-git/compare/v5.11.0...v5.12.0)

#### What's Changed

-   git: Worktree.AddWithOptions: add skipStatus option when providing a specific path by [@&#8203;moranCohen26](https://github.com/moranCohen26) in https://github.com/go-git/go-git/pull/994
-   git: Signer: fix usage of crypto.Signer interface by [@&#8203;wlynch](https://github.com/wlynch) in https://github.com/go-git/go-git/pull/1029
-   git: Remote, fetch, adds the prune option. by [@&#8203;juliens](https://github.com/juliens) in https://github.com/go-git/go-git/pull/366
-   git: Add crypto.Signer option to CommitOptions. by [@&#8203;wlynch](https://github.com/wlynch) in https://github.com/go-git/go-git/pull/996
-   git: Worktree checkout tag hash id ([#&#8203;959](https://github.com/go-git/go-git/issues/959)) by [@&#8203;aymanbagabas](https://github.com/aymanbagabas) in https://github.com/go-git/go-git/pull/966
-   git: Worktree, Don't panic on empty or root path when checking if it is valid by [@&#8203;tim775](https://github.com/tim775) in https://github.com/go-git/go-git/pull/1042
-   git: Add commit validation for Reset by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1048
-   git: worktree_commit, Fix amend commit to apply changes. Fixes [#&#8203;1024](https://github.com/go-git/go-git/issues/1024) by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1045
-   git: Implement Merge function with initial `FastForwardMerge` support by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/1044
-   plumbing: object, Make first commit visible on logs filtered with filename. Fixes [#&#8203;191](https://github.com/go-git/go-git/issues/191) by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1036
-   plumbing: no panic in printStats function. Fixes [#&#8203;177](https://github.com/go-git/go-git/issues/177) by [@&#8203;nodivbyzero](https://github.com/nodivbyzero) in https://github.com/go-git/go-git/pull/971
-   plumbing: object, Optimize logging with file. by [@&#8203;onee-only](https://github.com/onee-only) in https://github.com/go-git/go-git/pull/1046
-   plumbing: object, check legitimacy in (\*Tree).Encode by [@&#8203;niukuo](https://github.com/niukuo) in https://github.com/go-git/go-git/pull/967
-   plumbing: format/gitattributes, close file in ReadAttributesFile by [@&#8203;prskr](https://github.com/prskr) in https://github.com/go-git/go-git/pull/1018
-   plumbing: check setAuth error. Fixes [#&#8203;185](https://github.com/go-git/go-git/issues/185) by [@&#8203;nodivbyzero](https://github.com/nodivbyzero) in https://github.com/go-git/go-git/pull/969
-   plumbing: object, fix variable  defaultUtf8CommitMessageEncoding name spell error by [@&#8203;Jerry-yz](https://github.com/Jerry-yz) in https://github.com/go-git/go-git/pull/987
-   utils: merkletrie, calculate filesystem node's hash lazily. by [@&#8203;candid82](https://github.com/candid82) in https://github.com/go-git/go-git/pull/825
-   utils: update comment in node.go's Hash() by [@&#8203;codablock](https://github.com/codablock) in https://github.com/go-git/go-git/pull/992
-   \_example: fix 404 link and added ssh-agent clone link by [@&#8203;grinish21](https://github.com/grinish21) in https://github.com/go-git/go-git/pull/1022
-   \_example: checkout-branch example by [@&#8203;dlambda](https://github.com/dlambda) in https://github.com/go-git/go-git/pull/446
-   \_example: example for git clone using ssh-agent by [@&#8203;pjbgf](https://github.com/pjbgf) in https://github.com/go-git/go-git/pull/998

#### New Contributors

-   [@&#8203;candid82](https://github.com/candid82) made their first contribution in https://github.com/go-git/go-git/pull/825
-   [@&#8203;codablock](https://github.com/codablock) made their first contribution in https://github.com/go-git/go-git/pull/992
-   [@&#8203;Jerry-yz](https://github.com/Jerry-yz) made their first contribution in https://github.com/go-git/go-git/pull/987
-   [@&#8203;wlynch](https://github.com/wlynch) made their first contribution in https://github.com/go-git/go-git/pull/996
-   [@&#8203;moranCohen26](https://github.com/moranCohen26) made their first contribution in https://github.com/go-git/go-git/pull/994
-   [@&#8203;grinish21](https://github.com/grinish21) made their first contribution in https://github.com/go-git/go-git/pull/1022
-   [@&#8203;prskr](https://github.com/prskr) made their first contribution in https://github.com/go-git/go-git/pull/1018
-   [@&#8203;dlambda](https://github.com/dlambda) made their first contribution in https://github.com/go-git/go-git/pull/446
-   [@&#8203;juliens](https://github.com/juliens) made their first contribution in https://github.com/go-git/go-git/pull/366
-   [@&#8203;onee-only](https://github.com/onee-only) made their first contribution in https://github.com/go-git/go-git/pull/1036
-   [@&#8203;tim775](https://github.com/tim775) made their first contribution in https://github.com/go-git/go-git/pull/1042
-   [@&#8203;niukuo](https://github.com/niukuo) made their first contribution in https://github.com/go-git/go-git/pull/967
-   [@&#8203;avoidalone](https://github.com/avoidalone) made their first contribution in https://github.com/go-git/go-git/pull/1047

**Full Changelog**: https://github.com/go-git/go-git/compare/v5.11.0...v5.12.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - "* 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:eyJjcmVhdGVkSW5WZXIiOiIzOS45Mi4wIiwidXBkYXRlZEluVmVyIjoiMzkuOTIuMCIsInRhcmdldEJyYW5jaCI6InYxMC4wL2Zvcmdlam8iLCJsYWJlbHMiOlsiZGVwZW5kZW5jeS11cGdyYWRlIiwidGVzdC9ub3QtbmVlZGVkIl19-->

Co-authored-by: Earl Warren <contact@earl-warren.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6496
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-01-07 20:51:15 +00:00
forgejo-backport-action
3b5f162fe6 [v10.0/forgejo] chore: remove illegal git usage (#6492)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/6488

This is no longer possible in future go-git versions, so lets hardcode it

Co-authored-by: Gusted <postmaster@gusted.xyz>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6492
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-01-07 19:01:32 +00:00
forgejo-backport-action
f63e5a1cff [v10.0/forgejo] fix(ui): show oauth divider on signup page (#6465)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/6463

Fix a minor UI bug introduced in https://codeberg.org/forgejo/forgejo/pulls/6112.

The condition `if .EnableInternalSignIn` was added to display of the divider, but it is only available when `oauth_container.tmpl` is called from signIn page, it is not relevant to signUp page.

Co-authored-by: 0ko <0ko@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6465
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2025-01-04 10:35:37 +00:00
Earl Warren
25640f201e Merge pull request '[v10.0/forgejo] i18n: update of translations from Codeberg Translate' (#6450) from bp-v10.0/forgejo-a33fe60 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6450
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2025-01-02 08:24:15 +00:00
Codeberg Translate
ef205915cc i18n: update of translations from Codeberg Translate (#6378)
Co-authored-by: tacaly <frederick@tacaly.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: artnay <artnay@users.noreply.translate.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: Edgarsons <edgarsons@users.noreply.translate.codeberg.org>
Co-authored-by: Benedikt Straub <benedikt-straub@web.de>
Co-authored-by: Atalanttore <atalanttore@users.noreply.translate.codeberg.org>
Co-authored-by: Wuzzy <wuzzy@disroot.org>
Co-authored-by: Juno Takano <jutty@users.noreply.translate.codeberg.org>
Co-authored-by: Dirk <dirk@users.noreply.translate.codeberg.org>
Co-authored-by: thodorisl <thodorisl@users.noreply.translate.codeberg.org>
Co-authored-by: jasonb <jasonb@users.noreply.translate.codeberg.org>
Co-authored-by: SomeTr <sometr@users.noreply.translate.codeberg.org>
Co-authored-by: Outbreak2096 <outbreak2096@users.noreply.translate.codeberg.org>
Co-authored-by: xtex <xtexchooser@duck.com>
Co-authored-by: Salif Mehmed <mail@salif.eu>
Co-authored-by: s-light <s-light@users.noreply.translate.codeberg.org>
Co-authored-by: earl-warren <earl-warren@users.noreply.translate.codeberg.org>
Co-authored-by: Kita Ikuyo <searinminecraft@courvix.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6378
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@noreply.codeberg.org>
Co-committed-by: Codeberg Translate <translate@noreply.codeberg.org>
(cherry picked from commit a33fe60bbe)
2025-01-02 07:47:56 +00:00
Gusted
81d351ce5f Merge pull request '[v10.0/forgejo] feat: Add summary card for repos and releases' (#6448) from JakobDev/forgejo:cardback into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6448
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2025-01-02 05:44:05 +00:00
Gusted
cd08097bbb Merge pull request '[v10.0/forgejo] Fix editing pr review' (#6444) from bp-v10.0/forgejo-13b6caa into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6444
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2025-01-02 00:55:10 +00:00
JakobDev
13496203bc
[v10.0/forgejo] feat: Add summary card for repos and releases 2025-01-01 22:00:26 +01:00
JakobDev
8f47560bf7 Fix editing pr review
(cherry picked from commit 13b6caa608)
2025-01-01 17:54:01 +00:00
0ko
9e6c3f226c Merge pull request '[v10.0/forgejo] fix(code search): empty mode dropdown when keyword is empty' (#6442) from bp-v10.0/forgejo-c53d219 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6442
Reviewed-by: Shiny Nematoda <snematoda@noreply.codeberg.org>
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
2025-01-01 13:36:24 +00:00
Shiny Nematoda
c7c7f69f82 fix(code search): empty mode dropdown when keyword is empty
(cherry picked from commit c53d21965a)
2025-01-01 13:04:56 +00:00
Gusted
86a09562fd Merge pull request '[v10.0/forgejo] fix(ui): use primary color for button in table modal' (#6430) from bp-v10.0/forgejo-a302506 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6430
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2024-12-31 15:18:37 +00:00
0ko
ce5c3e32c1 fix(ui): use primary color for button in table modal (#6427)
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6427
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
(cherry picked from commit a302506095)
2024-12-31 09:39:52 +00:00
Earl Warren
fa9f6e0cdd Merge pull request '[v10.0/forgejo] Fix edit cancel button' (#6426) from bp-v10.0/forgejo-29c59c9 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6426
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-31 07:30:26 +00:00
JakobDev
172a48be8a Fix edit cancel button
(cherry picked from commit 29c59c96bd)
2024-12-31 02:11:08 +00:00
Earl Warren
4a25a3e154 Merge pull request '[v10.0/forgejo] Rework user profile settings' (#6423) from bp-v10.0/forgejo-2885ea8 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6423
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-30 21:20:51 +00:00
Earl Warren
6266715486 Merge pull request '[v10.0/forgejo] Fix issue/comment menus' (#6424) from bp-v10.0/forgejo-c67d63d into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6424
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-30 21:19:38 +00:00
Otto Richter
3496c819da Fix issue/comment menus
Closes https://codeberg.org/forgejo/forgejo/issues/1120

- Adds labels to reaction and context menu.
- Fixes taborder in markdown combobox buttons. They are now only one
  "tab" stop and can be navigated with arrow buttons and in the right
order (previously, it would skip the table button).
- Generates more verbose output for the reactio selectors to provide
  content for users who cannot identify the meaning of these buttons
visually. Explicit aria-labels are now preferred over auto-generated
ones.

(cherry picked from commit c67d63d88a)
2024-12-30 20:29:28 +00:00
Otto Richter
4f8d96a6de Rework user profile settings
Accessibility:

- improved semantic layout
- Fixes unlabelled input for custom pronouns. CC @hazy
- Adds labels to dropdowns.
- Shortens certain texts for less verbose screen reader outputs and
  people with slow reading speed.
- Turned optional username rename helper text with low contrast into
  "normal" help text.

UI/UX:

- Removes section about primary email which is no longer managed in the
  profile section.
- Fixes section about primary email not displaying in user settings when notifications are
  not available.
- Removes primary email display, because it is not actually a form
  element here. (Alternatively, we could display it and link to the
account settings for managing the email)

(cherry picked from commit 2885ea8da2)
2024-12-30 20:29:15 +00:00
Earl Warren
8d353ad258 Merge pull request '[v10.0/forgejo] chore(branding): strip metadata information from the footer' (#6420) from bp-v10.0/forgejo-2c81893 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6420
2024-12-30 16:43:10 +00:00
Earl Warren
865d4f538b chore(branding): strip metadata information from the footer
When the Forgejo version is displayed in the footer, the metadata
should not be displayed. It was once an indication that Forgejo
includes all of Gitea. But since the hard fork the codebase diverged
and this is no longer accurate.

The metadata is still displayed in the API, admin panels or headers
for the sake of backward compatibility.

Refs: https://codeberg.org/forgejo/discussions/issues/244
(cherry picked from commit 2c81893c76)
2024-12-30 15:30:02 +00:00
Gusted
ecbbaabfc8 Merge pull request '[v10.0/forgejo] fix: use DateUtils for blocked users list' (#6418) from bp-v10.0/forgejo-57f7253 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6418
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2024-12-30 12:55:05 +00:00
Gusted
38f058a5f0 fix: use DateUtils for blocked users list
- Should've been fixed with #5796 but seems I've overlooked.

(cherry picked from commit 57f7253610)
2024-12-30 10:54:38 +00:00
Earl Warren
1a64ae1dc4 Merge pull request '[v10.0/forgejo] [gitea] week 2024-53 cherry pick (gitea/main -> forgejo)' (#6416) from bp-v10.0/forgejo-0efd713-2ffa9a5-92ac337-b18dcd6-37f0561 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6416
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-30 08:59:18 +00:00
Earl Warren
a8cc73fe87 Improve Actions test (#32883) (followup)
(cherry picked from commit 37f05617a5)
2024-12-30 08:26:54 +00:00
Zettat123
7a84081755 Improve Actions test (#32883)
This PR adds a mock runner to test more actions features.

(cherry picked from commit df98452c0de9d01338f00aa5d85757623523b1fc)
(cherry picked from commit b18dcd69f2)
2024-12-30 08:26:54 +00:00
Zettat123
2ac9b16297 Support org labels when adding labels by label names (#32988)
Fix #32891

(cherry picked from commit 44b4fb21a4e99f327303f66cc7e48f7ca7ba09e1)
(cherry picked from commit 92ac337263)
2024-12-30 08:26:54 +00:00
Lunny Xiao
2bcbfbc5d4 demilestone should not include milestone (#32923)
Fix #32887

(cherry picked from commit f44712f22bc7bfce049c64c27f60453ff1e41a5c)

Conflicts:
	services/issue/milestone_test.go
  trivial conflicts (require vs assert)
(cherry picked from commit 2ffa9a5e6e)
2024-12-30 08:26:54 +00:00
katsu
4999de50c3 fix trailing comma not matched in the case of alphanumeric issue (#32945)
Fix #32428.

Patch the regex to match `,`besides `.` `"` `'` `:` and space.

(cherry picked from commit fb75151fb14e866cab8d893c588f5673902b278b)
(cherry picked from commit 0efd7130f0)
2024-12-30 08:26:54 +00:00
Earl Warren
eb00a80efc Merge pull request '[v10.0/forgejo] Rework new repo dialog' (#6399) from bp-v10.0/forgejo-471e5b1-8159915-4cde569-8d32ca3-8d829a9 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6399
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
2024-12-29 20:49:03 +00:00
Earl Warren
c7c22aae8c Merge pull request '[v10.0/forgejo] fix: xorm needs to be lowercase otherwise it is ignored' (#6406) from bp-v10.0/forgejo-b03ecf5 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6406
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
2024-12-29 20:09:11 +00:00
Gusted
0eab84d02e Merge pull request '[v10.0/forgejo] feat: When comparing in repos, mention that pull request creation requires sign-in' (#6398) from bp-v10.0/forgejo-dd4a110 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6398
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
2024-12-29 18:40:10 +00:00
Earl Warren
e71fd7d28d fix: xorm needs to be lowercase otherwise it is ignored
Fixes: https://codeberg.org/forgejo/forgejo/issues/6389
(cherry picked from commit b03ecf584c)
2024-12-29 18:27:08 +00:00
Gusted
055348430e Merge pull request '[v10.0/forgejo] Cosmetic changes and fixes around repo homepage' (#6402) from bp-v10.0/forgejo-02c34f9 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6402
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
2024-12-29 18:27:01 +00:00
0ko
440be42baf ui: cosmetic changes and fixes around repo homepage
(cherry picked from commit 02c34f9908)
2024-12-29 14:47:11 +00:00
Otto Richter
f1b98d16c7 tests(e2e): Test new repo dialog and behaviour
- screenshots and basic accessibility scan of collapsed and expanded sections
  - the dropdowns do not pass the accessibility checks, but I haven't found an easy fix
  - I manually confirmed the dropdown behaviour via orca and firefox, though

(cherry picked from commit 8d829a97b2)
2024-12-29 13:23:30 +00:00
Otto Richter
662b385596 New repo: Rework initialization
- only show settings when ticked
- only offer README selection when there are multiple options

(cherry picked from commit 8d32ca32c2)
2024-12-29 13:23:30 +00:00
Otto Richter
023aaef2b9 New repo: Rework advanced and template sections
- make sections collapsible
- only offer object format selection when there is an actual choice

(cherry picked from commit 4cde56906e)
2024-12-29 13:23:30 +00:00
Otto Richter
cb745a771a New repo: Rework basic settings
- separate template
- ensure correct labelling of elements
- drop additional required indicators for field that already have
  browser semantics (the icon has colour contrast issues anyway),
especially as the first dropdown cannot be left empty

(cherry picked from commit 81599155e8)
2024-12-29 13:23:30 +00:00
Otto Richter
38d2933cc1 New repo: Clean up and improve CSS
- drop custom layout rules for this page
- move form-related content to form.css
- extend new form CSS to add gap between labels and input fields

(cherry picked from commit 471e5b1975)
2024-12-29 13:23:30 +00:00
Litchi Pi
5a0c79e6b4 template: repo: compare: display a warning if the user is not logged in
Signed-off-by: Litchi Pi <litchi.pi@proton.me>
(cherry picked from commit dd4a1107ed)
2024-12-29 12:52:49 +00:00
Earl Warren
424f85304e Merge pull request '[v10.0/forgejo] Fix overflow in git notes' (#6392) from bp-v10.0/forgejo-dcdeb23 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6392
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-28 21:17:42 +00:00
JakobDev
382db9e8de Fix overflow in git notes
(cherry picked from commit dcdeb23cc3)
2024-12-28 20:44:10 +00:00
Earl Warren
0ff66fa3bb Merge pull request 'Revert "Update dependency idiomorph to v0.4.0"' (#6382) from gusted/forgejo-idiomorph-rever-v10 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6382
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-27 06:43:17 +00:00
Gusted
d5c5724f44
Revert "Update dependency idiomorph to v0.4.0"
This reverts commit f9aaefd107.

I've not not yet been able to determine what commit caused it, but 0.4.0
is broken for Forgejo's usecase it's not morphing and instead
replacing (it seems) elements when there's no need to.

(cherry picked from commit 64deec434a)
2024-12-27 03:04:25 +01:00
forgejo-backport-action
1da56f0eb8 [v10.0/forgejo] i18n: update of translations from Codeberg Translate (#6377)
**Backport:** https://codeberg.org/forgejo/forgejo/pulls/6331

Translations update from [Codeberg Translate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/).

Current translation status:

![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg)

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

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Localization
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/6331): <!--number 6331 --><!--line 0 --><!--description aTE4bjogdXBkYXRlIG9mIHRyYW5zbGF0aW9ucyBmcm9tIENvZGViZXJnIFRyYW5zbGF0ZQ==-->i18n: update of translations from Codeberg Translate<!--description-->
<!--end release-notes-assistant-->

Co-authored-by: Codeberg Translate <translate@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6377
Co-authored-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
Co-committed-by: forgejo-backport-action <forgejo-backport-action@noreply.codeberg.org>
2024-12-26 09:57:35 +00:00
Earl Warren
6a78a71172 Merge pull request '[v10.0/forgejo] chore(i18n): user/label translations in danish/latvian' (#6376) from bp-v10.0/forgejo-5eb0877 into v10.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6376
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-12-26 09:14:28 +00:00
Earl Warren
f6c442c2fe chore(i18n): user/label translations in danish/latvian
Refs: https://codeberg.org/forgejo/forgejo/pulls/6331
(cherry picked from commit 5eb0877381)
2024-12-26 08:58:09 +00:00
162 changed files with 10456 additions and 2163 deletions

View file

@ -13,6 +13,8 @@ runs:
run: |
export DEBIAN_FRONTEND=noninteractive
echo "deb http://deb.debian.org/debian/ ${RELEASE} main" > "/etc/apt/sources.list.d/${RELEASE}.list"
wget -O- http://neuro.debian.net/lists/bookworm.de-fzj.libre | tee /etc/apt/sources.list.d/neurodebian.sources.list
apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com 0xA5D32F012649A5A9
env:
RELEASE: ${{inputs.release}}
- name: install packages
@ -24,6 +26,7 @@ runs:
- name: remove temporary package list to prevent using it in other steps
run: |
rm "/etc/apt/sources.list.d/${RELEASE}.list"
rm "/etc/apt/sources.list.d/neurodebian.sources.list"
apt-get update -qq
env:
RELEASE: ${{inputs.release}}

View file

@ -19,7 +19,7 @@ runs:
set -ex
toolchain=$(grep -oP '(?<=toolchain ).+' go.mod)
version=$(go version | cut -d' ' -f3)
if [ "$toolchain" != "$version" ]; then
echo "go version mismatch: $toolchain <> $version"
if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then
echo "go version too low: $toolchain >= $version"
exit 1
fi

View file

@ -0,0 +1,41 @@
on:
push:
branches:
- 'forgejo'
tags:
- '*-git-annex*'
jobs:
build-oci-image:
runs-on: docker
strategy:
matrix:
type: ["rootful", "rootless"]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # fetch the full history so that the Forgejo version is determined properly
- name: Determine registry and username
id: determine-registry-and-username
run: |
echo "registry=${GITHUB_SERVER_URL#https://}" >> "$GITHUB_OUTPUT"
echo "username=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_OUTPUT"
- name: Install Docker
run: curl -fsSL https://get.docker.com | sh
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: ${{ steps.determine-registry-and-username.outputs.registry }}
username: ${{ steps.determine-registry-and-username.outputs.username }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ${{ (matrix.type == 'rootful' && 'Dockerfile') || (matrix.type == 'rootless' && 'Dockerfile.rootless') }}
push: true
tags: ${{ steps.determine-registry-and-username.outputs.registry }}/${{ github.repository }}:${{ github.ref_name }}${{ (matrix.type == 'rootful' && ' ') || (matrix.type == 'rootless' && '-rootless') }}

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.2.1
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
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.2.1
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"

View file

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

View file

@ -10,7 +10,6 @@ on:
jobs:
backend-checks:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
@ -27,7 +26,6 @@ jobs:
- run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs
- uses: ./.forgejo/workflows-composite/build-backend
frontend-checks:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
@ -176,7 +174,6 @@ jobs:
TAGS: bindata
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
test-mysql:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@ -199,15 +196,13 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
packages: git git-lfs
packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-mysql-migration test-mysql'
timeout-minutes: 120
env:
USE_REPO_TEST_DIR: 1
test-pgsql:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@ -236,17 +231,15 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
packages: git git-lfs
packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-pgsql-migration test-pgsql'
timeout-minutes: 120
env:
RACE_ENABLED: true
USE_REPO_TEST_DIR: 1
TEST_LDAP: 1
test-sqlite:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@ -258,25 +251,21 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
packages: git git-lfs
packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-sqlite-migration test-sqlite'
timeout-minutes: 120
env:
TAGS: sqlite sqlite_unlock_notify
RACE_ENABLED: true
TEST_TAGS: sqlite sqlite_unlock_notify
USE_REPO_TEST_DIR: 1
security-check:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs:
- test-sqlite
- test-pgsql
- test-mysql
- test-remote-cacher
- test-unit
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime

View file

@ -78,6 +78,7 @@ RUN apk --no-cache add \
sqlite \
su-exec \
gnupg \
git-annex \
&& rm -rf /var/cache/apk/*
RUN addgroup \

View file

@ -71,6 +71,7 @@ RUN apk --no-cache add \
git \
curl \
gnupg \
git-annex \
&& rm -rf /var/cache/apk/*
RUN addgroup \

View file

@ -8,7 +8,7 @@ self := $(location)
@tmpdir=`mktemp --tmpdir -d` ; \
echo Using temporary directory $$tmpdir for test repositories ; \
USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \
STATUS=$$? ; rm -r "$$tmpdir" ; exit $$STATUS
STATUS=$$? ; chmod -R +w "$$tmpdir" && rm -r "$$tmpdir" ; exit $$STATUS
else
@ -104,7 +104,7 @@ else
FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY}
else
# drop the "g" prefix prepended by git describe to the commit hash
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/')+${GITEA_COMPATIBILITY}
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/2')+${GITEA_COMPATIBILITY}
endif
endif
FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')

View file

@ -84,6 +84,11 @@
"path": "gitea.com/lunny/levelqueue/LICENSE",
"licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
{
"name": "github.com/42wim/httpsig",
"path": "github.com/42wim/httpsig/LICENSE",
"licenseText": "BSD 3-Clause License\n\nCopyright (c) 2018, go-fed\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
{
"name": "github.com/42wim/sshsig",
"path": "github.com/42wim/sshsig/LICENSE",
@ -292,7 +297,7 @@
{
"name": "github.com/cyphar/filepath-securejoin",
"path": "github.com/cyphar/filepath-securejoin/LICENSE",
"licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
"licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
{
"name": "github.com/davecgh/go-spew/spew",

View file

@ -59,9 +59,9 @@ func initRemoveTags() {
oldnew := []string{}
for _, el := range []string{
"email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it",
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger",
"server", "servidor", "kiszolgáló", "serveris",
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme",
} {
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
}

View file

@ -38,6 +38,7 @@ import (
const (
lfsAuthenticateVerb = "git-lfs-authenticate"
gitAnnexShellVerb = "git-annex-shell"
)
// CmdServ represents the available serv sub-command.
@ -79,6 +80,7 @@ var (
"git-upload-archive": perm.AccessModeRead,
"git-receive-pack": perm.AccessModeWrite,
lfsAuthenticateVerb: perm.AccessModeNone,
gitAnnexShellVerb: perm.AccessModeNone, // annex permissions are enforced by GIT_ANNEX_SHELL_READONLY, rather than the Gitea API
}
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`)
)
@ -212,6 +214,28 @@ func runServ(c *cli.Context) error {
}
}
if verb == gitAnnexShellVerb {
if !setting.Annex.Enabled {
return fail(ctx, "Unknown git command", "git-annex request over SSH denied, git-annex support is disabled")
}
if len(words) < 3 {
return fail(ctx, "Too few arguments", "Too few arguments in cmd: %s", cmd)
}
// git-annex always puts the repo in words[2], unlike most other
// git subcommands; and it sometimes names repos like /~/, as if
// $HOME should get expanded while also being rooted. e.g.:
// git-annex-shell 'configlist' '/~/user/repo'
// git-annex-shell 'sendkey' '/user/repo 'key'
repoPath = words[2]
repoPath = strings.TrimPrefix(repoPath, "/")
repoPath = strings.TrimPrefix(repoPath, "~/")
}
// prevent directory traversal attacks
repoPath = filepath.Clean("/" + repoPath)[1:]
rr := strings.SplitN(repoPath, "/", 2)
if len(rr) != 2 {
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
@ -225,6 +249,18 @@ func runServ(c *cli.Context) error {
// so that username and reponame are not affected.
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
// put the sanitized repoPath back into the argument list for later
if verb == gitAnnexShellVerb {
// git-annex-shell demands an absolute path
absRepoPath, err := filepath.Abs(filepath.Join(setting.RepoRootPath, repoPath))
if err != nil {
return fail(ctx, "Error locating repoPath", "%v", err)
}
words[2] = absRepoPath
} else {
words[1] = repoPath
}
if alphaDashDotPattern.MatchString(reponame) {
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
}
@ -303,21 +339,45 @@ func runServ(c *cli.Context) error {
return nil
}
var gitcmd *exec.Cmd
gitBinPath := filepath.Dir(git.GitExecutable) // e.g. /usr/bin
gitBinVerb := filepath.Join(gitBinPath, verb) // e.g. /usr/bin/git-upload-pack
if _, err := os.Stat(gitBinVerb); err != nil {
gitBinVerb, err := exec.LookPath(verb)
if err != nil {
// if the command "git-upload-pack" doesn't exist, try to split "git-upload-pack" to use the sub-command with git
// ps: Windows only has "git.exe" in the bin path, so Windows always uses this way
// ps: git-annex-shell and other extensions may not necessarily be in gitBinPath,
// but '{gitBinPath}/git annex-shell' should be able to find them on $PATH.
verbFields := strings.SplitN(verb, "-", 2)
if len(verbFields) == 2 {
// use git binary with the sub-command part: "C:\...\bin\git.exe", "upload-pack", ...
gitcmd = exec.CommandContext(ctx, git.GitExecutable, verbFields[1], repoPath)
gitBinVerb = git.GitExecutable
words = append([]string{verbFields[1]}, words...)
}
}
if gitcmd == nil {
// by default, use the verb (it has been checked above by allowedCommands)
gitcmd = exec.CommandContext(ctx, gitBinVerb, repoPath)
// by default, use the verb (it has been checked above by allowedCommands)
gitcmd := exec.CommandContext(ctx, gitBinVerb, words[1:]...)
if verb == gitAnnexShellVerb {
// This doesn't get its own isolated section like LFS does, because LFS
// is handled by internal Gitea routines, but git-annex has to be shelled out
// to like other git subcommands, so we need to build up gitcmd.
// TODO: does this work on Windows?
gitcmd.Env = append(gitcmd.Env,
// "If set, disallows running git-shell to handle unknown commands."
// - git-annex-shell(1)
"GIT_ANNEX_SHELL_LIMITED=True",
// "If set, git-annex-shell will refuse to run commands
// that do not operate on the specified directory."
// - git-annex-shell(1)
fmt.Sprintf("GIT_ANNEX_SHELL_DIRECTORY=%s", words[2]),
)
if results.UserMode < perm.AccessModeWrite {
// "If set, disallows any action that could modify the git-annex repository."
// - git-annex-shell(1)
// We set this when the backend API has told us that we don't have write permission to this repo.
log.Debug("Setting GIT_ANNEX_SHELL_READONLY=True")
gitcmd.Env = append(gitcmd.Env, "GIT_ANNEX_SHELL_READONLY=True")
}
}
process.SetSysProcAttribute(gitcmd)

View file

@ -9,6 +9,7 @@ import (
"net"
"net/http"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
@ -247,6 +248,12 @@ func runWeb(ctx *cli.Context) error {
createPIDFile(ctx.String("pid"))
}
if setting.Annex.Enabled {
if _, err := exec.LookPath("git-annex"); err != nil {
log.Fatal("You have enabled git-annex support but git-annex is not installed. Please make sure that Forgejo's PATH contains the git-annex executable.")
}
}
if !setting.InstallLock {
if err := serveInstall(ctx); err != nil {
return err
@ -311,6 +318,10 @@ func listen(m http.Handler, handleRedirector bool) error {
log.Info("LFS server enabled")
}
if setting.Annex.Enabled {
log.Info("git-annex enabled")
}
var err error
switch setting.Protocol {
case setting.HTTP:

View file

@ -2678,6 +2678,17 @@ LEVEL = Info
;; Limit the number of concurrent upload/download operations within a batch
;BATCH_OPERATION_CONCURRENCY = 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;[annex]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Whether git-annex is enabled; defaults to false
;ENABLED = false
;; Whether to disable p2phttp support; default is the same as repository.DISABLE_HTTP_GIT
;DISABLE_P2PHTTP = false
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; settings for packages, will override storage setting

20
go.mod
View file

@ -5,7 +5,7 @@ go 1.23
toolchain go1.23.4
require (
code.forgejo.org/f3/gof3/v3 v3.7.0
code.forgejo.org/f3/gof3/v3 v3.10.2
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
code.forgejo.org/forgejo/reply v1.0.2
code.forgejo.org/go-chi/binding v1.0.0
@ -19,10 +19,10 @@ require (
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
github.com/ProtonMail/go-crypto v1.0.0
github.com/ProtonMail/go-crypto v1.1.3
github.com/PuerkitoBio/goquery v1.10.0
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
github.com/alecthomas/chroma/v2 v2.14.0
github.com/alecthomas/chroma/v2 v2.15.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.4
github.com/buildkite/terminal-to-html/v3 v3.16.4
@ -44,7 +44,7 @@ require (
github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.9.1
github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e
github.com/go-git/go-git/v5 v5.11.0
github.com/go-git/go-git/v5 v5.13.1
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.20.14
github.com/go-sql-driver/mysql v1.8.1
@ -89,7 +89,7 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
github.com/sassoftware/go-rpmutils v0.4.0
github.com/sergi/go-diff v1.3.1
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
@ -131,6 +131,7 @@ require (
dario.cat/mergo v1.0.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
github.com/42wim/httpsig v1.2.2 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
@ -168,11 +169,11 @@ require (
github.com/cloudflare/circl v1.3.8 // indirect
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // 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
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dlclark/regexp2 v1.11.0 // indirect
github.com/dlclark/regexp2 v1.11.4 // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/envoyproxy/go-control-plane v0.13.1 // indirect
@ -184,7 +185,7 @@ require (
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-enry/go-oniguruma v1.2.1 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/go-git/go-billy/v5 v5.6.1 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@ -246,13 +247,14 @@ require (
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.2.1 // indirect
github.com/skeema/knownhosts v1.3.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // 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/blake3 v0.2.4 // indirect
gitlab.com/gitlab-org/api/client-go v0.116.0 // indirect
go.etcd.io/bbolt v1.3.9 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect

58
go.sum
View file

@ -610,8 +610,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4=
code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw=
code.forgejo.org/f3/gof3/v3 v3.10.2 h1:EOlv9d8GR7l0BmvZF101O3LUuabb4g5Hw5fKYPiPZlI=
code.forgejo.org/f3/gof3/v3 v3.10.2/go.mod h1:qApIHumpBkFkeBEokviO28+HK2WM11IsmMOhmjvCjFQ=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
code.forgejo.org/forgejo/act v1.22.0 h1:NbUf0+vQ48+ddwe4zVkINqnxKYl/to+NUvW7iisPA60=
@ -651,6 +651,8 @@ gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHq
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
@ -674,8 +676,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
@ -686,11 +688,11 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
@ -768,7 +770,6 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q=
github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
@ -796,7 +797,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@ -817,8 +817,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig
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.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@ -837,8 +837,8 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
@ -849,8 +849,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ=
github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
@ -929,12 +929,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA=
github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M=
github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@ -1300,8 +1300,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@ -1373,8 +1373,8 @@ github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jN
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs=
@ -1382,8 +1382,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@ -1449,6 +1449,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
gitlab.com/gitlab-org/api/client-go v0.116.0 h1:Dy534gtZPMrnm3fAcmQRMadrcoUyFO4FQ4rXlSAdHAw=
gitlab.com/gitlab-org/api/client-go v0.116.0/go.mod h1:B29OfnZklmaoiR7uHANh9jTyfWEgmXvZLVEnosw2Dx0=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@ -1501,8 +1503,6 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
@ -1522,6 +1522,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=

View file

@ -52,10 +52,10 @@ type WebAuthnCredential struct {
AAGUID []byte
SignCount uint32 `xorm:"BIGINT"`
CloneWarning bool
BackupEligible bool `XORM:"NOT NULL DEFAULT false"`
BackupState bool `XORM:"NOT NULL DEFAULT false"`
BackupEligible bool `xorm:"NOT NULL DEFAULT false"`
BackupState bool `xorm:"NOT NULL DEFAULT false"`
// If legacy is set to true, backup_eligible and backup_state isn't set.
Legacy bool `XORM:"NOT NULL DEFAULT true"`
Legacy bool `xorm:"NOT NULL DEFAULT true"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}

View file

@ -96,3 +96,14 @@
num_issues: 0
num_closed_issues: 0
archived_unix: 0
-
id: 10
repo_id: 3
org_id: 0
name: repo3label1
color: '#112233'
exclusive: false
num_issues: 0
num_closed_issues: 0
archived_unix: 0

View file

@ -416,20 +416,6 @@ func (issue *Issue) SummaryCardURL() string {
return fmt.Sprintf("%s/summary-card", issue.HTMLURL())
}
func (issue *Issue) SummaryCardSize() (int, int) {
return 1200, 600
}
func (issue *Issue) SummaryCardWidth() int {
width, _ := issue.SummaryCardSize()
return width
}
func (issue *Issue) SummaryCardHeight() int {
_, height := issue.SummaryCardSize()
return height
}
// Link returns the issue's relative URL.
func (issue *Issue) Link() string {
var path string

View file

@ -353,6 +353,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st
Find(&labelIDs)
}
// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org.
func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) {
labelIDs := make([]int64, 0, len(labelNames))
return labelIDs, db.GetEngine(ctx).Table("label").
Where("org_id = ?", orgID).
In("name", labelNames).
Asc("name").
Cols("id").
Find(&labelIDs)
}
// BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names
func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder {
return builder.Select("issue_label.issue_id").

View file

@ -4,6 +4,8 @@
package v1_23 //nolint
import (
"fmt"
"code.gitea.io/gitea/models/migrations/base"
"xorm.io/xorm"
@ -13,20 +15,26 @@ func GiteaLastDrop(x *xorm.Engine) error {
sess := x.NewSession()
defer sess.Close()
if err := base.DropTableColumns(sess, "badge", "slug"); err != nil {
return err
}
if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil {
return err
}
if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil {
return err
}
// the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped
// but it does not exist in Forgejo and a failure to drop the column can be ignored
base.DropTableColumns(sess, "repo_unit", "everyone_access_mode")
if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil {
return err
for _, drop := range []struct {
table string
field string
}{
{"badge", "slug"},
{"oauth2_application", "skip_secondary_authorization"},
{"repository", "default_wiki_branch"},
{"repo_unit", "everyone_access_mode"},
{"protected_branch", "can_force_push"},
{"protected_branch", "enable_force_push_allowlist"},
{"protected_branch", "force_push_allowlist_user_i_ds"},
{"protected_branch", "force_push_allowlist_team_i_ds"},
{"protected_branch", "force_push_allowlist_deploy_keys"},
} {
if _, err := sess.Exec(fmt.Sprintf("SELECT `%s` FROM `%s` WHERE 0 = 1", drop.field, drop.table)); err != nil {
continue
}
if err := base.DropTableColumns(sess, drop.table, drop.field); err != nil {
return err
}
}
return sess.Commit()

View file

@ -97,13 +97,11 @@ func init() {
// LoadAttributes load repo and publisher attributes for a release
func (r *Release) LoadAttributes(ctx context.Context) error {
var err error
if r.Repo == nil {
r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
if err != nil {
return err
}
err := r.LoadRepo(ctx)
if err != nil {
return err
}
if r.Publisher == nil {
r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID)
if err != nil {
@ -123,6 +121,18 @@ func (r *Release) LoadAttributes(ctx context.Context) error {
return GetReleaseAttachments(ctx, r)
}
// LoadRepo load repo attribute for release
func (r *Release) LoadRepo(ctx context.Context) error {
if r.Repo != nil {
return nil
}
var err error
r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
return err
}
// LoadArchiveDownloadCount loads the download count for the source archives
func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
var err error
@ -130,6 +140,25 @@ func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
return err
}
// GetTotalDownloadCount returns the summary of all dowload count of files attached to the release
func (r *Release) GetTotalDownloadCount(ctx context.Context) (int64, error) {
var archiveCount int64
if !r.HideArchiveLinks {
_, err := db.GetEngine(ctx).SQL("SELECT SUM(count) FROM repo_archive_download_count WHERE release_id = ?", r.ID).Get(&archiveCount)
if err != nil {
return 0, err
}
}
var attachmentCount int64
_, err := db.GetEngine(ctx).SQL("SELECT SUM(download_count) FROM attachment WHERE release_id = ?", r.ID).Get(&attachmentCount)
if err != nil {
return 0, err
}
return archiveCount + attachmentCount, nil
}
// APIURL the api url for a release. release must have attributes loaded
func (r *Release) APIURL() string {
return r.Repo.APIURL() + "/releases/" + strconv.FormatInt(r.ID, 10)
@ -160,6 +189,20 @@ func (r *Release) Link() string {
return r.Repo.Link() + "/releases/tag/" + util.PathEscapeSegments(r.TagName)
}
// SummaryCardURL returns the absolute URL to an image providing a summary of the release
func (r *Release) SummaryCardURL() string {
return fmt.Sprintf("%s/releases/summary-card/%s", r.Repo.HTMLURL(), util.PathEscapeSegments(r.TagName))
}
// DisplayName retruns the name of the release
func (r *Release) DisplayName() string {
if r.IsTag && r.Title == "" {
return r.TagName
}
return r.Title
}
// IsReleaseExist returns true if release with given tag name already exists.
func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, error) {
if len(tagName) == 0 {

View file

@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -25,3 +26,26 @@ func TestMigrate_InsertReleases(t *testing.T) {
err := InsertReleases(db.DefaultContext, r)
require.NoError(t, err)
}
func TestReleaseLoadRepo(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
release := unittest.AssertExistsAndLoadBean(t, &Release{ID: 1})
assert.Nil(t, release.Repo)
require.NoError(t, release.LoadRepo(db.DefaultContext))
assert.EqualValues(t, 1, release.Repo.ID)
}
func TestReleaseDisplayName(t *testing.T) {
release := Release{TagName: "TagName"}
assert.Empty(t, release.DisplayName())
release.IsTag = true
assert.Equal(t, "TagName", release.DisplayName())
release.Title = "Title"
assert.Equal(t, "Title", release.DisplayName())
}

View file

@ -327,6 +327,11 @@ func (repo *Repository) HTMLURL() string {
return setting.AppURL + url.PathEscape(repo.OwnerName) + "/" + url.PathEscape(repo.Name)
}
// SummaryCardURL returns the absolute URL to an image providing a summary of the repo
func (repo *Repository) SummaryCardURL() string {
return fmt.Sprintf("%s/-/summary-card", repo.HTMLURL())
}
// CommitLink make link to by commit full ID
// note: won't check whether it's an right id
func (repo *Repository) CommitLink(commitID string) (result string) {

192
modules/annex/annex.go Normal file
View file

@ -0,0 +1,192 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
// Unlike modules/lfs, which operates mainly on git.Blobs, this operates on git.TreeEntrys.
// The motivation for this is that TreeEntrys have an easy pointer to the on-disk repo path,
// while blobs do not (in fact, if building with TAGS=gogit, blobs might exist only in a mock
// filesystem, living only in process RAM). We must have the on-disk path to do anything
// useful with git-annex because all of its interesting data is on-disk under .git/annex/.
package annex
import (
"errors"
"fmt"
"io/fs"
"os"
"path"
"path/filepath"
"regexp"
"strings"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/typesniffer"
)
// ErrBlobIsNotAnnexed occurs if a blob does not contain a valid annex key
var ErrBlobIsNotAnnexed = errors.New("not a git-annex pointer")
func LookupKey(blob *git.Blob) (string, error) {
stdout, _, err := git.NewCommand(git.DefaultContext, "annex", "lookupkey", "--ref").AddDynamicArguments(blob.ID.String()).RunStdString(&git.RunOpts{Dir: blob.Repo().Path})
if err != nil {
return "", ErrBlobIsNotAnnexed
}
key := strings.TrimSpace(stdout)
return key, nil
}
func ContentLocationFromKey(repoPath, key string) (string, error) {
contentLocation, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, "annex", "contentlocation").AddDynamicArguments(key).RunStdString(&git.RunOpts{Dir: repoPath})
if err != nil {
return "", fmt.Errorf("in %s: %s does not seem to be a valid annexed file: %w", repoPath, key, err)
}
contentLocation = strings.TrimSpace(contentLocation)
contentLocation = path.Clean("/" + contentLocation)[1:] // prevent directory traversals
contentLocation = path.Join(repoPath, contentLocation)
return contentLocation, nil
}
// return the absolute path of the content pointed to by the annex pointer stored in the git object
// errors if the content is not found in this repo
func ContentLocation(blob *git.Blob) (string, error) {
key, err := LookupKey(blob)
if err != nil {
return "", err
}
return ContentLocationFromKey(blob.Repo().Path, key)
}
// returns a stream open to the annex content
func Content(blob *git.Blob) (*os.File, error) {
contentLocation, err := ContentLocation(blob)
if err != nil {
return nil, err
}
return os.Open(contentLocation)
}
// whether the object appears to be a valid annex pointer
// does *not* verify if the content is actually in this repo;
// for that, use ContentLocation()
func IsAnnexed(blob *git.Blob) (bool, error) {
if !setting.Annex.Enabled {
return false, nil
}
// LookupKey is written to only return well-formed keys
// so the test is just to see if it errors
_, err := LookupKey(blob)
if err != nil {
if errors.Is(err, ErrBlobIsNotAnnexed) {
return false, nil
}
return false, err
}
return true, nil
}
// IsAnnexRepo determines if repo is a git-annex enabled repository
func IsAnnexRepo(repo *git.Repository) bool {
_, _, err := git.NewCommand(repo.Ctx, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repo.Path})
return err == nil
}
var repoConfigFileRe = regexp.MustCompile("[^/]+/[^/]+.git/config$")
var (
uuid2repoPathCache = make(map[string]string)
repoPath2uuidCache = make(map[string]string)
)
func Init() error {
if !setting.Annex.Enabled {
return nil
}
log.Info("Populating the git-annex UUID cache with existing repositories")
return updateUUID2RepoPathCache()
}
func updateUUID2RepoPathCache() error {
return filepath.WalkDir(setting.RepoRootPath, func(path string, d fs.DirEntry, err error) error {
if err == nil && repoConfigFileRe.MatchString(path) {
thisRepoPath := strings.TrimSuffix(path, "/config")
_, ok := repoPath2uuidCache[thisRepoPath]
if ok {
return nil
}
stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: thisRepoPath})
if err != nil {
return nil
}
repoUUID := strings.TrimSpace(stdout)
if repoUUID != "" {
uuid2repoPathCache[repoUUID] = thisRepoPath
repoPath2uuidCache[thisRepoPath] = repoUUID
}
}
return nil
})
}
func repoPathFromUUIDCache(uuid string) (string, error) {
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
return repoPath, nil
}
// If the cache didn't contain an entry for the UUID then update the cache and try again
if err := updateUUID2RepoPathCache(); err != nil {
return "", err
}
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
return repoPath, nil
}
return "", fmt.Errorf("no repository known for UUID '%s'", uuid)
}
func checkValidity(uuid, repoPath string) (bool, error) {
stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath})
if err != nil {
return false, err
}
repoUUID := strings.TrimSpace(stdout)
return uuid == repoUUID, nil
}
func removeCachedEntries(uuid, repoPath string) {
delete(uuid2repoPathCache, uuid)
delete(repoPath2uuidCache, repoPath)
}
func UUID2RepoPath(uuid string) (string, error) {
// Get the current cache entry for the UUID
repoPath, err := repoPathFromUUIDCache(uuid)
if err != nil {
return "", err
}
// Check if it is still up-to-date
valid, err := checkValidity(uuid, repoPath)
if err != nil {
return "", err
}
if !valid {
// If it isn't, remove the cache entry and try again
removeCachedEntries(uuid, repoPath)
return UUID2RepoPath(uuid)
}
// Otherwise just return the cached entry
return repoPath, nil
}
// GuessContentType guesses the content type of the annexed blob.
func GuessContentType(blob *git.Blob) (typesniffer.SniffedType, error) {
r, err := Content(blob)
if err != nil {
return typesniffer.SniffedType{}, err
}
defer r.Close()
return typesniffer.DetectContentTypeFromReader(r)
}

View file

@ -16,6 +16,7 @@ import (
"strings"
"unicode/utf8"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
@ -101,6 +102,12 @@ func Int64sToStrings(ints []int64) []string {
// EntryIcon returns the octicon class for displaying files/directories
func EntryIcon(entry *git.TreeEntry) string {
isAnnexed, _ := annex.IsAnnexed(entry.Blob())
if isAnnexed {
// Show git-annex files as binary files to differentiate them from non-annexed files
// TODO: find a more suitable icon, maybe something related to git-annex
return "file-binary"
}
switch {
case entry.IsLink():
te, _, err := entry.FollowLink()

View file

@ -5,6 +5,7 @@ package card
import (
"bytes"
"fmt"
"image"
"image/color"
"io"
@ -35,12 +36,19 @@ type Card struct {
Img *image.RGBA
Font *truetype.Font
Margin int
Width int
Height int
}
var fontCache = sync.OnceValues(func() (*truetype.Font, error) {
return truetype.Parse(goregular.TTF)
})
// DefaultSize returns the default size for a card
func DefaultSize() (int, int) {
return 1200, 600
}
// NewCard creates a new card with the given dimensions in pixels
func NewCard(width, height int) (*Card, error) {
img := image.NewRGBA(image.Rect(0, 0, width, height))
@ -55,6 +63,8 @@ func NewCard(width, height int) (*Card, error) {
Img: img,
Font: font,
Margin: 0,
Width: width,
Height: height,
}, nil
}
@ -67,14 +77,14 @@ func (c *Card) Split(vertical bool, percentage int) (*Card, *Card) {
mid := (bounds.Dx() * percentage / 100) + bounds.Min.X
subleft := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, mid, bounds.Max.Y)).(*image.RGBA)
subright := c.Img.SubImage(image.Rect(mid, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
return &Card{Img: subleft, Font: c.Font},
&Card{Img: subright, Font: c.Font}
return &Card{Img: subleft, Font: c.Font, Width: subleft.Bounds().Dx(), Height: subleft.Bounds().Dy()},
&Card{Img: subright, Font: c.Font, Width: subright.Bounds().Dx(), Height: subright.Bounds().Dy()}
}
mid := (bounds.Dy() * percentage / 100) + bounds.Min.Y
subtop := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, mid)).(*image.RGBA)
subbottom := c.Img.SubImage(image.Rect(bounds.Min.X, mid, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
return &Card{Img: subtop, Font: c.Font},
&Card{Img: subbottom, Font: c.Font}
return &Card{Img: subtop, Font: c.Font, Width: subtop.Bounds().Dx(), Height: subtop.Bounds().Dy()},
&Card{Img: subbottom, Font: c.Font, Width: subbottom.Bounds().Dx(), Height: subbottom.Bounds().Dy()}
}
// SetMargin sets the margins for the card
@ -244,9 +254,14 @@ func (c *Card) fetchExternalImage(url string) (image.Image, bool) {
},
}
// Go expects a absolute URL, so we must change a relative to an absolute one
if !strings.Contains(url, "://") {
url = fmt.Sprintf("%s%s", setting.AppURL, strings.TrimPrefix(url, "/"))
}
resp, err := client.Get(url)
if err != nil {
log.Warn("error when fetching external image from %s: %w", url, err)
log.Warn("error when fetching external image from %s: %v", url, err)
return nil, false
}
defer resp.Body.Close()
@ -321,3 +336,8 @@ func (c *Card) DrawExternalImage(url string) {
}
c.DrawImage(image)
}
// DrawRect draws a rect with the given color
func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) {
draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src)
}

View file

@ -126,6 +126,10 @@ func (b *blobReader) Close() error {
return nil
}
func (b *Blob) Repo() *Repository {
return b.repo
}
// Name returns name of the tree entry this blob object was created from (or empty string)
func (b *Blob) Name() string {
return b.name

View file

@ -457,12 +457,13 @@ func (c *Command) RunStdBytes(opts *RunOpts) (stdout, stderr []byte, runErr RunS
}
// AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests
// It also re-enables git-credential(1), which is used to test git-annex's HTTP support
func AllowLFSFiltersArgs() TrustedCmdArgs {
// Now here we should explicitly allow lfs filters to run
filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs))
j := 0
for _, arg := range globalCommandArgs {
if strings.Contains(string(arg), "lfs") {
if strings.Contains(string(arg), "lfs") || strings.Contains(string(arg), "credential") {
j--
} else {
filteredLFSGlobalArgs[j] = arg

View file

@ -12,6 +12,7 @@ import (
"runtime"
"strings"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
@ -86,8 +87,22 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
commands = strings.Fields(command)
args = commands[1:]
)
if p.IsInputFile {
isAnnexed, _ := annex.IsAnnexed(ctx.Blob)
// if a renderer wants to read a file, and we have annexed content, we can
// provide the annex key file location directly to the renderer. git-annex
// takes care of having that location be read-only, so no critical
// protection layer is needed. Moreover, the file readily exists, and
// expensive temporary files can be avoided, also allowing an operator
// to raise MAX_DISPLAY_FILE_SIZE without much negative impact.
if p.IsInputFile && isAnnexed {
// look for annexed content, will be empty, if there is none
annexContentLocation, _ := annex.ContentLocation(ctx.Blob)
// we call the renderer, even if there is no annex content present.
// showing the pointer file content is not much use, and a topical
// renderer might be able to produce something useful from the
// filename alone (present in ENV)
args = append(args, annexContentLocation)
} else if p.IsInputFile {
// write to temp file
f, err := os.CreateTemp("", "gitea_input")
if err != nil {
@ -130,6 +145,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
os.Environ(),
"GITEA_PREFIX_SRC="+ctx.Links.SrcLink(),
"GITEA_PREFIX_RAW="+ctx.Links.RawLink(),
// also communicate the relative path of the to-be-rendered item.
// this enables the renderer to make use of the original file name
// and path, e.g., to make rendering or dtype-detection decisions
// that go beyond the originally matched extension. Even if the
// content is directly streamed to STDIN
"GITEA_RELATIVE_PATH="+ctx.RelativePath,
)
if !p.IsInputFile {
cmd.Stdin = input

View file

@ -152,8 +152,8 @@ func HelloWorld() {
}
#+end_src
`, `<div class="src src-go">
<pre><code class="chroma language-go"><span class="c1">// HelloWorld prints &#34;Hello World&#34;
</span><span class="c1"></span><span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span>
<pre><code class="chroma language-go"><span class="c1">// HelloWorld prints &#34;Hello World&#34;</span>
<span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello World&#34;</span><span class="p">)</span>
<span class="p">}</span></code></pre>
</div>`)

View file

@ -67,14 +67,18 @@ type Header struct {
// RenderContext represents a render context
type RenderContext struct {
Ctx context.Context
RelativePath string // relative path from tree root of the branch
Type string
IsWiki bool
Links Links
Metas map[string]string
DefaultLink string
GitRepo *git.Repository
Ctx context.Context
RelativePath string // relative path from tree root of the branch
Type string
IsWiki bool
Links Links
Metas map[string]string
DefaultLink string
GitRepo *git.Repository
// reporting the target blob that is to-be-rendered enables
// deeper inspection in the handler for external renderer
// (i.e., more targeted handling of annexed files)
Blob *git.Blob
ShaExistCache map[string]bool
cancelFn func()
SidebarTocNode ast.Node

View file

@ -40,6 +40,7 @@ type ServCommandResults struct {
UserName string
UserEmail string
UserID int64
UserMode perm.AccessMode
OwnerName string
RepoName string
RepoID int64

View file

@ -32,7 +32,7 @@ var (
// issueNumericPattern matches string that references to a numeric issue, e.g. #1287
issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\'|\")([#!][0-9]+)(?:\s|$|\)|\]|\'|\"|[:;,.?!]\s|[:;,.?!]$)`)
// issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\')`)
issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\'|,)`)
// crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository
// e.g. org/repo#12345
crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+[#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`)

View file

@ -466,6 +466,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) {
"ABC-123:",
"\"ABC-123\"",
"'ABC-123'",
"ABC-123, unknown PR",
}
falseTestCases := []string{
"RC-08",

25
modules/setting/annex.go Normal file
View file

@ -0,0 +1,25 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package setting
import (
"code.gitea.io/gitea/modules/log"
)
// Annex represents the configuration for git-annex
var Annex = struct {
Enabled bool `ini:"ENABLED"`
DisableP2PHTTP bool `ini:"DISABLE_P2PHTTP"`
}{}
func loadAnnexFrom(rootCfg ConfigProvider) {
sec := rootCfg.Section("annex")
if err := sec.MapTo(&Annex); err != nil {
log.Fatal("Failed to map Annex settings: %v", err)
}
if !sec.HasKey("DISABLE_P2PHTTP") {
// If DisableP2PHTTP is not explicitly set then use DisableHTTPGit as its default
Annex.DisableP2PHTTP = Repository.DisableHTTPGit
}
}

View file

@ -153,6 +153,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error {
loadCamoFrom(cfg)
loadI18nFrom(cfg)
loadGitFrom(cfg)
loadAnnexFrom(cfg)
loadMirrorFrom(cfg)
loadMarkupFrom(cfg)
loadQuotaFrom(cfg)

View file

@ -103,6 +103,10 @@ func NewFuncMap() template.FuncMap {
"AppVer": func() string {
return setting.AppVer
},
"AppVerNoMetadata": func() string {
version, _, _ := strings.Cut(setting.AppVer, "+")
return version
},
"AppDomain": func() string { // documented in mail-templates.md
return setting.Domain
},

View file

@ -4,7 +4,9 @@
package util
import (
"io/fs"
"os"
"path/filepath"
"runtime"
"syscall"
"time"
@ -41,10 +43,48 @@ func Remove(name string) error {
return err
}
// RemoveAll removes the named file or (empty) directory with at most 5 attempts.
// MakeWritable recursively makes the named directory writable.
func MakeWritable(name string) error {
return filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error {
// NB: this is called WalkDir but it works on a single file too
if err == nil {
info, err := d.Info()
if err != nil {
return err
}
// Don't try chmod'ing symlinks (will fail with broken symlinks)
if info.Mode()&os.ModeSymlink != os.ModeSymlink {
// 0200 == u+w, in octal unix permission notation
err = os.Chmod(path, info.Mode()|0o200)
if err != nil {
return err
}
}
}
return nil
})
}
// RemoveAll removes the named file or directory with at most 5 attempts.
func RemoveAll(name string) error {
var err error
for i := 0; i < 5; i++ {
// Do chmod -R +w to help ensure the removal succeeds.
// In particular, in the git-annex case, this handles
// https://git-annex.branchable.com/internals/lockdown/ :
//
// > (The only bad consequence of this is that rm -rf .git
// > doesn't work unless you first run chmod -R +w .git)
err = MakeWritable(name)
if err != nil {
// try again
<-time.After(100 * time.Millisecond)
continue
}
err = os.RemoveAll(name)
if err == nil {
break

View file

@ -111,6 +111,7 @@ new_migrate.link = Нова миграция
new_org.link = Нова организация
copy_generic = Копиране в клипборда
copy_error = Неуспешно копиране
copy_path = Копиране на пътя
[settings]
ui = Тема
@ -159,7 +160,7 @@ comment_type_group_milestone = Етап
manage_emails = Управление на адресите на ел. поща
permission_read = Четене
update_password = Обновяване на паролата
biography_placeholder = Разкажете ни малко за себе си! (Можете да използвате Markdown)
biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун)
orgs = Организации
continue = Продължаване
blocked_users = Блокирани потребители
@ -224,7 +225,7 @@ key_signature_gpg_placeholder = Започва с „-----BEGIN PGP SIGNATURE---
key_signature_ssh_placeholder = Започва с „-----BEGIN SSH SIGNATURE-----“
saved_successfully = Настройките бяха запазени успешно.
no_activity = Няма скорошна дейност
theme_desc = Това ще бъде вашата тема по подразбиране в целия сайт.
theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли.
keep_activity_private = Скриване на дейността от профилната страница
lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща
password_incorrect = Текущата парола е неправилна.
@ -235,7 +236,7 @@ twofa_disabled = Двуфакторното удостоверяване е из
orgs_none = Не сте участник в никакви организации.
repos_none = Не притежавате никакви хранилища.
blocked_users_none = Няма блокирани потребители.
profile_desc = Контролирайте как вашият профил се показва на другите потребители. Вашият основен адрес на ел. поща ще се използва за известия, възстановяване на паролата и уеб базирани Git операции.
profile_desc = Вашият профил
permission_write = Четене и писане
twofa_disable = Изключване на двуфакторното удостоверяване
twofa_enroll = Включване на двуфакторно удостоверяване
@ -252,6 +253,9 @@ gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
language.title = Език по подразбиране
language.localization_project = Помогнете ни да преведем Forgejo на вашия език! <a href="%s">Научете повече</a>.
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
pronouns_custom = Персонализирани
visibility.limited_tooltip = Видимо само за влезли потребители
pronouns_custom_label = Персонализирани местоимения
[packages]
container.labels.value = Стойност
@ -280,6 +284,9 @@ dependencies = Зависимости
published_by_in = Публикуван %[1]s от <a href="%[2]s">%[3]s</a> в <a href="%[4]s"><strong>%[5]s</strong></a>
published_by = Публикуван %[1]s от <a href="%[2]s">%[3]s</a>
generic.download = Изтеглете пакета от командния ред:
container.details.type = Тип образ
alpine.repository = За хранилището
container.images.title = Образи
[tool]
hours = %d часа
@ -397,7 +404,7 @@ issues.keyword_search_unavailable = В момента търсенето по к
repo_desc_helper = Въведете кратко описание (опционално)
mirror_address = Клониране от URL
owner_helper = Някои организации може да не се показват в падащото меню поради ограничение за максимален брой хранилища.
new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? <a href="%s">Мигрирайте хранилище.</a>
new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? <a href="%s">Мигрирайте хранилище</a>.
repo_name_helper = Добрите имена на хранилища използват кратки, запомнящи се и уникални ключови думи.
migrated_from = Мигрирано от <a href="%[1]s">%[2]s</a>
visibility_description = Само притежателят или участниците в организацията, ако имат права, ще могат да го видят.
@ -424,14 +431,14 @@ settings.add_webhook = Добавяне на уеб-кука
template.webhooks = Уеб-куки
issues.label_templates.info = Все още няма етикети. Създайте етикет с „Нов етикет“ или използвайте предварително зададен набор от етикети:
labels = Етикети
license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте <a target="_blank" rel="noopener noreferrer" href="%s">Избиране на лиценз.</a>
license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте <a target="_blank" rel="noopener noreferrer" href="%s">Избиране на лиценз</a>.
issues.choose.blank = По подразбиране
settings.hooks = Уеб-куки
issue_labels = Етикети
issue_labels_helper = Изберете набор от етикети
readme_helper_desc = Това е мястото, където можете да напишете пълно описание на вашия проект.
repo_gitignore_helper = Изберете .gitignore шаблони
auto_init = Да се инициализира хранилище (Добавя .gitignore, License и README)
auto_init = Да се инициализира хранилище
template.issue_labels = Етикети за задачите
migrate_items_labels = Етикети
issues.label_templates.title = Зареждане на предв. зададен набор от етикети
@ -815,7 +822,7 @@ diff.browse_source = Разглеждане на изходния код
file_view_rendered = Преглед на визуализация
issues.lock_with_reason = заключи като <strong>%s</strong> и ограничи обсъждането до сътрудници %s
milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им.
release.edit = редактиране
release.edit = Редактиране
activity.published_release_label = Издание
activity.navbar.contributors = Допринесли
pulls.recently_pushed_new_branches = Изтласкахте в клона <a href="%[3]s"><strong>%[1]s</strong></a> %[2]s
@ -939,7 +946,7 @@ pulls.approve_count_1 = %d одобрение
pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
pulls.num_conflicting_files_1 = %d конфликтен файл
activity.git_stats_commit_n = %d подавания
settings.event_issues = Модификация
settings.event_issues = Изменение
branch.delete_head = Изтриване
branch.delete = Изтриване на клона „%s“
branch.delete_html = Изтриване на клона
@ -1113,7 +1120,7 @@ pulls.reject_count_1 = %d поискана промяна
issues.review.show_resolved = Показване на решено
issues.review.hide_resolved = Скриване на решено
issues.review.resolve_conversation = Решаване на обсъждането
diff.comment.markdown_info = Поддържа се стилизиране с markdown.
diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун.
diff.file_suppressed = Разликите не са показани, защото са твърде много
pulls.reject_count_n = %d поискани промени
settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране
@ -1195,6 +1202,95 @@ issues.all_title = Общо
issues.new.assign_to_me = Възлагане на мен
ext_wiki = Външно уики
ext_issues = Външни задачи
readme_helper = Изберете шаблон за файл README
settings.event_pull_request_review_desc = Заявка за сливане е одобрена, отхвърлена или са добавени рецензионни коментари.
settings.event_pull_request_review = Рецензии
issues.filter_sort.relevance = Съответствие
settings.confirm_wiki_branch_rename = Преименуване на клона на уикито
settings.webhook.request = Заявка
settings.webhook.response = Отговор
settings.event_create = Създаване
settings.event_push_only = Събития при изтласкване
settings.event_delete = Изтриване
settings.event_header_repository = Събития за хранилището
settings.event_fork_desc = Хранилище е разклонено.
settings.event_fork = Разклоняване
settings.event_wiki_desc = Уики страница е създадена, преименувана, редактирана или изтрита.
settings.event_issue_milestone = Етапи
settings.event_pull_request_milestone_desc = Етап е добавен, премахнат или изменен.
settings.event_pull_request_label_desc = Етикети на заявка за сливане са добавени или премахнати.
settings.event_pull_request_merge = Сливане на заявка за сливане
settings.archive.tagsettings_unavailable = Настройките за маркери не са налични в архивирани хранилища.
settings.event_desc = Задействане при:
settings.event_create_desc = Клон или маркер е създаден.
generate_from = Генериране от
settings.event_push_desc = Git изтласкване към хранилище.
settings.event_package = Пакет
settings.event_pull_request_label = Етикети
settings.event_pull_request_assign_desc = Заявка за сливане е възложена или отвъзложена.
settings.event_choose = Персонализирани събития…
settings.event_header_issue = Събития при задачи
fork_no_valid_owners = Това хранилище не може да бъде разклонено, защото няма валидни притежатели.
settings.unarchive.text = Разархивирането на хранилище ще възстанови способността му да получава подавания и изтласквания, както и нови задачи и заявки за сливане.
settings.archive.branchsettings_unavailable = Настройките за клонове не са налични в архивирани хранилища.
settings.event_send_everything = Всички събития
settings.event_pull_request_approvals = Одобрения на заявка за сливане
release.invalid_external_url = Невалиден външен URL адрес: "%s"
settings.event_delete_desc = Клон или маркер е изтрит.
settings.discord_icon_url = URL адрес на иконка
settings.discord_icon_url.exceeds_max_length = URL адресът на иконката трябва да е по-малък или равен на 2048 знака
settings.event_push = Изтласкване
settings.event_repository_desc = Хранилище е създадено или изтрито.
settings.slack_icon_url = URL адрес на иконка
settings.event_issue_comment = Коментари
settings.event_pull_request_desc = Заявка за сливане е отворена, затворена, отворена наново или редактирана.
settings.event_issue_comment_desc = Коментар на задача е създаден, редактиран или изтрит.
settings.event_release_desc = Издание е публикувано, обновено или изтрито в хранилище.
settings.event_pull_request_review_request = Искания за рецензия
settings.event_pull_request_enforcement = Принудително изпълнение
diff.git-notes.remove-header = Премахване на бележката
diff.git-notes.add = Добавяне на бележка
settings.event_pull_request_assign = Възлагане
new_advanced_expand = Щракнете за разгъване
new_advanced = Разширени настройки
new_from_template = Използване на шаблон
new_from_template_description = Можете да изберете съществуващо шаблонно хранилище в тази инстанция и да приложите неговите настройки.
settings.event_pull_request_comment = Коментари
repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени в .gitignore по подразбиране.
object_format_helper = Формат на обектите на хранилището. Не може да се променя по-късно. SHA1 е най-съвместим.
issues.num_reviews_one = %d рецензия
settings.event_pull_request = Изменение
settings.event_issue_label = Етикети
settings.event_issue_assign = Възлагане
settings.event_header_pull_request = Събития при заявка за сливане
settings.event_issue_milestone_desc = Етап е добавен, премахнат или изменен.
settings.event_issue_label_desc = Етикети на задача са добавени или премахнати.
settings.event_issues_desc = Задача е отворена, затворена, отворена наново или редактирана.
settings.webhook.headers = Заглавки
settings.webhook.body = Тяло
settings.event_pull_request_sync = Синхронизирано
settings.event_pull_request_sync_desc = Клонът е обновен автоматично с целевия клон.
settings.event_package_desc = Пакет е създаден или изтрит в хранилище.
template_description = Шаблонните хранилища позволяват на потребителите да генерират нови хранилища със същата структура на директориите, файлове и опционални настройки.
auto_init_description = Поставете началото на Git историята с README и по избор добавете файлове License и .gitignore.
pulls.sign_in_require = <a href="%s">Влезте</a>, за да създадете нова заявка за сливане.
issues.num_reviews_few = %d рецензии
diff.git-notes.remove-body = Тази бележка ще бъде премахната.
issues.review.add_remove_review_requests = поиска рецензии от %[1]s и премахна заявки за рецензия за %[2]s %[3]s
form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в име на хранилище.
settings.wiki_rename_branch_main_notices_2 = Това ще преименува перманентно вътрешния клон на уикито на хранилището %s. Съществуващите изтегляния ще трябва да бъдат обновени.
settings.event_pull_request_milestone = Етапи
settings.event_pull_request_comment_desc = Заявка за сливане е създадена, редактирана или изтрита.
settings.event_issue_assign_desc = Задача е възложена или отвъзложена.
settings.event_pull_request_review_request_desc = Рецензия на заявка за сливане е поискана или е премахната.
generate_repo = Генериране на хранилище
default_branch_helper = Стандартният клон е основния клон за заявки за сливане и подавания на код.
issues.reaction.add = Добавяне на реакция
issues.reaction.alt_few = %[1]s реагира с %[2]s.
issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s.
issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара.
issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара.
[modal]
confirm = Потвърждаване
@ -1218,6 +1314,12 @@ buttons.italic.tooltip = Добавяне на курсив текст
buttons.link.tooltip = Добавяне на връзка
buttons.disable_monospace_font = Изключване на равноширокия шрифт
buttons.ref.tooltip = Препратка към задача или заявка за сливане
table_modal.label.columns = Колони
table_modal.label.rows = Редове
table_modal.placeholder.content = Съдържание
table_modal.placeholder.header = Заглавка
buttons.new_table.tooltip = Добавяне на таблица
table_modal.header = Добавяне на таблица
[org]
teams.write_access = Писане
@ -1249,7 +1351,7 @@ settings.visibility.public = Публична
settings.visibility.limited_shortname = Ограничена
settings.visibility.private_shortname = Частна
settings.permission = Разрешения
settings.visibility.limited = Ограничена (видима само за удостоверени потребители)
settings.visibility.limited = Ограничена (видима само за влезли потребители)
settings.visibility.private = Частна (видима само за участниците в организацията)
org_name_helper = Имената на организациите е добре да са кратки и запомнящи се.
org_full_name_holder = Пълно име на организацията
@ -1330,6 +1432,9 @@ err_empty_admin_email = Администраторският адрес на е
password_algorithm = Алгоритъм за хеш. на паролите
default_keep_email_private = Скриване на адресите на ел. поща по подразбиране
invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите
err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано
err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон
err_admin_name_is_invalid = Потребителското име на администратора е невалидно
[filter]
string.asc = А - Я
@ -1361,6 +1466,14 @@ activate_account.text_1 = Здравейте, <b>%[1]s</b>, благодарим
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
issue.action.push_1 = <b>@%[1]s</b> изтласка %[3]d подаване към %[2]s
repo.transfer.subject_to_you = %s иска да прехвърли хранилище "%s" към вас
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
[user]
joined_on = Присъединени на %s
@ -1392,6 +1505,9 @@ followers.title.one = Последовател
following.title.one = Следван
following.title.few = Следвани
public_activity.visibility_hint.self_public = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. <a href="%s">Конфигуриране</a>.
form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
form.name_reserved = Потребителското име "%s" е резервирано.
public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. <a href="%s">Конфигуриране</a>.
[home]
filter = Други филтри
@ -1661,6 +1777,7 @@ variables.creation = Добавяне на променлива
variables.deletion.failed = Неуспешно премахване на променлива.
runners.task_list.repository = Хранилище
runners.description = Описание
runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a>.
[heatmap]
less = По-малко

View file

@ -1,10 +1,10 @@
[common]
home = inici
home = Inici
dashboard = Panell de control
explore = Explorar
help = Ajuda
logo = Logo
sign_in = Entrar
sign_in = Iniciar sessió
sign_in_with_provider = Entra amb %s
sign_in_or = o
sign_out = Sortir
@ -15,7 +15,7 @@ page = Pàgina
template = Plantilla
language = Idioma
notifications = Notificacions
active_stopwatch = Registre de Temps Actiu
active_stopwatch = Registre de temps actiu
create_new = Crear…
user_profile_and_more = Perfil i Configuració…
signed_in_as = Entrat com
@ -140,6 +140,14 @@ filter.not_archived = No arxivats
filter.not_fork = No és fork
filter.is_fork = Són forks
new_repo.title = Nou repositori
new_migrate.title = Nova migració
new_org.title = Nova organització
new_repo.link = Nou repositori
new_migrate.link = Nova migració
new_org.link = Nova organització
copy_path = Copiar ruta
[search]
milestone_kind = Cerca fites...
fuzzy = Difusa
@ -167,6 +175,9 @@ exact = Exacte
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
issue_kind = Cerca problemes...
regexp = Expressió regular
regexp_tooltip = Interpreta el terme de cerca com una expressió regular
[heatmap]
number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos
contributions_zero = Cap contribució
@ -337,6 +348,72 @@ manual_activation_only = Contacti amb l'administrador de lloc per a completar l'
remember_me = Recordar aquest dispositiu
create_new_account = Registrar compte
forgot_password_title = Contrasenya oblidada
forgot_password = Contrasenya oblidada?
hint_login = Ja tens compte? <a href="%s">Entra ara!</a>
hint_register = Necessites un compte? <a href="%s">Registra't ara.</a>
sign_up_button = Registra't ara.
sign_up_successful = S'ha creat el compte correctament. Benvingut!
confirmation_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a <b>%s</b>. Per tal de completar el registre, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. Si l'adreça de correu és incorrecta, podreu accedir al compte i demanar d'enviar un altre correu de confirmació a una altra adreça.
must_change_password = Actualitza la contrasenya
allow_password_change = Requereix a l'usuari canviar la contrasenya (recomanat)
reset_password_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a <b>%s</b>. Per tal de completar el procés de recuperació del compte, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s.
active_your_account = Activeu el compte
account_activated = El compte s'ha activat
prohibit_login = El compte està en suspensió
prohibit_login_desc = S'ha suspès la interacció del vostre compte amb la instància. Contacteu amb l'administrador per a recuperar-ne l'accés.
resent_limit_prompt = Fa poc que heu sol·licitat un correu electrònic d'activació. Si us plau, espereu 3 minuts i torneu a intentar-ho.
has_unconfirmed_mail = Hola %s, la vostra adreça de correu no s'ha confirmat (<b>%s</b>). Si no heu rebut un correu de confirmació o necessiteu que l'enviem de nou, feu clic al botó següent.
change_unconfirmed_email_summary = Canvieu l'adreça de correu on s'envia el correu d'activació.
change_unconfirmed_email = Si heu proporcionat una direcció de correu incorrecta durant el registre, la podeu canviar aquí baix i se us enviarà una confirmació a l'adreça nova.
change_unconfirmed_email_error = No s'ha pogut canviar l'adreça de correu: %v
resend_mail = Feu clic aquí per tornar a enviar el correu electrònic d'activació
send_reset_mail = Enviar correu electrònic de recuperació del compte
reset_password = Recuperació del compte
invalid_code = El codi de confirmació no és vàlid o ha caducat.
invalid_code_forgot_password = El codi de confirmació és invàlid o ha caducat. Feu click <a href="%s">aquí</a> per a iniciar una sessió nova.
invalid_password = La contrasenya no coincideix amb la que es va utilitzar per a crear el compte.
reset_password_helper = Recuperar compte
reset_password_wrong_user = Heu iniciat sessió com a %s, però l'enllaç de recuperació pertany a %s
password_too_short = La longitud de la contrasenya no pot ser inferior a %d caràcters.
non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo
verify = Verificar
unauthorized_credentials = Les credencials són incorrectes o han caducat. Torneu a executar l'ordre o visiteu %s per a més informació
scratch_code = Codi de recuperació
use_scratch_code = Utilitzar un codi de recuperació
use_onetime_code = Utilitzar un codi d'un sol ús
twofa_scratch_used = Ja heu utilitzat el vostre codi de recuperació. Se us ha redirigit a la pàgina de configuració de l'autenticació de doble factor per tal d'eliminar el dispositiu o generar un codi de recuperació nou.
twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dispositiu, useu el codi de recuperació per a entrar.
twofa_scratch_token_incorrect = El codi de recuperació és incorrecte.
login_userpass = Entra
oauth_signup_tab = Registrar compte nou
oauth_signup_title = Completar compte nou
oauth_signup_submit = Completar compte
oauth_signin_tab = Vincular a un compte existent
oauth_signin_title = Entreu per a autoritzar el compte vinculat
oauth_signin_submit = Vincular compte
oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc.
oauth.signin.error.access_denied = S'ha denegat la sol·licitud d'autorització.
oauth.signin.error.temporarily_unavailable = Ha fallat l'autorització perquè el servidor d'autenticació no està disponible temporalment. Intenteu-ho de nou més tard.
openid_connect_submit = Connectar
openid_connect_title = Entreu a un compte existent
openid_register_title = Crear un compte nou
openid_signin_desc = Introduïu la URI OpenID. Per exemple: alice.openid.example.org o https://openid.example.org/alice.
disable_forgot_password_mail = La recuperació de comptes està deshabilitada perquè no hi ha configuració de correu electrònic. Si us plau, contacteu amb l'administrador del lloc.
disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes.
email_domain_blacklisted = No podeu registrar-vos amb el correu electrònic.
authorize_application = Autoritzar aplicació
authorize_redirect_notice = Sereu redirigits a %s si autoritzeu aquesta aplicació.
authorize_application_created_by = Aquesta aplicació l'ha creat %s.
authorize_application_description = Si li concediu l'accés podrà accedir i escriure a tota la informació del vostre compte, inclòs repositoris privats i organitzacions.
authorize_title = Autoritzeu "%s" a accedir al vostre compte?
authorization_failed = Ha fallat l'autorització
authorization_failed_desc = Ha fallat l'autorització perquè s'ha detectat una sol·licitud invàlida. Si us plau, contacteu amb el responsable de l'aplicació que heu intentat autoritzar.
password_pwned = La contrasenya que heu introduït es troba en una <a target="_blank" rel="noopener noreferrer" href="%s">llista de contrasenyes robades</a> exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu.
password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned
last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un.
back_to_sign_in = Torneu a entrar
[editor]
buttons.indent.tooltip = Aniua els elements un nivell
buttons.unindent.tooltip = Desaniuna els elements un nivell
@ -355,6 +432,13 @@ buttons.list.ordered.tooltip = Afegir una llista enumerada
buttons.list.task.tooltip = Afegir una llista de tasques
buttons.mention.tooltip = Mencionar un usuari o equip
buttons.new_table.tooltip = Afegir taula
table_modal.header = Afegir taula
table_modal.placeholder.header = Capçalera
table_modal.placeholder.content = Contingut
table_modal.label.rows = Files
table_modal.label.columns = Columnes
[home]
my_orgs = Organitzacions
show_more_repos = Mostra més repositoris…
@ -381,4 +465,15 @@ filter = Altres filtres
footer.software = Sobre aquest software
footer.links = Enllaços
navbar = Barra de navegació
footer = Peu de pàgina
footer = Peu de pàgina
[mail]
view_it_on = Veure a %s
reply = o responeu directament a aquest correu
link_not_working_do_paste = No funciona l'enllaç? Proveu a copiar-lo i enganxar-lo al navegador web.
hi_user_x = Hola <b>%s</b>,
activate_account = Si us plau, activeu el compte
activate_account.text_1 = Hola <b>%[1]s</b>, gràcies per registrar-te a %[2]s!
admin.new_user.user_info = Informació d'usuari
admin.new_user.text = Si us plau, <a href="%s">cliqueu aui</a> per administrar aquest usuari des del panell d'administració.
register_notify = Benvinguts a %s

View file

@ -747,7 +747,7 @@ webauthn=Dvoufázové ověření (bezpečnostní klíče)
public_profile=Veřejný profil
biography_placeholder=Řekněte ostatním něco o sobě! (Je podporován Markdown)
location_placeholder=Sdílejte svou přibližnou polohu s ostatními
profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
profile_desc=O vás
password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů.
full_name=Celé jméno
website=Web
@ -838,7 +838,7 @@ add_email_success=Nová e-mailová adresa byla přidána.
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
add_openid_success=Nová OpenID adresa byla přidána.
keep_email_private=Skrýt e-mailovou adresu
keep_email_private_popup=Tímto skryjete svou e-mailovou adresu ze svého profilu. Nebude již výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání a úpravy souborů, a nebude použita pro slučovací commity. Místo toho můžete použít speciální adresu %s pro spojení commitů s vaším účtem. Změna této funkce nebude mít vliv na stávající commity.
keep_email_private_popup=Vaše e-mailová adresa nebude zobrazena na vašem profilu a nebude výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání, úpravy a sloučení. Namísto toho lze použít speciální adresu %s pro propojení commitů s vaším účtem. Tato možnost neovlivní existující commity.
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
manage_ssh_keys=Správa klíčů SSH
@ -1010,7 +1010,7 @@ remove_account_link=Odstranit propojený účet
remove_account_link_desc=Odstraněním propojeného účtu zrušíte jeho přístup k vašemu Forgejo účtu. Pokračovat?
remove_account_link_success=Propojený účet byl odstraněn.
hooks.desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> vve vašem vlastnictví.
hooks.desc=Přidejte webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> ve vašem vlastnictví.
orgs_none=Nejste členem žádné organizace.
repos_none=Nevlastníte žádné repozitáře.
@ -1054,6 +1054,8 @@ language.title = Výchozí jazyk
keep_activity_private.description = Vaše <a href="%s">veřejná aktivita</a> bude viditelná pouze vám a správcům instance.
language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí.
language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! <a href="%s">Více informací</a>.
user_block_yourself = Nemůžete zablokovat sami sebe.
pronouns_custom_label = Vlastní zájmena
[repo]
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář</a>.
@ -1102,7 +1104,7 @@ object_format_helper = Objektový formát repozitáře. Později jej nelze změn
readme=README
readme_helper=Vyberte šablonu souboru README
readme_helper_desc=Do tohoto místa můžete zadat celý popis vašeho projektu.
auto_init=Inicializovat repozitář (přidá soubory .gitignore, License a README)
auto_init=Inicializovat repozitář
trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků
trust_model_helper_committer=Přispěvatel: Důvěřovat podpisům, které se shodují s přispěvateli
@ -1313,6 +1315,7 @@ view_git_blame=Zobrazit git blame
video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
stored_lfs=Uloženo pomocí Git LFS
stored_annex=Uloženo pomocí Git Annex
symbolic_link=Symbolický odkaz
executable_file=Spustitelný soubor
vendored = Vendorováno
@ -1338,6 +1341,7 @@ editor.upload_file=Nahrát soubor
editor.edit_file=Upravit soubor
editor.preview_changes=Náhled změn
editor.cannot_edit_lfs_files=LFS soubory nemohou být upravovány přes webové rozhraní.
editor.cannot_edit_annex_files=Annex soubory nemohou být upravovány přes webové rozhraní.
editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány přes webové rozhraní.
editor.edit_this_file=Upravit soubor
editor.this_file_locked=Soubor je uzamčen
@ -2395,7 +2399,7 @@ settings.deploy_key_deletion=Odstranit klíč pro nasazení
settings.deploy_key_deletion_desc=Odstranění klíče pro nasazení zruší jeho přístup k repozitáři. Pokračovat?
settings.deploy_key_deletion_success=Klíč pro nasazení byl odstraněn.
settings.branches=Větve
settings.protected_branch=Ochrana větve
settings.protected_branch=Ochrana větví
settings.protected_branch.save_rule=Uložit pravidlo
settings.protected_branch.delete_rule=Odstranit pravidlo
settings.protected_branch_can_push=Povolit nahrání?
@ -2461,7 +2465,7 @@ settings.default_branch_desc=Vybrat výchozí větev repozitáře pro požadavky
settings.merge_style_desc=Sloučit styly
settings.default_merge_style_desc=Výchozí styl sloučení
settings.choose_branch=Vyberte větev…
settings.no_protected_branch=Nejsou tu žádné chráněné větve.
settings.no_protected_branch=Nemáte žádné chráněné větve.
settings.edit_protected_branch=Upravit
settings.protected_branch_required_rule_name=Požadovaný název pravidla
settings.protected_branch_duplicate_rule_name=Již existuje pravidlo pro tuto sadu větví
@ -2849,6 +2853,21 @@ issues.num_reviews_one = %d kontrola
issues.num_reviews_few = %d kontrol
issues.summary_card_alt = Souhrn problému s názvem „%s“ v repozitáři %s
editor.add_tmpl.filename = nazevsouboru
settings.default_update_style_desc = Výchozí způsob aktualizací používaný pro aktualizace žádostí o sloučení, které jsou pozadu oproti základní větvi.
pulls.sign_in_require = <a href="%s">Přihlaste se</a> pro vytvoření nové žádosti o sloučení.
new_from_template = Použít šablonu
new_from_template_description = Můžete si vybrat existující šablonu repozitáře na této instanci a použít její nastavení.
new_advanced = Pokročilá nastavení
new_advanced_expand = Klikněte pro rozbalení
auto_init_description = Vytvořit historii Gitu se souborem README a volitelně přidat soubory License a .gitignore.
summary_card_alt = Karta se souhrnem repozitáře %s
issues.reaction.alt_many = Uživatel %[1]s a %[2]d dalších zareagovali s %[3]s.
release.summary_card_alt = Karta souhrnu vydání s názvem „%s“ v repozitáři %s
issues.reaction.add = Přidat reakci
issues.reaction.alt_few = Uživatel %[1]s zareagoval pomocí %[2]s.
issues.context.menu = Nabídka komentáře
issues.reaction.alt_remove = Odstranit %[1]s reakci z komentáře.
issues.reaction.alt_add = Přidat %[1]s reakci na komentář.
[graphs]
component_loading_info = Tohle může chvíli trvat…

1634
options/locale/locale_da.ini Normal file

File diff suppressed because it is too large Load diff

View file

@ -749,7 +749,7 @@ webauthn=Hardware-Sicherheitsschlüssel
public_profile=Öffentliches Profil
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
location_placeholder=Teile deinen ungefähren Standort mit anderen
profile_desc=Leg fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
profile_desc=Über dich
password_username_disabled=Benutzer, die nicht von Forgejo verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details.
full_name=Vollständiger Name
website=Webseite
@ -814,7 +814,7 @@ manage_emails=E-Mail-Adressen verwalten
manage_themes=Standard-Theme
manage_openid=OpenID-Adressen
email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und, sofern sie nicht versteckt ist, web-basierte Git-Operationen verwendet.
theme_desc=Dies wird dein Standard-Theme auf der Seite sein.
theme_desc=Dieses Thema wird für die Weboberfläche verwendet, wenn du angemeldet bist.
primary=Primär
activated=Aktiviert
requires_activation=Erfordert Aktivierung
@ -840,7 +840,7 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt.
email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert.
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
keep_email_private=E-Mail-Adresse verbergen
keep_email_private_popup=Dies wird deine E-Mail-Adresse in deinem Profil ausblenden. Sie wird nicht mehr der Standardwert für die Commits, die vom Web-Interface gemacht wurden, sein, z.B. Dateiuploads und -bearbeitungen, und sie wird nicht für Merge-Commits benutzt werden. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Konto zu assoziieren. Beachte, dass diese Option für existierende Commits keine Wirkung hat.
keep_email_private_popup=Deine Mailadresse wird nicht in deinem Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Account zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus.
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
@ -1056,6 +1056,8 @@ language.title = Standardsprache
keep_activity_private.description = Deine <a href="%s">öffentliche Aktivität</a> wird nur für dich selbst und die Instanzadminstratoren sichtbar sein.
language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! <a href="%s">Mehr erfahren</a>.
language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt.
user_block_yourself = Du kannst dich nicht selbst blockieren.
pronouns_custom_label = Individuelle Pronomen
[repo]
owner=Besitzer
@ -1097,11 +1099,11 @@ issue_labels=Labels
issue_labels_helper=Wähle eine Label-Sammlung
license=Lizenz
license_helper=Wähle eine Lizenz
license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license.</a>
license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license</a>.
readme=README
readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
auto_init=Repository initialisieren (Fügt .gitignore, License und README-Dateien hinzu)
auto_init=Repository initialisieren
trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind:
trust_model_helper_collaborator=Mitarbeiter: Vertraue Signaturen von Mitarbeitern am Projekt
trust_model_helper_committer=Committer: Vertraue Signaturen, die mit ihren Committern übereinstimmen
@ -1179,8 +1181,8 @@ template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
archive.issue.nocomment=Dieses Repo ist archiviert. Du kannst Issues nicht kommentieren.
archive.pull.nocomment=Dieses Repo ist archiviert. Du kannst Pull-Requests nicht kommentieren.
archive.issue.nocomment=Dieses Repository ist archiviert. Du kannst Issues nicht kommentieren.
archive.pull.nocomment=Dieses Repository ist archiviert. Du kannst Pull-Requests nicht kommentieren.
form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht.
form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht.
@ -1313,6 +1315,8 @@ view_git_blame=„git blame“ ansehen
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
stored_lfs=Gespeichert mit Git LFS
stored_annex=Gespeichert mit Git Annex
stored_annex_not_present = hier nicht vorhanden, versuche git annex whereis
symbolic_link=Softlink
executable_file=Ausführbare Datei
commit_graph=Commit-Graph
@ -1336,6 +1340,7 @@ editor.upload_file=Datei hochladen
editor.edit_file=Datei bearbeiten
editor.preview_changes=Vorschau der Änderungen
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
editor.cannot_edit_annex_files=Annex-Dateien können im Webinterface nicht bearbeitet werden.
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
editor.edit_this_file=Datei bearbeiten
editor.this_file_locked=Datei ist gesperrt
@ -2490,8 +2495,8 @@ settings.archive.text=Durch das Archivieren wird ein Repo vollständig schreibge
settings.archive.success=Das Repo wurde erfolgreich archiviert.
settings.archive.error=Beim Versuch, das Repository zu archivieren, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
settings.archive.error_ismirror=Du kannst kein gespiegeltes Repo archivieren.
settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar wenn das Repo archiviert ist.
settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde.
settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.archive.tagsettings_unavailable=Tag-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.unarchive.button=Archivierung zurücksetzen
settings.unarchive.header=Archivierung dieses Repositorys zurücksetzen
settings.unarchive.text=Durch das Aufheben der Archivierung kann das Repo wieder Commits und Pushes sowie neue Issues und Pull-Requests empfangen.
@ -2690,7 +2695,7 @@ error.csv.too_large=Diese Datei kann nicht gerendert werden, da sie zu groß ist
error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwartetes Zeichen in Zeile %d und Spalte %d enthält.
error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat.
rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben.
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren.</a>
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren</a>.
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
clone_in_vscodium = In VSCodium klonen
settings.units.add_more = Mehr aktivieren
@ -2704,7 +2709,7 @@ settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefü
settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
settings.enter_repo_name = Gib den Besitzer- und den Repository-Namen genau wie angezeigt ein:
settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar, wenn das Repo archiviert ist.
settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar in archivierten Repos.
pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
@ -2851,6 +2856,21 @@ issues.num_reviews_one = %d Review
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
issues.num_reviews_few = %d Reviews
editor.add_tmpl.filename = Dateiname
settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
new_advanced = Erweiterte Einstellungen
new_advanced_expand = Zum Ausklappen klicken
pulls.sign_in_require = <a href="%s">Anmelden</a>, um einen neuen Pull-Request zu erstellen.
new_from_template = Eine Vorlage benutzen
new_from_template_description = Du kannst eine existierende Repository-Vorlage auf dieser Instanz benutzen und ihre Einstellungen anwenden.
auto_init_description = Die Git-Historie mit einer README-Datei und optional einer Lizenz- und .gitignore-Datei starten.
issues.context.menu = Kommentar Menü
issues.reaction.add = Reaktion hinzufügen
issues.reaction.alt_many = %[1]s und %[2]d mehr reagierten %[3]s.
issues.reaction.alt_few = %[1]s reagierten %[2]s.
issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu.
issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
summary_card_alt = Zusammenfassungskarte des Repositorys %s
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
[graphs]
component_loading_failed = Konnte %s nicht laden
@ -3686,12 +3706,12 @@ conan.registry=Diese Registry über die Kommandozeile einrichten:
conan.install=Um das Paket mit Conan zu installieren, führe den folgenden Befehl aus:
conda.registry=Richte diese Registry als Conda-Repository in deiner <code>.condarc</code>-Datei ein:
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
container.details.type=Container-Image Typ
container.details.type=Abbildtyp
container.details.platform=Plattform
container.pull=Downloade das Container-Image aus der Kommandozeile:
container.digest=Digest
container.multi_arch=Betriebsystem / Architektur
container.layers=Container-Image Ebenen
container.layers=Abbildebenen
container.labels=Labels
container.labels.key=Schlüssel
container.labels.value=Wert

View file

@ -166,6 +166,7 @@ new_org.link = Νέος οργανισμός
new_migrate.title = Νέα μεταφορά
new_repo.title = Νέο repository
new_org.title = Νέος οργανισμός
copy_path = Αντιγραφή τοποθεσίας
[aria]
navbar=Μπάρα πλοήγησης
@ -197,8 +198,14 @@ buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request
buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου
buttons.enable_monospace_font=Ενεργοποίηση σταθερής γραμματοσειράς
buttons.disable_monospace_font=Απενεργοποίηση σταθερής γραμματοσειράς
buttons.unindent.tooltip = Αναίρεση στοιχείων κατά ένα επίπεδο
buttons.indent.tooltip = Στοιχεία φωλιών κατά ένα επίπεδο
buttons.unindent.tooltip = Μείωση εσοχής στοιχείων κατά ένα επίπεδο
buttons.indent.tooltip = Αύξηση εσοχής στοιχείων κατά ένα επίπεδο
table_modal.header = Προσθήκη πίνακα
table_modal.placeholder.header = Επικεφαλίδα
table_modal.placeholder.content = Περιεχόμενο
table_modal.label.rows = Σειρές
table_modal.label.columns = Στήλες
buttons.new_table.tooltip = Προσθήκη πίνακα
[filter]
string.asc=A - Z
@ -249,9 +256,9 @@ err_empty_db_path=Η διαδρομή της βάσης δεδομένων SQLit
no_admin_and_disable_registration=Δεν μπορείτε να απενεργοποιήσετε την ιδιο-εγγραφή χρήστη χωρίς να έχετε δημιουργήσει διαχειριστικό λογαριασμό.
err_empty_admin_password=Ο κωδικός πρόσβασης του διαχειριστή δεν μπορεί να είναι κενός.
err_empty_admin_email=Το email του διαχειριστή δεν μπορεί να είναι κενό.
err_admin_name_is_reserved=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, είναι δεσμευμένο
err_admin_name_is_reserved=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, αυτό το όνομα είναι δεσμευμένο
err_admin_name_pattern_not_allowed=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, ταιριάζει σε μια δεσμευμένη μορφή
err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειριστή δεν είναι έγκυρο
err_admin_name_is_invalid=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο
general_title=Γενικές ρυθμίσεις
app_name=Τίτλος διακομιστή
@ -476,6 +483,8 @@ hint_register = Χρειάζεστε έναν λογαριασμό; <a href="%s"
sign_up_button = Δημιουργία λογαριασμού.
back_to_sign_in = Επιστροφή στην σελίδα εισόδου
sign_in_openid = Συνέχεια με OpenID
unauthorized_credentials = Τα διαπιστευτήρια σύνδεσης είναι λανθασμένα ή έχουν λήξει. Προσπαθήστε ξανά την ενέργεια ή δείτε %s για περισσότερες πληροφορίες
use_onetime_code = Χρήση κωδικού μίας χρήσης
[mail]
view_it_on=Δείτε το στο %s
@ -553,7 +562,7 @@ password_change.text_1 = Μόλις άλλαξε ο κωδικός πρόσβα
primary_mail_change.subject = Η κύρια διεύθυνση email σας άλλαξε
primary_mail_change.text_1 = Η κύρια διεύθυνση email του λογαριασμού σας μόλις άλλαξε στην %[1]s. Αυτό σημαίνει πως η διεύθυνση στην οποία λαμβάνετε αυτό το μήνυμα δεν θα λαμβάνει ειδοποιήσεις email για τον λογαριασμό σας πια.
totp_disabled.subject = Το TOTP απενεργοποιήθηκε
totp_disabled.text_1 = Το TOTP στο λογαριασμό σας μόλις απενεργοποιήθηκε.
totp_disabled.text_1 = Ο κωδικός μίας χρήσης (TOTP) για το λογαριασμό σας μόλις απενεργοποιήθηκε.
removed_security_key.subject = Καταργήθηκε ένα κλειδί ασφαλείας
removed_security_key.text_1 = Το κλειδί ασφαλείας «%[1]s» μόλις αφαιρέθηκε από τον λογαριασμό σας.
totp_disabled.no_2fa = Δεν έχετε ρυθμίσει κάποια άλλη μέθοδο σύνδεσης δευτέρου παράγοντα (2FA), άρα δεν χρειάζεται να συνδεθείτε στον λογαριασμό σας μέσω 2FA.
@ -715,6 +724,7 @@ following.title.one = ακολουθεί
public_activity.visibility_hint.admin_public = Η δραστηριότητα είναι ορατή σε όλους, αλλά ως διαχειριστής μπορείτε να δείτε και τις αλληλεπιδράσεις σε ιδιωτικούς χώρους.
public_activity.visibility_hint.self_public = Η δραστηριότητά σου είναι ορατή σε όλους, πλην τις αλληλεπιδράσεις σας σε ιδιωτικούς χώρους. <a href="%s">Αλλαγή ορατότητας</a>.
public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. <a href="%s">Αλλαγή ορατότητας</a>.
public_activity.visibility_hint.self_private_profile = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και τους διαχειριστές του διακομιστή καθώς το προφίλ σας είναι ιδιωτικό <a href="%s">Αλλαγή ορατότητας</a>.
[settings]
profile=Προφίλ
@ -736,9 +746,9 @@ uid=UID
webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας)
public_profile=Δημόσιο προφίλ
biography_placeholder=Πείτε μας λίγο για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
biography_placeholder=Πείτε λίγα πράγματα για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
location_placeholder=Μοιραστείτε την κατά προσέγγιση τοποθεσία σας με άλλους
profile_desc=Ελέγξτε πώς εμφανίζεται το προφίλ σας σε άλλους χρήστες. Η κύρια διεύθυνση email σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση κωδικού πρόσβασης και λειτουργίες Git που βασίζονται στο web.
profile_desc=Σχετικά με εσάς
password_username_disabled=Οι μη τοπικοί χρήστες δεν επιτρέπεται να αλλάξουν το όνομα χρήστη τους. Επικοινωνήστε με το διαχειριστή σας για περισσότερες λεπτομέρειες.
full_name=Πλήρες όνομα
website=Ιστοσελίδα
@ -803,7 +813,7 @@ manage_emails=Διαχείριση διευθύνσεων email
manage_themes=Προεπιλεγμένο θέμα
manage_openid=Διευθύνσεις OpenID
email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο.
theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα.
theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας όταν είστε συνδεδεμένοι.
primary=Κύριο
activated=Ενεργό
requires_activation=Απαιτείται ενεργοποίηση
@ -1038,13 +1048,14 @@ pronouns = Αντωνυμίες
pronouns_custom = κάτι άλλο
pronouns_unspecified = Απροσδιόριστες
hints = Συμβουλές
additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
additional_repo_units_hint_description = Εμφάνιση υπόδειξης «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
update_hints = Ενημέρωση συμβουλών
update_hints_success = Οι συμβουλές ενημερώθηκαν.
language.title = Προεπιλεγμένη γλώσσα
keep_activity_private.description = Η <a href="%s">δημόσια δραστηριότητά σας</a> θα είναι ορατή μόνο σε εσάς και στους διαχειριστές.
language.localization_project = Βοηθήστε μας να μεταφράσουμε το Forgejo στην γλώσσα σας! <a href="%s">Περισσότερες πληροφορίες</a>.
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
pronouns_custom_label = Ειδικές αντωνυμίες
[repo]
new_repo_helper=Ένα repository περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Έχετε ήδη ένα που φιλοξενείται κάπου αλλού; <a href="%s">Μεταφορά αποθετηρίου.</a>
@ -1303,6 +1314,7 @@ view_git_blame=Προβολή git blame
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
stored_lfs=Αποθηκεύτηκε με το Git LFS
stored_annex=Αποθηκεύτηκε με το Git Annex
symbolic_link=Symbolic link
executable_file=Εκτελέσιμο αρχείο
commit_graph=Γράφημα υποβολών
@ -1326,6 +1338,7 @@ editor.upload_file=Ανέβασμα αρχείου
editor.edit_file=Επεξεργασία αρχείου
editor.preview_changes=Προεπισκόπηση αλλαγών
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.cannot_edit_annex_files=Τα αρχεία Annex δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.edit_this_file=Επεξεργασία αρχείου
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
@ -3929,6 +3942,8 @@ exact = Ακριβής
milestone_kind = Αναζήτηση ορόσημων...
union = Ένωση
union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις που έχουν εισαχθεί και διαχωριστεί με κενό
regexp = Κανονική Έκφραση
regexp_tooltip = Ερμηνεία του όρου αναζήτησης ως κανονική έκφραση
[munits.data]
mib = MiB

View file

@ -748,13 +748,14 @@ blocked_users = Blocked users
public_profile = Public profile
biography_placeholder = Tell others a little bit about yourself! (Markdown is supported)
location_placeholder = Share your approximate location with others
profile_desc = Control how your profile is shown to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations.
profile_desc = About you
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
full_name = Full name
website = Website
location = Location
pronouns = Pronouns
pronouns_custom = Custom
pronouns_custom_label = Custom pronouns
pronouns_unspecified = Unspecified
update_theme = Change theme
update_profile = Update profile
@ -849,7 +850,7 @@ add_email_success = The new email address has been added.
email_preference_set_success = Email preference has been set successfully.
add_openid_success = The new OpenID address has been added.
keep_email_private = Hide email address
keep_email_private_popup = This will hide your email address from your profile. It will no longer be the default for commits made via the web interface, like file uploads and edits, and will not be used for merge commits. Instead a special address %s can be used to associate commits with your account. Note that changing this option will not affect existing commits.
keep_email_private_popup = Your email address will not be shown on your profile and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to your account. This option will not affect existing commits.
openid_desc = OpenID lets you delegate authentication to an external provider.
manage_ssh_keys = Manage SSH keys
@ -1053,6 +1054,10 @@ admin.failed_to_replace_flags = Failed to replace repository flags
admin.flags_replaced = Repository flags replaced
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? <a href="%s">Migrate repository</a>.
new_from_template = Use a template
new_from_template_description = You can select an existing repository template on this instance and apply its settings.
new_advanced = Advanced settings
new_advanced_expand = Click to expand
owner = Owner
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
repo_name = Repository name
@ -1099,7 +1104,8 @@ object_format_helper = Object format of the repository. Cannot be changed later.
readme = README
readme_helper = Select a README file template
readme_helper_desc = This is the place where you can write a complete description for your project.
auto_init = Initialize repository (Adds .gitignore, License and README)
auto_init = Initialize repository
auto_init_description = Start the Git history with a README and optionally add License and .gitignore files.
create_repo = Create repository
default_branch = Default branch
default_branch_label = default
@ -1148,6 +1154,7 @@ blame_prior = View blame prior to this change
blame.ignore_revs = Ignoring revisions in <a href="%s">.git-blame-ignore-revs</a>. Click <a href="%s">here to bypass</a> and see the normal blame view.
blame.ignore_revs.failed = Failed to ignore revisions in <a href="%s">.git-blame-ignore-revs</a>.
author_search_tooltip = Shows a maximum of 30 users
summary_card_alt = Summary card of repository %s
tree_path_not_found_commit = Path %[1]s doesn't exist in commit %[2]s
tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s
@ -1329,6 +1336,8 @@ view_git_blame = View git blame
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
stored_lfs = Stored with Git LFS
stored_annex = Stored with Git Annex
stored_annex_not_present = not present here, try using git annex whereis
symbolic_link = Symbolic link
executable_file = Executable file
vendored = Vendored
@ -1356,6 +1365,7 @@ editor.upload_file = Upload file
editor.edit_file = Edit file
editor.preview_changes = Preview changes
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
editor.cannot_edit_annex_files = Annex files cannot be edited in the web interface.
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
editor.edit_this_file = Edit file
editor.this_file_locked = File is locked
@ -1628,6 +1638,12 @@ issues.num_reviews_one = %d review
issues.num_reviews_few = %d reviews
issues.commented_at = `commented <a href="#%s">%s</a>`
issues.delete_comment_confirm = Are you sure you want to delete this comment?
issues.reaction.add = Add reaction
issues.reaction.alt_few = %[1]s reacted %[2]s.
issues.reaction.alt_many = %[1]s and %[2]d more reacted %[3]s.
issues.reaction.alt_remove = Remove %[1]s reaction from comment.
issues.reaction.alt_add = Add %[1]s reaction to comment.
issues.context.menu = Comment menu
issues.context.copy_link = Copy link
issues.context.quote_reply = Quote reply
issues.context.reference_issue = Reference in a new issue
@ -1845,6 +1861,7 @@ pulls.new = New pull request
pulls.view = View pull request
pulls.edit.already_changed = Unable to save changes to the pull request. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
pulls.compare_changes = New pull request
pulls.sign_in_require = <a href="%s">Sign in</a> to create a new pull request.
pulls.allow_edits_from_maintainers = Allow edits from maintainers
pulls.allow_edits_from_maintainers_desc = Users with write access to the base branch can also push to this branch
pulls.allow_edits_from_maintainers_err = Updating failed
@ -2741,6 +2758,7 @@ release.asset_name = Asset name
release.asset_external_url = External URL
release.add_external_asset = Add external asset
release.invalid_external_url = Invalid external URL: "%s"
release.summary_card_alt = Summary card of an release titled "%s" in repository %s
branch.name = Branch name
branch.already_exists = A branch named "%s" already exists.

View file

@ -1310,6 +1310,7 @@ view_git_blame=Ver Git blame
video_not_supported_in_browser=Su navegador no soporta el tag "video" de HTML5.
audio_not_supported_in_browser=Su navegador no soporta el tag "audio" de HTML5.
stored_lfs=Almacenados con Git LFS
stored_annex=Almacenados con Git Annex
symbolic_link=Enlace simbólico
executable_file=Archivo ejecutable
commit_graph=Gráfico de commits
@ -1333,6 +1334,7 @@ editor.upload_file=Subir archivo
editor.edit_file=Editar archivo
editor.preview_changes=Vista previa de los cambios
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
editor.cannot_edit_annex_files=Los archivos Annex no se pueden editar en la interfaz web.
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
editor.edit_this_file=Editar archivo
editor.this_file_locked=El archivo está bloqueado

View file

@ -951,6 +951,7 @@ file_copy_permalink=پرمالینک را کپی کنید
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
stored_lfs=ذخیره شده با GIT LFS
stored_annex=ذخیره شده با GIT Annex
symbolic_link=پیوند نمادین
commit_graph=نمودار کامیت
commit_graph.select=انتخاب برنچها
@ -968,6 +969,7 @@ editor.upload_file=بارگذاری پرونده
editor.edit_file=ویرایش پرونده
editor.preview_changes=پیش نمایش تغییرات
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
editor.cannot_edit_annex_files=پرونده های Annex در صحفه وب قابل تغییر نیست.
editor.cannot_edit_non_text_files=پرونده‎های دودویی در صفحه وب قابل تغییر نیست.
editor.edit_this_file=ویرایش پرونده
editor.this_file_locked=پرونده قفل شده است

View file

@ -119,7 +119,7 @@ new_project_column = Uusi sarake
retry = Yritä uudelleen
copy_type_unsupported = Tätä tiedostotyyppiä ei voi kopioida
locked = Lukittu
filter = Suodatin
filter = Suodata
filter.is_archived = Arkistoitu
filter.not_archived = Ei arkistoitu
filter.public = Julkinen
@ -167,6 +167,8 @@ filter.not_template = Ei mallipohjat
filter.not_mirror = Ei peilattu
copy_path = Kopioi polku
concept_user_individual = Yksittäinen
[aria]
footer.links = Linkit
navbar = Navigaatiopalkki
@ -205,6 +207,8 @@ table_modal.placeholder.content = Sisältö
table_modal.label.rows = Rivit
table_modal.label.columns = Sarakkeet
buttons.unindent.tooltip = Vähennä sisennystä yhden tason verran
[filter]
string.asc = A - Ö
string.desc = Ö - A
@ -231,7 +235,7 @@ install_desc = Suorita alustallesi suunnattu <a target="_blank" rel="noopener no
[install]
install=Asennus
title=Alkuperäiset asetukset
title=Aloitusasetukset
docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue <a target="_blank" rel="noopener noreferrer" href="%s">ohjeet</a> ennen minkään asetuksen muuttamista.
require_db_desc=Forgejo tarvitsee toimiakseen MySQL-, PostgreSQL-, SQLite3- tai TiDB- (MySQL-protokolla) tietokannan.
db_title=Tietokannan asetukset
@ -292,7 +296,7 @@ disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir kä
federated_avatar_lookup=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
disable_registration.description=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
disable_registration.description=Vain järjestelmänvalvojat voivat luoda uusia käyttäjiä. On suositeltavaa pitää rekisteröinti suljettuna mikäli kyseessä ei ole julkinen instanssi jota varten tarvitsee hallinnoida suuria määriä roskapostikäyttäjiä.
allow_only_external_registration.description=Käyttäjät voivat luoda uusia käyttäjiä vain erikseen konfiguroituja ulkoisia palveluja käyttäen.
openid_signin=Ota OpenID-kirjautuminen käyttöön
openid_signin.description=Salli OpenID:n kautta kirjautuminen.
@ -319,7 +323,7 @@ default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
default_keep_email_private.description=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet estääksesi tietojen vuotamisen rekisteröinnin yhteydessä.
default_enable_timetracking=Ota ajanseuranta oletusarvoisesti käyttöön
default_enable_timetracking.description=Salli uusien repositorioiden aikaseurannan käyttöönotto oletusarvoisesti.
no_reply_address=Piilotettu sähköpostin verkkotunnus
no_reply_address=Piilotetun sähköpostin verkkotunnus
no_reply_address_helper=Verkkotunnuksen nimi käyttäjille, joilla on piilotettu sähköpostiosoite. Esimerkiksi käyttäjätunnus 'joe' kirjataan Git-palveluun nimellä 'joe@noreply.example.org' jos piilotetun sähköpostiosoitteen arvoksi on asetettu 'noreply.example.org'.
password_algorithm=Salasanan hajautusalgoritmi
enable_update_checker_helper_forgejo = Se tarkistaa tietyin väliajoin uusia Forgejo-versioita tutkimalla sen TXT DNS record -tietoja osoitteesta release.forgejo.org .
@ -346,6 +350,8 @@ app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poi
domain_helper = Palvelimen verkkotunnus tai isäntänimi.
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
err_admin_name_pattern_not_allowed = Ylläpitäjän käyttäjätunnus on virheellinen, se vastaa varattua kaaviota
[home]
uname_holder=Käyttäjätunnus tai sähköpostiosoite
password_holder=Salasana
@ -461,6 +467,19 @@ change_unconfirmed_email = Jos annoit väärän sähköpostiosoitteen rekisterö
invalid_code_forgot_password = Vahvistuskoodisi on virheellinen tai vanhentunut. Napsauta <a href="%s">tästä</a> aloittaaksesi uuden istunnon.
openid_signin_desc = Kirjoita OpenID-URI:si. Esimerkki: alice.openid.example.org tai https://openid.example.org/alice.
change_unconfirmed_email_summary = Vaihda sähköpostiosoite, johon aktivointisähköposti lähetetään.
reset_password_wrong_user = Olet kirjautuneena tilillä %s, mutta tilin palautuslinkki on tarkoitettu tilille %s
last_admin = Et voi poistaa viimeistä ylläpitäjää. Ylläpitäjiä tulee olla vähintään yksi.
password_pwned = Valitsemasi salasana on <a target="_blank" rel="noopener noreferrer" href="%s">varastettujen salasanojen listalla</a>, eli se on paljastanut jossain julkisessa tietovuodossa. Kokeile asettaa eri salasana, ja jos käytät samaa salasanaa muissa palveluissa, vaihda kyseinen salasana.
use_onetime_code = Käytä kertakäyttöiskoodia
unauthorized_credentials = Kirjautumistiedot ovat virheelliset tai vanhentuneet. Yritä suorittaa komento uudelleen tai katso %s saadaksesi lisätietoja
oauth.signin.error = Valtuuspyynnön käsittelyssä tapahtui virhe. Jos virhe toistuu, ota yhteys sivuston ylläpitoon.
oauth.signin.error.temporarily_unavailable = Valtuus epäonnistui, koska todennuspalvelin ei ole tällä hetkellä käytettävissä. Yritä uudelleen myöhemmin.
disable_forgot_password_mail = Tilin palautus ei ole käytössä, koska sähköpostia ei ole määritetty. Ota yhteys sivuston ylläpitoon.
disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sähköposti on määritetty. Aseta sähköposti, jotta tilin palauttaminen on mahdollista ottaa käyttöön.
authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
[mail]
view_it_on=Näytä %s
@ -514,9 +533,18 @@ account_security_caution.text_1 = Jos se olit sinä, voit jättää tämän vies
issue.action.approve = <b>@%[1]s</b> hyväksyi tämän vetopyynnön.
issue.action.review = <b>@%[1]s</b> kommentoi tätä vetopyyntöä.
issue.action.ready_for_review = <b>@%[1]s</b> merkitsi tämän vetopyynnön valmiiksi katselmointia varten.
totp_disabled.text_1 = Tilisi aikapohjainen kertakäyttösalasana (TOTP) poistettiin käytöstä.
issue.action.close = <b>@%[1]s</b> sulki ongelman #%[2]d.
issue.action.reopen = <b>@%[1]s</b> avasi uudelleen ongelman #%[2]d.
admin.new_user.text = <a href="%s">Napsauta tästä</a> hallitaksesi tätä käyttäjää ylläpitonäkymästä.
repo.collaborator.added.text = Sinut on lisätty avustajaksi repoon:
primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asetettiin %[1]s. Se tarkoittaa, että tämä sähköpostiosoite ei enää vastaanota tilisi ilmoituksia sähköpostitse.
team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
[modal]
yes=Kyllä
no=Ei
@ -629,8 +657,13 @@ following_one = %d seurataan
block_user.detail = Huomaa, että käyttäjän estämisellä on muita vaikutuksia, kuten:
show_on_map = Näytä paikka kartalla
form.name_chars_not_allowed = Käyttäjätunnus "%s" sisältää virheellisiä merkkejä.
follow_blocked_user = Et voi seurata tätä käyttäjää, koska olet estänyt kyseisen käyttäjän tai kyseinen käyttäjä on estänyt sinut.
disabled_public_activity = Käyttäjä on poistanut käytöstä toiminnan julkisen näkyvyyden.
form.name_reserved = Käyttäjätunnus "%s" on varattu.
form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu käyttäjätunnuksessa.
[settings]
profile=Profiili
account=Tili
@ -684,7 +717,7 @@ keep_activity_private_popup=Tekee toiminnon näkyvän vain sinulle ja ylläpitä
lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella
federated_avatar_lookup=Ulkopuolinen profiilikuvan haku
enable_custom_avatar=Ota käyttöön mukautettu profiilikuva
enable_custom_avatar=Käytä mukautettua profiilikuvaa
choose_new_avatar=Valitse uusi profiilikuva
update_avatar=Päivitä profiilikuva
delete_current_avatar=Poista nykyinen profiilikuva
@ -699,9 +732,9 @@ password_change_disabled=Ei-lokaalit käyttäjät eivät voi päivittää salasa
emails=Sähköposti osoitteet
manage_emails=Hallitse sähköpostiosoitteita
manage_themes=Valitse oletusteema
manage_openid=Hallitse OpenID osoitteita
theme_desc=mä on sivuston oletusteemasi.
manage_themes=Oletusteema
manage_openid=OpenID-osoitteet
theme_desc=tä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
primary=Ensisijainen
activated=Aktivoitu
requires_activation=Vaatii aktivoinnin
@ -717,7 +750,7 @@ theme_update_error=Valittua teemaa ei löydy.
openid_deletion=Poista OpenID-osoite
openid_deletion_success=OpenID-osoite on poistettu.
add_new_email=Lisää uusi sähköpostiosoite
add_new_openid=Lisää uusi OpenID URI
add_new_openid=Lisää uusi OpenID-URI
add_email=Lisää sähköpostiosoite
add_openid=Lisää OpenID URI
add_email_success=Uusi sähköpostiosoite on lisätty.
@ -729,14 +762,14 @@ openid_desc=OpenID mahdollistaa todentamisen delegoinnin ulkopuoliselle palvelun
manage_ssh_keys=Hallitse SSH-avaimia
manage_gpg_keys=Hallitse GPG-avaimia
add_key=Lisää avain
ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi.
gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen.
ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. Vahvistettuja SSH-avaimia voi käyttää SSH-allekirjoitettujen Git-kommittien vahvistamiseen.
gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi, ja niitä käytetään kommittien vahvistamiseen. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat kommittien allekirjoittamisen sinun nimissä.
ssh_helper=<strong>Tarvitsetko apua?</strong> Tutustu GitHubin oppaaseen <a href="%s">omien SSH-avainten luonnista</a> tai <a href="%s">yleisistä ongelmista</a>, joita voit kohdata SSH:n kanssa.
gpg_helper=<strong>Tarvitsetko apua?</strong> Katso GitHubin opas <a href="%s">GPG</a>:stä.
add_new_key=Lisää SSH avain
add_new_gpg_key=Lisää GPG-avain
key_content_ssh_placeholder=Alkaa sanoilla 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', tai 'sk-ssh-ed25519@openssh.com'
key_content_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP PUBLIC KEY BLOCK-----'
key_content_ssh_placeholder=Alkaa sanoilla "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" tai "sk-ssh-ed25519@openssh.com"
key_content_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----"
ssh_key_name_used=Samanniminen SSH avain on jo olemassa tililläsi.
gpg_key_id_used=Julkinen GPG-avain samalla tunnuksella on jo olemassa.
gpg_no_key_email_found=Tämä GPG-avain ei vastaa mitään tiliisi liitettyä aktivoitua sähköpostiosoitetta. Se voidaan silti lisätä, jos allekirjoitat annetun pääsymerkin.
@ -748,7 +781,7 @@ gpg_token=Pääsymerkki
gpg_token_help=Voit luoda allekirjoituksen käyttäen:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=Panssaroitu GPG-allekirjoitus
key_signature_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP SIGNATURE-----'
key_signature_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP SIGNATURE-----"
ssh_key_verified=Vahvistettu avain
ssh_key_verified_long=Avain on vahvistettu pääsymerkillä ja sitä voidaan käyttää todentamaan commitit, jotka vastaavat tämän käyttäjän aktivoituja sähköpostiosoitteita.
ssh_key_verify=Vahvista
@ -756,7 +789,7 @@ ssh_token_required=Sinun täytyy antaa allekirjoitus alla olevalle pääsymerkil
ssh_token=Pääsymerkki
ssh_token_help=Voit luoda allekirjoituksen käyttäen:
ssh_token_signature=Panssaroitu SSH-allekirjoitus
key_signature_ssh_placeholder=Alkaa sanoilla '-----BEGIN SSH SIGNATURE-----'
key_signature_ssh_placeholder=Alkaa sanoilla "-----BEGIN SSH SIGNATURE-----"
subkeys=Aliavaimet
key_id=Avain ID
key_name=Avaimen nimi
@ -774,7 +807,7 @@ can_read_info=Luku
can_write_info=Kirjoitus
show_openid=Näytä profiilissa
hide_openid=Piilota profiilista
ssh_disabled=SSH pois käytöstä
ssh_disabled=SSH on pois käytöstä
manage_social=Hallitse liitettyjä sosiaalisia tilejä
manage_access_token=Hallitse pääsymerkkejä
@ -795,7 +828,7 @@ create_oauth2_application=Luo uusi OAuth2-sovellus
create_oauth2_application_button=Luo sovellus
oauth2_application_name=Sovelluksen nimi
save_application=Tallenna
oauth2_regenerate_secret=Luo secret uudelleen
oauth2_regenerate_secret=Luo salaisuus uudelleen
oauth2_regenerate_secret_hint=Kadotitko secretin?
oauth2_application_edit=Muokkaa
@ -811,10 +844,10 @@ twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen vahvistus. Ota palau
webauthn_nickname=Nimimerkki
manage_account_links=Hallitse linkitettyjä tilejä
manage_account_links=Yhdistetyt tilit
manage_account_links_desc=Nämä ulkoiset tilit on linkitetty Forgejo tiliisi.
link_account=Yhdistä tili
remove_account_link=Poista linkitetty tili
remove_account_link=Poista yhdistetty tili
remove_account_link_desc=Linkitetyn tilin poistaminen peruuttaa pääsyn Forgejo-tiliisi linkitetyn tili kautta. Jatketaanko?
remove_account_link_success=Linkitetty tili on poistettu.
@ -854,11 +887,11 @@ location_placeholder = Jaa likimääräinen sijaintisi muiden kanssa
retype_new_password = Vahvista uusi salasana
create_oauth2_application_success = Loit uuden OAuth2-sovelluksen.
repos_none = Et omista yhtäkään repositoriota.
visibility.limited_tooltip = Näkyvissä vain tunnistautuneille käyttäjille
visibility.limited_tooltip = Näkyvissä vain kirjautuneille käyttäjille
email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä
webauthn_register_key = Lisää turva-avain
blocked_users = Estetyt käyttäjät
profile_desc = Määritä, miten muut näkevät profiilisi. Ensisijaista sähköpostiosoitettasi käytetään ilmoitusten ja salasanan palautuspyyntöjen lähettämiseen sekä verkkosivupohjaisiin Git-operaatioihin.
profile_desc = Tietoja sinusta
change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäen uutta salasanaa.
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
change_password = Vaihda salasana
@ -892,6 +925,36 @@ twofa_disable = Poista kaksivaiheinen todennus käytöstä
twofa_disable_desc = Kaksivaiheisen todennuksen poistaminen asettaa tilisi aiempaa suurempaan uhkaan. Jatketaanko?
update_language_not_found = Kieli "%s" ei ole käytettävissä.
change_username_prompt = Huomio: Käyttäjätunnuksen vaihtaminen muuttaa myös tilisi URL-osoitteen.
oauth2_client_secret_hint = Tätä salaisuutta ei näytetä uudelleen, kun olet poistunut sivulta tai päivittänyt sivun. Varmista, että olet ottanut salaisuuden talteen.
blocked_since = Estetty %s lähtien
user_unblock_success = Käyttäjän esto on poistettu.
oauth2_redirect_uris = Uudelleenohjaus-URI:t. Käytä uutta riviä (newline) jokaista URI:a kohden.
oauth2_client_secret = Asiakkaan salaisuus
verify_ssh_key_success = SSH-avain "%s" on vahvistettu.
change_username_redirect_prompt = Vanha käyttäjätunnus uudelleenohjaa, kunnes joku muu ottaa käyttäjätunnuksen käyttönsä.
uploaded_avatar_is_too_big = Lähetetyn tiedoston koko (%d KiB) ylittää enimmäiskoon (%d KiB).
ssh_key_been_used = Tämä SSH-avain on jo lisätty palvelimelle.
verify_gpg_key_success = GPG-avain "%s" on vahvistettu.
add_key_success = SSH-avain "%s" on lisätty.
add_gpg_key_success = GPG-avain "%s" on lisätty.
ssh_key_deletion_success = SSH-avain on poistettu.
valid_until_date = Kelvollinen %s asti
oauth2_client_id = Asiakkaan tunniste
email_notifications.onmention = Ilmoitus vain maininnasta
email_notifications.submit = Aseta valinta
email_notifications.andyourown = Ja omat ilmoitukset
key_state_desc = Tätä avainta on käytetty viimeisen 7 päivän aikana
oauth2_application_create_description = OAuth2-sovellukset mahdollistavat kolmannen osapuolen sovelluksen pääsyn tilillesi tässä instanssissa.
oauth2_confidential_client = Luottamuksellinen sovellus. Valitse sovelluksille, jotka pitävät salaisuuden luottamuksellisena, kuten web-sovelluksille. Älä valitse natiiveille sovelluksille mukaan lukien työpöytä- ja mobiilisovellukset.
ssh_key_deletion_desc = SSH-avaimen poistaminen kumoaa pääsyn tilillesi kyseistä avainta käyttäen. Jatketaanko?
add_email_confirmation_sent = Vahvistusviesti on lähetetty osoitteeseen "%s". Vahvista sähköpostiosoitteesi seuraavan %s sisällä.
pronouns_custom_label = Mukautetut pronominit
openid_deletion_desc = Tämän OpenID-osoitteen poistaminen tililtäsi estää kirjautumisen sitä käyttäen. Jatketaanko?
ssh_signonly = SSH on tällä hetkellä poistettu käytöstä, joten näitä avaimia käytetään vain kommittien allekirjoituksen vahvistamiseen.
generate_token_name_duplicate = Nimeä <strong>%s</strong> on jo käytetty sovelluksen nimenä. Käytä eri nimeä.
oauth2_applications_desc = OAuth2-sovellukset mahdollistavat käyttämäsi kolmannen osapuolen sovelluksen todentaa turvallisesti käyttäjiä tähän Forgejo-instanssiin.
[repo]
owner=Omistaja
@ -917,7 +980,7 @@ repo_gitignore_helper=Valitse .gitignore-mallit
issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
license=Lisenssi
license_helper=Valitse lisenssitiedosto.
license_helper=Valitse lisenssitiedosto
readme=README
auto_init=Alusta repo (Luo .gitignore, License ja README)
create_repo=Luo repo
@ -1316,7 +1379,7 @@ activity.new_issues_count_1=Uusi ongelma
activity.new_issues_count_n=uutta ongelmaa
activity.new_issue_label=Avoinna
activity.unresolved_conv_label=Auki
activity.published_release_label=Julkaistu
activity.published_release_label=Julkaisu
activity.git_stats_pushed_1=on työntänyt
activity.git_stats_file_1=%d tiedosto
activity.git_stats_file_n=%d tiedostoa
@ -1361,9 +1424,9 @@ settings.transfer.title=Siirrä omistajuus
settings.transfer_form_title=Syötä repon nimi vahvistuksena:
settings.transfer_notices_3=- Jos arkisto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
settings.transfer_owner=Uusi omistaja
settings.wiki_delete=Poista Wiki data
settings.wiki_delete=Poista wikidata
settings.wiki_delete_desc=Repon wikin data poistaminen on pysyvä eikä voi peruuttaa.
settings.confirm_wiki_delete=Wiki datan poistaminen
settings.confirm_wiki_delete=Poista wikidata
settings.wiki_deletion_success=Repon wiki data on poistettu.
settings.delete=Poista tämä repo
settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa.
@ -1384,7 +1447,7 @@ settings.webhook.body=Sisältö
settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä.
settings.githook_name=Koukun nimi
settings.githook_content=Koukun sisältö
settings.update_githook=Päivitys koukku
settings.update_githook=Päivitä koukku
settings.payload_url=Kohde URL
settings.http_method=HTTP-menetelmä
settings.secret=Salaus
@ -1406,7 +1469,7 @@ settings.event_push_desc=Git push repoon.
settings.event_repository=Repo
settings.event_repository_desc=Repo luotu tai poistettu.
settings.event_header_issue=Ongelmien tapahtumat
settings.event_issues=Ongelmat
settings.event_issues=Muokkaus
settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
settings.event_issue_assign=Ongelma määritetty
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu.
@ -1414,7 +1477,7 @@ settings.event_issue_label_desc=Ongelman tunnisteet päivitetty tai tyhjennetty.
settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
settings.event_header_pull_request=Vetopyyntöjen tapahtumat
settings.event_pull_request=Vetopyyntö
settings.event_pull_request=Muokkaus
settings.event_package_desc=Paketti on luotu tai poistettu repossa.
settings.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
settings.add_hook_success=Uusi webkoukku on lisätty.
@ -1573,7 +1636,7 @@ release.ahead.commits = <strong>%d</strong> kommittia
all_branches = Kaikki haarat
n_tag_few = %s tagia
settings.event_fork_desc = Repo forkattu.
actions = Toimenpiteet
actions = Actions
fork_guest_user = Kirjaudu sisään forkataksesi tämän repon.
fork_from_self = Et voi forkata omistamaasi repoa.
visibility_fork_helper = (Tämän muuttaminen vaikuttaa kaikkien forkkien näkyvyyteen.)
@ -1641,7 +1704,7 @@ activity.git_stats_author_n = %d tekijää
issues.dependency.add_error_dep_exists = Riippuvuus on jo olemassa.
wiki.page_content = Sivun sisältö
wiki.page_title = Sivun otsikko
activity.navbar.contributors = Kontribuuttorit
activity.navbar.contributors = Avustajat
n_release_few = %s julkaisua
n_release_one = %s julkaisu
symbolic_link = Symbolinen linkki
@ -1659,7 +1722,7 @@ milestones.deletion_success = Merkkipaalu on poistettu.
project = Projektit
pulls.delete.title = Poistetaanko tämä vetopyyntö?
activity.title.issues_1 = %d ongelma
contributors.contribution_type.filter_label = Kontribuution tyyppi:
contributors.contribution_type.filter_label = Avustuksen tyyppi:
settings.protected_branch.delete_rule = Poista sääntö
settings.archive.success = Repo arkistoitiin onnistuneesti.
diff.comment.placeholder = Jätä kommentti
@ -1883,7 +1946,7 @@ migrate.gitlab.description = Tee migraatio gitlab.comista tai muista GitLab-inst
migrate.gitea.description = Tee migraatio gitea.comista tai muista Gitea-instansseista.
repo_gitignore_helper_desc = Valitse mitä tiedostoja ei seurata yleisimpien kielten mallipohjista. Tyypilliset artefaktit, joita eri kielten koostamistyökalut tuottavat, lisätään .gitignore-tiedostoon oletusarvoisesti.
milestones.filter_sort.latest_due_date = Kaukaisin määräpäivä
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta.</a>
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta</a>.
milestones.filter_sort.earliest_due_data = Lähin määräpäivä
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
settings.units.overview = Yleisnäkymä
@ -1959,9 +2022,81 @@ editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi
issues.re_request_review = Pyydä katselmointia uudelleen
pulls.status_checks_details = Yksityiskohdat
release.title_empty = Nimi ei voi olla tyhjä.
archive.title = Tämä repo on arkistoitu. Voit katsella sen sisältämiä tiedostoja ja kloonata repon, mutta et voi pushata, avata ongelmia tai luoda vetopyyntöjä.
reactions_more = ja %d lisää
mirror_address = Kloonaa URL-osoitteesta
migrate_items_merge_requests = Yhdistämispyynnöt
stars_remove_warning = Tämä poistaa kaikki tähdet tästä reposta.
archive.issue.nocomment = Tämä repo on arkistoitu. Et voi kommentoida ongelmia.
archive.pull.nocomment = Tämä repo on arkistoitu. Et voi kommentoida vetopyyntöjä.
settings.webhook_deletion_desc = Webkoukun poistaminen poistaa sen asetukset ja toimitushistorian. Jatketaanko?
settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisältää enintään 2048 merkkiä
settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu.
settings.event_pull_request_desc = Vetopyyntö avattu, suljettu, avattu uudelleen tai muokattu.
settings.protect_branch_name_pattern = Suojatun haaran nimen kaava
issues.dependency.add_error_dep_not_same_repo = Molempien ongelmien tulee olla samassa repossa.
settings.event_release = Julkaisu
pulls.merge_pull_request = Luo yhdistämiskommitti
settings.pull_mirror_sync_quota_exceeded = Kiintiö ylitetty, ei vedetä muutoksia.
settings.wiki_rename_branch_main_notices_1 = Tätä toimintoa <strong>EI VOI</strong> perua.
settings.webhook.test_delivery_desc_disabled = Aktivoi webkoukku testataksesi sitä tekaistulla tapahtumalla.
settings.discord_icon_url = Kuvakkeen URL-osoite
settings.archive.branchsettings_unavailable = Haaran asetukset eivät ole saatavilla arkistoiduissa repoissa.
pulls.ready_for_review = Valmiina katselmointiin?
issues.time_spent_total = Käytetty kokonaisaika
settings.webhook.test_delivery_desc = Testaa tätä webkoukkua tekaistulla tapahtumalla.
pulls.switch_comparison_type = Vaihda vertailutyyppiä
settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää <a target="_blank" rel="noopener noreferrer" href="%s">webkoukkujen oppaasta</a>.
issues.num_participants_one = %d osallistuja
issues.reference_link = Viittaus: %s
mirror_interval = Peilauksen aikaväli (kelvolliset yksiköt ovat "h", "m", "s"). 0 poistaa käytöstä aikaan pohjautuvan synkronoinnin. (Pienin aikaväli: %s)
mirror_interval_invalid = Peilauksen aikaväli ei ole kelvollinen.
mirror_sync_on_commit = Synkronoi kun kommitit pushataan
issues.role.collaborator = Avustaja
issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu avustajaksi tähän repoon.
issues.dependency.setting = Käytä riippuvuuksia ongelmiin ja vetopyyntöihin
wiki.desc = Kirjoita ja jaa dokumentaatiota avustajien kesken.
settings.collaboration = Avustajat
settings.mirror_settings.docs = Määritä reposi automaattisesti synkronoimaan kommitit, tagit ja haarat toiseen repoon.
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi automaattisesti pushaamaan kommitit, tagit ja haarat toiseen repoon. Pull-peilit on poistettu käytöstä tämän sivuston ylläpitäjän toimesta.
settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään kommitit, tagit ja haarat toisesta reposta.
settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja push- ja pull-peileistä täältä:
settings.mirror_settings.pushed_repository = Työnnetty repo
settings.mirror_settings.push_mirror.none = Push-peilejä ei ole määritetty
settings.mirror_settings.push_mirror.add = Lisää push-peili
settings.mirror_settings.push_mirror.edit_sync_time = Muokkaa peilin synkronoinnin aikaväliä
settings.allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
settings.pulls_desc = Käytä repositorion vetopyyntöjä
settings.actions_desc = Käytä integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen
settings.admin_enable_health_check = Käytä repositorion terveystarkastuksia (git fsck)
settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje ongelma kommitin toimesta, joka on tehty muuhun kuin oletusarvoiseen haaraan
settings.transfer_desc = Siirrä tämä repo käyttäjälle tai organisaatiolle, johon sinulla ylläpito-oikeus.
settings.signing_settings = Allekirjoituksen vahvistuksen asetukset
settings.trust_model = Allekirjoituksen luottamusmalli
settings.trust_model.default = Oletusarvoinen luottamusmalli
settings.trust_model.collaborator = Avustaja
settings.trust_model.collaborator.long = Avustaja: Luota avustajien allekirjoituksiin
settings.trust_model.collaboratorcommitter = Avustaja+kommitoija
settings.trust_model.collaboratorcommitter.long = Avustaja+kommitoija: Luota avustajien allekirjoituksiin, jotka vastaavat kommitoijaa
settings.add_collaborator = Lisää avustaja
settings.add_collaborator_success = Avustaja on lisätty.
settings.add_collaborator_owner = Omistajaa ei voi lisätä avustajaksi.
settings.add_collaborator_duplicate = Avustaja on jo lisätty tähän repoon.
settings.add_collaborator_blocked_our = Avustajaa ei voi lisätä, koska repon omistaja on estänyt hänet.
settings.add_collaborator_blocked_them = Avustajaa ei voi lisätä, koska kyseinen avustaja on estänyt repon omistajan.
settings.collaborator_deletion = Poista avustaja
settings.collaborator_deletion_desc = Avustajan poistaminen estää hänen pääsyn tähän repoon. Jatketaanko?
settings.remove_collaborator_success = Avustaja on poistettu.
settings.org_not_allowed_to_be_collaborator = Organisaatioita ei voi lisätä avustajaksi.
settings.default_branch_desc = Valitse repon oletushaara, johon vetopyynnöt ja koodikommitit kohdistetaan:
settings.archive.text = Repon arkistointi asettaa sen pelkkään lukutilaan. Se piilotetaan hallintapaneelista. Kukaan (et edes sinä!) ei pysty tehdä uusia kommitteja, avata uusia ongelmia tai avata vetopyyntöjä.
no_eol.text = Ei EOL:ää
pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
[graphs]
component_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe.
@ -2102,8 +2237,8 @@ dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita
dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..)
dashboard.server_uptime=Palvelimen Uptime
dashboard.current_goroutine=Nykyiset Goroutinet
dashboard.server_uptime=Palvelimen uptime
dashboard.current_goroutine=Nykyiset goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö
dashboard.total_memory_allocated=Yhteensä muistia varattu
dashboard.memory_obtained=Muistia saatu
@ -2123,7 +2258,7 @@ dashboard.mcache_structures_obtained=MCache rakenteita saatu
dashboard.profiling_bucket_hash_table_obtained=Profilointi Bucket Hash Table saatu
dashboard.gc_metadata_obtained=GC metatietoja saatu
dashboard.other_system_allocation_obtained=Muita järjestestelmän varauksia saatu
dashboard.next_gc_recycle=Seuraava GC kierrätys
dashboard.next_gc_recycle=Seuraava GC-kierrätys
dashboard.last_gc_time=Edellisen GC ajan jälkeen
dashboard.total_gc_time=Yhteensä GC tauko
dashboard.total_gc_pause=Yhteensä GC tauko
@ -2279,7 +2414,7 @@ config.default_visibility_organization=Uuden organisaation oletusnäkyvyys
config.webhook_config=Webkoukkujen asetukset
config.queue_length=Jonon pituus
config.deliver_timeout=Toimitus aikakatkaisu
config.deliver_timeout=Toimituksen aikakatkaisu
config.mailer_enabled=Käytössä
config.mailer_name=Nimi
@ -2426,8 +2561,14 @@ dashboard.task.unknown = Tuntematon tehtävä: %[1]s
dashboard.cron.error = Virhe Cronissa: %s: %[3]s
dashboard.task.started = Käynnistetty tehtävä: %[1]s
dashboard.cron.finished = Cron: %[1]s on valmistunut
dashboard.resync_all_sshkeys = Päivitä ".ssh/authorized_keys"-tiedosto Forgejo:n SSH-avaimilla.
dashboard.cleanup_packages = Siivoa vanhentuneet paketit
config.default_allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
monitor.download_diagnosis_report = Lataa diagnostiikkaraportti
monitor.last_execution_result = Tulos
[action]
create_repo=luotu repo <a href="%s">%s</a>
rename_repo=uudelleennimetty repo <code>%[1]s</code> nimelle <a href="%[2]s">%[3]s</a>
@ -2601,6 +2742,31 @@ settings.link = Linkitä tämä paketti repositorioon
maven.download = Lataa riippuvuus suorittamalla komentorivillä:
registry.documentation = Lisätietoja %s-rekisteristä on <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaatiossa</a>.
owner.settings.chef.keypair.description = Avainpari vaaditaan Chef-rekisteriin tunnistautumista varten. Jos olet luonut avainparin aiemmin, uuden avainparin luominen hylkää aiemman avainparin.
owner.settings.cleanuprules.keep.pattern = Säilytä kaavaa vastaavat versiot
owner.settings.cleanuprules.pattern_full_match = Toteuta kaavio paketin koko nimeen
owner.settings.cleanuprules.keep.title = Näitä sääntöjä vastaavat versiot säilytetään, vaikka ne vastaisivat alla olevaa poistosääntöä.
owner.settings.cleanuprules.keep.count = Säilytä viimeisimmät
owner.settings.cleanuprules.remove.pattern = Poista kaavaa vastaavat versiot
owner.settings.cleanuprules.keep.pattern.container = Viimeisin (<code>latest</code>) versio säilytetään aina Container-paketeista.
owner.settings.cleanuprules.remove.title = Näitä sääntöjä vastaavat versiot poistetaan, ellei sääntö yläpuolella käske säilyttää niitä.
owner.settings.cleanuprules.remove.days = Poista versiot, jotka ovat vanhempia kuin
arch.pacman.helper.gpg = Lisää luottamusvarmenne pacmanille:
empty.repo = Lähetitkö paketin, mutta se ei näy täällä? Siirry <a href="%[1]s">paketin asetuksiin</a> ja linkitä se tähän repoon.
published_by = Julkaistu %[1]s käyttäjän <a href="%[2]s">%[3]s</a> toimesta
alpine.registry = Määritä tämä rekisteri lisäämällä URL-osoite tiedostoon <code>/etc/apk/repositories</code>:
alpine.registry.key = Lataa rekisterin julkinen RSA-avain hakemistoon <code>/etc/apk/keys/</code> vahvistaaksesi indeksin allekirjoituksen:
alpine.registry.info = Valitse $branch ja $repository alla olevasta listasta.
arch.pacman.conf = Lisää palvelin asiaan liittyvällä jakelulla ja arkkitehtuurilla tiedostoon <code>/etc/pacman.conf</code> :
arch.pacman.sync = Synkronoi paketti pacmanin kanssa:
container.images.title = Levykuvat
debian.registry.info = Valitse $distribution ja $component alla olevasta listasta.
rpm.repository.multiple_groups = Tämä paketti on saatavilla useissa ryhmissä.
rubygems.dependencies.runtime = Ajonaikaiset riippuvuudet
owner.settings.cargo.rebuild = Rakenna indeksi uudelleen
owner.settings.cargo.rebuild.error = Cargo-indeksin rakentaminen uudelleen epäonnistui: %v
owner.settings.cargo.rebuild.success = Cargo-indeksi rakennettiin uudelleen.
owner.settings.cleanuprules.preview.none = Siivoussääntö ei vastaa yhtäkään pakettia.
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
@ -2699,11 +2865,15 @@ workflow.disable_success = Työnkulku "%s" on poistettu käytöstä.
runs.no_job = Työnkulun tulee sisältää vähintään yksi työ
runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s
runners = Ajajat
actions = Toimenpiteet
actions = Actions
unit.desc = Hallitse integroituja CI/CD-putkia Forgejo Actionsia hyödyntäen.
runs.pushed_by = työntänyt
runs.no_workflows.help_no_write_access = Lisätietoja Forgejo Actionsista on saatavilla <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaatiosta</a>.
[projects]
type-1.display_name = Yksittäinen projekti
deleted.display_name = Poistettu projekti

View file

@ -748,7 +748,7 @@ social = Mga social account
biography_placeholder = Sabihin sa iba ng kaunti tungkol sa iyong sarili! (Sinusuportahan ang Markdown)
change_username_prompt = Tandaan: Ang pagpalit ng username ay papalitan din ang URL ng iyong account.
organization = Mga Organisasyon
profile_desc = Kontrolin kung paano ipinapakita ang iyong profile sa ibang mga gumagamit. Ang iyong pangunahing email address ay gagamitin para sa mga abiso, pagbawi ng password at mga Git operation na batay sa web.
profile_desc = Tungkol sa iyo
hidden_comment_types_description = Ang mga uri ng komento na naka-check dito ay hindi ipapakita sa loob ng mga pahina ng isyu. Halimbawa ang pag-check ng "Label" ay tatanggalin lahat ng mga "Idinagdag/tinanggal ni <user> ang <label>" na komento.
comment_type_group_milestone = Milestone
comment_type_group_issue_ref = Pagsangguni ng isyu
@ -767,7 +767,7 @@ ssh_key_deletion_desc = Ang pagtanggal ng SSH key ay matatanggihan ang pag-acces
no_activity = Walang kamakilang aktibidad
ssh_signonly = Kasalukuyang naka-disable ang SSH kaya magagamit lang ang mga key na ito para sa pagpapatunay ng commit signature.
gpg_desc = Ang mga pampublikong GPG key dito ay nauugnay sa iyong account at ginagamit para i-verify ang iyong mga commit. Panatilihing ligtas ang iyong mga pribadong key dahil pinapayagan nito ang pag-sign ng mga commit gamit ng iyong pagkakakilanlan.
keep_email_private_popup = Itatago nito ang iyong email address sa iyong profile. Hindi na ito ang magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file at pagbabago. Sa halip gagamitin ang isang espeyal na address na %s para i-associate ang mga commit sa iyong account. Tandaan na ang pagbabago ng opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
keep_email_private_popup = Ang iyong email address ay hindi ipapakita sa iyong profile at hindi magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file, mga pagbabago, at mga merge commit. Sa halip, gagamitin ang isang espeyal na address na %s para i-link ang mga commit sa iyong account. Ang opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
gpg_key_id_used = Ang isang publikong GPG key na may katulad na ID ay umiiral na.
gpg_no_key_email_found = Ang GPG key na ito ay hindi tumutugma sa anumang email address na nauugnay sa iyong account. Madadagdag pa rin ito kapag i-sign mo ang ibinigay na token.
ssh_principal_deletion_success = Tinanggal na ang principal.
@ -997,6 +997,8 @@ language.title = Default na wika
keep_activity_private.description = Makikita mo lang at mga tagapangasiwa ng instansya ang iyong <a href="%s">pampublikong aktibidad</a>.
language.description = Mase-save ang wika sa iyong account at gagamitin bilang default pagkatapos mong mag-log in.
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! <a href="%s">Matuto pa</a>.
pronouns_custom_label = Mga pasadyang pronoun
user_block_yourself = Hindi mo maaring harangan ang sarili mo.
[repo]
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
@ -1070,7 +1072,7 @@ license_helper = Pumili ng file ng lisensya
license_helper_desc = Ang lisensya ay namamahala kung ano ang pwede at hindi pwedeng gawin ng mga ibang tao sa iyong code. Hindi sigurado kung alin ang wasto para sa iyong proyekto? Tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">Pumili ng lisensya</a>.
object_format_helper = Object format ng repositoryo. Hindi mababago mamaya. Ang SHA1 ang pinaka-compatible.
readme = README
auto_init = I-initialize ang repositoryo (Nagdadagdag ng .gitignore, Lisensya, at README)
auto_init = I-initialize ang repositoryo
trust_model_helper = Pumili ng trust model para sa signature verification. Ang mga posibleng opsyon ay:
trust_model_helper_collaborator = Katulong: I-trust ang mga signature batay sa mga katulong
trust_model_helper_committer = Commiter: I-trust ang mga signature na tumutugma sa mga commiter
@ -1127,8 +1129,8 @@ delete_preexisting_content = Burahin ang mga file sa %s
tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
migrate_items_pullrequests = Mga hiling sa paghila
archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga pull request.
archive.title = Naka-archive ang repo na ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
pulls = Mga hiling sa paghila
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
@ -1184,7 +1186,7 @@ migrate_items_labels = Mga label
migrate_items_issues = Mga isyu
migrate_items_merge_requests = Mga merge request
migrate.clone_address = Magmigrate / Mag-clone mula sa URL
archive.issue.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga isyu.
archive.issue.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga isyu.
migrate_items = Mga item sa pagmigrate
migrate_items_releases = Mga paglabas
migrate_repo = I-migrate ang repositoryo
@ -2707,6 +2709,21 @@ release.hide_archive_links = Itago ang mga awtomatikong na-generate na archive
release.hide_archive_links_helper = Itago ang awtomatikong na-generate na source code archive para sa release na ito. Halimbawa, kung maga-upload ka ng sarili mo.
branch.already_exists = Umiiral na ang branch na may pangalan na "%s".
diff.bin = BIN
settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
pulls.sign_in_require = <a href="%s">Mag-sign in</a> para gumawa ng bagong hiling sa paghila.
new_from_template = Gumamit ng template
new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
new_advanced = Mga advanced na setting
new_advanced_expand = I-click para i-expand
auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
issues.reaction.add = Magdagdag ng reaksyon
issues.reaction.alt_few = Nag-react si %[1]s ng %[2]s.
issues.reaction.alt_many = Sina %[1]s at %[2]d pang iba ay nag-react ng %[3]s.
issues.reaction.alt_remove = Magtanggal ng %[1]s reaksyon mula sa komento.
issues.reaction.alt_add = Magdagdag ng %[1]s reaksyon sa komento.
issues.context.menu = Menu ng komento
summary_card_alt = Pangkalahatang-ideyang card ng repositoryo na %s
release.summary_card_alt = Pangkalahatang-ideyang card ng isang release na nakapamagat na "%s" sa repositoryo na %s
[search]
commit_kind = Maghanap ng mga commit…

View file

@ -1,7 +1,7 @@
[common]
home=Accueil
dashboard=Tableau de bord
explore=Explorateur
explore=Explorer
help=Aide
logo=Logo
sign_in=Connexion
@ -165,6 +165,7 @@ error413 = Votre quota est épuisé.
new_repo.title = Nouveau dépôt
new_migrate.link = Nouvelle migration
new_org.link = Nouvelle organisation
copy_path = Copier le chemin
[aria]
navbar=Barre de navigation
@ -519,7 +520,7 @@ issue.action.force_push=<b>%[1]s</b> a forcé <b>%[2]s</b> de %[3]s vers %[4]s.
issue.action.push_1=<b>@%[1]s</b> a soumis %[3]d révision sur %[2]s
issue.action.push_n=<b>@%[1]s</b> a soumis %[3]d révisions sur %[2]s
issue.action.close=<b>@%[1]s</b> a fermé #%[2]d.
issue.action.reopen=<b>@%[1]s</b> a réouvert #%[2]d.
issue.action.reopen=<b>@%[1]s</b> a rouvert #%[2]d.
issue.action.merge=<b>@%[1]s</b> a fusionné de #%[2]d vers %[3]s.
issue.action.approve=<b>@%[1]s</b> a approuvé cette demande d'ajout.
issue.action.reject=<b>@%[1]s</b> a demandé des modifications sur cette demande d'ajout.
@ -744,9 +745,9 @@ uid=UID
webauthn=Clés de sécurité à deux facteurs
public_profile=Profil public
biography_placeholder=Parlez-nous un peu de vous! (Markdown est interprété)
biography_placeholder=Parlez-nous un peu de vous! (Markdown est supporté)
location_placeholder=Partagez votre position approximative avec d'autres personnes
profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
profile_desc=À propos de vous
password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails.
full_name=Nom complet
website=Site Web
@ -811,7 +812,7 @@ manage_emails=Gérer les adresses courriels
manage_themes=Thème par défaut
manage_openid=Adresses OpenID
email_desc=Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et, à condition qu'elle ne soit pas cachée, les opérations Git basées sur le Web.
theme_desc=Ce sera votre thème par défaut sur le site.
theme_desc=Ce thème sera utilisé pour l'interface web lorsque vous êtes authentifié.
primary=Principale
activated=Activé
requires_activation=Nécessite une activation
@ -837,7 +838,7 @@ add_email_success=La nouvelle adresse e-mail a été ajoutée.
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
keep_email_private=Cacher l'adresse courriel
keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Notez que changer cette option n'aura pas d'effet sur les commits existants.
keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Cette option n'aura pas d'effet sur les commits existants.
openid_desc=OpenID vous permet de confier l'authentification à une tierce partie.
manage_ssh_keys=Gérer les clés SSH
@ -1053,9 +1054,12 @@ language.title = Langue par défaut
keep_activity_private.description = Vous seul pourrez voir votre <a href="%s">activité publique</a>, ainsi que les administrateurs de l'instance.
language.localization_project = Aidez-nous à traduire Forgejo dans votre langue ! <a href="%s">En savoir plus</a>.
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
user_block_yourself = Vous ne pouvez pas vous bloquer vous même.
pronouns_custom_label = Pronoms personnalisés
[repo]
new_repo_helper=Un dépôt contient tous les fichiers dun projet, ainsi que lhistorique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>
new_repo_helper=Un dépôt contient tous les fichiers dun projet, ainsi que lhistorique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>.
owner=Propriétaire
owner_helper=Certaines organisations peuvent ne pas apparaître dans la liste déroulante en raison d'une limite maximale du nombre de dépôts.
repo_name=Nom du dépôt
@ -1095,11 +1099,11 @@ issue_labels=Étiquettes
issue_labels_helper=Sélectionner un jeu d'étiquettes
license=Licence
license_helper=Sélectionner une licence
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>.
readme=LISEZMOI
readme_helper=Choisissez un modèle de fichier LISEZMOI
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
auto_init=Initialiser le dépôt (avec un .gitignore, une Licence et un README.md)
auto_init=Initialiser le dépôt
trust_model_helper=Choisissez, parmi les éléments suivants, les règles de confiance des signatures paraphant les révisions :
trust_model_helper_collaborator=Collaborateur : ne se fier qu'aux signatures des collaborateurs du dépôt
trust_model_helper_committer=Auteur : ne se fier qu'aux signatures des auteurs de révisions
@ -1312,6 +1316,7 @@ view_git_blame=Voir Git blame
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise « vidéo » HTML5.
audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « audio » HTML5.
stored_lfs=Stocké avec Git LFS
stored_annex=Stocké avec Git Annex
symbolic_link=Lien symbolique
executable_file=Fichier exécutable
vendored = Vendored
@ -1337,6 +1342,7 @@ editor.upload_file=Téléverser un fichier
editor.edit_file=Modifier le fichier
editor.preview_changes=Aperçu des modifications
editor.cannot_edit_lfs_files=Les fichiers LFS ne peuvent pas être modifiés dans l'interface web.
editor.cannot_edit_annex_files=Les fichiers Annex ne peuvent pas être modifiés dans l'interface web.
editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web.
editor.edit_this_file=Modifier le fichier
editor.this_file_locked=Le fichier est verrouillé
@ -1617,7 +1623,7 @@ issues.reopen_issue=Rouvrir
issues.reopen_comment_issue=Réouvrir avec le commentaire
issues.create_comment=Commenter
issues.closed_at=`a fermé ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
issues.reopened_at=`a réouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
issues.reopened_at=`a rouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
issues.commit_ref_at=`a référencé ce ticket depuis une révision <a id="%[1]s" href="#%[1]s"> %[2]s</a>.`
issues.ref_issue_from=`<a href="%[3]s">a fait référence à %[4]s</a> ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
issues.ref_pull_from=`<a href="%[3]s">a fait référence</a> à cette demande d'ajout %[4]s <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
@ -1777,7 +1783,7 @@ issues.review.approve=a approuvé ces modifications %s
issues.review.comment=a évalué cette demande dajout %s
issues.review.dismissed=a révoqué lévaluation de %s %s
issues.review.dismissed_label=Révoquée
issues.review.left_comment=laisser un commentaire
issues.review.left_comment=a laissé un commentaire
issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s).
issues.review.reject=a requis les changements %s
issues.review.wait=a été sollicité pour évaluer cette demande dajout %s
@ -2508,7 +2514,7 @@ settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt.
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
settings.archive.branchsettings_unavailable=Le paramétrage des branches n'est pas disponible quand le dépôt est archivé.
settings.archive.tagsettings_unavailable=Le paramétrage des étiquettes n'est pas disponible si le dépôt est archivé.
settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
settings.archive.mirrors_unavailable = Les miroirs ne sont pas disponibles si le dépôt a été archivé.
settings.unarchive.button=Désarchiver ce dépôt
settings.unarchive.header=Réhabiliter ce dépôt
settings.unarchive.text=Réhabiliter un dépôt dégèle les actions de révisions et de soumissions, la gestion des tickets et des demandes d'ajouts.
@ -2844,6 +2850,25 @@ diff.git-notes.remove-body = Cette note sera supprimée.
diff.git-notes.add = Ajouter une note
diff.git-notes.remove-header = Supprimer la note
issues.summary_card_alt = Fiche de synthèse d'un ticket nommé "%s" dans le dépôt %s
editor.add_tmpl.filename = fichier
issues.num_reviews_one = %d revue
issues.num_reviews_few = %d revues
settings.default_update_style_desc = Style de mise à jour des demandes de fusion qui sont en retard par rapport à la branche de base.
new_from_template = Utiliser un modèle
new_from_template_description = Vous pouvez sélectionner un modèle de dépôt existant sur cette instance et appliquer ses paramètres.
new_advanced = Options avancées
new_advanced_expand = Cliquer pour développer
auto_init_description = Débuter l'historique Git avec un README et ajouter en option les fichier de licence et .gitignore.
summary_card_alt = Carte résumé du dépôt %s
issues.reaction.add = Ajouter une réaction
issues.reaction.alt_few = %[1]s a réagit %[2]s.
issues.reaction.alt_many = %[1]s et %[2]d de plus ont réagit %[3]s.
issues.reaction.alt_remove = Enlever la réaction %[1]s du commentaire.
issues.reaction.alt_add = Ajouter la réaction %[1]s du commentaire.
issues.context.menu = Menu commentaire
pulls.sign_in_require = <a href="%s">Identifiez vous</a> pour créer une nouvelle demande d'ajout.
release.summary_card_alt = Carte résumé de la publication dont le titre est "%s" dans le dépôt %s
[graphs]
component_loading = Chargement %s...
@ -3545,10 +3570,10 @@ rename_repo=a rebaptisé le dépôt <code>%[1]s</code> en <a href="%[2]s">%[3]s<
commit_repo=a soumis sur <a href="%[2]s">%[3]s</a> dans <a href="%[1]s">%[4]s</a>
create_issue=`a ouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
close_issue=`a fermé le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue=`a réouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue=`a rouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
create_pull_request=`a créé la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
close_pull_request=`a fermé la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request=`a réouvert la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request=`a rouvert la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
comment_issue=`a commenté le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
comment_pull=`a commenté la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request=`a fusionné la demande dajout <a href="%[1]s">%[3]s#%[2]s</a>`
@ -3662,7 +3687,7 @@ alpine.registry=Configurez ce registre en ajoutant lURL dans votre fichier <c
alpine.registry.key=Téléchargez la clé RSA publique du registre dans le dossier <code>/etc/apk/keys/</code> pour vérifier la signature de l'index :
alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous.
alpine.install=Pour installer le paquet, exécutez la commande suivante :
alpine.repository=Informations sur le Dépôt
alpine.repository=Informations sur le dépôt
alpine.repository.branches=Branches
alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures
@ -3682,7 +3707,7 @@ conda.install=Pour installer le paquet en utilisant Conda, exécutez la commande
container.details.type=Type d'image
container.details.platform=Plateforme
container.pull=Tirez l'image depuis un terminal :
container.digest=Empreinte :
container.digest=Empreinte
container.multi_arch=SE / Arch
container.layers=Calques d'image
container.labels=Labels
@ -3693,7 +3718,7 @@ cran.install=Pour installer le paquet, exécutez la commande suivante :
debian.registry=Configurez ce registre à partir d'un terminal :
debian.registry.info=Choisissez $distribution et $component dans la liste ci-dessous.
debian.install=Pour installer le paquet, exécutez la commande suivante :
debian.repository=Infos sur le Dépôt
debian.repository=Infos sur le dépôt
debian.repository.distributions=Distributions
debian.repository.components=Composants
debian.repository.architectures=Architectures
@ -3797,6 +3822,7 @@ arch.version.conflicts = Conflits
arch.version.replaces = Remplace
arch.version.backup = Sauvegarde
arch.version.makedepends = Faire des dépendances
container.images.title = Images
[secrets]
secrets=Secrets
@ -3945,7 +3971,7 @@ keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actu
fuzzy_tooltip = Inclure les résultats proches des termes recherchés
match = Correspondance
match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés
repo_kind = Chercher dans les dépôt...
repo_kind = Chercher dans les dépôts...
user_kind = Chercher les utilisateurs...
org_kind = Chercher les organisations...
team_kind = Chercher les équipes...

View file

@ -787,6 +787,7 @@ file_too_large=Ez a fájl túl nagy ahhoz, hogy megjelenítsük.
video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video tag-et.
audio_not_supported_in_browser=A böngésző nem támogatja a HTML5 audio tag-et.
stored_lfs=Git LFS-el eltárolva
stored_annex=Git Annex-el eltárolva
symbolic_link=Szimbolikus hivatkozás
commit_graph=Commit gráf
commit_graph.hide_pr_refs=Pull request-ek elrejtése
@ -799,6 +800,7 @@ editor.upload_file=Fájl feltöltése
editor.edit_file=Fájl szerkesztése
editor.preview_changes=Változások előnézete
editor.cannot_edit_lfs_files=LFS fájlok nem szerkeszthetőek a webes felületen.
editor.cannot_edit_annex_files=Annex fájlok nem szerkeszthetőek a webes felületen.
editor.cannot_edit_non_text_files=Bináris fájlok nem szerkeszthetőek a webes felületen.
editor.edit_this_file=Fájl szerkesztése
editor.this_file_locked=Zárolt állomány

View file

@ -596,6 +596,7 @@ file_permalink=Permalink
file_too_large=Berkas terlalu besar untuk ditampilkan.
stored_lfs=Tersimpan dengan GIT LFS
stored_annex=Tersimpan dengan GIT Annex
commit_graph=Grafik Komit
blame=Salahkan
normal_view=Pandangan Normal
@ -607,6 +608,7 @@ editor.upload_file=Unggah Berkas
editor.edit_file=Sunting Berkas
editor.preview_changes=Tinjau Perubahan
editor.cannot_edit_lfs_files=Berkas LFS tidak dapat disunting dalam antarmuka web.
editor.cannot_edit_annex_files=Berkas Annex tidak dapat disunting dalam antarmuka web.
editor.cannot_edit_non_text_files=Berkas biner tidak dapat disunting dalam antarmuka web.
editor.edit_this_file=Sunting Berkas
editor.this_file_locked=Berkas terkunci

View file

@ -680,6 +680,7 @@ file_view_rendered=Skoða Unnið
file_copy_permalink=Afrita Varanlega Slóð
stored_lfs=Geymt með Git LFS
stored_annex=Geymt með Git Annex
commit_graph.hide_pr_refs=Fela Sameiningarbeiðnir
commit_graph.monochrome=Einlitað
commit_graph.color=Litað

View file

@ -1267,6 +1267,7 @@ view_git_blame=Visualizza git incolpa
video_not_supported_in_browser=Il tuo browser non supporta le etichette "video" di HTML5.
audio_not_supported_in_browser=Il tuo browser non supporta le etichette "audio" di HTML5.
stored_lfs=Memorizzati con Git LFS
stored_annex=Memorizzati con Git Annex
symbolic_link=Link Simbolico
commit_graph=Grafico dei commit
commit_graph.select=Seleziona rami
@ -1285,6 +1286,7 @@ editor.upload_file=Carica file
editor.edit_file=Modifica file
editor.preview_changes=Anteprima modifiche
editor.cannot_edit_lfs_files=I file LFS non possono essere modificati nell'interfaccia web.
editor.cannot_edit_annex_files=I file Annex non possono essere modificati nell'interfaccia web.
editor.cannot_edit_non_text_files=I file binari non possono essere modificati tramite interfaccia web.
editor.edit_this_file=Modifica file
editor.this_file_locked=Il file è bloccato
@ -3221,7 +3223,7 @@ auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API
auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) per specificare gli endpoint
auths.tip.twitter=Vai su %s, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata
auths.tip.discord=Registra una nuova applicazione su %s
auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"`
auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex.Passport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"`
auths.tip.mastodon=Inserisci un URL di istanza personalizzato per l'istanza mastodon con cui vuoi autenticarti (o usa quella predefinita)
auths.edit=Modifica fonte di autenticazione
auths.activated=Questa fonte di autenticazione è attiva

View file

@ -1305,6 +1305,7 @@ view_git_blame=Git Blameを表示
video_not_supported_in_browser=このブラウザはHTML5のvideoタグをサポートしていません。
audio_not_supported_in_browser=このブラウザーはHTML5のaudioタグをサポートしていません。
stored_lfs=Git LFSで保管されています
stored_annex=Git Annexで保管されています
symbolic_link=シンボリック リンク
executable_file=実行ファイル
commit_graph=コミットグラフ
@ -1328,6 +1329,7 @@ editor.upload_file=ファイルをアップロード
editor.edit_file=ファイルを編集
editor.preview_changes=変更をプレビュー
editor.cannot_edit_lfs_files=LFSのファイルはWebインターフェースで編集できません。
editor.cannot_edit_annex_files=AnnexのファイルはWebインターフェースで編集できません。
editor.cannot_edit_non_text_files=バイナリファイルはWebインターフェースで編集できません。
editor.edit_this_file=ファイルを編集
editor.this_file_locked=ファイルはロックされています

View file

@ -128,7 +128,7 @@ copy_success = 복사되었습니다!
copy_error = 복사 실패
copy_type_unsupported = 이 파일 형식은 복사할 수 없습니다
error = 오류
error404 = 도달하려는 페이지가 <strong>존재하지 않거나</strong> 볼 수 있도록 <strong>인증되지 않았습니다</strong>.
error404 = 도달하려는 페이지가 <strong>존재하지 않거나</strong> 볼 수 있는 <strong>권한이 없습니다</strong>.
go_back = 돌아가기
invalid_data = 유효하지 않는 데이터: %v
unknown = 알 수 없음
@ -160,6 +160,16 @@ view = 보기
never = 안함
test = 테스트
new_repo.title = 새 저장소
new_org.title = 새 조직
new_repo.link = 새 저장소
new_org.link = 새 조직
copy_path = 경로 복사
new_migrate.title = 마이그레이션
new_migrate.link = 새 마이그레이션
error413 = 사용 가능한 할당량을 모두 소진하였습니다.
[aria]
navbar = 내비게이션 바
footer.links = 링크
@ -183,6 +193,21 @@ buttons.code.tooltip = 코드 추가
buttons.link.tooltip = 링크 추가
buttons.quote.tooltip = 인용구 추가
buttons.list.unordered.tooltip = 불릿 리스트 추가
buttons.list.ordered.tooltip = 번호로 된 리스트 추가
buttons.list.task.tooltip = 작업 목록 추가
buttons.mention.tooltip = 사용자 또는 팀을 언급
buttons.ref.tooltip = 이슈 또는 풀 리퀘스트 참조
buttons.switch_to_legacy.tooltip = 대신에 구형 편집기 사용
buttons.enable_monospace_font = 고정 폭 글꼴 활성화
buttons.disable_monospace_font = 고정 폭 글꼴 비활성화
buttons.new_table.tooltip = 테이블 추가
table_modal.header = 테이블 추가
table_modal.placeholder.header = 헤더
table_modal.placeholder.content = 내용
table_modal.label.rows =
table_modal.label.columns =
[filter]
string.desc = 하 - 가
string.asc = 가 - 하
@ -191,6 +216,10 @@ string.asc = 가 - 하
network_error = 네트워크 오류
server_internal = 내부 서버 오류
occurred = 에러가 발생함
report_message = 이것이 Forgejo의 버그라고 생각한다면, <a href="%s" target="_blank">Codeberg</a> 에서 이슈를 검색하거나 필요하다면 새 이슈를 만들어주세요.
not_found = 타겟을 찾을 수 없습니다.
[startpage]
app_desc=편리한 설치형 Git 서비스
install=쉬운 설치
@ -198,6 +227,11 @@ platform=크로스 플랫폼
lightweight=가벼움
license=오픈 소스
install_desc = 간단히 당신의 기기에서<a target="_blank" rel="noopener noreferrer" href="%[1]s">바이너리를 실행하거나</a>, <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>를 사용하거나, <a target="_blank" rel="noopener noreferrer" href="%[3]s">패키지 저장소</a>에서 설치할 수 있습니다.
platform_desc = Forgejo는 Linux와 FreeBSD등의 자유 오픈소스 운영 체제를 포함한 다양한 CPU 아키텍처에서 실행됩니다. 마음 가는대로 고르세요!
lightweight_desc = Forgejo의 낮은 전력 소모량은 값싼 Raspberry Pi마저 구동할 수 있게 합니다. 기기의 에너지를 절약하세요!
license_desc = <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>를 설치해보세요! Forgejo를 개선하기 위해 <a target="_blank" rel="noopener noreferrer" href="%[2]s">기여</a>할 수 있습니다. 기여자가 되기를 망설이지 마세요!
[install]
install=설치
title=초기 설정
@ -205,7 +239,7 @@ docker_helper=Forgejo를 Docker에서 실행하려면 설정 전에 이 <a targe
db_title=데이터베이스 설정
db_type=데이터베이스 유형
host=호스트
user=이름
user=사용자명
password=비밀번호
db_name=데이터베이스 이름
db_schema=스키마
@ -216,8 +250,8 @@ err_empty_db_path=SQLite3 데이터베이스 경로는 필수 입력 값입니
no_admin_and_disable_registration=관리자 계정을 만들지 않고 등록을 비활성화할 수 없습니다.
err_empty_admin_password=관리자 비밀번호는 비어 있을 수 없습니다.
err_empty_admin_email=관리자 이메일은 비어 있을 수 없습니다.
err_admin_name_is_reserved=관리자 사용자 이름이 올바르지 않습니다, 제한된 사용자 이름입니다
err_admin_name_is_invalid=관리자 사용자 이름이 올바르지 않습니다
err_admin_name_is_reserved=관리자의 사용자명이 올바르지 않음, 이미 사용된 사용자명임
err_admin_name_is_invalid=관리자의 사용자명이 올바르지 않음
general_title=기본설정
app_name=인스턴스 제목
@ -226,7 +260,7 @@ repo_path=저장소 최상위 경로
repo_path_helper=Git 원격 저장소는 이 디렉터리에 저장 됩니다.
lfs_path=Git LFS 루트 경로
lfs_path_helper=Git LFS에 저장된 파일들은 이 디렉토리에 저장됩니다. LFS를 사용하지 않는다면 빈칸으로 남겨주세요.
run_user=다음 사용자로 실행
run_user=실행 사용자명
ssh_port=SSH 서버 포트
ssh_port_helper=SSH 서버를 실행할 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다.
http_port=HTTP 수신 포트
@ -242,7 +276,7 @@ smtp_addr=SMTP 호스트
smtp_port=SMTP 포트
smtp_from=이메일 발신인
smtp_from_helper=Forgejo 가 사용할 이메일 주소. 이메일 주소 또는 "이름" <email@example.com> 형식으로 입력하세요.
mailer_user=SMTP 사용자이름
mailer_user=SMTP 사용자
mailer_password=SMTP 비밀번호
register_confirm=가입시 이메일 확인 필수
mail_notify=이메일 알림 켜기
@ -250,9 +284,9 @@ server_service_title=서버 및 기타 서비스 설정
offline_mode=로컬 모드 켜기
offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬에서 제공합니다.
disable_gravatar=Gravatar 사용안함
disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
disable_gravatar.description=Gravatar를 비롯한 타사 아바타 출처를 사용하지 않도록 설정합니다. 사용자가 직접 아바타를 업로드하지 않는 한 기본 아바타를 사용합니다.
federated_avatar_lookup=탈중앙화 아바타 사용
federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
federated_avatar_lookup.description=Libravatar 아바타를 조회합니다.
disable_registration=사용자 등록 비활성화
disable_registration.description=인스턴스 관리자만이 새 사용자 계정을 추가할 수 있게 됩니다. 공개 인스턴스를 제공할 예정이고 많은 양의 스팸 계정을 감당할 준비가 되어 있지 않다면 사용자 등록을 비활성화 할 것을 강력히 권고합니다.
allow_only_external_registration.description=새 계정을 등록하려는 사용자는 설정된 외부 서비스를 이용해야만 새 계정을 등록할 수 있습니다.
@ -264,7 +298,7 @@ enable_captcha.description=사용자 등록시 캡차를 요구합니다.
require_sign_in_view=인스턴스의 콘텐츠를 볼때 로그인 요구
admin_setting.description=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다.
admin_title=관리자 계정 설정
admin_name=관리자 이름
admin_name=관리자의 사용자명
admin_password=비밀번호
confirm_password=비밀번호 확인
admin_email=이메일 주소
@ -273,18 +307,18 @@ test_git_failed='git' 명령 테스트 실패: %v
sqlite3_not_available=해당 버전에서는 SQLite3를 지원하지 않습니다. %s에서 공식 버전을 다운로드해주세요. ('gobuild' 버전이 아닙니다).
invalid_db_setting=데이터베이스 설정이 올바르지 않습니다: %v
invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습니다: %v
run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다: %s -> %s
run_user_not_match="실행 사용자명"이 현재 사용자명과 다릅니다: %s -> %s
save_config_failed=설정을 저장할 수 없습니다: %v
invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v
invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v
default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정
default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다.
default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정해 가입 직후 정보가 유출되는것을 방지합니다.
default_allow_create_organization=조직 생성 허용을 기본값으로 설정
default_allow_create_organization.description=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다.
default_enable_timetracking=시간 추적 사용을 기본값으로 설정
default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다.
default_allow_create_organization.description=신규 사용자에게 기본적으로 조직 생성 권한을 부여합니다. 이 옵션이 꺼져있다면, 관리자가 신규 사용자에게 조직 생성 권한을 부여해야합니다.
default_enable_timetracking=시간 기록 기능을 기본적으로 사용
default_enable_timetracking.description=신규 저장소가 시간기록 기능을 기본적으로 사용할 수 있습니다.
no_reply_address=가려진 이메일 도메인
no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다.
no_reply_address_helper=이메일을 가린 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자명 'joe'가 도메인'noreply.example.org'로 이메일을 가리면 Git에 'joe@noreply.example.org'로 로그인 하게 됩니다.
db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요.
require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다.
domain = 서버 도메인
@ -292,8 +326,19 @@ smtp_from_invalid = "이메일 발신인" 주소가 유효하지 않습니다
enable_captcha = 등록 시 CAPTCHA 활성화
allow_only_external_registration = 외부 서비스를 통한 등록만 허용
reinstall_error = 이미 존재하는 Forgejo 데이터베이스에 설치를 시도중임
reinstall_confirm_message = 이미 존재하는 Forgejo 데이터베이스에 재설치를 하는것은 다수의 문제의 원인이 될 수 있습니다. 대부분의 경우 이미 존재하는 "app.ini" 를 사용해 Forgejo를 구동해야합니다. 당신이 무엇을 하고있는지 명확히 알고있다면 다음 사항들을 확인하세요:
reinstall_confirm_check_1 = app.ini의 SECRET_KEY로 암호화 되어있는 데이터를 잃을 수 있습니다: 2FA/OTP를 통해 로그인 할 수 없으며 & 미러가 제대로 작동하지 않게됩니다. app.ini 파일에 정확한 SECRET_KEY가 있는것이 확실하다면 체크하세요.
reinstall_confirm_check_2 = 저장소와 설정에 재동기화가 요구될 수 있습니다. 이 박스에 체크하면 저장소의 훅과 authorized_key 들을 수동으로 재동기화해야 한다는 것을 인지한다는 것을 의미합니다. 저장소와 미러의 설정이 올바른지 확인하세요.
reinstall_confirm_check_3 = Forgejo가 올바른 app.ini 위치로 실행중이며 그것이 다시 설치할 대상이 맞다는것을 전적으로 확신합니다. 위의 위험성들을 인지하고 있음에 동의합니다.
err_admin_name_pattern_not_allowed = 관리자의 사용자명이 올바르지 않음, 사용자명이 예약된 패턴과 일치함
app_slogan = 인스턴스 슬로건
app_slogan_helper = 인스턴스의 슬로건을 입력하세요. 비워두면 비활성화됩니다.
run_user_helper = Forgejo를 구동하는 운영체제의 사용자명입니다. 이 사용자는 저장소 루트 경로에 접근권한이 있어야 합니다.
allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다.
[home]
uname_holder=사용자 이름 또는 이메일 주소
uname_holder=사용자 또는 이메일 주소
password_holder=비밀번호
switch_dashboard_context=대시보드 컨텍스트 바꾸기
my_repos=저장소
@ -337,7 +382,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨)
reset_password_mail_sent_prompt=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
active_your_account=계정 활성화
account_activated=계정이 활성화 되었습니다
prohibit_login =
prohibit_login =
resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요.
has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다.
resend_mail=여기를 눌러 확인 메일 재전송
@ -402,6 +447,8 @@ issue.action.new = <b>@%[1]s</b>님이 #%[2]d를 만들었습니다.
register_notify.text_2 = 당신의 계정에 사용자명으로 로그인 할 수 있습니다: %s
[modal]
yes=
no=아니오
@ -409,8 +456,8 @@ cancel=취소
modify=변경하기
[form]
UserName=사용자 이름
RepoName=저장소 이름
UserName=사용자
RepoName=저장소
Email=이메일 주소
Password=비밀번호
Retype=비밀번호 확인
@ -444,14 +491,14 @@ captcha_incorrect=CAPTCHA 코드가 올바르지 않습니다.
password_not_match=비밀번호가 일치하지 않습니다.
lang_select_error=목록에서 언어를 선택해주세요.
username_been_taken=이미 사용하고 있는 아이디입니다.
repo_name_been_taken=이미 사용하고 있는 저장소 이름입니다.
username_been_taken=이미 사용되는 사용자명입니다.
repo_name_been_taken=이미 사용중인 저장소명 입니다.
org_name_been_taken=이미 사용중인 조직 이름입니다.
team_name_been_taken=이미 사용중인 팀 이름입니다.
team_no_units_error=최소 하나 이상의 레포지토리 섹션에 대한 접근을 허용하십시오.
email_been_used=이미 사용 중인 이메일 주소입니다.
username_password_incorrect=사용자 이름 또는 암호가 올바르지 않습니다.
enterred_invalid_repo_name=입력한 저장소의 이름이 올바르지 않습니다.
username_password_incorrect=사용자 또는 암호가 올바르지 않습니다.
enterred_invalid_repo_name=입력한 저장소이 올바르지 않습니다.
enterred_invalid_owner_name=새로운 소유자 이름이 올바르지 않습니다.
enterred_invalid_password=입력한 비밀번호는 올바르지 않습니다.
user_not_exist=존재하지 않는 사용자입니다.
@ -467,10 +514,13 @@ target_branch_not_exist=대상 브랜치가 존재하지 않습니다.
url_error = `"%s"는 유효한 URL이 아닙니다.`
include_error = `"%s"을/를 포함해야 합니다.`
regex_pattern_error = `regex 패턴이 잘못되었습니다: %s`
username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), (".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 마침표(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
glob_pattern_error = `glob 패턴이 잘못되었습니다: %s`
username_error_no_dots = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
username_change_not_local_user = 외부 사용자들은 사용자명을 변경할 수 없습니다.
[user]
change_avatar=아바타 변경…
repositories=저장소
@ -486,6 +536,10 @@ projects = 프로젝트
watched = 주시중인 저장소
form.name_reserved = "%s" 사용자명이 예약(reserved)되었습니다.
form.name_pattern_not_allowed = "%s" 패턴이 사용자명으로 사용할 수 없습니다.
form.name_chars_not_allowed = "%s" 사용자명이 유효하지 않은 문자를 포함합니다.
[settings]
profile=프로필
account=계정
@ -503,14 +557,14 @@ account_link=연결된 계정
organization=조직
public_profile=공개 프로필
password_username_disabled=로컬 사용자가 아닌 경우 사용자 이름 변경을 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요.
password_username_disabled=로컬 사용자가 아닌 경우 사용자명을 변경 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요.
full_name=성명
website=웹 사이트
location=위치
update_theme=테마 변경
update_profile=프로필 업데이트
update_profile_success=프로필이 업데이트 되었습니다.
change_username=사용자 이름 변경 되었습니다.
change_username=사용자명이 변경 되었습니다.
continue=계속하기
cancel=취소
language=언어
@ -662,10 +716,14 @@ change_password = 비밀번호 변경
email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다.
comment_type_group_dependency = 전제조건
change_username_prompt = 참고: 사용자명의 변경은 계정의 URL을 변경시킵니다.
change_username_redirect_prompt = 과거 사용자명은 누군가 사용하기 전까지 리디렉트됩니다.
comment_type_group_time_tracking = 시간 기록
[repo]
owner=소유자
repo_name=저장소 이름
repo_name_helper=좋은 저장소 이름은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다.
repo_name=저장소
repo_name_helper=좋은 저장소은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다.
repo_size=저장소 용량
template=템플릿
template_select=템플릿을 선택합니다.
@ -763,6 +821,7 @@ file_too_large=보여주기에는 파일이 너무 큽니다.
video_not_supported_in_browser=당신의 브라우저가 HTML5의 "video" 태그를 지원하지 않습니다.
audio_not_supported_in_browser=당신의 브라우저가 HTML5의 "audio" 태그를 지원하지 않습니다.
stored_lfs=Git LFS에 저장되어 있습니다
stored_annex=Git Annex에 저장되어 있습니다
commit_graph=커밋 그래프
editor.new_file=새 파일
@ -914,7 +973,7 @@ issues.subscribe=구독하기
issues.unsubscribe=구독 취소
issues.delete=삭제
issues.tracker=타임 트래커
issues.start_tracking=타임 트래킹 시작
issues.start_tracking=시간 기록 시작
issues.start_tracking_history=`님이 %s 작업 시작`
issues.stop_tracking_history=`님이 %s 작업 중단`
issues.add_time=수동으로 시간 입력
@ -1114,7 +1173,7 @@ settings.tracker_url_format=외부 이슈 트래커 URL 형식
settings.tracker_issue_style=외부 이슈 트래커 숫자 포맷
settings.tracker_issue_style.numeric=숫자
settings.tracker_issue_style.alphanumeric=문자 숫자
settings.enable_timetracker=시간 추적 활성화
settings.enable_timetracker=시간 기록 활성화
settings.allow_only_contributors_to_track_time=기여자 트랙 타임만
settings.pulls_desc=저장소 풀 리퀘스트 활성화
settings.pulls.ignore_whitespace=공백은 충돌에서 무시하기
@ -1160,7 +1219,7 @@ settings.update_githook=Hook 갱신
settings.payload_url=대상 URL
settings.content_type=POST Content Type
settings.secret=비밀
settings.slack_username=사용자 이름
settings.slack_username=사용자
settings.slack_icon_url=아이콘 URL
settings.discord_username=사용자명
settings.discord_icon_url=아이콘 URL
@ -1301,7 +1360,7 @@ settings.trust_model.committer.desc = 유효한 서명이 커미터와 일치할
visibility_helper = 저장소 비공개로 만들기
projects.description = 설명 (선택)
settings.external_tracker_url_desc = 방문자들이 이슈 탭을 클릭하면 외부 이슈 트레커 URL로 연결됩니다.
settings.tracker_url_format_desc = <code>{user}</code>, <code>{repo}</code> and <code>{index}</code>를 사용자 이름, 저장소 이름, 이슈 번호로 사용할 수 있습니다.
settings.tracker_url_format_desc = <code>{user}</code>를 사용자명, <code>{repo}</code>를 저장소명, <code>{index}</code>를 이슈 번호로 사용할 수 있습니다.
projects = 프로젝트
projects.desc = 이슈와 풀 리퀘스트를 프로젝트에서 관리합니다.
projects.create = 프로젝트 만들기
@ -1366,11 +1425,22 @@ pulls.merged_title_desc_one = 님이 <code>%[2]s</code> 에서 <code>%[3]s</code
mirror_password_help = 사용자명을 변경해 저장된 비밀번호를 지우세요.
adopt_search = 사용자명을 입력해 소유자가 누락된 저장소를 검색... (모두 찾으려면 비워두기)
form.name_reserved = "%s" 저장소명이 예약되어 있습니다.
form.name_pattern_not_allowed = "%s" 패턴이 저장소명으로 사용할 수 없습니다.
issues.start_tracking_short = 타이머 시작
issues.tracking_already_started = `당신은 이미 <a href="%s">다른 이슈</a>에서 시간을 기록중입니다!`
issues.stop_tracking = 타이머 정지
issues.cancel_tracking_history = `취소된 시간 기록 %s`
settings.enter_repo_name = 표시된 소유자와 저장소명을 정확하게 입력하세요:
settings.packagist_username = Packagist 사용자명
[graphs]
[org]
org_name_holder=조직 이름
org_full_name_holder=조직 전체 이름
org_full_name_holder=조직 별명
create_org=새로운 조직
repo_updated=업데이트됨 %s
members=멤버
@ -1407,7 +1477,7 @@ members.public=보임
members.public_helper=숨기기
members.private=숨김
members.private_helper=보이기
members.member_role=회원 역할:
members.member_role=멤버 역할:
members.owner=소유자
members.member=멤버
members.remove=제거
@ -1432,6 +1502,8 @@ teams.search_repo_placeholder=저장소 찾기...
teams.add_duplicate_users=사용자가 이미 팀 멤버입니다.
teams.members.none=이 팀에 멤버가 없습니다.
form.name_pattern_not_allowed = "%s" 패턴이 조직명으로 사용할 수 없습니다.
[admin]
dashboard=대시보드
users=사용자 계정
@ -1631,9 +1703,9 @@ config.db_path=경로
config.service_config=서비스 설정
config.register_email_confirm=가입시 이메일 확인 필수
config.disable_register=자체등록 사용안함
config.disable_register=사용자 등록 거부
config.allow_only_external_registration=외부 서비스를 통해서만 등록 허용
config.enable_openid_signup=OpenID 자체등록 활성화
config.enable_openid_signup=OpenID 등록 활성화
config.enable_openid_signin=OpenID 로그인 활성화
config.show_registration_button=등록 버튼을 표시
config.require_sign_in_view=페이지를 보려면 로그인 필수
@ -1642,8 +1714,8 @@ config.enable_captcha=CAPTCHA 활성화
config.active_code_lives=코드 만료 기한
config.default_keep_email_private=기본적으로 이메일 주소를 숨김
config.default_allow_create_organization=기본적으로 조직 생성을 허용
config.enable_timetracking=타임 트래킹 활성화
config.default_enable_timetracking=기본 타임 트래킹 활성화
config.enable_timetracking=시간 기록 활성화
config.default_enable_timetracking=기본으로 시간 기록을 활성화
config.default_allow_only_contributors_to_track_time=기여자 트랙 타임만
config.no_reply_address=가려진 이메일 도메인
config.default_enable_dependencies=기본적으로 이슈 종속성을 활성화
@ -1731,6 +1803,13 @@ users.allow_git_hook_tooltip = Git 훅은 Forgejo가 실행중인 OS 유저로
emails.primary = 대표
emails.filter_sort.name = 사용자명
emails.filter_sort.name_reverse = 사용자명 (예약됨)
auths.attribute_username_placeholder = 비워두면 Forgejo에 입력된 사용자명을 사용합니다.
auths.sspi_strip_domain_names = 사용자명들에서 도메인명을 제거함
auths.tip.yandex = %s에 새 애플리케이션을 만듭니다. "Yandex.Passport API"부분의 "Access to email address", "Access to user avatar", "Access to username, first name and surname, gender" 권한을 활성화 하세요.
config.allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다.
[action]
create_repo=저장소를 만들었습니다. <a href="%s">%s</a>
rename_repo=저장소 이름을 <code>%[1]s에서</code>에서 <a href="%[2]s"> %[3]s</a>으로 변경함
@ -1838,4 +1917,11 @@ package_kind = 패키지 검색...
project_kind = 프로젝트 검색...
exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함
issue_kind = 이슈 검색...
pull_kind = 풀 검색...
pull_kind = 풀 검색...
fuzzy = 모호함
union = 통합 검색
union_tooltip = 공백으로 구분된 키워드 중 하나라도 일치하는 결과를 포함하세요
exact = 정확한
regexp = 정규 표현식
regexp_tooltip = 검색어를 정규 표현식으로 해석합니다
milestone_kind = 마일스톤 검색...

File diff suppressed because it is too large Load diff

View file

@ -124,12 +124,27 @@ sign_up = Opprett konto
confirm_delete_artifact = Er du sikker på at du vil slette artefakten "%s" ?
webauthn_sign_in = Trykk på knappen på sikkerhetsnøkkelen din. Dersom nøkkelen din ikke har en knapp, sett den inn på nytt.
webauthn_error_unable_to_process = Tjeneren kunne ikke behandle forespørselen din.
webauthn_error_empty = Du må gi nøkkelen et navn.
copy_path = Kopier sti
[search]
search = Søk...
type_tooltip = Søketype
fuzzy = Fuzzy
union = Union
exact = Nøyaktig
regexp = RegExp
[auth]
verify = Bekreft
sign_up_button = Opprett konto nå.
sign_up_button = Opprett konto nå.
change_unconfirmed_email_error = Kan ikke endre e-postadresse: %v
login_userpass = Logg inn
oauth_signup_tab = Registrer ny konto
oauth_signup_title = Fullfør ny konto
oauth_signup_submit = Fullfør konto
[home]
uname_holder = Brukernavn eller e-postadresse

View file

@ -833,7 +833,7 @@ confirm_delete_account = Lösken utwiesen
email_notifications.disable = Nich över E-Mail benarichtigen
visibility.public_tooltip = Elkeen kann t sehen
password_username_disabled = Frömde Brukers könen hör Brukernaam nich ännern. Bidde kuntakteer dienen Sied-Chef för mehr Informatioonen.
profile_desc = Richt in, wo dien Profil to anner Brukers wiest word. Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un Git-Aktioonen över t Internett bruukt.
profile_desc = Över di
hidden_comment_types_description = Kommentaar-Arden, wat hier utköört sünd, worden in Gefall-Sieden nich wiest. Wenn du ton Bispööl »Vermark« utköörst, worden all de »Bruker hett Vermark hentoföögt/wegdaan«-Kommentaren wegdaan.
email_desc = Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un, wenn se nich verburgen is, Git-Aktioonen över t Internett bruukt.
can_not_add_email_activations_pending = Een Aktiveren staht noch ut. Wenn du eene neje E-Mail-Adress hentofögen willst, versöök dat in een paar Menüten noch eenmaal.
@ -841,7 +841,7 @@ email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut
principal_desc = Deese SSH-Zertifikaat-Höövdmannen sünd mit dienem Konto verbunnen un geven kumpleten Togriep up diene Repositoriums.
add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. Um diene E-Mail-Adress uttowiesen, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s.
ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen.
keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verbargen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert.
keep_email_private_popup = Diene E-Mail-Adress word vun dienem Profil verbargen un is nich de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens, Bewarkens un Tosamenföhrens-Kommitterens. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Deese Instellen ännert keene bestahn Kommitterens.
ssh_helper = <strong>Bruukst du Hülp?</strong> Kiek de Inföhren an, wo du <a href="%s">diene eegenen SSH-Slötels maakst</a> of hülp <a href="%s">gewohnten Probleemen</a> of, över wat man mit SSH mennigmaal strukelt.
access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig <a href="%[1]s" target="_blank">API</a>-Padden. Lees de <a href="%[2]s" target="_blank">Dokumenteren</a> för mehr Informatioonen.
oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens.
@ -851,6 +851,8 @@ oauth2_application_locked = Forgejo vermarkt vörweg eenige OAuth2-Programmen bi
twofa_desc = Um dien Konto tegen Passwoordklau to schütten, kannst du een Smart-Telefoon of anner Geraadskupp bruken, um tied-baseerte Eenmaalpasswoorden (»TOTP«) to kriegen.
twofa_recovery_tip = Wenn du dien Geraadskupp verlüst, kannst du eenen Eenmaal-Bruuk-Torügghalens-Slötel bruken, um weer in dien Konto to komen.
webauthn_desc = Sekerheids-Slötels sünd Geraadskuppen, wat kryptographisk Slötels enthollen. Se könen för dat Anmellen mit Twee Faktooren bruukt worden. Sekerheids-Slötels mutten de »<a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>«-Standard unnerstütten.
user_block_yourself = Du kannst di nich sülvst blockeren.
pronouns_custom_label = Eegene Pronomens
[repo]
rss.must_be_on_branch = Du muttst up eenem Twieg wesen, um eenen RSS-Schuuv to hebben.
@ -914,7 +916,7 @@ mirror_interval = Tiedofstand för t Spegeln (gültige Tied-Eenheiden sünd
issue_labels = Vermarkens
issue_labels_helper = Köör eene Vermarkens-Sammlung ut
license = Lizenz
auto_init = Repositorium inrichten (Föögt .gitignore, Lizenz un LEESMI hento)
auto_init = Repositorium inrichten
mirror_sync_on_commit = Spegeln, wenn Kommitterens schuuvt worden
repo_gitignore_helper_desc = Köör ut eener List vun Vörlagen för bekannte Spraken ut, welke Dateien nich verfolgt worden. Normaale Objekten, wat vun de Bauwarktüüg vun elkeen Spraak utgeven worden, sünd in deeser .gitignore dann al enthollen.
default_branch = Höövd-Twieg
@ -2548,6 +2550,21 @@ diff.git-notes.remove-body = Deeses Anmarken word wegdaan.
issues.num_reviews_one = %d Nakieken
issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s
issues.num_reviews_few = %d Nakiekens
settings.default_update_style_desc = Normaale Vernejens-Aard, wat bruukt word, um Haalvörslagens to vernejen, wat achter de Grund-Twieg torügg sünd.
pulls.sign_in_require = <a href="%s">Mell di an</a>, um eenen nejen Haalvörslag to maken.
new_from_template = Bruuk eene Vörlaag
new_advanced = Mehr Instellens
new_advanced_expand = Klick, um mehr to wiesen
auto_init_description = Begünn de Git-Histoorje mit eenem LEESMI un föög, wenn du willst, Lizenz- un .gitignore-Dateien hento.
new_from_template_description = Du kannst eene bestahn Repositoriums-Vörlaag up deeser Instanz utkören un hör Instellens anwennen.
summary_card_alt = Tosamenfatens-Kaart vun de Repositorium %s
issues.reaction.alt_add = De %[1]s-Reageren to de Kommentaar hentofögen.
issues.reaction.add = Reageren hentofögen
issues.reaction.alt_few = %[1]s hett mit %[2]s reageert.
issues.reaction.alt_many = %[1]s un %[2]d anner hebben mit %[3]s reageert.
issues.reaction.alt_remove = De %[1]s-Reageren vun de Kommentaar wegdoon.
issues.context.menu = Kommentaar-Menü
release.summary_card_alt = Tosamenfatens-Kaart vun eenem Publizeren mit de Naam »%s« im Repositorium %s
[repo.permissions]
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.

View file

@ -555,7 +555,7 @@ team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel t
admin.new_user.text = <a href="%s">Klik hier</a> om deze gebruiker te beheren vanuit het beheerderspaneel.
password_change.subject = Uw wachtwoord is gewijzigd
password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd.
reset_password.text_1 =
reset_password.text_1 =
totp_disabled.subject = TOTP is uitgeschakeld
primary_mail_change.subject = Uw primaire e-mail is gewijzigd
totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA.
@ -800,7 +800,7 @@ emails=E-mailadressen
manage_emails=E-mailadressen beheren
manage_themes=Standaardthema
manage_openid=OpenID-adressen
theme_desc=Dit zal het standaardthema worden op de gehele site.
theme_desc=Dit thema wordt gebruikt voor de webinterface wanneer je bent aangemeld.
primary=Primair
activated=Geactiveerd
requires_activation=Vereist activering
@ -987,7 +987,7 @@ visibility.private=Privé
blocked_users = Geblokkeerde gebruikers
uid = UID
biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund)
profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties.
profile_desc = Over u
update_language_not_found = Taal "%s" is niet beschikbaar.
change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen.
change_username_redirect_prompt = De oude gebruikersnaam zal worden doorverwezen totdat iemand deze opeist.
@ -1020,7 +1020,7 @@ at_least_one_permission = Je moet minstens één machtiging kiezen om een token
permission_write = Lees en schrijf
oauth2_client_secret_hint = Dit geheim zal niet meer worden getoond nadat u deze pagina heeft verlaten of vernieuwd. Zorg ervoor dat u het heeft opgeslagen.
revoke_oauth2_grant_success = Toegang succesvol ingetrokken.
keep_email_private_popup = Dit zal je e-mailadres verbergen van uw profielpagina. Het zal niet langer de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads en bewerkingen, en het zal niet gebruikt worden voor samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits met je account te associëren. Merk op dat het veranderen van deze optie geen effect heeft op bestaande commits.
keep_email_private_popup = Uw e-mailadres zal niet getoond worden op uw profiel en zal niet de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads, bewerkingen en samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits aan uw account te koppelen. Deze optie zal bestaande commits niet beïnvloeden.
create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gecreëerd.
permissions_access_all = Alle (publiek, privé en gelimiteerd)
oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan?
@ -1056,6 +1056,9 @@ language.title = Standaard taal
keep_activity_private.description = Uw <a href="%s">publieke activiteit</a> zal alleen zichtbaar zijn voor u en de beheerders van de instantie.
language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld.
language.localization_project = Help ons Forgejo in uw taal te vertalen! <a href="%s">Leer meer</a>.
user_block_yourself = U kunt niet zichzelf blokkeren.
pronouns_custom_label = Aangepaste voornaamwoorden
[repo]
owner=Eigenaar
@ -1093,11 +1096,11 @@ issue_labels=Labels
issue_labels_helper=Selecteer een labelset
license=Licentie
license_helper=Selecteer een licentie bestand
license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie <a target="_blank" rel="noopener noreferrer" href="%s">Kies een licentie.</a>
license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie <a target="_blank" rel="noopener noreferrer" href="%s">Kies een licentie</a>.
readme=README
readme_helper=Selecteer een README-bestandssjabloon
readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven.
auto_init=Initialiseer repository (voegt .gitignore, License en README toe)
auto_init=Initialiseer repository
trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn:
trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker
trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers
@ -1280,6 +1283,7 @@ view_git_blame=Bekijk git blame
video_not_supported_in_browser=Uw browser ondersteunt de HTML5 "video" element niet.
audio_not_supported_in_browser=Uw browser ondersteunt de HTML5 "audio" element niet.
stored_lfs=Opgeslagen met Git LFS
stored_annex=Opgeslagen met Git Annex
symbolic_link=Symbolische link
commit_graph=Commit grafiek
commit_graph.select=Selecteer branches
@ -1298,6 +1302,7 @@ editor.upload_file=Upload bestand
editor.edit_file=Bewerk bestand
editor.preview_changes=Voorbeeld tonen
editor.cannot_edit_lfs_files=LFS-bestanden kunnen niet worden bewerkt in de webinterface.
editor.cannot_edit_annex_files=Annex-bestanden kunnen niet worden bewerkt in de webinterface.
editor.cannot_edit_non_text_files=Binaire bestanden kunnen niet worden bewerkt in de webinterface.
editor.edit_this_file=Bewerk bestand
editor.this_file_locked=Bestand is vergrendeld
@ -2194,8 +2199,8 @@ settings.archive.header=Archiveer deze repo
settings.archive.success=De repo is succesvol gearchiveerd.
settings.archive.error=Er is een fout opgetreden tijdens het archiveren van de repo. Zie het logboek voor meer informatie.
settings.archive.error_ismirror=U kunt geen gespiegelde repository archiveren.
settings.archive.branchsettings_unavailable=Branch instellingen zijn niet beschikbaar als de repo is gearchiveerd.
settings.archive.tagsettings_unavailable=Labelinstellingen zijn niet beschikbaar als de repo is gearchiveerd.
settings.archive.branchsettings_unavailable=Branchinstellingen zijn niet beschikbaar in gearchiveerde repo's.
settings.archive.tagsettings_unavailable=Tag-instellingen zijn niet beschikbaar in gearchiveerde repo's.
settings.update_avatar_success=De repository avatar is bijgewerkt.
settings.lfs=LFS
settings.lfs_filelist=LFS bestanden opgeslagen in deze repository
@ -2408,7 +2413,7 @@ issues.review.option.hide_outdated_comments = Verouderde reacties verbergen
pulls.expand_files = Alle bestanden uitklappen
pulls.collapse_files = Alle bestanden inklappen
pulls.show_all_commits = Alle commits weergeven
new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? <a href="%s">Repository migreren.</a>
new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? <a href="%s">Repository migreren</a>.
editor.fail_to_update_file = Mislukt bij het bijwerken/creëren van bestand "%s".
editor.file_is_a_symlink = `"%s" is een symbolische link. Symbolische links kunnen niet worden bewerkt in de webeditor`
editor.filename_is_a_directory = Bestandsnaam "%s" wordt al gebruikt als naam van een map in deze repository.
@ -2610,7 +2615,7 @@ settings.remove_protected_branch_success = Branchbescherming voor regel "%s" is
settings.remove_protected_branch_failed = Verwijderen van branchbeschermings regel "%s" is mislukt.
settings.merge_style_desc = Samenvoegstijl
settings.thread_id = Thread ID
settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd.
settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar in gearchiveerde repo's.
settings.unarchive.header = Deze repo uit het archief halen
settings.unarchive.text = Het uit het archief halen van de repo zal het vermogen herstellen om commits en pushes te ontvangen, evenals nieuwe issues en pull requests.
settings.unarchive.error = Er is een fout opgetreden bij het uit het archief halen van de repo. Bekijk de logs voor meer details.
@ -2846,9 +2851,25 @@ diff.git-notes.remove-body = Deze notitie zal worden verwijderd.
issues.summary_card_alt = Overzichtskaart van een issue met de titel "%s" in repository %s
issues.num_reviews_one = %d beoordeling
issues.num_reviews_few = %d beoordelingen
settings.default_update_style_desc = Standaard update stijl gebruikt voor het updaten van pull requests die achter de basis branch liggen.
pulls.sign_in_require = <a href="%s">Aanmelden</a> om een nieuwe pull request aan te maken.
new_advanced = Geavanceerde instellingen
new_advanced_expand = Klik om uit te breiden
new_from_template_description = Je kunt een bestaand repositorysjabloon op deze instantie selecteren en de instellingen toepassen.
new_from_template = Een sjabloon gebruiken
auto_init_description = De Git geschiedenis starten met een README en optioneel License en .gitignore bestanden toevoegen.
summary_card_alt = Overzichtskaart van repository %s
issues.reaction.add = Reactie toevoegen
issues.reaction.alt_few = %[1]s reageerde %[2]s.
issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s.
issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht.
issues.reaction.alt_add = Voeg %[1]s reactie toe aan commentaar.
issues.context.menu = Commentaar menu
release.summary_card_alt = Samenvattende kaart van een release met de titel "%s" in repository %s
[graphs]
component_loading_info = Dit kan even duren…
component_failed_to_load = Er is een onverwachte fout opgetreden.
@ -3666,16 +3687,16 @@ cargo.install = Voer de volgende opdracht uit om het pakket met Cargo te install
chef.install = Voer het volgende commando uit om het pakket te installeren:
composer.registry = Stel dit register in je <code>~/.composer/config.json</code> bestand:
composer.dependencies = Afhankelijkheden
composer.dependencies.development = Ontwikkelings Afhankelijkheden
composer.dependencies.development = Ontwikkelings afhankelijkheden
conan.registry = Stel dit register in vanaf de terminal:
conan.install = Voer het volgende commando uit om het pakket met Conan te installeren:
conda.registry = Stel dit register in als een Conda repository in je <code>.condarc</code> bestand:
container.details.type = Afbeelding Type
container.details.type = Afbeelding type
container.details.platform = Platform
container.pull = Haal de afbeelding op vanaf de terminal:
container.digest = Digest
container.multi_arch = Besturingssysteem / Arch
container.layers = Afbeelding Lagen
container.layers = Afbeelding lagen
container.labels = Labels
container.labels.key = Sleutel
debian.repository = Repository informatie
@ -3697,7 +3718,7 @@ rpm.repository.architectures = Architecturen
rpm.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen.
rubygems.install = Voer het volgende commando uit om het pakket met gem te installeren:
rubygems.install2 = of voeg het toe aan het Gemfile:
rubygems.dependencies.development = Ontwikkelings Dependencies
rubygems.dependencies.development = Ontwikkelings dependencies
swift.registry = Stel dit register in vanaf de terminal:
swift.install = Voeg het pakket toe in je <code>Package.swift</code> bestand:
swift.install2 = en voer het volgende commando uit:
@ -3715,7 +3736,7 @@ nuget.install = Voer het volgende commando uit om het pakket met NuGet te instal
npm.install = Voer het volgende commando uit om het pakket met npm te installeren:
npm.install2 = of voeg het toe aan het package.json bestand:
npm.dependencies = Afhankelijkheden
npm.dependencies.development = Ontwikkelings Afhankelijkheden
npm.dependencies.development = Ontwikkelings afhankelijkheden
npm.dependencies.peer = Peer afhankelijkheden
npm.dependencies.optional = Optionele afhankelijkheden
owner.settings.cargo.title = Cargo register index
@ -3737,7 +3758,7 @@ owner.settings.cleanuprules.keep.count = Bewaar de meest recente
owner.settings.cleanuprules.keep.count.1 = 1 versie per pakket
owner.settings.cleanuprules.keep.count.n = %d versies per pakket
pub.install = Voer het volgende commando uit om het pakket met Dart te installeren:
rubygems.dependencies.runtime = Runtime Dependencies
rubygems.dependencies.runtime = Runtime dependencies
settings.delete.error = Het verwijderen van het pakket is mislukt.
alpine.registry = Stel dit register in door de url toe te voegen aan je <code>/etc/apk/repositories</code> bestand:
maven.registry = Stel dit register in het <code>pom.xml</code> bestand van je project:

View file

@ -167,6 +167,8 @@ new_migrate.link = Nowa migracja
new_org.link = Nowa organizacja
filter.not_fork = Nie forki
copy_path = Skopiuj ścieżkę
[aria]
navbar = Pasek nawigacji
footer = Stopka
@ -254,7 +256,7 @@ err_empty_db_path=Ścieżka do bazy danych SQLite3 nie może być pusta.
no_admin_and_disable_registration=Nie możesz wyłączyć możliwości samodzielnej rejestracji kont użytkowników bez stworzenia konta administratora.
err_empty_admin_password=Hasło administratora nie może być puste.
err_empty_admin_email=Pole adresu e-mail administratora nie może być puste.
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zastrzeżony
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zarezerwowany
err_admin_name_pattern_not_allowed=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim zawiera zastrzeżone znaki
err_admin_name_is_invalid=Nazwa użytkownika administratora jest nieprawidłowa
@ -478,6 +480,8 @@ hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a>
sign_up_button = Zarejestruj się.
use_onetime_code = Użyj kodu jednorazowego
unauthorized_credentials = Dane uwierzytelniające są nieprawidłowe lub wygasły. Spróbuj ponownie wykonać polecenie lub zobacz %s, aby uzyskać więcej informacji
[mail]
view_it_on=Zobacz na %s
link_not_working_do_paste=Czy link nie działa? Spróbuj skopiować i wkleić go do paska adresu URL przeglądarki.
@ -1144,6 +1148,7 @@ file_copy_permalink=Kopiuj bezpośredni odnośnik
video_not_supported_in_browser=Twoja przeglądarka nie obsługuje znacznika HTML5 "video".
audio_not_supported_in_browser=Twoja przeglądarka nie obsługuje znacznika HTML5 "audio".
stored_lfs=Przechowane za pomocą Git LFS
stored_annex=Przechowane za pomocą Git Annex
symbolic_link=Dowiązanie symboliczne
commit_graph=Wykres commitów
commit_graph.select=Wybierz gałęzie
@ -1161,6 +1166,7 @@ editor.upload_file=Wyślij plik
editor.edit_file=Edytuj plik
editor.preview_changes=Podgląd zmian
editor.cannot_edit_lfs_files=Pliki LFS nie mogą być edytowane poprzez interfejs przeglądarkowy.
editor.cannot_edit_annex_files=Pliki Annex nie mogą być edytowane poprzez interfejs przeglądarkowy.
editor.cannot_edit_non_text_files=Pliki binarne nie mogą być edytowane poprzez interfejs przeglądarkowy.
editor.edit_this_file=Edytuj plik
editor.this_file_locked=Plik jest zablokowany

View file

@ -748,7 +748,7 @@ webauthn=Chaves de segurança
public_profile=Perfil público
biography_placeholder=Conte um pouco sobre você! (Markdown é suportado)
location_placeholder=Compartilhe sua localização aproximada com outras pessoas
profile_desc=Controle como o seu perfil é exibido para outros usuários. Seu endereço de e-mail principal será usado para notificações, recuperação de senha e operações do Git baseadas na Web.
profile_desc=Sobre você
password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do site para mais informações.
full_name=Nome completo
website=Site
@ -813,7 +813,7 @@ manage_emails=Gerenciar endereços de e-mail
manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web.
theme_desc=Este será o seu tema padrão em todo o site.
theme_desc=Este tema será usado para a interface web quando você fizer login.
primary=Principal
activated=Ativado
requires_activation=Requer ativação
@ -839,7 +839,7 @@ add_email_success=O novo endereço de e-mail foi adicionado.
email_preference_set_success=Preferência de e-mail definida com sucesso.
add_openid_success=O novo endereço de OpenID foi adicionado.
keep_email_private=Ocultar endereço de e-mail
keep_email_private_popup=Isso ocultará seu endereço de e-mail do seu perfil. Ele não será mais o padrão para commits feitos pela interface web, como envios de arquivos e modificações, e não será usado para commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Note que modificar esta opção não irá afetar commits já existentes.
keep_email_private_popup=Seu endereço de email não será exibido no seu perfil e não será o padrão para commits feitos pela interface web, como envios de arquivos, modificações e commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Esta opção não irá afetar commits já existentes.
openid_desc=OpenID permite delegar autenticação para um provedor externo.
manage_ssh_keys=Gerenciar chaves SSH
@ -1055,6 +1055,9 @@ update_hints_success = As dicas foram atualizadas.
keep_activity_private.description = A sua <a href="%s">atividade pública</a> estará visível apenas para si e para os administradores do servidor.
language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! <a href="%s">Mais informações</a>.
language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão.
user_block_yourself = Você não pode se bloquear.
pronouns_custom_label = Pronomes personalizados
[repo]
owner=Proprietário
@ -1094,11 +1097,11 @@ issue_labels=Etiquetas
issue_labels_helper=Selecione um conjunto de etiquetas
license=Licença
license_helper=Selecione um arquivo de licença
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença.</a>
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença</a>.
readme=LEIA-ME
readme_helper=Selecione um modelo de arquivo README
readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto.
auto_init=Inicializar o repositório (Adiciona arquivos .gitignore, licença e README)
auto_init=Inicializar repositório
trust_model_helper=Selecione o modelo de confiança para verificação de assinatura. As opções possíveis são:
trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaboradores
trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers
@ -1305,6 +1308,7 @@ view_git_blame=Ver git blame
video_not_supported_in_browser=Seu navegador não tem suporte para a tag "video" do HTML5.
audio_not_supported_in_browser=Seu navegador não tem suporte para a tag "audio" do HTML5.
stored_lfs=Armazenado com Git LFS
stored_annex=Armazenado com Git Annex
symbolic_link=Link simbólico
executable_file=Arquivo executável
commit_graph=Gráfico de commits
@ -1328,6 +1332,7 @@ editor.upload_file=Enviar arquivo
editor.edit_file=Editar arquivo
editor.preview_changes=Pré-visualizar alterações
editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web.
editor.cannot_edit_annex_files=Arquivos Annex não podem ser editados na interface web.
editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web.
editor.edit_this_file=Editar arquivo
editor.this_file_locked=Arquivo está bloqueado
@ -2440,8 +2445,8 @@ settings.archive.header=Arquivar este repositório
settings.archive.success=O repositório foi arquivado com sucesso.
settings.archive.error=Um erro ocorreu enquanto estava sendo arquivado o repositório. Veja o log para mais detalhes.
settings.archive.error_ismirror=Você não pode arquivar um repositório espelhado.
settings.archive.branchsettings_unavailable=Configurações do branch não estão disponíveis quando o repositório está arquivado.
settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado.
settings.archive.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados.
settings.archive.tagsettings_unavailable=Configurações de tag não estão disponíveis em repositórios arquivados.
settings.update_avatar_success=O avatar do repositório foi atualizado.
settings.lfs=LFS
settings.lfs_filelist=Arquivos LFS armazenados neste repositório
@ -2641,7 +2646,7 @@ settings.unarchive.success = O repositório foi desarquivado.
settings.unarchive.button = Desarquivar repositório
settings.unarchive.header = Desarquivar este repositório
diff.comment.add_line_comment = Adicionar comentário na linha
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>.
blame.ignore_revs.failed = Falha ao ignorar as revisões em <a href="%s">.git-blame-ignore-revs</a>.
migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
commits.browse_further = Ver mais
@ -2726,7 +2731,7 @@ comments.edit.already_changed = Falha ao salvar as alterações ao comentário.
activity.navbar.code_frequency = Frequência de código
settings.protect_status_check_matched = Correspondente
branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório.
settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado.
settings.archive.mirrors_unavailable = Réplicas não estão disponíveis em repositórios arquivados.
release.download_count_one = %s download
settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento.
settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte:
@ -2847,6 +2852,22 @@ diff.git-notes.remove-body = Esta anotação será removida.
issues.num_reviews_one = %d revisão
issues.summary_card_alt = Cartão de resumo de um issue com o título "%s" no repositório %s
issues.num_reviews_few = %d revisões
settings.default_update_style_desc = Estilo padrão de atualização usado para atualizar pull requests que estão atrasados em relação ao branch base.
pulls.sign_in_require = <a href="%s">Entre</a> para criar um novo pull request.
new_from_template = Use um modelo
new_from_template_description = Você pode selecionar um modelo de repositório nesta instância e aplicar suas configurações.
new_advanced = Configurações avançadas
new_advanced_expand = Clique para expandir
auto_init_description = Inicializar o histórico do Git com um README e opcionalmente adicionar arquivos License e .gitignore.
summary_card_alt = Cartão de resumo do repositório %s
issues.reaction.add = Adicionar reação
issues.reaction.alt_few = %[1]s reagiu com %[2]s.
issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
issues.context.menu = Menu de comentário
release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s
[graphs]
component_loading = Carregando %s...
@ -3675,18 +3696,18 @@ chef.install=Para instalar o pacote, execute o seguinte comando:
composer.registry=Configure este registro em seu arquivo <code>~/.composer/config.json</code>:
composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
composer.dependencies=Dependências
composer.dependencies.development=Dependências de Desenvolvimento
composer.dependencies.development=Dependências de desenvolvimento
conan.details.repository=Repositório
conan.registry=Configure este registro pela linha de comando:
conan.install=Para instalar o pacote usando o Conan, execute o seguinte comando:
conda.registry=Configure este registro como um repositório Conda no arquivo <code>.condarc</code>:
conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
container.details.type=Tipo de Imagem
container.details.type=Tipo de imagem
container.details.platform=Plataforma
container.pull=Puxe a imagem pela linha de comando:
container.digest=Digest
container.multi_arch=S.O. / Arquitetura
container.layers=Camadas da Imagem
container.layers=Camadas da imagem
container.labels=Rótulos
container.labels.key=Chave
container.labels.value=Valor
@ -3714,9 +3735,9 @@ npm.registry=Configure este registro no arquivo <code>.npmrc</code> do seu proje
npm.install=Para instalar o pacote usando o npm, execute o seguinte comando:
npm.install2=ou adicione-o ao arquivo package.json:
npm.dependencies=Dependências
npm.dependencies.development=Dependências de Desenvolvimento
npm.dependencies.peer=Dependências Peer
npm.dependencies.optional=Dependências Opcionais
npm.dependencies.development=Dependências de desenvolvimento
npm.dependencies.peer=Dependências peer
npm.dependencies.optional=Dependências opcionais
npm.details.tag=Tag
pub.install=Para instalar o pacote usando Dart, execute o seguinte comando:
pypi.requires=Requer Python
@ -3729,8 +3750,8 @@ rpm.repository = Informações do repositório
rpm.repository.architectures = Arquiteturas
rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao Gemfile:
rubygems.dependencies.runtime=Dependências de Execução
rubygems.dependencies.development=Dependências de Desenvolvimento
rubygems.dependencies.runtime=Dependências de tempo de execução
rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer o Ruby versão
rubygems.required.rubygems=Requer o RubyGem versão
swift.registry=Configure este registro pela linha de comando:
@ -3777,11 +3798,11 @@ owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída.
owner.settings.chef.title=Registro Chef
owner.settings.chef.keypair=Gerar par de chaves
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos.
npm.dependencies.bundle = Dependências empacotadas
npm.dependencies.bundle = Dependências em bundle
registry.documentation = Para mais informações sobre o registro %s, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
arch.version.replaces = Substitui
arch.version.conflicts = Conflitos
arch.version.properties = Propriedades de Versão
arch.version.properties = Propriedades da versão
arch.version.description = Descrição
arch.version.groups = Grupo
arch.version.provides = Fornece

View file

@ -142,7 +142,7 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados?
name=Nome
value=Valor
filter.is_fork = Derivações
filter.is_fork = Derivado
filter.is_mirror = Réplicas
filter.is_template = Modelos
filter.public = Público
@ -156,7 +156,7 @@ filter.clear = Retirar filtros
filter.is_archived = Arquivado
filter.not_template = Não modelos
toggle_menu = Comutar menu
filter = Filtro
filter = Filtrar
copy_generic = Copiar para a área de transferência
test = Teste
error413 = Você esgotou a sua quota.
@ -166,6 +166,7 @@ new_org.title = Nova organização
new_repo.link = Novo repositório
new_migrate.link = Nova migração
new_org.link = Nova organização
copy_path = Copiar caminho
[aria]
navbar=Barra de navegação
@ -212,7 +213,7 @@ string.desc=Z - A
[error]
occurred=Ocorreu um erro
report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no <a href="%s">GitHub</a> ou abra uma nova questão, se necessário.
report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no <a href="%s" target="_blank">Codeberg</a> ou abra uma nova questão, se necessário.
missing_csrf=Pedido inválido: não há código CSRF
invalid_csrf=Pedido inválido: código CSRF inválido
not_found=Não foi possível encontrar o destino.
@ -747,7 +748,7 @@ webauthn=Autenticação em dois passos (chaves de segurança)
public_profile=Perfil público
biography_placeholder=Diga aos outros um pouco sobre si! (Markdown é suportado)
location_placeholder=Partilhe a sua localização aproximada com outros
profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web.
profile_desc=Sobre si
password_username_disabled=Utilizadores não-locais não podem mudar os seus nomes de utilizador. Entre em contacto com o administrador do sítio saber para mais detalhes.
full_name=Nome completo
website=Sítio web
@ -812,7 +813,7 @@ manage_emails=Gerir endereços de email
manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=O seu endereço de email principal irá ser usado para notificações, recuperação de senha e, desde que não esteja oculto, operações Git baseados na web.
theme_desc=Este será o seu tema padrão em todo o sítio.
theme_desc=Este tema será usado para a interface web quando tiver sessão iniciada.
primary=Principal
activated=Em uso
requires_activation=Tem que ser habilitado
@ -838,7 +839,7 @@ add_email_success=O novo endereço de email foi adicionado.
email_preference_set_success=As preferências relativas ao email foram definidas com sucesso.
add_openid_success=O novo endereço OpenID foi adicionado.
keep_email_private=Ocultar endereço de email
keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil. Não será mais o predefinido nos cometimentos feitos através da interface web, tais como carregamentos de ficheiros e edições, e não será usado para cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para associar cometimentos à sua conta. Note que mudar esta opção não irá alterar os cometimentos existentes.
keep_email_private_popup=O seu endereço de e-mail não será mostrado no seu perfil e não será o predefinido para cometimentos feitos através da interface web, tais como upload de arquivos, edições e cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para vincular cometimentos à sua conta. Esta opção não irá alterar os cometimentos existentes.
openid_desc=O OpenID permite delegar a autenticação num fornecedor externo.
manage_ssh_keys=Gerir chaves SSH
@ -1055,6 +1056,8 @@ keep_activity_private.description = O seu <a href="%s">trabalho público</a> ape
language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão.
language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! <a href="%s">Saiba mais</a>.
pronouns_custom_label = Pronomes personalizados
[repo]
new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? <a href="%s">Migre o repositório</a>.
owner=Proprietário(a)
@ -1096,13 +1099,13 @@ issue_labels=Rótulos
issue_labels_helper=Escolha um conjunto de rótulos
license=Licença
license_helper=Escolha um ficheiro de licença
license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença.</a>
license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença</a>.
object_format=Formato dos elementos
object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível.
readme=README
readme_helper=Escolha um modelo de ficheiro README
readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho.
auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`)
auto_init=Inicializar repositório
trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são:
trust_model_helper_collaborator=Colaborador: Confiar nas assinaturas dos colaboradores
trust_model_helper_committer=Autor do cometimento: Confiar nas assinaturas que correspondem a autores de cometimentos
@ -1316,6 +1319,7 @@ view_git_blame=Ver git blame
video_not_supported_in_browser=O seu navegador não suporta a etiqueta "video" do HTML5.
audio_not_supported_in_browser=O seu navegador não suporta a etiqueta "audio" do HTML5.
stored_lfs=Armazenado com Git LFS
stored_annex=Armazenado com Git Annex
symbolic_link=Ligação simbólica
executable_file=Ficheiro executável
vendored=Externo
@ -1341,6 +1345,7 @@ editor.upload_file=Carregar ficheiro
editor.edit_file=Editar ficheiro
editor.preview_changes=Pré-visualizar modificações
editor.cannot_edit_lfs_files=Ficheiros LFS não podem ser editados na interface web.
editor.cannot_edit_annex_files=Ficheiros Annex não podem ser editados na interface web.
editor.cannot_edit_non_text_files=Ficheiros binários não podem ser editados na interface da web.
editor.edit_this_file=Editar ficheiro
editor.this_file_locked=Ficheiro bloqueado
@ -2514,9 +2519,9 @@ settings.archive.text=Arquivar o repositório irá torná-lo apenas de leitura.
settings.archive.success=O repositório foi arquivado com sucesso.
settings.archive.error=Ocorreu um erro enquanto decorria o processo de arquivo do repositório. Veja os registo para obter mais detalhes.
settings.archive.error_ismirror=Não pode arquivar um repositório que tenha sido replicado.
settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis quando o repositório está arquivado.
settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis quando o repositório está arquivado.
settings.archive.mirrors_unavailable=As réplicas não estão disponíveis se o repositório estiver arquivado.
settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis em repositórios arquivados.
settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis em repositórios arquivados.
settings.archive.mirrors_unavailable=As réplicas não estão disponíveis em repositórios arquivados.
settings.unarchive.button=Desarquivar repositório
settings.unarchive.header=Desarquivar este repositório
settings.unarchive.text=Desarquivar o repositório irá restaurar a capacidade de receber cometimentos e envios, assim como novas questões e pedidos de integração.
@ -2828,7 +2833,7 @@ mirror_use_ssh.text = Utilizar a autenticação SSH
mirror_denied_combination = Não é possível usar a autenticação baseada em chave pública e senha em combinação.
settings.mirror_settings.push_mirror.copy_public_key = Copiar chave pública
settings.mirror_settings.push_mirror.none_ssh = Nenhuma
settings.protect_new_rule = Criar uma nova regra de salvaguarda do ramo
settings.protect_new_rule = Criar uma nova regra de proteção de ramo
mirror_use_ssh.helper = O Forgejo irá replicar o repositório via Git sobre SSH e criar um par de chaves para si quando escolher esta opção. Tem que se certificar que a chave pública gerada está autorizada a enviar para o repositório de destino. Não pode usar a autorização baseada numa senha quando escolher isto.
mirror_use_ssh.not_available = A autenticação por SSH não está disponível.
issues.new.assign_to_me = Atribuir a mim
@ -2844,9 +2849,26 @@ issues.review.add_remove_review_requests = pedidos de revisão de %[1]s e pedido
pulls.delete_after_merge.head_branch.is_default = O ramo de topo que pretende eliminar é o ramo predefinido e não pode ser eliminado.
pulls.delete_after_merge.head_branch.is_protected = O ramo de topo que pretende eliminar é um ramo protegido e não pode ser eliminado.
pulls.delete_after_merge.head_branch.insufficient_branch = Não tem permissão para eliminar o ramo de topo.
issues.summary_card_alt = Sumário de uma questão com o título "%s" no repositório %s
issues.summary_card_alt = Cartão de resumo de uma questão com o título "%s" no repositório %s
issues.num_reviews_one = %d revisão
issues.num_reviews_few = %d revisões
editor.add_tmpl.filename = nome do ficheiro
new_from_template = Utilize um template
new_from_template_description = Pode selecionar um modelo de repositório existente nesta instância e aplicar as suas definições.
new_advanced = Configurações avançadas
new_advanced_expand = Clique para expandir
auto_init_description = Iniciar o histórico do Git com um README e, opcionalmente, adicione os ficheiros License e .gitignore.
summary_card_alt = Cartão de resumo do repositório %s
issues.reaction.add = Adicionar reação
issues.reaction.alt_few = %[1]s reagiu com %[2]s.
issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
issues.context.menu = Menu de comentário
pulls.sign_in_require = <a href="%s">Inicie sessão</a> para criar um novo pedido de integração.
settings.default_update_style_desc = Estilo de atualização predefinido utilizado para atualizar pedidos de integração que estão atrasados em relação ao ramo base.
release.summary_card_alt = Cartão de resumo de um lançamento com o título "%s" no repositório %s
[graphs]
component_loading=A carregar %s...
@ -3167,8 +3189,8 @@ orgs.members=Membros
orgs.new_orga=Nova organização
repos.repo_manage_panel=Gerir repositórios
repos.unadopted=Repositórios não adoptados
repos.unadopted.no_more=Não foram encontrados mais repositórios não adoptados
repos.unadopted=Repositórios não adotados
repos.unadopted.no_more=Não foram encontrados repositórios não adotados.
repos.owner=Proprietário(a)
repos.name=Nome
repos.private=Privado
@ -3275,9 +3297,9 @@ auths.oauth2_required_claim_name_helper=Defina este nome para restringir o iníc
auths.oauth2_required_claim_value=Valor de reivindicação obrigatório
auths.oauth2_required_claim_value_helper=Defina este valor para restringir o início de sessão desta fonte a utilizadores que tenham uma reivindicação com este nome e este valor
auths.oauth2_group_claim_name=Reivindicar nome que fornece nomes de grupo para esta fonte. (Opcional)
auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores (opcional — exige a reivindicação de nome acima).
auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos (opcional — exige a reivindicação de nome acima).
auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização (opcional — requer nome de reclamação acima).
auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores. (Opcional — exige a reivindicação de nome acima)
auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos. (Opcional — exige a reivindicação de nome acima)
auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização. (Opcional — requer nome de reclamação acima)
auths.oauth2_map_group_to_team_removal=Remover utilizadores das equipas sincronizadas se esses utilizadores não pertencerem ao grupo correspondente.
auths.enable_auto_register=Habilitar o registo automático
auths.sspi_auto_create_users=Criar utilizadores automaticamente
@ -3664,7 +3686,7 @@ alpine.registry=Configure este registo adicionando o URL no seu ficheiro <code>/
alpine.registry.key=Descarregue a chave RSA pública do registo para dentro da pasta <code>/etc/apk/keys/</code> para verificar a assinatura do índice:
alpine.registry.info=Escolha $branch e $repository da lista abaixo.
alpine.install=Para instalar o pacote, execute o seguinte comando:
alpine.repository=Informação do repositório
alpine.repository=Informações do repositório
alpine.repository.branches=Ramos
alpine.repository.repositories=Repositórios
alpine.repository.architectures=Arquitecturas
@ -3684,9 +3706,9 @@ conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
container.details.type=Tipo de imagem
container.details.platform=Plataforma
container.pull=Puxar a imagem usando a linha de comandos:
container.digest=Resumo:
container.digest=Resumo
container.multi_arch=S.O. / Arquit.
container.layers=Camadas de imagem
container.layers=Camadas da imagem
container.labels=Rótulos
container.labels.key=Chave
container.labels.value=Valor
@ -3695,7 +3717,7 @@ cran.install=Para instalar o pacote, execute o seguinte comando:
debian.registry=Configurar este registo usando a linha de comandos:
debian.registry.info=Escolha $distribution e $component da lista abaixo.
debian.install=Para instalar o pacote, execute o seguinte comando:
debian.repository=Informação do repositório
debian.repository=Informações do repositório
debian.repository.distributions=Distribuições
debian.repository.components=Componentes
debian.repository.architectures=Arquitecturas
@ -3725,12 +3747,12 @@ rpm.registry=Configurar este registo usando a linha de comandos:
rpm.distros.redhat=em distribuições baseadas no RedHat
rpm.distros.suse=em distribuições baseadas no SUSE
rpm.install=Para instalar o pacote, execute o seguinte comando:
rpm.repository=Informação do repositório
rpm.repository=Informações do repositório
rpm.repository.architectures=Arquitecturas
rpm.repository.multiple_groups=Este pacote está disponível em vários grupos.
rubygems.install=Para instalar o pacote usando o gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao ficheiro <code>Gemfile</code>:
rubygems.dependencies.runtime=Dependências do tempo de execução (runtime)
rubygems.dependencies.runtime=Dependências em tempo de execução
rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer a versão do Ruby
rubygems.required.rubygems=Requer a versão do RubyGem
@ -3791,7 +3813,7 @@ arch.version.provides = Fornece
arch.pacman.helper.gpg = Adicionar certificado de confiança para o pacman:
arch.pacman.conf = Adicionar servidor com distribuição e arquitectura relacionadas a <code>/etc/pacman.conf</code> :
arch.pacman.repo.multi = %s tem a mesma versão em distribuições diferentes.
arch.version.optdepends = Dependências opcionais
arch.version.optdepends = Depende opcionalmente
arch.version.depends = Depende de
arch.version.makedepends = Dependências do make
arch.version.groups = Grupo
@ -3799,6 +3821,7 @@ arch.version.checkdepends = Verificar dependências
arch.version.conflicts = Conflitos
arch.version.backup = Cópia de segurança
arch.version.replaces = Substitui
container.images.title = Imagens
[secrets]
secrets=Segredos
@ -3991,8 +4014,8 @@ projects.read = <b>Ler:</b> Aceder aos quadros de planeamento do repositório.
projects.write = <b>Escrever:</b> Criar planeamentos e colunas e editá-las.
packages.read = <b>Ler:</b> Ver e descarregar pacotes atribuídos ao repositório.
packages.write = <b>Escrever:</b> Publicar e eliminar pacotes atribuídos ao repositório.
actions.read = <b>Ler:</b> Ver canais CI/CD integrados e os seus registos.
actions.write = <b>Escrever:</b> Despoletar, reiniciar, cancelar ou aprovar manualmente canais CI/CD pendentes.
actions.read = <b>Ler:</b> Ver sequências CI/CD integrados e os seus registos.
actions.write = <b>Escrever:</b> Despoletar, reiniciar, cancelar ou aprovar manualmente sequências CI/CD pendentes.
ext_issues = Aceder à ligação para um rastreador de questões externo. As permissões são geridas externamente.
ext_wiki = Aceder à ligação para um wiki externo. As permissões são geridas externamente.
issues.write = <b>Escrever:</b> Fechar questões e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências.

View file

@ -234,7 +234,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
[install]
install=Установка
title=Начальная конфигурация
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
docker_helper=Если вы запускаете Forgejo под Docker, прежде чем изменять любые настройки, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>.
require_db_desc=Forgejo требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
db_title=Настройки базы данных
db_type=Тип базы данных
@ -267,16 +267,16 @@ repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
run_user=Выполнение под пользователем
run_user=Работа под пользователем
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера.
ssh_port=Порт SSH-сервера
ssh_port_helper=Номер порта, используемый SSH-сервером. Оставьте пустым для отключения доступа по SSH.
ssh_port_helper=Номер порта, используемый для входящих подключений по SSH. Оставьте пустым для отключения доступа по SSH.
http_port=Порт HTTP-сервера
http_port_helper=Номер порта, используемый веб-сервером Forgejo.
app_url=Базовый URL Forgejo
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по эл. почте.
app_url=Базовый URL
app_url_helper=Этот параметр влияет на URL клонирования по HTTP/HTTPS и на ссылки в уведомлениях по эл. почте.
log_root_path=Путь журналов
log_root_path_helper=Файлы журнала будут записываться в этот каталог.
@ -284,9 +284,9 @@ optional_title=Дополнительные настройки
email_title=Настройки эл. почты
smtp_addr=Адрес SMTP
smtp_port=Порт SMTP
smtp_from=Отправлять письма от
smtp_from=Отправитель
smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" <email@example.com>.
mailer_user=Логин SMTP
mailer_user=Имя пользователя SMTP
mailer_password=Пароль SMTP
register_confirm=Требовать подтверждение по эл. почте для регистрации
mail_notify=Уведомления по эл. почте
@ -316,11 +316,11 @@ confirm_password=Подтверждение пароля
admin_email=Адрес эл. почты
install_btn_confirm=Установить Forgejo
test_git_failed=Не удалось проверить команду «git»: %v
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную сборку из %s (не сборку «gobuild»).
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, скачайте официальную сборку из %s (не версию «gobuild»).
invalid_db_setting=Некорректные настройки базы данных: %v
invalid_db_table=Таблица «%s» базы данных некорректна: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v
invalid_app_data_path=Неверный путь к приложению: %v
invalid_repo_path=Неверный путь к корню репозиториев: %v
invalid_app_data_path=Неверный путь к данным приложения: %v
run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
internal_token_failed=Не удалось создать внутренний токен: %v
secret_key_failed=Не удалось создать секретный ключ: %v
@ -360,7 +360,7 @@ my_orgs=Организации
my_mirrors=Мои зеркала
view_home=Показать %s
search_repos=Поиск репозитория…
filter=Другие фильтры
filter=Прочие фильтры
filter_by_team_repositories=Фильтровать по репозиториям команды
feed_of=Лента «%s»
@ -687,13 +687,13 @@ change_avatar=Изменить изображение профиля…
joined_on=Регистрация %s
repositories=Репозитории
activity=Публичная активность
followers_few=%d подписчики
followers_few=%d подписчиков
starred=Избранные репозитории
watched=Отслеживаемые репозитории
code=Код
projects=Проекты
overview=Обзор
following_few=%d подписки
following_few=%d подписок
follow=Подписаться
unfollow=Отписаться
user_bio=О себе
@ -748,7 +748,7 @@ webauthn=Двухфакторная аутентификация (ключами
public_profile=Публичный профиль
biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown)
location_placeholder=Пусть все знают, откуда вы
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
profile_desc=Ваш профиль
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
full_name=Полное имя
website=Веб-сайт
@ -810,7 +810,7 @@ password_change_disabled=Нелокальные учётные записи не
emails=Адреса эл. почты
manage_emails=Управление адресами эл. почты
manage_themes=Тема по умолчанию
manage_themes=Тема интерфейса
manage_openid=Адреса OpenID
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
theme_desc=Эта тема оформления будет использоваться при входе на сайт под этой учётной записью.
@ -941,7 +941,7 @@ select_permissions=Выбрать разрешения
permission_no_access=Нет доступа
permission_read=Чтение
permission_write=Чтение и запись
access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами <a href="%[1]s" target="_blank">API</a>. Читайте <a href="%[2]s" target="_blank">документацию</a> для получения дополнительной информации.
access_token_desc=Выбранные области действия токена ограничивают его использование до соответствующих маршрутов <a href="%[1]s" target="_blank">API</a>. Для получения подробностей ознакомьтесь с <a href="%[2]s" target="_blank">документацией</a> .
at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена
permissions_list=Разрешения:
@ -949,7 +949,7 @@ manage_oauth2_applications=Управление приложениями OAuth2
edit_oauth2_application=Изменить приложение OAuth2
oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo.
remove_oauth2_application=Удаление приложения OAuth2
remove_oauth2_application_desc=Удаление приложения OAuth2 отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_desc=Удаление этого приложения отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_success=Приложение было успешно удалено.
create_oauth2_application=Создать новое приложение OAuth2
create_oauth2_application_button=Создать приложение
@ -1040,7 +1040,7 @@ blocked_since = Заблокирован с %s
user_unblock_success = Пользователь разблокирован.
twofa_scratch_token_regenerated = Ваш одноразовый ключ восстановления: %s. Сохраните его в надёжном месте. Больше он показан не будет.
blocked_users = Заблокированные пользователи
keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля. Он больше не будет использоваться по умолчанию для коммитов, сделанных из веб-интерфейса, таких как загрузки и редактирования файлов и не будет использоваться для коммитов запросов на слияние. Вместо него можно будет использовать специальный адрес %s, чтобы присваивать коммиты с вашим аккаунтом. Обратите внимание на то, что изменение данной настройки не повлияет на существующие коммиты.
keep_email_private_popup = Ваш адрес эл. почты не будет видим в профиле и не будет использован по умолчанию для коммитов из веб-интерфейса, таких как загрузка и редактирование файлов, а также для коммитов слияний. Вместо него для связи коммитов с уч. записью можно использовать специальный адрес %s. Изменение данной настройки не изменит адрес в существующих коммитах.
oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, хранящих секрет в тайне, например, для веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфонов.
change_password = Изменение пароля
hints = Подсказки
@ -1051,10 +1051,12 @@ additional_repo_units_hint_description = Показывать подсказку
pronouns_custom = Другие
pronouns = Местоимения
pronouns_unspecified = Не указаны
language.title = Язык по умолчанию
language.title = Язык интерфейса
keep_activity_private.description = Ваша <a href="%s">публичная активность</a> будет видна только вам и администраторам сервера.
language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
language.localization_project = Помогите с переводом Forgejo на свой язык! <a href="%s">Подробнее</a>.
user_block_yourself = Нельзя заблокировать себя.
pronouns_custom_label = Другие местоимения
[repo]
owner=Владелец
@ -1065,11 +1067,11 @@ repo_size=Размер репозитория
size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
template=Шаблон
template_select=Выберите шаблон
template_helper=Сделать репозиторий шаблоном
template_helper=Пометить репозиторий как шаблон
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
visibility=Видимость
visibility_description=Это увидят только владелец организации или участники при наличии прав.
visibility_helper=Сделать репозиторий приватным
visibility_description=Он будет видим только владельцу организации и её участникам при наличии прав.
visibility_helper=Частный репозиторий
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
visibility_fork_helper=(Это изменит видимость всех ответвлений.)
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
@ -1091,16 +1093,16 @@ repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык
repo_gitignore_helper=Выберите шаблоны .gitignore
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
repo_gitignore_helper_desc=Выберите шаблоны из списка для популярных языков. .gitignore определяет, какие файлы не надо отслеживать в проекте. По умолчанию в него включены типичные артефакты, создаваемые инструментами сборки каждого языка.
issue_labels=Метки
issue_labels_helper=Выберите набор меток
license=Лицензия
license_helper=Выберите лицензию
license_helper_desc=Лицензия определяет, что другие люди могут, а что не могут делать с вашим кодом. Не уверены, какая лицензия подходит для вашего проекта? Смотрите <a target="_blank" rel="noopener noreferrer" href="%s">Выберите лицензию</a>.
license_helper_desc=Лицензия определяет, что другие могут и не могут делать с вашим кодом. Не знаете, какая лицензия подойдёт для вашего проекта? Ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">Выбором лицензии</a>.
readme=README
readme_helper=Выберите шаблон README
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
auto_init=Инициализировать репозиторий (Добавляет .gitignore, LICENSE and README)
auto_init=Инициализировать репозиторий
trust_model_helper=Выберите модель доверия для проверки подписи. Возможные варианты:
trust_model_helper_collaborator=Соучастник: доверять подписям соучастников
trust_model_helper_committer=Автор коммита: доверять подписям, соответствующим авторам коммитов
@ -1300,6 +1302,7 @@ view_git_blame=Показать git blame
video_not_supported_in_browser=Ваш браузер не поддерживает тэг HTML5 «video».
audio_not_supported_in_browser=Ваш браузер не поддерживает тэг HTML5 «audio».
stored_lfs=Хранится Git LFS
stored_annex=Хранится Git Annex
symbolic_link=Символическая ссылка
executable_file=Исполняемый файл
commit_graph=Граф коммитов
@ -1323,6 +1326,7 @@ editor.upload_file=Загрузить файл
editor.edit_file=Редактировать файл
editor.preview_changes=Просмотр изменений
editor.cannot_edit_lfs_files=LFS файлы невозможно редактировать в веб-интерфейсе.
editor.cannot_edit_annex_files=Annex файлы невозможно редактировать в веб-интерфейсе.
editor.cannot_edit_non_text_files=Двоичные файлы нельзя редактировать в веб-интерфейсе.
editor.edit_this_file=Редактировать файл
editor.this_file_locked=Файл заблокирован
@ -1719,8 +1723,8 @@ issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Изменить
issues.due_date_form_remove=Удалить
issues.due_date_not_set=Срок выполнения не установлен.
issues.due_date_added=добавлен срок выполнения %s %s
issues.due_date_modified=срок выполнения передвинут с %[2]s на %[1]s %[3]s
issues.due_date_added=добавлен срок выполнения %s, %s
issues.due_date_modified=срок выполнения изменён с %[2]s на %[1]s %[3]s
issues.due_date_remove=убран срок выполнения %s %s
issues.due_date_overdue=Просроченные
issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
@ -2195,9 +2199,9 @@ settings.transfer_perform=Выполнить передачу
settings.transfer_started=Репозиторий ожидает подтверждения передачи от «%s»
settings.transfer_succeed=Репозиторий перенесён.
settings.signing_settings=Настройки проверки подписей
settings.trust_model=Модель доверия подписи
settings.trust_model.default=Модель доверия по умолчанию
settings.trust_model.default.desc=Использовать стандартную модель доверия репозитория для этой установки.
settings.trust_model=Факторы доверия подписям
settings.trust_model.default=Фактор доверия по умолчанию
settings.trust_model.default.desc=Использовать фактор доверия по умолчанию, используемый на этом сервере.
settings.trust_model.collaborator=Соучастник
settings.trust_model.collaborator.long=Соучастник: доверять подписям соучастников
settings.trust_model.collaborator.desc=Действительные подписи соучастников этого репозитория будут помечены как «доверенные» (независимо от того, соответствуют ли они автору коммита). В остальных случаях действительные подписи будут помечены как «недоверенные», если подпись соответствует автору коммита, и «не совпадающие», если нет.
@ -2742,7 +2746,7 @@ pulls.made_using_agit = AGit
activity.navbar.contributors = Соавторы
activity.navbar.code_frequency = Частота изменений
activity.navbar.recent_commits = Недавние коммиты
settings.confirmation_string = Подтверждение
settings.confirmation_string = Строка подтверждения
settings.archive.text = Архивация репозитория сделает всё его содержимое доступным только для чтения. Он будет скрыт с домашнего экрана. Никто (включая вас!) не сможет добавлять коммиты, открывать задачи и запросы слияний.
release.deletion_desc = Удаление выпуска удаляет его только в Forgejo. Это действие не затронет тег в git, содержимое репозитория и его историю. Продолжить?
pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании ответвления или новой ветви.
@ -2850,6 +2854,22 @@ issues.num_reviews_few = %d рецензий
issues.num_reviews_one = %d рецензия
issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s
editor.add_tmpl.filename = имя файла
settings.default_update_style_desc = Стиль обновления отстающих ветвей запросов на слияние по умолчанию.
pulls.sign_in_require = <a href="%s">Войдите</a>, чтобы создать запрос слияния.
new_from_template = Применить шаблон
new_from_template_description = Вы можете выбрать любой шаблон репозитория на этом сервере и применить его настройки на этом репозитории.
new_advanced = Расширенные настройки
new_advanced_expand = Нажмите, чтобы раскрыть
auto_init_description = Начать историю коммитов с добавления README и, если надо, лицензии и .gitignore.
summary_card_alt = Карточка со сводкой о репозитории %s
issues.reaction.add = Добавить реакцию
issues.reaction.alt_few = Реакция %[2]s от %[1]s.
issues.reaction.alt_many = Реакция %[3]s от %[1]s и %[2]d других.
issues.reaction.alt_remove = Убрать реакцию %[1]s с этого комментария.
issues.reaction.alt_add = Добавить реакцию %[1]s к этому комментарию.
issues.context.menu = Меню комментария
release.summary_card_alt = Карточка со сводкой о выпуске «%s» в репозитории %s
[graphs]
component_loading_failed = Не удалось загрузить %s
@ -3315,13 +3335,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Неверный URL для авто
config.server_config=Конфигурация сервера
config.app_name=Название сервера
config.app_ver=Версия Forgejo
config.app_url=Базовый URL Forgejo
config.app_url=Базовый URL
config.custom_conf=Путь к файлу конфигурации
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.app_data_path=Путь к данным приложения
@ -3956,28 +3976,28 @@ fuzzy_tooltip = Включает результаты, достаточно по
type_tooltip = Тип поиска
fuzzy = Приблизительный
match = Точный
repo_kind = Поиск репозиториев...
user_kind = Поиск пользователей...
org_kind = Поиск организаций...
team_kind = Поиск команд...
code_kind = Поиск по коду...
package_kind = Поиск пакетов...
project_kind = Поиск проектов...
branch_kind = Поиск ветвей...
commit_kind = Поиск коммитов...
repo_kind = Найти репозитории...
user_kind = Найти пользователей...
org_kind = Найти организации...
team_kind = Найти команды...
code_kind = Найти в коде...
package_kind = Найти пакеты...
project_kind = Найти проекты...
branch_kind = Найти ветви...
commit_kind = Найти коммиты...
no_results = По запросу ничего не найдено.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера.
match_tooltip = Включать только результаты, точно соответствующие запросу
code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
runner_kind = Поиск исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера.
runner_kind = Найти исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода.
exact = Точный
exact_tooltip = Включает только результаты, в точности соответствующие запросу
issue_kind = Поиск задач...
pull_kind = Поиск слияний...
issue_kind = Найти задачи...
pull_kind = Найти слияния...
union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
union = Обычный
milestone_kind = Поиск этапов...
milestone_kind = Найти этапы...
regexp = Регулярное выражение
regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение
@ -3988,7 +4008,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан
[translation_meta]
test = skip-ci routine :)
test = forgejo :)
[repo.permissions]
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов.

View file

@ -889,6 +889,7 @@ file_copy_permalink=පිටපත් මාමලින්ක්
video_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'වීඩියෝ' ටැගය සඳහා සහය නොදක්වයි.
audio_not_supported_in_browser=ඔබගේ බ්රව්සරය HTML5 'ශ්රව්ය' ටැගය සඳහා සහය නොදක්වයි.
stored_lfs=Git LFS සමඟ ගබඩා
stored_annex=Git Annex සමඟ ගබඩා
symbolic_link=සංකේතාත්මක සබැඳිය
commit_graph=ප්රස්තාරය කැප
commit_graph.select=ශාඛා තෝරන්න
@ -906,6 +907,7 @@ editor.upload_file=ගොනුව උඩුගත කරන්න
editor.edit_file=ගොනුව සංස්කරණය
editor.preview_changes=වෙනස්කම් පෙරදසුන
editor.cannot_edit_lfs_files=LFS ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
editor.cannot_edit_annex_files=Annex ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
editor.cannot_edit_non_text_files=ද්විමය ගොනු වෙබ් අතුරු මුහුණත තුළ සංස්කරණය කළ නොහැක.
editor.edit_this_file=ගොනුව සංස්කරණය
editor.this_file_locked=ගොනුවට අගුළු ලා ඇත

View file

@ -1010,6 +1010,7 @@ view_git_blame=Zobraziť Git Blame
video_not_supported_in_browser=Váš prehliadač nepodporuje HTML5 tag 'video'.
audio_not_supported_in_browser=Váš prehliadač nepodporuje HTML5 tag 'audio'.
stored_lfs=Uložené pomocou Git LFS
stored_annex=Uložené pomocou Git Annex
symbolic_link=Symbolický odkaz
commit_graph=Graf commitov
line=riadok

File diff suppressed because it is too large Load diff

View file

@ -17,10 +17,10 @@ page=Sayfa
template=Şablon
language=Dil
notifications=Bildirimler
active_stopwatch=Etkin Zaman Takibi
active_stopwatch=Etkin Zaman Takipçisi
tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti
create_new=Oluştur…
user_profile_and_more=Profil ve Ayarlar…
user_profile_and_more=Profil ve ayarlar…
signed_in_as=Giriş yapan:
enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir.
toc=İçindekiler Tablosu
@ -28,12 +28,12 @@ licenses=Lisanslar
return_to_forgejo=Forgejo'ya Dön
username=Kullanıcı Adı
email=E-posta Adresi
email=E-posta adresi
password=Parola
access_token=Erişim Kodu
re_type=Parolayı Doğrula
re_type=Parolayı doğrula
captcha=CAPTCHA
twofa=İki Aşamalı Doğrulama
twofa=İki aşamalı doğrulama
twofa_scratch=İki aşamalı kazınmış kod
passcode=Şifre
@ -59,10 +59,10 @@ new_migrate=Yeni Göç
new_mirror=Yeni Yansı
new_fork=Yeni Depo Çatalı
new_org=Yeni Organizasyon
new_project=Yeni Proje
new_project_column=Yeni Sütun
new_project=Yeni proje
new_project_column=Yeni sütun
manage_org=Organizasyonları Yönet
admin_panel=Site Yönetimi
admin_panel=Site yönetimi
account_settings=Hesap Ayarları
settings=Ayarlar
your_profile=Profil
@ -87,9 +87,9 @@ rerun=Yeniden çalıştır
rerun_all=Tüm görevleri yeniden çalıştır
save=Kaydet
add=Ekle
add_all=Tümünü Ekle
add_all=Tümünü ekle
remove=Kaldır
remove_all=Tümünü Kaldır
remove_all=Tümünü kaldır
remove_label_str=`"%s" öğesini kaldır`
edit=Düzenle
view=Görüntüle
@ -118,7 +118,7 @@ go_back=Geri Git
never=Asla
unknown=Bilinmiyor
rss_feed=RSS Beslemesi
rss_feed=RSS yayını
pin=Sabitle
unpin=Sabitlemeyi kaldır
@ -141,17 +141,17 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz
name=İsim
value=Değer
copy_generic = Kopyala
copy_generic = Panoya kopyala
filter = Filtrele
filter.not_archived = Arşivlenmemiş
filter.clear = Filtreleri Temizle
filter.is_archived = Arşivlenmiş
filter.is_mirror = Yansılaştırılmış
filter.is_fork = Çatallanmış
filter.not_fork = Çatallanmamış
filter.is_fork = Çatallar
filter.not_fork = Çatallanmayanlar
filter.not_mirror = Yansılanmamış
filter.is_template = Şablon
filter.not_template = Şablon değil
filter.not_template = Şablon olmayan
filter.public = Herkese açık
filter.private = Gizli
more_items = Daha fazla öğe
@ -166,10 +166,12 @@ toggle_menu = Menüyü aç-kapa
new_migrate.title = Yeni geçiş
new_migrate.link = Yeni geçiş
copy_path = Dizini kopyala
[aria]
navbar=Gezinti Çubuğu
navbar=Gezinti çubuğu
footer=Alt Bilgi
footer.software=Yazılım Hakkında
footer.software=Bu yazılım hakkında
footer.links=Bağlantılar
[heatmap]
@ -196,6 +198,13 @@ buttons.switch_to_legacy.tooltip=Eski düzenleyiciyi kullan
buttons.enable_monospace_font=Eşaralıklı yazıtipini etkinleştir
buttons.disable_monospace_font=Eşaralıklı yazıtipini devre dışı bırak
buttons.new_table.tooltip = Tablo ekle
table_modal.header = Tablo ekle
table_modal.placeholder.header = Başlık
table_modal.placeholder.content = İçerik
table_modal.label.rows = Satırlar
table_modal.label.columns = Sütunlar
[filter]
string.asc=A - Z
string.desc=Z - A
@ -224,12 +233,12 @@ install=Kurulum
title=Başlangıç Yapılandırması
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
db_title=Veritabanı Ayarları
db_type=Veritabanı Türü
db_title=Veritabanı ayarları
db_type=Veritabanı tipi
host=Sunucu
user=Kullanıcı adı
password=Parola
db_name=Veritabanı Adı
db_name=Veritabanı adı
db_schema=Şema
db_schema_helper=Veritabanı varsayılanı için boş bırakın ("genel").
ssl_mode=SSL
@ -248,16 +257,16 @@ err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı
err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eşleşiyor
err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz
general_title=Genel Ayarlar
general_title=Genel ayarlar
app_name=Site Başlığı
app_name_helper=Şirket adınızı buraya girebilirsiniz.
repo_path=Depo Kök Yolu
repo_path=Depo kök dizini
repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir.
lfs_path=Git LFS Kök Yolu
lfs_path=Git LFS kök dizini
lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boş bırakın.
run_user=Şu Kullanıcı Olarak Çalıştır
run_user_helper=Forgejo'nin çalışacağı işletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna erişiminin olması gerektiğini unutmayın.
domain=Sunucu Alan Adı
domain=Sunucu alan adı
domain_helper=Sunucu için alan adı veya ana bilgisayar adresi.
ssh_port=SSH Sunucu Portu
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. Etkisizleştimek için boş bırakın.
@ -269,15 +278,15 @@ log_root_path=Günlük Dosyaları Yolu
log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir.
optional_title=İsteğe Bağlı Ayarlar
email_title=E-posta Ayarları
smtp_addr=SMTP Sunucusu
smtp_port=SMTP Portu
email_title=E-posta ayarları
smtp_addr=SMTP sunucusu
smtp_port=SMTP portu
smtp_from=E-posta Gönderen
smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" <eposta@ornek.com> biçimini kullanın.
mailer_user=SMTP Kullanıcı Adı
mailer_password=SMTP Parolası
mailer_user=SMTP kullanıcı adı
mailer_password=SMTP parolası
register_confirm=Kayıt için E-posta Doğrulaması Gereksin
mail_notify=E-Posta Bildirimlerini Etkinleştir
mail_notify=E-Posta bildirimlerini etkinleştir
server_service_title=Sunucu ve Diğer Servis Ayarları
offline_mode=Yerel Kipi Etkinleştir
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
@ -297,11 +306,11 @@ enable_captcha.description=Kullanıcının kendi kendine kaydolması için captc
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıt olan kullanıcı kendiliğinden yönetici olacaktır.
admin_title=Yönetici Hesabı Ayarları
admin_name=Yönetici Kullanıcı Adı
admin_title=Yönetici hesabı ayarları
admin_name=Yönetici kullanıcı adı
admin_password=Parola
confirm_password=Parolayı Doğrula
admin_email=E-posta Adresi
confirm_password=Parolayı doğrula
admin_email=E-posta adresi
install_btn_confirm=Forgejo'u Kur
test_git_failed='git' komut testi başarısız: %v
sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü değil) indirin.
@ -316,7 +325,7 @@ save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
invalid_log_root_path=Log dosya yolu geçersiz: %v
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
default_keep_email_private.description=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
@ -326,7 +335,7 @@ no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için a
password_algorithm=Parola Hash Algoritması
invalid_password_algorithm=Hatalı parola hash algoritması
password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
enable_update_checker=Güncelleme Denetleyicisini Etkinleştir
enable_update_checker=Güncelleme denetleyicisini etkinleştir
env_config_keys=Ortam Yapılandırma
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
allow_only_external_registration = Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver
@ -336,7 +345,7 @@ enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS k
allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez.
[home]
uname_holder=Kullanıcı Adı veya E-Posta Adresi
uname_holder=Kullanıcı adı veya e-posta adresi
password_holder=Parola
switch_dashboard_context=Panoya Geçiş Yap
my_repos=Depolar
@ -389,13 +398,13 @@ forks_one = %d çatal
forks_few = %d çatal
[auth]
create_new_account=Hesap Oluştur
create_new_account=Hesap oluştur
register_helper_msg=Bir hesabınız var mı? Şimdi giriş yapın!
social_register_helper_msg=Hesabınız var mı? Hemen bağlayın!
disable_register_prompt=Kayıt işlemi devre dışıdır. Lütfen site yöneticinizle iletişim kurun.
disable_register_mail=Kayıt için e-posta doğrulama devre dışıdır.
manual_activation_only=Etkinleştirmeyi tamamlamak için site yöneticinizle bağlantıya geçin.
remember_me=Bu Aygıtı hatırla
remember_me=Bu cihazı hatırla
remember_me.compromised=Oturum açma tokeni artık geçerli değil, bu ele geçirilmiş bir hesaba işaret ediyor olabilir. Lütfen hesabınızda olağandışı faaliyet olup olmadığını denetleyin.
forgot_password_title=Şifremi unuttum
forgot_password=Şifrenizi mi unuttunuz?
@ -414,7 +423,7 @@ has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (<b>%s
resend_mail=Etkinleştirme e-postasını tekrar almak için buraya tıklayın
email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir.
send_reset_mail=Hesap Kurtarma E-postası Gönder
reset_password=Hesap Kurtarma
reset_password=Hesap kurtarma
invalid_code=Doğrulama kodunuz geçersiz veya süresi dolmuş.
invalid_code_forgot_password=Onay kodunuz hatalı veya süresi geçmiş. Yeni bir oturum başlatmak için <a href="%s">buraya</a> tıklayın.
invalid_password=Parolanız hesap oluşturulurken kullanılan parolayla eşleşmiyor.
@ -428,9 +437,9 @@ use_scratch_code=Bir çizgi kodu kullanınız
twofa_scratch_used=Geçici kodunuzu kullandınız. İki aşamalı ayarlar sayfasına yönlendirildiniz, burada aygıt kaydınızı kaldırabilir veya yeni bir geçici kod oluşturabilirsiniz.
twofa_passcode_incorrect=Şifreniz yanlış. Aygıtınızı yanlış yerleştirdiyseniz, oturum açmak için çizgi kodunuzu kullanın.
twofa_scratch_token_incorrect=Çizgi kodunuz doğru değildir.
login_userpass=Oturum Aç
login_userpass=Oturum aç
tab_openid=ık Kimlik
oauth_signup_tab=Yeni Hesap Oluştur
oauth_signup_tab=Yeni hesap oluştur
oauth_signup_title=Yeni Hesabı Tamamla
oauth_signup_submit=Hesabı Tamamla
oauth_signin_tab=Mevcut Hesaba Bağla
@ -467,6 +476,8 @@ hint_register = Hesaba ihtiyacın var mı? <a href="%s">Hemen kaydol.</a>
sign_in_openid = OpenID ile giriş yap
hint_login = Mevcut hesabın var mı? <a href="%s">Hemen giriş yap!</a>
use_onetime_code = Tek kullanımlık kod kullan
[mail]
view_it_on=%s üzerinde görüntüle
reply=veya doğrudan bu e-postayı yanıtlayın
@ -544,6 +555,8 @@ password_change.subject = Parolanız değişti
admin.new_user.user_info = Kullanıcı bilgisi
admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için <a href="%s">buraya tıklayın</a>.
password_change.text_1 = Hesabınızın parolası değişti.
[modal]
yes=Evet
no=Hayır
@ -652,6 +665,9 @@ Location = Konum
Website = Websitesi
username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), tire ("-") ve alt tire ("-") içerebilir. Alfanumerik olmayan karakterlerle başlayamaz ve bitemez, ayrıca ardışık alfanumerik olmayan karakterler de kullanılamaz.`
admin_cannot_delete_self = Yöneticiyken kullanıcınızı silemezsiniz. Lütfen önce yönetici yetkilerinizi kaldırın.
[user]
change_avatar=Profil resmini değiştir…
joined_on=%s tarihinde katıldı
@ -691,6 +707,10 @@ block = Engelle
public_activity.visibility_hint.self_private = Aktiviteniz sadece size ve oluşum yöneticilerine açıktır. <a href="%s">Değiştir</a>.
followers_one = %d takipçi
block_user.detail = Bu kullanıcıyı engellediğinizde:
block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz.
block_user.detail_2 = Bu kullanıcı sahip olduğunuz depolar, açtığınız sorunlar ve yaptığınız yorumlar ile etkileşime geçemeyecek.
[settings]
profile=Profil
account=Hesap
@ -1270,6 +1290,7 @@ view_git_blame=Git Suç Görüntüle
video_not_supported_in_browser=Tarayıcınız HTML5 'video' etiketini desteklemiyor.
audio_not_supported_in_browser=Tarayıcınız HTML5 'audio' etiketini desteklemiyor.
stored_lfs=Git LFS ile depolandı
stored_annex=Git Annex ile depolandı
symbolic_link=Sembolik Bağlantı
executable_file=Çalıştırılabilir Dosya
commit_graph=İşleme Grafiği
@ -1293,6 +1314,7 @@ editor.upload_file=Dosya Yükle
editor.edit_file=Dosyayı Düzenle
editor.preview_changes=Değişiklikleri Önizle
editor.cannot_edit_lfs_files=LFS dosyaları web arayüzünde düzenlenemez.
editor.cannot_edit_annex_files=Annex dosyaları web arayüzünde düzenlenemez.
editor.cannot_edit_non_text_files=Bu tür dosyalar web arayüzünden düzenlenemez.
editor.edit_this_file=Dosyayı Düzenle
editor.this_file_locked=Dosya kilitlendi
@ -3663,7 +3685,7 @@ need_approval_desc=Değişiklik isteği çatalında iş akışı çalıştırmak
variables=Değişkenler
variables.management=Değişken Yönetimi
variables.creation=Değişken Ekle
variables.creation=Değişken ekle
variables.none=Henüz hiçbir değişken yok.
variables.deletion=Değişkeni kaldır
variables.deletion.description=Bir değişkeni kaldırma kalıcıdır ve geri alınamaz. Devam edilsin mi?
@ -3684,6 +3706,8 @@ type-1.display_name=Kişisel Proje
type-2.display_name=Depo Projesi
type-3.display_name=Organizasyon Projesi
deleted.display_name = Silinmiş proje
[git.filemode]
changed_filemode=%[1]s → %[2]s
directory=Dizin
@ -3714,3 +3738,6 @@ issue_kind = Sorunları ara...
pull_kind = Birleştirme isteklerini ara...
code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir.
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.

View file

@ -143,13 +143,13 @@ filter.clear = Очистити фільтри
filter.is_archived = Архівовано
filter = Фільтри
toggle_menu = Перемкнути видимість меню
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"?
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»?
artifacts = Артефакти
filter.not_archived = Не архівовано
filter.public = Загальнодоступні
filter.private = Приватні
more_items = Більше пунктів
remove_label_str = Видалити об'єкт "%s"
remove_label_str = Видалити об'єкт «%s»
new_repo.title = Новий репозиторій
new_migrate.title = Нова міграція
new_org.title = Нова організація
@ -334,7 +334,7 @@ password_algorithm=Алгоритм хешування пароля
config_location_hint = Ці опції налаштувань будуть збережені в:
env_config_keys = Конфігурація середовища
env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації:
invalid_db_table = База даних "%s" недійсна: %v
invalid_db_table = База даних «%s» недійсна: %v
enable_update_checker = Увімкнути перевірку оновлень
require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL).
allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси
@ -474,6 +474,10 @@ sign_up_successful = Обліковий запис успішно створен
unauthorized_credentials = Хибні або прострочені дані для входу. Спробуйте ще раз або перейдіть до %s по докладнішу інформацію
use_onetime_code = Користати одноразовий код
oauth.signin.error = Виникла помилка при обробці запиту на авторизацію. Якщо ця помилка буде повторюватись, зверніться до адміністратора сайту.
authorization_failed_desc = Авторизація не відбулася: виявлено недійсний запит. Будь ласка, зверніться до розробника програми, яку ви намагалися авторизувати.
password_pwned = Вибраний вами пароль є у <a target="_blank" rel="noopener noreferrer" href="%s">списку викрадених паролів</a>, виявлених під час витоків даних. Будь ласка, спробуйте ще раз з іншим паролем. Варто також змінити цей пароль в інших місцях.
[mail]
view_it_on=Переглянути на %s
link_not_working_do_paste=Посилання не працює? Спробуйте його скопіювати та вставити у свій браузер.
@ -555,6 +559,9 @@ totp_enrolled.text_1.has_webauthn = Ви щойно задіяли TOTP для
totp_enrolled.text_1.no_webauthn = Ви щойно задіяли TOTP для свого облікового запису. Всі наступні спроби входу вимагатимуть використання TOTP як засобу двофакторної автентифікації.
totp_disabled.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
removed_security_key.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
[modal]
yes=Так
no=Ні
@ -645,12 +652,25 @@ Pronouns = Займенники
Biography = Про себе
FullName = Повне ім'я
Website = Вебсайт
url_error = `"%s" є недійсним посиланням.`
url_error = `«%s» є недійсним посиланням.`
To = Назва гілки
Location = Розташування
AccessToken = Токен доступу
include_error = ` має містити підрядок «%s».`
invalid_group_team_map_error = ` призначення недійсне: %s`
repository_force_private = Увімкнено примусову приватність: приватні репозиторії не можна зробити публічними.
openid_been_used = Адреса OpenID «%s» вже використовується.
unset_password = Для користувача не встановлено пароль.
unsupported_login_type = Цей тип входу не підтримує видалення облікового запису.
duplicate_invite_to_team = Цього користувача вже запрошено як учасника команди.
organization_leave_success = Ви успішно покинули організацію %s.
must_use_public_key = Ключ, який ви надали, є приватним. Будь ласка, нікуди не завантажуйте свій приватний ключ. Використовуйте замість нього публічний ключ.
unable_verify_ssh_key = Не вдалося перевірити ключ SSH, перевірте його на наявність помилок.
still_has_org = Ваш обліковий запис є учасником однієї або декількох організацій, спочатку покиньте їх.
admin_cannot_delete_self = Ви не можете видалити себе, якщо ви є адміністратором. Спочатку зніміть із себе права адміністратора.
[user]
change_avatar=Змінити свій аватар…
repositories=Репозиторії
@ -687,6 +707,9 @@ following.title.one = Відстежуваний
following.title.few = Відстежувані
form.name_reserved = Ім'я користувача «%s» зарезервовано.
form.name_chars_not_allowed = Ім'я користувача «%s» містить неприпустимі символи.
[settings]
profile=Профіль
account=Обліковий запис
@ -844,7 +867,7 @@ unbind=Від'єднати
manage_access_token=Токени доступу
generate_new_token=Згенерувати новий токен
tokens_desc=Ці токени надають доступ до вашого облікового запису за допомогою Forgejo API.
token_name=Ім'я токену
token_name=Ім'я токена
generate_token=Згенерувати токен
generate_token_success=Ваш новий токен був створений. Скопіюйте його зараз, оскільки він не буде показаний знову.
generate_token_name_duplicate=Назва програми <strong>%s</strong> вже використовується. Будь ласка, використайте нову.
@ -861,7 +884,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість
remove_oauth2_application=Видалити програму OAuth2
remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити?
remove_oauth2_application_success=Програму видалено.
create_oauth2_application=Створити нову програму OAuth2
create_oauth2_application=Створити новий додаток OAuth2
create_oauth2_application_button=Створити програму
oauth2_application_name=Назва програми
save_application=Зберегти
@ -930,7 +953,7 @@ hidden_comment_types = Приховані типи коментарів
keep_activity_private = Приховати активність зі сторінки профілю
blocked_users = Заблоковані користувачі
blocked_users_none = Немає заблокованих користувачів.
profile_desc = Керуйте тим, як ваш профіль відображається іншим користувачам. Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля та операцій з Git через веб-інтерфейс.
profile_desc = Про себе
retype_new_password = Підтвердіть новий пароль
email_desc = Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля і, за умови, що вона не прихована, для операцій з Git через веб-інтерфейс.
visibility.limited_tooltip = Видимий(а) тільки для авторизованих користувачів
@ -965,6 +988,28 @@ comment_type_group_pull_request_push = Додані коміти
permissions_public_only = Тільки публічні
select_permissions = Виберіть дозволи
permissions_access_all = Усі (публічні, приватні й обмежені)
create_oauth2_application_success = Ви успішно створили новий додаток OAuth2.
keep_email_private_popup = Ваша адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти.
uid = UID
pronouns_custom_label = Інші займенники
uploaded_avatar_is_too_big = Розмір завантаженого файлу (%d КіБ) перевищує максимальний розмір (%d КіБ).
can_not_add_email_activations_pending = Очікується активація, спробуйте ще раз за кілька хвилин, якщо хочете додати нову адресу електронної пошти.
verify_gpg_key_success = Ключ GPG «%s» перевірено.
ssh_invalid_token_signature = Наданий SSH-ключ, підпис або токен не збігаються або токен застарів.
key_signature_ssh_placeholder = Починається з «-----BEGIN SSH SIGNATURE-----»
verify_ssh_key_success = Ключ SSH «%s» перевірено.
add_key_success = Ключ SSH «%s» додано.
add_gpg_key_success = Ключ GPG «%s» додано.
added_on = Додано %s
valid_until_date = Дійсний до %s
ssh_signonly = SSH наразі вимкнено, тому ці ключі використовуються лише для перевірки підпису комітів.
repo_and_org_access = Доступ до репозиторію та організації
permission_no_access = Немає доступу
permission_write = Читання і запис
at_least_one_permission = Для створення токена необхідно вибрати хоча б один дозвіл
repos_none = Ви не є власником жодного репозиторію.
blocked_since = Заблокований з %s
[repo]
owner=Власник
@ -1004,7 +1049,7 @@ license_helper_desc=Ліцензія регулює те, що інші можу
readme=README
readme_helper=Виберіть шаблон README
readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту.
auto_init=Ініціалізувати репозиторій (Додає .gitignore, License та README)
auto_init=Ініціалізувати репозиторій
trust_model_helper=Виберіть модель довіри для підтвердження підпису. Можливі варіанти:
trust_model_helper_collaborator=Співавтор: підписи довіри від співавторів
trust_model_helper_committer=Учасник: довірені підписи участників
@ -1066,7 +1111,7 @@ template.one_item=Слід обрати хоча б один елемент ша
template.invalid=Слід обрати шаблонний репозиторій
archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі.
archive.pull.nocomment=Це архівний репозитарій. Ви не можете коментувати пулл-реквести.
archive.pull.nocomment=Цей репозиторій архівовано. Ви не можете коментувати запити на злиття.
form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв.
form.reach_limit_of_creation_n=Ви досягли максимальної кількості %d створених репозиторіїв.
@ -1088,7 +1133,7 @@ migrate_items_merge_requests=Запити на об'єднання
migrate_items_releases=Релізи
migrate_repo=Перенести репозиторій
migrate.clone_address=Міграція / клонувати з URL-адреси
migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія
migrate.clone_address_desc=URL-адреса HTTP(S) або Git «clone» існуючого репозиторію
migrate.clone_local_path=або шлях до локального серверу
migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії.
migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
@ -1173,6 +1218,7 @@ file_copy_permalink=Копіювати постійне посилання
video_not_supported_in_browser=Ваш браузер не підтримує тег HTML5 «video».
audio_not_supported_in_browser=Ваш браузер не підтримує тег HTML5 «audio».
stored_lfs=Збережено з Git LFS
stored_annex=Збережено з Git Annex
symbolic_link=Символічне посилання
commit_graph=Графік комітів
commit_graph.select=Виберіть гілки
@ -1190,6 +1236,7 @@ editor.upload_file=Завантажити файл
editor.edit_file=Редагувати файл
editor.preview_changes=Попередній перегляд змін
editor.cannot_edit_lfs_files=Файли LFS не можна редагувати в веб-інтерфейсі.
editor.cannot_edit_annex_files=Файли Annex не можна редагувати в веб-інтерфейсі.
editor.cannot_edit_non_text_files=Бінарні файли не можливо редагувати у веб-інтерфейсі.
editor.edit_this_file=Редагувати файл
editor.this_file_locked=Файл заблоковано
@ -2070,7 +2117,7 @@ settings.lfs_findcommits=Знайти коміти
settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS
settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням
settings.lfs_delete=Видалити файл LFS з OID %s
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки "Об'єкт не існує" під час перевірки. Ви впевнені?
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки «Об'єкт не існує» під час перевірки. Ви впевнені?
settings.lfs_findpointerfiles=Знайти файли-посилання
settings.lfs_locks=Блокування
settings.lfs_invalid_locking_path=Неприпустимий шлях: %s
@ -2422,6 +2469,18 @@ editor.add_tmpl.filename = назва файлу
settings.unarchive.button = Розархівувати репозиторій
object_format = Формат об'єкта
settings.archive.mirrors_unavailable = Дзеркала недоступні в архівованих репозиторіях.
pulls.sign_in_require = <a href="%s">Увійдіть</a>, щоб створити новий запит на злиття.
new_advanced_expand = Натисніть, щоб розгорнути
new_from_template = Використати шаблон
new_advanced = Додаткові налаштування
auto_init_description = Почніть історію Git з README і за бажанням додайте файли License та .gitignore.
new_from_template_description = Можете вибрати наявний шаблон репозиторію на цьому екземплярі і застосувати його налаштування.
form.string_too_long = Довжина введеного рядка більша за %d символів.
form.name_reserved = Назву репозиторію «%s» зарезервовано.
form.name_pattern_not_allowed = Шаблон «%s» не допускається у назві репозиторію.
wiki.reserved_page = Назву вікі-сторінки «%s» зарезервовано.
settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується у вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати.
[graphs]
contributors.what = внески
@ -2543,6 +2602,8 @@ follow_blocked_user = Ви не можете стежити за цією орг
teams.invite.description = Щоб приєднатися до команди, натисніть кнопку нижче.
teams.invite.title = Вас запрошено приєднатися до команди <strong>%s</strong> в організації <strong>%s</strong>.
form.name_reserved = Назву організації «%s» зарезервовано.
[admin]
dashboard=Панель управління
users=Облікові записи користувачів
@ -2797,15 +2858,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2
auths.tip.oauth2_provider=Постачальник OAuth2
auths.tip.bitbucket=Створіть OAuth URI на сторінці %s
auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"`
auths.tip.dropbox=Додайте новий додаток на %s
auths.tip.facebook=`Створіть новий додаток на %s і додайте модуль "Facebook Login"`
auths.tip.github=Додайте OAuth додаток на %s
auths.tip.dropbox=Створіть новий додаток на %s
auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login»
auths.tip.github=Зареєструйте новий додаток OAuth на %s
auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications
auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s
auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) для автоматичної настройки входу OAuth
auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter»
auths.tip.discord=Зареєструйте новий додаток на %s
auths.tip.yandex=`Створіть нову програму в %s. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"`
auths.tip.yandex=Створіть новий додаток на %s. Виберіть наступні дозволи з «Yandex.Passport API»: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі»
auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням)
auths.edit=Редагувати джерело автентифікації
auths.activated=Це джерело авторизації активоване
@ -2830,7 +2891,7 @@ config.disable_router_log=Вимкнути логування роутеру
config.run_user=Користувач, від якого запустити
config.run_mode=Режим виконання
config.git_version=Версія Git
config.repo_root_path=Кореневий шлях репозиторія
config.repo_root_path=Шлях до кореня репозиторію
config.lfs_root_path=Кореневий шлях LFS
config.log_file_root_path=Шлях до лог файлу
config.script_type=Тип скрипта
@ -2953,7 +3014,7 @@ monitor.desc=Опис
monitor.start=Час початку
monitor.execute_time=Час виконання
monitor.process.cancel=Зупинити процес
monitor.process.cancel_desc=Зупинка процесу може призвести до втрати даних
monitor.process.cancel_desc=Скасування процесу може призвести до втрати даних
monitor.process.cancel_notices=Зупинити: <strong>%s</strong>?
monitor.process.children=Дочірні процеси
@ -3020,8 +3081,12 @@ monitor.queue.settings.desc = Пули динамічно зростають у
monitor.queue.settings.remove_all_items_done = Усі елементи в черзі видалено.
monitor.queue.settings.remove_all_items = Видалити всі
config.app_slogan = Гасло екземпляра
auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s
auths.tip.gitlab_new = Зареєструйте новий додаток на %s
users.reserved = Зарезервовано
[action]
create_repo=створив(ла) репозиторій <a href="%s">%s</a>
rename_repo=репозиторій перейменовано з <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
@ -3193,6 +3258,10 @@ rubygems.dependencies.development = Залежності розробки
npm.dependencies.optional = Необов'язкові залежності
container.images.title = Образи
settings.delete.description = Видалення пакунка є остаточним і його неможливо скасувати.
owner.settings.cleanuprules.keep.count.1 = 1 версію на пакунок
owner.settings.cleanuprules.keep.count.n = %d версій на пакунок
[secrets]
deletion = Видалити секрет
creation.success = Секрет «%s» додано.
@ -3307,7 +3376,7 @@ milestone_kind = Шукати віхи...
commit_kind = Шукати коментарі...
no_results = Не знайдено відповідних результатів.
keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту.
code_search_by_git_grep = Поточні результати пошуку коду надаються з "git grep". Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
package_kind = Шукати пакунки...
project_kind = Шукати проєкти...
branch_kind = Шукати гілки...

View file

@ -126,7 +126,7 @@ unpin=取消置顶
artifacts=制品
confirm_delete_artifact=您确定要删除制品“%s”吗
archived=
archived=
concept_system_global=全局
concept_user_individual=个人
@ -144,8 +144,8 @@ name=名称
value=
filter = 筛选
filter.clear = 清除筛选条件
filter.is_archived =
filter.not_archived =
filter.is_archived =
filter.not_archived =
filter.is_fork = 是派生
filter.not_fork = 不是派生
filter.is_mirror = 是镜像
@ -199,7 +199,7 @@ buttons.switch_to_legacy.tooltip=使用旧版编辑器
buttons.enable_monospace_font=启用等宽字体
buttons.disable_monospace_font=禁用等宽字体
buttons.unindent.tooltip = 解除一级嵌套条目
buttons.indent.tooltip = 解除一级嵌套条目
buttons.indent.tooltip = 嵌套一级条目
table_modal.header = 添加表格
table_modal.placeholder.header = 标题
table_modal.label.columns = 列数
@ -364,10 +364,10 @@ filter=其他过滤器
filter_by_team_repositories=按团队仓库筛选
feed_of=`"%s"的源`
show_archived=
show_both_archived_unarchived=显示已归档和未归档的
show_only_archived=只显示已档的
show_only_unarchived=只显示未档的
show_archived=
show_both_archived_unarchived=显示已存档和未存档的
show_only_archived=只显示已档的
show_only_unarchived=只显示未档的
show_private=私有库
show_both_private_public=同时显示公开的和私有的
@ -747,7 +747,7 @@ webauthn=两步验证(安全密钥)
public_profile=公开信息
biography_placeholder=向他人介绍一下你自己!(支持 Markdown
location_placeholder=与他人分享你的大概位置
profile_desc=控制您的个人资料对其他用户的显示方式。您的主要电子邮件地址将用于通知、密码恢复和基于网页界面的 Git 操作。
profile_desc=关于您
password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。
full_name=全名
website=个人网站
@ -838,7 +838,7 @@ add_email_success=新的电子邮件地址已添加。
email_preference_set_success=电子邮件首选项已成功设置。
add_openid_success=新的 OpenID 地址已添加。
keep_email_private=隐藏邮箱地址
keep_email_private_popup=这将从您的个人资料中隐藏您的电子邮件地址。它将不再是通过 Web 界面创建拉取请求的默认地址,如文件上传和编辑,也不会用于合并提交。相反,可以使用特殊地址 %s 将提交与您的账号相关联。请注意,更改此选项不会影响现有的提交。
keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。
openid_desc=OpenID 让你可以将认证转发到外部服务。
manage_ssh_keys=管理 SSH 密钥
@ -898,7 +898,7 @@ ssh_principal_deletion=删除 SSH 证书规则
ssh_key_deletion_desc=删除 SSH 公钥将取消对应的私钥对您的 Forgejo 帐户的访问权限。继续?
gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应私钥签名的提交,继续?
ssh_principal_deletion_desc=删除此 SSH 证书规则将取消它对您的账户的访问权限。继续?
ssh_key_deletion_success=GPG 密钥已被删除。
ssh_key_deletion_success=SSH 密钥已被删除。
gpg_key_deletion_success=GPG 密钥已被删除。
ssh_principal_deletion_success=此规则删除成功。
added_on=添加于 %s
@ -1049,11 +1049,13 @@ additional_repo_units_hint_description = 在所有存在未启用的功能的仓
update_hints_success = 提示更改成功。
pronouns_custom = 自定义
pronouns = 代词
pronouns_unspecified = 指定
pronouns_unspecified = 指定
language.title = 默认语言
keep_activity_private.description = 您的<a href="%s">公开活动</a>将仅对您和实例管理员可见。
language.description = 此语言将保存到您的账号中,并在您登录后用作默认语言。
language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!<a href="%s">了解更多</a>。
user_block_yourself = 您不能屏蔽自己。
pronouns_custom_label = 自定义代词
[repo]
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?<a href="%s">迁移仓库</a>。
@ -1102,7 +1104,7 @@ object_format_helper = 仓库的对象格式一旦设置无法更改。SHA1
readme=自述
readme_helper=选择自述文件模板
readme_helper_desc=这是您可以为您的项目撰写完整描述的地方。
auto_init=初始化仓库(添加 .gitignore、许可证和自述文件)
auto_init=初始化仓库
trust_model_helper=选择签名验证的“信任模型”。可能的选项是:
trust_model_helper_collaborator=协作者:信任协作者的签名
trust_model_helper_committer=提交者:信任与提交者相符的签名
@ -1142,7 +1144,7 @@ adopt_preexisting_label=收录文件
adopt_preexisting=收录已存在的仓库
adopt_preexisting_content=从 %s 创建仓库
adopt_preexisting_success=从 %s 收录仓库成功
delete_preexisting_label=
delete_preexisting_label=
delete_preexisting=删除已存在的文件
delete_preexisting_content=删除 %s 中的文件
delete_preexisting_success=删除 %s 中未收录的文件
@ -1179,10 +1181,10 @@ template.issue_labels=工单标签
template.one_item=必须至少选择一个模板项
template.invalid=必须选择一个模板仓库
archive.title=该仓库已被归档。您可以查看文件和克隆它,但不能推送、创建工单或合并请求。
archive.title_date=该仓库已于 %s 档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
archive.issue.nocomment=此仓库已存档,您不能在工单添加评论。
archive.pull.nocomment=此仓库已存档,您不能在合并请求添加评论。
archive.title=此仓库已存档。您可以查看文件和克隆仓库,但不能推送、创建工单或合并请求。
archive.title_date=该仓库已于 %s 档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
archive.issue.nocomment=此仓库已存档,您不能在工单添加评论。
archive.pull.nocomment=此仓库已存档,您不能在合并请求添加评论。
form.reach_limit_of_creation_1=你已经达到了 %d 仓库的上限。
form.reach_limit_of_creation_n=你已经达到了 %d 个仓库的上限。
@ -1315,6 +1317,7 @@ view_git_blame=查看 Git Blame
video_not_supported_in_browser=您的浏览器不支持 HTML5 “video” 标签。
audio_not_supported_in_browser=您的浏览器不支持 HTML5 “audio” 标签。
stored_lfs=存储到Git LFS
stored_annex=存储到Git Annex
symbolic_link=符号链接
executable_file=可执行文件
vendored = Vendored
@ -1340,6 +1343,7 @@ editor.upload_file=上传文件
editor.edit_file=编辑文件
editor.preview_changes=预览变更
editor.cannot_edit_lfs_files=无法在 web 界面中编辑 lfs 文件。
editor.cannot_edit_annex_files=无法在 web 界面中编辑 lfs 文件。
editor.cannot_edit_non_text_files=网页不能编辑二进制文件。
editor.edit_this_file=编辑文件
editor.this_file_locked=文件已锁定
@ -1610,18 +1614,18 @@ issues.context.copy_link=复制链接
issues.context.quote_reply=引用回复
issues.context.reference_issue=在新工单中引用
issues.context.edit=编辑
issues.context.delete=
issues.context.delete=
issues.no_content=没有提供说明。
issues.close=关闭工单
issues.close=关闭
issues.comment_pull_merged_at=已合并提交 %[1]s 到 %[2]s %[3]s
issues.comment_manually_pull_merged_at=手动合并提交 %[1]s 到 %[2]s %[3]s
issues.close_comment_issue=评论并关闭
issues.reopen_issue=重新开放
issues.reopen_comment_issue=重新打开评论
issues.create_comment=评论
issues.closed_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 关闭此工单`
issues.closed_at=`于<a id="%[1]s" href="#%[1]s">%[2]s</a>关闭此工单`
issues.reopened_at=`重新打开此问题 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 在代码提交中引用了该工单`
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 id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">从合并请求 %[4]s引用了此工单将关闭此工单</a>`
@ -1655,7 +1659,7 @@ issues.label_title=标签名称
issues.label_description=标签描述
issues.label_color=标签颜色
issues.label_exclusive=独有
issues.label_archive=档标签
issues.label_archive=档标签
issues.label_archived_filter=显示存档标签
issues.label_archive_tooltip=在标签搜索时,默认情况下存档标签将被排除在外。
issues.label_exclusive_desc=命名标签为 <code>scope/item</code> 以使其与其他以 <code>scope/</code> 开头的标签互斥。
@ -1933,7 +1937,7 @@ pulls.update_branch_success=分支更新成功
pulls.update_not_allowed=您无权更新分支
pulls.outdated_with_base_branch=此分支相比基础分支已过期
pulls.close=关闭
pulls.closed_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 关闭此合并请求 `
pulls.closed_at=`于<a id="%[1]s" href="#%[1]s">%[2]s</a>关闭此合并请求 `
pulls.reopened_at=`重新打开此合并请求 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.cmd_instruction_hint=查看命令行说明
pulls.cmd_instruction_checkout_title=检出
@ -2053,12 +2057,12 @@ activity.merged_prs_count_1=已合并的合并请求
activity.merged_prs_count_n=已合并的合并请求
activity.opened_prs_count_1=新合并请求
activity.opened_prs_count_n=新合并请求
activity.title.user_1=%d 用户
activity.title.user_n=%d 用户
activity.title.user_1=%d 用户
activity.title.user_n=%d 用户
activity.title.prs_1=%d 个合并请求
activity.title.prs_n=%d 个合并请求
activity.title.prs_merged_by=%[2]s 由 %[1]s 合并
activity.title.prs_opened_by=%[2]s 创建了 %[1]s
activity.title.prs_merged_by=%[2]s 共合并了 %[1]s
activity.title.prs_opened_by=%[2]s 创建了 %[1]s
activity.merged_prs_label=已合并
activity.opened_prs_label=已创建
activity.active_issues_count_1=<strong>%d</strong> 项活动的工单
@ -2067,8 +2071,8 @@ activity.closed_issues_count_1=已关闭的工单
activity.closed_issues_count_n=已关闭的工单
activity.title.issues_1=%d 项工单
activity.title.issues_n=%d 项工单
activity.title.issues_closed_from=%s 从 %s 被关闭
activity.title.issues_created_by=%[2]s 创建了 %[1]s
activity.title.issues_closed_from=%[2]s 共关闭了 %[1]s
activity.title.issues_created_by=%[2]s 创建了 %[1]s
activity.closed_issue_label=已关闭
activity.new_issues_count_1=新工单
activity.new_issues_count_n=新工单
@ -2079,29 +2083,29 @@ activity.unresolved_conv_desc=这些最近更新的工单和合并请求还没
activity.unresolved_conv_label=打开
activity.title.releases_1=%d 个版本发布
activity.title.releases_n=%d 个版本发布
activity.title.releases_published_by=%[2]s 发布了 %[1]s
activity.title.releases_published_by=%[2]s 发布了 %[1]s
activity.published_release_label=版本发布
activity.no_git_activity=在此期间没有任何提交活动。
activity.git_stats_exclude_merges=排除合并
activity.git_stats_author_1=%d 作者
activity.git_stats_author_n=%d 作者
activity.git_stats_pushed_1=已经推送
activity.git_stats_pushed_n=已经推送
activity.git_stats_commit_1=%d 提交
activity.git_stats_commit_n=%d 提交
activity.git_stats_exclude_merges=除去合并提交以外
activity.git_stats_author_1=%d 作者
activity.git_stats_author_n=%d 作者
activity.git_stats_pushed_1=总共推送了
activity.git_stats_pushed_n=总共推送了
activity.git_stats_commit_1=%d 提交
activity.git_stats_commit_n=%d 提交
activity.git_stats_push_to_branch=到 %s 和
activity.git_stats_push_to_all_branches=到所有分支。
activity.git_stats_on_default_branch=在 %s 上,
activity.git_stats_file_1=%d 文件
activity.git_stats_file_n=%d 文件
activity.git_stats_files_changed_1=已经改变
activity.git_stats_files_changed_n=已经改变
activity.git_stats_additions=而且
activity.git_stats_addition_1=新增 %d 行
activity.git_stats_addition_n=新增 %d 行
activity.git_stats_and_deletions=
activity.git_stats_deletion_1=删除 %d 行
activity.git_stats_deletion_n=删除 %d 行
activity.git_stats_on_default_branch=在 %s 分支上,
activity.git_stats_file_1=%d 文件
activity.git_stats_file_n=%d 文件
activity.git_stats_files_changed_1=被改动
activity.git_stats_files_changed_n=被改动
activity.git_stats_additions=,总共
activity.git_stats_addition_1=新增 %d 行
activity.git_stats_addition_n=新增 %d 行
activity.git_stats_and_deletions=并有
activity.git_stats_deletion_1=%d 行被删除
activity.git_stats_deletion_n=%d 行被删除
contributors.contribution_type.filter_label=贡献类型:
contributors.contribution_type.commits=提交
@ -2178,7 +2182,7 @@ settings.external_tracker_url=外部工单系统 URL
settings.external_tracker_url_error=外部百科链接无效。
settings.external_tracker_url_desc=当点击工单标签时访问者将被重定向到外部工单系统的URL。
settings.tracker_url_format=外部工单系统的 URL 格式
settings.tracker_url_format_error=外部工单追踪器链接无效
settings.tracker_url_format_error=外部工单追踪器链接无效
settings.tracker_issue_style=外部工单系统的编号格式
settings.tracker_issue_style.numeric=纯数字形式
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
@ -2322,7 +2326,7 @@ settings.event_choose=自定义事件…
settings.event_header_repository=仓库事件
settings.event_create=创建
settings.event_create_desc=创建分支或标签。
settings.event_delete=
settings.event_delete=
settings.event_delete_desc=分支或标签已删除。
settings.event_fork=派生
settings.event_fork_desc=仓库被派生。
@ -2505,20 +2509,20 @@ settings.thread_id=线程 ID
settings.matrix.homeserver_url=主服务器网址
settings.matrix.room_id=房间ID
settings.matrix.message_type=消息类型
settings.archive.button=档仓库
settings.archive.header=档此仓库
settings.archive.text=档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
settings.archive.success=仓库已成功档。
settings.archive.error=仓库在档时出现异常。请通过日志获取详细信息。
settings.archive.error_ismirror=不能档镜像仓库。
settings.archive.branchsettings_unavailable=分支设置对已档的仓库不可用。
settings.archive.tagsettings_unavailable=标签设置对已档的仓库不可用。
settings.archive.mirrors_unavailable = 镜像对已档的仓库不可用。
settings.unarchive.button=撤销仓库
settings.unarchive.header=撤销此仓库
settings.unarchive.text=撤销档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
settings.unarchive.success=仓库已成功撤销档。
settings.unarchive.error=仓库在取消档时出现异常。请通过日志获取详细信息。
settings.archive.button=档仓库
settings.archive.header=档此仓库
settings.archive.text=档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
settings.archive.success=仓库已成功档。
settings.archive.error=仓库在档时出现异常。请通过日志获取详细信息。
settings.archive.error_ismirror=不能档镜像仓库。
settings.archive.branchsettings_unavailable=分支设置对已档的仓库不可用。
settings.archive.tagsettings_unavailable=标签设置对已档的仓库不可用。
settings.archive.mirrors_unavailable = 镜像对已档的仓库不可用。
settings.unarchive.button=撤销仓库
settings.unarchive.header=撤销此仓库
settings.unarchive.text=撤销档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
settings.unarchive.success=仓库已成功撤销档。
settings.unarchive.error=仓库在取消档时出现异常。请通过日志获取详细信息。
settings.update_avatar_success=仓库头像已经更新。
settings.lfs=LFS
settings.lfs_filelist=存储在此仓库中的 LFS 文件
@ -2659,7 +2663,7 @@ release.tags_for=%s 的标签
branch.name=分支名称
branch.already_exists=名为 %s 的分支已存在。
branch.delete_head=
branch.delete_head=
branch.delete=删除分支 "%s"
branch.delete_html=删除分支
branch.delete_desc=删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
@ -2750,7 +2754,7 @@ pulls.made_using_agit = AGit
activity.navbar.pulse = 动态
activity.navbar.code_frequency = 代码频率
activity.navbar.recent_commits = 近期提交
pulls.agit_explanation = 该合并请求是用 AGit 创建的。AGit 是一种可以让贡献者直接通过 “git push” 提出更改代码而不需要派生或建立新分支
pulls.agit_explanation = 该合并请求是用 AGit 工作流创建的。使用 AGit贡献者无需派生或创建分支就可以直接通过 “git push” 提出更改代码
error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 <a target="_blank" rel="noreferrer" href="%s">此文档</a>来修复这些问题,然后推送一些提交来刷新状态。
pulls.merged_title_desc_one = 已将来自 <code>%[2]s</code> 的 %[1]d 提交合并入 <code>%[3]s</code> %[4]s
commits.search_branch = 此分支
@ -2767,7 +2771,7 @@ n_tag_one = %s 标签
n_tag_few = %s 标签
editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。
issues.num_participants_one = %d 位参与者
issues.archived_label_description = (已档)%s
issues.archived_label_description = (已档)%s
editor.push_out_of_date = 推送似乎已过期。
settings.enforce_on_admins = 对仓库的管理员适用该规则
settings.enforce_on_admins_desc = 使仓库管理员也须遵守此规则。
@ -2802,7 +2806,7 @@ issues.edit.already_changed = 无法保存对工单的更改。工单似乎已
pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
subscribe.issue.guest.tooltip = 登录以订阅工单。
subscribe.pull.guest.tooltip = 登录以订阅此拉取请求。
subscribe.pull.guest.tooltip = 登录以订阅此合并请求。
settings.federation_following_repos = 关注的仓库URL地址多个地址以 “;” 分隔,不需要前后空格。
settings.federation_settings = 邦联设置
settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。
@ -2849,9 +2853,25 @@ issues.num_reviews_one = %d 评审
issues.num_reviews_few = %d 评审
issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的工单的摘要卡片
editor.add_tmpl.filename = 文件名
settings.default_update_style_desc = 用于更新落后于基础分支的合并请求的默认更新样式。
pulls.sign_in_require = <a href="%s">登录</a>以创建新的合并请求。
new_from_template = 使用模板
new_from_template_description = 您可以选择此实例上现有仓库模板并应用其设置。
new_advanced = 高级设置
new_advanced_expand = 单击展开
auto_init_description = 以一个自述文件、可选的许可证与 .gitignore 文件开始Git历史。
issues.reaction.add = 添加回应
issues.reaction.alt_few = %[1]s 回应了 %[2]s。
issues.reaction.alt_many = %[1]s 和另外 %[2]d 人回应了 %[3]s。
issues.reaction.alt_remove = 从评论中移除 %[1] 回应。
issues.context.menu = 评论菜单
issues.reaction.alt_add = 对评论添加 %[1]s 回应。
summary_card_alt = 仓库 %s 的摘要卡片
release.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的版本发布的摘要卡片
[graphs]
component_loading=正在加载 %s...
component_loading=正在加载 %s
component_loading_failed=无法加载 %s
component_loading_info=这可能需要一点…
component_failed_to_load=意外的错误发生了。
@ -3807,7 +3827,7 @@ secrets=密钥
description=Secrets 将被传给特定的 Actions其它情况将不能读取
none=还没有密钥。
creation=添加密钥
creation.name_placeholder=不区分大小写,字母数字或下划线不能以GITEA_ 或 GITHUB_ 开头
creation.name_placeholder=不区分大小写,只能包含英文字母数字或下划线不能以 GITEA_ 或 GITHUB_ 开头
creation.value_placeholder=输入任何内容,开头和结尾的空白都会被省略
creation.success=您的密钥 '%s' 添加成功。
creation.failed=添加密钥失败。
@ -3832,8 +3852,8 @@ status.skipped=已忽略
status.blocked=阻塞中
runners=运行器
runners.runner_manage_panel=管理 Runners
runners.new=创建 Runner
runners.runner_manage_panel=管理运行器
runners.new=创建新运行器
runners.new_notice=如何启动一个运行器
runners.status=状态
runners.id=ID
@ -3911,7 +3931,7 @@ variables.update.success=该变量已被编辑。
runs.workflow = 工作流
runs.no_job_without_needs = 工作流必须至少包含一组没有依赖的作业。
runs.no_job = 工作流必须至少包含一个作业
workflow.dispatch.trigger_found = 此工作流有一个 <c>workflow_dispatch</c> 事件触发。
workflow.dispatch.trigger_found = 此工作流有 <c>workflow_dispatch</c> 事件触发
workflow.dispatch.use_from = 使用工作流
workflow.dispatch.invalid_input_type = 输入类型“%s”无效。
workflow.dispatch.warn_input_limit = 仅显示前 %d 个输入。
@ -3940,18 +3960,18 @@ submodule=子模块
[search]
keyword_search_unavailable = 关键词搜索目前不可用,请联系站点管理员。
search = 搜索...
repo_kind = 搜索仓库...
user_kind = 搜索用户...
org_kind = 搜索组织...
team_kind = 搜索团队...
code_kind = 搜索代码...
search = 搜索
repo_kind = 搜索仓库
user_kind = 搜索用户
org_kind = 搜索组织
team_kind = 搜索团队
code_kind = 搜索代码
code_search_unavailable = 代码搜索目前不可用,请联系站点管理员。
package_kind = 搜索软件包...
project_kind = 搜索项目...
branch_kind = 搜索分支...
commit_kind = 搜索提交...
runner_kind = 搜索Runners...
package_kind = 搜索软件包
project_kind = 搜索项目
branch_kind = 搜索分支
commit_kind = 搜索提交
runner_kind = 搜索运行器…
no_results = 未找到匹配的结果。
type_tooltip = 搜索类型
fuzzy = 模糊
@ -3960,8 +3980,8 @@ match = 匹配
match_tooltip = 仅包含与搜索词完全匹配的结果
fuzzy_tooltip = 在搜索结果中包含与搜索词相近的项目
exact = 精确
issue_kind = 搜索工单...
pull_kind = 搜索合并请求...
issue_kind = 搜索工单
pull_kind = 搜索合并请求
exact_tooltip = 仅包含与搜索词精确匹配的结果
milestone_kind = 搜索里程碑…
union_tooltip = 包括与任何空格分隔的关键字匹配的结果

View file

@ -472,6 +472,7 @@ file_view_raw=查看原始文件
file_permalink=永久連結
stored_lfs=儲存到到 Git LFS
stored_annex=儲存到到 Git Annex
editor.preview_changes=預覽更改
editor.or=
@ -1132,4 +1133,4 @@ runners.labels = 標籤
[projects]
[git.filemode]
[git.filemode]

View file

@ -1263,6 +1263,7 @@ view_git_blame=檢視 Git Blame
video_not_supported_in_browser=您的瀏覽器不支援 HTML5 的「video」標籤。
audio_not_supported_in_browser=您的瀏覽器不支援 HTML5 的「audio」標籤。
stored_lfs=已使用 Git LFS 儲存
stored_annex=已使用 Git Annex 儲存
symbolic_link=符號連結
commit_graph=提交線圖
commit_graph.select=選擇分支
@ -1282,6 +1283,7 @@ editor.upload_file=上傳檔案
editor.edit_file=編輯檔案
editor.preview_changes=預覽變更
editor.cannot_edit_lfs_files=無法在 web 介面中編輯 LFS 檔。
editor.cannot_edit_annex_files=無法在 web 介面中編輯 Annex 檔。
editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案。
editor.edit_this_file=編輯檔案
editor.this_file_locked=檔案已被鎖定

12
package-lock.json generated
View file

@ -1,5 +1,5 @@
{
"name": "forgejo",
"name": "forgejo-aneksajo",
"lockfileVersion": 3,
"requires": true,
"packages": {
@ -28,7 +28,7 @@
"escape-goat": "4.0.0",
"fast-glob": "3.3.2",
"htmx.org": "1.9.12",
"idiomorph": "0.4.0",
"idiomorph": "0.3.0",
"jquery": "3.7.1",
"katex": "0.16.18",
"mermaid": "11.4.1",
@ -9314,10 +9314,10 @@
}
},
"node_modules/idiomorph": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.4.0.tgz",
"integrity": "sha512-VdXFpZOTXhLatJmhCWJR5oQKLXT01O6sFCJqT0/EqG71C4tYZdPJ5etvttwWsT2WKRYWz160XkNr1DUqXNMZHg==",
"license": "BSD-2-Clause"
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.3.0.tgz",
"integrity": "sha512-UhV1Ey5xCxIwR9B+OgIjQa+1Jx99XQ1vQHUsKBU1RpQzCx1u+b+N6SOXgf5mEJDqemUI/ffccu6+71l2mJUsRA==",
"license": "BSD 2-Clause"
},
"node_modules/ieee754": {
"version": "1.2.1",

View file

@ -27,7 +27,7 @@
"escape-goat": "4.0.0",
"fast-glob": "3.3.2",
"htmx.org": "1.9.12",
"idiomorph": "0.4.0",
"idiomorph": "0.3.0",
"jquery": "3.7.1",
"katex": "0.16.18",
"mermaid": "11.4.1",

View file

@ -24,6 +24,7 @@ import (
"code.gitea.io/gitea/modules/log"
packages_module "code.gitea.io/gitea/modules/packages"
maven_module "code.gitea.io/gitea/modules/packages/maven"
"code.gitea.io/gitea/modules/sync"
"code.gitea.io/gitea/routers/api/packages/helper"
"code.gitea.io/gitea/services/context"
packages_service "code.gitea.io/gitea/services/packages"
@ -228,6 +229,8 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool
helper.ServePackageFile(ctx, s, u, pf, opts)
}
var mavenUploadLock = sync.NewExclusivePool()
// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
func UploadPackageFile(ctx *context.Context) {
params, err := extractPathParameters(ctx)
@ -246,6 +249,9 @@ func UploadPackageFile(ctx *context.Context) {
packageName := params.GroupID + "-" + params.ArtifactID
mavenUploadLock.CheckIn(packageName)
defer mavenUploadLock.CheckOut(packageName)
buf, err := packages_module.CreateHashedBufferFromReader(ctx.Req.Body)
if err != nil {
apiError(ctx, http.StatusInternalServerError, err)

View file

@ -350,6 +350,9 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
labelIDs = append(labelIDs, int64(rv.Float()))
case reflect.String:
labelNames = append(labelNames, rv.String())
default:
ctx.Error(http.StatusBadRequest, "InvalidLabel", "a label must be an integer or a string")
return nil, nil, fmt.Errorf("invalid label")
}
}
if len(labelIDs) > 0 && len(labelNames) > 0 {
@ -357,11 +360,20 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
return nil, nil, fmt.Errorf("invalid labels")
}
if len(labelNames) > 0 {
labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
repoLabelIDs, err := issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err)
return nil, nil, err
}
labelIDs = append(labelIDs, repoLabelIDs...)
if ctx.Repo.Owner.IsOrganization() {
orgLabelIDs, err := issues_model.GetLabelIDsInOrgByNames(ctx, ctx.Repo.Owner.ID, labelNames)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetLabelIDsInOrgByNames", err)
return nil, nil, err
}
labelIDs = append(labelIDs, orgLabelIDs...)
}
}
labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive")

View file

@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/models"
asymkey_model "code.gitea.io/gitea/models/asymkey"
authmodel "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/eventsource"
"code.gitea.io/gitea/modules/git"
@ -167,6 +168,8 @@ func InitWebInstalled(ctx context.Context) {
actions_service.Init()
mustInit(annex.Init)
// Finally start up the cron
cron.NewContext(ctx)
}

View file

@ -81,12 +81,14 @@ func ServCommand(ctx *context.PrivateContext) {
ownerName := ctx.Params(":owner")
repoName := ctx.Params(":repo")
mode := perm.AccessMode(ctx.FormInt("mode"))
verbs := ctx.FormStrings("verb")
// Set the basic parts of the results to return
results := private.ServCommandResults{
RepoName: repoName,
OwnerName: ownerName,
KeyID: keyID,
UserMode: perm.AccessModeNone,
}
// Now because we're not translating things properly let's just default some English strings here
@ -287,8 +289,10 @@ func ServCommand(ctx *context.PrivateContext) {
repo.IsPrivate ||
owner.Visibility.IsPrivate() ||
(user != nil && user.IsRestricted) || // user will be nil if the key is a deploykey
(setting.Annex.Enabled && len(verbs) > 0 && verbs[0] == "git-annex-shell") || // git-annex has its own permission enforcement, for which we expose results.UserMode
setting.Service.RequireSignInView) {
if key.Type == asymkey_model.KeyTypeDeploy {
results.UserMode = deployKey.Mode
if deployKey.Mode < mode {
ctx.JSON(http.StatusUnauthorized, private.Response{
UserMsg: fmt.Sprintf("Deploy Key: %d:%s is not authorized to %s %s/%s.", key.ID, key.Name, modeString, results.OwnerName, results.RepoName),
@ -310,9 +314,9 @@ func ServCommand(ctx *context.PrivateContext) {
return
}
userMode := perm.UnitAccessMode(unitType)
results.UserMode = perm.UnitAccessMode(unitType)
if userMode < mode {
if results.UserMode < mode {
log.Warn("Failed authentication attempt for %s with key %s (not authorized to %s %s/%s) from %s", user.Name, key.Name, modeString, ownerName, repoName, ctx.RemoteAddr())
ctx.JSON(http.StatusUnauthorized, private.Response{
UserMsg: fmt.Sprintf("User: %d:%s with Key: %d:%s is not authorized to %s %s/%s.", user.ID, user.Name, key.ID, key.Name, modeString, ownerName, repoName),
@ -353,6 +357,7 @@ func ServCommand(ctx *context.PrivateContext) {
})
return
}
results.UserMode = perm.AccessModeWrite
results.RepoID = repo.ID
}
@ -381,13 +386,14 @@ func ServCommand(ctx *context.PrivateContext) {
return
}
}
log.Debug("Serv Results:\nIsWiki: %t\nDeployKeyID: %d\nKeyID: %d\tKeyName: %s\nUserName: %s\nUserID: %d\nOwnerName: %s\nRepoName: %s\nRepoID: %d",
log.Debug("Serv Results:\nIsWiki: %t\nDeployKeyID: %d\nKeyID: %d\tKeyName: %s\nUserName: %s\nUserID: %d\nUserMode: %d\nOwnerName: %s\nRepoName: %s\nRepoID: %d",
results.IsWiki,
results.DeployKeyID,
results.KeyID,
results.KeyName,
results.UserName,
results.UserID,
results.UserMode,
results.OwnerName,
results.RepoName,
results.RepoID)

146
routers/web/repo/annex.go Normal file
View file

@ -0,0 +1,146 @@
package repo
import (
"context"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
"os/exec"
"strings"
"syscall"
"time"
"code.gitea.io/gitea/models/perm"
access_model "code.gitea.io/gitea/models/perm/access"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
services_context "code.gitea.io/gitea/services/context"
)
type p2phttpRecordType struct {
CancelFunc func()
LastUsed time.Time
Port string
}
var p2phttpRecords = make(map[string]*p2phttpRecordType)
// AnnexP2PHTTP implements git-annex smart HTTP support by delegating to git annex p2phttp
func AnnexP2PHTTP(ctx *services_context.Context) {
uuid := ctx.Params(":uuid")
repoPath, err := annex.UUID2RepoPath(uuid)
if err != nil {
ctx.PlainText(http.StatusNotFound, "Repository not found")
return
}
parts := strings.Split(repoPath, "/")
repoName := strings.TrimSuffix(parts[len(parts)-1], ".git")
owner := parts[len(parts)-2]
repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, repoName)
if err != nil {
ctx.PlainText(http.StatusNotFound, "Repository not found")
return
}
p, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if !(ctx.Req.Method == "GET" && p.CanAccess(perm.AccessModeRead, unit.TypeCode) ||
ctx.Req.Method == "POST" && p.CanAccess(perm.AccessModeWrite, unit.TypeCode) ||
ctx.Req.Method == "POST" && strings.HasSuffix(ctx.Req.URL.Path, "/checkpresent") && p.CanAccess(perm.AccessModeRead, unit.TypeCode) ||
ctx.Req.Method == "POST" && strings.HasSuffix(ctx.Req.URL.Path, "/keeplocked") ||
ctx.Req.Method == "POST" && strings.HasSuffix(ctx.Req.URL.Path, "/lockcontent")) {
// GET requests require at least read access; POST requests for
// anything but checkpresent, lockcontent, and keeplocked
// require write permissions; POST requests for checkpresent
// only require read permissions, as it really is just a read.
// POST requests for lockcontent and keeplocked require no
// authentication at all, as is also the case for the
// authentication in the git-annex-p2phttp server. See
// https://git-annex.branchable.com/bugs/p2phttp__58___drop_difference_wideopen_unauth-readonly/
// for reasoning.
ctx.Resp.WriteHeader(http.StatusUnauthorized)
return
}
p2phttpRecord, p2phttpProcessExists := p2phttpRecords[uuid]
if p2phttpProcessExists {
p2phttpRecord.LastUsed = time.Now()
} else {
// Start a new p2phttp process for the requested repository
// There is a race condition here with the port selection, ideally git annex p2phttp could just listen on a unix socket...
lis, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
log.Error("Failed to listen on a free port: %v", err)
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
hopefullyFreePort := strings.SplitN(lis.Addr().String(), ":", 2)[1]
lis.Close()
p2phttpCtx, p2phttpCtxCancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
cmd := exec.CommandContext(ctx, "git", "-C", repoPath, "annex", "p2phttp", "-J2", "--bind", "127.0.0.1", "--wideopen", "--port", hopefullyFreePort)
cmd.SysProcAttr = &syscall.SysProcAttr{
Pdeathsig: syscall.SIGINT,
}
cmd.Cancel = func() error { return cmd.Process.Signal(os.Interrupt) }
_ = cmd.Run()
}(p2phttpCtx)
graceful.GetManager().RunAtTerminate(p2phttpCtxCancel)
// Wait for the p2phttp server to get ready
start := time.Now()
sleepDuration := 1 * time.Millisecond
for {
if time.Since(start) > 5*time.Second {
p2phttpCtxCancel()
log.Error("Failed to start the p2phttp server in a reasonable amount of time")
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
conn, err := net.Dial("tcp", "127.0.0.1:"+hopefullyFreePort)
if err == nil {
conn.Close()
break
}
time.Sleep(sleepDuration)
sleepDuration *= 2
if sleepDuration > 1*time.Second {
sleepDuration = 1 * time.Second
}
}
p2phttpRecord = &p2phttpRecordType{CancelFunc: p2phttpCtxCancel, LastUsed: time.Now(), Port: hopefullyFreePort}
p2phttpRecords[uuid] = p2phttpRecord
}
// Cleanup p2phttp processes that haven't been used for a while
for uuid, record := range p2phttpRecords {
if time.Since(record.LastUsed) > 5*time.Minute {
record.CancelFunc()
delete(p2phttpRecords, uuid)
}
}
url, err := url.Parse("http://127.0.0.1:" + p2phttpRecord.Port + strings.TrimPrefix(ctx.Req.RequestURI, "/git-annex-p2phttp"))
if err != nil {
log.Error("Failed to parse URL: %v", err)
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
proxy := httputil.ReverseProxy{
Rewrite: func(r *httputil.ProxyRequest) {
r.Out.URL = url
},
}
proxy.ServeHTTP(ctx.Resp, ctx.Req)
}

526
routers/web/repo/card.go Normal file
View file

@ -0,0 +1,526 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package repo
import (
"bytes"
"encoding/hex"
"fmt"
"image"
"image/color"
"image/png"
"net/http"
"strconv"
"strings"
"time"
"code.gitea.io/gitea/models/db"
issue_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/card"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/services/context"
)
// drawUser draws a user avatar in a summary card
func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
if user.UseCustomAvatar {
posterAvatarPath := user.CustomAvatarRelativePath()
if posterAvatarPath != "" {
userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
if err != nil {
return err
}
userAvatarImage, _, err := image.Decode(userAvatarFile)
if err != nil {
return err
}
card.DrawImage(userAvatarImage)
}
} else {
posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
card.DrawExternalImage(posterAvatarLink)
}
return nil
}
// drawRepoIcon draws the repo icon in a summary card
func drawRepoIcon(ctx *context.Context, card *card.Card, repo *repo_model.Repository) error {
repoAvatarPath := repo.CustomAvatarRelativePath()
if repoAvatarPath != "" {
repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
if err != nil {
return err
}
repoAvatarImage, _, err := image.Decode(repoAvatarFile)
if err != nil {
return err
}
card.DrawImage(repoAvatarImage)
return nil
}
// If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
err := repo.LoadOwner(ctx)
if err != nil {
return err
}
if repo.Owner != nil {
err = drawUser(ctx, card, repo.Owner)
if err != nil {
return err
}
}
return nil
}
// hexToColor converts a hex color to a go color
func hexToColor(colorStr string) (*color.RGBA, error) {
colorStr = strings.TrimLeft(colorStr, "#")
b, err := hex.DecodeString(colorStr)
if err != nil {
return nil, err
}
if len(b) < 3 {
return nil, fmt.Errorf("expected at least 3 bytes from DecodeString, got %d", len(b))
}
color := color.RGBA{b[0], b[1], b[2], 255}
return &color, nil
}
func drawLanguagesCard(ctx *context.Context, card *card.Card) error {
languageList, err := repo_model.GetTopLanguageStats(ctx, ctx.Repo.Repository, 5)
if err != nil {
return err
}
if len(languageList) == 0 {
card.DrawRect(0, 0, card.Width, card.Height, color.White)
return nil
}
currentX := 0
var langColor *color.RGBA
for _, lang := range languageList {
langColor, err = hexToColor(lang.Color)
if err != nil {
return err
}
langWidth := float32(card.Width) * (lang.Percentage / 100)
card.DrawRect(currentX, 0, currentX+int(langWidth), card.Width, langColor)
currentX += int(langWidth)
}
if currentX < card.Width {
card.DrawRect(currentX, 0, card.Width, card.Height, langColor)
}
return nil
}
func drawRepoSummaryCard(ctx *context.Context, repo *repo_model.Repository) (*card.Card, error) {
width, height := card.DefaultSize()
mainCard, err := card.NewCard(width, height)
if err != nil {
return nil, err
}
contentCard, languageBarCard := mainCard.Split(false, 90)
contentCard.SetMargin(60)
topSection, bottomSection := contentCard.Split(false, 75)
issueSummary, issueIcon := topSection.Split(true, 80)
repoInfo, issueDescription := issueSummary.Split(false, 30)
repoInfo.SetMargin(10)
_, err = repoInfo.DrawText(repo.FullName(), color.Black, 56, card.Top, card.Left)
if err != nil {
return nil, err
}
issueDescription.SetMargin(10)
_, err = issueDescription.DrawText(repo.Description, color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
issueIcon.SetMargin(10)
err = drawRepoIcon(ctx, issueIcon, repo)
if err != nil {
return nil, err
}
topCountCard, bottomCountCard := bottomSection.Split(false, 50)
releaseCount, err := db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{
// only show draft releases for users who can write, read-only users shouldn't see draft releases.
IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases),
RepoID: ctx.Repo.Repository.ID,
})
if err != nil {
return nil, err
}
starsText := ctx.Locale.TrN(
repo.NumStars,
"explore.stars_one",
"explore.stars_few",
repo.NumStars,
)
forksText := ctx.Locale.TrN(
repo.NumForks,
"explore.forks_one",
"explore.forks_few",
repo.NumForks,
)
releasesText := ctx.Locale.TrN(
releaseCount,
"repo.activity.title.releases_1",
"repo.activity.title.releases_n",
releaseCount,
)
topCountText := fmt.Sprintf("%s • %s • %s", starsText, forksText, releasesText)
topCountCard.SetMargin(10)
_, err = topCountCard.DrawText(topCountText, color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
issuesText := ctx.Locale.TrN(
repo.NumOpenIssues,
"repo.activity.title.issues_1",
"repo.activity.title.issues_n",
repo.NumOpenIssues,
)
pullRequestsText := ctx.Locale.TrN(
repo.NumOpenPulls,
"repo.activity.title.prs_1",
"repo.activity.title.prs_n",
repo.NumOpenPulls,
)
bottomCountText := fmt.Sprintf("%s • %s", issuesText, pullRequestsText)
bottomCountCard.SetMargin(10)
_, err = bottomCountCard.DrawText(bottomCountText, color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
err = drawLanguagesCard(ctx, languageBarCard)
if err != nil {
return nil, err
}
return mainCard, nil
}
func drawIssueSummaryCard(ctx *context.Context, issue *issue_model.Issue) (*card.Card, error) {
width, height := card.DefaultSize()
mainCard, err := card.NewCard(width, height)
if err != nil {
return nil, err
}
mainCard.SetMargin(60)
topSection, bottomSection := mainCard.Split(false, 75)
issueSummary, issueIcon := topSection.Split(true, 80)
repoInfo, issueDescription := issueSummary.Split(false, 15)
repoInfo.SetMargin(10)
_, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
issueDescription.SetMargin(10)
_, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
if err != nil {
return nil, err
}
issueIcon.SetMargin(10)
err = drawRepoIcon(ctx, issueIcon, issue.Repo)
if err != nil {
return nil, err
}
issueStats, issueAttribution := bottomSection.Split(false, 50)
var state string
if issue.IsPull && issue.PullRequest.HasMerged {
if issue.PullRequest.Status == 3 {
state = ctx.Locale.TrString("repo.pulls.manually_merged")
} else {
state = ctx.Locale.TrString("repo.pulls.merged")
}
} else if issue.IsClosed {
state = ctx.Locale.TrString("repo.issues.closed_title")
} else if issue.IsPull {
if issue.PullRequest.IsWorkInProgress(ctx) {
state = ctx.Locale.TrString("repo.issues.draft_title")
} else {
state = ctx.Locale.TrString("repo.issues.open_title")
}
} else {
state = ctx.Locale.TrString("repo.issues.open_title")
}
state = strings.ToLower(state)
issueStats.SetMargin(10)
if issue.IsPull {
reviews := map[int64]bool{}
for _, comment := range issue.Comments {
if comment.Review != nil {
reviews[comment.Review.ID] = true
}
}
_, err = issueStats.DrawText(
fmt.Sprintf("%s, %s, %s",
ctx.Locale.TrN(
issue.NumComments,
"repo.issues.num_comments_1",
"repo.issues.num_comments",
issue.NumComments,
),
ctx.Locale.TrN(
len(reviews),
"repo.issues.num_reviews_one",
"repo.issues.num_reviews_few",
len(reviews),
),
state,
),
color.Gray{128}, 36, card.Top, card.Left)
} else {
_, err = issueStats.DrawText(
fmt.Sprintf("%s, %s",
ctx.Locale.TrN(
issue.NumComments,
"repo.issues.num_comments_1",
"repo.issues.num_comments",
issue.NumComments,
),
state,
),
color.Gray{128}, 36, card.Top, card.Left)
}
if err != nil {
return nil, err
}
issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
issueAttributionText.SetMargin(5)
_, err = issueAttributionText.DrawText(
fmt.Sprintf(
"%s - %s",
issue.Poster.Name,
issue.Created.AsTime().Format(time.DateOnly),
),
color.Gray{128}, 36, card.Middle, card.Left)
if err != nil {
return nil, err
}
err = drawUser(ctx, issueAttributionIcon, issue.Poster)
if err != nil {
return nil, err
}
return mainCard, nil
}
func drawReleaseSummaryCard(ctx *context.Context, release *repo_model.Release) (*card.Card, error) {
width, height := card.DefaultSize()
mainCard, err := card.NewCard(width, height)
if err != nil {
return nil, err
}
mainCard.SetMargin(60)
topSection, bottomSection := mainCard.Split(false, 75)
releaseSummary, repoIcon := topSection.Split(true, 80)
repoInfo, releaseDescription := releaseSummary.Split(false, 15)
repoInfo.SetMargin(10)
_, err = repoInfo.DrawText(release.Repo.FullName(), color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
releaseDescription.SetMargin(10)
_, err = releaseDescription.DrawText(release.DisplayName(), color.Black, 56, card.Top, card.Left)
if err != nil {
return nil, err
}
repoIcon.SetMargin(10)
err = drawRepoIcon(ctx, repoIcon, release.Repo)
if err != nil {
return nil, err
}
downloadCountCard, releaseDateCard := bottomSection.Split(true, 75)
downloadCount, err := release.GetTotalDownloadCount(ctx)
if err != nil {
return nil, err
}
downloadCountText := ctx.Locale.TrN(
strconv.FormatInt(downloadCount, 10),
"repo.release.download_count_one",
"repo.release.download_count_few",
strconv.FormatInt(downloadCount, 10),
)
_, err = downloadCountCard.DrawText(string(downloadCountText), color.Gray{128}, 36, card.Bottom, card.Left)
if err != nil {
return nil, err
}
_, err = releaseDateCard.DrawText(release.CreatedUnix.AsTime().Format(time.DateOnly), color.Gray{128}, 36, card.Bottom, card.Left)
if err != nil {
return nil, err
}
return mainCard, nil
}
// checkCardCache checks if a card in cache and serves it
func checkCardCache(ctx *context.Context, cacheKey string) bool {
cache := cache.GetCache()
pngData, ok := cache.Get(cacheKey).([]byte)
if ok && pngData != nil && len(pngData) > 0 {
ctx.Resp.Header().Set("Content-Type", "image/png")
ctx.Resp.WriteHeader(http.StatusOK)
_, err := ctx.Resp.Write(pngData)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
}
return true
}
return false
}
// serveCard server a Card to the user adds it to the cache
func serveCard(ctx *context.Context, card *card.Card, cacheKey string) {
cache := cache.GetCache()
// Encode image, store in cache
var imageBuffer bytes.Buffer
err := png.Encode(&imageBuffer, card.Img)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
return
}
imageBytes := imageBuffer.Bytes()
err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
if err != nil {
// don't abort serving the image if we just had a cache storage failure
log.Warn("failed to cache issue summary card: %v", err)
}
// Finish the uncached image response
ctx.Resp.Header().Set("Content-Type", "image/png")
ctx.Resp.WriteHeader(http.StatusOK)
_, err = ctx.Resp.Write(imageBytes)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
return
}
}
func DrawRepoSummaryCard(ctx *context.Context) {
cacheKey := fmt.Sprintf("summary_card:repo:%s:%d", ctx.Locale.Language(), ctx.Repo.Repository.ID)
if checkCardCache(ctx, cacheKey) {
return
}
card, err := drawRepoSummaryCard(ctx, ctx.Repo.Repository)
if err != nil {
ctx.ServerError("drawRepoSummaryCar", err)
return
}
serveCard(ctx, card, cacheKey)
}
func DrawIssueSummaryCard(ctx *context.Context) {
issue, err := issue_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil {
if issue_model.IsErrIssueNotExist(err) {
ctx.Error(http.StatusNotFound)
} else {
ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
}
return
}
if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
ctx.Error(http.StatusNotFound)
return
}
cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
if checkCardCache(ctx, cacheKey) {
return
}
card, err := drawIssueSummaryCard(ctx, issue)
if err != nil {
ctx.ServerError("drawIssueSummaryCar", err)
return
}
serveCard(ctx, card, cacheKey)
}
func DrawReleaseSummaryCard(ctx *context.Context) {
release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*"))
if err != nil {
if repo_model.IsErrReleaseNotExist(err) {
ctx.NotFound("", nil)
} else {
ctx.ServerError("GetReleaseForRepoByID", err)
}
return
}
err = release.LoadRepo(ctx)
if err != nil {
ctx.ServerError("LoadRepo", err)
return
}
cacheKey := fmt.Sprintf("summary_card:release:%s:%d", ctx.Locale.Language(), release.ID)
if checkCardCache(ctx, cacheKey) {
return
}
card, err := drawReleaseSummaryCard(ctx, release)
if err != nil {
ctx.ServerError("drawRepoSummaryCar", err)
return
}
serveCard(ctx, card, cacheKey)
}

View file

@ -23,6 +23,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
csv_module "code.gitea.io/gitea/modules/csv"
@ -51,6 +52,7 @@ const (
func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner, headName string) {
ctx.Data["BeforeCommit"] = before
ctx.Data["HeadCommit"] = head
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
ctx.Data["GetBlobByPathForCommit"] = func(commit *git.Commit, path string) *git.Blob {
if commit == nil {
@ -71,7 +73,21 @@ func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner
return st
}
st, err := blob.GuessContentType()
isAnnexed, err := annex.IsAnnexed(blob)
if err != nil {
log.Error("IsAnnexed failed: %v", err)
return st
}
if isAnnexed {
st, err = annex.GuessContentType(blob)
if err != nil {
log.Error("GuessContentType failed: %v", err)
return st
}
return st
}
st, err = blob.GuessContentType()
if err != nil {
log.Error("GuessContentType failed: %v", err)
return st
@ -89,18 +105,18 @@ func SourceCommitURL(owner, name string, commit *git.Commit) string {
return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/src/commit/" + url.PathEscape(commit.ID.String())
}
// RawCommitURL creates a relative URL for the raw commit in the given repository
func RawCommitURL(owner, name string, commit *git.Commit) string {
return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/raw/commit/" + url.PathEscape(commit.ID.String())
// MediaCommitURL creates a relative URL for the commit media (plain git, LFS, or annex content) in the given repository
func MediaCommitURL(owner, name string, commit *git.Commit) string {
return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/media/commit/" + url.PathEscape(commit.ID.String())
}
// setPathsCompareContext sets context data for source and raw paths
func setPathsCompareContext(ctx *context.Context, base, head *git.Commit, headOwner, headName string) {
ctx.Data["SourcePath"] = SourceCommitURL(headOwner, headName, head)
ctx.Data["RawPath"] = RawCommitURL(headOwner, headName, head)
ctx.Data["RawPath"] = MediaCommitURL(headOwner, headName, head)
if base != nil {
ctx.Data["BeforeSourcePath"] = SourceCommitURL(headOwner, headName, base)
ctx.Data["BeforeRawPath"] = RawCommitURL(headOwner, headName, base)
ctx.Data["BeforeRawPath"] = MediaCommitURL(headOwner, headName, base)
}
}

View file

@ -9,6 +9,7 @@ import (
"time"
git_model "code.gitea.io/gitea/models/git"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/httpcache"
"code.gitea.io/gitea/modules/lfs"
@ -79,6 +80,26 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim
}
closed = true
// check for git-annex files
// (this code is weirdly redundant because I'm trying not to delete any lines in order to make merges easier)
isAnnexed, err := annex.IsAnnexed(blob)
if err != nil {
ctx.ServerError("annex.IsAnnexed", err)
return err
}
if isAnnexed {
content, err := annex.Content(blob)
if err != nil {
// XXX are there any other possible failure cases here?
// there are, there could be unrelated io errors; those should be ctx.ServerError()s
ctx.NotFound("annex.Content", err)
return err
}
defer content.Close()
common.ServeContentByReadSeeker(ctx.Base, ctx.Repo.TreePath, lastModified, content)
return nil
}
return common.ServeBlob(ctx.Base, ctx.Repo.TreePath, blob, lastModified)
}

View file

@ -10,6 +10,7 @@ import (
gocontext "context"
"fmt"
"net/http"
"net/url"
"os"
"path/filepath"
"regexp"
@ -78,7 +79,24 @@ func httpBase(ctx *context.Context) *serviceHandler {
strings.HasSuffix(ctx.Req.URL.Path, "git-upload-archive") {
isPull = true
} else {
isPull = ctx.Req.Method == "GET"
// In addition to GET requests, HEAD requests are also "pull"
// operations (reads), so they should also not require
// authentication. This is necessary for git-annex to operate
// properly, as it emits HEAD requests to check for the
// existence of keys, e.g. before dropping locally, and asking
// for authentication would break unauthenticated http usage in
// this situation.
// It should be safe to make all HEAD requests require no
// authentication, but as it is only necessary for the
// annex/objects endpoints to fix git-annex' drop operations it
// is limited to those for now.
r, err := regexp.Compile("^/?" + username + "/" + reponame + "(.git)?/annex/objects")
if err != nil {
ctx.ServerError("failed to create URL path regex", err)
return nil
}
isPull = ctx.Req.Method == "GET" ||
r.MatchString(ctx.Req.URL.Path) && ctx.Req.Method == "HEAD"
}
var accessMode perm.AccessMode
@ -545,6 +563,42 @@ func GetInfoRefs(ctx *context.Context) {
}
}
// GetConfig implements fetching the git config of a repository
func GetConfig(ctx *context.Context) {
h := httpBase(ctx)
if h != nil {
setHeaderNoCache(ctx)
config, err := os.ReadFile(filepath.Join(h.getRepoDir(), "config"))
if err != nil {
log.Error("Failed to read git config file: %v", err)
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
if !setting.Annex.DisableP2PHTTP {
appURL, err := url.Parse(setting.AppURL)
if err != nil {
log.Error("Could not parse 'setting.AppURL': %v", err)
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
if appURL.Port() == "" {
// If there is no port set then set the http(s) default ports.
// Without this, git-annex would try its own default port (9417) and fail.
if appURL.Scheme == "http" {
appURL.Host += ":80"
}
if appURL.Scheme == "https" {
appURL.Host += ":443"
}
}
config = append(config, []byte("[annex]\n\turl = annex+"+appURL.String()+"git-annex-p2phttp\n")...)
}
ctx.Resp.Header().Set("Content-Type", "text/plain")
ctx.Resp.Header().Set("Content-Length", fmt.Sprintf("%d", len(config)))
http.ServeContent(ctx.Resp, ctx.Req, "config", time.Now(), bytes.NewReader(config))
}
}
// GetTextFile implements Git dumb HTTP
func GetTextFile(p string) func(*context.Context) {
return func(ctx *context.Context) {
@ -597,3 +651,34 @@ func GetIdxFile(ctx *context.Context) {
h.sendFile(ctx, "application/x-git-packed-objects-toc", "objects/pack/pack-"+ctx.Params("file")+".idx")
}
}
// GetAnnexObject implements git-annex dumb HTTP
func GetAnnexObject(ctx *context.Context) {
h := httpBase(ctx)
if h != nil {
// git-annex objects are stored in .git/annex/objects/{hash1}/{hash2}/{key}/{key}
// where key is a string containing the size and (usually SHA256) checksum of the file,
// and hash1+hash2 are the first few bits of the md5sum of key itself.
// ({hash1}/{hash2}/ is just there to avoid putting too many files in one directory)
// ref: https://git-annex.branchable.com/internals/hashing/
// keyDir should = key, but we don't enforce that
object := filepath.Join(ctx.Params("hash1"), ctx.Params("hash2"), ctx.Params("keyDir"), ctx.Params("key"))
// Sanitize the input against directory traversals.
//
// This works because at the filesystem root, "/.." = "/";
// So if a path starts rooted ("/"), path.Clean(), which
// path.Join() calls internally, removes all '..' prefixes.
// After, this unroots the path unconditionally ([1:]), which
// works because we know the input is never supposed to be rooted.
//
// The router code probably also disallows "..", so this
// should be redundant, but it's defensive to keep it
// whenever touching filesystem paths with user input.
object = filepath.Join(string(filepath.Separator), object)[1:]
setHeaderCacheForever(ctx)
h.sendFile(ctx, "application/octet-stream", "annex/objects/"+object)
}
}

View file

@ -10,9 +10,6 @@ import (
"errors"
"fmt"
"html/template"
"image"
"image/color"
"image/png"
"math/big"
"net/http"
"net/url"
@ -34,8 +31,6 @@ import (
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/card"
"code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/emoji"
"code.gitea.io/gitea/modules/git"
@ -47,7 +42,6 @@ import (
"code.gitea.io/gitea/modules/optional"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/storage"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/templates/vars"
@ -2076,6 +2070,8 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
ctx.Data["NewPinAllowed"] = pinAllowed
ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
ctx.Data["OpenGraphImageURL"] = issue.SummaryCardURL()
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.issues.summary_card_alt", issue.Title, issue.Repo.FullName())
prepareHiddenCommentType(ctx)
if ctx.Written() {
@ -2233,222 +2229,6 @@ func GetIssueInfo(ctx *context.Context) {
ctx.JSON(http.StatusOK, convert.ToIssue(ctx, ctx.Doer, issue))
}
// GetSummaryCard get an issue of a repository
func GetSummaryCard(ctx *context.Context) {
issue, err := issues_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil {
if issues_model.IsErrIssueNotExist(err) {
ctx.Error(http.StatusNotFound)
} else {
ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
}
return
}
if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
ctx.Error(http.StatusNotFound)
return
}
cache := cache.GetCache()
cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
pngData, ok := cache.Get(cacheKey).([]byte)
if ok && pngData != nil && len(pngData) > 0 {
ctx.Resp.Header().Set("Content-Type", "image/png")
ctx.Resp.WriteHeader(http.StatusOK)
_, err = ctx.Resp.Write(pngData)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
}
return
}
card, err := drawSummaryCard(ctx, issue)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
return
}
// Encode image, store in cache
var imageBuffer bytes.Buffer
err = png.Encode(&imageBuffer, card.Img)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
return
}
imageBytes := imageBuffer.Bytes()
err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
if err != nil {
// don't abort serving the image if we just had a cache storage failure
log.Warn("failed to cache issue summary card: %v", err)
}
// Finish the uncached image response
ctx.Resp.Header().Set("Content-Type", "image/png")
ctx.Resp.WriteHeader(http.StatusOK)
_, err = ctx.Resp.Write(imageBytes)
if err != nil {
ctx.ServerError("GetSummaryCard", err)
return
}
}
func drawSummaryCard(ctx *context.Context, issue *issues_model.Issue) (*card.Card, error) {
width, height := issue.SummaryCardSize()
mainCard, err := card.NewCard(width, height)
if err != nil {
return nil, err
}
mainCard.SetMargin(60)
topSection, bottomSection := mainCard.Split(false, 75)
issueSummary, issueIcon := topSection.Split(true, 80)
repoInfo, issueDescription := issueSummary.Split(false, 15)
repoInfo.SetMargin(10)
_, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
if err != nil {
return nil, err
}
issueDescription.SetMargin(10)
_, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
if err != nil {
return nil, err
}
issueIcon.SetMargin(10)
repoAvatarPath := issue.Repo.CustomAvatarRelativePath()
if repoAvatarPath != "" {
repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
if err != nil {
return nil, err
}
repoAvatarImage, _, err := image.Decode(repoAvatarFile)
if err != nil {
return nil, err
}
issueIcon.DrawImage(repoAvatarImage)
} else {
// If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
err = issue.Repo.LoadOwner(ctx)
if err != nil {
return nil, err
}
if issue.Repo.Owner != nil {
err = drawUser(ctx, issueIcon, issue.Repo.Owner)
if err != nil {
return nil, err
}
}
}
issueStats, issueAttribution := bottomSection.Split(false, 50)
var state string
if issue.IsPull && issue.PullRequest.HasMerged {
if issue.PullRequest.Status == 3 {
state = ctx.Locale.TrString("repo.pulls.manually_merged")
} else {
state = ctx.Locale.TrString("repo.pulls.merged")
}
} else if issue.IsClosed {
state = ctx.Locale.TrString("repo.issues.closed_title")
} else if issue.IsPull {
if issue.PullRequest.IsWorkInProgress(ctx) {
state = ctx.Locale.TrString("repo.issues.draft_title")
} else {
state = ctx.Locale.TrString("repo.issues.open_title")
}
} else {
state = ctx.Locale.TrString("repo.issues.open_title")
}
state = strings.ToLower(state)
issueStats.SetMargin(10)
if issue.IsPull {
reviews := map[int64]bool{}
for _, comment := range issue.Comments {
if comment.Review != nil {
reviews[comment.Review.ID] = true
}
}
_, err = issueStats.DrawText(
fmt.Sprintf("%s, %s, %s",
ctx.Locale.TrN(
issue.NumComments,
"repo.issues.num_comments_1",
"repo.issues.num_comments",
issue.NumComments,
),
ctx.Locale.TrN(
len(reviews),
"repo.issues.num_reviews_one",
"repo.issues.num_reviews_few",
len(reviews),
),
state,
),
color.Gray{128}, 36, card.Top, card.Left)
} else {
_, err = issueStats.DrawText(
fmt.Sprintf("%s, %s",
ctx.Locale.TrN(
issue.NumComments,
"repo.issues.num_comments_1",
"repo.issues.num_comments",
issue.NumComments,
),
state,
),
color.Gray{128}, 36, card.Top, card.Left)
}
if err != nil {
return nil, err
}
issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
issueAttributionText.SetMargin(5)
_, err = issueAttributionText.DrawText(
fmt.Sprintf(
"%s - %s",
issue.Poster.Name,
issue.Created.AsTime().Format("2006-01-02"),
),
color.Gray{128}, 36, card.Middle, card.Left)
if err != nil {
return nil, err
}
err = drawUser(ctx, issueAttributionIcon, issue.Poster)
if err != nil {
return nil, err
}
return mainCard, nil
}
func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
if user.UseCustomAvatar {
posterAvatarPath := user.CustomAvatarRelativePath()
if posterAvatarPath != "" {
userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
if err != nil {
return err
}
userAvatarImage, _, err := image.Decode(userAvatarFile)
if err != nil {
return err
}
card.DrawImage(userAvatarImage)
}
} else {
posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
card.DrawExternalImage(posterAvatarLink)
}
return nil
}
// UpdateIssueTitle change issue's title
func UpdateIssueTitle(ctx *context.Context) {
issue := GetActionIssue(ctx)

View file

@ -365,11 +365,7 @@ func SingleRelease(ctx *context.Context) {
addVerifyTagToContext(ctx)
ctx.Data["PageIsSingleTag"] = release.IsTag
if release.IsTag {
ctx.Data["Title"] = release.TagName
} else {
ctx.Data["Title"] = release.Title
}
ctx.Data["Title"] = release.DisplayName()
err = release.LoadArchiveDownloadCount(ctx)
if err != nil {
@ -378,6 +374,13 @@ func SingleRelease(ctx *context.Context) {
}
ctx.Data["Releases"] = releases
ctx.Data["OpenGraphTitle"] = fmt.Sprintf("%s - %s", release.DisplayName(), release.Repo.FullName())
ctx.Data["OpenGraphDescription"] = base.EllipsisString(release.Note, 300)
ctx.Data["OpenGraphURL"] = release.HTMLURL()
ctx.Data["OpenGraphImageURL"] = release.SummaryCardURL()
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.release.summary_card_alt", release.DisplayName(), release.Repo.FullName())
ctx.HTML(http.StatusOK, tplReleasesList)
}

View file

@ -67,6 +67,12 @@ func Search(ctx *context.Context) {
ctx.Data["CodeSearchPath"] = path
ctx.Data["CodeSearchMode"] = mode.String()
ctx.Data["PageIsViewCode"] = true
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
if setting.Indexer.RepoIndexerEnabled {
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
} else {
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
if keyword == "" {
ctx.HTML(http.StatusOK, tplSearch)
@ -103,7 +109,6 @@ func Search(ctx *context.Context) {
} else {
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
}
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
} else {
grepOpt := git.GrepOptions{
ContextLineNumber: 1,
@ -139,10 +144,8 @@ func Search(ctx *context.Context) {
strings.Join(r.LineCodes, "\n")),
})
}
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
ctx.Data["Repo"] = ctx.Repo.Repository
ctx.Data["SourcePath"] = ctx.Repo.Repository.Link()
ctx.Data["SearchResults"] = searchResults

View file

@ -34,6 +34,7 @@ import (
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/actions"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git"
@ -209,14 +210,59 @@ func localizedExtensions(ext, languageCode string) (localizedExts []string) {
}
type fileInfo struct {
isTextFile bool
isLFSFile bool
fileSize int64
lfsMeta *lfs.Pointer
st typesniffer.SniffedType
isTextFile bool
isLFSFile bool
isAnnexFile bool
isAnnexFilePresent bool
fileSize int64
lfsMeta *lfs.Pointer
st typesniffer.SniffedType
}
func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte, io.ReadCloser, *fileInfo, error) {
isAnnexed, err := annex.IsAnnexed(blob)
if err != nil {
return nil, nil, nil, err
}
if isAnnexed {
// TODO: this code could be merged with the LFS case, especially the redundant type sniffer,
// but it is *currently* written this way to make merging with the non-annex upstream easier:
// this way, the git-annex patch is (mostly) pure additions.
annexContent, err := annex.Content(blob)
if err != nil {
// If annex.Content returns an error it can mean that the blob does not
// refer to an annexed file or that it is not present here. Since we already
// checked that it is annexed the latter must be the case. So we return the
// content of the blob instead and indicate that the file is indeed annexed,
// but not present here. The template can then communicate the situation.
dataRc, err := blob.DataAsync()
if err != nil {
return nil, nil, nil, err
}
buf := make([]byte, 1024)
n, _ := util.ReadAtMost(dataRc, buf)
buf = buf[:n]
st := typesniffer.DetectContentType(buf)
return buf, dataRc, &fileInfo{st.IsText(), false, true, false, blob.Size(), nil, st}, nil
}
stat, err := annexContent.Stat()
if err != nil {
return nil, nil, nil, err
}
buf := make([]byte, 1024)
n, _ := util.ReadAtMost(annexContent, buf)
buf = buf[:n]
st := typesniffer.DetectContentType(buf)
return buf, annexContent, &fileInfo{st.IsText(), false, true, true, stat.Size(), nil, st}, nil
}
dataRc, err := blob.DataAsync()
if err != nil {
return nil, nil, nil, err
@ -231,18 +277,18 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte,
// FIXME: what happens when README file is an image?
if !isTextFile || !setting.LFS.StartServer {
return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
pointer, _ := lfs.ReadPointerFromBuffer(buf)
if !pointer.IsValid() { // fallback to plain file
return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
meta, err := git_model.GetLFSMetaObjectByOid(ctx, repoID, pointer.Oid)
if err != nil { // fallback to plain file
log.Warn("Unable to access LFS pointer %s in repo %d: %v", pointer.Oid, repoID, err)
return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil
return buf, dataRc, &fileInfo{isTextFile, false, false, false, blob.Size(), nil, st}, nil
}
dataRc.Close()
@ -262,7 +308,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte,
st = typesniffer.DetectContentType(buf)
return buf, dataRc, &fileInfo{st.IsText(), true, meta.Size, &meta.Pointer, st}, nil
return buf, dataRc, &fileInfo{st.IsText(), true, false, false, meta.Size, &meta.Pointer, st}, nil
}
func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.TreeEntry) {
@ -325,6 +371,7 @@ func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.Tr
},
Metas: ctx.Repo.Repository.ComposeDocumentMetas(ctx),
GitRepo: ctx.Repo.GitRepo,
Blob: target.Blob(),
}, rd)
if err != nil {
log.Error("Render failed for %s in %-v: %v Falling back to rendering source", readmeFile.Name(), ctx.Repo.Repository, err)
@ -447,10 +494,17 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
isDisplayingSource := ctx.FormString("display") == "source"
isDisplayingRendered := !isDisplayingSource
if fInfo.isLFSFile {
if fInfo.isLFSFile || fInfo.isAnnexFile {
ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/media/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
}
if fInfo.isAnnexFile {
// pre-git-annex v7, all annexed files were represented in-repo as symlinks;
// but we pretend they aren't, since that's a distracting quirk of git-annex
// and not a meaningful choice on the user's part
ctx.Data["FileIsSymlink"] = false
}
isRepresentableAsText := fInfo.st.IsRepresentableAsText()
if !isRepresentableAsText {
// If we can't show plain text, always try to render.
@ -458,6 +512,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
isDisplayingRendered = true
}
ctx.Data["IsLFSFile"] = fInfo.isLFSFile
ctx.Data["IsAnnexFile"] = fInfo.isAnnexFile
ctx.Data["IsAnnexFilePresent"] = fInfo.isAnnexFilePresent
ctx.Data["FileSize"] = fInfo.fileSize
ctx.Data["IsTextFile"] = fInfo.isTextFile
ctx.Data["IsRepresentableAsText"] = isRepresentableAsText
@ -492,6 +548,8 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
// Assume file is not editable first.
if fInfo.isLFSFile {
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_lfs_files")
} else if fInfo.isAnnexFile {
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_annex_files")
} else if !isRepresentableAsText {
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.cannot_edit_non_text_files")
}
@ -546,6 +604,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
},
Metas: metas,
GitRepo: ctx.Repo.GitRepo,
Blob: entry.Blob(),
}, rd)
if err != nil {
ctx.ServerError("Render", err)
@ -599,7 +658,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
ctx.Data["FileContent"] = fileContent
ctx.Data["LineEscapeStatus"] = statuses
}
if !fInfo.isLFSFile {
if !fInfo.isLFSFile && !fInfo.isAnnexFile {
if ctx.Repo.CanEnableEditor(ctx, ctx.Doer) {
if lfsLock != nil && lfsLock.OwnerID != ctx.Doer.ID {
ctx.Data["CanEditFile"] = false
@ -644,6 +703,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
},
Metas: ctx.Repo.Repository.ComposeDocumentMetas(ctx),
GitRepo: ctx.Repo.GitRepo,
Blob: entry.Blob(),
}, rd)
if err != nil {
ctx.ServerError("Render", err)
@ -1159,6 +1219,15 @@ PostRecentBranchCheck:
} else {
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
isAnnexFile, okAnnexFile := ctx.Data["IsAnnexFile"]
isAnnexFilePresent, okAnnexFilePresent := ctx.Data["IsAnnexFilePresent"]
if okAnnexFile && okAnnexFilePresent && isAnnexFile.(bool) && !isAnnexFilePresent.(bool) {
// If the file to be viewed is annexed but not present then render it normally
// (which will show the plain git blob content, i.e. the symlink or pointer target)
// but make the status code a 404.
ctx.HTML(http.StatusNotFound, tplRepoHome)
return
}
ctx.HTML(http.StatusOK, tplRepoHome)
}

View file

@ -86,7 +86,7 @@ func TestWiki(t *testing.T) {
Wiki(ctx)
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
assert.EqualValues(t, "Home", ctx.Data["Title"])
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
}
func TestWikiPages(t *testing.T) {
@ -96,7 +96,7 @@ func TestWikiPages(t *testing.T) {
contexttest.LoadRepo(t, ctx, 1)
WikiPages(ctx)
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
}
func TestNewWiki(t *testing.T) {

View file

@ -356,6 +356,20 @@ func registerRoutes(m *web.Route) {
}
}
annexEnabled := func(ctx *context.Context) {
if !setting.Annex.Enabled {
ctx.Error(http.StatusNotFound)
return
}
}
annexP2PHTTPEnabled := func(ctx *context.Context) {
if setting.Annex.DisableP2PHTTP {
ctx.Error(http.StatusNotFound)
return
}
}
federationEnabled := func(ctx *context.Context) {
if !setting.Federation.Enabled {
ctx.Error(http.StatusNotFound)
@ -955,6 +969,9 @@ func registerRoutes(m *web.Route) {
// ***** END: Organization *****
// ***** START: Repository *****
m.Group("", func() {
m.Methods("GET,POST", "/git-annex-p2phttp/git-annex/{uuid}/*", repo.AnnexP2PHTTP)
}, ignSignInAndCsrf, annexEnabled, annexP2PHTTPEnabled)
m.Group("/repo", func() {
m.Get("/create", repo.Create)
m.Post("/create", web.Bind(forms.CreateRepoForm{}), repo.CreatePost)
@ -1146,9 +1163,10 @@ func registerRoutes(m *web.Route) {
m.Group("/{type:issues|pulls}", func() {
m.Group("/{index}", func() {
m.Get("/info", repo.GetIssueInfo)
m.Get("/summary-card", repo.GetSummaryCard)
m.Get("/summary-card", repo.DrawIssueSummaryCard)
})
})
m.Get("/-/summary-card", repo.DrawRepoSummaryCard)
}, ignSignIn, context.RepoAssignment, context.UnitTypes()) // for "/{username}/{reponame}" which doesn't require authentication
// Grouping for those endpoints that do require authentication
@ -1298,6 +1316,7 @@ func registerRoutes(m *web.Route) {
m.Get("/latest", repo.LatestRelease)
m.Get(".rss", feedEnabled, repo.ReleasesFeedRSS)
m.Get(".atom", feedEnabled, repo.ReleasesFeedAtom)
m.Get("/summary-card/*", repo.DrawReleaseSummaryCard)
}, ctxDataSet("EnableFeed", setting.Other.EnableFeed),
repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefTag, true))
m.Get("/releases/attachments/{uuid}", repo.MustBeNotEmpty, repo.GetAttachment)
@ -1633,6 +1652,12 @@ func registerRoutes(m *web.Route) {
})
}, ignSignInAndCsrf, lfsServerEnabled)
m.Group("", func() {
// for git-annex
m.Methods("GET,OPTIONS", "/config", repo.GetConfig) // needed by clients reading annex.uuid during `git annex initremote`
m.Methods("GET,OPTIONS", "/annex/objects/{hash1}/{hash2}/{keyDir}/{key}", repo.GetAnnexObject)
}, ignSignInAndCsrf, annexEnabled, context.UserAssignmentWeb())
gitHTTPRouters(m)
})
})

View file

@ -61,6 +61,17 @@ func isArchivePath(req *http.Request) bool {
return archivePathRe.MatchString(req.URL.Path)
}
var annexPathRe = regexp.MustCompile(`^(/git-annex-p2phttp/|/[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+/annex/)`)
func isAnnexPath(req *http.Request) bool {
if setting.Annex.Enabled {
// "/config" is git's config, not specifically git-annex's; but the only current
// user of it is when git-annex downloads the annex.uuid during 'git annex init'.
return strings.HasSuffix(req.URL.Path, "/config") || annexPathRe.MatchString(req.URL.Path)
}
return false
}
// handleSignIn clears existing session variables and stores new ones for the specified user object
func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore, user *user_model.User) {
// We need to regenerate the session...

View file

@ -43,8 +43,8 @@ func (b *Basic) Name() string {
// name/token on successful validation.
// Returns nil if header is empty or validation fails.
func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) {
// Basic authentication should only fire on API, Download or on Git or LFSPaths
if !middleware.IsAPIPath(req) && !isContainerPath(req) && !isAttachmentDownload(req) && !isGitRawOrAttachOrLFSPath(req) {
// Basic authentication should only fire on API, Download or on Git, LFSPaths or Git-Annex paths
if !middleware.IsAPIPath(req) && !isContainerPath(req) && !isAttachmentDownload(req) && !isGitRawOrAttachOrLFSPath(req) && !isAnnexPath(req) {
return nil, nil
}

View file

@ -25,6 +25,7 @@ import (
unit_model "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/card"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
code_indexer "code.gitea.io/gitea/modules/indexer/code"
@ -632,6 +633,12 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, repo.ID)
}
cardWidth, cardHeight := card.DefaultSize()
ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL()
ctx.Data["OpenGraphImageWidth"] = cardWidth
ctx.Data["OpenGraphImageHeight"] = cardHeight
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName())
if repo.IsFork {
RetrieveBaseRepo(ctx, repo)
if ctx.Written() {

View file

@ -48,7 +48,7 @@ func (o *issue) ToFormat() f3.Interface {
return o.NewFormat()
}
var milestone *f3.Reference
milestone := &f3.Reference{}
if o.forgejoIssue.Milestone != nil {
milestone = f3_tree.NewIssueMilestoneReference(o.forgejoIssue.Milestone.ID)
}
@ -82,9 +82,11 @@ func (o *issue) ToFormat() f3.Interface {
func (o *issue) FromFormat(content f3.Interface) {
issue := content.(*f3.Issue)
var milestone *issues_model.Milestone
var milestoneID int64
if issue.Milestone != nil {
milestoneID = issue.Milestone.GetIDAsInt()
milestone = &issues_model.Milestone{
ID: issue.Milestone.GetIDAsInt(),
ID: milestoneID,
}
}
o.forgejoIssue = &issues_model.Issue{
@ -95,6 +97,7 @@ func (o *issue) FromFormat(content f3.Interface) {
ID: issue.PosterID.GetIDAsInt(),
},
Content: issue.Content,
MilestoneID: milestoneID,
Milestone: milestone,
IsClosed: issue.State == f3.IssueStateClosed,
CreatedUnix: timeutil.TimeStamp(issue.Created.Unix()),
@ -134,7 +137,7 @@ func (o *issue) Get(ctx context.Context) bool {
panic(fmt.Errorf("issue %v %w", id, err))
}
if err := issue.LoadAttributes(ctx); err != nil {
panic(err)
panic(fmt.Errorf("LoadAttributes %v %w", id, err))
}
o.forgejoIssue = issue
@ -144,11 +147,67 @@ func (o *issue) Get(ctx context.Context) bool {
func (o *issue) Patch(ctx context.Context) {
node := o.GetNode()
project := f3_tree.GetProjectID(o.GetNode())
id := node.GetID().Int64()
o.Trace("repo_id = %d, index = %d", project, id)
if _, err := db.GetEngine(ctx).Where("`repo_id` = ? AND `index` = ?", project, id).Cols("name", "content", "is_closed").Update(o.forgejoIssue); err != nil {
index := node.GetID().Int64()
id := getIssueID(ctx, project, index)
o.Trace("id = %d, repo_id = %d, index = %d, assignees = %v", id, project, index, o.forgejoIssue.Assignees)
if _, err := db.GetEngine(ctx).Where("`id` = ?", id).Cols("name", "content", "is_closed", "milestone_id", "is_locked").Update(o.forgejoIssue); err != nil {
panic(fmt.Errorf("%v %v", o.forgejoIssue, err))
}
updateIssueAssignees(ctx, id, o.forgejoIssue.Assignees)
updateIssueLabels(ctx, id, o.forgejoIssue.Labels)
}
func getIssueID(ctx context.Context, repoID, index int64) int64 {
var id int64
if _, err := db.GetEngine(ctx).Select("id").Table("issue").Where("`repo_id` = ? AND `index` = ?", repoID, index).Get(&id); err != nil {
panic(fmt.Errorf("%v %v: %w", repoID, index, err))
}
return id
}
func updateIssueAssignees(ctx context.Context, issueID int64, assignees []*user_model.User) {
sess := db.GetEngine(ctx)
if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueAssignees)); err != nil {
panic(fmt.Errorf("delete IssueAssignees %v %w", issueID, err))
}
issueAssignees := make([]issues_model.IssueAssignees, 0, len(assignees))
for _, assignee := range assignees {
issueAssignees = append(issueAssignees, issues_model.IssueAssignees{
IssueID: issueID,
AssigneeID: assignee.ID,
})
}
if len(issueAssignees) > 0 {
if _, err := sess.Insert(issueAssignees); err != nil {
panic(fmt.Errorf("Insert %v %w", issueID, err))
}
}
}
func updateIssueLabels(ctx context.Context, issueID int64, labels []*issues_model.Label) {
sess := db.GetEngine(ctx)
if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueLabel)); err != nil {
panic(fmt.Errorf("delete IssueLabel %v %w", issueID, err))
}
issueLabels := make([]issues_model.IssueLabel, 0, len(labels))
for _, label := range labels {
issueLabels = append(issueLabels, issues_model.IssueLabel{
IssueID: issueID,
LabelID: label.ID,
})
}
if len(issueLabels) > 0 {
if _, err := sess.Insert(issueLabels); err != nil {
panic(fmt.Errorf("Insert %v %w", issueID, err))
}
}
}
func (o *issue) Put(ctx context.Context) generic.NodeID {
@ -156,17 +215,6 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
o.Trace("%s", node.GetID())
o.forgejoIssue.RepoID = f3_tree.GetProjectID(o.GetNode())
makeLabels := func(issueID int64) []issues_model.IssueLabel {
labels := make([]issues_model.IssueLabel, 0, len(o.forgejoIssue.Labels))
for _, label := range o.forgejoIssue.Labels {
o.Trace("%d with label %d", issueID, label.ID)
labels = append(labels, issues_model.IssueLabel{
IssueID: issueID,
LabelID: label.ID,
})
}
return labels
}
idx, err := db.GetNextResourceIndex(ctx, "issue_index", o.forgejoIssue.RepoID)
if err != nil {
@ -180,31 +228,8 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
panic(err)
}
labels := makeLabels(o.forgejoIssue.ID)
if len(labels) > 0 {
if _, err := sess.Insert(labels); err != nil {
panic(err)
}
}
makeAssignees := func(issueID int64) []issues_model.IssueAssignees {
assignees := make([]issues_model.IssueAssignees, 0, len(o.forgejoIssue.Assignees))
for _, assignee := range o.forgejoIssue.Assignees {
o.Trace("%d with assignee %d", issueID, assignee.ID)
assignees = append(assignees, issues_model.IssueAssignees{
IssueID: issueID,
AssigneeID: assignee.ID,
})
}
return assignees
}
assignees := makeAssignees(o.forgejoIssue.ID)
if len(assignees) > 0 {
if _, err := sess.Insert(assignees); err != nil {
panic(err)
}
}
updateIssueAssignees(ctx, o.forgejoIssue.ID, o.forgejoIssue.Assignees)
updateIssueLabels(ctx, o.forgejoIssue.ID, o.forgejoIssue.Labels)
o.Trace("issue created %d/%d", o.forgejoIssue.ID, o.forgejoIssue.Index)
return generic.NewNodeID(o.forgejoIssue.Index)

View file

@ -7,6 +7,7 @@ package driver
import (
"context"
"fmt"
"strings"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
@ -45,7 +46,7 @@ func (o *label) ToFormat() f3.Interface {
return &f3.Label{
Common: f3.NewCommon(fmt.Sprintf("%d", o.forgejoLabel.ID)),
Name: o.forgejoLabel.Name,
Color: o.forgejoLabel.Color,
Color: strings.TrimPrefix(o.forgejoLabel.Color, "#"),
Description: o.forgejoLabel.Description,
}
}
@ -56,7 +57,7 @@ func (o *label) FromFormat(content f3.Interface) {
ID: f3_util.ParseInt(label.GetID()),
Name: label.Name,
Description: label.Description,
Color: label.Color,
Color: "#" + label.Color,
}
}

View file

@ -117,7 +117,7 @@ func (o *milestone) Get(ctx context.Context) bool {
func (o *milestone) Patch(ctx context.Context) {
o.Trace("%d", o.forgejoMilestone.ID)
if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description").Update(o.forgejoMilestone); err != nil {
if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description", "is_closed", "deadline_unix").Update(o.forgejoMilestone); err != nil {
panic(fmt.Errorf("UpdateMilestoneCols: %v %v", o.forgejoMilestone, err))
}
}

View file

@ -85,6 +85,10 @@ func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *is
}
}
if issue.MilestoneID == 0 {
issue.Milestone = nil
}
return nil
}

View file

@ -24,6 +24,7 @@ func TestChangeMilestoneAssign(t *testing.T) {
oldMilestoneID := issue.MilestoneID
issue.MilestoneID = 2
require.NoError(t, issue.LoadMilestone(db.DefaultContext))
require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{
IssueID: issue.ID,
@ -32,4 +33,11 @@ func TestChangeMilestoneAssign(t *testing.T) {
OldMilestoneID: oldMilestoneID,
})
unittest.CheckConsistencyFor(t, &issues_model.Milestone{}, &issues_model.Issue{})
assert.NotNil(t, issue.Milestone)
oldMilestoneID = issue.MilestoneID
issue.MilestoneID = 0
require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
assert.EqualValues(t, 0, issue.MilestoneID)
assert.Nil(t, issue.Milestone)
}

View file

@ -202,6 +202,26 @@ func (t *TemporaryUploadRepository) AddObjectToIndex(mode, objectHash, objectPat
return nil
}
// InitPrivateAnnex initializes a private annex in the repository
func (t *TemporaryUploadRepository) InitPrivateAnnex() error {
if _, _, err := git.NewCommand(t.ctx, "config", "annex.private", "true").RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
return err
}
if _, _, err := git.NewCommand(t.ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
return err
}
return nil
}
// AddAnnex adds the file at path to the repository using git annex add
// This requires a non-bare repository
func (t *TemporaryUploadRepository) AddAnnex(path string) error {
if _, _, err := git.NewCommand(t.ctx, "annex", "add").AddDynamicArguments(path).RunStdString(&git.RunOpts{Dir: t.basePath}); err != nil {
return err
}
return nil
}
// WriteTree writes the current index as a tree to the object db and returns its hash
func (t *TemporaryUploadRepository) WriteTree() (string, error) {
stdout, _, err := git.NewCommand(t.ctx, "write-tree").RunStdString(&git.RunOpts{Dir: t.basePath})

View file

@ -6,13 +6,16 @@ package files
import (
"context"
"fmt"
"io"
"os"
"path"
"path/filepath"
"strings"
git_model "code.gitea.io/gitea/models/git"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/setting"
@ -89,7 +92,7 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
defer t.Close()
hasOldBranch := true
if err = t.Clone(opts.OldBranch, true); err != nil {
if err = t.Clone(opts.OldBranch, false); err != nil {
if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
return err
}
@ -105,10 +108,30 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
}
}
// Copy uploaded files into repository.
if err := copyUploadedLFSFilesIntoRepository(infos, t, opts.TreePath); err != nil {
r, err := git.OpenRepository(ctx, repo.RepoPath())
if err != nil {
return err
}
if annex.IsAnnexRepo(r) {
// Initialize annex privately in temporary clone
if err := t.InitPrivateAnnex(); err != nil {
return err
}
// Copy uploaded files into git-annex repository
if err := copyUploadedFilesIntoAnnexRepository(infos, t, opts.TreePath); err != nil {
return err
}
// Move all annexed content in the temporary repository, i.e. everything we have just added, to the origin
author, committer := GetAuthorAndCommitterUsers(opts.Author, opts.Committer, doer)
if err := moveAnnexedFilesToOrigin(t, author, committer); err != nil {
return err
}
} else {
// Copy uploaded files into repository.
if err := copyUploadedLFSFilesIntoRepository(infos, t, opts.TreePath); err != nil {
return err
}
}
// Now write the tree
treeHash, err := t.WriteTree()
@ -246,3 +269,57 @@ func uploadToLFSContentStore(info uploadInfo, contentStore *lfs.ContentStore) er
}
return nil
}
func copyUploadedFilesIntoAnnexRepository(infos []uploadInfo, t *TemporaryUploadRepository, treePath string) error {
for i := range len(infos) {
if err := copyUploadedFileIntoAnnexRepository(&infos[i], t, treePath); err != nil {
return err
}
}
return nil
}
func copyUploadedFileIntoAnnexRepository(info *uploadInfo, t *TemporaryUploadRepository, treePath string) error {
pathInRepo := path.Join(t.basePath, treePath, info.upload.Name)
if err := os.MkdirAll(filepath.Dir(pathInRepo), 0o700); err != nil {
return err
}
if err := os.Rename(info.upload.LocalPath(), pathInRepo); err != nil {
// Rename didn't work, try copy and remove
inputFile, err := os.Open(info.upload.LocalPath())
if err != nil {
return fmt.Errorf("could not open source file: %v", err)
}
defer inputFile.Close()
outputFile, err := os.Create(pathInRepo)
if err != nil {
return fmt.Errorf("could not open dest file: %v", err)
}
defer outputFile.Close()
_, err = io.Copy(outputFile, inputFile)
if err != nil {
return fmt.Errorf("could not copy to dest from source: %v", err)
}
inputFile.Close()
err = os.Remove(info.upload.LocalPath())
if err != nil {
return fmt.Errorf("could not remove source file: %v", err)
}
}
return t.AddAnnex(pathInRepo)
}
func moveAnnexedFilesToOrigin(t *TemporaryUploadRepository, author, committer *user_model.User) error {
authorSig := author.NewGitSig()
committerSig := committer.NewGitSig()
env := append(os.Environ(),
"GIT_AUTHOR_NAME="+authorSig.Name,
"GIT_AUTHOR_EMAIL="+authorSig.Email,
"GIT_COMMITTER_NAME="+committerSig.Name,
"GIT_COMMITTER_EMAIL="+committerSig.Email,
)
if _, _, err := git.NewCommand(t.ctx, "annex", "move", "--to", "origin").RunStdString(&git.RunOpts{Dir: t.basePath, Env: env}); err != nil {
return err
}
return nil
}

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