mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-22 09:54:24 +01:00
Merge branch 'forgejo' into moremarkdown
This commit is contained in:
commit
e36f0e0910
|
@ -31,7 +31,7 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
backporting:
|
backporting:
|
||||||
if: >
|
if: >
|
||||||
!startsWith(vars.ROLE, 'forgejo-') && (
|
( vars.ROLE == 'forgejo-coding' ) && (
|
||||||
github.event.pull_request.merged
|
github.event.pull_request.merged
|
||||||
&&
|
&&
|
||||||
contains(toJSON(github.event.pull_request.labels), 'backport/v')
|
contains(toJSON(github.event.pull_request.labels), 'backport/v')
|
||||||
|
|
|
@ -22,7 +22,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-simulation:
|
release-simulation:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
|
@ -26,7 +26,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
info:
|
info:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: code.forgejo.org/oci/node:20-bookworm
|
image: code.forgejo.org/oci/node:20-bookworm
|
||||||
|
@ -45,7 +45,7 @@ jobs:
|
||||||
|
|
||||||
cascade:
|
cascade:
|
||||||
if: >
|
if: >
|
||||||
!startsWith(vars.ROLE, 'forgejo-') && (
|
vars.ROLE == 'forgejo-coding' && (
|
||||||
github.event_name == 'push' ||
|
github.event_name == 'push' ||
|
||||||
(
|
(
|
||||||
github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests'
|
github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests'
|
||||||
|
|
|
@ -13,6 +13,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
merge-conditions:
|
merge-conditions:
|
||||||
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
|
|
@ -6,7 +6,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-notes:
|
release-notes:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-')
|
if: vars.ROLE == 'forgejo-coding'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
|
|
@ -7,7 +7,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-notes:
|
release-notes:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') && contains(github.event.pull_request.labels.*.name, 'worth a release-note') }}
|
if: ( vars.ROLE == 'forgejo-coding' ) && contains(github.event.pull_request.labels.*.name, 'worth a release-note')
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
|
|
@ -21,7 +21,7 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
renovate:
|
renovate:
|
||||||
if: ${{ secrets.RENOVATE_TOKEN != '' }}
|
if: vars.ROLE == 'forgejo-coding' && secrets.RENOVATE_TOKEN != ''
|
||||||
|
|
||||||
runs-on: docker-runner-one
|
runs-on: docker-runner-one
|
||||||
container:
|
container:
|
||||||
|
|
|
@ -10,7 +10,7 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
backend-checks:
|
backend-checks:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
@ -26,7 +26,7 @@ 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
|
- 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
|
- uses: ./.forgejo/workflows-composite/build-backend
|
||||||
frontend-checks:
|
frontend-checks:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
container:
|
container:
|
||||||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||||
|
@ -49,7 +49,7 @@ jobs:
|
||||||
path: ${{github.workspace}}/public/assets
|
path: ${{github.workspace}}/public/assets
|
||||||
key: frontend-build-${{ github.sha }}
|
key: frontend-build-${{ github.sha }}
|
||||||
test-unit:
|
test-unit:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -57,13 +57,14 @@ jobs:
|
||||||
services:
|
services:
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
image: docker.io/bitnami/elasticsearch:7
|
image: docker.io/bitnami/elasticsearch:7
|
||||||
|
options: --tmpfs /bitnami/elasticsearch/data
|
||||||
env:
|
env:
|
||||||
discovery.type: single-node
|
discovery.type: single-node
|
||||||
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
|
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
|
||||||
minio:
|
minio:
|
||||||
image: docker.io/bitnami/minio:2024.8.17
|
image: docker.io/bitnami/minio:2024.8.17
|
||||||
options: >-
|
options: >-
|
||||||
--hostname gitea.minio
|
--hostname gitea.minio --tmpfs /bitnami/minio/data
|
||||||
env:
|
env:
|
||||||
MINIO_DOMAIN: minio
|
MINIO_DOMAIN: minio
|
||||||
MINIO_ROOT_USER: 123456
|
MINIO_ROOT_USER: 123456
|
||||||
|
@ -88,7 +89,7 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
|
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
|
||||||
test-e2e:
|
test-e2e:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -121,8 +122,15 @@ jobs:
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
||||||
CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}}
|
CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}}
|
||||||
|
- name: Upload screenshots on failure
|
||||||
|
if: failure()
|
||||||
|
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: screenshots.zip
|
||||||
|
path: /workspace/forgejo/forgejo/tests/e2e/test-artifacts/*/*.png
|
||||||
|
retention-days: 3
|
||||||
test-remote-cacher:
|
test-remote-cacher:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks, test-unit]
|
needs: [backend-checks, frontend-checks, test-unit]
|
||||||
container:
|
container:
|
||||||
|
@ -132,16 +140,16 @@ jobs:
|
||||||
cacher:
|
cacher:
|
||||||
# redis
|
# redis
|
||||||
- image: docker.io/bitnami/redis:7.2
|
- image: docker.io/bitnami/redis:7.2
|
||||||
port: 6379
|
options: --tmpfs /bitnami/redis/data
|
||||||
# redict
|
# redict
|
||||||
- image: registry.redict.io/redict:7.3.0-scratch
|
- image: registry.redict.io/redict:7.3.0-scratch
|
||||||
port: 6379
|
options: --tmpfs /data
|
||||||
# valkey
|
# valkey
|
||||||
- image: docker.io/bitnami/valkey:7.2
|
- image: docker.io/bitnami/valkey:7.2
|
||||||
port: 6379
|
options: --tmpfs /bitnami/redis/data
|
||||||
# garnet
|
# garnet
|
||||||
- image: ghcr.io/microsoft/garnet-alpine:1.0.14
|
- image: ghcr.io/microsoft/garnet-alpine:1.0.14
|
||||||
port: 6379
|
options: --tmpfs /data
|
||||||
services:
|
services:
|
||||||
cacher:
|
cacher:
|
||||||
image: ${{ matrix.cacher.image }}
|
image: ${{ matrix.cacher.image }}
|
||||||
|
@ -162,7 +170,7 @@ jobs:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
|
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
|
||||||
test-mysql:
|
test-mysql:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -176,7 +184,8 @@ jobs:
|
||||||
#
|
#
|
||||||
# See also https://codeberg.org/forgejo/forgejo/issues/976
|
# See also https://codeberg.org/forgejo/forgejo/issues/976
|
||||||
#
|
#
|
||||||
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000
|
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin
|
||||||
|
options: --tmpfs /bitnami/mysql/data
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: ./.forgejo/workflows-composite/setup-env
|
- uses: ./.forgejo/workflows-composite/setup-env
|
||||||
|
@ -191,7 +200,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
test-pgsql:
|
test-pgsql:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -202,6 +211,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
MINIO_ROOT_USER: 123456
|
MINIO_ROOT_USER: 123456
|
||||||
MINIO_ROOT_PASSWORD: 12345678
|
MINIO_ROOT_PASSWORD: 12345678
|
||||||
|
options: --tmpfs /bitnami/minio/data
|
||||||
ldap:
|
ldap:
|
||||||
image: docker.io/gitea/test-openldap:latest
|
image: docker.io/gitea/test-openldap:latest
|
||||||
pgsql:
|
pgsql:
|
||||||
|
@ -209,6 +219,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
POSTGRES_DB: test
|
POSTGRES_DB: test
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
|
options: --tmpfs /var/lib/postgresql/data
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
- uses: ./.forgejo/workflows-composite/setup-env
|
- uses: ./.forgejo/workflows-composite/setup-env
|
||||||
|
@ -225,7 +236,7 @@ jobs:
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
TEST_LDAP: 1
|
TEST_LDAP: 1
|
||||||
test-sqlite:
|
test-sqlite:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs: [backend-checks, frontend-checks]
|
needs: [backend-checks, frontend-checks]
|
||||||
container:
|
container:
|
||||||
|
@ -247,7 +258,7 @@ jobs:
|
||||||
TEST_TAGS: sqlite sqlite_unlock_notify
|
TEST_TAGS: sqlite sqlite_unlock_notify
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
security-check:
|
security-check:
|
||||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
needs:
|
needs:
|
||||||
- test-sqlite
|
- test-sqlite
|
||||||
|
|
|
@ -62,7 +62,7 @@ func initRemoveTags() {
|
||||||
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
|
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
|
||||||
"server", "servidor", "kiszolgáló", "serveris",
|
"server", "servidor", "kiszolgáló", "serveris",
|
||||||
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
|
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
|
||||||
"filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo",
|
"filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo", "datnes nosaukums",
|
||||||
} {
|
} {
|
||||||
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
|
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1938,7 +1938,7 @@ LEVEL = Info
|
||||||
;ENABLED = true
|
;ENABLED = true
|
||||||
;;
|
;;
|
||||||
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
||||||
;ALLOWED_TYPES = .cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
|
;ALLOWED_TYPES = .avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
|
||||||
;;
|
;;
|
||||||
;; Max size of each file. Defaults to 2048MB
|
;; Max size of each file. Defaults to 2048MB
|
||||||
;MAX_SIZE = 2048
|
;MAX_SIZE = 2048
|
||||||
|
|
12
go.mod
12
go.mod
|
@ -23,7 +23,7 @@ require (
|
||||||
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
|
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.14.0
|
||||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
|
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
|
||||||
github.com/blevesearch/bleve/v2 v2.4.2
|
github.com/blevesearch/bleve/v2 v2.4.3
|
||||||
github.com/buildkite/terminal-to-html/v3 v3.16.4
|
github.com/buildkite/terminal-to-html/v3 v3.16.4
|
||||||
github.com/caddyserver/certmagic v0.21.4
|
github.com/caddyserver/certmagic v0.21.4
|
||||||
github.com/chi-middleware/proxy v1.1.1
|
github.com/chi-middleware/proxy v1.1.1
|
||||||
|
@ -137,13 +137,13 @@ require (
|
||||||
github.com/aymerick/douceur v0.2.0 // indirect
|
github.com/aymerick/douceur v0.2.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bits-and-blooms/bitset v1.13.0 // indirect
|
github.com/bits-and-blooms/bitset v1.13.0 // indirect
|
||||||
github.com/blevesearch/bleve_index_api v1.1.10 // indirect
|
github.com/blevesearch/bleve_index_api v1.1.12 // indirect
|
||||||
github.com/blevesearch/geo v0.1.20 // indirect
|
github.com/blevesearch/geo v0.1.20 // indirect
|
||||||
github.com/blevesearch/go-faiss v1.0.20 // indirect
|
github.com/blevesearch/go-faiss v1.0.23 // indirect
|
||||||
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
|
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
|
||||||
github.com/blevesearch/gtreap v0.1.1 // indirect
|
github.com/blevesearch/gtreap v0.1.1 // indirect
|
||||||
github.com/blevesearch/mmap-go v1.0.4 // indirect
|
github.com/blevesearch/mmap-go v1.0.4 // indirect
|
||||||
github.com/blevesearch/scorch_segment_api/v2 v2.2.15 // indirect
|
github.com/blevesearch/scorch_segment_api/v2 v2.2.16 // indirect
|
||||||
github.com/blevesearch/segment v0.9.1 // indirect
|
github.com/blevesearch/segment v0.9.1 // indirect
|
||||||
github.com/blevesearch/snowballstem v0.9.0 // indirect
|
github.com/blevesearch/snowballstem v0.9.0 // indirect
|
||||||
github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect
|
github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect
|
||||||
|
@ -152,8 +152,8 @@ require (
|
||||||
github.com/blevesearch/zapx/v12 v12.3.10 // indirect
|
github.com/blevesearch/zapx/v12 v12.3.10 // indirect
|
||||||
github.com/blevesearch/zapx/v13 v13.3.10 // indirect
|
github.com/blevesearch/zapx/v13 v13.3.10 // indirect
|
||||||
github.com/blevesearch/zapx/v14 v14.3.10 // indirect
|
github.com/blevesearch/zapx/v14 v14.3.10 // indirect
|
||||||
github.com/blevesearch/zapx/v15 v15.3.13 // indirect
|
github.com/blevesearch/zapx/v15 v15.3.16 // indirect
|
||||||
github.com/blevesearch/zapx/v16 v16.1.5 // indirect
|
github.com/blevesearch/zapx/v16 v16.1.8 // indirect
|
||||||
github.com/boombuler/barcode v1.0.1 // indirect
|
github.com/boombuler/barcode v1.0.1 // indirect
|
||||||
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
|
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
|
||||||
github.com/caddyserver/zerossl v0.1.3 // indirect
|
github.com/caddyserver/zerossl v0.1.3 // indirect
|
||||||
|
|
24
go.sum
24
go.sum
|
@ -98,22 +98,22 @@ github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJR
|
||||||
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
|
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
|
||||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4=
|
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4=
|
||||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
|
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
|
||||||
github.com/blevesearch/bleve/v2 v2.4.2 h1:NooYP1mb3c0StkiY9/xviiq2LGSaE8BQBCc/pirMx0U=
|
github.com/blevesearch/bleve/v2 v2.4.3 h1:XDYj+1prgX84L2Cf+V3ojrOPqXxy0qxyd2uLMmeuD+4=
|
||||||
github.com/blevesearch/bleve/v2 v2.4.2/go.mod h1:ATNKj7Yl2oJv/lGuF4kx39bST2dveX6w0th2FFYLkc8=
|
github.com/blevesearch/bleve/v2 v2.4.3/go.mod h1:hEPDPrbYw3vyrm5VOa36GyS4bHWuIf4Fflp7460QQXY=
|
||||||
github.com/blevesearch/bleve_index_api v1.1.10 h1:PDLFhVjrjQWr6jCuU7TwlmByQVCSEURADHdCqVS9+g0=
|
github.com/blevesearch/bleve_index_api v1.1.12 h1:P4bw9/G/5rulOF7SJ9l4FsDoo7UFJ+5kexNy1RXfegY=
|
||||||
github.com/blevesearch/bleve_index_api v1.1.10/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8=
|
github.com/blevesearch/bleve_index_api v1.1.12/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8=
|
||||||
github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM=
|
github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM=
|
||||||
github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w=
|
github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w=
|
||||||
github.com/blevesearch/go-faiss v1.0.20 h1:AIkdTQFWuZ5LQmKQSebgMR4RynGNw8ZseJXaan5kvtI=
|
github.com/blevesearch/go-faiss v1.0.23 h1:Wmc5AFwDLKGl2L6mjLX1Da3vCL0EKa2uHHSorcIS1Uc=
|
||||||
github.com/blevesearch/go-faiss v1.0.20/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8=
|
github.com/blevesearch/go-faiss v1.0.23/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk=
|
||||||
github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
|
github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
|
||||||
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
|
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
|
||||||
github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y=
|
github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y=
|
||||||
github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk=
|
github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk=
|
||||||
github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc=
|
github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc=
|
||||||
github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs=
|
github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs=
|
||||||
github.com/blevesearch/scorch_segment_api/v2 v2.2.15 h1:prV17iU/o+A8FiZi9MXmqbagd8I0bCqM7OKUYPbnb5Y=
|
github.com/blevesearch/scorch_segment_api/v2 v2.2.16 h1:uGvKVvG7zvSxCwcm4/ehBa9cCEuZVE+/zvrSl57QUVY=
|
||||||
github.com/blevesearch/scorch_segment_api/v2 v2.2.15/go.mod h1:db0cmP03bPNadXrCDuVkKLV6ywFSiRgPFT1YVrestBc=
|
github.com/blevesearch/scorch_segment_api/v2 v2.2.16/go.mod h1:VF5oHVbIFTu+znY1v30GjSpT5+9YFs9dV2hjvuh34F0=
|
||||||
github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU=
|
github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU=
|
||||||
github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw=
|
github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw=
|
||||||
github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s=
|
github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s=
|
||||||
|
@ -130,10 +130,10 @@ github.com/blevesearch/zapx/v13 v13.3.10 h1:0KY9tuxg06rXxOZHg3DwPJBjniSlqEgVpxIq
|
||||||
github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk=
|
github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk=
|
||||||
github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz77pSwwKU=
|
github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz77pSwwKU=
|
||||||
github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns=
|
github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns=
|
||||||
github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ=
|
github.com/blevesearch/zapx/v15 v15.3.16 h1:Ct3rv7FUJPfPk99TI/OofdC+Kpb4IdyfdMH48sb+FmE=
|
||||||
github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg=
|
github.com/blevesearch/zapx/v15 v15.3.16/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg=
|
||||||
github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi/AUHjU=
|
github.com/blevesearch/zapx/v16 v16.1.8 h1:Bxzpw6YQpFs7UjoCV1+RvDw6fmAT2GZxldwX8b3wVBM=
|
||||||
github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8=
|
github.com/blevesearch/zapx/v16 v16.1.8/go.mod h1:JqQlOqlRVaYDkpLIl3JnKql8u4zKTNlVEa3nLsi0Gn8=
|
||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
|
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
|
||||||
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
|
|
|
@ -96,7 +96,7 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
Target *string `json:"target"`
|
Target *string `json:"target"`
|
||||||
Kind string `json:"kind"`
|
Kind string `json:"kind"`
|
||||||
Registry *string `json:"registry"`
|
Registry *string `json:"registry"`
|
||||||
ExplicitNameInToml string `json:"explicit_name_in_toml"`
|
ExplicitNameInToml *string `json:"explicit_name_in_toml"`
|
||||||
} `json:"deps"`
|
} `json:"deps"`
|
||||||
Features map[string][]string `json:"features"`
|
Features map[string][]string `json:"features"`
|
||||||
Authors []string `json:"authors"`
|
Authors []string `json:"authors"`
|
||||||
|
@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
|
|
||||||
dependencies := make([]*Dependency, 0, len(meta.Deps))
|
dependencies := make([]*Dependency, 0, len(meta.Deps))
|
||||||
for _, dep := range meta.Deps {
|
for _, dep := range meta.Deps {
|
||||||
|
name := dep.Name
|
||||||
|
packageName := dep.ExplicitNameInToml
|
||||||
|
// If the explicit_name_in_toml field is set, the package is renamed and
|
||||||
|
// should be set accordingly.
|
||||||
|
if dep.ExplicitNameInToml != nil {
|
||||||
|
name = *dep.ExplicitNameInToml
|
||||||
|
packageName = &dep.Name
|
||||||
|
}
|
||||||
dependencies = append(dependencies, &Dependency{
|
dependencies = append(dependencies, &Dependency{
|
||||||
Name: dep.Name,
|
Name: name,
|
||||||
Req: dep.VersionReq,
|
Req: dep.VersionReq,
|
||||||
Features: dep.Features,
|
Features: dep.Features,
|
||||||
Optional: dep.Optional,
|
Optional: dep.Optional,
|
||||||
|
@ -145,6 +153,7 @@ func parsePackage(r io.Reader) (*Package, error) {
|
||||||
Target: dep.Target,
|
Target: dep.Target,
|
||||||
Kind: dep.Kind,
|
Kind: dep.Kind,
|
||||||
Registry: dep.Registry,
|
Registry: dep.Registry,
|
||||||
|
Package: packageName,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestParsePackage(t *testing.T) {
|
func TestParsePackage(t *testing.T) {
|
||||||
createPackage := func(name, version string) io.Reader {
|
createPackage := func(name, version, dependency string) io.Reader {
|
||||||
metadata := `{
|
metadata := `{
|
||||||
"name":"` + name + `",
|
"name":"` + name + `",
|
||||||
"vers":"` + version + `",
|
"vers":"` + version + `",
|
||||||
|
@ -32,7 +32,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
{
|
{
|
||||||
"name":"dep",
|
"name":"dep",
|
||||||
"version_req":"1.0"
|
"version_req":"1.0"
|
||||||
}
|
}` + dependency + `
|
||||||
],
|
],
|
||||||
"homepage":"` + homepage + `",
|
"homepage":"` + homepage + `",
|
||||||
"license":"` + license + `"
|
"license":"` + license + `"
|
||||||
|
@ -48,7 +48,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
|
|
||||||
t.Run("InvalidName", func(t *testing.T) {
|
t.Run("InvalidName", func(t *testing.T) {
|
||||||
for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} {
|
for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} {
|
||||||
data := createPackage(name, "1.0.0")
|
data := createPackage(name, "1.0.0", "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.Nil(t, cp)
|
assert.Nil(t, cp)
|
||||||
|
@ -58,7 +58,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
|
|
||||||
t.Run("InvalidVersion", func(t *testing.T) {
|
t.Run("InvalidVersion", func(t *testing.T) {
|
||||||
for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} {
|
for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} {
|
||||||
data := createPackage("test", version)
|
data := createPackage("test", version, "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.Nil(t, cp)
|
assert.Nil(t, cp)
|
||||||
|
@ -67,7 +67,7 @@ func TestParsePackage(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Valid", func(t *testing.T) {
|
t.Run("Valid", func(t *testing.T) {
|
||||||
data := createPackage("test", "1.0.0")
|
data := createPackage("test", "1.0.0", "")
|
||||||
|
|
||||||
cp, err := ParsePackage(data)
|
cp, err := ParsePackage(data)
|
||||||
assert.NotNil(t, cp)
|
assert.NotNil(t, cp)
|
||||||
|
@ -84,4 +84,25 @@ func TestParsePackage(t *testing.T) {
|
||||||
content, _ := io.ReadAll(cp.Content)
|
content, _ := io.ReadAll(cp.Content)
|
||||||
assert.Equal(t, "test", string(content))
|
assert.Equal(t, "test", string(content))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("Renamed dependency", func(t *testing.T) {
|
||||||
|
data := createPackage("test", "1.0.0", `, {"name":"v4l2-sys", "version":"0.3.0", "explicit_name_in_toml":"v4l2-sys-mit"}`)
|
||||||
|
|
||||||
|
cp, err := ParsePackage(data)
|
||||||
|
assert.NotNil(t, cp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, "test", cp.Name)
|
||||||
|
assert.Equal(t, "1.0.0", cp.Version)
|
||||||
|
assert.Equal(t, description, cp.Metadata.Description)
|
||||||
|
assert.Equal(t, []string{author}, cp.Metadata.Authors)
|
||||||
|
assert.Len(t, cp.Metadata.Dependencies, 2)
|
||||||
|
assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name)
|
||||||
|
assert.EqualValues(t, "v4l2-sys-mit", cp.Metadata.Dependencies[1].Name)
|
||||||
|
assert.EqualValues(t, "v4l2-sys", *cp.Metadata.Dependencies[1].Package)
|
||||||
|
assert.Equal(t, homepage, cp.Metadata.ProjectURL)
|
||||||
|
assert.Equal(t, license, cp.Metadata.License)
|
||||||
|
content, _ := io.ReadAll(cp.Content)
|
||||||
|
assert.Equal(t, "test", string(content))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ var Attachment = struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
}{
|
}{
|
||||||
Storage: &Storage{},
|
Storage: &Storage{},
|
||||||
AllowedTypes: ".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip",
|
AllowedTypes: ".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip",
|
||||||
MaxSize: 2048,
|
MaxSize: 2048,
|
||||||
MaxFiles: 5,
|
MaxFiles: 5,
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
|
@ -25,7 +25,7 @@ func loadAttachmentFrom(rootCfg ConfigProvider) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip")
|
Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip")
|
||||||
Attachment.MaxSize = sec.Key("MAX_SIZE").MustInt64(2048)
|
Attachment.MaxSize = sec.Key("MAX_SIZE").MustInt64(2048)
|
||||||
Attachment.MaxFiles = sec.Key("MAX_FILES").MustInt(5)
|
Attachment.MaxFiles = sec.Key("MAX_FILES").MustInt(5)
|
||||||
Attachment.Enabled = sec.Key("ENABLED").MustBool(true)
|
Attachment.Enabled = sec.Key("ENABLED").MustBool(true)
|
||||||
|
|
|
@ -486,7 +486,7 @@ func PrintCurrentTest(t testing.TB, skip ...int) func() {
|
||||||
|
|
||||||
if err := WriterCloser.popT(); err != nil {
|
if err := WriterCloser.popT(); err != nil {
|
||||||
// disable test failure for now (too flacky)
|
// disable test failure for now (too flacky)
|
||||||
_, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err)
|
_, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v\n", err)
|
||||||
// t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err)
|
// t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,8 @@ const sniffLen = 1024
|
||||||
const (
|
const (
|
||||||
// SvgMimeType MIME type of SVG images.
|
// SvgMimeType MIME type of SVG images.
|
||||||
SvgMimeType = "image/svg+xml"
|
SvgMimeType = "image/svg+xml"
|
||||||
|
// AvifMimeType MIME type of AVIF images
|
||||||
|
AvifMimeType = "image/avif"
|
||||||
// ApplicationOctetStream MIME type of binary files.
|
// ApplicationOctetStream MIME type of binary files.
|
||||||
ApplicationOctetStream = "application/octet-stream"
|
ApplicationOctetStream = "application/octet-stream"
|
||||||
)
|
)
|
||||||
|
@ -106,6 +108,12 @@ func DetectContentType(data []byte) SniffedType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AVIF is unsuported by http.DetectContentType
|
||||||
|
// Signature taken from https://stackoverflow.com/a/68322450
|
||||||
|
if bytes.Index(data, []byte("ftypavif")) == 4 {
|
||||||
|
ct = AvifMimeType
|
||||||
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(ct, "audio/") && bytes.HasPrefix(data, []byte("ID3")) {
|
if strings.HasPrefix(ct, "audio/") && bytes.HasPrefix(data, []byte("ID3")) {
|
||||||
// The MP3 detection is quite inaccurate, any content with "ID3" prefix will result in "audio/mpeg".
|
// The MP3 detection is quite inaccurate, any content with "ID3" prefix will result in "audio/mpeg".
|
||||||
// So remove the "ID3" prefix and detect again, if result is text, then it must be text content.
|
// So remove the "ID3" prefix and detect again, if result is text, then it must be text content.
|
||||||
|
|
|
@ -135,3 +135,13 @@ func TestDetectContentTypeOgg(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.True(t, st.IsVideo())
|
assert.True(t, st.IsVideo())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDetectContentTypeAvif(t *testing.T) {
|
||||||
|
avifImage, err := hex.DecodeString("000000206674797061766966")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
st, err := DetectContentTypeFromReader(bytes.NewReader(avifImage))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.True(t, st.IsImage())
|
||||||
|
}
|
||||||
|
|
|
@ -2859,6 +2859,7 @@ issues.review.add_remove_review_requests = požádal/a o kontroly od %[1]s a ods
|
||||||
pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit.
|
pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit.
|
||||||
pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit.
|
pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy.
|
||||||
|
issues.filter_sort.relevance = Relevance
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading_info = Tohle může chvíli trvat…
|
component_loading_info = Tohle může chvíli trvat…
|
||||||
|
|
|
@ -2844,6 +2844,7 @@ issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und h
|
||||||
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden.
|
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden.
|
||||||
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden.
|
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen.
|
||||||
|
issues.filter_sort.relevance = Relevanz
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
|
|
@ -199,6 +199,11 @@ buttons.enable_monospace_font=Activar fuente monoespaciada
|
||||||
buttons.disable_monospace_font=Desactivar fuente monoespaciada
|
buttons.disable_monospace_font=Desactivar fuente monoespaciada
|
||||||
buttons.unindent.tooltip = Desanidar elementos por un nivel
|
buttons.unindent.tooltip = Desanidar elementos por un nivel
|
||||||
buttons.indent.tooltip = Anidar elementos por un nivel
|
buttons.indent.tooltip = Anidar elementos por un nivel
|
||||||
|
buttons.new_table.tooltip = Añadir tabla
|
||||||
|
table_modal.header = Añadir tabla
|
||||||
|
table_modal.placeholder.header = Cabecera
|
||||||
|
table_modal.label.rows = Filas
|
||||||
|
table_modal.label.columns = Columnas
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc=A - Z
|
string.asc=A - Z
|
||||||
|
@ -475,6 +480,7 @@ back_to_sign_in = Volver a Iniciar sesión
|
||||||
sign_in_openid = Proceder con OpenID
|
sign_in_openid = Proceder con OpenID
|
||||||
remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
|
remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
|
||||||
unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información
|
unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información
|
||||||
|
use_onetime_code = Usar código de un solo uso
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Ver en %s
|
view_it_on=Ver en %s
|
||||||
|
@ -1036,7 +1042,7 @@ update_hints = Actualizar sugerencias
|
||||||
pronouns = Pronombres
|
pronouns = Pronombres
|
||||||
pronouns_custom = Personalizados
|
pronouns_custom = Personalizados
|
||||||
additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales
|
additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales
|
||||||
additional_repo_units_hint_description = Mostrar un botón "Añadir más unidades..." para los repositorios que no tengan habilitadas todas las unidades disponibles.
|
additional_repo_units_hint_description = Mostrar la sugerencia "Habilitar más" para los repositorios que no tengan habilitadas todas las unidades disponibles.
|
||||||
language.title = Idioma por defecto
|
language.title = Idioma por defecto
|
||||||
update_hints_success = Se han actualizado las sugerencias.
|
update_hints_success = Se han actualizado las sugerencias.
|
||||||
pronouns_unspecified = No especificados
|
pronouns_unspecified = No especificados
|
||||||
|
@ -1769,8 +1775,8 @@ issues.review.left_comment=dejó un comentario
|
||||||
issues.review.content.empty=Es necesario dejar un comentario indicando los cambios solicitados.
|
issues.review.content.empty=Es necesario dejar un comentario indicando los cambios solicitados.
|
||||||
issues.review.reject=cambios solicitados %s
|
issues.review.reject=cambios solicitados %s
|
||||||
issues.review.wait=fue solicitado para revisión %s
|
issues.review.wait=fue solicitado para revisión %s
|
||||||
issues.review.add_review_request=solicitó revisión de %s %s
|
issues.review.add_review_request=solicitó revisión de %[1]s %[2]s
|
||||||
issues.review.remove_review_request=eliminó la solicitud de revisión para %s %s
|
issues.review.remove_review_request=eliminó la solicitud de revisión para %[1]s %[2]s
|
||||||
issues.review.remove_review_request_self=se negó a revisar %s
|
issues.review.remove_review_request_self=se negó a revisar %s
|
||||||
issues.review.pending=Pendiente
|
issues.review.pending=Pendiente
|
||||||
issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página.
|
issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página.
|
||||||
|
@ -2750,7 +2756,7 @@ pulls.cmd_instruction_merge_title = Fusionar
|
||||||
contributors.contribution_type.deletions = Eliminaciones
|
contributors.contribution_type.deletions = Eliminaciones
|
||||||
contributors.contribution_type.filter_label = Tipo de contribución:
|
contributors.contribution_type.filter_label = Tipo de contribución:
|
||||||
contributors.contribution_type.additions = Adiciones
|
contributors.contribution_type.additions = Adiciones
|
||||||
settings.units.add_more = Añadir más...
|
settings.units.add_more = Habilitar más
|
||||||
wiki.cancel = Cancelar
|
wiki.cancel = Cancelar
|
||||||
activity.published_prerelease_label = Pre-lanzamiento
|
activity.published_prerelease_label = Pre-lanzamiento
|
||||||
activity.published_tag_label = Etiqueta
|
activity.published_tag_label = Etiqueta
|
||||||
|
@ -2775,6 +2781,16 @@ settings.mirror_settings.push_mirror.copy_public_key = Copiar clave pública
|
||||||
issues.new.assign_to_me = Asignar a mi
|
issues.new.assign_to_me = Asignar a mi
|
||||||
issues.all_title = Todos
|
issues.all_title = Todos
|
||||||
settings.wiki_globally_editable = Permitir a cualquiera editar la wiki
|
settings.wiki_globally_editable = Permitir a cualquiera editar la wiki
|
||||||
|
settings.new_owner_blocked_doer = El nuevo propietario te ha bloqueado.
|
||||||
|
settings.add_collaborator_blocked_our = No se puede añadir al colaborador debido a que el propietario del repositorio lo ha bloqueado.
|
||||||
|
settings.discord_icon_url.exceeds_max_length = La URL del icono debe tener una longitud menor o igual a 2048 caracteres
|
||||||
|
settings.add_webhook.invalid_path = La ruta no debe contener una parte que sea "." o ".." o la cadena vacía. No puede empezar o acabar con una barra oblicua.
|
||||||
|
settings.wiki_rename_branch_main_notices_1 = Esta operación <strong>NO SE PUEDE</strong> deshacer.
|
||||||
|
settings.add_collaborator_blocked_them = No se puede añadir al colaborador debido a que este ha bloqueado al propietario del repositorio.
|
||||||
|
settings.transfer.button = Transferir la propiedad
|
||||||
|
settings.transfer.modal.title = Transferir la propiedad
|
||||||
|
settings.enter_repo_name = Introduce el nombre del propietario y del repositorio exactamente como se muestra:
|
||||||
|
settings.confirmation_string = Cadena de confirmación
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
@ -3814,6 +3830,7 @@ exact_tooltip = Incluir sólo los resultados que corresponden al término de bú
|
||||||
issue_kind = Buscar incidencias…
|
issue_kind = Buscar incidencias…
|
||||||
fuzzy = Difusa
|
fuzzy = Difusa
|
||||||
runner_kind = Buscar ejecutores…
|
runner_kind = Buscar ejecutores…
|
||||||
|
regexp_tooltip = Interpretar los términos de búsqueda como una expresión regular
|
||||||
|
|
||||||
[markup]
|
[markup]
|
||||||
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s
|
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s
|
||||||
|
|
|
@ -567,6 +567,7 @@ followers.title.few = seuraajaa
|
||||||
following.title.one = Seurataan
|
following.title.one = Seurataan
|
||||||
following.title.few = Seurataan
|
following.title.few = Seurataan
|
||||||
joined_on = Liittynyt %s
|
joined_on = Liittynyt %s
|
||||||
|
public_activity.visibility_hint.self_private = Toimintasi näkyy vain sinulle ja instanssin ylläpitäjille. <a href="%s">Määritä</a>.
|
||||||
|
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
|
@ -801,6 +802,10 @@ change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäe
|
||||||
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
|
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
|
||||||
change_password = Vaihda salasana
|
change_password = Vaihda salasana
|
||||||
webauthn_key_loss_warning = Jos kadotat turva-avaimesi, menetät pääsyn tilillesi.
|
webauthn_key_loss_warning = Jos kadotat turva-avaimesi, menetät pääsyn tilillesi.
|
||||||
|
keep_activity_private.description = <a href="%s">Julkinen toimintasi</a> näkyy vain sinulle ja instanssin ylläpitäjille.
|
||||||
|
email_desc = Ensisijaista sähköpostiosoitettasi käytetään ilmoituksiin, salasanan palautukseen ja jos sähköpostiosoite ei ole piilotettu, web-pohjaisiin Git-toimenpiteisiin.
|
||||||
|
tokens_desc = Nämä poletit mahdollistavat pääsyn tilillesi Forgejon rajapintaa vasten.
|
||||||
|
keep_email_private_popup = Tämä piilottaa sähköpostiosoitteesi profiilistasi. Se ei ole enää oletus verkkosivukäyttöliittymän kautta tehdyissä kommiteissa, kuten tiedostojen lähetyksissä ja muokkauksissa, eikä sitä käytetä yhdistämiskommiteissa. Sen sijaan erikoisosoitetta %s voidaan käyttää kommittien liittämisessä tiliisi. Ota huomioon, ettei tämän asetuksen muuttaminen vaikuta olemassa oleviin kommitteihin.
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
owner=Omistaja
|
owner=Omistaja
|
||||||
|
@ -2384,6 +2389,7 @@ conan.registry = Määritä tämä rekisteri komentoriviltä:
|
||||||
conda.install = Asenna paketti Condalla suorittamalla seuraava komento:
|
conda.install = Asenna paketti Condalla suorittamalla seuraava komento:
|
||||||
helm.registry = Määritä tämä rekisteri komentoriviltä:
|
helm.registry = Määritä tämä rekisteri komentoriviltä:
|
||||||
pub.install = Asenna paketti Dartilla suorittamalla seuraava komento:
|
pub.install = Asenna paketti Dartilla suorittamalla seuraava komento:
|
||||||
|
owner.settings.cargo.title = Cargon rekisteri-indeksi
|
||||||
|
|
||||||
[secrets]
|
[secrets]
|
||||||
creation.failed = Salaisuuden lisääminen epäonnistui.
|
creation.failed = Salaisuuden lisääminen epäonnistui.
|
||||||
|
|
|
@ -201,6 +201,11 @@ buttons.disable_monospace_font=Désactiver la police à chasse fixe
|
||||||
buttons.indent.tooltip = Indenter les éléments d'un niveau
|
buttons.indent.tooltip = Indenter les éléments d'un niveau
|
||||||
buttons.unindent.tooltip = Supprimer un niveau d'indentation
|
buttons.unindent.tooltip = Supprimer un niveau d'indentation
|
||||||
buttons.new_table.tooltip = Ajouter une table
|
buttons.new_table.tooltip = Ajouter une table
|
||||||
|
table_modal.header = Ajouter une table
|
||||||
|
table_modal.placeholder.header = Entête
|
||||||
|
table_modal.placeholder.content = Contenu
|
||||||
|
table_modal.label.rows = Lignes
|
||||||
|
table_modal.label.columns = Colonnes
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc=A - Z
|
string.asc=A - Z
|
||||||
|
@ -480,6 +485,7 @@ hint_login = Vous avez déjà un compte ? <a href="%s">Connectez vous maintena
|
||||||
back_to_sign_in = Retour à la connexion
|
back_to_sign_in = Retour à la connexion
|
||||||
sign_in_openid = Continuer avec OpenID
|
sign_in_openid = Continuer avec OpenID
|
||||||
unauthorized_credentials = Vos identifiants sont invalides ou ont expiré. Réessayez votre commande, ou allez à %s pour plus d'informations
|
unauthorized_credentials = Vos identifiants sont invalides ou ont expiré. Réessayez votre commande, ou allez à %s pour plus d'informations
|
||||||
|
use_onetime_code = Utiliser un code a usage unique
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Voir sur %s
|
view_it_on=Voir sur %s
|
||||||
|
@ -743,7 +749,7 @@ uid=UID
|
||||||
webauthn=Clés de sécurité à deux facteurs
|
webauthn=Clés de sécurité à deux facteurs
|
||||||
|
|
||||||
public_profile=Profil public
|
public_profile=Profil public
|
||||||
biography_placeholder=Parlez-nous un peu de vous ! (Vous pouvez utiliser Markdown)
|
biography_placeholder=Parlez-nous un peu de vous ! (Markdown est interprété)
|
||||||
location_placeholder=Partagez votre position approximative avec d'autres personnes
|
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=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
|
||||||
password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails.
|
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.
|
||||||
|
@ -939,7 +945,7 @@ select_permissions=Sélectionner les autorisations
|
||||||
permission_no_access=Aucun accès
|
permission_no_access=Aucun accès
|
||||||
permission_read=Lecture
|
permission_read=Lecture
|
||||||
permission_write=Lecture et écriture
|
permission_write=Lecture et écriture
|
||||||
access_token_desc=Les autorisations des jetons sélectionnées se limitent aux <a href="%[1]s" target="_blank">routes API</a> correspondantes. Lisez la <a href="%[2]s" target="_blank">documentation</a> pour plus d’informations.
|
access_token_desc=Les autorisations des jetons sélectionnées se limitent aux <a href="%[1]s" target="_blank">routes API</a> correspondantes. Lisez la <a href="%[2]s" target="_blank">documentation</a> pour plus d’information.
|
||||||
at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton
|
at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton
|
||||||
permissions_list=Autorisations :
|
permissions_list=Autorisations :
|
||||||
|
|
||||||
|
@ -1781,8 +1787,8 @@ issues.review.left_comment=laisser un commentaire
|
||||||
issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s).
|
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.reject=a requis les changements %s
|
||||||
issues.review.wait=a été sollicité pour évaluer cette demande d’ajout %s
|
issues.review.wait=a été sollicité pour évaluer cette demande d’ajout %s
|
||||||
issues.review.add_review_request=a demandé à %s une évaluation %s
|
issues.review.add_review_request=demande d'évaluation de %[1]s %[2]s
|
||||||
issues.review.remove_review_request=a retiré la demande d’évaluation pour %s %s
|
issues.review.remove_review_request=demande d’évaluation retirée pour %[1]s %[2]s
|
||||||
issues.review.remove_review_request_self=a refusé d’évaluer cette demande d’ajout %s
|
issues.review.remove_review_request_self=a refusé d’évaluer cette demande d’ajout %s
|
||||||
issues.review.pending=En attente
|
issues.review.pending=En attente
|
||||||
issues.review.pending.tooltip=Ce commentaire n'est pas encore visible par les autres utilisateurs. Pour soumettre vos commentaires en attente, sélectionnez "%s" → "%s/%s/%s" en haut de la page.
|
issues.review.pending.tooltip=Ce commentaire n'est pas encore visible par les autres utilisateurs. Pour soumettre vos commentaires en attente, sélectionnez "%s" → "%s/%s/%s" en haut de la page.
|
||||||
|
@ -2583,7 +2589,7 @@ diff.generated=générée
|
||||||
diff.vendored=externe
|
diff.vendored=externe
|
||||||
diff.comment.add_line_comment=Commenter cette ligne
|
diff.comment.add_line_comment=Commenter cette ligne
|
||||||
diff.comment.placeholder=Laisser un commentaire
|
diff.comment.placeholder=Laisser un commentaire
|
||||||
diff.comment.markdown_info=Formater avec Markdown.
|
diff.comment.markdown_info=Formater avec Markdown est autorisé.
|
||||||
diff.comment.add_single_comment=Commenter (simple)
|
diff.comment.add_single_comment=Commenter (simple)
|
||||||
diff.comment.add_review_comment=Commenter
|
diff.comment.add_review_comment=Commenter
|
||||||
diff.comment.start_review=Débuter une évaluation
|
diff.comment.start_review=Débuter une évaluation
|
||||||
|
@ -2834,12 +2840,12 @@ settings.pull_mirror_sync_quota_exceeded = Quota dépassé, les modifications ne
|
||||||
activity.commit = Activité de commit
|
activity.commit = Activité de commit
|
||||||
settings.mirror_settings.push_mirror.copy_public_key = Copier la clé publique
|
settings.mirror_settings.push_mirror.copy_public_key = Copier la clé publique
|
||||||
release.asset_external_url = URL externe
|
release.asset_external_url = URL externe
|
||||||
release.invalid_external_url = URL externe non valable : « %s »
|
release.invalid_external_url = URL externe non valable : "%s "
|
||||||
milestones.filter_sort.name = Nom
|
milestones.filter_sort.name = Nom
|
||||||
settings.mirror_settings.push_mirror.none_ssh = Aucun
|
settings.mirror_settings.push_mirror.none_ssh = Aucun
|
||||||
settings.protect_new_rule = Créer une nouvelle règle de protection de branche
|
settings.protect_new_rule = Créer une nouvelle règle de protection de branche
|
||||||
pulls.cmd_instruction_merge_warning = <b>Avertissement :</b> Le paramètre "détection automatique de la fusion manuelle" n'est pas activé pour ce dépôt, vous devrez marquer cette demande d'ajout comme manuellement fusionnée après.
|
pulls.cmd_instruction_merge_warning = <b>Avertissement :</b> Le paramètre "détection automatique de la fusion manuelle" n'est pas activé pour ce dépôt, vous devrez marquer cette demande d'ajout comme manuellement fusionnée après.
|
||||||
release.type_external_asset = Actif Externe
|
release.type_external_asset = Actif externe
|
||||||
activity.published_prerelease_label = Pré-version
|
activity.published_prerelease_label = Pré-version
|
||||||
activity.published_tag_label = Étiquette
|
activity.published_tag_label = Étiquette
|
||||||
release.asset_name = Nom de l'actif
|
release.asset_name = Nom de l'actif
|
||||||
|
@ -2847,6 +2853,13 @@ release.add_external_asset = Ajouter un actif externe
|
||||||
issues.new.assign_to_me = Assigner à moi-même
|
issues.new.assign_to_me = Assigner à moi-même
|
||||||
issues.all_title = Tous
|
issues.all_title = Tous
|
||||||
settings.discord_icon_url.exceeds_max_length = L'URL de l’icône ne doit pas dépasser 2048 caractères
|
settings.discord_icon_url.exceeds_max_length = L'URL de l’icône ne doit pas dépasser 2048 caractères
|
||||||
|
issues.review.add_review_requests = demandes d'évaluation de %[1]s %[2]s
|
||||||
|
issues.review.remove_review_requests = demandes d’évaluation retirée pour %[1]s %[2]s
|
||||||
|
issues.review.add_remove_review_requests = demandes d'évaluation pour %[1]s et demandes d'évaluation retirées pour %[2]s %[3]s
|
||||||
|
pulls.delete_after_merge.head_branch.is_protected = La branche head que vous voulez supprimer est une branche protégée et ne peut pas être supprimée.
|
||||||
|
pulls.delete_after_merge.head_branch.is_default = La branche head que vous voulez supprimer est la branche par défaut et ne peut pas être supprimée.
|
||||||
|
pulls.delete_after_merge.head_branch.insufficient_branch = Vous n'avez pas le droit de supprimer la branche head.
|
||||||
|
issues.filter_sort.relevance = Pertinence
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading=Chargement de %s…
|
component_loading=Chargement de %s…
|
||||||
|
|
|
@ -1172,20 +1172,20 @@ invisible_runes_header=`Šīs fails satur neredzamus unikoda simbolus`
|
||||||
invisible_runes_description=`Šis fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
|
invisible_runes_description=`Šis fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
|
||||||
ambiguous_runes_header=`Šis fails satur neviennozīmīgus unikoda simbolus`
|
ambiguous_runes_header=`Šis fails satur neviennozīmīgus unikoda simbolus`
|
||||||
ambiguous_runes_description=`Šis fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
|
ambiguous_runes_description=`Šis fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
|
||||||
invisible_runes_line=`Šī līnija satur neredzamus unikoda simbolus`
|
invisible_runes_line=`Šajā rindā ir neredzamas unikoda rakstzīmes`
|
||||||
ambiguous_runes_line=`Šī līnija satur neviennozīmīgus unikoda simbolus`
|
ambiguous_runes_line=`Šajā rindā ir neviennozīmīgas unikoda rakstzīmes`
|
||||||
ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]`
|
ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]`
|
||||||
|
|
||||||
escape_control_characters=Kodēt
|
escape_control_characters=Kodēt
|
||||||
unescape_control_characters=Atkodēt
|
unescape_control_characters=Atkodēt
|
||||||
file_copy_permalink=Kopēt saiti
|
file_copy_permalink=Ievietot pastāvīgo saiti starpliktuvē
|
||||||
view_git_blame=Aplūkot Git vainīgos
|
view_git_blame=Apskatīt Git izmaiņu veicējus
|
||||||
video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video.
|
video_not_supported_in_browser=Pārlūks neatbalsta HTML5 tagu "video".
|
||||||
audio_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 audio.
|
audio_not_supported_in_browser=Pārlūks neatbalsta HTML5 tagu "audio".
|
||||||
stored_lfs=Saglabāts Git LFS
|
stored_lfs=Saglabāts Git LFS
|
||||||
symbolic_link=Simboliska saite
|
symbolic_link=Simboliska saite
|
||||||
executable_file=Izpildāmais fails
|
executable_file=Izpildāma datne
|
||||||
commit_graph=Revīziju grafs
|
commit_graph=Iesūtījumu karte
|
||||||
commit_graph.select=Izvēlieties atzarus
|
commit_graph.select=Izvēlieties atzarus
|
||||||
commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus
|
commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus
|
||||||
commit_graph.monochrome=Melnbalts
|
commit_graph.monochrome=Melnbalts
|
||||||
|
@ -1200,27 +1200,27 @@ line=rinda
|
||||||
lines=rindas
|
lines=rindas
|
||||||
from_comment=(komentārs)
|
from_comment=(komentārs)
|
||||||
|
|
||||||
editor.add_file=Pievienot
|
editor.add_file=Pievienot datni
|
||||||
editor.new_file=Jauna datne
|
editor.new_file=Jauna datne
|
||||||
editor.upload_file=Augšupielādēt failu
|
editor.upload_file=Augšupielādēt datni
|
||||||
editor.edit_file=Labot failu
|
editor.edit_file=Labot datni
|
||||||
editor.preview_changes=Priekšskatīt izmaiņas
|
editor.preview_changes=Priekšskatīt izmaiņas
|
||||||
editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes.
|
editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes.
|
||||||
editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes.
|
editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes.
|
||||||
editor.edit_this_file=Labot failu
|
editor.edit_this_file=Labot datni
|
||||||
editor.this_file_locked=Fails ir bloķēts
|
editor.this_file_locked=Fails ir bloķēts
|
||||||
editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam.
|
editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam.
|
||||||
editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju.
|
editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju.
|
||||||
editor.delete_this_file=Dzēst failu
|
editor.delete_this_file=Izdzēst datni
|
||||||
editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam.
|
editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam.
|
||||||
editor.file_delete_success=Fails "%s" tika izdzēsts.
|
editor.file_delete_success=Fails "%s" tika izdzēsts.
|
||||||
editor.name_your_file=Ievadiet faila nosaukumu…
|
editor.name_your_file=Ievadiet faila nosaukumu…
|
||||||
editor.filename_help=Lai pievienotu direktoriju, ierakstiet tās nosaukumu un slīpsvītru ('/'). Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkāpes taustiņu.
|
editor.filename_help=Mapi var pievienot, ja ieraksta tās nosaukumu, aiz kura ir slīpsvītra ("/"). Mapi var noņemt ar atpakaļatkāpes taustiņa nospiešanu ievades lauka sākumā.
|
||||||
editor.or=vai
|
editor.or=vai
|
||||||
editor.cancel_lower=Atcelt
|
editor.cancel_lower=Atcelt
|
||||||
editor.commit_signed_changes=Apstiprināt parakstītu revīziju
|
editor.commit_signed_changes=Iesūtīt parakstītas izmaiņas
|
||||||
editor.commit_changes=Pabeigt revīziju
|
editor.commit_changes=Iesūtīt izmaiņas
|
||||||
editor.add_tmpl=Pievienot '<fails>'
|
editor.add_tmpl=Pievienot '<datnes nosaukums>'
|
||||||
editor.add=Pievienot %s
|
editor.add=Pievienot %s
|
||||||
editor.update=Atjaunot %s
|
editor.update=Atjaunot %s
|
||||||
editor.delete=Dzēst %s
|
editor.delete=Dzēst %s
|
||||||
|
@ -1246,15 +1246,15 @@ editor.file_is_a_symlink=Fails "%s" ir norāde, kuru nav iespējams labot no tī
|
||||||
editor.filename_is_a_directory=Faila nosaukums "%s" sakrīt ar direktorijas nosaukumu šajā repozitorijā.
|
editor.filename_is_a_directory=Faila nosaukums "%s" sakrīt ar direktorijas nosaukumu šajā repozitorijā.
|
||||||
editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistē šajā repozitorijā.
|
editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistē šajā repozitorijā.
|
||||||
editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistē šajā repozitorijā.
|
editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistē šajā repozitorijā.
|
||||||
editor.file_changed_while_editing=Faila saturs ir mainījies kopš sākāt to labot. Noklikšķiniet <a target="_blank" rel="noopener noreferrer" href="%s">šeit</a>, lai apskatītu, vai <strong>Nosūtiet izmaiņas atkārtoti</strong>, lai pārrakstītu.
|
editor.file_changed_while_editing=Datnes saturs ir mainījies kopš labošanas uzsākšanas. <a target="_blank" rel="noopener noreferrer" href="%s">Klikšķināt šeit</a>, lai apskatītu vai <strong>atkārtoti iesūtītu izmaiņas</strong>, lai tās pārrakstītu.
|
||||||
editor.file_already_exists=Fails ar nosaukumu "%s" šajā repozitorijā jau eksistē.
|
editor.file_already_exists=Fails ar nosaukumu "%s" šajā repozitorijā jau eksistē.
|
||||||
editor.commit_empty_file_header=Iesūtīt tukšu failu
|
editor.commit_empty_file_header=Iesūtīt tukšu failu
|
||||||
editor.commit_empty_file_text=Fails, ko vēlaties iesūtīt, ir tukšs. Vai turpināt?
|
editor.commit_empty_file_text=Fails, ko vēlaties iesūtīt, ir tukšs. Vai turpināt?
|
||||||
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
|
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
|
||||||
editor.fail_to_update_file=Neizdevās atjaunot/izveidot failu "%s".
|
editor.fail_to_update_file=Neizdevās atjaunot/izveidot failu "%s".
|
||||||
editor.fail_to_update_file_summary=Kļūdas ziņojums:
|
editor.fail_to_update_file_summary=Kļūdas ziņojums:
|
||||||
editor.push_rejected_no_message=Izmaiņu iesūtīšana tika noraidīta, bet serveris neatgrieza paziņojumu. Pārbaudiet git āķus šim repozitorijam.
|
editor.push_rejected_no_message=Serveris noraidīja izmaiņas bez paziņojuma. Lūgums pārbaudīt Git aizķeres.
|
||||||
editor.push_rejected=Serveris noraidīja šo izmaiņu. Pārbaudiet git āķus.
|
editor.push_rejected=Serveris noraidīja izmaiņas. Lūgums pārbaudīt Git aizķeres.
|
||||||
editor.push_rejected_summary=Pilns noraidīšanas ziņojums:
|
editor.push_rejected_summary=Pilns noraidīšanas ziņojums:
|
||||||
editor.add_subdir=Pievienot direktoriju…
|
editor.add_subdir=Pievienot direktoriju…
|
||||||
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju "%s", kļūda: %v
|
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju "%s", kļūda: %v
|
||||||
|
@ -1274,7 +1274,7 @@ commits.nothing_to_compare=Atzari ir vienādi.
|
||||||
commits.search=Meklēt revīzijas…
|
commits.search=Meklēt revīzijas…
|
||||||
commits.search.tooltip=Jūs varat izmantot atslēgas vārdus "author:", "committer:", "after:" vai "before:", piemēram, "revert author:Alice before:2019-01-13".
|
commits.search.tooltip=Jūs varat izmantot atslēgas vārdus "author:", "committer:", "after:" vai "before:", piemēram, "revert author:Alice before:2019-01-13".
|
||||||
commits.find=Meklēt
|
commits.find=Meklēt
|
||||||
commits.search_all=Visi atzari
|
commits.search_all=Visi zari
|
||||||
commits.author=Autors
|
commits.author=Autors
|
||||||
commits.message=Ziņojums
|
commits.message=Ziņojums
|
||||||
commits.date=Datums
|
commits.date=Datums
|
||||||
|
@ -1283,8 +1283,8 @@ commits.newer=Jaunāki
|
||||||
commits.signed_by=Parakstījis
|
commits.signed_by=Parakstījis
|
||||||
commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs
|
commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs
|
||||||
commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram
|
commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram
|
||||||
commits.gpg_key_id=GPG atslēgas ID
|
commits.gpg_key_id=GPG atslēgas Id
|
||||||
commits.ssh_key_fingerprint=SSH atslēgas identificējošā zīmju virkne
|
commits.ssh_key_fingerprint=SSH atslēgas nospiedums
|
||||||
commits.view_path=Skatīt šajā vēstures punktā
|
commits.view_path=Skatīt šajā vēstures punktā
|
||||||
|
|
||||||
commit.operations=Darbības
|
commit.operations=Darbības
|
||||||
|
@ -1300,7 +1300,7 @@ commitstatus.failure=Kļūme
|
||||||
commitstatus.pending=Nav iesūtīts
|
commitstatus.pending=Nav iesūtīts
|
||||||
commitstatus.success=Pabeigts
|
commitstatus.success=Pabeigts
|
||||||
|
|
||||||
ext_issues=Piekļuve ārējām problēmām
|
ext_issues=Piekļuve ārējiem pieteikumiem
|
||||||
ext_issues.desc=Saite uz ārējo problēmu sekotāju.
|
ext_issues.desc=Saite uz ārējo problēmu sekotāju.
|
||||||
|
|
||||||
projects=Projekti
|
projects=Projekti
|
||||||
|
@ -1312,35 +1312,35 @@ projects.title=Nosaukums
|
||||||
projects.new=Jauns projekts
|
projects.new=Jauns projekts
|
||||||
projects.new_subheader=Koordinē, seko un atjauno savu darbu centralizēti, lai projekts būtu izsekojams un vienmēr laikā.
|
projects.new_subheader=Koordinē, seko un atjauno savu darbu centralizēti, lai projekts būtu izsekojams un vienmēr laikā.
|
||||||
projects.create_success=Projekts "%s" tika izveidots.
|
projects.create_success=Projekts "%s" tika izveidots.
|
||||||
projects.deletion=Dzēst projektu
|
projects.deletion=Izdzēst projektu
|
||||||
projects.deletion_desc=Dzēšot projektu no tā tiks atsaistītās visas tam piesaistītās problēmas. Vai turpināt?
|
projects.deletion_desc=Dzēšot projektu no tā tiks atsaistītās visas tam piesaistītās problēmas. Vai turpināt?
|
||||||
projects.deletion_success=Šis projekts tika izdzēsts.
|
projects.deletion_success=Šis projekts tika izdzēsts.
|
||||||
projects.edit=Labot projektu
|
projects.edit=Labot projektu
|
||||||
projects.edit_subheader=Projekti organizē problēmas un ļauj izsekot to progresam.
|
projects.edit_subheader=Projekti organizē problēmas un ļauj izsekot to progresam.
|
||||||
projects.modify=Mainīt projektu
|
projects.modify=Labot projektu
|
||||||
projects.edit_success=Projekta "%s" izmaiņas tika saglabātas.
|
projects.edit_success=Projekta "%s" izmaiņas tika saglabātas.
|
||||||
projects.type.none=Nav
|
projects.type.none=Nav
|
||||||
projects.type.basic_kanban=`Vienkāršots "Kanban"`
|
projects.type.basic_kanban=Pamata "Kanban"
|
||||||
projects.type.bug_triage=Kļūdu šķirošana
|
projects.type.bug_triage=Kļūdu šķirošana
|
||||||
projects.template.desc=Projekta sagatave
|
projects.template.desc=Sagatave
|
||||||
projects.template.desc_helper=Izvēlieties projekta sagatavi, lai sāktu darbu
|
projects.template.desc_helper=Jāatlasa projekta sagatave, lai uzsāktu
|
||||||
projects.type.uncategorized=Bez kategorijas
|
projects.type.uncategorized=Bez kategorijas
|
||||||
projects.column.edit=Rediģēt kolonnas
|
projects.column.edit=Labot kolonnu
|
||||||
projects.column.edit_title=Nosaukums
|
projects.column.edit_title=Nosaukums
|
||||||
projects.column.new_title=Nosaukums
|
projects.column.new_title=Nosaukums
|
||||||
projects.column.new_submit=Izveidot kolonnu
|
projects.column.new_submit=Izveidot kolonnu
|
||||||
projects.column.new=Jauna kolonna
|
projects.column.new=Jauna kolonna
|
||||||
projects.column.set_default=Izvēlēties kā noklusēto
|
projects.column.set_default=Iestatīt kā noklusējumu
|
||||||
projects.column.set_default_desc=Izvēlēties šo kolonnu kā noklusēto nekategorizētām problēmām un izmaiņu pieteikumiem
|
projects.column.set_default_desc=Iestatīt šo kolonnu kā noklusējumu neapkopotiem pieteikumiem un izmaiņu pieprasījumiem
|
||||||
projects.column.unset_default=Atiestatīt noklusēto
|
projects.column.unset_default=Atiestatīt noklusēto
|
||||||
projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto
|
projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto
|
||||||
projects.column.delete=Dzēst kolonnu
|
projects.column.delete=Izdzēst kolonnu
|
||||||
projects.column.deletion_desc=Dzēšot projekta kolonnu visas tam piesaistītās problēmas tiks pārliktas kā nekategorizētas. Vai turpināt?
|
projects.column.deletion_desc=Projekta kolonnas izdzēšana pārvietos visus saistītos pieteikumus uz noklusējuma kolonnu. Turpināt?
|
||||||
projects.column.color=Krāsa
|
projects.column.color=Krāsa
|
||||||
projects.open=Aktīvie
|
projects.open=Aktīvie
|
||||||
projects.close=Pabeigtie
|
projects.close=Pabeigtie
|
||||||
projects.column.assigned_to=Piešķirts
|
projects.column.assigned_to=Piešķirts
|
||||||
projects.card_type.desc=Kartītes priekšskatījums
|
projects.card_type.desc=Kartīšu priekšskatījumi
|
||||||
projects.card_type.images_and_text=Attēli un teksts
|
projects.card_type.images_and_text=Attēli un teksts
|
||||||
projects.card_type.text_only=Tikai teksts
|
projects.card_type.text_only=Tikai teksts
|
||||||
|
|
||||||
|
@ -1350,40 +1350,40 @@ issues.filter_milestones=Filtrēt pēc atskaites punkta
|
||||||
issues.filter_projects=Filtrēt pēc projekta
|
issues.filter_projects=Filtrēt pēc projekta
|
||||||
issues.filter_labels=Filtrēt pēc etiķetēm
|
issues.filter_labels=Filtrēt pēc etiķetēm
|
||||||
issues.filter_reviewers=Filtrēt pēc recenzentiem
|
issues.filter_reviewers=Filtrēt pēc recenzentiem
|
||||||
issues.new=Jauna problēma
|
issues.new=Jauns pieteikums
|
||||||
issues.new.title_empty=Nosaukums nevar būt tukšs
|
issues.new.title_empty=Nosaukums nevar būt tukšs
|
||||||
issues.new.labels=Etiķetes
|
issues.new.labels=Etiķetes
|
||||||
issues.new.no_label=Nav etiķešu
|
issues.new.no_label=Nav iezīmju
|
||||||
issues.new.clear_labels=Noņemt etiķetes
|
issues.new.clear_labels=Noņemt etiķetes
|
||||||
issues.new.projects=Projekti
|
issues.new.projects=Projekti
|
||||||
issues.new.clear_projects=Notīrīt projektus
|
issues.new.clear_projects=Notīrīt projektus
|
||||||
issues.new.no_projects=Nav projektu
|
issues.new.no_projects=Nav projektu
|
||||||
issues.new.open_projects=Aktīvie projekti
|
issues.new.open_projects=Atvērtie projekti
|
||||||
issues.new.closed_projects=Pabeigtie projekti
|
issues.new.closed_projects=Aizvērtie projekti
|
||||||
issues.new.no_items=Nav neviena ieraksta
|
issues.new.no_items=Nav neviena ieraksta
|
||||||
issues.new.milestone=Atskaites punkts
|
issues.new.milestone=Atskaites punkts
|
||||||
issues.new.no_milestone=Nav atskaites punktu
|
issues.new.no_milestone=Nav atskaites punktu
|
||||||
issues.new.clear_milestone=Notīrīt atskaites punktus
|
issues.new.clear_milestone=Notīrīt atskaites punktus
|
||||||
issues.new.open_milestone=Atvērtie atskaites punktus
|
issues.new.open_milestone=Atvērtie atskaites punkti
|
||||||
issues.new.closed_milestone=Aizvērtie atskaites punkti
|
issues.new.closed_milestone=Aizvērtie atskaites punkti
|
||||||
issues.new.assignees=Atbildīgie
|
issues.new.assignees=Atbildīgie
|
||||||
issues.new.clear_assignees=Noņemt atbildīgo
|
issues.new.clear_assignees=Noņemt atbildīgo
|
||||||
issues.new.no_assignees=Nav atbildīgo
|
issues.new.no_assignees=Nav atbildīgo
|
||||||
issues.new.no_reviewers=Nav recenzentu
|
issues.new.no_reviewers=Nav recenzentu
|
||||||
issues.choose.get_started=Sākt darbu
|
issues.choose.get_started=Uzsākt darbu
|
||||||
issues.choose.open_external_link=Atvērt
|
issues.choose.open_external_link=Atvērt
|
||||||
issues.choose.blank=Noklusējuma
|
issues.choose.blank=Noklusējuma
|
||||||
issues.choose.blank_about=Izveidot problēmu ar noklusējuma sagatavi.
|
issues.choose.blank_about=Izveidot problēmu ar noklusējuma sagatavi.
|
||||||
issues.choose.ignore_invalid_templates=Kļūdainās sagataves tika izlaistas
|
issues.choose.ignore_invalid_templates=Kļūdainās sagataves tika izlaistas
|
||||||
issues.choose.invalid_templates=%v ķļūdaina sagatave(s) atrastas
|
issues.choose.invalid_templates=%v ķļūdaina sagatave(s) atrastas
|
||||||
issues.choose.invalid_config=Problēmu konfigurācija satur kļūdas:
|
issues.choose.invalid_config=Problēmu konfigurācija satur kļūdas:
|
||||||
issues.no_ref=Nav norādīts atzars/tags
|
issues.no_ref=Nav norādīts zars/birka
|
||||||
issues.create=Pieteikt problēmu
|
issues.create=Izveidot pieteikumu
|
||||||
issues.new_label=Jauna etiķete
|
issues.new_label=Jauna iezīme
|
||||||
issues.new_label_placeholder=Etiķetes nosaukums
|
issues.new_label_placeholder=Etiķetes nosaukums
|
||||||
issues.new_label_desc_placeholder=Apraksts
|
issues.new_label_desc_placeholder=Apraksts
|
||||||
issues.create_label=Izveidot etiķeti
|
issues.create_label=Izveidot iezīmi
|
||||||
issues.label_templates.title=Ielādēt sākotnēji noteiktu etiķešu kopu
|
issues.label_templates.title=Ielādēt iepriekš noteiktu iezīmju kopu
|
||||||
issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes:
|
issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes:
|
||||||
issues.label_templates.helper=Izvēlieties etiķešu kopu
|
issues.label_templates.helper=Izvēlieties etiķešu kopu
|
||||||
issues.label_templates.use=Izmantot etiķešu kopu
|
issues.label_templates.use=Izmantot etiķešu kopu
|
||||||
|
@ -1752,10 +1752,10 @@ pulls.num_conflicting_files_n=%d faili ar konfliktiem
|
||||||
pulls.approve_count_1=%d apstiprinājums
|
pulls.approve_count_1=%d apstiprinājums
|
||||||
pulls.approve_count_n=%d apstiprinājumi
|
pulls.approve_count_n=%d apstiprinājumi
|
||||||
pulls.reject_count_1=%d izmaiņu pieprasījums
|
pulls.reject_count_1=%d izmaiņu pieprasījums
|
||||||
pulls.reject_count_n=%d pieprasītas izmaiņas
|
pulls.reject_count_n=%d izmaiņu pieprasījumi
|
||||||
pulls.waiting_count_1=nepieciešama %d recenzija
|
pulls.waiting_count_1=nepieciešama %d izskatīšana
|
||||||
pulls.waiting_count_n=nepieciešamas %d recenzijas
|
pulls.waiting_count_n=nepieciešamas %d izskatīšanas
|
||||||
pulls.wrong_commit_id=revīzijas identifikātoram ir jābūt revīzijas identifikatoram no mērķa atzara
|
pulls.wrong_commit_id=iesūtījuma identifikatoram jābūt mērķa zara iesūtījuma identifikatoram
|
||||||
|
|
||||||
pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids.
|
pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids.
|
||||||
pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli.
|
pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli.
|
||||||
|
@ -1771,17 +1771,17 @@ pulls.merge_commit_id=Sapludināšanas revīzijas ID
|
||||||
pulls.require_signed_wont_sign=Atzarā var iesūtīt tikai parakstītas revīzijas, bet sapludināšanas revīzijas netiks parakstīta
|
pulls.require_signed_wont_sign=Atzarā var iesūtīt tikai parakstītas revīzijas, bet sapludināšanas revīzijas netiks parakstīta
|
||||||
|
|
||||||
pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam.
|
pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam.
|
||||||
pulls.merge_conflict=Sapludināšana neizdevās: Veicot sapludināšanu, radās konflikts. Mēģiniet izmantot citu sapludināšanas stratēģiju
|
pulls.merge_conflict=Apvienošana neizdevās: iekļaušanas laikā radās nesaderības. Norāde: jāmēģina cita pieeja
|
||||||
pulls.merge_conflict_summary=Kļūdas paziņojums
|
pulls.merge_conflict_summary=Kļūdas ziņojums
|
||||||
pulls.rebase_conflict=Sapludināšana neizdevās: Veicot pārbāzēšanu uz revīziju %[1]s, radās konflikts. Mēģiniet izmantot citu sapludināšanas stratēģiju
|
pulls.rebase_conflict=Apvienošana neizdevās: iesūtījuma %[1]s pārbāzēšanas laikā radās nesaderība. Norāde: jāmēģina cita pieeja
|
||||||
pulls.rebase_conflict_summary=Kļūdas paziņojums
|
pulls.rebase_conflict_summary=Kļūdas ziņojums
|
||||||
pulls.unrelated_histories=Sapludināšana neizdevās: mērķa un bāzes atzariem nav kopējas vēstures. Ieteikums: izvēlieties citu sapludināšanas stratēģiju
|
pulls.unrelated_histories=Apvienošana neizdevās: apvienošanas galotnei un pamatam nav kopējas vēstures. Norāde: jāmēģina cita pieeja
|
||||||
pulls.merge_out_of_date=Sapludināšana neizdevās: sapludināšanas laikā, bāzes atzarā tika iesūtītas izmaiņas. Ieteikums: mēģiniet atkārtoti.
|
pulls.merge_out_of_date=Apvienošana neizdevās: apvienošanas laikā pamata zars tika atjaunināts. Norāde: jāmēģina vēlreiz.
|
||||||
pulls.head_out_of_date=Sapludināšana neizdevās: sapludināšanas laikā, bāzes atzarā tika iesūtītas izmaiņas. Ieteikums: mēģiniet atkārtoti.
|
pulls.head_out_of_date=Apvienošana neizdevās: apvienošanas laikā galotne tika atjaunināta. Norāde: jāmēģina vēlreiz.
|
||||||
pulls.has_merged=Neizdevās: izmaiņu pieprasījums jau ir sapludināts, nevar to darīt atkārtoti vai mainīt mērķa atzaru.
|
pulls.has_merged=Neizdevās: izmaiņu pieprasījums jau ir sapludināts, nevar to darīt atkārtoti vai mainīt mērķa atzaru.
|
||||||
pulls.push_rejected=Sapludināšana neizdevās: iesūtīšana tika noraidīta. Pārbaudiet git āķus šim repozitorijam.
|
pulls.push_rejected=Aizgādāšana neizdevās: aizgādāšana tika noraidīta. Jāpārskata šīs glabātavas Git aizķeres.
|
||||||
pulls.push_rejected_summary=Pilns noraidīšanas ziņojums
|
pulls.push_rejected_summary=Pilns noraidīšanas ziņojums
|
||||||
pulls.push_rejected_no_message=Sapludināšana neizdevās: Izmaiņu iesūtīšana tika noraidīta, bet serveris neatgrieza paziņojumu.<br>Pārbaudiet git āķus šim repozitorijam
|
pulls.push_rejected_no_message=Apvienošana neizdevās: aizgādāšana tika noraidīta, bet serveris neatgrieza ziņojumu. Jāpārskata šīs glabātavas Git aizķeres
|
||||||
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.`
|
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.`
|
||||||
pulls.status_checking=Dažas pārbaudes vēl tiek veiktas
|
pulls.status_checking=Dažas pārbaudes vēl tiek veiktas
|
||||||
pulls.status_checks_success=Visas pārbaudes ir veiksmīgas
|
pulls.status_checks_success=Visas pārbaudes ir veiksmīgas
|
||||||
|
@ -1800,7 +1800,7 @@ pulls.outdated_with_base_branch=Atzars ir novecojis salīdzinot ar bāzes atzaru
|
||||||
pulls.close=Aizvērt izmaiņu pieprasījumu
|
pulls.close=Aizvērt izmaiņu pieprasījumu
|
||||||
pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.`
|
pulls.cmd_instruction_hint=Apskatīt komandrindas izmantošanas norādes
|
||||||
pulls.cmd_instruction_checkout_title=Paņemt
|
pulls.cmd_instruction_checkout_title=Paņemt
|
||||||
pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas.
|
pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas.
|
||||||
pulls.cmd_instruction_merge_title=Sapludināt
|
pulls.cmd_instruction_merge_title=Sapludināt
|
||||||
|
@ -1838,20 +1838,20 @@ milestones.completeness=%d%% pabeigti
|
||||||
milestones.create=Izveidot atskaites punktu
|
milestones.create=Izveidot atskaites punktu
|
||||||
milestones.title=Virsraksts
|
milestones.title=Virsraksts
|
||||||
milestones.desc=Apraksts
|
milestones.desc=Apraksts
|
||||||
milestones.due_date=Termiņš (neobligāts)
|
milestones.due_date=Beigu datums (pēc izvēles)
|
||||||
milestones.clear=Notīrīt
|
milestones.clear=Notīrīt
|
||||||
milestones.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'.
|
milestones.invalid_due_date_format=Beigu datuma pierakstam ir jābūt 'yyyy-mm-dd'.
|
||||||
milestones.create_success=Atskaites punkts "%s" tika veiksmīgi izveidots.
|
milestones.create_success=Atskaites punkts "%s" tika veiksmīgi izveidots.
|
||||||
milestones.edit=Labot atskaites punktu
|
milestones.edit=Labot atskaites punktu
|
||||||
milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam.
|
milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam.
|
||||||
milestones.cancel=Atcelt
|
milestones.cancel=Atcelt
|
||||||
milestones.modify=Labot atskaites punktu
|
milestones.modify=Atjaunināt atskaites punktu
|
||||||
milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglabātas.
|
milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglabātas.
|
||||||
milestones.deletion=Dzēst atskaites punktu
|
milestones.deletion=Izdzēst atskaites punktu
|
||||||
milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt?
|
milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt?
|
||||||
milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts.
|
milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts.
|
||||||
milestones.filter_sort.earliest_due_data=Agrākais izpildes laiks
|
milestones.filter_sort.earliest_due_data=Tuvākais izpildes datums
|
||||||
milestones.filter_sort.latest_due_date=Vēlākais izpildes laiks
|
milestones.filter_sort.latest_due_date=Tālākais izpildes datums
|
||||||
milestones.filter_sort.least_complete=Vismazāk pabeigtais
|
milestones.filter_sort.least_complete=Vismazāk pabeigtais
|
||||||
milestones.filter_sort.most_complete=Visvairāk pabeigtais
|
milestones.filter_sort.most_complete=Visvairāk pabeigtais
|
||||||
milestones.filter_sort.most_issues=Visvairāk problēmu
|
milestones.filter_sort.most_issues=Visvairāk problēmu
|
||||||
|
@ -1859,7 +1859,7 @@ milestones.filter_sort.least_issues=Vismazāk problēmu
|
||||||
|
|
||||||
signing.will_sign=Šī revīzija tiks parakstīta ar atslēgu "%s".
|
signing.will_sign=Šī revīzija tiks parakstīta ar atslēgu "%s".
|
||||||
signing.wont_sign.error=Notika kļūda pārbaudot vai revīzija var tikt parakstīta.
|
signing.wont_sign.error=Notika kļūda pārbaudot vai revīzija var tikt parakstīta.
|
||||||
signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo revīziju.
|
signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo iesūtījumu.
|
||||||
signing.wont_sign.never=Revīzijas nekad netiek parakstītas.
|
signing.wont_sign.never=Revīzijas nekad netiek parakstītas.
|
||||||
signing.wont_sign.always=Revīzijas vienmēr tiek parakstītas.
|
signing.wont_sign.always=Revīzijas vienmēr tiek parakstītas.
|
||||||
signing.wont_sign.pubkey=Revīzija netiks parakstīta, jo kontam nav piesaistīta publiskā atslēga.
|
signing.wont_sign.pubkey=Revīzija netiks parakstīta, jo kontam nav piesaistīta publiskā atslēga.
|
||||||
|
|
|
@ -2542,6 +2542,7 @@ issues.review.remove_review_requests = hett %[2]s de Nakieken-Anfragen för %[1]
|
||||||
pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden.
|
pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken.
|
||||||
pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden.
|
pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden.
|
||||||
|
issues.filter_sort.relevance = Belang
|
||||||
|
|
||||||
[repo.permissions]
|
[repo.permissions]
|
||||||
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.
|
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.
|
||||||
|
|
|
@ -199,6 +199,12 @@ buttons.list.task.tooltip = Een lijst met taken toevoegen
|
||||||
buttons.disable_monospace_font = Lettertype monospace uitschakelen
|
buttons.disable_monospace_font = Lettertype monospace uitschakelen
|
||||||
buttons.indent.tooltip = Items één niveau lager plaatsen
|
buttons.indent.tooltip = Items één niveau lager plaatsen
|
||||||
buttons.unindent.tooltip = Items één niveau hoger plaatsen
|
buttons.unindent.tooltip = Items één niveau hoger plaatsen
|
||||||
|
buttons.new_table.tooltip = Tabel toevoegen
|
||||||
|
table_modal.header = Tabel toevoegen
|
||||||
|
table_modal.placeholder.header = Kop
|
||||||
|
table_modal.placeholder.content = Inhoud
|
||||||
|
table_modal.label.rows = Rijen
|
||||||
|
table_modal.label.columns = Kolommen
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc = A - Z
|
string.asc = A - Z
|
||||||
|
@ -250,7 +256,7 @@ no_admin_and_disable_registration=U kunt zelf-registratie van de gebruiker niet
|
||||||
err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn.
|
err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn.
|
||||||
err_empty_admin_email=Het e-mailadres van Het beheerder mag niet leeg zijn.
|
err_empty_admin_email=Het e-mailadres van Het beheerder mag niet leeg zijn.
|
||||||
err_admin_name_is_reserved=Gebruikersnaam van beheerder is ongeldig, gebruikersnaam is gereserveerd
|
err_admin_name_is_reserved=Gebruikersnaam van beheerder is ongeldig, gebruikersnaam is gereserveerd
|
||||||
err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam is gereserveerd
|
err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam komt overeen met een gereserveerd patroon
|
||||||
err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig
|
err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig
|
||||||
|
|
||||||
general_title=Algemene instellingen
|
general_title=Algemene instellingen
|
||||||
|
@ -269,7 +275,7 @@ http_port=HTTP luisterpoort
|
||||||
http_port_helper=Poortnummer dat zal worden gebruikt door de Forgejo webserver.
|
http_port_helper=Poortnummer dat zal worden gebruikt door de Forgejo webserver.
|
||||||
app_url=Basis URL
|
app_url=Basis URL
|
||||||
app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen.
|
app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen.
|
||||||
log_root_path=Log-pad
|
log_root_path=Logboek-pad
|
||||||
log_root_path_helper=Logboekbestanden worden geschreven naar deze map.
|
log_root_path_helper=Logboekbestanden worden geschreven naar deze map.
|
||||||
|
|
||||||
optional_title=Optionele instellingen
|
optional_title=Optionele instellingen
|
||||||
|
@ -477,6 +483,7 @@ sign_up_button = Registreer nu.
|
||||||
back_to_sign_in = Terug naar aanmelden
|
back_to_sign_in = Terug naar aanmelden
|
||||||
sign_in_openid = Ga verder met OpenID
|
sign_in_openid = Ga verder met OpenID
|
||||||
unauthorized_credentials = Je inloggegevens zijn foutief of vervallen. Probeer opnieuw of zie %s voor meer informatie
|
unauthorized_credentials = Je inloggegevens zijn foutief of vervallen. Probeer opnieuw of zie %s voor meer informatie
|
||||||
|
use_onetime_code = Gebruik een eenmalige code
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Bekijk het op %s
|
view_it_on=Bekijk het op %s
|
||||||
|
@ -978,7 +985,7 @@ visibility.limited=Beperkt
|
||||||
visibility.private=Privé
|
visibility.private=Privé
|
||||||
blocked_users = Geblokkeerde gebruikers
|
blocked_users = Geblokkeerde gebruikers
|
||||||
uid = UID
|
uid = UID
|
||||||
biography_placeholder = Vertel ons iets over uzelf! (U kunt van Markdown gebruik maken)
|
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 = 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.
|
||||||
update_language_not_found = Taal "%s" is niet beschikbaar.
|
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_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen.
|
||||||
|
@ -1309,7 +1316,7 @@ editor.patching=Patchen:
|
||||||
editor.new_patch=Nieuwe patch
|
editor.new_patch=Nieuwe patch
|
||||||
editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe…
|
editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe…
|
||||||
editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht.
|
editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht.
|
||||||
editor.commit_directly_to_this_branch=Commit direct naar de branch '<strong class="%[2]s">%[1]s</strong>'.
|
editor.commit_directly_to_this_branch=Commit direct naar de branch <strong class="%[2]s">%[1]s</strong>.
|
||||||
editor.create_new_branch=Maak een <strong>nieuwe branch</strong> voor deze commit en start van een pull request.
|
editor.create_new_branch=Maak een <strong>nieuwe branch</strong> voor deze commit en start van een pull request.
|
||||||
editor.create_new_branch_np=Maak een <strong>nieuwe branch</strong> voor deze commit.
|
editor.create_new_branch_np=Maak een <strong>nieuwe branch</strong> voor deze commit.
|
||||||
editor.propose_file_change=Stel bestandswijziging voor
|
editor.propose_file_change=Stel bestandswijziging voor
|
||||||
|
@ -1648,9 +1655,9 @@ issues.review.left_comment=heeft een reactie achtergelaten
|
||||||
issues.review.content.empty=Je moet een reactie achterlaten die de gewenste verandering(en) beschrijft.
|
issues.review.content.empty=Je moet een reactie achterlaten die de gewenste verandering(en) beschrijft.
|
||||||
issues.review.reject=aangevraagde wijzigingen %s
|
issues.review.reject=aangevraagde wijzigingen %s
|
||||||
issues.review.wait=is gevraagd voor review %s
|
issues.review.wait=is gevraagd voor review %s
|
||||||
issues.review.add_review_request=heeft een review aangevraagd van %s %s
|
issues.review.add_review_request=beoordeling gevraagd van %[1]s %[2]s
|
||||||
issues.review.remove_review_request=beoordelingsaanvraag voor %s %s verwijderd
|
issues.review.remove_review_request=beoordelingsaanvraag voor %[1]s %[2]s verwijderd
|
||||||
issues.review.remove_review_request_self=beoordeling geweigerd %s
|
issues.review.remove_review_request_self=weigerde te beoordelen %s
|
||||||
issues.review.pending=In behandeling
|
issues.review.pending=In behandeling
|
||||||
issues.review.review=Review
|
issues.review.review=Review
|
||||||
issues.review.reviewers=Beoordelaars
|
issues.review.reviewers=Beoordelaars
|
||||||
|
@ -2826,6 +2833,12 @@ mirror_use_ssh.not_available = SSH-authenticatie is niet beschikbaar.
|
||||||
issues.new.assign_to_me = Aan mij toewijzen
|
issues.new.assign_to_me = Aan mij toewijzen
|
||||||
issues.all_title = Alles
|
issues.all_title = Alles
|
||||||
settings.discord_icon_url.exceeds_max_length = Icoon-URL moet 2048 tekens of minder zijn
|
settings.discord_icon_url.exceeds_max_length = Icoon-URL moet 2048 tekens of minder zijn
|
||||||
|
issues.review.add_review_requests = beoordelingen gevraagd van %[1]s %[2]s
|
||||||
|
issues.review.remove_review_requests = verwijderde beoordelingsverzoeken voor %[1]s %[2]s
|
||||||
|
issues.review.add_remove_review_requests = vraagde beoordelingen van %[1]s en verwijderde beoordelingsverzoeken voor %[2]s %[3]s
|
||||||
|
pulls.delete_after_merge.head_branch.is_default = De hoofdbranch die u wilt verwijderen is de standaard branch en kan niet verwijderd worden.
|
||||||
|
pulls.delete_after_merge.head_branch.is_protected = De hoofdbranch die u wilt verwijderen is een beschermde branch en kan niet verwijderd worden.
|
||||||
|
pulls.delete_after_merge.head_branch.insufficient_branch = Je hebt geen toestemming om de hoofdbranch te verwijderen.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,12 @@ buttons.switch_to_legacy.tooltip = Zamiast tego użyj starego edytora
|
||||||
buttons.disable_monospace_font = Wyłącz czcionkę monospace
|
buttons.disable_monospace_font = Wyłącz czcionkę monospace
|
||||||
buttons.enable_monospace_font = Włącz czcionkę monospace
|
buttons.enable_monospace_font = Włącz czcionkę monospace
|
||||||
buttons.indent.tooltip = Zagnieżdż elementy o jeden poziom
|
buttons.indent.tooltip = Zagnieżdż elementy o jeden poziom
|
||||||
|
buttons.new_table.tooltip = Dodaj tabelę
|
||||||
|
table_modal.header = Dodaj tabelę
|
||||||
|
table_modal.placeholder.header = Nagłówek
|
||||||
|
table_modal.placeholder.content = Zawartość
|
||||||
|
table_modal.label.rows = Wiersze
|
||||||
|
table_modal.label.columns = Kolumny
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc = A - Z
|
string.asc = A - Z
|
||||||
|
@ -470,6 +476,7 @@ back_to_sign_in = Wróć do logowania
|
||||||
sign_in_openid = Kontynuuj z OpenID
|
sign_in_openid = Kontynuuj z OpenID
|
||||||
hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a>
|
hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a>
|
||||||
sign_up_button = Zarejestruj się.
|
sign_up_button = Zarejestruj się.
|
||||||
|
use_onetime_code = Użyj kodu jednorazowego
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
view_it_on=Zobacz na %s
|
view_it_on=Zobacz na %s
|
||||||
|
@ -655,6 +662,9 @@ must_use_public_key = Podany klucz jest kluczem prywatnym. Nie przesyłaj nigdzi
|
||||||
Location = Lokalizacja
|
Location = Lokalizacja
|
||||||
username_error_no_dots = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
|
username_error_no_dots = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
|
||||||
username_error = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
|
username_error = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
|
||||||
|
still_has_org = Twoje konto jest członkiem jednej bądź wielu organizacji, musisz je najpierw opuścić.
|
||||||
|
org_still_own_repo = Ta organizacja nadal jest właścicielem jednego lub wielu repozytoriów. Najpierw je usuń lub przenieś.
|
||||||
|
admin_cannot_delete_self = Nie możesz usunąć siebie, gdy jesteś administratorem. Proszę najpierw usunąć swoje uprawnienia administratora.
|
||||||
|
|
||||||
|
|
||||||
[user]
|
[user]
|
||||||
|
@ -674,6 +684,20 @@ disabled_public_activity=Ten użytkownik wyłączył publiczne wyświetlanie jeg
|
||||||
code = Kod
|
code = Kod
|
||||||
block = Zablokuj
|
block = Zablokuj
|
||||||
unblock = Odblokuj
|
unblock = Odblokuj
|
||||||
|
block_user.detail = Pamiętaj, że zablokowanie użytkownika powoduje inne skutki, takie jak:
|
||||||
|
block_user.detail_2 = Ten użytkownik nie będzie mógł wchodzić w interakcję z repozytoriami, których jesteś właścicielem, ani z problemami i komentarzami, które utworzyłeś.
|
||||||
|
settings = Ustawienia użytkownika
|
||||||
|
followers_one = %d obserwujących
|
||||||
|
following_one = %d obserwowanych
|
||||||
|
followers.title.one = Obserwujący
|
||||||
|
followers.title.few = Obserwujący
|
||||||
|
following.title.one = Obserwowani
|
||||||
|
following.title.few = Obserwowani
|
||||||
|
email_visibility.limited = Twój adres e-mail jest widoczny dla wszystkich uwierzytelnionych użytkowników
|
||||||
|
block_user = Zablokuj użytkownika
|
||||||
|
block_user.detail_1 = Przestaniecie się wzajemnie obserwować i nie będziecie mogli się wzajemnie obserwować.
|
||||||
|
follow_blocked_user = Nie możesz obserwować tego użytkownika, ponieważ go zablokowałeś lub ten użytkownik zablokował Ciebie.
|
||||||
|
show_on_map = Pokaż to mejsce na mapie
|
||||||
|
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
|
@ -2869,3 +2893,4 @@ issue_kind = Wyszukaj problemy...
|
||||||
pull_kind = Wyszukaj pull requesty...
|
pull_kind = Wyszukaj pull requesty...
|
||||||
union = Unia
|
union = Unia
|
||||||
regexp = RegExp
|
regexp = RegExp
|
||||||
|
regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne
|
|
@ -2840,6 +2840,7 @@ issues.review.add_remove_review_requests = solicitou revisões de %[1]s e remove
|
||||||
pulls.delete_after_merge.head_branch.is_default = O branch head que você quer excluir é o branch padrão e não pode ser excluído.
|
pulls.delete_after_merge.head_branch.is_default = O branch head que você quer excluir é o branch padrão e não pode ser excluído.
|
||||||
pulls.delete_after_merge.head_branch.is_protected = O branch head que você quer excluir é um branch protegido e não pode ser excluído.
|
pulls.delete_after_merge.head_branch.is_protected = O branch head que você quer excluir é um branch protegido e não pode ser excluído.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Você não tem permissão para excluir o branch head.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Você não tem permissão para excluir o branch head.
|
||||||
|
issues.filter_sort.relevance = Relevância
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
|
|
@ -160,10 +160,10 @@ invalid_data = Неверные данные: %v
|
||||||
copy_generic = Копировать в буфер обмена
|
copy_generic = Копировать в буфер обмена
|
||||||
test = Проверить
|
test = Проверить
|
||||||
error413 = Ваша квота исчерпана.
|
error413 = Ваша квота исчерпана.
|
||||||
new_migrate.link = Выполнить миграцию
|
new_migrate.link = Выполнить перенос
|
||||||
new_org.link = Создать организацию
|
new_org.link = Создать организацию
|
||||||
new_repo.title = Новый репозиторий
|
new_repo.title = Новый репозиторий
|
||||||
new_migrate.title = Новая миграция
|
new_migrate.title = Новый перенос
|
||||||
new_org.title = Новая организация
|
new_org.title = Новая организация
|
||||||
new_repo.link = Создать репозиторий
|
new_repo.link = Создать репозиторий
|
||||||
|
|
||||||
|
@ -255,9 +255,9 @@ err_empty_db_path=Путь к базе данных SQLite3 не может бы
|
||||||
no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учётной записи администратора.
|
no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учётной записи администратора.
|
||||||
err_empty_admin_password=Пароль администратора не может быть пустым.
|
err_empty_admin_password=Пароль администратора не может быть пустым.
|
||||||
err_empty_admin_email=Адрес эл. почты администратора не может быть пустым.
|
err_empty_admin_email=Адрес эл. почты администратора не может быть пустым.
|
||||||
err_admin_name_is_reserved=Неверное имя администратора, это имя зарезервировано
|
err_admin_name_is_reserved=Неподходящее имя администратора, оно зарезервировано
|
||||||
err_admin_name_pattern_not_allowed=Неверное имя администратора, имя попадает под зарезервированный шаблон
|
err_admin_name_pattern_not_allowed=Неподходящее имя администратора, оно попадает под шаблон зарезервированных
|
||||||
err_admin_name_is_invalid=Неверное имя администратора
|
err_admin_name_is_invalid=Неподходящее имя администратора
|
||||||
|
|
||||||
general_title=Основные настройки
|
general_title=Основные настройки
|
||||||
app_name=Название сервера
|
app_name=Название сервера
|
||||||
|
@ -745,7 +745,7 @@ uid=UID
|
||||||
webauthn=Двухфакторная аутентификация (ключами безопасности)
|
webauthn=Двухфакторная аутентификация (ключами безопасности)
|
||||||
|
|
||||||
public_profile=Публичный профиль
|
public_profile=Публичный профиль
|
||||||
biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown)
|
biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown)
|
||||||
location_placeholder=Пусть все знают, откуда вы
|
location_placeholder=Пусть все знают, откуда вы
|
||||||
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
|
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
|
||||||
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
|
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
|
||||||
|
@ -1195,7 +1195,7 @@ migrate_items_releases=Выпуски
|
||||||
migrate_repo=Перенос репозитория
|
migrate_repo=Перенос репозитория
|
||||||
migrate.clone_address=Перенос / Клонирование по URL
|
migrate.clone_address=Перенос / Клонирование по URL
|
||||||
migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория
|
migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория
|
||||||
migrate.github_token_desc=Вы можете поместить один или несколько токенов, разделенных запятыми, чтобы ускорить миграцию, обходом ограничений скорости API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить политику поставщика услуг и привести к блокировке учётной записи.
|
migrate.github_token_desc=Вы можете указать один или несколько разделенных запятыми токенов, чтобы ускорить перенос за счёт обхода ограничений частоты обращений к API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить условия предоставления услуг и привести к блокировке учётной записи.
|
||||||
migrate.clone_local_path=или локальный путь на сервере
|
migrate.clone_local_path=или локальный путь на сервере
|
||||||
migrate.permission_denied=У вас нет прав на импорт локальных репозиториев.
|
migrate.permission_denied=У вас нет прав на импорт локальных репозиториев.
|
||||||
migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
|
migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
|
||||||
|
@ -1208,7 +1208,7 @@ migrated_from_fake=Перенесено из %[1]s
|
||||||
migrate.migrate=Перенос из %s
|
migrate.migrate=Перенос из %s
|
||||||
migrate.migrating=Перенос из <b>%s</b>...
|
migrate.migrating=Перенос из <b>%s</b>...
|
||||||
migrate.migrating_failed=Перенос из <b>%s</b> не удался.
|
migrate.migrating_failed=Перенос из <b>%s</b> не удался.
|
||||||
migrate.migrating_failed.error=Не удалось мигрировать: %s
|
migrate.migrating_failed.error=Не удалось перенести: %s
|
||||||
migrate.migrating_failed_no_addr=Перенос не удался.
|
migrate.migrating_failed_no_addr=Перенос не удался.
|
||||||
migrate.github.description=Перенесите данные с github.com или сервера GitHub Enterprise.
|
migrate.github.description=Перенесите данные с github.com или сервера GitHub Enterprise.
|
||||||
migrate.git.description=Перенести только репозиторий из любого Git сервиса.
|
migrate.git.description=Перенести только репозиторий из любого Git сервиса.
|
||||||
|
@ -1226,7 +1226,7 @@ migrate.migrating_releases=Перенос выпусков
|
||||||
migrate.migrating_issues=Перенос задач
|
migrate.migrating_issues=Перенос задач
|
||||||
migrate.migrating_pulls=Перенос запросов на слияние
|
migrate.migrating_pulls=Перенос запросов на слияние
|
||||||
migrate.cancel_migrating_title=Отменить перенос
|
migrate.cancel_migrating_title=Отменить перенос
|
||||||
migrate.cancel_migrating_confirm=Вы хотите отменить эту миграцию?
|
migrate.cancel_migrating_confirm=Вы хотите отменить перенос?
|
||||||
|
|
||||||
mirror_from=зеркало из
|
mirror_from=зеркало из
|
||||||
forked_from=ответвлён от
|
forked_from=ответвлён от
|
||||||
|
@ -2097,7 +2097,7 @@ settings.mirror_settings=Зеркалирование
|
||||||
settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и ветвей с другим репозиторием.
|
settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и ветвей с другим репозиторием.
|
||||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и ветвей в другой репозиторий. Pull-зеркала были отключены администратором сайта.
|
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и ветвей в другой репозиторий. Pull-зеркала были отключены администратором сайта.
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветви из другого репозитория.
|
settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветви из другого репозитория.
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=В настоящее время это можно сделать только в меню «Новая миграция». Для получения дополнительной информации, пожалуйста, ознакомьтесь:
|
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=В настоящее время это можно сделать только через меню «Выполнить перенос». Для получения дополнительной информации, пожалуйста, ознакомьтесь:
|
||||||
settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены администратором сайта.
|
settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены администратором сайта.
|
||||||
settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует изменения в другой репозиторий или из него. Пожалуйста, имейте в виду, что в данный момент невозможно создавать новые зеркала.
|
settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует изменения в другой репозиторий или из него. Пожалуйста, имейте в виду, что в данный момент невозможно создавать новые зеркала.
|
||||||
settings.mirror_settings.docs.can_still_use=Хотя вы не можете изменять существующие зеркала или создавать новые, вы можете по-прежнему использовать существующее зеркало.
|
settings.mirror_settings.docs.can_still_use=Хотя вы не можете изменять существующие зеркала или создавать новые, вы можете по-прежнему использовать существующее зеркало.
|
||||||
|
@ -2536,7 +2536,7 @@ diff.load=Показать различия
|
||||||
diff.generated=сгенерированный
|
diff.generated=сгенерированный
|
||||||
diff.vendored=предоставленный
|
diff.vendored=предоставленный
|
||||||
diff.comment.placeholder=Оставить комментарий
|
diff.comment.placeholder=Оставить комментарий
|
||||||
diff.comment.markdown_info=Поддерживается синтаксис Markdown.
|
diff.comment.markdown_info=Поддерживается форматирование с Markdown.
|
||||||
diff.comment.add_single_comment=Добавить простой комментарий
|
diff.comment.add_single_comment=Добавить простой комментарий
|
||||||
diff.comment.add_review_comment=Добавить комментарий
|
diff.comment.add_review_comment=Добавить комментарий
|
||||||
diff.comment.start_review=Начать рецензию
|
diff.comment.start_review=Начать рецензию
|
||||||
|
@ -2661,7 +2661,7 @@ error.csv.unexpected=Не удается отобразить этот файл,
|
||||||
error.csv.invalid_field_count=Не удается отобразить этот файл, потому что он имеет неправильное количество полей в строке %d.
|
error.csv.invalid_field_count=Не удается отобразить этот файл, потому что он имеет неправильное количество полей в строке %d.
|
||||||
mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// .
|
mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// .
|
||||||
fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев.
|
fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев.
|
||||||
new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните миграцию.</a>
|
new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните перенос.</a>
|
||||||
mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса.
|
mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса.
|
||||||
issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи.
|
issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи.
|
||||||
pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем.
|
pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем.
|
||||||
|
@ -2843,6 +2843,7 @@ issues.review.add_remove_review_requests = запрошены рецензии
|
||||||
pulls.delete_after_merge.head_branch.is_default = Головная ветвь, которую вы попытались удалить, является ветвью по умолчанию и не может быть удалена.
|
pulls.delete_after_merge.head_branch.is_default = Головная ветвь, которую вы попытались удалить, является ветвью по умолчанию и не может быть удалена.
|
||||||
pulls.delete_after_merge.head_branch.is_protected = Головная ветвь, которую вы попытались удалить, защищена от этого и не может быть удалена.
|
pulls.delete_after_merge.head_branch.is_protected = Головная ветвь, которую вы попытались удалить, защищена от этого и не может быть удалена.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Отсутствует разрешение для удаления головной ветви.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Отсутствует разрешение для удаления головной ветви.
|
||||||
|
issues.filter_sort.relevance = По соответствию
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
|
|
||||||
|
@ -3418,7 +3419,7 @@ config.git_max_diff_lines=Макс. количество строк в файл
|
||||||
config.git_max_diff_line_characters=Макс. количество символов в строке при сравнении
|
config.git_max_diff_line_characters=Макс. количество символов в строке при сравнении
|
||||||
config.git_max_diff_files=Макс. отображаемое количество файлов при сравнении
|
config.git_max_diff_files=Макс. отображаемое количество файлов при сравнении
|
||||||
config.git_gc_args=Аргументы сборщика мусора
|
config.git_gc_args=Аргументы сборщика мусора
|
||||||
config.git_migrate_timeout=Ограничение времени миграций
|
config.git_migrate_timeout=Ограничение времени переносов
|
||||||
config.git_mirror_timeout=Ограничение времени на синхронизацию зеркала
|
config.git_mirror_timeout=Ограничение времени на синхронизацию зеркала
|
||||||
config.git_clone_timeout=Ограничение времени операций клонирования
|
config.git_clone_timeout=Ограничение времени операций клонирования
|
||||||
config.git_pull_timeout=Ограничение времени на получение изменений
|
config.git_pull_timeout=Ограничение времени на получение изменений
|
||||||
|
|
|
@ -108,7 +108,7 @@ enable_javascript = Цей вебсайт потребує JavaScript.
|
||||||
webauthn_press_button = Натисніть кнопку на ключі безпеки…
|
webauthn_press_button = Натисніть кнопку на ключі безпеки…
|
||||||
webauthn_use_twofa = Введіть код підтвердження з телефону
|
webauthn_use_twofa = Введіть код підтвердження з телефону
|
||||||
webauthn_error = Не вдалося розпізнати ключ безпеки.
|
webauthn_error = Не вдалося розпізнати ключ безпеки.
|
||||||
webauthn_error_unknown = Трапилась невідома помилка. Будь ласка, повторіть спробу.
|
webauthn_error_unknown = Сталася невідома помилка. Будь ласка, повторіть спробу.
|
||||||
webauthn_error_unable_to_process = Сервер не зміг обробити запит.
|
webauthn_error_unable_to_process = Сервер не зміг обробити запит.
|
||||||
webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано.
|
webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано.
|
||||||
webauthn_error_empty = Ключ слід якось назвати.
|
webauthn_error_empty = Ключ слід якось назвати.
|
||||||
|
@ -468,7 +468,7 @@ openid_signin_desc = Введіть ваше посилання OpenID. Напр
|
||||||
invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису.
|
invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису.
|
||||||
hint_login = Вже маєте обліковий запис? <a href="%s">Увійдіть зараз!</a>
|
hint_login = Вже маєте обліковий запис? <a href="%s">Увійдіть зараз!</a>
|
||||||
hint_register = Потрібен обліковий запис? <a href="%s">Зареєструйтеся зараз.</a>
|
hint_register = Потрібен обліковий запис? <a href="%s">Зареєструйтеся зараз.</a>
|
||||||
sign_up_button = Зареєструватись зараз.
|
sign_up_button = Зареєструватися.
|
||||||
sign_up_successful = Обліковий запис успішно створений. Вітаємо!
|
sign_up_successful = Обліковий запис успішно створений. Вітаємо!
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
|
@ -492,7 +492,7 @@ register_notify.text_3=Якщо цей обліковий запис було с
|
||||||
|
|
||||||
reset_password=Відновлення вашого облікового запису
|
reset_password=Відновлення вашого облікового запису
|
||||||
reset_password.title=%s, ви відправили запит на відновлення облікового запису
|
reset_password.title=%s, ви відправили запит на відновлення облікового запису
|
||||||
reset_password.text=Перейдіть за цим посиланням, щоб відновити ваш обліковий запис в <b>%s</b>:
|
reset_password.text=Перейдіть за цим посиланням, щоб відновити свій обліковий запис в <b>%s</b>:
|
||||||
|
|
||||||
register_success=Реєстрація успішна
|
register_success=Реєстрація успішна
|
||||||
|
|
||||||
|
@ -532,12 +532,14 @@ repo.collaborator.added.text=Вас додано в якості співавт
|
||||||
primary_mail_change.subject = Ваша основна пошта була змінена
|
primary_mail_change.subject = Ваша основна пошта була змінена
|
||||||
totp_disabled.subject = TOTP було вимкнено
|
totp_disabled.subject = TOTP було вимкнено
|
||||||
totp_disabled.text_1 = Тимчасовий одноразовий пароль (TOTP) на вашому обліковому записі було вимкнено.
|
totp_disabled.text_1 = Тимчасовий одноразовий пароль (TOTP) на вашому обліковому записі було вимкнено.
|
||||||
password_change.subject = Ваш пароль було успішно змінено
|
password_change.subject = Ваш пароль успішно змінено
|
||||||
password_change.text_1 = Пароль до вашого облікового запису щойно був змінений.
|
password_change.text_1 = Пароль до вашого облікового запису було щойно змінено.
|
||||||
reply = чи відповісти напряму з електронної адреси
|
reply = чи відповісти напряму з електронної адреси
|
||||||
admin.new_user.user_info = Інформація користувача
|
admin.new_user.user_info = Інформація користувача
|
||||||
admin.new_user.text = Будь ласка, <a href="%s">натисніть тут</a>, щоб керувати цим користувачем із панелі адміністрації.
|
admin.new_user.text = Будь ласка, <a href="%s">натисніть тут</a>, щоб керувати цим користувачем із панелі адміністрації.
|
||||||
admin.new_user.subject = Новий користувач %s щойно ввійшов
|
admin.new_user.subject = Новий користувач %s щойно ввійшов
|
||||||
|
removed_security_key.text_1 = Ключ безпеки «%[1]s» було щойно видалено з вашого облікового запису.
|
||||||
|
removed_security_key.subject = Ключ безпеки видалено
|
||||||
|
|
||||||
|
|
||||||
[modal]
|
[modal]
|
||||||
|
@ -748,7 +750,7 @@ manage_ssh_keys=Керувати ключами SSH
|
||||||
manage_ssh_principals=Управління SSH сертифікатами користувачів
|
manage_ssh_principals=Управління SSH сертифікатами користувачів
|
||||||
manage_gpg_keys=Керувати ключами GPG
|
manage_gpg_keys=Керувати ключами GPG
|
||||||
add_key=Додати ключ
|
add_key=Додати ключ
|
||||||
ssh_desc=Ці відкриті SSH-ключі пов'язані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв.
|
ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписані з SSH.
|
||||||
principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв.
|
principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв.
|
||||||
gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів.
|
gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів.
|
||||||
ssh_helper=<strong>Потрібна допомога?</strong> Дивіться гід на GitHub з <a href="%s"> генерації ключів SSH</a> або виправлення <a href="%s">типових неполадок SSH</a>.
|
ssh_helper=<strong>Потрібна допомога?</strong> Дивіться гід на GitHub з <a href="%s"> генерації ключів SSH</a> або виправлення <a href="%s">типових неполадок SSH</a>.
|
||||||
|
@ -917,6 +919,20 @@ webauthn_delete_key_desc = Якщо ви видалите ключ безпек
|
||||||
change_password = Зміна пароля
|
change_password = Зміна пароля
|
||||||
email_notifications.andyourown = І ваші власні сповіщення
|
email_notifications.andyourown = І ваші власні сповіщення
|
||||||
visibility.public_tooltip = Видимий(а) для всіх
|
visibility.public_tooltip = Видимий(а) для всіх
|
||||||
|
update_language_not_found = Мова «%s» недоступна.
|
||||||
|
pronouns = Займенники
|
||||||
|
pronouns_unspecified = Не вказані
|
||||||
|
hints = Підказки
|
||||||
|
language.title = Мова за замовчуванням
|
||||||
|
update_hints = Оновити підказки
|
||||||
|
update_hints_success = Підказки оновлено.
|
||||||
|
additional_repo_units_hint = Пропонувати увімкнути додаткові розділи репозиторію
|
||||||
|
additional_repo_units_hint_description = Показувати підказку «Увімкнути ще» для репозиторіїв, у яких увімкнено не всі доступні розділи.
|
||||||
|
language.description = Цю мову буде збережено у вашому обліковому записі, вона використовуватиметься після того, як ви ввійдете в систему.
|
||||||
|
language.localization_project = Допоможіть нам перекласти Forgejo вашою мовою! <a href="%s">Дізнатися більше</a>.
|
||||||
|
permissions_list = Дозволи:
|
||||||
|
comment_type_group_dependency = Залежність
|
||||||
|
comment_type_group_pull_request_push = Додані коміти
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
owner=Власник
|
owner=Власник
|
||||||
|
@ -1181,7 +1197,7 @@ commits.commits=Коміти
|
||||||
commits.nothing_to_compare=Ці гілки однакові.
|
commits.nothing_to_compare=Ці гілки однакові.
|
||||||
commits.search=Знайти коміт…
|
commits.search=Знайти коміт…
|
||||||
commits.find=Пошук
|
commits.find=Пошук
|
||||||
commits.search_all=Усі гілки
|
commits.search_all=У всіх гілках
|
||||||
commits.author=Автор
|
commits.author=Автор
|
||||||
commits.message=Повідомлення
|
commits.message=Повідомлення
|
||||||
commits.date=Дата
|
commits.date=Дата
|
||||||
|
@ -1744,9 +1760,9 @@ settings.site=Веб-сайт
|
||||||
settings.update_settings=Зберегти налаштування
|
settings.update_settings=Зберегти налаштування
|
||||||
settings.branches.update_default_branch=Оновити гілку за замовчуванням
|
settings.branches.update_default_branch=Оновити гілку за замовчуванням
|
||||||
settings.advanced_settings=Додаткові налаштування
|
settings.advanced_settings=Додаткові налаштування
|
||||||
settings.wiki_desc=Увімкнути репозиторії Вікі
|
settings.wiki_desc=Увімкнути вікі репозиторію
|
||||||
settings.use_internal_wiki=Використовувати вбудовані Вікі
|
settings.use_internal_wiki=Використовувати вбудовану вікі
|
||||||
settings.use_external_wiki=Використовувати зовнішні Вікі
|
settings.use_external_wiki=Використовувати зовнішню вікі
|
||||||
settings.external_wiki_url=URL зовнішньої вікі
|
settings.external_wiki_url=URL зовнішньої вікі
|
||||||
settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою.
|
settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою.
|
||||||
settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці.
|
settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці.
|
||||||
|
@ -1796,7 +1812,7 @@ settings.transfer_notices_1=- Ви втратите доступ до репоз
|
||||||
settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є.
|
settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є.
|
||||||
settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів).
|
settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів).
|
||||||
settings.transfer_owner=Новий власник
|
settings.transfer_owner=Новий власник
|
||||||
settings.transfer_perform=Здіснити перенесення
|
settings.transfer_perform=Здійснити перенесення
|
||||||
settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"`
|
settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"`
|
||||||
settings.transfer_succeed=Репозиторій був перенесений.
|
settings.transfer_succeed=Репозиторій був перенесений.
|
||||||
settings.signing_settings=Параметри перевірки підпису
|
settings.signing_settings=Параметри перевірки підпису
|
||||||
|
@ -1906,7 +1922,7 @@ settings.event_pull_request_desc=Запит до злиття відкрито,
|
||||||
settings.event_pull_request_assign=Призначення
|
settings.event_pull_request_assign=Призначення
|
||||||
settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано.
|
settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано.
|
||||||
settings.event_pull_request_label=Мітки
|
settings.event_pull_request_label=Мітки
|
||||||
settings.event_pull_request_label_desc=Мітка запиту на злиття оновлена або очищена.
|
settings.event_pull_request_label_desc=Мітки запиту на злиття оновлено або очищено.
|
||||||
settings.event_pull_request_milestone=Запит на злиття призначений на етап
|
settings.event_pull_request_milestone=Запит на злиття призначений на етап
|
||||||
settings.event_pull_request_milestone_desc=Запит на злиття призначений на етап або видалений з етапу.
|
settings.event_pull_request_milestone_desc=Запит на злиття призначений на етап або видалений з етапу.
|
||||||
settings.event_pull_request_comment=Коментарі
|
settings.event_pull_request_comment=Коментарі
|
||||||
|
@ -1928,8 +1944,8 @@ settings.hook_type=Тип хука
|
||||||
settings.slack_token=Токен
|
settings.slack_token=Токен
|
||||||
settings.slack_domain=Домен
|
settings.slack_domain=Домен
|
||||||
settings.slack_channel=Канал
|
settings.slack_channel=Канал
|
||||||
settings.deploy_keys=Ключі для розгортування
|
settings.deploy_keys=Ключі для розгортання
|
||||||
settings.add_deploy_key=Додати ключ для розгортування
|
settings.add_deploy_key=Додати ключ для розгортання
|
||||||
settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта.
|
settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта.
|
||||||
settings.is_writable=Увімкнути доступ для запису
|
settings.is_writable=Увімкнути доступ для запису
|
||||||
settings.is_writable_info=Чи може цей ключ бути використаний для виконання <strong>push</strong> в репозиторій? Ключі розгортання завжди мають доступ на pull.
|
settings.is_writable_info=Чи може цей ключ бути використаний для виконання <strong>push</strong> в репозиторій? Ключі розгортання завжди мають доступ на pull.
|
||||||
|
@ -1938,7 +1954,7 @@ settings.title=Заголовок
|
||||||
settings.deploy_key_content=Зміст
|
settings.deploy_key_content=Зміст
|
||||||
settings.key_been_used=Зміст ключа розгортання вже використовується.
|
settings.key_been_used=Зміст ключа розгортання вже використовується.
|
||||||
settings.key_name_used=Ключ розгортання з таким заголовком вже існує.
|
settings.key_name_used=Ключ розгортання з таким заголовком вже існує.
|
||||||
settings.deploy_key_deletion=Видалити ключ для розгортування
|
settings.deploy_key_deletion=Видалити ключ для розгортання
|
||||||
settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені?
|
settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені?
|
||||||
settings.deploy_key_deletion_success=Ключі розгортання було видалено.
|
settings.deploy_key_deletion_success=Ключі розгортання було видалено.
|
||||||
settings.branches=Гілки
|
settings.branches=Гілки
|
||||||
|
@ -1949,7 +1965,7 @@ settings.protected_branch_can_push_no=Ви не можете виконуват
|
||||||
settings.branch_protection=Правила захисту для гілки «<b>%s</b>»
|
settings.branch_protection=Правила захисту для гілки «<b>%s</b>»
|
||||||
settings.protect_this_branch=Захистити цю гілку
|
settings.protect_this_branch=Захистити цю гілку
|
||||||
settings.protect_this_branch_desc=Запобігає видаленню гілки та обмежує виконання в ній push та злиття.
|
settings.protect_this_branch_desc=Запобігає видаленню гілки та обмежує виконання в ній push та злиття.
|
||||||
settings.protect_disable_push=Заборонити Push
|
settings.protect_disable_push=Заборонити push
|
||||||
settings.protect_disable_push_desc=Для цієї гілки буде заборонено виконання push.
|
settings.protect_disable_push_desc=Для цієї гілки буде заборонено виконання push.
|
||||||
settings.protect_enable_push=Дозволити push
|
settings.protect_enable_push=Дозволити push
|
||||||
settings.protect_enable_push_desc=Будь-хто із правом запису зможе виконувати push для цієї гілки (за виключенням force push).
|
settings.protect_enable_push_desc=Будь-хто із правом запису зможе виконувати push для цієї гілки (за виключенням force push).
|
||||||
|
@ -2273,9 +2289,86 @@ no_eol.tooltip = У цьому файлі відсутній символ зак
|
||||||
settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних.
|
settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних.
|
||||||
pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…».
|
pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…».
|
||||||
branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти.
|
branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти.
|
||||||
|
settings.graphql_url = Посилання GraphQL
|
||||||
|
settings.packagist_api_token = Токен API
|
||||||
|
settings.archive.text = Архівування репозиторію зробить його доступним тільки для читання. Він буде прихований з панелі управління. Ніхто (навіть ви!) не зможе робити нові коміти, створювати задачі чи запити на злиття.
|
||||||
|
settings.protected_branch.delete_rule = Видалити правило
|
||||||
|
settings.branches.add_new_rule = Додати нове правило
|
||||||
|
settings.add_key_success = Ключ для розгортання «%s» успішно додано.
|
||||||
|
settings.update_settings_no_unit = Репозиторій повинен дозволяти хоча б якусь взаємодію.
|
||||||
|
settings.packagist_package_url = Посилання на пакунок Packagist
|
||||||
|
settings.transfer.modal.title = Передати новому власнику
|
||||||
|
settings.transfer.button = Передати новому власнику
|
||||||
|
settings.event_package = Пакунок
|
||||||
|
settings.event_package_desc = Пакунок у репозиторії створено або видалено.
|
||||||
|
settings.new_owner_blocked_doer = Новий власник заблокував вас.
|
||||||
|
settings.transfer_quota_exceeded = Новий власник (%s) перевищив квоту. Репозиторій не передано.
|
||||||
|
release.title_empty = Заголовок не може бути порожнім.
|
||||||
|
issues.role.member_helper = Цей користувач є членом організації, що володіє цим репозиторієм.
|
||||||
|
wiki.page_content = Вміст сторінки
|
||||||
|
wiki.page_title = Заголовок сторінки
|
||||||
|
pulls.close = Закрити запит на злиття
|
||||||
|
branch.delete = Видалити гілку «%s»
|
||||||
|
diff.comment.add_line_comment = Додати коментар до рядка
|
||||||
|
issues.review.option.hide_outdated_comments = Приховати застарілі коментарі
|
||||||
|
issues.num_participants_one = %d учасник
|
||||||
|
issues.review.option.show_outdated_comments = Показати застарілі коментарі
|
||||||
|
pulls.delete.title = Видалити цей запит на злиття?
|
||||||
|
issues.author.tooltip.pr = Автор цього запиту на злиття.
|
||||||
|
branch.deletion_failed = Не вдалося видалити гілку «%s».
|
||||||
|
pulls.status_checks_show_all = Показати всі перевірки
|
||||||
|
wiki.cancel = Скасувати
|
||||||
|
issues.role.first_time_contributor_helper = Це перший внесок цього користувача до репозиторію.
|
||||||
|
pulls.filter_changes_by_commit = Фільтрувати за комітом
|
||||||
|
pulls.is_empty = Зміни з цієї гілки вже є в цільовій гілці. Коміт буде порожній.
|
||||||
|
issues.author.tooltip.issue = Автор цієї задачі.
|
||||||
|
pulls.made_using_agit = AGit
|
||||||
|
activity.navbar.recent_commits = Нещодавні коміти
|
||||||
|
branch.deletion_success = Гілку «%s» видалено.
|
||||||
|
pulls.show_all_commits = Показати всі коміти
|
||||||
|
pull.deleted_branch = (видалено): %s
|
||||||
|
milestones.update_ago = Оновлено %s
|
||||||
|
size_format = %[1]s: %[2]s; %[3]s: %[4]s
|
||||||
|
settings.units.add_more = Увімкнути ще
|
||||||
|
migrate.cancel_migrating_title = Скасувати перенесення
|
||||||
|
settings.units.units = Розділи
|
||||||
|
settings.units.overview = Огляд
|
||||||
|
projects.create_success = Проєкт «%s» створено.
|
||||||
|
issues.no_content = Немає опису.
|
||||||
|
settings.mirror_settings.docs.doc_link_title = Як дзеркалювати репозиторії?
|
||||||
|
n_commit_one = %s коміт
|
||||||
|
n_commit_few = %s комітів
|
||||||
|
signing.will_sign = Коміт буде підписано ключем «%s».
|
||||||
|
signing.wont_sign.error = Під час перевірки можливості підписати коміт сталася помилка.
|
||||||
|
commits.search_branch = У цій гілці
|
||||||
|
ext_wiki = Зовнішня вікі
|
||||||
|
pulls.commit_ref_at = `послався на цей запит на злиття в коміті <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
|
pulls.cmd_instruction_hint = Переглянути інструкції для командного рядка
|
||||||
|
issues.max_pinned = Неможливо закріпити більше задач
|
||||||
|
issues.unpin_comment = відкріпив %s
|
||||||
|
issues.pin_comment = закріпив %s
|
||||||
|
project = Проєкти
|
||||||
|
issues.review.outdated_description = Вміст змінився з моменту написання цього коментаря
|
||||||
|
commits.browse_further = Дивитися далі
|
||||||
|
issues.unpin_issue = Відкріпити задачу
|
||||||
|
n_branch_one = %s гілка
|
||||||
|
n_branch_few = %s гілок
|
||||||
|
executable_file = Виконуваний файл
|
||||||
|
migrate_options_mirror_helper = Цей репозиторій буде дзеркалом
|
||||||
|
projects.edit_success = Проєкт «%s» оновлено.
|
||||||
|
wiki.search = Пошук по вікі
|
||||||
|
wiki.no_search_results = Нічого не знайдено
|
||||||
|
pulls.closed = Запит на злиття закрито
|
||||||
|
signing.wont_sign.not_signed_in = Ви не ввійшли в систему.
|
||||||
|
settings.wiki_globally_editable = Дозволити всім користувачам редагувати вікі
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
contributors.what = внески
|
contributors.what = внески
|
||||||
|
component_loading_info = Це може зайняти деякий час…
|
||||||
|
component_loading = Завантаження %s...
|
||||||
|
component_loading_failed = Не вдалося завантажити %s
|
||||||
|
recent_commits.what = нещодавні коміти
|
||||||
|
component_failed_to_load = Сталася несподівана помилка.
|
||||||
|
|
||||||
[org]
|
[org]
|
||||||
org_name_holder=Назва організації
|
org_name_holder=Назва організації
|
||||||
|
@ -2384,6 +2477,7 @@ teams.all_repositories_read_permission_desc=Ця команда надає до
|
||||||
teams.all_repositories_write_permission_desc=Ця команда надає дозвіл <strong>Запис</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати та виконувати push в репозиторіях.
|
teams.all_repositories_write_permission_desc=Ця команда надає дозвіл <strong>Запис</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати та виконувати push в репозиторіях.
|
||||||
teams.all_repositories_admin_permission_desc=Ця команда надає дозвіл <strong>Адміністрування</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати, виконувати push та додавати співробітників.
|
teams.all_repositories_admin_permission_desc=Ця команда надає дозвіл <strong>Адміністрування</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати, виконувати push та додавати співробітників.
|
||||||
code = Код
|
code = Код
|
||||||
|
open_dashboard = Відкрити панель управління
|
||||||
|
|
||||||
[admin]
|
[admin]
|
||||||
dashboard=Панель управління
|
dashboard=Панель управління
|
||||||
|
@ -2844,6 +2938,17 @@ monitor.last_execution_result = Результат
|
||||||
repos.lfs_size = Розмір LFS
|
repos.lfs_size = Розмір LFS
|
||||||
config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи.
|
config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи.
|
||||||
config.mailer_enable_helo = Увімкнути HELO
|
config.mailer_enable_helo = Увімкнути HELO
|
||||||
|
users.organization_creation.description = Дозволити створення нових організацій.
|
||||||
|
users.cannot_delete_self = Ви не можете видалити себе
|
||||||
|
monitor.processes_count = %d процесів
|
||||||
|
monitor.stacktrace = Траса стека
|
||||||
|
config.send_test_mail_submit = Надіслати
|
||||||
|
users.bot = Бот
|
||||||
|
monitor.stats = Статистика
|
||||||
|
users.new_success = Обліковий запис «%s» створено.
|
||||||
|
config_settings = Налаштування
|
||||||
|
self_check.no_problem_found = Проблем поки що не виявлено.
|
||||||
|
config_summary = Підсумок
|
||||||
|
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
|
@ -2969,7 +3074,7 @@ desc = Керувати пакунками репозиторію.
|
||||||
requirements = Вимоги
|
requirements = Вимоги
|
||||||
dependencies = Залежності
|
dependencies = Залежності
|
||||||
empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до <a href="%[1]s">налаштувань пакунків</a> та привʼяжіть його до цього репозиторію.
|
empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до <a href="%[1]s">налаштувань пакунків</a> та привʼяжіть його до цього репозиторію.
|
||||||
alpine.repository = Інформація репозиторію
|
alpine.repository = Про репозиторій
|
||||||
alpine.install = Аби встановити цей пакунок, запустіть команду:
|
alpine.install = Аби встановити цей пакунок, запустіть команду:
|
||||||
cran.install = Аби встановити пакунок, запустіть команду:
|
cran.install = Аби встановити пакунок, запустіть команду:
|
||||||
composer.dependencies.development = Залежності розробки
|
composer.dependencies.development = Залежності розробки
|
||||||
|
@ -2992,7 +3097,7 @@ container.pull = Завантажити світлину з командного
|
||||||
details.repository_site = Вебсторінка репозиторію
|
details.repository_site = Вебсторінка репозиторію
|
||||||
composer.dependencies = Залежності
|
composer.dependencies = Залежності
|
||||||
debian.install = Аби встановити пакунок, запустіть команду:
|
debian.install = Аби встановити пакунок, запустіть команду:
|
||||||
debian.repository = Інформація репозиторію
|
debian.repository = Про репозиторій
|
||||||
debian.repository.distributions = Дистрибутиви
|
debian.repository.distributions = Дистрибутиви
|
||||||
alpine.repository.architectures = Архітектури
|
alpine.repository.architectures = Архітектури
|
||||||
arch.version.depends = Залежить
|
arch.version.depends = Залежить
|
||||||
|
@ -3006,6 +3111,12 @@ dependency.version = Версія
|
||||||
container.labels = Мітки
|
container.labels = Мітки
|
||||||
filter.no_result = Ваш фільтр не видав жодних результатів.
|
filter.no_result = Ваш фільтр не видав жодних результатів.
|
||||||
dependency.id = ID
|
dependency.id = ID
|
||||||
|
rpm.repository = Про репозиторій
|
||||||
|
rpm.repository.architectures = Архітектури
|
||||||
|
settings.delete.error = Не вдалося видалити пакунок.
|
||||||
|
settings.delete.success = Пакунок видалено.
|
||||||
|
npm.dependencies = Залежності
|
||||||
|
settings.delete = Видалити пакунок
|
||||||
|
|
||||||
[secrets]
|
[secrets]
|
||||||
deletion = Видалити секрет
|
deletion = Видалити секрет
|
||||||
|
@ -3018,6 +3129,7 @@ deletion.description = Видалення секрету є остаточним
|
||||||
creation = Додати секрет
|
creation = Додати секрет
|
||||||
none = Секретів ще немає.
|
none = Секретів ще немає.
|
||||||
creation.name_placeholder = без урахування регістру, тільки літерно-цифрові символи або підкреслення, не може починатися з GITEA_ або GITHUB_
|
creation.name_placeholder = без урахування регістру, тільки літерно-цифрові символи або підкреслення, не може починатися з GITEA_ або GITHUB_
|
||||||
|
secrets = Секрети
|
||||||
|
|
||||||
[actions]
|
[actions]
|
||||||
|
|
||||||
|
@ -3065,6 +3177,8 @@ runs.status_no_select = Усі стани
|
||||||
runs.status = Стан
|
runs.status = Стан
|
||||||
runners.task_list.status = Стан
|
runners.task_list.status = Стан
|
||||||
runners.status = Стан
|
runners.status = Стан
|
||||||
|
runs.no_workflows.documentation = Докладніше про Дії Forgejo читайте в <a target="_blank" rel="noopener noreferrer" href="%s">документації</a>.
|
||||||
|
runners.reset_registration_token = Скинути токен реєстрації
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ your_starred=点赞
|
||||||
your_settings=设置
|
your_settings=设置
|
||||||
|
|
||||||
all=所有
|
all=所有
|
||||||
sources=自建
|
sources=来源
|
||||||
mirrors=镜像
|
mirrors=镜像
|
||||||
collaborative=协作
|
collaborative=协作
|
||||||
forks=派生
|
forks=派生
|
||||||
|
@ -2585,7 +2585,7 @@ diff.file_suppressed_line_too_long=文件差异因一行或多行过长而隐藏
|
||||||
diff.too_many_files=某些文件未显示,因为此 diff 中更改的文件太多
|
diff.too_many_files=某些文件未显示,因为此 diff 中更改的文件太多
|
||||||
diff.show_more=显示更多
|
diff.show_more=显示更多
|
||||||
diff.load=加载差异
|
diff.load=加载差异
|
||||||
diff.generated=自动生成的
|
diff.generated=自动生成
|
||||||
diff.vendored=Vendored
|
diff.vendored=Vendored
|
||||||
diff.comment.add_line_comment=添加行内评论
|
diff.comment.add_line_comment=添加行内评论
|
||||||
diff.comment.placeholder=留下评论
|
diff.comment.placeholder=留下评论
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
|
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
|
||||||
</style>
|
</style>
|
||||||
</noscript>
|
</noscript>
|
||||||
|
{{template "shared/user/mention_highlight" .}}
|
||||||
{{template "base/head_opengraph" .}}
|
{{template "base/head_opengraph" .}}
|
||||||
{{template "base/head_style" .}}
|
{{template "base/head_style" .}}
|
||||||
{{template "custom/header" .}}
|
{{template "custom/header" .}}
|
||||||
|
|
14
templates/shared/user/mention_highlight.tmpl
Normal file
14
templates/shared/user/mention_highlight.tmpl
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{{if .IsSigned}}
|
||||||
|
<style>
|
||||||
|
.comment,
|
||||||
|
.commit-summary,
|
||||||
|
.commit-body {
|
||||||
|
.mention[href="{{AppSubUrl}}/{{.SignedUser.Name}}" i] {
|
||||||
|
background-color: var(--color-primary-alpha-30);
|
||||||
|
color: var(--color-primary-dark-2);
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 1px 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{{end}}
|
|
@ -5,7 +5,6 @@ package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -23,14 +22,31 @@ import (
|
||||||
|
|
||||||
// first entry represents filename
|
// first entry represents filename
|
||||||
// the following entries define the full file content over time
|
// the following entries define the full file content over time
|
||||||
type FileChanges [][]string
|
type FileChanges struct {
|
||||||
|
Filename string
|
||||||
|
CommitMsg string
|
||||||
|
Versions []string
|
||||||
|
}
|
||||||
|
|
||||||
// put your Git repo declarations in here
|
// put your Git repo declarations in here
|
||||||
// feel free to amend the helper function below or use the raw variant directly
|
// feel free to amend the helper function below or use the raw variant directly
|
||||||
func DeclareGitRepos(t *testing.T) func() {
|
func DeclareGitRepos(t *testing.T) func() {
|
||||||
cleanupFunctions := []func(){
|
cleanupFunctions := []func(){
|
||||||
newRepo(t, 2, "diff-test", FileChanges{
|
newRepo(t, 2, "diff-test", []FileChanges{{
|
||||||
{"testfile", "hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"},
|
Filename: "testfile",
|
||||||
|
Versions: []string{"hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"},
|
||||||
|
}}),
|
||||||
|
newRepo(t, 2, "mentions-highlighted", []FileChanges{
|
||||||
|
{
|
||||||
|
Filename: "history1.md",
|
||||||
|
Versions: []string{""},
|
||||||
|
CommitMsg: "A commit message which mentions @user2 in the title\nand has some additional text which mentions @user1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Filename: "history2.md",
|
||||||
|
Versions: []string{""},
|
||||||
|
CommitMsg: "Another commit which mentions @user1 in the title\nand @user2 in the text",
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
// add your repo declarations here
|
// add your repo declarations here
|
||||||
}
|
}
|
||||||
|
@ -42,7 +58,7 @@ func DeclareGitRepos(t *testing.T) func() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newRepo(t *testing.T, userID int64, repoName string, fileChanges FileChanges) func() {
|
func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChanges) func() {
|
||||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
|
||||||
somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName,
|
somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName,
|
||||||
[]unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil,
|
[]unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil,
|
||||||
|
@ -50,19 +66,25 @@ func newRepo(t *testing.T, userID int64, repoName string, fileChanges FileChange
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, file := range fileChanges {
|
for _, file := range fileChanges {
|
||||||
changeLen := len(file)
|
for i, version := range file.Versions {
|
||||||
for i := 1; i < changeLen; i++ {
|
operation := "update"
|
||||||
operation := "create"
|
if i == 0 {
|
||||||
if i != 1 {
|
operation = "create"
|
||||||
operation = "update"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// default to unique commit messages
|
||||||
|
commitMsg := file.CommitMsg
|
||||||
|
if commitMsg == "" {
|
||||||
|
commitMsg = fmt.Sprintf("Patch: %s-%d", file.Filename, i+1)
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := files_service.ChangeRepoFiles(git.DefaultContext, somerepo, user, &files_service.ChangeRepoFilesOptions{
|
resp, err := files_service.ChangeRepoFiles(git.DefaultContext, somerepo, user, &files_service.ChangeRepoFilesOptions{
|
||||||
Files: []*files_service.ChangeRepoFile{{
|
Files: []*files_service.ChangeRepoFile{{
|
||||||
Operation: operation,
|
Operation: operation,
|
||||||
TreePath: file[0],
|
TreePath: file.Filename,
|
||||||
ContentReader: strings.NewReader(file[i]),
|
ContentReader: strings.NewReader(version),
|
||||||
}},
|
}},
|
||||||
Message: fmt.Sprintf("Patch: %s-%s", file[0], strconv.Itoa(i)),
|
Message: commitMsg,
|
||||||
OldBranch: "main",
|
OldBranch: "main",
|
||||||
NewBranch: "main",
|
NewBranch: "main",
|
||||||
Author: &files_service.IdentityOptions{
|
Author: &files_service.IdentityOptions{
|
||||||
|
|
|
@ -5,7 +5,12 @@
|
||||||
// @watch end
|
// @watch end
|
||||||
|
|
||||||
import {expect} from '@playwright/test';
|
import {expect} from '@playwright/test';
|
||||||
import {test} from './utils_e2e.ts';
|
import {test, login_user, login} from './utils_e2e.ts';
|
||||||
|
import {accessibilityCheck} from './shared/accessibility.ts';
|
||||||
|
|
||||||
|
test.beforeAll(async ({browser}, workerInfo) => {
|
||||||
|
await login_user(browser, workerInfo, 'user2');
|
||||||
|
});
|
||||||
|
|
||||||
async function assertSelectedLines(page, nums) {
|
async function assertSelectedLines(page, nums) {
|
||||||
const pageAssertions = async () => {
|
const pageAssertions = async () => {
|
||||||
|
@ -75,3 +80,19 @@ test('Readable diff', async ({page}, workerInfo) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Username highlighted in commits', async ({browser}, workerInfo) => {
|
||||||
|
const page = await login({browser}, workerInfo);
|
||||||
|
await page.goto('/user2/mentions-highlighted/commits/branch/main');
|
||||||
|
// check first commit
|
||||||
|
await page.getByRole('link', {name: 'A commit message which'}).click();
|
||||||
|
await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/);
|
||||||
|
await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)');
|
||||||
|
await accessibilityCheck({page}, ['.commit-header'], [], []);
|
||||||
|
// check second commit
|
||||||
|
await page.goto('/user2/mentions-highlighted/commits/branch/main');
|
||||||
|
await page.locator('tbody').getByRole('link', {name: 'Another commit which mentions'}).click();
|
||||||
|
await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/);
|
||||||
|
await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)');
|
||||||
|
await accessibilityCheck({page}, ['.commit-header'], [], []);
|
||||||
|
});
|
||||||
|
|
35
tests/e2e/shared/accessibility.ts
Normal file
35
tests/e2e/shared/accessibility.ts
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import {expect, type Page} from '@playwright/test';
|
||||||
|
import {AxeBuilder} from '@axe-core/playwright';
|
||||||
|
|
||||||
|
export async function accessibilityCheck({page}: {page: Page}, includes: string[], excludes: string[], disabledRules: string[]) {
|
||||||
|
// contrast of inline links is still a global issue in Forgejo
|
||||||
|
disabledRules += 'link-in-text-block';
|
||||||
|
|
||||||
|
let accessibilityScanner = await new AxeBuilder({page})
|
||||||
|
.disableRules(disabledRules);
|
||||||
|
// passing the whole array seems to be not supported,
|
||||||
|
// iterating has the nice side-effectof skipping this if the array is empty
|
||||||
|
for (const incl of includes) {
|
||||||
|
// passing the whole array seems to be not supported
|
||||||
|
accessibilityScanner = accessibilityScanner.include(incl);
|
||||||
|
}
|
||||||
|
for (const excl of excludes) {
|
||||||
|
accessibilityScanner = accessibilityScanner.exclude(excl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan the page both in dark and light theme
|
||||||
|
let accessibilityScanResults = await accessibilityScanner.analyze();
|
||||||
|
expect(accessibilityScanResults.violations).toEqual([]);
|
||||||
|
await page.emulateMedia({colorScheme: 'dark'});
|
||||||
|
// in https://codeberg.org/forgejo/forgejo/pulls/5899 there have been
|
||||||
|
// some weird failures related to contrast scanning,
|
||||||
|
// reporting for colours that haven't been used and no trace in the
|
||||||
|
// screenshots.
|
||||||
|
// Since this was only happening with some browsers and not always,
|
||||||
|
// my bet is on a transition effect on dark/light mode switch.
|
||||||
|
// Waiting a little seems to work around this.
|
||||||
|
await page.waitForTimeout(100); // eslint-disable-line playwright/no-wait-for-timeout
|
||||||
|
accessibilityScanResults = await accessibilityScanner.analyze();
|
||||||
|
expect(accessibilityScanResults.violations).toEqual([]);
|
||||||
|
await page.emulateMedia({colorScheme: 'light'});
|
||||||
|
}
|
|
@ -1,17 +1,14 @@
|
||||||
import {expect, type Page} from '@playwright/test';
|
import {expect, type Page} from '@playwright/test';
|
||||||
import {AxeBuilder} from '@axe-core/playwright';
|
import {accessibilityCheck} from './accessibility.ts';
|
||||||
|
|
||||||
export async function validate_form({page}: {page: Page}, scope: 'form' | 'fieldset' = 'form') {
|
export async function validate_form({page}: {page: Page}, scope: 'form' | 'fieldset' = 'form') {
|
||||||
const accessibilityScanResults = await new AxeBuilder({page})
|
const excludedElements = [
|
||||||
// disable checking for link style - should be fixed, but not now
|
|
||||||
.disableRules('link-in-text-block')
|
|
||||||
.include(scope)
|
|
||||||
// exclude automated tooltips from accessibility scan, remove when fixed
|
// exclude automated tooltips from accessibility scan, remove when fixed
|
||||||
.exclude('span[data-tooltip-content')
|
'span[data-tooltip-content',
|
||||||
// exclude weird non-semantic HTML disabled content
|
// exclude weird non-semantic HTML disabled content
|
||||||
.exclude('.disabled')
|
'.disabled',
|
||||||
.analyze();
|
];
|
||||||
expect(accessibilityScanResults.violations).toEqual([]);
|
await accessibilityCheck({page}, [scope], excludedElements, []);
|
||||||
|
|
||||||
// assert CSS properties that needed to be overriden for forms (ensure they remain active)
|
// assert CSS properties that needed to be overriden for forms (ensure they remain active)
|
||||||
const boxes = page.getByRole('checkbox').or(page.getByRole('radio'));
|
const boxes = page.getByRole('checkbox').or(page.getByRole('radio'));
|
||||||
|
|
|
@ -302,12 +302,11 @@ jobs:
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(testCase.onType, func(t *testing.T) {
|
t.Run(testCase.onType, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
defer func() {
|
defer func() {
|
||||||
// cleanup leftovers, start from scratch
|
// cleanup leftovers, start from scratch
|
||||||
_, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRun{RepoID: baseRepo.ID})
|
unittest.AssertSuccessfulDelete(t, &actions_model.ActionRun{RepoID: baseRepo.ID})
|
||||||
require.NoError(t, err)
|
unittest.AssertSuccessfulDelete(t, &actions_model.ActionRunJob{RepoID: baseRepo.ID})
|
||||||
_, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRunJob{RepoID: baseRepo.ID})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// trigger the onType event
|
// trigger the onType event
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -44,6 +45,7 @@ func Test_Cmd_AdminUser(t *testing.T) {
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(testCase.name, func(t *testing.T) {
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
name := "testuser"
|
name := "testuser"
|
||||||
|
|
||||||
options := []string{"user", "create", "--username", name, "--password", "password", "--email", name + "@example.com"}
|
options := []string{"user", "create", "--username", name, "--password", "password", "--email", name + "@example.com"}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -67,6 +68,7 @@ func Test_CmdForgejo_Actions(t *testing.T) {
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(testCase.testName, func(t *testing.T) {
|
t.Run(testCase.testName, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
output, err := runMainApp("forgejo-cli", "actions", "register", "--secret", testCase.secret, "--scope", testCase.scope)
|
output, err := runMainApp("forgejo-cli", "actions", "register", "--secret", testCase.secret, "--scope", testCase.scope)
|
||||||
assert.EqualValues(t, "", output)
|
assert.EqualValues(t, "", output)
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import (
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/ssh"
|
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
"code.gitea.io/gitea/tests"
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
|
@ -33,8 +32,10 @@ func withKeyFile(t *testing.T, keyname string, callback func(string)) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
keyFile := filepath.Join(tmpDir, keyname)
|
keyFile := filepath.Join(tmpDir, keyname)
|
||||||
err = ssh.GenKeyPair(keyFile)
|
pubkey, privkey, err := util.GenerateSSHKeypair()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, os.WriteFile(keyFile, privkey, 0o600))
|
||||||
|
require.NoError(t, os.WriteFile(keyFile+".pub", pubkey, 0o600))
|
||||||
|
|
||||||
err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+
|
err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+
|
||||||
"ssh -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\" -o \"IdentitiesOnly=yes\" -i \""+keyFile+"\" \"$@\""), 0o700)
|
"ssh -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\" -o \"IdentitiesOnly=yes\" -i \""+keyFile+"\" \"$@\""), 0o700)
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
repo_module "code.gitea.io/gitea/modules/repository"
|
repo_module "code.gitea.io/gitea/modules/repository"
|
||||||
"code.gitea.io/gitea/modules/test"
|
"code.gitea.io/gitea/modules/test"
|
||||||
repo_service "code.gitea.io/gitea/services/repository"
|
repo_service "code.gitea.io/gitea/services/repository"
|
||||||
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -40,7 +41,7 @@ func testGitPush(t *testing.T, u *url.URL) {
|
||||||
forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) {
|
forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) {
|
||||||
t.Run("Push branches at once", func(t *testing.T) {
|
t.Run("Push branches at once", func(t *testing.T) {
|
||||||
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
|
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
|
||||||
for i := 0; i < 100; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
branchName := fmt.Sprintf("branch-%d", i)
|
branchName := fmt.Sprintf("branch-%d", i)
|
||||||
pushed = append(pushed, branchName)
|
pushed = append(pushed, branchName)
|
||||||
doGitCreateBranch(gitPath, branchName)(t)
|
doGitCreateBranch(gitPath, branchName)(t)
|
||||||
|
@ -88,7 +89,7 @@ func testGitPush(t *testing.T, u *url.URL) {
|
||||||
|
|
||||||
t.Run("Push branches one by one", func(t *testing.T) {
|
t.Run("Push branches one by one", func(t *testing.T) {
|
||||||
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
|
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
|
||||||
for i := 0; i < 100; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
branchName := fmt.Sprintf("branch-%d", i)
|
branchName := fmt.Sprintf("branch-%d", i)
|
||||||
doGitCreateBranch(gitPath, branchName)(t)
|
doGitCreateBranch(gitPath, branchName)(t)
|
||||||
doGitPushTestRepository(gitPath, "origin", branchName)(t)
|
doGitPushTestRepository(gitPath, "origin", branchName)(t)
|
||||||
|
@ -103,7 +104,7 @@ func testGitPush(t *testing.T, u *url.URL) {
|
||||||
doGitPushTestRepository(gitPath, "origin", "master")(t) // make sure master is the default branch instead of a branch we are going to delete
|
doGitPushTestRepository(gitPath, "origin", "master")(t) // make sure master is the default branch instead of a branch we are going to delete
|
||||||
pushed = append(pushed, "master")
|
pushed = append(pushed, "master")
|
||||||
|
|
||||||
for i := 0; i < 100; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
branchName := fmt.Sprintf("branch-%d", i)
|
branchName := fmt.Sprintf("branch-%d", i)
|
||||||
pushed = append(pushed, branchName)
|
pushed = append(pushed, branchName)
|
||||||
doGitCreateBranch(gitPath, branchName)(t)
|
doGitCreateBranch(gitPath, branchName)(t)
|
||||||
|
@ -139,6 +140,7 @@ func testGitPush(t *testing.T, u *url.URL) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func runTestGitPush(t *testing.T, u *url.URL, objectFormat git.ObjectFormat, gitOperation func(t *testing.T, gitPath string) (pushed, deleted []string)) {
|
func runTestGitPush(t *testing.T, u *url.URL, objectFormat git.ObjectFormat, gitOperation func(t *testing.T, gitPath string) (pushed, deleted []string)) {
|
||||||
|
defer tests.PrintCurrentTest(t, 1)()
|
||||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
repo, err := repo_service.CreateRepository(db.DefaultContext, user, user, repo_service.CreateRepoOptions{
|
repo, err := repo_service.CreateRepository(db.DefaultContext, user, user, repo_service.CreateRepoOptions{
|
||||||
Name: "repo-to-push",
|
Name: "repo-to-push",
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
@ -39,8 +40,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
littleSize = 1024 // 1ko
|
littleSize = 1024 // 1KiB
|
||||||
bigSize = 128 * 1024 * 1024 // 128Mo
|
bigSize = 32 * 1024 * 1024 // 32MiB
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGit(t *testing.T) {
|
func TestGit(t *testing.T) {
|
||||||
|
@ -299,53 +300,26 @@ func lockFileTest(t *testing.T, filename, repoPath string) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func doCommitAndPush(t *testing.T, size int, repoPath, prefix string) string {
|
func doCommitAndPush(t *testing.T, size int64, repoPath, prefix string) string {
|
||||||
name, err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two", prefix)
|
name := generateCommitWithNewData(t, size, repoPath, "user2@example.com", "User Two", prefix)
|
||||||
require.NoError(t, err)
|
_, _, err := git.NewCommand(git.DefaultContext, "push", "origin", "master").RunStdString(&git.RunOpts{Dir: repoPath}) // Push
|
||||||
_, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "master").RunStdString(&git.RunOpts{Dir: repoPath}) // Push
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateCommitWithNewData(size int, repoPath, email, fullName, prefix string) (string, error) {
|
func generateCommitWithNewData(t *testing.T, size int64, repoPath, email, fullName, prefix string) string {
|
||||||
// Generate random file
|
t.Helper()
|
||||||
bufSize := 4 * 1024
|
|
||||||
if bufSize > size {
|
|
||||||
bufSize = size
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer := make([]byte, bufSize)
|
|
||||||
|
|
||||||
tmpFile, err := os.CreateTemp(repoPath, prefix)
|
tmpFile, err := os.CreateTemp(repoPath, prefix)
|
||||||
if err != nil {
|
require.NoError(t, err)
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
defer tmpFile.Close()
|
defer tmpFile.Close()
|
||||||
written := 0
|
_, err = io.CopyN(tmpFile, rand.Reader, size)
|
||||||
for written < size {
|
require.NoError(t, err)
|
||||||
n := size - written
|
|
||||||
if n > bufSize {
|
|
||||||
n = bufSize
|
|
||||||
}
|
|
||||||
_, err := rand.Read(buffer[:n])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
n, err = tmpFile.Write(buffer[:n])
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
written += n
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commit
|
// Commit
|
||||||
// Now here we should explicitly allow lfs filters to run
|
// Now here we should explicitly allow lfs filters to run
|
||||||
globalArgs := git.AllowLFSFiltersArgs()
|
globalArgs := git.AllowLFSFiltersArgs()
|
||||||
err = git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name()))
|
require.NoError(t, git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name())))
|
||||||
if err != nil {
|
require.NoError(t, git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
err = git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{
|
|
||||||
Committer: &git.Signature{
|
Committer: &git.Signature{
|
||||||
Email: email,
|
Email: email,
|
||||||
Name: fullName,
|
Name: fullName,
|
||||||
|
@ -357,8 +331,8 @@ func generateCommitWithNewData(size int, repoPath, email, fullName, prefix strin
|
||||||
When: time.Now(),
|
When: time.Now(),
|
||||||
},
|
},
|
||||||
Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
|
Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
|
||||||
})
|
}))
|
||||||
return filepath.Base(tmpFile.Name()), err
|
return filepath.Base(tmpFile.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
||||||
|
@ -370,6 +344,7 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
|
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
|
||||||
|
|
||||||
t.Run("PushToNewProtectedBranch", func(t *testing.T) {
|
t.Run("PushToNewProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "before-create-1"))
|
t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "before-create-1"))
|
||||||
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-1", parameterProtectBranch{
|
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-1", parameterProtectBranch{
|
||||||
"enable_push": "all",
|
"enable_push": "all",
|
||||||
|
@ -378,8 +353,7 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "before-create-1"))
|
t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "before-create-1"))
|
||||||
|
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-2", parameterProtectBranch{
|
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-2", parameterProtectBranch{
|
||||||
|
@ -392,11 +366,11 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("FailToPushToProtectedBranch", func(t *testing.T) {
|
t.Run("FailToPushToProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "protected"))
|
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "protected"))
|
||||||
t.Run("Create modified-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-branch", "protected"))
|
t.Run("Create modified-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-branch", "protected"))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
doGitPushTestRepositoryFail(dstPath, "origin", "modified-protected-branch:protected")(t)
|
doGitPushTestRepositoryFail(dstPath, "origin", "modified-protected-branch:protected")(t)
|
||||||
|
@ -405,10 +379,10 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "modified-protected-branch:unprotected"))
|
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "modified-protected-branch:unprotected"))
|
||||||
|
|
||||||
t.Run("FailToPushProtectedFilesToProtectedBranch", func(t *testing.T) {
|
t.Run("FailToPushProtectedFilesToProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("Create modified-protected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-file-protected-branch", "protected"))
|
t.Run("Create modified-protected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-file-protected-branch", "protected"))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("ProtectedFilePathsApplyToAdmins", doProtectBranch(ctx, "protected"))
|
t.Run("ProtectedFilePathsApplyToAdmins", doProtectBranch(ctx, "protected"))
|
||||||
|
@ -419,13 +393,13 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("PushUnprotectedFilesToProtectedBranch", func(t *testing.T) {
|
t.Run("PushUnprotectedFilesToProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("Create modified-unprotected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-unprotected-file-protected-branch", "protected"))
|
t.Run("Create modified-unprotected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-unprotected-file-protected-branch", "protected"))
|
||||||
t.Run("UnprotectedFilePaths", doProtectBranch(ctx, "protected", parameterProtectBranch{
|
t.Run("UnprotectedFilePaths", doProtectBranch(ctx, "protected", parameterProtectBranch{
|
||||||
"unprotected_file_patterns": "unprotected-file-*",
|
"unprotected_file_patterns": "unprotected-file-*",
|
||||||
}))
|
}))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
doGitPushTestRepository(dstPath, "origin", "modified-unprotected-file-protected-branch:protected")(t)
|
doGitPushTestRepository(dstPath, "origin", "modified-unprotected-file-protected-branch:protected")(t)
|
||||||
doGitCheckoutBranch(dstPath, "protected")(t)
|
doGitCheckoutBranch(dstPath, "protected")(t)
|
||||||
|
@ -441,19 +415,19 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
t.Run("WhitelistedUserFailToForcePushToProtectedBranch", func(t *testing.T) {
|
t.Run("WhitelistedUserFailToForcePushToProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("Create toforce", doGitCheckoutBranch(dstPath, "-b", "toforce", "master"))
|
t.Run("Create toforce", doGitCheckoutBranch(dstPath, "-b", "toforce", "master"))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")(t)
|
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")(t)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("WhitelistedUserPushToProtectedBranch", func(t *testing.T) {
|
t.Run("WhitelistedUserPushToProtectedBranch", func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("Create topush", doGitCheckoutBranch(dstPath, "-b", "topush", "protected"))
|
t.Run("Create topush", doGitCheckoutBranch(dstPath, "-b", "topush", "protected"))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
doGitPushTestRepository(dstPath, "origin", "topush:protected")(t)
|
doGitPushTestRepository(dstPath, "origin", "topush:protected")(t)
|
||||||
})
|
})
|
||||||
|
@ -693,8 +667,7 @@ func doAutoPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
|
||||||
t.Run("CheckoutProtected", doGitCheckoutBranch(dstPath, "protected"))
|
t.Run("CheckoutProtected", doGitCheckoutBranch(dstPath, "protected"))
|
||||||
t.Run("PullProtected", doGitPull(dstPath, "origin", "protected"))
|
t.Run("PullProtected", doGitPull(dstPath, "origin", "protected"))
|
||||||
t.Run("GenerateCommit", func(t *testing.T) {
|
t.Run("GenerateCommit", func(t *testing.T) {
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
|
||||||
require.NoError(t, err)
|
|
||||||
})
|
})
|
||||||
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected3"))
|
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected3"))
|
||||||
var pr api.PullRequest
|
var pr api.PullRequest
|
||||||
|
|
21
tests/integration/mention_test.go
Normal file
21
tests/integration/mention_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package integration
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHeadMentionCSS(t *testing.T) {
|
||||||
|
userSession := loginUser(t, "user2")
|
||||||
|
resp := userSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK)
|
||||||
|
assert.Contains(t, resp.Body.String(), `.mention[href="/user2" i]`)
|
||||||
|
|
||||||
|
guestSession := emptyTestSession(t)
|
||||||
|
resp = guestSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK)
|
||||||
|
assert.NotContains(t, resp.Body.String(), `.mention[href="`)
|
||||||
|
}
|
|
@ -5,7 +5,6 @@
|
||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -21,9 +20,10 @@ import (
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/structs"
|
"code.gitea.io/gitea/modules/structs"
|
||||||
|
"code.gitea.io/gitea/modules/test"
|
||||||
"code.gitea.io/gitea/modules/translation"
|
"code.gitea.io/gitea/modules/translation"
|
||||||
"code.gitea.io/gitea/services/migrations"
|
"code.gitea.io/gitea/services/migrations"
|
||||||
"code.gitea.io/gitea/services/repository"
|
"code.gitea.io/gitea/tests"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -58,16 +58,8 @@ func TestMigrateLocalPath(t *testing.T) {
|
||||||
|
|
||||||
func TestMigrate(t *testing.T) {
|
func TestMigrate(t *testing.T) {
|
||||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||||
AllowLocalNetworks := setting.Migrations.AllowLocalNetworks
|
defer test.MockVariableValue(&setting.Migrations.AllowLocalNetworks, true)()
|
||||||
setting.Migrations.AllowLocalNetworks = true
|
defer test.MockVariableValue(&setting.AppVer, "1.16.0")()
|
||||||
AppVer := setting.AppVer
|
|
||||||
// Gitea SDK (go-sdk) need to parse the AppVer from server response, so we must set it to a valid version string.
|
|
||||||
setting.AppVer = "1.16.0"
|
|
||||||
defer func() {
|
|
||||||
setting.Migrations.AllowLocalNetworks = AllowLocalNetworks
|
|
||||||
setting.AppVer = AppVer
|
|
||||||
migrations.Init()
|
|
||||||
}()
|
|
||||||
require.NoError(t, migrations.Init())
|
require.NoError(t, migrations.Init())
|
||||||
|
|
||||||
ownerName := "user2"
|
ownerName := "user2"
|
||||||
|
@ -82,42 +74,40 @@ func TestMigrate(t *testing.T) {
|
||||||
{svc: structs.GiteaService},
|
{svc: structs.GiteaService},
|
||||||
{svc: structs.ForgejoService},
|
{svc: structs.ForgejoService},
|
||||||
} {
|
} {
|
||||||
// Step 0: verify the repo is available
|
t.Run(s.svc.Name(), func(t *testing.T) {
|
||||||
req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName)
|
defer tests.PrintCurrentTest(t)()
|
||||||
_ = session.MakeRequest(t, req, http.StatusOK)
|
// Step 0: verify the repo is available
|
||||||
// Step 1: get the Gitea migration form
|
req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName)
|
||||||
req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc)
|
_ = session.MakeRequest(t, req, http.StatusOK)
|
||||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
// Step 1: get the Gitea migration form
|
||||||
// Step 2: load the form
|
req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc)
|
||||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||||
// Check form title
|
// Step 2: load the form
|
||||||
title := htmlDoc.doc.Find("title").Text()
|
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||||
assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title"))
|
// Check form title
|
||||||
// Get the link of migration button
|
title := htmlDoc.doc.Find("title").Text()
|
||||||
link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action")
|
assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title"))
|
||||||
assert.True(t, exists, "The template has changed")
|
// Get the link of migration button
|
||||||
// Step 4: submit the migration to only migrate issues
|
link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action")
|
||||||
migratedRepoName := "otherrepo"
|
assert.True(t, exists, "The template has changed")
|
||||||
req = NewRequestWithValues(t, "POST", link, map[string]string{
|
// Step 4: submit the migration to only migrate issues
|
||||||
"_csrf": htmlDoc.GetCSRF(),
|
migratedRepoName := "otherrepo-" + s.svc.Name()
|
||||||
"service": fmt.Sprintf("%d", s.svc),
|
req = NewRequestWithValues(t, "POST", link, map[string]string{
|
||||||
"clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName),
|
"_csrf": htmlDoc.GetCSRF(),
|
||||||
"auth_token": token,
|
"service": fmt.Sprintf("%d", s.svc),
|
||||||
"issues": "on",
|
"clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName),
|
||||||
"repo_name": migratedRepoName,
|
"auth_token": token,
|
||||||
"description": "",
|
"issues": "on",
|
||||||
"uid": fmt.Sprintf("%d", repoOwner.ID),
|
"repo_name": migratedRepoName,
|
||||||
|
"description": "",
|
||||||
|
"uid": fmt.Sprintf("%d", repoOwner.ID),
|
||||||
|
})
|
||||||
|
resp = session.MakeRequest(t, req, http.StatusSeeOther)
|
||||||
|
// Step 5: a redirection displays the migrated repository
|
||||||
|
assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), test.RedirectURL(resp))
|
||||||
|
// Step 6: check the repo was created
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName})
|
||||||
})
|
})
|
||||||
resp = session.MakeRequest(t, req, http.StatusSeeOther)
|
|
||||||
// Step 5: a redirection displays the migrated repository
|
|
||||||
loc := resp.Header().Get("Location")
|
|
||||||
assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), loc)
|
|
||||||
// Step 6: check the repo was created
|
|
||||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName})
|
|
||||||
|
|
||||||
// Step 7: delete the repository, so we can test with other services
|
|
||||||
err := repository.DeleteRepository(context.Background(), repoOwner, repo, false)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -822,6 +822,7 @@ func TestPullMergeBranchProtect(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, withAPIOrWeb := range []string{"api", "web"} {
|
for _, withAPIOrWeb := range []string{"api", "web"} {
|
||||||
t.Run(testCase.name+" "+withAPIOrWeb, func(t *testing.T) {
|
t.Run(testCase.name+" "+withAPIOrWeb, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
branch := testCase.name + "-" + withAPIOrWeb
|
branch := testCase.name + "-" + withAPIOrWeb
|
||||||
unprotected := branch + "-unprotected"
|
unprotected := branch + "-unprotected"
|
||||||
doGitCheckoutBranch(dstPath, "master")(t)
|
doGitCheckoutBranch(dstPath, "master")(t)
|
||||||
|
@ -834,8 +835,7 @@ func TestPullMergeBranchProtect(t *testing.T) {
|
||||||
ctx = NewAPITestContext(t, testCase.doer, "not used", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
ctx = NewAPITestContext(t, testCase.doer, "not used", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
||||||
ctx.Username = owner
|
ctx.Username = owner
|
||||||
ctx.Reponame = repo
|
ctx.Reponame = repo
|
||||||
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", testCase.filename)
|
generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", testCase.filename)
|
||||||
require.NoError(t, err)
|
|
||||||
doGitPushTestRepository(dstPath, "origin", branch+":"+unprotected)(t)
|
doGitPushTestRepository(dstPath, "origin", branch+":"+unprotected)(t)
|
||||||
pr, err := doAPICreatePullRequest(ctx, owner, repo, branch, unprotected)(t)
|
pr, err := doAPICreatePullRequest(ctx, owner, repo, branch, unprotected)(t)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1015,6 +1015,7 @@ func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) {
|
||||||
// perform all tests with API and web routes
|
// perform all tests with API and web routes
|
||||||
for _, withAPI := range []bool{false, true} {
|
for _, withAPI := range []bool{false, true} {
|
||||||
t.Run(testCase.name, func(t *testing.T) {
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
protectedBranch := parameterProtectBranch{
|
protectedBranch := parameterProtectBranch{
|
||||||
"enable_push": "true",
|
"enable_push": "true",
|
||||||
"enable_status_check": "true",
|
"enable_status_check": "true",
|
||||||
|
|
|
@ -316,6 +316,7 @@ func assertInput(t testing.TB, form *goquery.Selection, name string) string {
|
||||||
|
|
||||||
func testWebhookForms(name string, session *TestSession, validFields map[string]string, invalidPatches ...map[string]string) func(t *testing.T) {
|
func testWebhookForms(name string, session *TestSession, validFields map[string]string, invalidPatches ...map[string]string) func(t *testing.T) {
|
||||||
return func(t *testing.T) {
|
return func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
t.Run("repo1", func(t *testing.T) {
|
t.Run("repo1", func(t *testing.T) {
|
||||||
testWebhookFormsShared(t, "/user2/repo1/settings/hooks", name, session, validFields, invalidPatches...)
|
testWebhookFormsShared(t, "/user2/repo1/settings/hooks", name, session, validFields, invalidPatches...)
|
||||||
})
|
})
|
||||||
|
|
|
@ -98,6 +98,7 @@ func (countTest *userCountTest) getCount(doc *goquery.Document, name string) (in
|
||||||
|
|
||||||
func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) {
|
func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) {
|
||||||
t.Run(page, func(t *testing.T) {
|
t.Run(page, func(t *testing.T) {
|
||||||
|
defer tests.PrintCurrentTest(t)()
|
||||||
var userLink string
|
var userLink string
|
||||||
|
|
||||||
if orgLink {
|
if orgLink {
|
||||||
|
|
|
@ -113,3 +113,6 @@ REPLY_TO_ADDRESS = incoming+%{token}@localhost
|
||||||
|
|
||||||
[actions]
|
[actions]
|
||||||
ENABLED = true
|
ENABLED = true
|
||||||
|
|
||||||
|
[ui.notification]
|
||||||
|
EVENT_SOURCE_UPDATE_TIME = 1s
|
||||||
|
|
|
@ -127,3 +127,6 @@ ENABLED = true
|
||||||
|
|
||||||
[actions]
|
[actions]
|
||||||
ENABLED = true
|
ENABLED = true
|
||||||
|
|
||||||
|
[ui.notification]
|
||||||
|
EVENT_SOURCE_UPDATE_TIME = 1s
|
||||||
|
|
|
@ -5,6 +5,7 @@ RUN_MODE = prod
|
||||||
[database]
|
[database]
|
||||||
DB_TYPE = sqlite3
|
DB_TYPE = sqlite3
|
||||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/gitea.db
|
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/gitea.db
|
||||||
|
SQLITE_JOURNAL_MODE = MEMORY
|
||||||
|
|
||||||
[indexer]
|
[indexer]
|
||||||
REPO_INDEXER_ENABLED = true
|
REPO_INDEXER_ENABLED = true
|
||||||
|
@ -113,3 +114,6 @@ RENDER_CONTENT_MODE=sanitized
|
||||||
|
|
||||||
[actions]
|
[actions]
|
||||||
ENABLED = true
|
ENABLED = true
|
||||||
|
|
||||||
|
[ui.notification]
|
||||||
|
EVENT_SOURCE_UPDATE_TIME = 1s
|
||||||
|
|
|
@ -175,6 +175,9 @@ func InitTest(requireGitea bool) {
|
||||||
log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
|
log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case setting.Database.Type.IsSQLite3():
|
||||||
|
setting.Database.Path = ":memory:"
|
||||||
}
|
}
|
||||||
|
|
||||||
routers.InitWebInstalled(graceful.GetManager().HammerContext())
|
routers.InitWebInstalled(graceful.GetManager().HammerContext())
|
||||||
|
|
Loading…
Reference in a new issue