mirror of
https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo.git
synced 2025-04-21 05:36:43 +02:00
Compare commits
123 commits
v10.0.0-gi
...
forgejo
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b5ee78a3d0 | ||
![]() |
cc83c8c289 | ||
![]() |
be84c51de7 | ||
![]() |
5f1f4f7a87 | ||
![]() |
e741b44667 | ||
![]() |
85812d8b01 | ||
![]() |
24e2a6f41d | ||
![]() |
4521f8f35c | ||
![]() |
ea1ba91e6e | ||
![]() |
0e5e06f75a | ||
![]() |
b1c7251690 | ||
![]() |
795047adac | ||
![]() |
18df280fc1 | ||
![]() |
26ecdc330b | ||
![]() |
9d950c48a0 | ||
![]() |
90fea4b901 | ||
![]() |
1e539805da | ||
![]() |
66e54e33fe | ||
![]() |
195388ba62 | ||
![]() |
57a8ac3a31 | ||
![]() |
a9528fcdbd | ||
![]() |
1c7e2bce53 | ||
![]() |
2d00e46560 | ||
![]() |
a3b7d9242e | ||
![]() |
34af470aa8 | ||
![]() |
21bf0a8fe0 | ||
![]() |
65028f6abf | ||
![]() |
d2c9ac7697 | ||
![]() |
e335b49274 | ||
![]() |
ae30c0fa0e | ||
![]() |
62390abab9 | ||
![]() |
096cd1a6c8 | ||
![]() |
75794e1ab9 | ||
![]() |
383164e808 | ||
![]() |
e05f96cfaf | ||
![]() |
1c84972565 | ||
![]() |
9d902d16c6 | ||
![]() |
fc675b2ede | ||
![]() |
48fdf7540d | ||
![]() |
d8d5ad4a19 | ||
![]() |
28a9ce0083 | ||
![]() |
5da96c5f43 | ||
![]() |
917375146a | ||
![]() |
c4cb418f57 | ||
![]() |
b2dee3ca0e | ||
![]() |
cafb54ba55 | ||
![]() |
0b04df9ef4 | ||
![]() |
dde3f51c72 | ||
![]() |
0f5182d0c6 | ||
![]() |
a35a3b6731 | ||
![]() |
76dfc75ed2 | ||
![]() |
5ec1f7f363 | ||
![]() |
fc5a303b70 | ||
![]() |
8a7dc4ea06 | ||
![]() |
4b3135a859 | ||
![]() |
c082731211 | ||
![]() |
c1e9fd738b | ||
![]() |
400bd08cfe | ||
![]() |
e7d103319e | ||
![]() |
0c0155daf7 | ||
![]() |
40f1e0b1ff | ||
![]() |
c2158b2a1f | ||
![]() |
6e0f449fb9 | ||
![]() |
a830b4de6b | ||
![]() |
6fcb8f646f | ||
![]() |
c7bd6f4a3d | ||
![]() |
2e76237e26 | ||
![]() |
a6a1b11670 | ||
![]() |
b2c3f99901 | ||
![]() |
52fb476fb1 | ||
![]() |
3eacbfead9 | ||
![]() |
932afb2036 | ||
![]() |
cc8a05f693 | ||
![]() |
0fe56e6059 | ||
![]() |
4802c33acb | ||
![]() |
c56bbddf62 | ||
![]() |
a7ae98ff93 | ||
![]() |
0aa872c4e3 | ||
![]() |
ee49a62bed | ||
![]() |
89c4c9c477 | ||
![]() |
bdb78d42b6 | ||
![]() |
6ef900899e | ||
![]() |
a9f0bb9f68 | ||
![]() |
3b4f1b3469 | ||
![]() |
77fc232e5b | ||
![]() |
5a7d70658d | ||
![]() |
5046a10aec | ||
![]() |
77db7655e0 | ||
![]() |
c324910c31 | ||
![]() |
57ad0b868d | ||
![]() |
34d2a8531c | ||
![]() |
d260013a51 | ||
![]() |
3168330425 | ||
![]() |
2491bbfa69 | ||
![]() |
ac01c7a384 | ||
![]() |
b615d41457 | ||
![]() |
184bdef340 | ||
![]() |
27276ff26e | ||
![]() |
1b00bf2d26 | ||
![]() |
69bc17ea35 | ||
![]() |
0db9a24a4b | ||
![]() |
4016f2890d | ||
![]() |
c198cb6e65 | ||
![]() |
114d8975b5 | ||
![]() |
7ee19b4c6c | ||
![]() |
faa263d54a | ||
![]() |
0ecf28f37f | ||
![]() |
d10034f4d8 | ||
![]() |
553fc3cc42 | ||
![]() |
6d7bf7369d | ||
![]() |
eb83b05430 | ||
![]() |
61e345cd36 | ||
![]() |
5c5e1c87ba | ||
![]() |
7546c4acf3 | ||
![]() |
25e81d05f0 | ||
![]() |
054537989f | ||
![]() |
348e0e1fac | ||
![]() |
627634a76e | ||
![]() |
28db11f2e7 | ||
![]() |
6d0bf55f05 | ||
![]() |
2d1e163913 | ||
![]() |
26b7c6b86a | ||
![]() |
05056b8aa2 |
247 changed files with 12227 additions and 2185 deletions
|
@ -13,6 +13,8 @@ runs:
|
|||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
echo "deb http://deb.debian.org/debian/ ${RELEASE} main" > "/etc/apt/sources.list.d/${RELEASE}.list"
|
||||
wget -O- http://neuro.debian.net/lists/bookworm.de-fzj.libre | tee /etc/apt/sources.list.d/neurodebian.sources.list
|
||||
apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com 0xA5D32F012649A5A9
|
||||
env:
|
||||
RELEASE: ${{inputs.release}}
|
||||
- name: install packages
|
||||
|
@ -24,6 +26,7 @@ runs:
|
|||
- name: remove temporary package list to prevent using it in other steps
|
||||
run: |
|
||||
rm "/etc/apt/sources.list.d/${RELEASE}.list"
|
||||
rm "/etc/apt/sources.list.d/neurodebian.sources.list"
|
||||
apt-get update -qq
|
||||
env:
|
||||
RELEASE: ${{inputs.release}}
|
||||
|
|
|
@ -3,7 +3,7 @@ runs:
|
|||
steps:
|
||||
- run: |
|
||||
su forgejo -c 'make deps-backend'
|
||||
- uses: actions/cache@v4
|
||||
- uses: https://data.forgejo.org/actions/cache@v4
|
||||
id: cache-backend
|
||||
with:
|
||||
path: ${{github.workspace}}/gitea
|
||||
|
|
|
@ -27,8 +27,10 @@ runs:
|
|||
- name: "Get go environment information"
|
||||
id: go-environment
|
||||
run: |
|
||||
echo "modcache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT"
|
||||
echo "cache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT"
|
||||
chmod 755 $HOME # ensure ${RUN_AS_USER} has permission when go is located in $HOME
|
||||
export GOROOT="$(go env GOROOT)"
|
||||
echo "modcache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT"
|
||||
echo "cache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
RUN_AS_USER: ${{ inputs.username }}
|
||||
GO_VERSION: ${{ steps.go-version.outputs.go-version }}
|
||||
|
@ -48,7 +50,7 @@ runs:
|
|||
|
||||
- name: "Restore Go dependencies from cache or mark for later caching"
|
||||
id: cache-deps
|
||||
uses: actions/cache@v4
|
||||
uses: https://data.forgejo.org/actions/cache@v4
|
||||
with:
|
||||
key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod') }}
|
||||
restore-keys: |
|
||||
|
|
|
@ -19,7 +19,7 @@ runs:
|
|||
set -ex
|
||||
toolchain=$(grep -oP '(?<=toolchain ).+' go.mod)
|
||||
version=$(go version | cut -d' ' -f3)
|
||||
if [ "$toolchain" != "$version" ]; then
|
||||
echo "go version mismatch: $toolchain <> $version"
|
||||
if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then
|
||||
echo "go version too low: $toolchain >= $version"
|
||||
exit 1
|
||||
fi
|
||||
|
|
41
.forgejo/workflows/build-oci-image.yml
Normal file
41
.forgejo/workflows/build-oci-image.yml
Normal file
|
@ -0,0 +1,41 @@
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'forgejo'
|
||||
tags:
|
||||
- '*-git-annex*'
|
||||
|
||||
jobs:
|
||||
build-oci-image:
|
||||
runs-on: docker
|
||||
strategy:
|
||||
matrix:
|
||||
type: ["rootful", "rootless"]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # fetch the full history so that the Forgejo version is determined properly
|
||||
- name: Determine registry and username
|
||||
id: determine-registry-and-username
|
||||
run: |
|
||||
echo "registry=${GITHUB_SERVER_URL#https://}" >> "$GITHUB_OUTPUT"
|
||||
echo "username=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Docker
|
||||
run: curl -fsSL https://get.docker.com | sh
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ steps.determine-registry-and-username.outputs.registry }}
|
||||
username: ${{ steps.determine-registry-and-username.outputs.username }}
|
||||
password: ${{ secrets.REGISTRY_TOKEN }}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ${{ (matrix.type == 'rootful' && 'Dockerfile') || (matrix.type == 'rootless' && 'Dockerfile.rootless') }}
|
||||
push: true
|
||||
tags: ${{ steps.determine-registry-and-username.outputs.registry }}/${{ github.repository }}:${{ github.ref_name }}${{ (matrix.type == 'rootful' && ' ') || (matrix.type == 'rootless' && '-rootless') }}
|
|
@ -25,7 +25,7 @@ jobs:
|
|||
if: vars.ROLE == 'forgejo-coding'
|
||||
runs-on: lxc-bookworm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||
|
||||
- id: forgejo
|
||||
uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4
|
||||
|
|
|
@ -33,7 +33,7 @@ jobs:
|
|||
# root is used for testing, allow it
|
||||
if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
@ -164,7 +164,7 @@ jobs:
|
|||
|
||||
- name: build container & release
|
||||
if: ${{ secrets.TOKEN != '' }}
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4
|
||||
with:
|
||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||
|
@ -183,7 +183,7 @@ jobs:
|
|||
|
||||
- name: build rootless container
|
||||
if: ${{ secrets.TOKEN != '' }}
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4
|
||||
with:
|
||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||
|
|
|
@ -37,11 +37,11 @@ jobs:
|
|||
container:
|
||||
image: data.forgejo.org/oci/node:20-bookworm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
show-progress: 'false'
|
||||
- uses: https://code.forgejo.org/actions/cascading-pr@v2.2.0
|
||||
- uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0
|
||||
with:
|
||||
origin-url: ${{ env.GITHUB_SERVER_URL }}
|
||||
origin-repo: ${{ github.repository }}
|
||||
|
|
|
@ -39,10 +39,10 @@ jobs:
|
|||
runs-on: lxc-bookworm
|
||||
if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != ''
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||
|
||||
- name: copy & sign
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4
|
||||
with:
|
||||
from-forgejo: ${{ vars.FORGEJO }}
|
||||
to-forgejo: ${{ vars.FORGEJO }}
|
||||
|
|
|
@ -10,7 +10,6 @@ on:
|
|||
|
||||
jobs:
|
||||
backend-checks:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
container:
|
||||
image: 'data.forgejo.org/oci/node:20-bookworm'
|
||||
|
@ -27,7 +26,6 @@ jobs:
|
|||
- run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
frontend-checks:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
container:
|
||||
image: 'data.forgejo.org/oci/node:20-bookworm'
|
||||
|
@ -46,7 +44,7 @@ jobs:
|
|||
apt-get update -qq
|
||||
apt-get -q install -qq -y zstd
|
||||
- name: "Cache frontend build for playwright testing"
|
||||
uses: actions/cache/save@v4
|
||||
uses: https://data.forgejo.org/actions/cache/save@v4
|
||||
with:
|
||||
path: ${{github.workspace}}/public/assets
|
||||
key: frontend-build-${{ github.sha }}
|
||||
|
@ -104,7 +102,7 @@ jobs:
|
|||
fetch-depth: 20
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: "Restore frontend build"
|
||||
uses: actions/cache/restore@v4
|
||||
uses: https://data.forgejo.org/actions/cache/restore@v4
|
||||
id: cache-frontend
|
||||
with:
|
||||
path: ${{github.workspace}}/public/assets
|
||||
|
@ -176,7 +174,6 @@ jobs:
|
|||
TAGS: bindata
|
||||
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
|
||||
test-mysql:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
needs: [backend-checks, frontend-checks]
|
||||
container:
|
||||
|
@ -199,15 +196,13 @@ jobs:
|
|||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
packages: git git-annex-standalone git-lfs
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-mysql-migration test-mysql'
|
||||
timeout-minutes: 120
|
||||
env:
|
||||
USE_REPO_TEST_DIR: 1
|
||||
test-pgsql:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
needs: [backend-checks, frontend-checks]
|
||||
container:
|
||||
|
@ -236,17 +231,15 @@ jobs:
|
|||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
packages: git git-annex-standalone git-lfs
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-pgsql-migration test-pgsql'
|
||||
timeout-minutes: 120
|
||||
env:
|
||||
RACE_ENABLED: true
|
||||
USE_REPO_TEST_DIR: 1
|
||||
TEST_LDAP: 1
|
||||
test-sqlite:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
needs: [backend-checks, frontend-checks]
|
||||
container:
|
||||
|
@ -258,25 +251,21 @@ jobs:
|
|||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
packages: git git-annex-standalone git-lfs
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-sqlite-migration test-sqlite'
|
||||
timeout-minutes: 120
|
||||
env:
|
||||
TAGS: sqlite sqlite_unlock_notify
|
||||
RACE_ENABLED: true
|
||||
TEST_TAGS: sqlite sqlite_unlock_notify
|
||||
USE_REPO_TEST_DIR: 1
|
||||
security-check:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
needs:
|
||||
- test-sqlite
|
||||
- test-pgsql
|
||||
- test-mysql
|
||||
- test-remote-cacher
|
||||
- test-unit
|
||||
container:
|
||||
image: 'data.forgejo.org/oci/node:20-bookworm'
|
||||
options: --tmpfs /tmp:exec,noatime
|
||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -72,6 +72,7 @@ cpu.out
|
|||
/tests/e2e/reports
|
||||
/tests/e2e/test-artifacts
|
||||
/tests/e2e/test-snapshots
|
||||
/tests/e2e/.auth
|
||||
/tests/*.ini
|
||||
/tests/**/*.git/**/*.sample
|
||||
/node_modules
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
|
||||
|
||||
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
|
||||
|
||||
ARG GOPROXY
|
||||
ENV GOPROXY=${GOPROXY:-direct}
|
||||
|
@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \
|
|||
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||
|
||||
FROM code.forgejo.org/oci/alpine:3.20
|
||||
FROM data.forgejo.org/oci/alpine:3.20
|
||||
ARG RELEASE_VERSION
|
||||
LABEL maintainer="contact@forgejo.org" \
|
||||
org.opencontainers.image.authors="Forgejo" \
|
||||
|
@ -78,6 +78,7 @@ RUN apk --no-cache add \
|
|||
sqlite \
|
||||
su-exec \
|
||||
gnupg \
|
||||
git-annex \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
RUN addgroup \
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
|
||||
|
||||
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.23-alpine3.20 as build-env
|
||||
|
||||
ARG GOPROXY
|
||||
ENV GOPROXY=${GOPROXY:-direct}
|
||||
|
@ -49,7 +49,8 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
|
|||
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||
|
||||
FROM code.forgejo.org/oci/alpine:3.20
|
||||
FROM data.forgejo.org/oci/alpine:3.20
|
||||
ARG RELEASE_VERSION
|
||||
LABEL maintainer="contact@forgejo.org" \
|
||||
org.opencontainers.image.authors="Forgejo" \
|
||||
org.opencontainers.image.url="https://forgejo.org" \
|
||||
|
@ -71,6 +72,8 @@ RUN apk --no-cache add \
|
|||
git \
|
||||
curl \
|
||||
gnupg \
|
||||
openssh-client \
|
||||
git-annex \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
RUN addgroup \
|
||||
|
|
4
Makefile
4
Makefile
|
@ -8,7 +8,7 @@ self := $(location)
|
|||
@tmpdir=`mktemp --tmpdir -d` ; \
|
||||
echo Using temporary directory $$tmpdir for test repositories ; \
|
||||
USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \
|
||||
STATUS=$$? ; rm -r "$$tmpdir" ; exit $$STATUS
|
||||
STATUS=$$? ; chmod -R +w "$$tmpdir" && rm -r "$$tmpdir" ; exit $$STATUS
|
||||
|
||||
else
|
||||
|
||||
|
@ -104,7 +104,7 @@ else
|
|||
FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY}
|
||||
else
|
||||
# drop the "g" prefix prepended by git describe to the commit hash
|
||||
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/')+${GITEA_COMPATIBILITY}
|
||||
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/2')+${GITEA_COMPATIBILITY}
|
||||
endif
|
||||
endif
|
||||
FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')
|
||||
|
|
|
@ -1,27 +1,33 @@
|
|||
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||
<style type="text/css">
|
||||
circle {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-width: 15;
|
||||
}
|
||||
path {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-width: 25;
|
||||
}
|
||||
.orange {
|
||||
stroke:#ff6600;
|
||||
}
|
||||
.red {
|
||||
stroke:#d40000;
|
||||
}
|
||||
</style>
|
||||
<g transform="translate(6,6)">
|
||||
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
|
||||
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
|
||||
<circle cx="142" cy="20" r="18" class="orange" />
|
||||
<circle cx="142" cy="88" r="18" class="red" />
|
||||
<circle cx="58" cy="180" r="18" class="red" />
|
||||
<!--
|
||||
This logo was created by Michael Hanke <mih@ngln.eu> from
|
||||
the original Forgejo logo by Caesar Schinas and the git-annex
|
||||
logo by Henrik Nyh <http://henrik.nyh.se/>, Joey Hess <id@joeyh.name>,
|
||||
John Lawrence, and Yann Büchau <nobodyinperson at posteo de>.
|
||||
|
||||
It is licensed under the Creative Commons Attribution-ShareAlike 4.0
|
||||
International (CC BY-SA 4.0) license.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="212" height="212"
|
||||
viewBox="0 0 56.092 56.092" xmlns:v="https://vecta.io/nano">
|
||||
<g transform="matrix(1.003855 0 0 1.003855 -155.52693 -24.929635)"
|
||||
fill="none">
|
||||
<g stroke-width="6.615">
|
||||
<path d="M168.804 70.908V44.979a13.229 13.229 0 0 1 13.229-13.229h5.292"
|
||||
stroke="#f60" />
|
||||
<path d="M168.804 70.908v-7.937a13.229 13.229 0 0 1 13.229-13.229h5.292"
|
||||
stroke="#d40000" />
|
||||
</g>
|
||||
<g stroke-width="3.969">
|
||||
<circle cx="191.029" cy="31.75" r="4.762" stroke="#f60" />
|
||||
<g stroke="#d40000">
|
||||
<circle cx="191.029" cy="49.742" r="4.762" />
|
||||
<circle cx="168.804" cy="74.083" r="4.762" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="#777">
|
||||
<path d="M34.648 56.182c-2.089-.269-4.238-2.244-4.538-4.561-.288-1.937.128-4.198 1.729-5.476.702-.479 1.658-1.015 2.5-.951v2.757c-1.003.112-1.975 1.252-1.954 2.296.025 1.359.626 2.607 1.933 3.014 1.446.487 3.102.348 4.44-.461 1.106-.862 1.208-2.466.63-3.687-.26-.672-.821-1.165-1.582-1.163v2.392H35.66v-5.149h6.5v1.852l-1.78.016c1.661.947 1.832 2.991 1.747 4.409.06 2.436-2.347 4.422-4.734 4.688-.864.065-1.594.068-2.743.023zm-4.644-12.011l-.014-2.702h12.185l-.001 2.715-12.17-.013zm4.645-3.651v-2.892h-4.724v-2.516h4.724v-3.245h2.826v3.245h4.702v2.516h-4.702l-.047 2.886-2.779.006z" />
|
||||
<path d="M22.23 24.801l-2.819 3.94h1.565a9.01 9.01 0 0 0 .103 1.283l2.488-.377c-.044-.296-.071-.599-.075-.906h1.556zm1.531 5.732l-2.405.724a8.9 8.9 0 0 0 .447 1.18l2.281-1.055a6.36 6.36 0 0 1-.323-.848zm.753 1.622L22.4 33.518a8.99 8.99 0 0 0 3.949 3.365l1.006-2.305a6.45 6.45 0 0 1-2.839-2.421zm3.675 2.715l-.679 2.425a8.94 8.94 0 0 0 1.18.244l.348-2.492a6.52 6.52 0 0 1-.848-.178zm21.673-10.069l-2.819 3.94h1.565c-.003.308-.03.61-.075.906l2.488.377a9.01 9.01 0 0 0 .103-1.283h1.556zm-1.523 5.732a6.36 6.36 0 0 1-.323.848l2.281 1.055c.176-.379.325-.774.447-1.18zm-.753 1.622a6.45 6.45 0 0 1-2.839 2.421l1.006 2.305a8.99 8.99 0 0 0 3.949-3.365zm-3.675 2.715a6.52 6.52 0 0 1-.848.178l.348 2.492a8.94 8.94 0 0 0 1.18-.244z"
|
||||
fill-rule="evenodd" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 677 B After Width: | Height: | Size: 2.4 KiB |
|
@ -1,27 +1,33 @@
|
|||
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||
<style type="text/css">
|
||||
circle {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-width: 15;
|
||||
}
|
||||
path {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-width: 25;
|
||||
}
|
||||
.orange {
|
||||
stroke:#ff6600;
|
||||
}
|
||||
.red {
|
||||
stroke:#d40000;
|
||||
}
|
||||
</style>
|
||||
<g transform="translate(6,6)">
|
||||
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
|
||||
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
|
||||
<circle cx="142" cy="20" r="18" class="orange" />
|
||||
<circle cx="142" cy="88" r="18" class="red" />
|
||||
<circle cx="58" cy="180" r="18" class="red" />
|
||||
<!--
|
||||
This logo was created by Michael Hanke <mih@ngln.eu> from
|
||||
the original Forgejo logo by Caesar Schinas and the git-annex
|
||||
logo by Henrik Nyh <http://henrik.nyh.se/>, Joey Hess <id@joeyh.name>,
|
||||
John Lawrence, and Yann Büchau <nobodyinperson at posteo de>.
|
||||
|
||||
It is licensed under the Creative Commons Attribution-ShareAlike 4.0
|
||||
International (CC BY-SA 4.0) license.
|
||||
-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="212" height="212"
|
||||
viewBox="0 0 56.092 56.092" xmlns:v="https://vecta.io/nano">
|
||||
<g transform="matrix(1.003855 0 0 1.003855 -155.52693 -24.929635)"
|
||||
fill="none">
|
||||
<g stroke-width="6.615">
|
||||
<path d="M168.804 70.908V44.979a13.229 13.229 0 0 1 13.229-13.229h5.292"
|
||||
stroke="#f60" />
|
||||
<path d="M168.804 70.908v-7.937a13.229 13.229 0 0 1 13.229-13.229h5.292"
|
||||
stroke="#d40000" />
|
||||
</g>
|
||||
<g stroke-width="3.969">
|
||||
<circle cx="191.029" cy="31.75" r="4.762" stroke="#f60" />
|
||||
<g stroke="#d40000">
|
||||
<circle cx="191.029" cy="49.742" r="4.762" />
|
||||
<circle cx="168.804" cy="74.083" r="4.762" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="#777">
|
||||
<path d="M34.648 56.182c-2.089-.269-4.238-2.244-4.538-4.561-.288-1.937.128-4.198 1.729-5.476.702-.479 1.658-1.015 2.5-.951v2.757c-1.003.112-1.975 1.252-1.954 2.296.025 1.359.626 2.607 1.933 3.014 1.446.487 3.102.348 4.44-.461 1.106-.862 1.208-2.466.63-3.687-.26-.672-.821-1.165-1.582-1.163v2.392H35.66v-5.149h6.5v1.852l-1.78.016c1.661.947 1.832 2.991 1.747 4.409.06 2.436-2.347 4.422-4.734 4.688-.864.065-1.594.068-2.743.023zm-4.644-12.011l-.014-2.702h12.185l-.001 2.715-12.17-.013zm4.645-3.651v-2.892h-4.724v-2.516h4.724v-3.245h2.826v3.245h4.702v2.516h-4.702l-.047 2.886-2.779.006z" />
|
||||
<path d="M22.23 24.801l-2.819 3.94h1.565a9.01 9.01 0 0 0 .103 1.283l2.488-.377c-.044-.296-.071-.599-.075-.906h1.556zm1.531 5.732l-2.405.724a8.9 8.9 0 0 0 .447 1.18l2.281-1.055a6.36 6.36 0 0 1-.323-.848zm.753 1.622L22.4 33.518a8.99 8.99 0 0 0 3.949 3.365l1.006-2.305a6.45 6.45 0 0 1-2.839-2.421zm3.675 2.715l-.679 2.425a8.94 8.94 0 0 0 1.18.244l.348-2.492a6.52 6.52 0 0 1-.848-.178zm21.673-10.069l-2.819 3.94h1.565c-.003.308-.03.61-.075.906l2.488.377a9.01 9.01 0 0 0 .103-1.283h1.556zm-1.523 5.732a6.36 6.36 0 0 1-.323.848l2.281 1.055c.176-.379.325-.774.447-1.18zm-.753 1.622a6.45 6.45 0 0 1-2.839 2.421l1.006 2.305a8.99 8.99 0 0 0 3.949-3.365zm-3.675 2.715a6.52 6.52 0 0 1-.848.178l.348 2.492a8.94 8.94 0 0 0 1.18-.244z"
|
||||
fill-rule="evenodd" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 677 B After Width: | Height: | Size: 2.4 KiB |
|
@ -59,9 +59,9 @@ func initRemoveTags() {
|
|||
oldnew := []string{}
|
||||
for _, el := range []string{
|
||||
"email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it",
|
||||
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger",
|
||||
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger", "użytkownik",
|
||||
"server", "servidor", "kiszolgáló", "serveris",
|
||||
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme",
|
||||
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme", "etykieta",
|
||||
} {
|
||||
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
|
||||
}
|
||||
|
|
76
cmd/serv.go
76
cmd/serv.go
|
@ -38,6 +38,7 @@ import (
|
|||
|
||||
const (
|
||||
lfsAuthenticateVerb = "git-lfs-authenticate"
|
||||
gitAnnexShellVerb = "git-annex-shell"
|
||||
)
|
||||
|
||||
// CmdServ represents the available serv sub-command.
|
||||
|
@ -79,6 +80,7 @@ var (
|
|||
"git-upload-archive": perm.AccessModeRead,
|
||||
"git-receive-pack": perm.AccessModeWrite,
|
||||
lfsAuthenticateVerb: perm.AccessModeNone,
|
||||
gitAnnexShellVerb: perm.AccessModeNone, // annex permissions are enforced by GIT_ANNEX_SHELL_READONLY, rather than the Gitea API
|
||||
}
|
||||
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`)
|
||||
)
|
||||
|
@ -212,6 +214,28 @@ func runServ(c *cli.Context) error {
|
|||
}
|
||||
}
|
||||
|
||||
if verb == gitAnnexShellVerb {
|
||||
if !setting.Annex.Enabled {
|
||||
return fail(ctx, "Unknown git command", "git-annex request over SSH denied, git-annex support is disabled")
|
||||
}
|
||||
|
||||
if len(words) < 3 {
|
||||
return fail(ctx, "Too few arguments", "Too few arguments in cmd: %s", cmd)
|
||||
}
|
||||
|
||||
// git-annex always puts the repo in words[2], unlike most other
|
||||
// git subcommands; and it sometimes names repos like /~/, as if
|
||||
// $HOME should get expanded while also being rooted. e.g.:
|
||||
// git-annex-shell 'configlist' '/~/user/repo'
|
||||
// git-annex-shell 'sendkey' '/user/repo 'key'
|
||||
repoPath = words[2]
|
||||
repoPath = strings.TrimPrefix(repoPath, "/")
|
||||
repoPath = strings.TrimPrefix(repoPath, "~/")
|
||||
}
|
||||
|
||||
// prevent directory traversal attacks
|
||||
repoPath = filepath.Clean("/" + repoPath)[1:]
|
||||
|
||||
rr := strings.SplitN(repoPath, "/", 2)
|
||||
if len(rr) != 2 {
|
||||
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
|
||||
|
@ -225,6 +249,18 @@ func runServ(c *cli.Context) error {
|
|||
// so that username and reponame are not affected.
|
||||
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
|
||||
|
||||
// put the sanitized repoPath back into the argument list for later
|
||||
if verb == gitAnnexShellVerb {
|
||||
// git-annex-shell demands an absolute path
|
||||
absRepoPath, err := filepath.Abs(filepath.Join(setting.RepoRootPath, repoPath))
|
||||
if err != nil {
|
||||
return fail(ctx, "Error locating repoPath", "%v", err)
|
||||
}
|
||||
words[2] = absRepoPath
|
||||
} else {
|
||||
words[1] = repoPath
|
||||
}
|
||||
|
||||
if alphaDashDotPattern.MatchString(reponame) {
|
||||
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
|
||||
}
|
||||
|
@ -303,21 +339,45 @@ func runServ(c *cli.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
var gitcmd *exec.Cmd
|
||||
gitBinPath := filepath.Dir(git.GitExecutable) // e.g. /usr/bin
|
||||
gitBinVerb := filepath.Join(gitBinPath, verb) // e.g. /usr/bin/git-upload-pack
|
||||
if _, err := os.Stat(gitBinVerb); err != nil {
|
||||
gitBinVerb, err := exec.LookPath(verb)
|
||||
if err != nil {
|
||||
// if the command "git-upload-pack" doesn't exist, try to split "git-upload-pack" to use the sub-command with git
|
||||
// ps: Windows only has "git.exe" in the bin path, so Windows always uses this way
|
||||
// ps: git-annex-shell and other extensions may not necessarily be in gitBinPath,
|
||||
// but '{gitBinPath}/git annex-shell' should be able to find them on $PATH.
|
||||
verbFields := strings.SplitN(verb, "-", 2)
|
||||
if len(verbFields) == 2 {
|
||||
// use git binary with the sub-command part: "C:\...\bin\git.exe", "upload-pack", ...
|
||||
gitcmd = exec.CommandContext(ctx, git.GitExecutable, verbFields[1], repoPath)
|
||||
gitBinVerb = git.GitExecutable
|
||||
words = append([]string{verbFields[1]}, words...)
|
||||
}
|
||||
}
|
||||
if gitcmd == nil {
|
||||
// by default, use the verb (it has been checked above by allowedCommands)
|
||||
gitcmd = exec.CommandContext(ctx, gitBinVerb, repoPath)
|
||||
|
||||
// by default, use the verb (it has been checked above by allowedCommands)
|
||||
gitcmd := exec.CommandContext(ctx, gitBinVerb, words[1:]...)
|
||||
|
||||
if verb == gitAnnexShellVerb {
|
||||
// This doesn't get its own isolated section like LFS does, because LFS
|
||||
// is handled by internal Gitea routines, but git-annex has to be shelled out
|
||||
// to like other git subcommands, so we need to build up gitcmd.
|
||||
|
||||
// TODO: does this work on Windows?
|
||||
gitcmd.Env = append(gitcmd.Env,
|
||||
// "If set, disallows running git-shell to handle unknown commands."
|
||||
// - git-annex-shell(1)
|
||||
"GIT_ANNEX_SHELL_LIMITED=True",
|
||||
// "If set, git-annex-shell will refuse to run commands
|
||||
// that do not operate on the specified directory."
|
||||
// - git-annex-shell(1)
|
||||
fmt.Sprintf("GIT_ANNEX_SHELL_DIRECTORY=%s", words[2]),
|
||||
)
|
||||
if results.UserMode < perm.AccessModeWrite {
|
||||
// "If set, disallows any action that could modify the git-annex repository."
|
||||
// - git-annex-shell(1)
|
||||
// We set this when the backend API has told us that we don't have write permission to this repo.
|
||||
log.Debug("Setting GIT_ANNEX_SHELL_READONLY=True")
|
||||
gitcmd.Env = append(gitcmd.Env, "GIT_ANNEX_SHELL_READONLY=True")
|
||||
}
|
||||
}
|
||||
|
||||
process.SetSysProcAttribute(gitcmd)
|
||||
|
|
11
cmd/web.go
11
cmd/web.go
|
@ -9,6 +9,7 @@ import (
|
|||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
@ -247,6 +248,12 @@ func runWeb(ctx *cli.Context) error {
|
|||
createPIDFile(ctx.String("pid"))
|
||||
}
|
||||
|
||||
if setting.Annex.Enabled {
|
||||
if _, err := exec.LookPath("git-annex"); err != nil {
|
||||
log.Fatal("You have enabled git-annex support but git-annex is not installed. Please make sure that Forgejo's PATH contains the git-annex executable.")
|
||||
}
|
||||
}
|
||||
|
||||
if !setting.InstallLock {
|
||||
if err := serveInstall(ctx); err != nil {
|
||||
return err
|
||||
|
@ -311,6 +318,10 @@ func listen(m http.Handler, handleRedirector bool) error {
|
|||
log.Info("LFS server enabled")
|
||||
}
|
||||
|
||||
if setting.Annex.Enabled {
|
||||
log.Info("git-annex enabled")
|
||||
}
|
||||
|
||||
var err error
|
||||
switch setting.Protocol {
|
||||
case setting.HTTP:
|
||||
|
|
|
@ -2678,6 +2678,17 @@ LEVEL = Info
|
|||
;; Limit the number of concurrent upload/download operations within a batch
|
||||
;BATCH_OPERATION_CONCURRENCY = 8
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;[annex]
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;
|
||||
;; Whether git-annex is enabled; defaults to false
|
||||
;ENABLED = false
|
||||
;; Whether to disable p2phttp support; default is the same as repository.DISABLE_HTTP_GIT
|
||||
;DISABLE_P2PHTTP = false
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; settings for packages, will override storage setting
|
||||
|
|
20
go.mod
20
go.mod
|
@ -1,8 +1,8 @@
|
|||
module code.gitea.io/gitea
|
||||
|
||||
go 1.23
|
||||
go 1.23.0
|
||||
|
||||
toolchain go1.23.4
|
||||
toolchain go1.23.6
|
||||
|
||||
require (
|
||||
code.forgejo.org/f3/gof3/v3 v3.10.2
|
||||
|
@ -53,7 +53,7 @@ require (
|
|||
github.com/gobwas/glob v0.2.3
|
||||
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
|
||||
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||
github.com/google/go-github/v64 v64.0.0
|
||||
github.com/google/pprof v0.0.0-20241017200806-017d972448fc
|
||||
|
@ -85,7 +85,7 @@ require (
|
|||
github.com/opencontainers/image-spec v1.1.0
|
||||
github.com/pquerna/otp v1.4.0
|
||||
github.com/prometheus/client_golang v1.20.5
|
||||
github.com/redis/go-redis/v9 v9.7.0
|
||||
github.com/redis/go-redis/v9 v9.7.3
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
|
||||
github.com/sassoftware/go-rpmutils v0.4.0
|
||||
|
@ -101,13 +101,13 @@ require (
|
|||
github.com/yuin/goldmark v1.7.8
|
||||
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
|
||||
go.uber.org/mock v0.4.0
|
||||
golang.org/x/crypto v0.31.0
|
||||
golang.org/x/crypto v0.35.0
|
||||
golang.org/x/image v0.23.0
|
||||
golang.org/x/net v0.33.0
|
||||
golang.org/x/oauth2 v0.23.0
|
||||
golang.org/x/sync v0.10.0
|
||||
golang.org/x/sys v0.28.0
|
||||
golang.org/x/text v0.21.0
|
||||
golang.org/x/net v0.36.0
|
||||
golang.org/x/oauth2 v0.27.0
|
||||
golang.org/x/sync v0.11.0
|
||||
golang.org/x/sys v0.30.0
|
||||
golang.org/x/text v0.22.0
|
||||
google.golang.org/grpc v1.69.2
|
||||
google.golang.org/protobuf v1.36.1
|
||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||
|
|
36
go.sum
36
go.sum
|
@ -981,8 +981,8 @@ github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JP
|
|||
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
|
||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
|
||||
|
@ -1342,8 +1342,8 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G
|
|||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
|
||||
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
||||
github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
|
||||
github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||
github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw=
|
||||
|
@ -1505,8 +1505,8 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y
|
|||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
|
||||
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
|
||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
|
@ -1631,8 +1631,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
|||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
|
||||
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
@ -1662,8 +1662,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
|
|||
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
|
||||
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
|
||||
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
|
||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
|
||||
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -1680,8 +1680,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
@ -1771,8 +1771,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||
|
@ -1784,8 +1784,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
|||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
|
||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
@ -1804,8 +1804,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
|||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
|
|
|
@ -282,27 +282,22 @@ func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error {
|
|||
}
|
||||
|
||||
// DeleteRunner deletes a runner by given ID.
|
||||
func DeleteRunner(ctx context.Context, id int64) error {
|
||||
runner, err := GetRunnerByID(ctx, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
func DeleteRunner(ctx context.Context, r *ActionRunner) error {
|
||||
// Replace the UUID, which was either based on the secret's first 16 bytes or an UUIDv4,
|
||||
// with a sequence of 8 0xff bytes followed by the little-endian version of the record's
|
||||
// identifier. This will prevent the deleted record's identifier from colliding with any
|
||||
// new record.
|
||||
b := make([]byte, 8)
|
||||
binary.LittleEndian.PutUint64(b, uint64(id))
|
||||
runner.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x",
|
||||
binary.LittleEndian.PutUint64(b, uint64(r.ID))
|
||||
r.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x",
|
||||
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7])
|
||||
|
||||
err = UpdateRunner(ctx, runner, "UUID")
|
||||
err := UpdateRunner(ctx, r, "UUID")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = db.DeleteByID[ActionRunner](ctx, id)
|
||||
_, err = db.DeleteByID[ActionRunner](ctx, r.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ func TestDeleteRunner(t *testing.T) {
|
|||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
before := unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: recordID})
|
||||
|
||||
err := DeleteRunner(db.DefaultContext, recordID)
|
||||
err := DeleteRunner(db.DefaultContext, &ActionRunner{ID: recordID})
|
||||
require.NoError(t, err)
|
||||
|
||||
var after ActionRunner
|
||||
|
|
|
@ -86,7 +86,7 @@ func FindVariables(ctx context.Context, opts FindVariablesOpts) ([]*ActionVariab
|
|||
}
|
||||
|
||||
func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) {
|
||||
count, err := db.GetEngine(ctx).ID(variable.ID).Cols("name", "data").
|
||||
count, err := db.GetEngine(ctx).ID(variable.ID).Where("owner_id = ? AND repo_id = ?", variable.OwnerID, variable.RepoID).Cols("name", "data").
|
||||
Update(&ActionVariable{
|
||||
Name: variable.Name,
|
||||
Data: variable.Data,
|
||||
|
@ -94,11 +94,9 @@ func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error)
|
|||
return count != 0, err
|
||||
}
|
||||
|
||||
func DeleteVariable(ctx context.Context, id int64) error {
|
||||
if _, err := db.DeleteByID[ActionVariable](ctx, id); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
func DeleteVariable(ctx context.Context, variableID, ownerID, repoID int64) (bool, error) {
|
||||
count, err := db.GetEngine(ctx).Table("action_variable").Where("id = ? AND owner_id = ? AND repo_id = ?", variableID, ownerID, repoID).Delete()
|
||||
return count != 0, err
|
||||
}
|
||||
|
||||
func GetVariablesOfRun(ctx context.Context, run *ActionRun) (map[string]string, error) {
|
||||
|
|
|
@ -219,8 +219,13 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) {
|
|||
return "", 0, fmt.Errorf("ParsePublicKey: %w", err)
|
||||
}
|
||||
|
||||
pkeyType := pkey.Type()
|
||||
if certPkey, ok := pkey.(*ssh.Certificate); ok {
|
||||
pkeyType = certPkey.Key.Type()
|
||||
}
|
||||
|
||||
// The ssh library can parse the key, so next we find out what key exactly we have.
|
||||
switch pkey.Type() {
|
||||
switch pkeyType {
|
||||
case ssh.KeyAlgoDSA:
|
||||
rawPub := struct {
|
||||
Name string
|
||||
|
|
|
@ -35,6 +35,7 @@ func Test_SSHParsePublicKey(t *testing.T) {
|
|||
{"ecdsa-384", false, "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"},
|
||||
{"ecdsa-sk", true, "ecdsa-sk", 256, "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBGXEEzWmm1dxb+57RoK5KVCL0w2eNv9cqJX2AGGVlkFsVDhOXHzsadS3LTK4VlEbbrDMJdoti9yM8vclA8IeRacAAAAEc3NoOg== nocomment"},
|
||||
{"ed25519-sk", true, "ed25519-sk", 256, "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIE7kM1R02+4ertDKGKEDcKG0s+2vyDDcIvceJ0Gqv5f1AAAABHNzaDo= nocomment"},
|
||||
{"ed25519-cert-v01", true, "ed25519", 256, "ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIAlIAPlEj0mYQzQo8Ks0Nm/Ct8ceNkyJSf4DLuF5l7+5AAAAIEuWAoaBo2tT29/oMNnoDfdAPRCIdM2RGapKUhY4nDfLRgPQwfnRoc0AAAABAAAAcHZhdWx0LW9pZGMtNmRhYjdiZDgtNDg5YS00MDFkLTg3ZmItNjdjNTlhMDZkZDkxLTNjNTk2M2YyMGRmMDM3MDkyMzc1YmNiYmNiNzkxY2EyZWIxM2I0NGZhMzc2NTcwMWI0MjMwODU0MWFmNjhkNTgAAAALAAAAB2Zvcmdlam8AAAAAZ6/RUQAAAABn115vAAAAAAAAAAAAAAAAAAACFwAAAAdzc2gtcnNhAAAAAwEAAQAAAgEAySnM/TvD117GyKgOgMatDB2t+fCHORFaWVmH5SaadAzNJ2DfDAauRSLfnim1xdgAOMTzsPEEHH47zyYMjE85o2AiJxrfUBMw3O/7AbNc6+HyLr/txH4+vD9tWQknKnpVWM+3Z9wiHDcOdKRoXCmFZKJH1vxs16GNWjwbrfNiimv7Oi0fadgvTDKX603gpLTuVDXqs9eQFLCONptei86JYBAJqaHvg51k8YUCKt9WFqKAj7BJUWmrDvhv5VFMOsnZieJjqxkoxnpsQNlXfPzxK0vIpJofbYfWwscv/g9WZypHwO1ZR2PqzKm99YrSdr8w5256l0f44vsF0NSP0N7bDQEfYYnRGj8zWTYCBFD+uYF7AxIeaRUpZoTQO8MvCHOLMIDinNgEeCUvNA2v9zHl4BGq+PQjzUKAgJiKj0MZeiCDAmQ22g83ggQlB6BOrBb1fNa/S1cmTbGHQ2oAN358aqkmHVCBhPOyA2Rf65D2M2vzDlUdOsNDUIWAHk7GbwSNGDgcYfTWqtR5fTzp2MJovMh1dDUDXjOvojbhzjJtSy9+rzUYIv18aXdOitzVBgPMWdeVCZFZv4OKF+5MiqxQvedUvfiSjsdxZWLxyT1CJ88G3MzxNMS/Djm86T8h/Oa55bdvFtqpsLfvpIqq0pnXq1V/vF2j1MWwRB5z5Xh/HtEAAAIUAAAADHJzYS1zaGEyLTI1NgAAAgB2I2gzqemQl8/ETxtakALlm/2BpUcbhADcFWuoH6BCPnWHuTSwf3OayM6KXv1PQfL3YFRoi9Afrp8kVFL6DePsmKH+0BUEMz71sZ7v1ty7pwfzibItGnpTbQXhzbEiNYAFoz77rl7oaXF7pV6JNZhj3DVAB5gVA2oN5KRNVxijz+6uyuFJEw1HIl1C7GworvGwZcN7BThTEh3i72/Vntejy9Z8uGVjSFjS0rjRo2oXK1LKN0rVt66p3TmCWHouLkVnOTk0qrhLGlL2HVyo24OYHbkAAObD9b6aMDYlmluk6NsaiTKsSTsvMrbIbjtFQlh7nNyoPhZ0VMwaT1l10pDQ5uxWWZjKGIkz4xM1ZfpBszjJNPo+ivYQnTSjj9LwkbLAT9a/5LawSj80TGcLEMO+0eyPdJsP0wYmOVRFAZeRiBgwb3HrzcF6Wqr8icj1EjYkKSy9YFHGTnFBGknpdh3HGwghRXrCUwAnSM76db9pv4/qowT8LthtJ3dY5Epe0OJ1Tqm+q8bkGH4gB+7uqLSqM5pIHSKLp7lfHQBt1J6xa7H2saiweaWjU+QGTgQ2Lg+uUC5DXJrmm60CeFJ4BoGhUenDlgijbQpjH/l6330PbwefgjWtUK/pqaEA4lCoPyvJ+eF2DbYfPiAIBAFQnhVJJae4AH+XoCt29nb2j30ztg== nocomment"},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
|
23
models/fixtures/PrivateIssueProjects/project.yml
Normal file
23
models/fixtures/PrivateIssueProjects/project.yml
Normal file
|
@ -0,0 +1,23 @@
|
|||
-
|
||||
id: 1001
|
||||
title: Org project that contains private and public issues
|
||||
owner_id: 3
|
||||
repo_id: 0
|
||||
is_closed: false
|
||||
creator_id: 2
|
||||
board_type: 1
|
||||
type: 3
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
||||
|
||||
-
|
||||
id: 1002
|
||||
title: User project that contains private and public issues
|
||||
owner_id: 2
|
||||
repo_id: 0
|
||||
is_closed: false
|
||||
creator_id: 2
|
||||
board_type: 1
|
||||
type: 1
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
17
models/fixtures/PrivateIssueProjects/project_board.yml
Normal file
17
models/fixtures/PrivateIssueProjects/project_board.yml
Normal file
|
@ -0,0 +1,17 @@
|
|||
-
|
||||
id: 1001
|
||||
project_id: 1001
|
||||
title: Triage
|
||||
creator_id: 2
|
||||
default: true
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
||||
|
||||
-
|
||||
id: 1002
|
||||
project_id: 1002
|
||||
title: Triage
|
||||
creator_id: 2
|
||||
default: true
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
23
models/fixtures/PrivateIssueProjects/project_issue.yml
Normal file
23
models/fixtures/PrivateIssueProjects/project_issue.yml
Normal file
|
@ -0,0 +1,23 @@
|
|||
-
|
||||
id: 1001
|
||||
issue_id: 6
|
||||
project_id: 1001
|
||||
project_board_id: 1001
|
||||
|
||||
-
|
||||
id: 1002
|
||||
issue_id: 7
|
||||
project_id: 1002
|
||||
project_board_id: 1002
|
||||
|
||||
-
|
||||
id: 1003
|
||||
issue_id: 16
|
||||
project_id: 1001
|
||||
project_board_id: 1001
|
||||
|
||||
-
|
||||
id: 1004
|
||||
issue_id: 1
|
||||
project_id: 1002
|
||||
project_board_id: 1002
|
5
models/fixtures/TestPrivateRepoProjects/access.yml
Normal file
5
models/fixtures/TestPrivateRepoProjects/access.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
-
|
||||
id: 1001
|
||||
user_id: 29
|
||||
repo_id: 3
|
||||
mode: 1
|
11
models/fixtures/TestPrivateRepoProjects/project.yml
Normal file
11
models/fixtures/TestPrivateRepoProjects/project.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
-
|
||||
id: 1001
|
||||
title: Org project that contains private issues
|
||||
owner_id: 3
|
||||
repo_id: 0
|
||||
is_closed: false
|
||||
creator_id: 2
|
||||
board_type: 1
|
||||
type: 3
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
|
@ -0,0 +1,8 @@
|
|||
-
|
||||
id: 1001
|
||||
project_id: 1001
|
||||
title: Triage
|
||||
creator_id: 2
|
||||
default: true
|
||||
created_unix: 1738000000
|
||||
updated_unix: 1738000000
|
11
models/fixtures/TestPrivateRepoProjects/project_issue.yml
Normal file
11
models/fixtures/TestPrivateRepoProjects/project_issue.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
-
|
||||
id: 1001
|
||||
issue_id: 6
|
||||
project_id: 1001
|
||||
project_board_id: 1001
|
||||
|
||||
-
|
||||
id: 1002
|
||||
issue_id: 15
|
||||
project_id: 1001
|
||||
project_board_id: 1001
|
|
@ -64,6 +64,7 @@
|
|||
base_branch: branch2
|
||||
merge_base: 985f0301dba5e7b34be866819cd15ad3d8f508ee
|
||||
has_merged: false
|
||||
allow_maintainer_edit: true
|
||||
|
||||
-
|
||||
id: 6
|
||||
|
|
|
@ -1,42 +1,49 @@
|
|||
-
|
||||
id: 1
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 1
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 2
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 2
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 3
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 3
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 4
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 4
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 5
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 5
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 6
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 6
|
||||
access_mode: 4
|
||||
|
||||
-
|
||||
id: 7
|
||||
team_id: 1
|
||||
org_id: 3
|
||||
type: 7
|
||||
access_mode: 4
|
||||
|
||||
|
|
|
@ -7,9 +7,11 @@ import (
|
|||
"context"
|
||||
"crypto/md5"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/models/auth"
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/secret"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
|
||||
|
@ -57,19 +59,38 @@ func MigrateTwoFactorToKeying(x *xorm.Engine) error {
|
|||
|
||||
oldEncryptionKey := md5.Sum([]byte(setting.SecretKey))
|
||||
|
||||
return db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error {
|
||||
messages := make([]string, 0, 100)
|
||||
ids := make([]int64, 0, 100)
|
||||
|
||||
err = db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error {
|
||||
decodedStoredSecret, err := base64.StdEncoding.DecodeString(string(bean.Secret))
|
||||
if err != nil {
|
||||
return err
|
||||
messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: base64.StdEncoding.DecodeString: %v", bean.ID, bean.UID, err))
|
||||
ids = append(ids, bean.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
secretBytes, err := secret.AesDecrypt(oldEncryptionKey[:], decodedStoredSecret)
|
||||
if err != nil {
|
||||
return err
|
||||
messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: secret.AesDecrypt: %v", bean.ID, bean.UID, err))
|
||||
ids = append(ids, bean.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
bean.SetSecret(string(secretBytes))
|
||||
_, err = db.GetEngine(ctx).Cols("secret").ID(bean.ID).Update(bean)
|
||||
return err
|
||||
})
|
||||
if err == nil {
|
||||
if len(ids) > 0 {
|
||||
log.Error("Forgejo migration[25]: The following TOTP secrets were found to be corrupted and removed from the database. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required. See https://codeberg.org/forgejo/forgejo/issues/6637 for more context on the various causes for such a corruption.")
|
||||
for _, message := range messages {
|
||||
log.Error("Forgejo migration[25]: %s", message)
|
||||
}
|
||||
|
||||
_, err = db.GetEngine(context.Background()).In("id", ids).NoAutoCondition().NoAutoTime().Delete(&auth.TwoFactor{})
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -36,10 +36,14 @@ func Test_MigrateTwoFactorToKeying(t *testing.T) {
|
|||
|
||||
cnt, err := x.Table("two_factor").Count()
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, cnt)
|
||||
assert.EqualValues(t, 2, cnt)
|
||||
|
||||
require.NoError(t, MigrateTwoFactorToKeying(x))
|
||||
|
||||
cnt, err = x.Table("two_factor").Count()
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, cnt)
|
||||
|
||||
var twofactor auth.TwoFactor
|
||||
_, err = x.Table("two_factor").ID(1).Get(&twofactor)
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -7,8 +7,10 @@ import (
|
|||
"context"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
org_model "code.gitea.io/gitea/models/organization"
|
||||
project_model "code.gitea.io/gitea/models/project"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/optional"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
)
|
||||
|
||||
|
@ -48,22 +50,28 @@ func (issue *Issue) ProjectColumnID(ctx context.Context) int64 {
|
|||
}
|
||||
|
||||
// LoadIssuesFromColumn load issues assigned to this column
|
||||
func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueList, error) {
|
||||
issueList, err := Issues(ctx, &IssuesOptions{
|
||||
func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (IssueList, error) {
|
||||
issueOpts := &IssuesOptions{
|
||||
ProjectColumnID: b.ID,
|
||||
ProjectID: b.ProjectID,
|
||||
SortType: "project-column-sorting",
|
||||
})
|
||||
IsClosed: isClosed,
|
||||
AllPublic: true,
|
||||
}
|
||||
if doer != nil {
|
||||
issueOpts.User = doer
|
||||
issueOpts.Org = org
|
||||
}
|
||||
|
||||
issueList, err := Issues(ctx, issueOpts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if b.Default {
|
||||
issues, err := Issues(ctx, &IssuesOptions{
|
||||
ProjectColumnID: db.NoConditionID,
|
||||
ProjectID: b.ProjectID,
|
||||
SortType: "project-column-sorting",
|
||||
})
|
||||
issueOpts.ProjectColumnID = db.NoConditionID
|
||||
|
||||
issues, err := Issues(ctx, issueOpts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -78,10 +86,10 @@ func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueLi
|
|||
}
|
||||
|
||||
// LoadIssuesFromColumnList load issues assigned to the columns
|
||||
func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList) (map[int64]IssueList, error) {
|
||||
func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]IssueList, error) {
|
||||
issuesMap := make(map[int64]IssueList, len(bs))
|
||||
for i := range bs {
|
||||
il, err := LoadIssuesFromColumn(ctx, bs[i])
|
||||
il, err := LoadIssuesFromColumn(ctx, bs[i], doer, org, isClosed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -160,3 +168,36 @@ func IssueAssignOrRemoveProject(ctx context.Context, issue *Issue, doer *user_mo
|
|||
})
|
||||
})
|
||||
}
|
||||
|
||||
// NumIssuesInProjects returns the amount of issues assigned to one of the project
|
||||
// in the list which the doer can access.
|
||||
func NumIssuesInProjects(ctx context.Context, pl []*project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]int, error) {
|
||||
numMap := make(map[int64]int, len(pl))
|
||||
for _, p := range pl {
|
||||
num, err := NumIssuesInProject(ctx, p, doer, org, isClosed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
numMap[p.ID] = num
|
||||
}
|
||||
|
||||
return numMap, nil
|
||||
}
|
||||
|
||||
// NumIssuesInProject returns the amount of issues assigned to the project which
|
||||
// the doer can access.
|
||||
func NumIssuesInProject(ctx context.Context, p *project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (int, error) {
|
||||
numIssuesInProject := int(0)
|
||||
bs, err := p.GetColumns(ctx)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
im, err := LoadIssuesFromColumnList(ctx, bs, doer, org, isClosed)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
for _, il := range im {
|
||||
numIssuesInProject += len(il)
|
||||
}
|
||||
return numIssuesInProject, nil
|
||||
}
|
||||
|
|
173
models/issues/issue_project_test.go
Normal file
173
models/issues/issue_project_test.go
Normal file
|
@ -0,0 +1,173 @@
|
|||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package issues_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/models/issues"
|
||||
"code.gitea.io/gitea/models/organization"
|
||||
"code.gitea.io/gitea/models/project"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/optional"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPrivateIssueProjects(t *testing.T) {
|
||||
defer tests.AddFixtures("models/fixtures/PrivateIssueProjects/")()
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
t.Run("Organization project", func(t *testing.T) {
|
||||
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
|
||||
orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID})
|
||||
column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID})
|
||||
|
||||
t.Run("Authenticated user", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 2)
|
||||
assert.EqualValues(t, 16, issueList[0].ID)
|
||||
assert.EqualValues(t, 6, issueList[1].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
})
|
||||
|
||||
t.Run("Anonymous user", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 1)
|
||||
assert.EqualValues(t, 16, issueList[0].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("User project", func(t *testing.T) {
|
||||
userProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1002, OwnerID: user2.ID})
|
||||
column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1002, ProjectID: userProject.ID})
|
||||
|
||||
t.Run("Authenticated user", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, nil, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 2)
|
||||
assert.EqualValues(t, 7, issueList[0].ID)
|
||||
assert.EqualValues(t, 1, issueList[1].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
})
|
||||
|
||||
t.Run("Anonymous user", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, nil, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 1)
|
||||
assert.EqualValues(t, 1, issueList[0].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestPrivateRepoProjects(t *testing.T) {
|
||||
defer tests.AddFixtures("models/fixtures/TestPrivateRepoProjects/")()
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
|
||||
orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID})
|
||||
column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID})
|
||||
|
||||
t.Run("Partial access", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
|
||||
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user29, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 1)
|
||||
assert.EqualValues(t, 6, issueList[0].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, issuesNum)
|
||||
})
|
||||
|
||||
t.Run("Full access", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
|
||||
issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, issueList, 2)
|
||||
assert.EqualValues(t, 15, issueList[0].ID)
|
||||
assert.EqualValues(t, 6, issueList[1].ID)
|
||||
|
||||
issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]())
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 0, issuesNum)
|
||||
|
||||
issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, issuesNum)
|
||||
})
|
||||
}
|
|
@ -49,9 +49,13 @@ type IssuesOptions struct { //nolint
|
|||
// prioritize issues from this repo
|
||||
PriorityRepoID int64
|
||||
IsArchived optional.Option[bool]
|
||||
Org *organization.Organization // issues permission scope
|
||||
Team *organization.Team // issues permission scope
|
||||
User *user_model.User // issues permission scope
|
||||
|
||||
// If combined with AllPublic, then private as well as public issues
|
||||
// that matches the criteria will be returned, if AllPublic is false
|
||||
// only the private issues will be returned.
|
||||
Org *organization.Organization // issues permission scope
|
||||
Team *organization.Team // issues permission scope
|
||||
User *user_model.User // issues permission scope
|
||||
}
|
||||
|
||||
// applySorts sort an issues-related session based on the provided
|
||||
|
@ -196,7 +200,8 @@ func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) {
|
|||
} else if len(opts.RepoIDs) > 1 {
|
||||
opts.RepoCond = builder.In("issue.repo_id", opts.RepoIDs)
|
||||
}
|
||||
if opts.AllPublic {
|
||||
// If permission scoping is set, then we set this condition at a later stage.
|
||||
if opts.AllPublic && opts.User == nil {
|
||||
if opts.RepoCond == nil {
|
||||
opts.RepoCond = builder.NewCond()
|
||||
}
|
||||
|
@ -268,7 +273,14 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) {
|
|||
applyLabelsCondition(sess, opts)
|
||||
|
||||
if opts.User != nil {
|
||||
sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value()))
|
||||
cond := issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value())
|
||||
// If AllPublic was set, then also consider all issues in public
|
||||
// repositories in addition to the private repositories the user has access
|
||||
// to.
|
||||
if opts.AllPublic {
|
||||
cond = cond.Or(builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"is_private": false})))
|
||||
}
|
||||
sess.And(cond)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -329,6 +341,9 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati
|
|||
builder.Or(
|
||||
repo_model.UserOrgUnitRepoCond(repoIDstr, userID, org.ID, unitType), // team member repos
|
||||
repo_model.UserOrgPublicUnitRepoCond(userID, org.ID), // user org public non-member repos, TODO: check repo has issues
|
||||
builder.And(
|
||||
builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"owner_id": org.ID})),
|
||||
repo_model.UserAccessRepoCond(repoIDstr, userID)), // user can access org repo in a unit independent way
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -7,3 +7,12 @@
|
|||
last_used_passcode:
|
||||
created_unix: 1564253724
|
||||
updated_unix: 1564253724
|
||||
-
|
||||
id: 2
|
||||
uid: 23
|
||||
secret: badbad
|
||||
scratch_salt: badbad
|
||||
scratch_hash: badbad
|
||||
last_used_passcode:
|
||||
created_unix: 1564253724
|
||||
updated_unix: 1564253724
|
||||
|
|
|
@ -1,23 +1,27 @@
|
|||
// Copyright 2024 The Forgejo Authors.
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright 2025 The Forgejo Authors.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package v1_23 //nolint
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/models/migrations/base"
|
||||
|
||||
"xorm.io/xorm"
|
||||
"xorm.io/xorm/schemas"
|
||||
)
|
||||
|
||||
func GiteaLastDrop(x *xorm.Engine) error {
|
||||
tables, err := x.DBMetas()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
|
||||
for _, drop := range []struct {
|
||||
table string
|
||||
field string
|
||||
table string
|
||||
column string
|
||||
}{
|
||||
{"badge", "slug"},
|
||||
{"oauth2_application", "skip_secondary_authorization"},
|
||||
|
@ -29,10 +33,25 @@ func GiteaLastDrop(x *xorm.Engine) error {
|
|||
{"protected_branch", "force_push_allowlist_team_i_ds"},
|
||||
{"protected_branch", "force_push_allowlist_deploy_keys"},
|
||||
} {
|
||||
if _, err := sess.Exec(fmt.Sprintf("SELECT `%s` FROM `%s` WHERE 0 = 1", drop.field, drop.table)); err != nil {
|
||||
var table *schemas.Table
|
||||
found := false
|
||||
|
||||
for _, table = range tables {
|
||||
if table.Name == drop.table {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
continue
|
||||
}
|
||||
if err := base.DropTableColumns(sess, drop.table, drop.field); err != nil {
|
||||
|
||||
if table.GetColumn(drop.column) == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := base.DropTableColumns(sess, drop.table, drop.column); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
41
models/migrations/v1_23/v303_test.go
Normal file
41
models/migrations/v1_23/v303_test.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2025 The Forgejo Authors.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package v1_23 //nolint
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
migration_tests "code.gitea.io/gitea/models/migrations/test"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"xorm.io/xorm/schemas"
|
||||
)
|
||||
|
||||
func Test_GiteaLastDrop(t *testing.T) {
|
||||
type Badge struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
Slug string
|
||||
}
|
||||
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Badge))
|
||||
defer deferable()
|
||||
if x == nil || t.Failed() {
|
||||
return
|
||||
}
|
||||
|
||||
getColumn := func() *schemas.Column {
|
||||
tables, err := x.DBMetas()
|
||||
require.NoError(t, err)
|
||||
require.Len(t, tables, 1)
|
||||
table := tables[0]
|
||||
require.Equal(t, "badge", table.Name)
|
||||
return table.GetColumn("slug")
|
||||
}
|
||||
|
||||
require.NotNil(t, getColumn(), "slug column exists")
|
||||
require.NoError(t, GiteaLastDrop(x))
|
||||
require.Nil(t, getColumn(), "slug column was deleted")
|
||||
// idempotent
|
||||
require.NoError(t, GiteaLastDrop(x))
|
||||
}
|
|
@ -57,20 +57,6 @@ func (Column) TableName() string {
|
|||
return "project_board" // TODO: the legacy table name should be project_column
|
||||
}
|
||||
|
||||
// NumIssues return counter of all issues assigned to the column
|
||||
func (c *Column) NumIssues(ctx context.Context) int {
|
||||
total, err := db.GetEngine(ctx).Table("project_issue").
|
||||
Where("project_id=?", c.ProjectID).
|
||||
And("project_board_id=?", c.ID).
|
||||
GroupBy("issue_id").
|
||||
Cols("issue_id").
|
||||
Count()
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
return int(total)
|
||||
}
|
||||
|
||||
func (c *Column) GetIssues(ctx context.Context) ([]*ProjectIssue, error) {
|
||||
issues := make([]*ProjectIssue, 0, 5)
|
||||
if err := db.GetEngine(ctx).Where("project_id=?", c.ProjectID).
|
||||
|
|
|
@ -34,20 +34,6 @@ func deleteProjectIssuesByProjectID(ctx context.Context, projectID int64) error
|
|||
return err
|
||||
}
|
||||
|
||||
// NumIssues return counter of all issues assigned to a project
|
||||
func (p *Project) NumIssues(ctx context.Context) int {
|
||||
c, err := db.GetEngine(ctx).Table("project_issue").
|
||||
Where("project_id=?", p.ID).
|
||||
GroupBy("issue_id").
|
||||
Cols("issue_id").
|
||||
Count()
|
||||
if err != nil {
|
||||
log.Error("NumIssues: %v", err)
|
||||
return 0
|
||||
}
|
||||
return int(c)
|
||||
}
|
||||
|
||||
// NumClosedIssues return counter of closed issues assigned to a project
|
||||
func (p *Project) NumClosedIssues(ctx context.Context) int {
|
||||
c, err := db.GetEngine(ctx).Table("project_issue").
|
||||
|
|
|
@ -166,9 +166,9 @@ func GetReviewers(ctx context.Context, repo *Repository, doerID, posterID int64)
|
|||
// If isShowFullName is set to true, also include full name prefix search
|
||||
func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string, isShowFullName bool) ([]*user_model.User, error) {
|
||||
users := make([]*user_model.User, 0, 30)
|
||||
var prefixCond builder.Cond = builder.Like{"name", search + "%"}
|
||||
prefixCond := db.BuildCaseInsensitiveLike("name", search+"%")
|
||||
if isShowFullName {
|
||||
prefixCond = prefixCond.Or(builder.Like{"full_name", "%" + search + "%"})
|
||||
prefixCond = db.BuildCaseInsensitiveLike("full_name", "%"+search+"%")
|
||||
}
|
||||
|
||||
cond := builder.In("`user`.id",
|
||||
|
|
|
@ -126,17 +126,15 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess
|
|||
return e.Where(cond)
|
||||
}
|
||||
|
||||
// 2fa filter uses LEFT JOIN to check whether a user has a 2fa record
|
||||
// While using LEFT JOIN, sometimes the performance might not be good, but it won't be a problem now, such SQL is seldom executed.
|
||||
// There are some possible methods to refactor this SQL in future when we really need to optimize the performance (but not now):
|
||||
// (1) add a column in user table (2) add a setting value in user_setting table (3) use search engines (bleve/elasticsearch)
|
||||
// Check if the user has two factor enabled, which is TOTP or Webauthn.
|
||||
if opts.IsTwoFactorEnabled.Value() {
|
||||
cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL"))
|
||||
cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL OR webauthn_credential.user_id IS NOT NULL"))
|
||||
} else {
|
||||
cond = cond.And(builder.Expr("two_factor.uid IS NULL"))
|
||||
cond = cond.And(builder.Expr("two_factor.uid IS NULL AND webauthn_credential.user_id IS NULL"))
|
||||
}
|
||||
|
||||
return e.Join("LEFT OUTER", "two_factor", "two_factor.uid = `user`.id").
|
||||
Join("LEFT OUTER", "webauthn_credential", "webauthn_credential.user_id = `user`.id").
|
||||
Where(cond)
|
||||
}
|
||||
|
||||
|
|
|
@ -842,48 +842,46 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 {
|
|||
|
||||
// VerifyUserActiveCode verifies that the code is valid for the given purpose for this user.
|
||||
// If delete is specified, the token will be deleted.
|
||||
func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose, delete bool) (*User, error) {
|
||||
func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose) (user *User, deleteToken func() error, err error) {
|
||||
lookupKey, validator, found := strings.Cut(code, ":")
|
||||
if !found {
|
||||
return nil, nil
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose)
|
||||
if err != nil {
|
||||
if errors.Is(err, util.ErrNotExist) {
|
||||
return nil, nil
|
||||
return nil, nil, nil
|
||||
}
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if authToken.IsExpired() {
|
||||
return nil, auth.DeleteAuthToken(ctx, authToken)
|
||||
return nil, nil, auth.DeleteAuthToken(ctx, authToken)
|
||||
}
|
||||
|
||||
rawValidator, err := hex.DecodeString(validator)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 {
|
||||
return nil, errors.New("validator doesn't match")
|
||||
return nil, nil, errors.New("validator doesn't match")
|
||||
}
|
||||
|
||||
u, err := GetUserByID(ctx, authToken.UID)
|
||||
if err != nil {
|
||||
if IsErrUserNotExist(err) {
|
||||
return nil, nil
|
||||
return nil, nil, nil
|
||||
}
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if delete {
|
||||
if err := auth.DeleteAuthToken(ctx, authToken); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deleteToken = func() error {
|
||||
return auth.DeleteAuthToken(ctx, authToken)
|
||||
}
|
||||
|
||||
return u, nil
|
||||
return u, deleteToken, nil
|
||||
}
|
||||
|
||||
// ValidateUser check if user is valid to insert / update into database
|
||||
|
|
|
@ -222,7 +222,7 @@ func TestSearchUsers(t *testing.T) {
|
|||
[]int64{1041, 37})
|
||||
|
||||
testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: optional.Some(true)},
|
||||
[]int64{24})
|
||||
[]int64{24, 32})
|
||||
}
|
||||
|
||||
func TestEmailNotificationPreferences(t *testing.T) {
|
||||
|
@ -741,13 +741,13 @@ func TestVerifyUserAuthorizationToken(t *testing.T) {
|
|||
assert.True(t, ok)
|
||||
|
||||
t.Run("Wrong purpose", func(t *testing.T) {
|
||||
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset, false)
|
||||
u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset)
|
||||
require.NoError(t, err)
|
||||
assert.Nil(t, u)
|
||||
})
|
||||
|
||||
t.Run("No delete", func(t *testing.T) {
|
||||
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, false)
|
||||
u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation)
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, user.ID, u.ID)
|
||||
|
||||
|
@ -757,9 +757,10 @@ func TestVerifyUserAuthorizationToken(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Delete", func(t *testing.T) {
|
||||
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, true)
|
||||
u, deleteToken, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation)
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, user.ID, u.ID)
|
||||
require.NoError(t, deleteToken())
|
||||
|
||||
authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation)
|
||||
require.ErrorIs(t, err, util.ErrNotExist)
|
||||
|
|
256
modules/annex/annex.go
Normal file
256
modules/annex/annex.go
Normal file
|
@ -0,0 +1,256 @@
|
|||
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Unlike modules/lfs, which operates mainly on git.Blobs, this operates on git.TreeEntrys.
|
||||
// The motivation for this is that TreeEntrys have an easy pointer to the on-disk repo path,
|
||||
// while blobs do not (in fact, if building with TAGS=gogit, blobs might exist only in a mock
|
||||
// filesystem, living only in process RAM). We must have the on-disk path to do anything
|
||||
// useful with git-annex because all of its interesting data is on-disk under .git/annex/.
|
||||
|
||||
package annex
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/typesniffer"
|
||||
|
||||
"gopkg.in/ini.v1" //nolint:depguard // This import is forbidden in favor of using the setting module, but we need ini parsing for something other than Forgejo settings
|
||||
)
|
||||
|
||||
// ErrBlobIsNotAnnexed occurs if a blob does not contain a valid annex key
|
||||
var ErrBlobIsNotAnnexed = errors.New("not a git-annex pointer")
|
||||
|
||||
func PrivateInit(ctx context.Context, repoPath string) error {
|
||||
if _, _, err := git.NewCommand(ctx, "config", "annex.private", "true").RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, _, err := git.NewCommand(ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func LookupKey(blob *git.Blob) (string, error) {
|
||||
stdout, _, err := git.NewCommand(git.DefaultContext, "annex", "lookupkey", "--ref").AddDynamicArguments(blob.ID.String()).RunStdString(&git.RunOpts{Dir: blob.Repo().Path})
|
||||
if err != nil {
|
||||
return "", ErrBlobIsNotAnnexed
|
||||
}
|
||||
key := strings.TrimSpace(stdout)
|
||||
return key, nil
|
||||
}
|
||||
|
||||
// LookupKeyBatch runs git annex lookupkey --batch --ref
|
||||
func LookupKeyBatch(ctx context.Context, shasToBatchReader *io.PipeReader, lookupKeyBatchWriter *io.PipeWriter, wg *sync.WaitGroup, repoPath string) {
|
||||
defer wg.Done()
|
||||
defer shasToBatchReader.Close()
|
||||
defer lookupKeyBatchWriter.Close()
|
||||
|
||||
stderr := new(bytes.Buffer)
|
||||
var errbuf strings.Builder
|
||||
if err := git.NewCommand(ctx, "annex", "lookupkey", "--batch", "--ref").Run(&git.RunOpts{
|
||||
Dir: repoPath,
|
||||
Stdout: lookupKeyBatchWriter,
|
||||
Stdin: shasToBatchReader,
|
||||
Stderr: stderr,
|
||||
}); err != nil {
|
||||
_ = lookupKeyBatchWriter.CloseWithError(fmt.Errorf("git annex lookupkey --batch --ref [%s]: %w - %s", repoPath, err, errbuf.String()))
|
||||
}
|
||||
}
|
||||
|
||||
// CopyFromToBatch runs git -c annex.hardlink=true annex copy --batch-keys --from <remote> --to <remote>
|
||||
func CopyFromToBatch(ctx context.Context, from, to string, keysToCopyReader *io.PipeReader, wg *sync.WaitGroup, repoPath string) {
|
||||
defer wg.Done()
|
||||
defer keysToCopyReader.Close()
|
||||
|
||||
stdout := new(bytes.Buffer)
|
||||
stderr := new(bytes.Buffer)
|
||||
var errbuf strings.Builder
|
||||
if err := git.NewCommand(ctx, "-c", "annex.hardlink=true", "annex", "copy", "--batch-keys", "--from").AddDynamicArguments(from).AddArguments("--to").AddDynamicArguments(to).Run(&git.RunOpts{
|
||||
Dir: repoPath,
|
||||
Stdout: stdout,
|
||||
Stdin: keysToCopyReader,
|
||||
Stderr: stderr,
|
||||
}); err != nil {
|
||||
_ = keysToCopyReader.CloseWithError(fmt.Errorf("git annex copy --batch-keys --from <remote> --to <remote> [%s]: %w - %s", repoPath, err, errbuf.String()))
|
||||
}
|
||||
}
|
||||
|
||||
func ContentLocationFromKey(repoPath, key string) (string, error) {
|
||||
contentLocation, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, "annex", "contentlocation").AddDynamicArguments(key).RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("in %s: %s does not seem to be a valid annexed file: %w", repoPath, key, err)
|
||||
}
|
||||
contentLocation = strings.TrimSpace(contentLocation)
|
||||
contentLocation = path.Clean("/" + contentLocation)[1:] // prevent directory traversals
|
||||
contentLocation = path.Join(repoPath, contentLocation)
|
||||
|
||||
return contentLocation, nil
|
||||
}
|
||||
|
||||
// return the absolute path of the content pointed to by the annex pointer stored in the git object
|
||||
// errors if the content is not found in this repo
|
||||
func ContentLocation(blob *git.Blob) (string, error) {
|
||||
key, err := LookupKey(blob)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return ContentLocationFromKey(blob.Repo().Path, key)
|
||||
}
|
||||
|
||||
// returns a stream open to the annex content
|
||||
func Content(blob *git.Blob) (*os.File, error) {
|
||||
contentLocation, err := ContentLocation(blob)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return os.Open(contentLocation)
|
||||
}
|
||||
|
||||
// whether the object appears to be a valid annex pointer
|
||||
// does *not* verify if the content is actually in this repo;
|
||||
// for that, use ContentLocation()
|
||||
func IsAnnexed(blob *git.Blob) (bool, error) {
|
||||
if !setting.Annex.Enabled {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// LookupKey is written to only return well-formed keys
|
||||
// so the test is just to see if it errors
|
||||
_, err := LookupKey(blob)
|
||||
if err != nil {
|
||||
if errors.Is(err, ErrBlobIsNotAnnexed) {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// PathIsAnnexRepo determines if repoPath is a git-annex enabled repository
|
||||
func PathIsAnnexRepo(repoPath string) bool {
|
||||
_, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// IsAnnexRepo determines if repo is a git-annex enabled repository
|
||||
func IsAnnexRepo(repo *git.Repository) bool {
|
||||
_, _, err := git.NewCommand(repo.Ctx, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repo.Path})
|
||||
return err == nil
|
||||
}
|
||||
|
||||
var (
|
||||
uuid2repoPathCache = make(map[string]string)
|
||||
repoPath2uuidCache = make(map[string]string)
|
||||
)
|
||||
|
||||
func Init() error {
|
||||
if !setting.Annex.Enabled {
|
||||
return nil
|
||||
}
|
||||
if !setting.Annex.DisableP2PHTTP {
|
||||
log.Info("Populating the git-annex UUID cache with existing repositories")
|
||||
start := time.Now()
|
||||
if err := updateUUID2RepoPathCache(); err != nil {
|
||||
return err
|
||||
}
|
||||
log.Info("Populating the git-annex UUID cache took %v", time.Since(start))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateUUID2RepoPathCache() error {
|
||||
configFiles, err := filepath.Glob(filepath.Join(setting.RepoRootPath, "*", "*", "config"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, configFile := range configFiles {
|
||||
repoPath := strings.TrimSuffix(configFile, "/config")
|
||||
_, ok := repoPath2uuidCache[repoPath]
|
||||
if ok {
|
||||
continue
|
||||
}
|
||||
config, err := ini.Load(configFile)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
repoUUID := config.Section("annex").Key("uuid").Value()
|
||||
if repoUUID != "" {
|
||||
uuid2repoPathCache[repoUUID] = repoPath
|
||||
repoPath2uuidCache[repoPath] = repoUUID
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func repoPathFromUUIDCache(uuid string) (string, error) {
|
||||
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
|
||||
return repoPath, nil
|
||||
}
|
||||
// If the cache didn't contain an entry for the UUID then update the cache and try again
|
||||
if err := updateUUID2RepoPathCache(); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
|
||||
return repoPath, nil
|
||||
}
|
||||
return "", fmt.Errorf("no repository known for UUID '%s'", uuid)
|
||||
}
|
||||
|
||||
func checkValidity(uuid, repoPath string) (bool, error) {
|
||||
stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
repoUUID := strings.TrimSpace(stdout)
|
||||
return uuid == repoUUID, nil
|
||||
}
|
||||
|
||||
func removeCachedEntries(uuid, repoPath string) {
|
||||
delete(uuid2repoPathCache, uuid)
|
||||
delete(repoPath2uuidCache, repoPath)
|
||||
}
|
||||
|
||||
func UUID2RepoPath(uuid string) (string, error) {
|
||||
// Get the current cache entry for the UUID
|
||||
repoPath, err := repoPathFromUUIDCache(uuid)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
// Check if it is still up-to-date
|
||||
valid, err := checkValidity(uuid, repoPath)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !valid {
|
||||
// If it isn't, remove the cache entry and try again
|
||||
removeCachedEntries(uuid, repoPath)
|
||||
return UUID2RepoPath(uuid)
|
||||
}
|
||||
// Otherwise just return the cached entry
|
||||
return repoPath, nil
|
||||
}
|
||||
|
||||
// GuessContentType guesses the content type of the annexed blob.
|
||||
func GuessContentType(blob *git.Blob) (typesniffer.SniffedType, error) {
|
||||
r, err := Content(blob)
|
||||
if err != nil {
|
||||
return typesniffer.SniffedType{}, err
|
||||
}
|
||||
defer r.Close()
|
||||
|
||||
return typesniffer.DetectContentTypeFromReader(r)
|
||||
}
|
|
@ -16,6 +16,7 @@ import (
|
|||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"code.gitea.io/gitea/modules/annex"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
||||
|
@ -101,6 +102,12 @@ func Int64sToStrings(ints []int64) []string {
|
|||
|
||||
// EntryIcon returns the octicon class for displaying files/directories
|
||||
func EntryIcon(entry *git.TreeEntry) string {
|
||||
isAnnexed, _ := annex.IsAnnexed(entry.Blob())
|
||||
if isAnnexed {
|
||||
// Show git-annex files as binary files to differentiate them from non-annexed files
|
||||
// TODO: find a more suitable icon, maybe something related to git-annex
|
||||
return "file-binary"
|
||||
}
|
||||
switch {
|
||||
case entry.IsLink():
|
||||
te, _, err := entry.FollowLink()
|
||||
|
|
|
@ -126,6 +126,10 @@ func (b *blobReader) Close() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (b *Blob) Repo() *Repository {
|
||||
return b.repo
|
||||
}
|
||||
|
||||
// Name returns name of the tree entry this blob object was created from (or empty string)
|
||||
func (b *Blob) Name() string {
|
||||
return b.name
|
||||
|
|
|
@ -457,12 +457,13 @@ func (c *Command) RunStdBytes(opts *RunOpts) (stdout, stderr []byte, runErr RunS
|
|||
}
|
||||
|
||||
// AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests
|
||||
// It also re-enables git-credential(1), which is used to test git-annex's HTTP support
|
||||
func AllowLFSFiltersArgs() TrustedCmdArgs {
|
||||
// Now here we should explicitly allow lfs filters to run
|
||||
filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs))
|
||||
j := 0
|
||||
for _, arg := range globalCommandArgs {
|
||||
if strings.Contains(string(arg), "lfs") {
|
||||
if strings.Contains(string(arg), "lfs") || strings.Contains(string(arg), "credential") {
|
||||
j--
|
||||
} else {
|
||||
filteredLFSGlobalArgs[j] = arg
|
||||
|
|
|
@ -106,3 +106,36 @@ func BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader *io.PipeReader, s
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BlobsLessThanOrEqual32KiBFromCatFileBatchCheck reads a pipeline from cat-file --batch-check and returns the blobs <=32KiB in size
|
||||
func BlobsLessThanOrEqual32KiBFromCatFileBatchCheck(catFileCheckReader *io.PipeReader, shasToBatchWriter *io.PipeWriter, wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
defer catFileCheckReader.Close()
|
||||
scanner := bufio.NewScanner(catFileCheckReader)
|
||||
defer func() {
|
||||
_ = shasToBatchWriter.CloseWithError(scanner.Err())
|
||||
}()
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
fields := strings.Split(line, " ")
|
||||
if len(fields) < 3 || fields[1] != "blob" {
|
||||
continue
|
||||
}
|
||||
size, _ := strconv.Atoi(fields[2])
|
||||
if size > 32*1024 {
|
||||
continue
|
||||
}
|
||||
toWrite := []byte(fields[0] + "\n")
|
||||
for len(toWrite) > 0 {
|
||||
n, err := shasToBatchWriter.Write(toWrite)
|
||||
if err != nil {
|
||||
_ = catFileCheckReader.CloseWithError(err)
|
||||
break
|
||||
}
|
||||
toWrite = toWrite[n:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
25
modules/markup/external/external.go
vendored
25
modules/markup/external/external.go
vendored
|
@ -12,6 +12,7 @@ import (
|
|||
"runtime"
|
||||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/annex"
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
|
@ -86,8 +87,22 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
|
|||
commands = strings.Fields(command)
|
||||
args = commands[1:]
|
||||
)
|
||||
|
||||
if p.IsInputFile {
|
||||
isAnnexed, _ := annex.IsAnnexed(ctx.Blob)
|
||||
// if a renderer wants to read a file, and we have annexed content, we can
|
||||
// provide the annex key file location directly to the renderer. git-annex
|
||||
// takes care of having that location be read-only, so no critical
|
||||
// protection layer is needed. Moreover, the file readily exists, and
|
||||
// expensive temporary files can be avoided, also allowing an operator
|
||||
// to raise MAX_DISPLAY_FILE_SIZE without much negative impact.
|
||||
if p.IsInputFile && isAnnexed {
|
||||
// look for annexed content, will be empty, if there is none
|
||||
annexContentLocation, _ := annex.ContentLocation(ctx.Blob)
|
||||
// we call the renderer, even if there is no annex content present.
|
||||
// showing the pointer file content is not much use, and a topical
|
||||
// renderer might be able to produce something useful from the
|
||||
// filename alone (present in ENV)
|
||||
args = append(args, annexContentLocation)
|
||||
} else if p.IsInputFile {
|
||||
// write to temp file
|
||||
f, err := os.CreateTemp("", "gitea_input")
|
||||
if err != nil {
|
||||
|
@ -130,6 +145,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
|
|||
os.Environ(),
|
||||
"GITEA_PREFIX_SRC="+ctx.Links.SrcLink(),
|
||||
"GITEA_PREFIX_RAW="+ctx.Links.RawLink(),
|
||||
// also communicate the relative path of the to-be-rendered item.
|
||||
// this enables the renderer to make use of the original file name
|
||||
// and path, e.g., to make rendering or dtype-detection decisions
|
||||
// that go beyond the originally matched extension. Even if the
|
||||
// content is directly streamed to STDIN
|
||||
"GITEA_RELATIVE_PATH="+ctx.RelativePath,
|
||||
)
|
||||
if !p.IsInputFile {
|
||||
cmd.Stdin = input
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"bytes"
|
||||
"html/template"
|
||||
"io"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strconv"
|
||||
|
@ -77,6 +78,16 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca
|
|||
|
||||
commitSha := node.Data[m[4]:m[5]]
|
||||
filePath := node.Data[m[6]:m[7]]
|
||||
urlFullSource := urlFull
|
||||
if strings.HasSuffix(filePath, "?display=source") {
|
||||
filePath = strings.TrimSuffix(filePath, "?display=source")
|
||||
} else if Type(filePath) != "" {
|
||||
urlFullSource = node.Data[m[0]:m[6]] + filePath + "?display=source#" + node.Data[m[8]:m[1]]
|
||||
}
|
||||
filePath, err := url.QueryUnescape(filePath)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
hash := node.Data[m[8]:m[9]]
|
||||
|
||||
preview.start = m[0]
|
||||
|
@ -113,7 +124,7 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca
|
|||
titleBuffer.WriteString(" – ")
|
||||
}
|
||||
|
||||
err = html.Render(titleBuffer, createLink(urlFull, filePath, "muted"))
|
||||
err = html.Render(titleBuffer, createLink(urlFullSource, filePath, "muted"))
|
||||
if err != nil {
|
||||
log.Error("failed to render filepathLink: %v", err)
|
||||
}
|
||||
|
|
|
@ -1026,4 +1026,138 @@ func TestRender_FilePreview(t *testing.T) {
|
|||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
commitFileURL := util.URLJoin(markup.TestRepoURL, "src", "commit", "c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be", "path", "to", "file.md")
|
||||
|
||||
t.Run("rendered file with ?display=source", func(t *testing.T) {
|
||||
testRender(
|
||||
commitFileURL+"?display=source"+"#L1-L2",
|
||||
`<p></p>`+
|
||||
`<div class="file-preview-box">`+
|
||||
`<div class="header">`+
|
||||
`<div>`+
|
||||
`<a href="http://localhost:3000/gogits/gogs/src/commit/c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be/path/to/file.md?display=source#L1-L2" class="muted" rel="nofollow">path/to/file.md</a>`+
|
||||
`</div>`+
|
||||
`<span class="text small grey">`+
|
||||
`Lines 1 to 2 in <a href="http://localhost:3000/gogits/gogs/src/commit/c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be" class="text black" rel="nofollow">c991312</a>`+
|
||||
`</span>`+
|
||||
`</div>`+
|
||||
`<div class="ui table">`+
|
||||
`<table class="file-preview">`+
|
||||
`<tbody>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="1"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="gh"># A`+"\n"+`</span></code></td>`+
|
||||
`</tr>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="2"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="gh"></span>B`+"\n"+`</code></td>`+
|
||||
`</tr>`+
|
||||
`</tbody>`+
|
||||
`</table>`+
|
||||
`</div>`+
|
||||
`</div>`+
|
||||
`<p></p>`,
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("rendered file without ?display=source", func(t *testing.T) {
|
||||
testRender(
|
||||
commitFileURL+"#L1-L2",
|
||||
`<p></p>`+
|
||||
`<div class="file-preview-box">`+
|
||||
`<div class="header">`+
|
||||
`<div>`+
|
||||
`<a href="http://localhost:3000/gogits/gogs/src/commit/c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be/path/to/file.md?display=source#L1-L2" class="muted" rel="nofollow">path/to/file.md</a>`+
|
||||
`</div>`+
|
||||
`<span class="text small grey">`+
|
||||
`Lines 1 to 2 in <a href="http://localhost:3000/gogits/gogs/src/commit/c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be" class="text black" rel="nofollow">c991312</a>`+
|
||||
`</span>`+
|
||||
`</div>`+
|
||||
`<div class="ui table">`+
|
||||
`<table class="file-preview">`+
|
||||
`<tbody>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="1"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="gh"># A`+"\n"+`</span></code></td>`+
|
||||
`</tr>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="2"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="gh"></span>B`+"\n"+`</code></td>`+
|
||||
`</tr>`+
|
||||
`</tbody>`+
|
||||
`</table>`+
|
||||
`</div>`+
|
||||
`</div>`+
|
||||
`<p></p>`,
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "190d9492934af498c3f669d6a2431dc5459e5b20", "path", "to", "file.go")
|
||||
|
||||
t.Run("normal file with ?display=source", func(t *testing.T) {
|
||||
testRender(
|
||||
commitFileURL+"?display=source"+"#L2-L3",
|
||||
`<p></p>`+
|
||||
`<div class="file-preview-box">`+
|
||||
`<div class="header">`+
|
||||
`<div>`+
|
||||
`<a href="http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go?display=source#L2-L3" class="muted" rel="nofollow">path/to/file.go</a>`+
|
||||
`</div>`+
|
||||
`<span class="text small grey">`+
|
||||
`Lines 2 to 3 in <a href="http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20" class="text black" rel="nofollow">190d949</a>`+
|
||||
`</span>`+
|
||||
`</div>`+
|
||||
`<div class="ui table">`+
|
||||
`<table class="file-preview">`+
|
||||
`<tbody>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="2"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="nx">B</span>`+"\n"+`</code></td>`+
|
||||
`</tr>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="3"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner"><span class="nx">C</span>`+"\n"+`</code></td>`+
|
||||
`</tr>`+
|
||||
`</tbody>`+
|
||||
`</table>`+
|
||||
`</div>`+
|
||||
`</div>`+
|
||||
`<p></p>`,
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d", "path", "to", "file%20%23.txt")
|
||||
|
||||
t.Run("file with strange characters in name", func(t *testing.T) {
|
||||
testRender(
|
||||
commitFileURL+"#L1",
|
||||
`<p></p>`+
|
||||
`<div class="file-preview-box">`+
|
||||
`<div class="header">`+
|
||||
`<div>`+
|
||||
`<a href="http://localhost:3000/gogits/gogs/src/commit/eeb243c3395e1921c5d90e73bd739827251fc99d/path/to/file%20%23.txt#L1" class="muted" rel="nofollow">path/to/file #.txt</a>`+
|
||||
`</div>`+
|
||||
`<span class="text small grey">`+
|
||||
`Line 1 in <a href="http://localhost:3000/gogits/gogs/src/commit/eeb243c3395e1921c5d90e73bd739827251fc99d" class="text black" rel="nofollow">eeb243c</a>`+
|
||||
`</span>`+
|
||||
`</div>`+
|
||||
`<div class="ui table">`+
|
||||
`<table class="file-preview">`+
|
||||
`<tbody>`+
|
||||
`<tr>`+
|
||||
`<td class="lines-num"><span data-line-number="1"></span></td>`+
|
||||
`<td class="lines-code chroma"><code class="code-inner">A`+"\n"+`</code></td>`+
|
||||
`</tr>`+
|
||||
`</tbody>`+
|
||||
`</table>`+
|
||||
`</div>`+
|
||||
`</div>`+
|
||||
`<p></p>`,
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
mdutil "code.gitea.io/gitea/modules/markup/markdown/util"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
"github.com/yuin/goldmark/ast"
|
||||
|
@ -19,7 +20,7 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin
|
|||
v.SetAttribute(attr.Name, []byte(fmt.Sprintf("%v", attr.Value)))
|
||||
}
|
||||
}
|
||||
txt := v.Lines().Value(reader.Source())
|
||||
txt := mdutil.Text(v, reader.Source())
|
||||
header := markup.Header{
|
||||
Text: util.UnsafeBytesToString(txt),
|
||||
Level: v.Level,
|
||||
|
|
|
@ -67,14 +67,18 @@ type Header struct {
|
|||
|
||||
// RenderContext represents a render context
|
||||
type RenderContext struct {
|
||||
Ctx context.Context
|
||||
RelativePath string // relative path from tree root of the branch
|
||||
Type string
|
||||
IsWiki bool
|
||||
Links Links
|
||||
Metas map[string]string
|
||||
DefaultLink string
|
||||
GitRepo *git.Repository
|
||||
Ctx context.Context
|
||||
RelativePath string // relative path from tree root of the branch
|
||||
Type string
|
||||
IsWiki bool
|
||||
Links Links
|
||||
Metas map[string]string
|
||||
DefaultLink string
|
||||
GitRepo *git.Repository
|
||||
// reporting the target blob that is to-be-rendered enables
|
||||
// deeper inspection in the handler for external renderer
|
||||
// (i.e., more targeted handling of annexed files)
|
||||
Blob *git.Blob
|
||||
ShaExistCache map[string]bool
|
||||
cancelFn func()
|
||||
SidebarTocNode ast.Node
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
x•ŽANÃ0EYû³GB;a U=D9€=þ&–ÚÙÓr} 7èêÞÓÓëåÒŒBœ^¬´¤˜yY8Ï:AІX}<7D>R×XkÎs"î;uìFº®9x” Œ ÊEdÐ’%Í~**Zß3\ºÙvíô9Й>nÿ8Žfxkû=<3D>[9K”%L>®ôêÙ{§<>7Ãs–;aÕvý4ÛhXOûH·Ô“þÕ†ûð`KÑ
|
|
@ -0,0 +1 @@
|
|||
x•ŽKŠ1@]çµ$¿J¥aæz€JRÁ@w+éØsýõ®ÞâñàåÛ²´ÖÛÃè"@VL&J3%f-ÑGDÒq2>FçjBOEݹË:ÀgÃ\1¤œ¦ê¦’kÀêªEM6DÔ,Ÿ\‚âǸÞ:\6é¾OülmÈ©;Ï|ƒ!GäŒE‚£6Z«üzòY¥Î²
¨m¸wÙ›üÂÿi‘.x-o³ò"›úŒLÌ
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
4c1aaf56bcb9f39dcf65f3f250726850aed13cd6
|
||||
eeb243c3395e1921c5d90e73bd739827251fc99d
|
||||
|
|
|
@ -40,6 +40,7 @@ type ServCommandResults struct {
|
|||
UserName string
|
||||
UserEmail string
|
||||
UserID int64
|
||||
UserMode perm.AccessMode
|
||||
OwnerName string
|
||||
RepoName string
|
||||
RepoID int64
|
||||
|
|
|
@ -47,7 +47,7 @@ func AesDecrypt(key, text []byte) ([]byte, error) {
|
|||
cfb.XORKeyStream(text, text)
|
||||
data, err := base64.StdEncoding.DecodeString(string(text))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err)
|
||||
return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w - it can be caused by a change of the [security].SECRET_KEY setting or a database corruption - `forgejo doctor check --run check-db-consistency --fix` will get rid of orphaned rows found in the `two_factor` table and may fix this problem if they are the one with the invalid content", err)
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
|
25
modules/setting/annex.go
Normal file
25
modules/setting/annex.go
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting
|
||||
|
||||
import (
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
)
|
||||
|
||||
// Annex represents the configuration for git-annex
|
||||
var Annex = struct {
|
||||
Enabled bool `ini:"ENABLED"`
|
||||
DisableP2PHTTP bool `ini:"DISABLE_P2PHTTP"`
|
||||
}{}
|
||||
|
||||
func loadAnnexFrom(rootCfg ConfigProvider) {
|
||||
sec := rootCfg.Section("annex")
|
||||
if err := sec.MapTo(&Annex); err != nil {
|
||||
log.Fatal("Failed to map Annex settings: %v", err)
|
||||
}
|
||||
if !sec.HasKey("DISABLE_P2PHTTP") {
|
||||
// If DisableP2PHTTP is not explicitly set then use DisableHTTPGit as its default
|
||||
Annex.DisableP2PHTTP = Repository.DisableHTTPGit
|
||||
}
|
||||
}
|
|
@ -138,6 +138,11 @@ func CompileEmailGlobList(sec ConfigSection, keys ...string) (globs []glob.Glob)
|
|||
return globs
|
||||
}
|
||||
|
||||
// LoadServiceSetting loads the service settings
|
||||
func LoadServiceSetting() {
|
||||
loadServiceFrom(CfgProvider)
|
||||
}
|
||||
|
||||
func loadServiceFrom(rootCfg ConfigProvider) {
|
||||
sec := rootCfg.Section("service")
|
||||
Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180)
|
||||
|
|
|
@ -153,6 +153,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error {
|
|||
loadCamoFrom(cfg)
|
||||
loadI18nFrom(cfg)
|
||||
loadGitFrom(cfg)
|
||||
loadAnnexFrom(cfg)
|
||||
loadMirrorFrom(cfg)
|
||||
loadMarkupFrom(cfg)
|
||||
loadQuotaFrom(cfg)
|
||||
|
|
|
@ -4,7 +4,9 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"syscall"
|
||||
"time"
|
||||
|
@ -41,10 +43,48 @@ func Remove(name string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
// RemoveAll removes the named file or (empty) directory with at most 5 attempts.
|
||||
// MakeWritable recursively makes the named directory writable.
|
||||
func MakeWritable(name string) error {
|
||||
return filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error {
|
||||
// NB: this is called WalkDir but it works on a single file too
|
||||
if err == nil {
|
||||
info, err := d.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Don't try chmod'ing symlinks (will fail with broken symlinks)
|
||||
if info.Mode()&os.ModeSymlink != os.ModeSymlink {
|
||||
// 0200 == u+w, in octal unix permission notation
|
||||
err = os.Chmod(path, info.Mode()|0o200)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// RemoveAll removes the named file or directory with at most 5 attempts.
|
||||
func RemoveAll(name string) error {
|
||||
var err error
|
||||
|
||||
for i := 0; i < 5; i++ {
|
||||
// Do chmod -R +w to help ensure the removal succeeds.
|
||||
// In particular, in the git-annex case, this handles
|
||||
// https://git-annex.branchable.com/internals/lockdown/ :
|
||||
//
|
||||
// > (The only bad consequence of this is that rm -rf .git
|
||||
// > doesn't work unless you first run chmod -R +w .git)
|
||||
|
||||
err = MakeWritable(name)
|
||||
if err != nil {
|
||||
// try again
|
||||
<-time.After(100 * time.Millisecond)
|
||||
continue
|
||||
}
|
||||
|
||||
err = os.RemoveAll(name)
|
||||
if err == nil {
|
||||
break
|
||||
|
|
|
@ -1779,6 +1779,10 @@ runners.task_list.repository = Хранилище
|
|||
runners.description = Описание
|
||||
runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a>.
|
||||
|
||||
variables.management = Управление на променливи
|
||||
variables.id_not_exist = Променлива с идентификатор %d не съществува.
|
||||
variables.not_found = Променливата не е открита.
|
||||
|
||||
[heatmap]
|
||||
less = По-малко
|
||||
number_of_contributions_in_the_last_12_months = %s приноса през последните 12 месеца
|
||||
|
@ -1815,6 +1819,8 @@ code_frequency.what = честота на промените
|
|||
type-1.display_name = Индивидуален проект
|
||||
|
||||
|
||||
deleted.display_name = Изтрит проект
|
||||
|
||||
[search]
|
||||
no_results = Няма намерени съответстващи резултати.
|
||||
team_kind = Търсене на екипи...
|
||||
|
|
|
@ -175,7 +175,7 @@ exact = Exacte
|
|||
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
|
||||
issue_kind = Cerca problemes...
|
||||
|
||||
regexp = Expressió regular
|
||||
regexp = RegExp
|
||||
regexp_tooltip = Interpreta el terme de cerca com una expressió regular
|
||||
|
||||
[heatmap]
|
||||
|
@ -215,7 +215,7 @@ reinstall_error = Estas intentant instaŀlar sobre una base de dades existent de
|
|||
reinstall_confirm_message = Reinstaŀlar amb una base de dades existent de Forgejo pot causar diferents problemes. En la majoria de casos, s'hauria d'utilitzar l'"app.ini" existent per executar Forgejo. Si saps el que estàs fent, confirma el seguent:
|
||||
no_admin_and_disable_registration = No pot deshabilitar l'autoregistre d'usuaris sense crear un compte d'administrador.
|
||||
err_admin_name_is_reserved = El nom d'usuari "Administrador" no es vàlid: està reservat
|
||||
smtp_addr = Hoste SMPT
|
||||
smtp_addr = Hoste SMTP
|
||||
smtp_port = Port SMPT
|
||||
smtp_from = Enviar correu com a
|
||||
mailer_user = Nom d'usuari SMTP
|
||||
|
@ -414,6 +414,10 @@ password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned
|
|||
last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un.
|
||||
back_to_sign_in = Torneu a entrar
|
||||
|
||||
openid_connect_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí.
|
||||
openid_register_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí.
|
||||
sign_in_openid = Accediu amb OpenID
|
||||
|
||||
[editor]
|
||||
buttons.indent.tooltip = Aniua els elements un nivell
|
||||
buttons.unindent.tooltip = Desaniuna els elements un nivell
|
||||
|
@ -476,4 +480,8 @@ activate_account = Si us plau, activeu el compte
|
|||
activate_account.text_1 = Hola <b>%[1]s</b>, gràcies per registrar-te a %[2]s!
|
||||
admin.new_user.user_info = Informació d'usuari
|
||||
admin.new_user.text = Si us plau, <a href="%s">cliqueu aui</a> per administrar aquest usuari des del panell d'administració.
|
||||
register_notify = Benvinguts a %s
|
||||
register_notify = Benvinguts a %s
|
||||
activate_account.text_2 = Si us plau, cliqueu l'enllaç següent per activar el vostre compte en <b>%s</b>:
|
||||
activate_email = Verifica la teva adreça de correu electrònic
|
||||
activate_email.text = Si us plau, cliqueu el següent enllaç per verificar la vostra adreça de correu electrònic en <b>%s</b>
|
||||
admin.new_user.subject = Nou usuari %s s'acaba d'enregistrar
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -683,6 +683,8 @@ To = Branchname
|
|||
AccessToken = Zugangstoken
|
||||
|
||||
|
||||
email_domain_is_not_allowed = Die Domain der E-Mail-Adresse des Benutzers <b>%s</b> steht in Konflikt mit EMAIL_DOMAIN_ALLOWLIST oder EMAIL_DOMAIN_BLOCKLIST. Bitte stelle sicher, dass du die E-Mail-Adresse richtig gesetzt hast.
|
||||
|
||||
[user]
|
||||
change_avatar=Profilbild ändern …
|
||||
joined_on=Beigetreten am %s
|
||||
|
@ -1315,6 +1317,8 @@ view_git_blame=„git blame“ ansehen
|
|||
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
|
||||
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
|
||||
stored_lfs=Gespeichert mit Git LFS
|
||||
stored_annex=Gespeichert mit Git Annex
|
||||
stored_annex_not_present = hier nicht vorhanden, versuche git annex whereis
|
||||
symbolic_link=Softlink
|
||||
executable_file=Ausführbare Datei
|
||||
commit_graph=Commit-Graph
|
||||
|
@ -1338,6 +1342,7 @@ editor.upload_file=Datei hochladen
|
|||
editor.edit_file=Datei bearbeiten
|
||||
editor.preview_changes=Vorschau der Änderungen
|
||||
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
|
||||
editor.cannot_edit_annex_files=Annex-Dateien können im Webinterface nicht bearbeitet werden.
|
||||
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
|
||||
editor.edit_this_file=Datei bearbeiten
|
||||
editor.this_file_locked=Datei ist gesperrt
|
||||
|
@ -2869,6 +2874,8 @@ issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
|
|||
summary_card_alt = Zusammenfassungskarte des Repositorys %s
|
||||
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
|
||||
|
||||
editor.commit_email = Commit-E-Mail
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Konnte %s nicht laden
|
||||
component_loading_info = Dies könnte einen Moment dauern …
|
||||
|
@ -3109,7 +3116,7 @@ dashboard.sync_branch.started=Synchronisierung der Branches gestartet
|
|||
dashboard.rebuild_issue_indexer=Issue-Indexer neu bauen
|
||||
|
||||
users.user_manage_panel=Benutzerkonten verwalten
|
||||
users.new_account=Benutzerkonto erstellen
|
||||
users.new_account=Benutzeraccount erstellen
|
||||
users.name=Benutzername
|
||||
users.full_name=Vollständiger Name
|
||||
users.activated=Aktiviert
|
||||
|
@ -3578,7 +3585,7 @@ comment_pull=`hat den Pull-Request <a href="%[1]s">%[3]s#%[2]s</a> kommentiert`
|
|||
merge_pull_request=`führte Pull-Request <a href="%[1]s">%[3]s#%[2]s</a> zusammen`
|
||||
auto_merge_pull_request=`führte Pull-Request <a href="%[1]s">%[3]s#%[2]s</a> automatisch zusammen`
|
||||
transfer_repo=hat Repository <code>%s</code> übertragen zu <a href="%s">%s</a>
|
||||
push_tag=Tag <a href="%[2]s">%[3]s</a> nach <a href="%[1]s">%[4]s</a> wurde gepusht
|
||||
push_tag=hat Tag <a href="%[2]s">%[3]s</a> auf <a href="%[1]s">%[4]s</a> gepusht
|
||||
delete_tag=hat Tag %[2]s in <a href="%[1]s">%[3]s</a> gelöscht
|
||||
delete_branch=hat Branch %[2]s in <a href="%[1]s">%[3]s</a> gelöscht
|
||||
compare_branch=Vergleichen
|
||||
|
@ -3943,6 +3950,8 @@ runs.expire_log_message = Logs wurden gelöscht, weil sie zu alt waren.
|
|||
runs.no_workflows.help_write_access = Keine Ahnung, wie man mit Forgejo Actions anfangen soll? Schau im <a target="_blank" rel="noopener noreferrer" href="%s">Schnellstart in der Benutzerdokumentation</a> vorbei, um deinen ersten Workflow zu schreiben, dann <a target="_blank" rel="noopener noreferrer" href="%s">setze einen Forgejo-Runner auf</a>, um deine Jobs auszuführen.
|
||||
runs.no_workflows.help_no_write_access = Um über Forgejo Actions zu lernen, siehe <a target="_blank" rel="noopener noreferrer" href="%s">die Dokumentation</a>.
|
||||
|
||||
variables.not_found = Die Variable wurde nicht gefunden.
|
||||
|
||||
[projects]
|
||||
type-1.display_name=Individuelles Projekt
|
||||
type-2.display_name=Repository-Projekt
|
||||
|
@ -3975,7 +3984,7 @@ package_kind = Pakete suchen …
|
|||
project_kind = Projekte suchen …
|
||||
branch_kind = Branches suchen …
|
||||
commit_kind = Commits suchen …
|
||||
runner_kind = Runners suchen …
|
||||
runner_kind = Runner suchen …
|
||||
no_results = Keine passenden Ergebnisse gefunden.
|
||||
code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
|
||||
keyword_search_unavailable = Die Suche mittels Schlüsselwort ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
|
||||
|
|
|
@ -518,15 +518,15 @@ issue_assigned.issue=Ο/Η @%[1]s σας ανέθεσε το ζήτημα %[2]s
|
|||
|
||||
issue.x_mentioned_you=Ο/Η <b>@%s</b> σας ανέφερε:
|
||||
issue.action.force_push=Ο/Η <b>%[1]s</b> έκανε force-push το <b>%[2]s</b> από %[3]s σε %[4]s.
|
||||
issue.action.push_1=Ο/Η <b>@%[1]s</b> έκανε push την υποβολή %[3]d στο %[2]s
|
||||
issue.action.push_n=Ο/Η <b>@%[1]s</b> έκανε push τις υποβολές %[3]d στο %[2]s
|
||||
issue.action.push_1=Ο/Η <b>@%[1]s</b> έκανε push το commit %[3]d στο %[2]s
|
||||
issue.action.push_n=Ο/Η <b>@%[1]s</b> έκανε push τα commits %[3]d στο %[2]s
|
||||
issue.action.close=Ο/Η <b>@%[1]s</b> έκλεισε το #%[2]d.
|
||||
issue.action.reopen=Ο/Η <b>@%[1]s</b> άνοιξε ξανά το #%[2]d.
|
||||
issue.action.merge=Ο/Η <b>@%[1]s</b> συγχώνευσε το #%[2]d στο %[3]s.
|
||||
issue.action.approve=<b>@%[1]s</b> ενέκρινε αυτό το pull request.
|
||||
issue.action.reject=<b>@%[1]s</b> ζήτησε αλλαγές σε αυτό το pull request.
|
||||
issue.action.review=<b>@%[1]s</b> άφησε σχόλιο σε αυτό το pull request.
|
||||
issue.action.review_dismissed=<b>@%[1]s</b> απέρριψε την τελευταία αναθεώρηση από %[2]s για αυτό το pull request.
|
||||
issue.action.review_dismissed=<b>@%[1]s</b> απέρριψε την τελευταία αξιολόγηση από %[2]s για αυτό το pull request.
|
||||
issue.action.ready_for_review=Ο/Η <b>@%[1]s</b> επισήμανε πως αυτό το pull request είναι έτοιμο για αξιολόγηση.
|
||||
issue.action.new=Ο/Η <b>@%[1]s</b> δημιούργησε το #%[2]d.
|
||||
issue.in_tree_path=Σε %s:
|
||||
|
@ -591,9 +591,9 @@ AuthName=Όνομα εξουσιοδότησης
|
|||
AdminEmail=Email διαχειριστή
|
||||
|
||||
NewBranchName=Όνομα νέου κλάδου
|
||||
CommitSummary=Περίληψη υποβολών
|
||||
CommitMessage=Μήνυμα υποβολής
|
||||
CommitChoice=Επιλογή υποβολής
|
||||
CommitSummary=Περίληψη commit
|
||||
CommitMessage=Μήνυμα commit
|
||||
CommitChoice=Επιλογή commit
|
||||
TreeName=Διαδρομή αρχείου
|
||||
Content=Περιεχόμενο
|
||||
|
||||
|
@ -682,6 +682,8 @@ Website = Ιστοσελίδα
|
|||
Location = Τοποθεσία
|
||||
|
||||
|
||||
email_domain_is_not_allowed = Το domain του email χρήστη <b>%s</b> έρχεται σε σύγκρουση είτε με την ρύθμιση EMAIL_DOMAIN_ALLOWLIST ή με την ρύθμιση EMAIL_DOMAIN_BLOCKLIST. Βεβαιωθείτε ότι η διεύθυνση email έχει οριστεί σωστά.
|
||||
|
||||
[user]
|
||||
change_avatar=Αλλαγή εικόνας προφίλ…
|
||||
joined_on=Εγγράφηκε στις %s
|
||||
|
@ -768,7 +770,7 @@ language=Γλώσσα
|
|||
ui=Θέμα Διεπαφής
|
||||
hidden_comment_types=Κρυμμένοι τύποι σχολίων
|
||||
hidden_comment_types_description=Οι τύποι σχολίων που επιλέγονται εδώ δε θα εμφανίζονται μέσα στις σελίδες ζητημάτων. Επιλέγοντας π.χ τις "Ταμπέλες", θα αφαιρεθούν όλα τα σχόλια σαν το "<user> πρόσθεσε/αφαίρεσε τα σήματα <label>".
|
||||
hidden_comment_types.ref_tooltip=Σχόλια όπου αυτό το ζήτημα αναφέρθηκε από άλλο ζήτημα/υποβολή/…
|
||||
hidden_comment_types.ref_tooltip=Σχόλια όπου αυτό το ζήτημα αναφέρθηκε από άλλο ζήτημα/commit/…
|
||||
hidden_comment_types.issue_ref_tooltip=Σχόλια όπου ο χρήστης αλλάζει τον κλάδο/ετικέτα που σχετίζεται με το ζήτημα
|
||||
comment_type_group_reference=Αναφορά
|
||||
comment_type_group_label=Σήμα
|
||||
|
@ -781,7 +783,7 @@ comment_type_group_deadline=Προθεσμία
|
|||
comment_type_group_dependency=Εξάρτηση
|
||||
comment_type_group_lock=Κατάσταση κλειδώματος
|
||||
comment_type_group_review_request=Αίτηση αξιολόγησης
|
||||
comment_type_group_pull_request_push=Προστέθηκαν υποβολές
|
||||
comment_type_group_pull_request_push=Προστέθηκαν commits
|
||||
comment_type_group_project=Έργο
|
||||
comment_type_group_issue_ref=Αναφορά ζητήματος
|
||||
saved_successfully=Οι ρυθμίσεις σας αποθηκεύτηκαν επιτυχώς.
|
||||
|
@ -823,7 +825,7 @@ activations_pending=Εκκρεμεί ενεργοποίηση
|
|||
can_not_add_email_activations_pending=Εκκρεμεί μια ενεργοποίηση, δοκιμάστε ξανά σε λίγα λεπτά αν θέλετε να προσθέσετε ένα νέο email.
|
||||
delete_email=Αφαίρεση
|
||||
email_deletion=Αφαίρεση διεύθυνσης email
|
||||
email_deletion_desc=Η διεύθυνση ηλεκτρονικού ταχυδρομείου και οι σχετικές πληροφορίες θα αφαιρεθούν από τον λογαριασμό σας. Οι υποβολές Git από αυτή τη διεύθυνση email θα παραμείνουν αμετάβλητες. Συνέχεια;
|
||||
email_deletion_desc=Η διεύθυνση email και οι πληροφορίες που συσχετίζονται με αυτήν θα αφαιρεθούν από τον λογαριασμό σας. Τα Git commit που περιλαμβάνουν το email δεν θα επηρεαστούν. Συνέχεια;
|
||||
email_deletion_success=Η διεύθυνση email σας έχει καταργηθεί.
|
||||
theme_update_success=Το θέμα διεπαφής σας ενημερώθηκε.
|
||||
theme_update_error=Το επιλεγμένο θέμα διεπαφής δεν υπάρχει.
|
||||
|
@ -839,16 +841,16 @@ add_email_success=Η νέα διεύθυνση email έχει προστεθεί
|
|||
email_preference_set_success=Οι προτιμήσεις email έχουν οριστεί επιτυχώς.
|
||||
add_openid_success=Προστέθηκε η νέα διεύθυνση OpenID.
|
||||
keep_email_private=Απόκρυψη διεύθυνσης email
|
||||
keep_email_private_popup=Αυτό θα κρύψει το email σας από το προφίλ σας, καθώς και όταν κάνετε ένα pull request ή επεξεργάζεστε ένα αρχείο μέσω της ιστοσελίδας. Οι υποβολές που έχετε ήδη ωθήσει δεν θα τροποποιηθούν. Χρησιμοποιήστε το %s στις υποβολές για να τις συσχετίσετε με το λογαριασμό σας.
|
||||
keep_email_private_popup=Η διεύθυνση email σας δεν θα εμφανίζεται στο προφίλ σας και δεν θα χρησιμοποιείται για commits που γίνονται μέσω του web UI, όπως σε ανεβασμένα αρχεία, αλλαγές ή merge commits. Για τον συσχετισμό commit με τον λογαριασμό σας, θα χρησιμοποιηθεί αντί αυτού η ειδική διεύθυνση %s. Αυτή η ρύθμιση δεν επηρεάζει commit που υπάρχουν ήδη.
|
||||
openid_desc=Το OpenID σας επιτρέπει να αναθέσετε τον έλεγχο ταυτότητας σε έναν εξωτερικό πάροχο.
|
||||
|
||||
manage_ssh_keys=Διαχείριση κλειδιών SSH
|
||||
manage_ssh_principals=Διαχείριση Των Αρχών Πιστοποιητικού SSH
|
||||
manage_gpg_keys=Διαχείριση κλειδιών GPG
|
||||
add_key=Προσθήκη κλειδιού
|
||||
ssh_desc=Αυτά τα δημόσια κλειδιά SSH θα συσχετιθούν με το λογαριασμό σας. Τα ιδιωτικά κλειδιά που τους αντιστοιχούν θα επιτρέπουν πλήρη πρόσβαση στα αποθετήριά σας. Ένα επιβεβαιωμένο κλειδί SSH μπορεί να χρησιμοποιηθεί για την υπογραφή των υποβολών (commits) σας.
|
||||
ssh_desc=Αυτά τα δημόσια κλειδιά SSH θα συσχετιθούν με το λογαριασμό σας. Τα ιδιωτικά κλειδιά που τους αντιστοιχούν θα επιτρέπουν πλήρη πρόσβαση στα αποθετήριά σας. Ένα επιβεβαιωμένο κλειδί SSH μπορεί να χρησιμοποιηθεί για την υπογραφή των commit σας.
|
||||
principal_desc=Αυτές οι αρχές πιστοποιητικών SSH συνδέονται με το λογαριασμό σας και επιτρέπουν την πλήρη πρόσβαση στα αποθετήριά σας.
|
||||
gpg_desc=Αυτά τα δημόσια κλειδιά GPG συσχετίζονται με το λογαριασμό σας και επιτρέπουν την επικύρωση των υποβολών (commits) σας. Κρατήστε τα ιδιωτικά κλειδιά σας ασφαλή, καθώς επιτρέπουν την υπογραφή των υποβολών (commits) εκ μέρους σας.
|
||||
gpg_desc=Αυτά τα δημόσια κλειδιά GPG συσχετίζονται με το λογαριασμό σας και επιτρέπουν την επικύρωση των commit σας. Κρατήστε τα ιδιωτικά κλειδιά σας ασφαλή, καθώς επιτρέπουν την υπογραφή των commits εκ μέρους σας.
|
||||
ssh_helper=<strong>Χρειάζεστε βοήθεια;</strong> Συμβουλευτείτε τον οδηγό του GitHub για να <a href="%s">δημιουργήσετε τα δικά σας κλειδιά SSH</a> ή να επιλύσετε <a href="%s">κοινά προβλήματα</a> που ίσως αντιμετωπίσετε με τη χρήση του SSH.
|
||||
gpg_helper=<strong>Χρειάζεστε βοήθεια;</strong> Συμβουλευτείτε τον οδηγό του GitHub <a href="%s">για το GPG</a>.
|
||||
add_new_key=Προσθήκη κλειδιού SSH
|
||||
|
@ -862,9 +864,9 @@ ssh_principal_been_used=Αυτή η αρχή πιστοποίησης (principal
|
|||
gpg_key_id_used=Υπάρχει ήδη δημόσιο κλειδί GPG με το ίδιο ID.
|
||||
gpg_no_key_email_found=Αυτό το κλειδί GPG δεν ταιριάζει με οποιαδήποτε ενεργοποιημένη διεύθυνση ηλεκτρονικού ταχυδρομείου που σχετίζεται με το λογαριασμό σας. Μπορεί ακόμα να προστεθεί, αν υπογράψετε το παρεχόμενο διακριτικό (token).
|
||||
gpg_key_matched_identities=Ταυτότητες που ταιριάζουν:
|
||||
gpg_key_matched_identities_long=Οι ενσωματωμένες ταυτότητες σε αυτό το κλειδί ταιριάζουν με τις ακόλουθες ενεργοποιημένες διευθύνσεις email για αυτόν το χρήστη. Οι υποβολές που ταιριάζουν με αυτές τις διευθύνσεις email μπορούν να επαληθευτούν με αυτό το κλειδί.
|
||||
gpg_key_matched_identities_long=Οι ενσωματωμένες ταυτότητες σε αυτό το κλειδί ταιριάζουν με τις ακόλουθες ενεργοποιημένες διευθύνσεις email για αυτόν το χρήστη. Τα commit που περιέχουν αυτές τις διευθύνσεις email μπορούν να επαληθευτούν με αυτό το κλειδί.
|
||||
gpg_key_verified=Επαληθευμένο κλειδί
|
||||
gpg_key_verified_long=Το κλειδί έχει επαληθευτεί με ένα διακριτικό (token) και μπορεί να χρησιμοποιηθεί για να επαληθεύσει τις υποβολές που ταιριάζουν με οποιεσδήποτε ενεργοποιημένες διευθύνσεις email για αυτόν το χρήστη εκτός από οποιαδήποτε αντιστοιχισμένη ταυτότητα για αυτό το κλειδί.
|
||||
gpg_key_verified_long=Το κλειδί έχει επαληθευτεί με ένα διακριτικό (token) και μπορεί να χρησιμοποιηθεί για να επαληθεύσει τα commit που ταιριάζουν με οποιεσδήποτε ενεργοποιημένες διευθύνσεις email για αυτόν το χρήστη εκτός από οποιαδήποτε αντιστοιχισμένη ταυτότητα για αυτό το κλειδί.
|
||||
gpg_key_verify=Επαλήθευση
|
||||
gpg_invalid_token_signature=Το κλειδί GPG, η υπογραφή και το διακριτικό (token) δεν ταιριάζουν ή το διακριτικό (token) είναι παρωχημένο.
|
||||
gpg_token_required=Πρέπει να δώσετε μια υπογραφή για το παρακάτω διακριτικό
|
||||
|
@ -875,7 +877,7 @@ gpg_token_signature=Θωρακισμένη υπογραφή GPG
|
|||
key_signature_gpg_placeholder=Αρχίζει με «-----BEGIN PGP SIGNATURE-----»
|
||||
verify_gpg_key_success=Το κλειδί GPG «%s» επαληθεύτηκε.
|
||||
ssh_key_verified=Επαληθευμένο κλειδί
|
||||
ssh_key_verified_long=Το κλειδί έχει επαληθευτεί με ένα διακριτικό και μπορεί να χρησιμοποιηθεί για να επαληθεύσει τα commits που ταιριάζουν με οποιεσδήποτε ενεργοποιημένες διευθύνσεις ηλεκτρονικού ταχυδρομείου για αυτόν το χρήστη.
|
||||
ssh_key_verified_long=Το κλειδί έχει επαληθευτεί με ένα διακριτικό και μπορεί να χρησιμοποιηθεί για να επαληθεύσει τα commit που ταιριάζουν με οποιεσδήποτε ενεργοποιημένες διευθύνσεις ηλεκτρονικού ταχυδρομείου για αυτόν το χρήστη.
|
||||
ssh_key_verify=Επαλήθευση
|
||||
ssh_invalid_token_signature=Το παρεχόμενο κλειδί SSH, υπογραφή ή διακριτικό δεν ταιριάζει ή το διακριτικό έληξε.
|
||||
ssh_token_required=Πρέπει να δώσετε μια υπογραφή για το παρακάτω διακριτικό
|
||||
|
@ -897,7 +899,7 @@ ssh_key_deletion=Διαγραφή κλειδιού SSH
|
|||
gpg_key_deletion=Διαγραφή κλειδιού GPG
|
||||
ssh_principal_deletion=Διαγραφή Αρχών Πιστοποιητικού SSH
|
||||
ssh_key_deletion_desc=Η διαγραφή ενός κλειδιού SSH ανακαλεί την πρόσβασή του στο λογαριασμό σας. Συνέχεια;
|
||||
gpg_key_deletion_desc=Η διαγραφή ενός κλειδιού GPG απο-επαληθεύει τις υποβολές που έχουν υπογραφεί από αυτό. Συνέχεια;
|
||||
gpg_key_deletion_desc=Η διαγραφή ενός κλειδιού GPG αφαιρεί τις επαληθεύσεις των commit που έχουν υπογραφεί από αυτό το κλειδί. Συνέχεια;
|
||||
ssh_principal_deletion_desc=Η διαγραφή μιας αρχής πιστοποιητικού SSH ανακαλεί την πρόσβασή της στο λογαριασμό σας. Συνέχεια;
|
||||
ssh_key_deletion_success=Το SSH κλειδί έχει διαγραφεί.
|
||||
gpg_key_deletion_success=Το κλειδί GPG έχει διαγραφεί.
|
||||
|
@ -915,7 +917,7 @@ principal_state_desc=Αυτή η αρχή πιστοποιητικού έχει
|
|||
show_openid=Εμφάνιση στο προφίλ
|
||||
hide_openid=Απόκρυψη από το προφίλ
|
||||
ssh_disabled=Το SSH είναι απενεργοποιημένο
|
||||
ssh_signonly=Το SSH είναι απενεργοποιημένο αυτή τη στιγμή, έτσι αυτά τα κλειδιά είναι μόνο για την επαλήθευση υπογραφής των υποβολών.
|
||||
ssh_signonly=Το SSH είναι απενεργοποιημένο αυτή τη στιγμή, έτσι αυτά τα κλειδιά είναι μόνο για την επαλήθευση υπογραφών των commit.
|
||||
ssh_externally_managed=Αυτό το κλειδί SSH διαχειρίζεται εξωτερικά για αυτόν το χρήστη
|
||||
manage_social=Διαχείριση Συσχετιζόμενων Λογαριασμών Κοινωνικών Δικτύων
|
||||
social_desc=Αυτοί οι λογαριασμοί κοινωνικών δικτύων μπορούν να χρησιμοποιηθούν για να συνδεθείτε στο λογαριασμό σας. Βεβαιωθείτε ότι τους αναγνωρίζετε όλους.
|
||||
|
@ -1111,7 +1113,7 @@ trust_model_helper_default=Προεπιλογή: Χρήση προεπιλεγμ
|
|||
create_repo=Δημιουργία αποθετηρίου
|
||||
default_branch=Προεπιλεγμένος κλάδος
|
||||
default_branch_label=προεπιλογή
|
||||
default_branch_helper=Ο προεπιλεγμένος κλάδος είναι ο βασικός κλάδος για pull requests και υποβολές κώδικα.
|
||||
default_branch_helper=Ο προεπιλεγμένος κλάδος είναι ο βασικός κλάδος για pull requests και commits.
|
||||
mirror_prune=Καθαρισμός
|
||||
mirror_prune_desc=Αφαίρεση παρωχημένων αναφορών απομακρυσμένης-παρακολούθησης
|
||||
mirror_interval=Διάστημα ανανέωσης ειδώλου (έγκυρες μονάδες ώρας είναι "h", "m", "s"). 0 για απενεργοποίηση του αυτόματου συγχρονισμού. (Ελάχιστο διάστημα: %s)
|
||||
|
@ -1150,7 +1152,7 @@ blame.ignore_revs=Αγνόηση των αναθεωρήσεων στο <a href=
|
|||
blame.ignore_revs.failed=Αποτυχία αγνόησης των αναθεωρήσεων στο <a href="%s">.git-blame-ignore-revs</a>.
|
||||
author_search_tooltip=Εμφάνιση το πολύ 30 χρηστών
|
||||
|
||||
tree_path_not_found_commit=Η διαδρομή %[1]s δεν υπάρχει στην υποβολή %[2]s
|
||||
tree_path_not_found_commit=Η διαδρομή %[1]s δεν υπάρχει στο commit %[2]s
|
||||
tree_path_not_found_branch=Η διαδρομή %[1]s δεν υπάρχει στον κλάδο %[2]s
|
||||
tree_path_not_found_tag=Η διαδρομή %[1]s δεν υπάρχει στην ετικέτα %[2]s
|
||||
|
||||
|
@ -1226,7 +1228,7 @@ migrate.migrating_failed_no_addr=Η μεταφορά απέτυχε.
|
|||
migrate.github.description=Μεταφορά δεδομένων από το github.com ή διακομιστές GitHub Enterprise.
|
||||
migrate.git.description=Μεταφορά μόνο του αποθετηρίου από μια οποιαδήποτε υπηρεσία Git.
|
||||
migrate.gitlab.description=Μεταφορά δεδομένων από το gitlab.com ή άλλες εγκαταστάσεις GitLab.
|
||||
migrate.gitea.description=Μεταφορά δεδομένων από το gitea.com ή άλλες εγκαταστάσεις Gitea/Forgejo.
|
||||
migrate.gitea.description=Μεταφορά δεδομένων από το gitea.com ή άλλες εγκαταστάσεις Gitea.
|
||||
migrate.gogs.description=Μεταφορά δεδομένων από το notabug.org ή άλλες εγκαταστάσεις Gogs.
|
||||
migrate.onedev.description=Μεταφορά δεδομένων από το code.onedev.io ή άλλες εγκαταστάσεις OneDev.
|
||||
migrate.codebase.description=Μεταφορά δεδομένων από το codebasehq.com.
|
||||
|
@ -1266,7 +1268,7 @@ empty_message=Αυτό το repository δεν έχει περιεχόμενο.
|
|||
broken_message=Τα δεδομένα Git που διέπουν αυτό το αποθετήριο δεν μπορούν να διαβαστούν. Επικοινωνήστε με το διαχειριστή ή διαγράψτε αυτό το repository.
|
||||
|
||||
code=Κώδικας
|
||||
code.desc=Πρόσβαση στον πηγαίο κώδικα, αρχεία, υποβολές και κλάδους.
|
||||
code.desc=Πρόσβαση στον πηγαίο κώδικα, αρχεία, commits και κλάδους.
|
||||
branch=Κλάδος
|
||||
tree=Δέντρο
|
||||
clear_ref=`Καθαρισμός τρέχουσας αναφοράς`
|
||||
|
@ -1284,8 +1286,8 @@ org_labels_desc=Οι ταμπέλες, που ισχύουν για ολόκλη
|
|||
org_labels_desc_manage=διαχείριση
|
||||
|
||||
milestones=Ορόσημα
|
||||
commits=Υποβολές
|
||||
commit=Υποβολή
|
||||
commits=Commits
|
||||
commit=Commit
|
||||
release=Κυκλοφορία
|
||||
releases=Κυκλοφορίες
|
||||
tag=Ετικέτα
|
||||
|
@ -1314,16 +1316,17 @@ view_git_blame=Προβολή git blame
|
|||
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
|
||||
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
|
||||
stored_lfs=Αποθηκεύτηκε με το Git LFS
|
||||
stored_annex=Αποθηκεύτηκε με το Git Annex
|
||||
symbolic_link=Symbolic link
|
||||
executable_file=Εκτελέσιμο αρχείο
|
||||
commit_graph=Γράφημα υποβολών
|
||||
commit_graph=Γράφημα commit
|
||||
commit_graph.select=Επιλογή κλάδων
|
||||
commit_graph.hide_pr_refs=Απόκρυψη pull request
|
||||
commit_graph.monochrome=Μονόχρωμο
|
||||
commit_graph.color=Έγχρωμο
|
||||
commit.contained_in=Αυτή η υποβολή περιλαμβάνεται σε:
|
||||
commit.contained_in_default_branch=Αυτή η υποβολή είναι μέρος του προεπιλεγμένου κλάδου
|
||||
commit.load_referencing_branches_and_tags=Φόρτωση κλάδων και ετικετών που παραπέμπουν σε αυτήν την υποβολή
|
||||
commit.contained_in=Αυτό το commit περιλαμβάνεται σε:
|
||||
commit.contained_in_default_branch=Αυτό το commit αποτελεί μέρος του προεπιλεγμένου κλάδου
|
||||
commit.load_referencing_branches_and_tags=Φόρτωση κλάδων και ετικετών που παραπέμπουν σε αυτό το commit
|
||||
blame=Ευθύνη
|
||||
download_file=Λήψη αρχείου
|
||||
normal_view=Κανονική Προβολή
|
||||
|
@ -1337,6 +1340,7 @@ editor.upload_file=Ανέβασμα αρχείου
|
|||
editor.edit_file=Επεξεργασία αρχείου
|
||||
editor.preview_changes=Προεπισκόπηση αλλαγών
|
||||
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||
editor.cannot_edit_annex_files=Τα αρχεία Annex δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
|
||||
editor.edit_this_file=Επεξεργασία αρχείου
|
||||
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
|
||||
|
@ -1360,12 +1364,12 @@ editor.patching=Επιδιόρθωση:
|
|||
editor.fail_to_apply_patch=`Αδυναμία εφαρμογής της επιδιόρθωσης "%s"`
|
||||
editor.new_patch=Νέο patch
|
||||
editor.commit_message_desc=Προσθήκη προαιρετικής εκτενούς περιγραφής…
|
||||
editor.signoff_desc=Προσθέστε ένα πρόσθετο Signed-off-by στο τέλος του μηνύματος καταγραφής της υποβολής.
|
||||
editor.commit_directly_to_this_branch=Υποβολή απευθείας στο κλάδο <strong class="%[2]s">%[1]s</strong>.
|
||||
editor.create_new_branch=Δημιουργήστε έναν <strong>νέο κλάδο</strong> για αυτή την υποβολή και ξεκινήστε ένα pull request.
|
||||
editor.create_new_branch_np=Δημιουργήστε έναν <strong>νέο κλάδο</strong> για αυτή την υποβολή.
|
||||
editor.signoff_desc=Προσθέστε ένα πρόσθετο Signed-off-by στο τέλος του μηνύματος καταγραφής του commit.
|
||||
editor.commit_directly_to_this_branch=Υποβολή commit απευθείας στο κλάδο <strong class="%[2]s">%[1]s</strong>.
|
||||
editor.create_new_branch=Δημιουργήστε έναν <strong>νέο κλάδο</strong> για αυτό το commit και δημιουργήστε ένα pull request.
|
||||
editor.create_new_branch_np=Δημιουργήστε έναν <strong>νέο κλάδο</strong> για αυτό το commit.
|
||||
editor.propose_file_change=Πρόταση αλλαγής αρχείου
|
||||
editor.new_branch_name=Ονόμασε τον νέο κλάδο για αυτήν την υποβολή
|
||||
editor.new_branch_name=Ονόμασε τον νέο κλάδο για αυτό το commit
|
||||
editor.new_branch_name_desc=Όνομα νέου κλάδου…
|
||||
editor.cancel=Ακύρωση
|
||||
editor.filename_cannot_be_empty=Το όνομα αρχείου δεν μπορεί να είναι κενό.
|
||||
|
@ -1377,9 +1381,9 @@ editor.file_is_a_symlink=`Το «%s» είναι συμβολικός σύνδε
|
|||
editor.filename_is_a_directory=Το όνομα αρχείου «%s» χρησιμοποιείται ήδη ως όνομα φακέλου σε αυτό το repository.
|
||||
editor.file_editing_no_longer_exists=Το αρχείο «%s», το οποίο επεξεργάζεστε, δεν υπάρχει πλέον σε αυτό το repository.
|
||||
editor.file_deleting_no_longer_exists=Το αρχείο «%s», το οποίο διαγράφεται, δεν υπάρχει πλέον σε αυτό το repository.
|
||||
editor.file_changed_while_editing=Προέκυψαν κάποιες αλλαγές στα περιεχόμενα του αρχείου από τότε που ξεκινήσατε να τα επεξεργάζεστε. <a target="_blank" rel="noopener noreferrer" href="%s">Κάντε κλικ εδώ</a> για να τα δείτε ή <strong>ξανακάντε μία υποβολή των αλλαγών σας</strong> για να τις αντικαταστήσετε.
|
||||
editor.file_changed_while_editing=Προέκυψαν κάποιες αλλαγές στα περιεχόμενα του αρχείου από τότε που ξεκινήσατε να τα επεξεργάζεστε. <a target="_blank" rel="noopener noreferrer" href="%s">Κάντε κλικ εδώ</a> για να τα δείτε ή <strong>ξανακάνετε μία υποβολή των αλλαγών σας</strong> για να τις αντικαταστήσετε.
|
||||
editor.file_already_exists=Υπάρχει ήδη ένα αρχείο με το όνομα «%s» σε αυτό το repository.
|
||||
editor.commit_empty_file_header=Υποβολή ενός κενού αρχείου
|
||||
editor.commit_empty_file_header=Commit κενού αρχείου
|
||||
editor.commit_empty_file_text=Το αρχείο που πρόκειται να υποβληθεί είναι κενό. Συνέχεια;
|
||||
editor.no_changes_to_show=Δεν υπάρχουν αλλαγές για εμφάνιση.
|
||||
editor.fail_to_update_file=Αποτυχία ενημέρωσης/δημιουργίας του αρχείου «%s».
|
||||
|
@ -1399,8 +1403,8 @@ editor.cherry_pick=Ανθολόγηση (cherry-pick) του %s σε:
|
|||
editor.revert=Απόσυρση του %s στο:
|
||||
|
||||
commits.desc=Δείτε το ιστορικό αλλαγών του πηγαίου κώδικα.
|
||||
commits.commits=Υποβολές
|
||||
commits.no_commits=Δεν υπάρχουν κοινές υποβολές. Τα «%s» και «%s» έχουν εντελώς διαφορετικές ιστορίες.
|
||||
commits.commits=Commits
|
||||
commits.no_commits=Δεν υπάρχουν κοινά commit. Τα «%s» και «%s» έχουν εντελώς διαφορετικές ιστορίες.
|
||||
commits.nothing_to_compare=Αυτοί οι κλάδοι είναι όμοιοι.
|
||||
commits.search=Αναζήτηση υποβολών…
|
||||
commits.search.tooltip=Μπορείτε να προθέτετε τις λέξεις-κλειδιά με "author:", "committer:", "after:", ή "before:", π.χ. "επαναφορά author:Alice before:2019-01-13".
|
||||
|
@ -1835,9 +1839,9 @@ pulls.show_all_commits=Εμφάνιση όλων των υποβολών
|
|||
pulls.show_changes_since_your_last_review=Εμφάνιση αλλαγών από την τελευταία αξιολόγηση
|
||||
pulls.showing_only_single_commit=Εμφάνιση μόνο αλλαγών της υποβολής %[1]s
|
||||
pulls.showing_specified_commit_range=Εμφάνιση μόνο των αλλαγών μεταξύ %[1]s..%[2]s
|
||||
pulls.select_commit_hold_shift_for_range=Επιλέξτε υποβολή. Κρατήστε πατημένο το shift + κάντε κλικ για να επιλέξετε ένα εύρος
|
||||
pulls.select_commit_hold_shift_for_range=Επιλέξτε commit. Κρατήστε πατημένο το shift + κάντε κλικ για να επιλέξετε ένα εύρος
|
||||
pulls.review_only_possible_for_full_diff=Η αξιολόγηση είναι δυνατή μόνο κατά την προβολή της πλήρης διαφοράς
|
||||
pulls.filter_changes_by_commit=Φιλτράρισμα κατά υποβολή
|
||||
pulls.filter_changes_by_commit=Φιλτράρισμα κατά commit
|
||||
pulls.nothing_to_compare=Αυτοί οι κλάδοι είναι ίδιοι. Δεν χρειάζεται να δημιουργήσετε ένα pull request.
|
||||
pulls.nothing_to_compare_and_allow_empty_pr=Αυτοί οι κλάδοι είναι ίδιοι. Αυτό το PR θα είναι κενό.
|
||||
pulls.has_pull_request=`Υπάρχει ήδη pull request μεταξύ αυτών των κλάδων: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
|
@ -1846,7 +1850,7 @@ pulls.title_desc_few=θέλει να συγχωνεύσει %[1]d υποβολέ
|
|||
pulls.merged_title_desc_few=συγχώνευσε %[1]d υποβολές από <code>%[2]s</code> σε <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`άλλαξε τον κλάδο προορισμού από <b>%s</b> σε <b>%s</b> %s`
|
||||
pulls.tab_conversation=Συζήτηση
|
||||
pulls.tab_commits=Υποβολές
|
||||
pulls.tab_commits=Commits
|
||||
pulls.tab_files=Αλλαγμένα αρχεία
|
||||
pulls.reopen_to_merge=Παρακαλώ ανοίξτε ξανά αυτό το pull request για να εκτελέσετε μια συγχώνευση.
|
||||
pulls.cant_reopen_deleted_branch=Αυτό το pull request δεν μπορεί να ανοίξει ξανά επειδή ο κλάδος διαγράφηκε.
|
||||
|
@ -1865,7 +1869,7 @@ pulls.data_broken=Αυτό το pull request είναι κατεστραμμέν
|
|||
pulls.files_conflicted=Αυτό το pull request περιέχει αλλαγές που συγκρούονται με το κλάδο προορισμού.
|
||||
pulls.is_checking=Ο έλεγχος συγκρούσεων κατά την συγχώνευση βρίσκεται σε εξέλιξη. Δοκιμάστε ξανά σε λίγα λεπτά.
|
||||
pulls.is_ancestor=Αυτός ο κλάδος δεν περιέχει κάτι καινούργιο που δεν έχει ο κλάδος προορισμού ήδη. Δεν υπάρχει τίποτα που θα μπορούσε να συγχωνευτεί.
|
||||
pulls.is_empty=Οι αλλαγές σε αυτόν τον κλάδο βρίσκονται ήδη στον κλάδο προορισμού. Θα είναι μια κενή υποβολή.
|
||||
pulls.is_empty=Οι αλλαγές σε αυτόν τον κλάδο βρίσκονται ήδη στον κλάδο προορισμού. Θα είναι ένα κενό commit.
|
||||
pulls.required_status_check_failed=Ορισμένοι απαιτούμενοι έλεγχοι δεν ήταν επιτυχείς.
|
||||
pulls.required_status_check_missing=Λείπουν ορισμένοι απαιτούμενοι έλεγχοι.
|
||||
pulls.required_status_check_administrator=Ως διαχειριστής, μπορείτε ακόμα να συγχωνεύσετε αυτό το pull request.
|
||||
|
@ -1886,25 +1890,25 @@ pulls.reject_count_1=%d αίτημα αλλαγής
|
|||
pulls.reject_count_n=%d αιτήματα αλλαγής
|
||||
pulls.waiting_count_1=%d αναμονή αξιολόγησης
|
||||
pulls.waiting_count_n=%d αναμονές αξιολόγησης
|
||||
pulls.wrong_commit_id=Το αναγνωριστικό της υποβολής πρέπει να αντιστοιχεί σε μία υποβολή στον κλάδο προορισμού
|
||||
pulls.wrong_commit_id=Το αναγνωριστικό του commit πρέπει να αντιστοιχεί σε μία υποβολή στον κλάδο προορισμού
|
||||
|
||||
pulls.no_merge_desc=Αυτό το pull request δεν μπορεί να συγχωνευθεί επειδή όλες οι επιλογές συγχώνευσης αποθετηρίων είναι απενεργοποιημένες.
|
||||
pulls.no_merge_helper=Ενεργοποιήστε τις επιλογές συγχώνευσης στις ρυθμίσεις αποθετηρίου ή συγχωνεύστε το pull request χειροκίνητα.
|
||||
pulls.no_merge_wip=Αυτό το pull request δεν μπορεί να συγχωνευθεί, επειδή έχει επισημανθεί ως μια εργασία σε εξέλιξη.
|
||||
pulls.no_merge_not_ready=Αυτό το pull request δεν είναι έτοιμο για συγχώνευση, ελέγξτε την κατάσταση εξέτασης και τους ελέγχους κατάστασης.
|
||||
pulls.no_merge_access=Δεν είστε εξουσιοδοτημένοι να συγχωνεύσετε αυτό το pull request.
|
||||
pulls.merge_pull_request=Δημιουργία υποβολής συγχώνευσης
|
||||
pulls.merge_pull_request=Δημιουργία commit συγχώνευσης
|
||||
pulls.rebase_merge_pull_request=Αλλαγή βάσης και μετά γρήγορα-μπροστά
|
||||
pulls.rebase_merge_commit_pull_request=Αλλαγής βάσης και δημιουργία υποβολής συγχώνευσης
|
||||
pulls.squash_merge_pull_request=Δημιουργία υποβολής squash
|
||||
pulls.rebase_merge_commit_pull_request=Αλλαγής βάσης και δημιουργία commit συγχώνευσης
|
||||
pulls.squash_merge_pull_request=Δημιουργία squash commit
|
||||
pulls.merge_manually=Συγχωνεύτηκαν χειροκίνητα
|
||||
pulls.merge_commit_id=Το ID της υποβολής συγχώνευσης
|
||||
pulls.require_signed_wont_sign=Ο κλάδος απαιτεί υπογεγραμμένες υποβολές αλλά αυτή η συγχώνευση δεν θα υπογραφεί
|
||||
pulls.merge_commit_id=Το ID του commit συγχώνευσης
|
||||
pulls.require_signed_wont_sign=Ο κλάδος απαιτεί υπογεγραμμένες commits αλλά αυτή η συγχώνευση δεν θα υπογραφεί
|
||||
|
||||
pulls.invalid_merge_option=Δεν μπορείτε να χρησιμοποιήσετε αυτήν την επιλογή συγχώνευσης για αυτό το pull request.
|
||||
pulls.merge_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά τη συγχώνευση. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
|
||||
pulls.merge_conflict_summary=Μήνυμα σφάλματος
|
||||
pulls.rebase_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά την αλλαγή βάσης της υποβολής: %[1]s. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
|
||||
pulls.rebase_conflict=Η συγχώνευση απέτυχε: Προέκυψε σύγκρουση κατά το rebase του commit: %[1]s. Συμβουλή: Δοκιμάστε μία διαφορετική στρατηγική
|
||||
pulls.rebase_conflict_summary=Μήνυμα σφάλματος
|
||||
pulls.unrelated_histories=H συγχώνευση απέτυχε: Η κεφαλή και η βάση της συγχώνευσης δεν έχουν κοινή ιστορία. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική
|
||||
pulls.merge_out_of_date=Η συγχώνευση απέτυχε: Κατά τη δημιουργία της συγχώνευσης, η βάση ενημερώθηκε. Συμβουλή: Προσπαθήστε πάλι.
|
||||
|
@ -1935,9 +1939,9 @@ pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντο
|
|||
pulls.cmd_instruction_checkout_title=Έλεγχος
|
||||
pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
|
||||
pulls.cmd_instruction_merge_title=Συγχώνευση
|
||||
pulls.cmd_instruction_merge_desc=Συγχώνευση των αλλαγών και ενημέρωση στο Gitea.
|
||||
pulls.cmd_instruction_merge_desc=Συγχώνευση των αλλαγών και ενημέρωση στο Forgejo.
|
||||
pulls.clear_merge_message=Εκκαθάριση μηνύματος συγχώνευσης
|
||||
pulls.clear_merge_message_hint=Η εκκαθάριση του μηνύματος συγχώνευσης θα αφαιρέσει μόνο το περιεχόμενο του μηνύματος υποβολής και θα διατηρήσει τα παραγόμενα git trailers όπως "Co-Authored-By …".
|
||||
pulls.clear_merge_message_hint=Η εκκαθάριση του μηνύματος συγχώνευσης θα αφαιρέσει μόνο το περιεχόμενο του μηνύματος commit και θα διατηρήσει τα παραγόμενα git trailers όπως "Co-Authored-By …".
|
||||
|
||||
pulls.auto_merge_button_when_succeed=(Όταν οι έλεγχοι πετύχουν)
|
||||
pulls.auto_merge_when_succeed=Αυτόματη συγχώνευση όταν όλοι οι έλεγχοι πετύχουν
|
||||
|
@ -1988,14 +1992,14 @@ milestones.filter_sort.most_complete=Περισσότερο πλήρη
|
|||
milestones.filter_sort.most_issues=Περισσότερα ζητήματα
|
||||
milestones.filter_sort.least_issues=Λιγότερα ζητήματα
|
||||
|
||||
signing.will_sign=Αυτή η υποβολή θα υπογραφεί με το κλειδί «%s».
|
||||
signing.wont_sign.error=Παρουσιάστηκε σφάλμα κατά τον έλεγχο για το αν η υποβολή μπορεί να υπογραφεί.
|
||||
signing.wont_sign.nokey=Ο διακομιστής δεν παρέχει κάποιο κλειδί για την υπογραφή αυτής της υποβολής (commit).
|
||||
signing.wont_sign.never=Οι υποβολές δεν υπογράφονται ποτέ.
|
||||
signing.wont_sign.always=Οι υποβολές υπογράφονται πάντα.
|
||||
signing.wont_sign.pubkey=Η υποβολή δε θα υπογραφεί επειδή δεν υπάρχει δημόσιο κλειδί που να συνδέεται με το λογαριασμό σας.
|
||||
signing.wont_sign.twofa=Πρέπει να έχετε ενεργοποιημένη την ταυτοποίηση δύο παραγόντων για να υπογράφεται υποβολές.
|
||||
signing.wont_sign.parentsigned=Η υποβολή δε θα υπογραφεί καθώς η γονική υποβολή δεν έχει υπογραφεί.
|
||||
signing.will_sign=Αυτό το commit θα υπογραφεί με το κλειδί «%s».
|
||||
signing.wont_sign.error=Παρουσιάστηκε σφάλμα κατά τον έλεγχο για το αν το commit μπορεί να υπογραφεί.
|
||||
signing.wont_sign.nokey=Ο διακομιστής δεν παρέχει κάποιο κλειδί για την υπογραφή αυτού του commit.
|
||||
signing.wont_sign.never=Τα commits δεν υπογράφονται ποτέ.
|
||||
signing.wont_sign.always=Τα commit υπογράφονται πάντα.
|
||||
signing.wont_sign.pubkey=To ψομμιτ δε θα υπογραφεί επειδή δεν υπάρχει δημόσιο κλειδί που συσχετίζεται με τον λογαριασμό σας.
|
||||
signing.wont_sign.twofa=Πρέπει να έχετε ενεργοποιημένη την ταυτοποίηση δύο παραγόντων για την υπογραφή commit.
|
||||
signing.wont_sign.parentsigned=To commit δεν θα υπογραφεί καθώς το προηγούμενο commit δεν έχει υπογραφεί.
|
||||
signing.wont_sign.basesigned=Η συγχώνευση δε θα υπογραφεί καθώς η βασική υποβολή δεν έχει υπογραφή της βάσης.
|
||||
signing.wont_sign.headsigned=Η συγχώνευση δε θα υπογραφεί καθώς δεν έχει υπογραφή η υποβολή της κεφαλής.
|
||||
signing.wont_sign.commitssigned=Η συγχώνευση δε θα υπογραφεί καθώς όλες οι σχετικές υποβολές δεν έχουν υπογραφεί.
|
||||
|
@ -2017,7 +2021,7 @@ wiki.page_title=Τίτλος σελίδας
|
|||
wiki.page_content=Περιεχόμενο σελίδας
|
||||
wiki.default_commit_message=Γράψτε μια σημείωση σχετικά με αυτή την ενημέρωση σελίδας (προαιρετικό).
|
||||
wiki.save_page=Αποθήκευση σελίδας
|
||||
wiki.last_commit_info=%s επεξεργάστηκε αυτή τη σελίδα %s
|
||||
wiki.last_commit_info=%s επεξεργάστηκε την σελίδα %s
|
||||
wiki.edit_page_button=Επεξεργασία
|
||||
wiki.new_page_button=Νέα σελίδα
|
||||
wiki.file_revision=Έκδοση σελίδας
|
||||
|
@ -2076,14 +2080,14 @@ activity.title.releases_1=%d κυκλοφορία
|
|||
activity.title.releases_n=%d εκδόσεις
|
||||
activity.title.releases_published_by=%s δημοσιεύτηκε από %s
|
||||
activity.published_release_label=Δημοσίευση
|
||||
activity.no_git_activity=Δεν έχει υπάρξει καμία δραστηριότητα υποβολών σε αυτήν την περίοδο.
|
||||
activity.no_git_activity=Δεν έχει υπάρξει καμία δραστηριότητα commit σε αυτήν την περίοδο.
|
||||
activity.git_stats_exclude_merges=Εκτός τις συγχωνεύσεις,
|
||||
activity.git_stats_author_1=%d συγγραφέας
|
||||
activity.git_stats_author_n=%d συγγραφείς
|
||||
activity.git_stats_pushed_1=έχει ωθήσει
|
||||
activity.git_stats_pushed_n=έχουν ωθήσει
|
||||
activity.git_stats_commit_1=%d υποβολή
|
||||
activity.git_stats_commit_n=%d υποβολές
|
||||
activity.git_stats_commit_1=%d commit
|
||||
activity.git_stats_commit_n=%d commits
|
||||
activity.git_stats_push_to_branch=στο %s και
|
||||
activity.git_stats_push_to_all_branches=σε όλους τους κλάδους.
|
||||
activity.git_stats_on_default_branch=Στο %s,
|
||||
|
@ -2098,7 +2102,7 @@ activity.git_stats_and_deletions=και
|
|||
activity.git_stats_deletion_1=%d διαγραφή
|
||||
activity.git_stats_deletion_n=%d διαγραφές
|
||||
|
||||
contributors.contribution_type.commits=Υποβολές
|
||||
contributors.contribution_type.commits=Commits
|
||||
|
||||
search=Αναζήτηση
|
||||
search.search_repo=Αναζήτηση αποθετηρίου
|
||||
|
@ -2124,7 +2128,7 @@ settings.hooks=Webhooks
|
|||
settings.githooks=Git hooks
|
||||
settings.basic_settings=Βασικές ρυθμίσεις
|
||||
settings.mirror_settings=Ρυθμίσεις ειδώλου
|
||||
settings.mirror_settings.docs=Ρυθμίστε τον αυτόματο συγχρονισμό των commit, ετικετών και κλάδων του αποθετηρίου σας σε ένα άλλο repository.
|
||||
settings.mirror_settings.docs=Ρυθμίστε τον αυτόματο συγχρονισμό commit, ετικετών και κλάδων του αποθετηρίου σας σε ένα άλλο repository.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Ρυθμίστε τον αυτόματο συγχρονισμό των commit, ετικετών και κλάδων του έργου σας με ένα άλλο repository. Τα είδωλα τύπου λήψης έχουν απενεργοποιηθεί από τον διαχειριστή σας.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions=Ρυθμίστε την αυτόματη λήψη υποβολών, ετικετών και κλάδων από ένα άλλο repository.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Αυτή τη στιγμή, αυτό μπορεί να γίνει μόνο στο μενού "Νέα Μεταφορά". Για περισσότερες πληροφορίες, συμβουλευτείτε το:
|
||||
|
@ -2193,11 +2197,11 @@ settings.admin_settings=Ρυθμίσεις διαχειριστή
|
|||
settings.admin_enable_health_check=Ενεργοποίηση ελέγχων υγείας αποθετηρίων (git fsck)
|
||||
settings.admin_code_indexer=Indexer κώδικα
|
||||
settings.admin_stats_indexer=Indexer στατιστικών κώδικα
|
||||
settings.admin_indexer_commit_sha=Τελευταίο indexed SHA
|
||||
settings.admin_indexer_commit_sha=Τελευταίο indexed commit
|
||||
settings.admin_indexer_unindexed=Unindexed
|
||||
settings.reindex_button=Προσθήκη στην ουρά Reindex
|
||||
settings.reindex_requested=Αιτήθηκε reindex
|
||||
settings.admin_enable_close_issues_via_commit_in_any_branch=Κλείσιμο ενός ζητήματος μέσω μιας υποβολής που έγινε σε έναν μη προεπιλεγμένο κλάδο
|
||||
settings.admin_enable_close_issues_via_commit_in_any_branch=Κλείσιμο ενός ζητήματος μέσω commit που έγινε σε έναν μη'προεπιλεγμένο κλάδο
|
||||
settings.danger_zone=Ζώνη κινδύνου
|
||||
settings.new_owner_has_same_repo=Ο νέος ιδιοκτήτης έχει ήδη ένα repository με το ίδιο όνομα. Παρακαλώ επιλέξτε ένα άλλο όνομα.
|
||||
settings.convert=Μετατροπή σε κανονικό repository
|
||||
|
@ -2446,9 +2450,9 @@ settings.protect_approvals_whitelist_enabled_desc=Μόνο κριτικές απ
|
|||
settings.protect_approvals_whitelist_users=Εγκεκριμένοι εξεταστές:
|
||||
settings.protect_approvals_whitelist_teams=Λίστα επιτρεπόμενων ομάδων για κριτικές:
|
||||
settings.dismiss_stale_approvals=Παράβλεψη καθυστερημένων εγκρίσεων
|
||||
settings.dismiss_stale_approvals_desc=Όταν οι νέες υποβολές που αλλάζουν το περιεχόμενο του pull request γίνονται push στο κλάδο, οι παλιές εγκρίσεις απορρίπτονται.
|
||||
settings.require_signed_commits=Να απαιτούνται υπογεγραμμένες υποβολές
|
||||
settings.require_signed_commits_desc=Απόρριψη νέων υποβολών σε αυτόν τον κλάδο εάν είναι μη υπογεγραμμένες ή μη επαληθεύσιμες.
|
||||
settings.dismiss_stale_approvals_desc=Όταν νέα commit που αλλάζουν το περιεχόμενο του pull request γίνονται push στο κλάδο, οι παλιές εγκρίσεις απορρίπτονται.
|
||||
settings.require_signed_commits=Να απαιτούνται υπογεγραμμένα commit
|
||||
settings.require_signed_commits_desc=Απόρριψη νέων commit σε αυτόν τον κλάδο εάν είναι μη υπογεγραμμένες ή μη επαληθεύσιμες.
|
||||
settings.protect_branch_name_pattern=Μοτίβο προστατευμένου ονόματος κλάδου
|
||||
settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε <a href="%s">την τεκμηρίωση</a> για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/**
|
||||
settings.protect_patterns=Μοτίβα
|
||||
|
@ -2469,7 +2473,7 @@ settings.block_on_official_review_requests=Φραγή συγχώνευσης σ
|
|||
settings.block_on_official_review_requests_desc=Η συγχώνευση δεν θα είναι δυνατή όταν θα έχει αιτήσεις επίσημης αξιολόγησης, ακόμη και αν υπάρχουν αρκετές εγκρίσεις.
|
||||
settings.block_outdated_branch=Φραγή συγχώνευσης αν το pull request είναι ξεπερασμένο
|
||||
settings.block_outdated_branch_desc=Η συγχώνευση δεν θα είναι δυνατή όταν ο κλάδος κεφαλής είναι πίσω από τον βασικό κλάδο.
|
||||
settings.default_branch_desc=Επιλέξτε έναν προεπιλεγμένο κλάδο αποθετηρίου για pull requests και υποβολές κώδικα:
|
||||
settings.default_branch_desc=Επιλέξτε έναν προεπιλεγμένο κλάδο αποθετηρίου για pull requests και commit
|
||||
settings.merge_style_desc=Στυλ συγχώνευσης
|
||||
settings.default_merge_style_desc=Προεπιλεγμένο στυλ συγχώνευσης
|
||||
settings.choose_branch=Επιλέξτε έναν κλάδο…
|
||||
|
@ -2496,7 +2500,7 @@ settings.matrix.room_id=ID Δωματίου
|
|||
settings.matrix.message_type=Είδος μηνύματος
|
||||
settings.archive.button=Αρχειοθέτηση αποθετηρίου
|
||||
settings.archive.header=Αρχειοθέτηση αποθετηρίου
|
||||
settings.archive.text=Η αρχειοθέτηση του αποθετηρίου θα το αλλάξει σε μόνο για ανάγνωση. Δε θα φαίνεται στον αρχικό πίνακα. Κανείς (ακόμα και εσείς!) δε θα μπορεί να κάνει νέες υποβολές, ή να ανοίξει ζητήματα ή pull request.
|
||||
settings.archive.text=Η αρχειοθέτηση του αποθετηρίου θα το αλλάξει σε μόνο για ανάγνωση. Δε θα φαίνεται στον αρχικό πίνακα. Κανείς (ακόμα και εσείς!) δε θα μπορεί να υποβάλει νέα commit, ή να ανοίξει ζητήματα ή pull request.
|
||||
settings.archive.success=Το repository αρχειοθετήθηκε με επιτυχία.
|
||||
settings.archive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια αρχειοθέτησης του αποθετηρίου. Δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες.
|
||||
settings.archive.error_ismirror=Δε μπορείτε να αρχειοθετήσετε ένα είδωλο αποθετηρίου.
|
||||
|
@ -2504,15 +2508,15 @@ settings.archive.branchsettings_unavailable=Οι ρυθμίσεις του κλ
|
|||
settings.archive.tagsettings_unavailable=Οι ρυθμίσεις της ετικέτας δεν είναι διαθέσιμες αν το repository είναι αρχειοθετημένο.
|
||||
settings.unarchive.button=Αναίρεση αρχειοθέτησης αποθετηρίου
|
||||
settings.unarchive.header=Απο-Αρχειοθέτηση του αποθετηρίου
|
||||
settings.unarchive.text=Η απο-αρχειοθέτηση του αποθετηρίου θα αποκαταστήσει την ικανότητά του να λαμβάνει υποβολές και ωθήσεις, καθώς και νέα ζητήματα και pull-requests.
|
||||
settings.unarchive.text=Η απο-αρχειοθέτηση του αποθετηρίου θα αποκαταστήσει την ικανότητά του να λαμβάνει commits και ωθήσεις, καθώς και νέα ζητήματα και pull-requests.
|
||||
settings.unarchive.success=Το repository απο-αρχειοθετήθηκε με επιτυχία.
|
||||
settings.unarchive.error=Παρουσιάστηκε σφάλμα κατά την προσπάθεια απο-αρχειοθέτησης του αποθετηρίου. Δείτε τις καταγραφές για περισσότερες λεπτομέρειες.
|
||||
settings.update_avatar_success=Η εικόνα του αποθετηρίου έχει ενημερωθεί.
|
||||
settings.lfs=LFS
|
||||
settings.lfs_filelist=Αρχεία LFS σε αυτό το repository
|
||||
settings.lfs_no_lfs_files=Δεν υπάρχουν αρχεία LFS σε αυτό το repository
|
||||
settings.lfs_findcommits=Εύρεση υποβολών
|
||||
settings.lfs_lfs_file_no_commits=Δεν βρέθηκαν υποβολές για αυτό το αρχείο LFS
|
||||
settings.lfs_findcommits=Εύρεση commit
|
||||
settings.lfs_lfs_file_no_commits=Δεν βρέθηκαν commit για αυτό το αρχείο LFS
|
||||
settings.lfs_noattribute=Αυτή η διαδρομή δεν έχει λειτουργία κλειδώματος στον προεπιλεγμένο κλάδο
|
||||
settings.lfs_delete=Διαγραφή αρχείου LFS με το OID %s
|
||||
settings.lfs_delete_warning=Η διαγραφή ενός αρχείου LFS μπορεί να προκαλέσει σφάλματα «object does not exist» κατά την ολοκλήρωση του checkout. Είστε βέβαιοι;
|
||||
|
@ -2542,7 +2546,7 @@ settings.rename_branch=Μετονομασία κλάδου
|
|||
|
||||
diff.browse_source=Προβολή πηγαίου κώδικα
|
||||
diff.parent=γονέας
|
||||
diff.commit=υποβολή
|
||||
diff.commit=commit
|
||||
diff.git-notes=Σημειώσεις
|
||||
diff.data_not_available=Δεν υπάρχει διαθέσιμο περιεχόμενο diff
|
||||
diff.options_button=Επιλογές diff
|
||||
|
@ -2607,7 +2611,7 @@ release.prerelease=Προδημοσίευση
|
|||
release.stable=Σταθερή
|
||||
release.compare=Σύγκριση
|
||||
release.edit=επεξεργασία
|
||||
release.ahead.commits=<strong>%d</strong> υποβολές
|
||||
release.ahead.commits=<strong>%d</strong> commits
|
||||
release.ahead.target=σε %s από αυτή την έκδοση
|
||||
tag.ahead.target=μέχρι το %s από αυτή την ετικέτα
|
||||
release.source_code=Πηγαίος κώδικας
|
||||
|
@ -2630,7 +2634,7 @@ release.edit_release=Ενημέρωση κυκλοφορίας
|
|||
release.delete_release=Διαγραφή κυκλοφορίας
|
||||
release.delete_tag=Διαγραφή ετικέτας
|
||||
release.deletion=Διαγραφή κυκλοφορίας
|
||||
release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Gitea. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια;
|
||||
release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Forgejo. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια;
|
||||
release.deletion_success=Η κυκλοφορία έχει διαγραφεί.
|
||||
release.deletion_tag_desc=Θα διαγράψει αυτή την ετικέτα από το repository. Τα περιεχόμενα του repository και το ιστορικό δεν θα πειραχτούν. Να γίνει συνέχεια;
|
||||
release.deletion_tag_success=Η ετικέτα έχει διαγραφεί.
|
||||
|
@ -2653,7 +2657,7 @@ branch.delete_html=Διαγραφή κλάδου
|
|||
branch.delete_desc=Η διαγραφή ενός κλάδου είναι μόνιμη. Αν και ο διαγραμμένος κλάδος μπορεί να συνεχίσει να υπάρχει για σύντομο χρονικό διάστημα πριν να αφαιρεθεί, ΔΕΝ ΜΠΟΡΕΙ να αναιρεθεί στις περισσότερες περιπτώσεις. Συνέχεια;
|
||||
branch.deletion_success=Ο κλάδος «%s» διαγράφηκε.
|
||||
branch.deletion_failed=Η διαγραφή του κλάδου «%s» απέτυχε.
|
||||
branch.delete_branch_has_new_commits=Ο κλάδος «%s» δεν μπορεί να διαγραφεί επειδή προστέθηκαν νέες υποβολές μετά τη συγχώνευση.
|
||||
branch.delete_branch_has_new_commits=Ο κλάδος «%s» δεν μπορεί να διαγραφεί επειδή προστέθηκαν νέα commit μετά τη συγχώνευση.
|
||||
branch.create_branch=Δημιουργία κλάδου %s
|
||||
branch.create_from=`από το «%s»`
|
||||
branch.create_success=Ο κλάδος «%s» δημιουργήθηκε.
|
||||
|
@ -2710,7 +2714,7 @@ settings.new_owner_blocked_doer = Ο νέος κάτοχος του αποθετ
|
|||
settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε:
|
||||
settings.confirmation_string = Κείμενο επιβεβαίωσης
|
||||
settings.units.overview = Επισκόπηση
|
||||
pulls.commit_ref_at = `ανέφερε το pull request στην υποβολή <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.commit_ref_at = `ανέφερε το pull request στο commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
contributors.contribution_type.filter_label = Είδος συνεισφοράς:
|
||||
settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια <strong>ΔΕΝ</strong> αναιρείται.
|
||||
activity.navbar.contributors = Συνεισφέροντες
|
||||
|
@ -2719,11 +2723,11 @@ contributors.contribution_type.deletions = Διαγραφές
|
|||
migrate.forgejo.description = Μεταφορά δεδομένων από το codeberg.org ή άλλων υπηρεσιών Forgejo.
|
||||
rss.must_be_on_branch = Για να αποκτήσετε ένα RSS feed, πρέπει να βρίσκεστε σε έναν κλάδο.
|
||||
clone_in_vscodium = Κλωνοποίηση στο VSCodium
|
||||
editor.invalid_commit_mail = Αυτή η διεύθυνση email δεν είναι έγκυρη για την δημιουργία μίας υποβολής.
|
||||
editor.invalid_commit_mail = Αυτή η διεύθυνση email δεν είναι έγκυρη για την δημιουργία commit.
|
||||
pulls.nothing_to_compare_have_tag = Ο επιλεγμένος κλάδος/tag είναι όμοιος.
|
||||
issues.blocked_by_user = Δεν μπορείτε να δημιουργήσετε ζητήματα σε αυτό το repository, επειδή ο κάτοχος του repository σας έχει αποκλείσει.
|
||||
pulls.agit_explanation = Δημιουργημένο μέσω του AGit. Το AGit επιτρέπει σε συνεισφέροντες να προτείνουν αλλαγές χρησιμοποιώντας την εντολή «git push», χωρίς την δημιουργία fork ή έναν νέο κλάδο.
|
||||
activity.navbar.recent_commits = Πρόσφατες υποβολές
|
||||
activity.navbar.recent_commits = Πρόσφατα commit
|
||||
settings.wiki_globally_editable = Να επιτρέπεται η επεξεργασία του wiki σε όλους
|
||||
admin.manage_flags = Διαχείριση σημάνσεων
|
||||
admin.enabled_flags = Το repository έχει τις εξής σημάνσεις:
|
||||
|
@ -2751,13 +2755,13 @@ settings.add_collaborator_blocked_our = Δεν είναι δυνατή η προ
|
|||
n_branch_few = %s κλάδοι
|
||||
n_tag_one = %s ετικέτα
|
||||
n_tag_few = %s ετικέτες
|
||||
n_commit_one = %s υποβολή
|
||||
n_commit_one = %s commit
|
||||
stars = Αστέρια
|
||||
n_branch_one = %s κλάδος
|
||||
commits.search_branch = Αυτός ο κλάδος
|
||||
pulls.title_desc_one = : θα ήθελε να συγχωνεύσει %[1]d υποβολή από τον κλάδο <code>%[2]s</code> στον κλάδο <code id="%[4]s">%[3]s</code>
|
||||
pulls.merged_title_desc_one = συγχώνευσε %[1]d υποβολή από τον κλάδο <code>%[2]s</code> στον κλάδο <code>%[3]s</code> %[4]s
|
||||
n_commit_few = %s υποβολές
|
||||
n_commit_few = %s commits
|
||||
settings.sourcehut_builds.secrets = Μυστικά
|
||||
settings.add_webhook.invalid_path = Η τοποθεσία του αρχείου δεν μπορεί να περιέχει κενά, «.» ή «..». Δεν μπορεί να αρχίζει ή να τελειώνει με μία κάθετο.
|
||||
commits.browse_further = Περιήγηση περισσοτέρων
|
||||
|
@ -2777,7 +2781,7 @@ settings.event_pull_request_enforcement = Εξαναγκασμός
|
|||
editor.commit_id_not_matching = Το αρχείο άλλαξε όσο το επεξεργαζόσασταν. Θα πρέπει να υποβάλετε τις αλλαγές σας σε έναν νέο κλάδο και μετά να τις συγχωνεύσετε.
|
||||
settings.sourcehut_builds.visibility = Ορατότητα εργασιών
|
||||
object_format = Μορφή αντικειμένων («object format»)
|
||||
settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερες υποβολές, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο.
|
||||
settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερα commit, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο.
|
||||
settings.archive.mirrors_unavailable = Οι λειτουργίες ειδώλου δεν είναι διαθέσιμες εφόσον το repository έχει αρχειοθετηθεί.
|
||||
settings.web_hook_name_sourcehut_builds = SourceHut Builds
|
||||
settings.enforce_on_admins = Εφαρμογή κανόνα σε διαχειριστές του αποθετηρίου
|
||||
|
@ -2821,7 +2825,7 @@ release.asset_name = Όνομα αρχείου
|
|||
release.asset_external_url = Εξωτερικό URL
|
||||
release.invalid_external_url = Μη έγκυρο εξωτερικό URL: «%s»
|
||||
no_eol.text = Λείπει το EOL
|
||||
activity.commit = Δραστηριότητα υποβολών
|
||||
activity.commit = Δραστηριότητα commit
|
||||
no_eol.tooltip = Αυτό το αρχείο δεν περιέχει έναν χαρακτήρα τύπου επιστροφής φορέα («end of line») στο τέλος του αρχείου.
|
||||
release.add_external_asset = Προσθήκη εξωτερικού αρχείου
|
||||
milestones.filter_sort.name = Όνομα
|
||||
|
@ -2829,13 +2833,26 @@ release.type_external_asset = Εξωτερικό αρχείο
|
|||
mirror_public_key = Δημόσιο κλειδί SSH
|
||||
mirror_use_ssh.helper = το Forgejo θα κατοπτρίσει το αποθετήριο μέσω Git με τη χρήση SSH και θα δημιουργήσει ένα ζεύγος κλειδιών. Πρέπει να εξασφαλίσετε πως το δημιουργημένο κλειδί είναι εξουσιοδοτημένο να ωθεί στο αποθετήριο προορισμού. Εφόσον το έχετε επιλέξει, δε μπορείτε να χρησιμοποιήσετε εξουσιοδότηση συνθηματικού.
|
||||
|
||||
new_from_template = Χρήση προτύπου
|
||||
new_from_template_description = Μπορείτε να χρησιμοποιήσετε ένα προυπάρχον πρότυπο αποθετηρίου και να εφαρμόσετε τις ρυθμίσεις του.
|
||||
new_advanced = Ρυθμίσεις για προχωρημένους
|
||||
new_advanced_expand = Κλικ για επέκταση
|
||||
auto_init_description = Δημιουργία αρχικού commit που περιέχει ένα αρχείο README, μαζί με τα αρχεία άδειας χρήσης και .gitignore προαιρετικά.
|
||||
mirror_use_ssh.text = Χρήση ταυτοποίησης SSH
|
||||
mirror_use_ssh.not_available = Η ταυτοποίηση μέσω SSH δεν είναι διαθέσιμη.
|
||||
mirror_denied_combination = Η χρήση ενός κλειδιού καθώς και ενός κωδικού για ταυτοποίηση ταυτόχρονα δεν είναι δυνατή.
|
||||
summary_card_alt = Κάρτα σύνοψης του αποθετηρίου %s
|
||||
editor.add_tmpl.filename = Όνομα αρχείου
|
||||
editor.commit_email = Email για commit
|
||||
issues.all_title = Όλα
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s
|
||||
component_loading = Γίνεται φόρτωση του %s...
|
||||
component_loading_info = Αυτό μπορεί να πάρει λίγη ώρα…
|
||||
component_failed_to_load = Προέκυψε ένα απρόσμενο σφάλμα.
|
||||
contributors.what = συνεισφορές
|
||||
recent_commits.what = πρόσφατες υποβολές
|
||||
recent_commits.what = πρόσφατα commit
|
||||
code_frequency.what = συχνότητα κώδικα
|
||||
|
||||
[org]
|
||||
|
@ -3172,12 +3189,12 @@ packages.size=Μέγεθος
|
|||
packages.published=Δημοσιευμένα
|
||||
|
||||
defaulthooks=Προεπιλεγμένα webhooks
|
||||
defaulthooks.desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούν ορισμένα γεγονότα στο Gitea. Τα Webhooks που ορίζονται εδώ είναι προκαθορισμένα και θα αντιγραφούν σε όλα τα νέα αποθετήρια. Διαβάστε περισσότερα στον οδηγό <a target="_blank" rel="noopener" href="%s">webhooks</a>.
|
||||
defaulthooks.desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούν ορισμένα γεγονότα στο Forgejo. Τα Webhooks που ορίζονται εδώ είναι προκαθορισμένα και θα αντιγραφούν σε όλα τα νέα αποθετήρια. Διαβάστε περισσότερα στον οδηγό <a target="_blank" rel="noopener" href="%s">webhooks</a>.
|
||||
defaulthooks.add_webhook=Προσθήκη Προεπιλεγμένου Webhook
|
||||
defaulthooks.update_webhook=Ενημέρωση Προεπιλεγμένου Webhook
|
||||
|
||||
systemhooks=Webhooks συστήματος
|
||||
systemhooks.desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούνται ορισμένα γεγονότα στο Gitea. Τα Webhooks που ορίζονται εδώ θα ενεργούν σε όλα τα αποθετήρια του συστήματος, γι 'αυτό παρακαλώ εξετάστε τυχόν επιπτώσεις απόδοσης που μπορεί να έχει. Διαβάστε περισσότερα στον οδηγό <a target="_blank" rel="noopener" href="%s">webhooks</a>.
|
||||
systemhooks.desc=Τα Webhooks κάνουν αυτόματα αιτήσεις HTTP POST σε ένα διακομιστή όταν ενεργοποιούνται ορισμένα γεγονότα στο Forgejo. Τα Webhooks που ορίζονται εδώ θα ενεργούν σε όλα τα αποθετήρια του συστήματος, γι 'αυτό παρακαλώ εξετάστε τυχόν επιπτώσεις απόδοσης που μπορεί να έχει. Διαβάστε περισσότερα στον οδηγό <a target="_blank" rel="noopener" href="%s">webhooks</a>.
|
||||
systemhooks.add_webhook=Προσθήκη Webhook Συστήματος
|
||||
systemhooks.update_webhook=Ενημέρωση Webhook Συστήματος
|
||||
|
||||
|
@ -3541,8 +3558,8 @@ push_tag=ώθησε την ετικέτα <a href="%[2]s">%[3]s</a> σε <a href
|
|||
delete_tag=διέγραψε την ετικέτα %[2]s από <a href="%[1]s">%[3]s</a>
|
||||
delete_branch=διέγραψε το κλάδο %[2]s από <a href="%[1]s">%[3]s</a>
|
||||
compare_branch=Σύγκριση
|
||||
compare_commits=Σύγκριση %d υποβολών
|
||||
compare_commits_general=Σύγκριση υποβολών
|
||||
compare_commits=Σύγκριση %d commit
|
||||
compare_commits_general=Σύγκριση commits
|
||||
mirror_sync_push=συγχρονιστήκαν οι υποβολές του <a href="%[2]s">%[3]s</a> στο <a href="%[1]s">%[4]s</a> από το είδωλο
|
||||
mirror_sync_create=συγχρονίστηκε η νέα αναφορά <a href="%[2]s">%[3]s</a> στο <a href="%[1]s">%[4]s</a> από το είδωλο
|
||||
mirror_sync_delete=συγχρόνισε και διάγραψε την αναφορά <code>%[2]s</code> σε <a href="%[1]s">%[3]s</a> από το είδωλο
|
||||
|
@ -3598,13 +3615,13 @@ no_subscriptions=Καμία συνδρομή
|
|||
[gpg]
|
||||
default_key=Υπογραφή με το προεπιλεγμένο κλειδί
|
||||
error.extract_sign=Αποτυχία εξαγωγής υπογραφής
|
||||
error.generate_hash=Αποτυχία δημιουργίας του κατακερματισμού (hash) της υποβολής
|
||||
error.no_committer_account=Δεν υπάρχει λογαριασμός συνδεδεμένος με τη διεύθυνση email του υποβολέα
|
||||
error.generate_hash=Αποτυχία δημιουργίας hash του commit
|
||||
error.no_committer_account=Δεν υπάρχει λογαριασμός που συσχετίζεται με τη διεύθυνση email του υποβολέα
|
||||
error.no_gpg_keys_found=Δεν βρέθηκε γνωστό κλειδί για αυτήν την υπογραφή στη βάση δεδομένων
|
||||
error.not_signed_commit=Η υποβολή δεν είναι υπογεγραμμένη
|
||||
error.not_signed_commit=Το commit δεν είναι υπογεγραμμένη
|
||||
error.failed_retrieval_gpg_keys=Αποτυχία ανάκτησης κλειδιού που είναι συνδεδεμένο στο λογαριασμό του υποβολέα
|
||||
error.probable_bad_signature=ΠΡΟΣΟΧΗ! Αν και υπάρχει ένα κλειδί με αυτό το ID στη βάση δεδομένων δεν επαληθεύει αυτή την υποβολή! Αυτή η υποβολή είναι ΥΠΟΠΤΗ.
|
||||
error.probable_bad_default_signature=ΠΡΟΣΟΧΗ! Αν και το προεπιλεγμένο κλειδί έχει αυτό το ID, δεν επαληθεύει αυτή την υποβολή! Αυτή η υποβολή είναι ΥΠΟΠΤΗ.
|
||||
error.probable_bad_signature=ΠΡΟΣΟΧΗ! Αν και υπάρχει ένα κλειδί με αυτό το ID στη βάση δεδομένων δεν επαληθεύει αυτό το commit! Αυτή η υποβολή είναι ΥΠΟΠΤΗ.
|
||||
error.probable_bad_default_signature=ΠΡΟΣΟΧΗ! Αν και το προεπιλεγμένο κλειδί έχει αυτό το ID, δεν επαληθεύει αυτό το commit! Αυτή η υποβολή είναι ΥΠΟΠΤΗ.
|
||||
|
||||
[units]
|
||||
unit=Μονάδα
|
||||
|
@ -3825,7 +3842,7 @@ runners.task_list.no_tasks=Δεν υπάρχει καμία εργασία ακ
|
|||
runners.task_list.run=Εκτέλεση
|
||||
runners.task_list.status=Κατάσταση
|
||||
runners.task_list.repository=Repository
|
||||
runners.task_list.commit=Υποβολή
|
||||
runners.task_list.commit=Commit
|
||||
runners.task_list.done_at=Ολοκλήρωσε Στις
|
||||
runners.edit_runner=Επεξεργασία Εκτελεστή
|
||||
runners.update_runner=Ενημέρωση αλλαγών
|
||||
|
@ -3846,7 +3863,7 @@ runners.reset_registration_token=Επαναφορά διακριτικού εγ
|
|||
runners.reset_registration_token_success=Επιτυχής επανέκδοση διακριτικού εγγραφής του εκτελεστή
|
||||
|
||||
runs.all_workflows=Όλες οι ροές εργασίας
|
||||
runs.commit=Υποβολή
|
||||
runs.commit=Commit
|
||||
runs.scheduled=Προγραμματισμένα
|
||||
runs.pushed_by=ωθήθηκε από
|
||||
runs.invalid_workflow_helper=Το αρχείο ροής εργασίας δεν είναι έγκυρο. Ελέγξτε το αρχείο σας: %s
|
||||
|
@ -3858,7 +3875,7 @@ runs.status_no_select=Όλες οι καταστάσεις
|
|||
runs.no_results=Δεν βρέθηκαν αποτελέσματα.
|
||||
runs.no_workflows=Δεν υπάρχουν ροές εργασίας ακόμα.
|
||||
runs.no_runs=Η ροή εργασίας δεν έχει τρέξει ακόμα.
|
||||
runs.empty_commit_message=(κενό μήνυμα υποβολής)
|
||||
runs.empty_commit_message=(κενό μήνυμα commit)
|
||||
|
||||
workflow.disable=Απενεργοποίηση ροής εργασίας
|
||||
workflow.disable_success=Η ροή εργασίας «%s» απενεργοποιήθηκε επιτυχώς.
|
||||
|
@ -3920,7 +3937,7 @@ code_search_by_git_grep = Για την αναζήτηση κώδικα, χρη
|
|||
package_kind = Αναζήτηση πακέτων...
|
||||
project_kind = Αναζήτηση έργων...
|
||||
branch_kind = Αναζήτηση κλάδων...
|
||||
commit_kind = Αναζήτηση υποβολών...
|
||||
commit_kind = Αναζήτηση commit...
|
||||
no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα.
|
||||
search = Αναζήτηση...
|
||||
type_tooltip = Είδος αναζήτησης
|
||||
|
|
|
@ -644,6 +644,7 @@ team_name_been_taken = The team name is already taken.
|
|||
team_no_units_error = Allow access to at least one repository section.
|
||||
email_been_used = The email address is already used.
|
||||
email_invalid = The email address is invalid.
|
||||
email_domain_is_not_allowed = The domain of the user's email address <b>%s</b> conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST. Make sure you have set the email address correctly.
|
||||
openid_been_used = The OpenID address "%s" is already used.
|
||||
username_password_incorrect = Username or password is incorrect.
|
||||
password_complexity = Password does not pass complexity requirements:
|
||||
|
@ -1336,6 +1337,8 @@ view_git_blame = View git blame
|
|||
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
|
||||
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
|
||||
stored_lfs = Stored with Git LFS
|
||||
stored_annex = Stored with Git Annex
|
||||
stored_annex_not_present = not present here, try using git annex whereis
|
||||
symbolic_link = Symbolic link
|
||||
executable_file = Executable file
|
||||
vendored = Vendored
|
||||
|
@ -1363,6 +1366,7 @@ editor.upload_file = Upload file
|
|||
editor.edit_file = Edit file
|
||||
editor.preview_changes = Preview changes
|
||||
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
|
||||
editor.cannot_edit_annex_files = Annex files cannot be edited in the web interface.
|
||||
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
|
||||
editor.edit_this_file = Edit file
|
||||
editor.this_file_locked = File is locked
|
||||
|
@ -1427,6 +1431,7 @@ editor.user_no_push_to_branch = User cannot push to branch
|
|||
editor.require_signed_commit = Branch requires a signed commit
|
||||
editor.cherry_pick = Cherry-pick %s onto:
|
||||
editor.revert = Revert %s onto:
|
||||
editor.commit_email = Commit email
|
||||
|
||||
commits.desc = Browse source code change history.
|
||||
commits.commits = Commits
|
||||
|
@ -3892,6 +3897,7 @@ variables.deletion.description = Removing a variable is permanent and cannot be
|
|||
variables.description = Variables will be passed to certain actions and cannot be read otherwise.
|
||||
variables.id_not_exist = Variable with ID %d does not exist.
|
||||
variables.edit = Edit Variable
|
||||
variables.not_found = Failed to find the variable.
|
||||
variables.deletion.failed = Failed to remove variable.
|
||||
variables.deletion.success = The variable has been removed.
|
||||
variables.creation.failed = Failed to add variable.
|
||||
|
|
|
@ -19,7 +19,7 @@ language=Idioma
|
|||
notifications=Notificaciones
|
||||
active_stopwatch=Rastreador de tiempo activo
|
||||
create_new=Crear…
|
||||
user_profile_and_more=Perfil y ajustes…
|
||||
user_profile_and_more=Perfil y configuración…
|
||||
signed_in_as=Identificado como
|
||||
enable_javascript=Este sitio web requiere JavaScript.
|
||||
toc=Tabla de contenidos
|
||||
|
@ -56,7 +56,7 @@ mirror=Réplica
|
|||
new_repo=Nuevo repositorio
|
||||
new_migrate=Nueva migración
|
||||
new_mirror=Nueva réplica
|
||||
new_fork=Nuevo fork de repositorio
|
||||
new_fork=Nueva bifurcación del repositorio
|
||||
new_org=Nueva organización
|
||||
new_project=Nuevo proyecto
|
||||
new_project_column=Nueva columna
|
||||
|
@ -75,7 +75,7 @@ collaborative=Colaborativo
|
|||
forks=Forks
|
||||
|
||||
activities=Actividades
|
||||
pull_requests=Pull requests
|
||||
pull_requests=Solicitudes de incorporación de cambios
|
||||
issues=Incidencias
|
||||
milestones=Hitos
|
||||
|
||||
|
@ -156,8 +156,8 @@ invalid_data = Datos inválidos: %v
|
|||
confirm_delete_artifact = ¿Estás seguro de que deseas eliminar el artefacto "%s"?
|
||||
more_items = Mas cosas
|
||||
copy_generic = Copiar al portapapeles
|
||||
filter.not_fork = No forks
|
||||
filter.is_fork = Forks
|
||||
filter.not_fork = No hay bifurcaciones
|
||||
filter.is_fork = Bifurcaciones
|
||||
test = Test
|
||||
error413 = Has agotado tu cuota.
|
||||
new_repo.title = Nuevo repositorio
|
||||
|
@ -229,7 +229,7 @@ platform_desc=Se ha confirmado que Forgejo funciona en sistemas operativos libre
|
|||
lightweight=Ligero
|
||||
lightweight_desc=Forgejo tiene pocos requisitos y puede funcionar en una Raspberry Pi barata. ¡Ahorra energía!
|
||||
license=Código abierto
|
||||
license_desc=¡Está todo en < <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Únase <a target="_blank" rel="noopener noreferrer" href="%[2]s">contribuyendo</a> a hacer este proyecto todavía mejor. ¡No sea tímido y colabore!
|
||||
license_desc=¡Pasa a conseguir <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Únete a nosotros y <a target="_blank" rel="noopener noreferrer" href="%[2]s">colabora</a> para mejorar este proyecto. ¡No seas tímido y colabora!
|
||||
|
||||
[install]
|
||||
install=Instalación
|
||||
|
@ -316,7 +316,7 @@ confirm_password=Confirmar contraseña
|
|||
admin_email=Correo electrónico
|
||||
install_btn_confirm=Instalar Forgejo
|
||||
test_git_failed=Fallo al probar el comando "git": %v
|
||||
sqlite3_not_available=Esta versión de Forgejo no soporta SQLite3. Por favor, descarga la versión binaria oficial de %s (no la versión "gobuild").
|
||||
sqlite3_not_available=Esta versión de Forgejo no admite SQLite3. Descárguese la versión binaria oficial desde %s (no la versión «gobuild»).
|
||||
invalid_db_setting=La configuración de la base de datos no es válida: %v
|
||||
invalid_db_table=La tabla "%s" de la base de datos no es válida: %v
|
||||
invalid_repo_path=La ruta de la raíz del repositorio no es válida: %v
|
||||
|
@ -397,8 +397,8 @@ code_search_results=Resultados de búsqueda para «%s»
|
|||
code_last_indexed_at=Indexado por última vez %s
|
||||
relevant_repositories_tooltip=Repositorios que son bifurcaciones o que no tienen ningún tema, ningún icono, y ninguna descripción están ocultos.
|
||||
relevant_repositories=Solo se muestran repositorios relevantes, <a href="%s">mostrar resultados sin filtrar</a>.
|
||||
forks_few = %d forks
|
||||
forks_one = %d fork
|
||||
forks_few = %d bifurcaciones
|
||||
forks_one = %d bifurcación
|
||||
stars_few = %d estrellas
|
||||
stars_one = %d estrella
|
||||
|
||||
|
@ -680,6 +680,8 @@ To = Nombre de rama
|
|||
Website = Sitio web
|
||||
|
||||
|
||||
email_domain_is_not_allowed = El dominio de la dirección de correo electrónico del usuario <b>%s</b> entra en conflicto con EMAL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Asegúrese de que ha establecido la dirección de correo electrónico correctamente.
|
||||
|
||||
[user]
|
||||
change_avatar=Cambiar su avatar…
|
||||
joined_on=Se unió el %s
|
||||
|
@ -699,7 +701,7 @@ disabled_public_activity=Este usuario ha desactivado la visibilidad pública de
|
|||
email_visibility.limited=Tu dirección de correo electrónico es visible para todos los usuarios autenticados
|
||||
email_visibility.private=Tu dirección de correo electrónico solo es visible para ti y los administradores
|
||||
show_on_map=Mostrar este lugar en un mapa
|
||||
settings=Ajustes del usuario
|
||||
settings=Configuración del usuario
|
||||
|
||||
form.name_reserved=El nombre de usuario "%s" está reservado.
|
||||
form.name_pattern_not_allowed=El patrón "%s" no está permitido en un nombre de usuario.
|
||||
|
@ -746,7 +748,7 @@ webauthn=Autenticación de dos factores (claves de seguridad)
|
|||
public_profile=Perfil público
|
||||
biography_placeholder=¡Cuenta a otros un poco sobre ti! (Se admite Markdown)
|
||||
location_placeholder=Comparte tu ubicación aproximada con otros
|
||||
profile_desc=Controla cómo se muestra su perfil a otros usuarios. Tu dirección de correo electrónico principal se utilizará para notificaciones, recuperación de contraseña y operaciones de Git basadas en la web.
|
||||
profile_desc=Acerca de ti
|
||||
password_username_disabled=Usuarios no locales no tienen permitido cambiar su nombre de usuario. Por favor, contacta con el administrador del sistema para más detalles.
|
||||
full_name=Nombre completo
|
||||
website=Página web
|
||||
|
@ -811,7 +813,7 @@ manage_emails=Administrar direcciones de correo electrónico
|
|||
manage_themes=Tema por defecto
|
||||
manage_openid=Direcciones OpenID
|
||||
email_desc=Su dirección de correo electrónico principal se utilizará para notificaciones, recuperación de contraseña y, siempre y cuando no esté oculto, operaciones de Git basadas en la web.
|
||||
theme_desc=Este será su tema por defecto en todo el sitio.
|
||||
theme_desc=Este tema será usado en la interfaz web cuando hayas iniciado sesión.
|
||||
primary=Principal
|
||||
activated=Activado
|
||||
requires_activation=Requiere activación
|
||||
|
@ -837,14 +839,14 @@ add_email_success=La nueva dirección de correo electrónico ha sido añadida.
|
|||
email_preference_set_success=La preferencia de correo electrónico se ha establecido correctamente.
|
||||
add_openid_success=La nueva dirección OpenID ha sido añadida.
|
||||
keep_email_private=Ocultar dirección de correo electrónico
|
||||
keep_email_private_popup=Esto ocultará tu dirección de correo electrónico de tu perfil. Ya no será la dirección predeterminada para los commits realizados a través de la interfaz web, como las subidas y ediciones de archivos, y no se utilizará para los commits de fusión. En su lugar, se utilizará una dirección especial %s para asociar los commits a tu cuenta. Ten en cuenta que cambiar esta opción no afectará a los commits existentes.
|
||||
keep_email_private_popup=Esto ocultará tu dirección de correo electrónico de tu perfil. Ya no será la dirección predeterminada para los confirmaciones realizadas a través de la interfaz web, como las subidas y ediciones de archivos, y no se utilizará para las confirmaciones de fusión. En su lugar, se utilizará una dirección especial %s para asociar las confirmaciones a tu cuenta. Ten en cuenta que cambiar esta opción no afectará a las confirmaciones existentes.
|
||||
openid_desc=OpenID le permite delegar la autenticación a un proveedor externo.
|
||||
|
||||
manage_ssh_keys=Gestionar claves SSH
|
||||
manage_ssh_principals=Administrar Principales de Certificado SSH
|
||||
manage_gpg_keys=Gestionar claves GPG
|
||||
add_key=Añadir clave
|
||||
ssh_desc=Estas claves SSH públicas están asociadas a tu cuenta. Las correspondientes claves privadas permiten el acceso total a tus repositorios. Las claves SSH que han sido verificadas pueden utilizarse para verificar commits de Git firmados por SSH.
|
||||
ssh_desc=Estas claves SSH públicas están asociadas a tu cuenta. Las correspondientes claves privadas permiten el acceso total a tus repositorios. Las claves SSH que han sido verificadas pueden utilizarse para verificar confirmaciones de Git firmadas por SSH.
|
||||
principal_desc=Estos principales de certificado SSH están asociados con su cuenta y permiten el acceso completo a sus repositorios.
|
||||
gpg_desc=Estas claves GPG públicas están asociadas a tu cuenta y se utilizan para verificar tus commits. Mantén a salvo tus claves privadas, ya que permiten firmar commits con tu identidad.
|
||||
ssh_helper=<strong>¿Necesitas ayuda?</strong> Echa un vistazo en la guía de GitHub para <a href="%s">crear tus propias claves SSH</a> o resolver <a href="%s">problemas comunes</a> que puede encontrar al usar SSH.
|
||||
|
@ -1054,6 +1056,8 @@ keep_activity_private.description = Tu <a href="%s">actividad pública</a> solo
|
|||
language.description = Este idioma se guardará en tu cuenta y se utilizará como predeterminado cuando te conectes.
|
||||
language.localization_project = ¡Ayúdanos a traducir Forgejo a tu idioma! <a href="%s">Más información</a>.
|
||||
|
||||
pronouns_custom_label = Pronombres personalizados
|
||||
|
||||
[repo]
|
||||
owner=Propietario
|
||||
owner_helper=Algunas organizaciones pueden no aparecer en el menú desplegable debido a un límite máximo de recuento de repositorios.
|
||||
|
@ -1068,10 +1072,10 @@ visibility=Visibilidad
|
|||
visibility_description=Sólo el propietario o los miembros de la organización -si tienen derechos- podrán verlo.
|
||||
visibility_helper=Hacer el repositorio privado
|
||||
visibility_helper_forced=El administrador de su sitio obliga a nuevos repositorios a ser privados.
|
||||
visibility_fork_helper=(Cambiar esto afectará a la visibilidad de todos los forks.)
|
||||
visibility_fork_helper=(Cambiar esto afectará a la visibilidad de todas las bifurcaciones.)
|
||||
clone_helper=¿Necesita ayuda para clonar? Visite <a target="_blank" rel="noopener noreferrer" href="%s">Ayuda</a>.
|
||||
fork_repo=Hacer fork del repositorio
|
||||
fork_from=Crear un fork desde
|
||||
fork_repo=Hacer una bifurcación del repositorio
|
||||
fork_from=Crear una bifurcación desde
|
||||
already_forked=Ya ha forkeado %s
|
||||
fork_to_different_account=Forkear a una cuenta diferente
|
||||
fork_visibility_helper=La visibilidad de un repositorio del cual se ha hecho fork no puede ser cambiada.
|
||||
|
@ -1094,11 +1098,11 @@ issue_labels=Etiquetas
|
|||
issue_labels_helper=Selecciona un conjunto de etiquetas
|
||||
license=Licencia
|
||||
license_helper=Selecciona un archivo de licencia
|
||||
license_helper_desc=Una licencia regula lo que otros pueden y no pueden hacer con tu código. ¿No está seguro de cuál es el adecuado para su proyecto? Vea <a target="_blank" rel="noopener noreferrer" href="%s">Elija una licencia.</a>
|
||||
license_helper_desc=Una licencia regula lo que otros pueden y no pueden hacer con tu código. ¿No está seguro de cuál es el adecuado para su proyecto? Vea <a target="_blank" rel="noopener noreferrer" href="%s">Elija una licencia</a>.
|
||||
readme=LÉAME
|
||||
readme_helper=Selecciona una plantilla de archivo README
|
||||
readme_helper_desc=Este es el lugar donde puedes escribir una descripción completa de su proyecto.
|
||||
auto_init=Inicializar el repositorio (añade .gitignore, licencia y README)
|
||||
auto_init=Inicializar el repositorio
|
||||
trust_model_helper=Seleccionar modelo de confianza para la verificación de la firma. Las opciones posibles son:
|
||||
trust_model_helper_collaborator=Colaborador: Confiar en firmas de colaboradores
|
||||
trust_model_helper_committer=Comitter: Firmas de confianza que coinciden con los committers
|
||||
|
@ -1222,7 +1226,7 @@ migrate.migrating_failed_no_addr=Migración fallida.
|
|||
migrate.github.description=Migrar datos desde github.com o un servidor GitHub Enterprise.
|
||||
migrate.git.description=Migrar un repositorio sólo desde cualquier servicio Git.
|
||||
migrate.gitlab.description=Migrar datos de gitlab.com u otra instancia de GitLab.
|
||||
migrate.gitea.description=Migrar datos de gitea.com u otra instancia de Gitea/Forgejo.
|
||||
migrate.gitea.description=Migrar datos de gitea.com u otra instancia de Gitea.
|
||||
migrate.gogs.description=Migrar datos de notabug.org u otra instancia de Gogs.
|
||||
migrate.onedev.description=Migrar datos desde code.onedev.io u otra instancia de OneDev.
|
||||
migrate.codebase.description=Migrar datos desde codebasehq.com.
|
||||
|
@ -1233,7 +1237,7 @@ migrate.migrating_milestones=Migrando hitos
|
|||
migrate.migrating_labels=Migrando etiquetas
|
||||
migrate.migrating_releases=Migrando lanzamientos
|
||||
migrate.migrating_issues=Migrando incidencias
|
||||
migrate.migrating_pulls=Migrando pull requests
|
||||
migrate.migrating_pulls=Migrando solicitudes de incorporación de cambios
|
||||
migrate.cancel_migrating_title=Cancelar la migración
|
||||
migrate.cancel_migrating_confirm=¿Quiere cancelar esta migración?
|
||||
|
||||
|
@ -1310,6 +1314,7 @@ view_git_blame=Ver Git blame
|
|||
video_not_supported_in_browser=Su navegador no soporta el tag "video" de HTML5.
|
||||
audio_not_supported_in_browser=Su navegador no soporta el tag "audio" de HTML5.
|
||||
stored_lfs=Almacenados con Git LFS
|
||||
stored_annex=Almacenados con Git Annex
|
||||
symbolic_link=Enlace simbólico
|
||||
executable_file=Archivo ejecutable
|
||||
commit_graph=Gráfico de commits
|
||||
|
@ -1333,6 +1338,7 @@ editor.upload_file=Subir archivo
|
|||
editor.edit_file=Editar archivo
|
||||
editor.preview_changes=Vista previa de los cambios
|
||||
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
|
||||
editor.cannot_edit_annex_files=Los archivos Annex no se pueden editar en la interfaz web.
|
||||
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
|
||||
editor.edit_this_file=Editar archivo
|
||||
editor.this_file_locked=El archivo está bloqueado
|
||||
|
@ -1859,7 +1865,7 @@ pulls.add_prefix=Añadir prefijo <strong>%s</strong>
|
|||
pulls.remove_prefix=Eliminar prefijo <strong>%s</strong>
|
||||
pulls.data_broken=Este pull request está rota debido a que falta información del fork.
|
||||
pulls.files_conflicted=Este pull request tiene cambios en conflicto con la rama de destino.
|
||||
pulls.is_checking=La comprobación de conflicto de fusión está en progreso. Inténtalo de nuevo en unos momentos.
|
||||
pulls.is_checking=La comprobación de conflicto de fusión está en progreso. Inténtelo de nuevo en unos momentos.
|
||||
pulls.is_ancestor=Esta rama ya está incluida en la rama de destino. No hay nada que fusionar.
|
||||
pulls.is_empty=Los cambios en esta rama ya están en la rama de destino. Esto será un commit vacío.
|
||||
pulls.required_status_check_failed=Algunos controles requeridos no han tenido éxito.
|
||||
|
@ -2039,8 +2045,8 @@ activity.opened_prs_count_1=Pull request propuesta
|
|||
activity.opened_prs_count_n=Pull requests propuestas
|
||||
activity.title.user_1=%d usuario
|
||||
activity.title.user_n=%d usuarios
|
||||
activity.title.prs_1=%d pull request
|
||||
activity.title.prs_n=%d pull requests
|
||||
activity.title.prs_1=%d solicitud de incorporación de cambios
|
||||
activity.title.prs_n=%d solicitudes de incorporación de cambios
|
||||
activity.title.prs_merged_by=%s fusionado por %s
|
||||
activity.title.prs_opened_by=%s propuesto por %s
|
||||
activity.merged_prs_label=Fusionado
|
||||
|
@ -2087,7 +2093,7 @@ activity.git_stats_and_deletions=y
|
|||
activity.git_stats_deletion_1=%d eliminación
|
||||
activity.git_stats_deletion_n=%d eliminaciones
|
||||
|
||||
contributors.contribution_type.commits=Commits
|
||||
contributors.contribution_type.commits=Confirmaciones
|
||||
|
||||
search=Buscar
|
||||
search.search_repo=Buscar repositorio
|
||||
|
@ -2144,7 +2150,7 @@ settings.update_mirror_settings=Actualizar ajustes de réplica
|
|||
settings.branches.switch_default_branch=Cambiar rama por defecto
|
||||
settings.branches.update_default_branch=Actualizar rama por defecto
|
||||
settings.branches.add_new_rule=Añadir nueva regla
|
||||
settings.advanced_settings=Ajustes avanzados
|
||||
settings.advanced_settings=Configuración avanzada
|
||||
settings.wiki_desc=Activar wiki del repositorio
|
||||
settings.use_internal_wiki=Usar wiki integrada
|
||||
settings.use_external_wiki=Usar wiki externa
|
||||
|
@ -2178,7 +2184,7 @@ settings.releases_desc=Activar lanzamientos en el repositorio
|
|||
settings.packages_desc=Habilitar registro de paquetes en el repositorio
|
||||
settings.projects_desc=Activar proyectos en el repositorio
|
||||
settings.actions_desc=Habilite procesos CI/CD integrados con Forgejo Actions
|
||||
settings.admin_settings=Ajustes de administrador
|
||||
settings.admin_settings=Configuración administrativa
|
||||
settings.admin_enable_health_check=Activar cheques de estado de salud del repositorio (git fsck)
|
||||
settings.admin_code_indexer=Indexador de código
|
||||
settings.admin_stats_indexer=Indexador de estadísticas de código
|
||||
|
@ -2331,7 +2337,7 @@ settings.event_pull_request_desc=Pull request abierto, cerrado, reabierto o edit
|
|||
settings.event_pull_request_assign=Asignación
|
||||
settings.event_pull_request_assign_desc=Pull Request asignado o no asignado.
|
||||
settings.event_pull_request_label=Etiquetas
|
||||
settings.event_pull_request_label_desc=Etiqueta de pull request actualizada o borrada.
|
||||
settings.event_pull_request_label_desc=Etiquetas de pull request actualizadas o borradas.
|
||||
settings.event_pull_request_milestone=Hitos
|
||||
settings.event_pull_request_milestone_desc=Hitos añadidos, eliminados o modificados.
|
||||
settings.event_pull_request_comment=Comentarios
|
||||
|
@ -2436,7 +2442,7 @@ settings.protect_approvals_whitelist_users=Lista blanca de usuarios revisores
|
|||
settings.protect_approvals_whitelist_teams=Lista blanca de equipos revisores
|
||||
settings.dismiss_stale_approvals=Descartar aprobaciones obsoletas
|
||||
settings.dismiss_stale_approvals_desc=Cuando los nuevos commits que cambien el contenido de la pull request sean empujados a la rama, se descartarán las aprobaciones antiguas.
|
||||
settings.require_signed_commits=Exigir commits firmados
|
||||
settings.require_signed_commits=Exigir confirmaciones firmadas
|
||||
settings.require_signed_commits_desc=Rechazar push en esta rama si los commits no están firmados o no son verificables.
|
||||
settings.protect_branch_name_pattern=Patrón de nombre de ramas protegidas
|
||||
settings.protect_patterns=Patrones
|
||||
|
@ -2464,7 +2470,7 @@ settings.choose_branch=Elija una rama…
|
|||
settings.no_protected_branch=No hay ramas protegidas.
|
||||
settings.edit_protected_branch=Editar
|
||||
settings.protected_branch_required_rule_name=Nombre de regla requerido
|
||||
settings.protected_branch_duplicate_rule_name=Nombre de regla duplicado
|
||||
settings.protected_branch_duplicate_rule_name=Ya hay una regla para este conjunto de ramas
|
||||
settings.protected_branch_required_approvals_min=Las aprobaciones necesarias no pueden ser negativas.
|
||||
settings.tags=Etiquetas
|
||||
settings.tags.protection=Protección de etiquetas
|
||||
|
@ -2488,11 +2494,11 @@ settings.archive.text=Archivar el repositorio lo hará de sólo lectura. Se ocul
|
|||
settings.archive.success=El repositorio ha sido archivado exitosamente.
|
||||
settings.archive.error=Ha ocurrido un error al intentar archivar el repositorio. Vea el registro para más detalles.
|
||||
settings.archive.error_ismirror=No puede archivar un repositorio replicado.
|
||||
settings.archive.branchsettings_unavailable=Los ajustes de rama no están disponibles si el repositorio está archivado.
|
||||
settings.archive.branchsettings_unavailable=Los ajustes de rama no están disponibles en repositorios archivados.
|
||||
settings.archive.tagsettings_unavailable=Los ajustes de las etiquetas no están disponibles si el repositorio está archivado.
|
||||
settings.unarchive.button=Desarchivar repositorio
|
||||
settings.unarchive.header=Desarchivar este repositorio
|
||||
settings.unarchive.text=La desarchivación del repositorio restablecerá su capacidad de recibir commits y pushes, así como nuevas incidencias y pull requests.
|
||||
settings.unarchive.text=La desarchivación del repositorio restablecerá su capacidad de recibir confirmaciones y subidos, así como nuevas incidencias y solicitudes de incorporación de cambios.
|
||||
settings.unarchive.success=El repositorio se ha desarchivado correctamente.
|
||||
settings.unarchive.error=Ocurrió un error mientras se trataba de des-archivar el repositorio. Revisa el registro para más detalles.
|
||||
settings.update_avatar_success=El avatar del repositorio ha sido actualizado.
|
||||
|
@ -2563,7 +2569,7 @@ diff.generated=generado
|
|||
diff.vendored=vendido
|
||||
diff.comment.add_line_comment=Añadir comentario en línea
|
||||
diff.comment.placeholder=Deja un comentario
|
||||
diff.comment.markdown_info=Es posible estilizar con markdown.
|
||||
diff.comment.markdown_info=Es posible dar estilos con Markdown.
|
||||
diff.comment.add_single_comment=Añadir solo comentario
|
||||
diff.comment.add_review_comment=Añadir comentario
|
||||
diff.comment.start_review=Comenzar revisión
|
||||
|
@ -2718,7 +2724,7 @@ size_format = %[1]s: %[2]s, %[3]s: %[4]s
|
|||
admin.update_flags = Actualizar indicadores
|
||||
admin.flags_replaced = Indicadores del repositorio sustituidos
|
||||
admin.failed_to_replace_flags = Fallo al substituir los indicadores del repositorio
|
||||
new_repo_helper = Un repositorio contiene todos los archivos del proyecto, incluido el historial de revisiones. ¿Ya tienes uno en otro sitio? <a href="%s">Migrar repositorio.</a>
|
||||
new_repo_helper = Un repositorio contiene todos los archivos del proyecto, incluido el historial de revisiones. ¿Ya tienes uno en otro sitio? <a href="%s">Migrar repositorio</a>.
|
||||
object_format_helper = Formato de objeto del repositorio. No puede ser modificado más tarde. SHA1 es el más compatible.
|
||||
commits.browse_further = Seguir explorando
|
||||
subscribe.issue.guest.tooltip = Inicia sesión para suscribirte a esta incidencia.
|
||||
|
@ -2796,7 +2802,7 @@ settings.confirmation_string = Cadena de confirmación
|
|||
issues.filter_sort.relevance = Relevancia
|
||||
settings.transfer_quota_exceeded = El nuevo propietario (%s) ha sobrepasado la cuota. El repositorio no ha sido transferido.
|
||||
settings.web_hook_name_sourcehut_builds = Builds de SourceHut
|
||||
settings.wiki_rename_branch_main_notices_2 =
|
||||
settings.wiki_rename_branch_main_notices_2 =Se va a renombrar de forma permanente la rama interna de la wiki del repositorio %s. Se actualizaran los checkouts existentes.
|
||||
settings.wiki_rename_branch_main = Normalizar el nombre de la rama de la wiki
|
||||
settings.wiki_rename_branch_main_desc = Renombrar la rama interna usada por la wiki a "%s". Este cambio es permanente y no se puede deshacer.
|
||||
settings.confirm_wiki_branch_rename = Renombrar la rama de la wiki
|
||||
|
@ -2813,7 +2819,32 @@ release.download_count_one = %s descarga
|
|||
diff.git-notes.add = Añadir nota
|
||||
diff.git-notes.remove-header = Eliminar nota
|
||||
release.download_count_few = %s descargas
|
||||
diff.git-notes.remove-body = Esta nota se eliminará.
|
||||
diff.git-notes.remove-body = Esta nota será eliminada.
|
||||
|
||||
new_from_template = Usa una plantilla
|
||||
new_from_template_description = Puedes seleccionar una plantilla de repositorio ya existente en esta instancia y aplicar sus ajustes.
|
||||
new_advanced = Ajustes avanzados
|
||||
new_advanced_expand = Click para expandir
|
||||
auto_init_description = Empieza el historial Git con un README y opcionalmente añade una Licencia y archivos .gitignore.
|
||||
editor.add_tmpl.filename = nombre de fichero
|
||||
issues.num_reviews_one = %d revisión
|
||||
issues.num_reviews_few = %d revisiones
|
||||
issues.reaction.add = Añadir reacción
|
||||
issues.reaction.alt_remove = Quitar %[1]s reacción de comentario.
|
||||
issues.reaction.alt_add = Añadir %[1]s reacción al comentario.
|
||||
issues.review.add_review_requests = solicitada revisiones de %[1]s %[2]s
|
||||
issues.review.remove_review_requests = eliminada la solicitud de revisiones para %[1]s %[2]s
|
||||
|
||||
editor.commit_email = Correo electrónico del commit
|
||||
issues.context.menu = Menú de comentarios
|
||||
issues.review.add_remove_review_requests = Revisiones solicitadas de %[1]s y revisiones eliminadas para %[2]s %[3]s
|
||||
pulls.sign_in_require = <a href="%s">Inicia sesión</a> para crear un nuevo pull request.
|
||||
pulls.cmd_instruction_checkout_title = Cambiar rama
|
||||
settings.protect_new_rule = Crear una nueva regla de protección de rama
|
||||
settings.enforce_on_admins_desc = Los administradores del repositorio no pueden saltarse esta regla.
|
||||
release.type_external_asset = Recurso externo
|
||||
release.asset_name = Nombre del recurso
|
||||
release.add_external_asset = Añadir un recurso externo
|
||||
|
||||
[graphs]
|
||||
component_loading = Cargando %s...
|
||||
|
@ -2822,6 +2853,9 @@ contributors.what = contribuciones
|
|||
recent_commits.what = commits recientes
|
||||
code_frequency.what = frecuencia de código
|
||||
|
||||
component_loading_info = Esto puede tomar un tiempo…
|
||||
component_failed_to_load = Ocurrió un error inesperado.
|
||||
|
||||
[org]
|
||||
org_name_holder=Nombre de la organización
|
||||
org_full_name_holder=Nombre completo de la organización
|
||||
|
@ -2947,6 +2981,8 @@ teams.invite.by=Invitado por %s
|
|||
teams.invite.description=Por favor, haga clic en el botón de abajo para unirse al equipo.
|
||||
follow_blocked_user = No puedes seguir a esta organización porque esta organización te ha bloqueado.
|
||||
|
||||
open_dashboard = Abrir panel de control
|
||||
|
||||
[admin]
|
||||
dashboard=Panel de control
|
||||
identity_access=Identidad y acceso
|
||||
|
@ -3474,6 +3510,20 @@ notices.op=Operación
|
|||
notices.delete_success=Los avisos del sistema se han eliminado.
|
||||
|
||||
|
||||
config_summary = Resumen
|
||||
config_settings = Ajustes
|
||||
users.activated.description = Finalización de la verificación del correo electrónico. El propietario de una cuenta sin activar no podrá iniciar sesión hasta que la verificación se complete.
|
||||
users.organization_creation.description = Permitir la creación de nuevas organizaciones.
|
||||
emails.change_email_text = ¿Estás seguro que quieres actualizar esta dirección de correo electrónico?
|
||||
emails.delete = Eliminar correo electrónico
|
||||
emails.delete_desc = ¿Estás seguro que quieres eliminar esta dirección de correo electrónico?
|
||||
emails.deletion_success = El correo electrónico ha sido eliminado.
|
||||
emails.delete_primary_email_error = No puedes eliminar el correo electrónico principal.
|
||||
auths.tips.gmail_settings = Configuración de Gmail:
|
||||
auths.tip.gitlab_new = Registrar una nueva aplicación en %s
|
||||
config.cache_test = Caché de prueba
|
||||
self_check.no_problem_found = Aún no se encontró un problema.
|
||||
|
||||
[action]
|
||||
create_repo=creó el repositorio <a href="%s">%s</a>
|
||||
rename_repo=repositorio renombrado de <code>%[1]s</code> a <a href="%[2]s">%[3]s</a>
|
||||
|
@ -3617,7 +3667,7 @@ conda.install=Para instalar el paquete usando Conda, ejecute el siguiente comand
|
|||
container.details.type=Tipo de imagen
|
||||
container.details.platform=Plataforma
|
||||
container.pull=Arrastra la imagen desde la línea de comandos:
|
||||
container.digest=Resumen:
|
||||
container.digest=Resumen
|
||||
container.multi_arch=SO / Arquitectura
|
||||
container.layers=Capas de imagen
|
||||
container.labels=Etiquetas
|
||||
|
@ -3714,6 +3764,19 @@ owner.settings.chef.title=Registro de Chef
|
|||
owner.settings.chef.keypair=Generar par de claves
|
||||
owner.settings.chef.keypair.description=Un par de claves es necesario para autenticarse en el registro del Chef. Si ha generado un par de claves antes, generar un nuevo par de claves descartará el par de claves antiguo.
|
||||
|
||||
arch.pacman.repo.multi = %s tiene la misma versión en diferentes distribuciones.
|
||||
arch.pacman.repo.multi.item = Configuración para %s
|
||||
arch.pacman.conf = Añadir servidor con distribución y arquitectura relacionadas a <code>/etc/pacman.conf</code> :
|
||||
arch.pacman.sync = Sincronizar el paquete con pacman:
|
||||
arch.version.properties = Propiedades de la versión
|
||||
arch.version.groups = Grupo
|
||||
arch.version.depends = Depende
|
||||
arch.version.conflicts = Conflictos
|
||||
arch.version.replaces = Reemplazos
|
||||
arch.version.backup = Copia de seguridad
|
||||
container.images.title = Imágenes
|
||||
rpm.repository.multiple_groups = Este paquete está disponible en múltiples grupos.
|
||||
|
||||
[secrets]
|
||||
secrets=Secretos
|
||||
description=Los secretos pasarán a ciertas acciones y no se podrán leer de otro modo.
|
||||
|
@ -3732,7 +3795,7 @@ management=Gestión de secretos
|
|||
[actions]
|
||||
actions=Acciones
|
||||
|
||||
unit.desc=Gestionar acciones
|
||||
unit.desc=Gestione procesos CI/CD integrados con Forgejo Actions.
|
||||
|
||||
status.unknown=Desconocido
|
||||
status.waiting=Esperando
|
||||
|
@ -3816,6 +3879,9 @@ variables.update.failed=Error al editar la variable.
|
|||
variables.update.success=La variable ha sido editada.
|
||||
variables.id_not_exist = Variable con id %d no existe.
|
||||
|
||||
runs.empty_commit_message = (mensaje de commit vacío)
|
||||
runs.expire_log_message = Los registros han sido eliminados porque eran demasiado antiguos.
|
||||
|
||||
[projects]
|
||||
type-1.display_name=Proyecto individual
|
||||
type-2.display_name=Proyecto repositorio
|
||||
|
@ -3837,7 +3903,7 @@ search = Buscar...
|
|||
type_tooltip = Tipo de búsqueda
|
||||
project_kind = Buscar proyectos...
|
||||
branch_kind = Buscar ramas...
|
||||
commit_kind = Buscar commits...
|
||||
commit_kind = Buscar confirmaciones...
|
||||
repo_kind = Buscar repositorios...
|
||||
user_kind = Buscar usuarios...
|
||||
org_kind = Buscar organizaciones...
|
||||
|
@ -3860,6 +3926,8 @@ fuzzy = Difusa
|
|||
runner_kind = Buscar ejecutores…
|
||||
regexp_tooltip = Interpretar los términos de búsqueda como una expresión regular
|
||||
|
||||
regexp = Expresión Regular
|
||||
|
||||
[markup]
|
||||
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s
|
||||
filepreview.line = Línea %[1]d en %[2]s
|
||||
|
@ -3870,7 +3938,7 @@ releases.write = <b>Write:</b> Publicar, editar y eliminar lanzamientos y sus ar
|
|||
packages.read = <b>Lectura:</b> Ver y descargar paquetes asignados al repositorio.
|
||||
wiki.read = <b>Lectura:</b> Leer la wiki integrada y su historial.
|
||||
issues.read = <b>Lectura:</b> Leer y crear incidencias y comentarios.
|
||||
pulls.write = <b>Escritura:</b> Cerrar pull requests y gestionar metadatos como etiquetas, hitos, asignaciones, fechas de vencimiento y dependencias.
|
||||
pulls.write = <b>Escritura:</b> Cerrar solicitudes de incorporación de cambios y gestionar metadatos como etiquetas, hitos, asignaciones, fechas de vencimiento y dependencias.
|
||||
releases.read = <b>Lectura:</b> Ver y descagar lanzamientos.
|
||||
wiki.write = <b>Escritura:</b> Crear, actualizar y eliminar páginas en la wiki integrada.
|
||||
projects.read = <b>Lectura:</b> Acceso a las tablas de proyecto del repositorio.
|
||||
|
|
|
@ -112,9 +112,9 @@ new_project_column = ستون جدید
|
|||
retry = سعی دوباره
|
||||
rerun = اجرای دوباره
|
||||
rerun_all = اجرای دوباره تمام کارها
|
||||
rss_feed = خوراک RSS
|
||||
rss_feed = خوراک آراساس
|
||||
pin = سنجاق
|
||||
unpin = حذف سنجاق
|
||||
unpin = برداشتن سنجاق
|
||||
locked = قفل شده
|
||||
copy_hash = رونوشت هش
|
||||
unknown = نامشخص
|
||||
|
@ -134,17 +134,93 @@ new_repo.title = مخزن جدید
|
|||
new_migrate.title = مهاجرت جدید
|
||||
new_repo.link = مخزن جدید
|
||||
|
||||
tracked_time_summary = چکیدهای از زمان ردیابیشده بر اساس پالایههای فهرست مشکلها
|
||||
toggle_menu = دگرش فهرست
|
||||
webauthn_error_insecure = احرازوب فقط از روشهای ایمن ممکن است. برای آزمودن بر روی اچتیتیپی میتوانید از «میزبانمحلی» یا «۱۲۷.۰.۰.۱» استفاده کنید.
|
||||
remove_label_str = حذف مورد "%s"
|
||||
view = نما
|
||||
test = آزمودن
|
||||
copy_generic = رونوشت در بریدهدان
|
||||
copy_path = رونوشت مسیر
|
||||
copy_content = رونوشت درونمایه
|
||||
error413 = شما سهمیه خود را تمام کردهاید.
|
||||
go_back = بازگشت
|
||||
invalid_data = داده نامعتبر: %v
|
||||
artifacts = آلایه
|
||||
confirm_delete_artifact = آیا مطمئن هستید که میخواهید آلایه « %s » را حذف کنید؟
|
||||
concept_system_global = سراسری
|
||||
concept_user_individual = تکی
|
||||
show_timestamps = نمایش برچسبزمان
|
||||
show_log_seconds = نمایش ثانیهها
|
||||
show_full_screen = نمایش تمام صفحه
|
||||
download_logs = بارگیری واقعهنگاری
|
||||
confirm_delete_selected = تایید میکنید که همه موارد گزینش شده حذف شوند؟
|
||||
value = ارزش
|
||||
filter = فیلتر
|
||||
filter.clear = پاککردن پالایهها
|
||||
filter.is_archived = بایگانی شده
|
||||
filter.not_archived = بایگانی نشده
|
||||
filter.is_fork = چنگها
|
||||
filter.not_fork = چنگ نشدهها
|
||||
filter.is_mirror = آینهها
|
||||
filter.not_mirror = نا آینه
|
||||
filter.is_template = کالبدها
|
||||
filter.not_template = بدون کالبدها
|
||||
filter.public = عمومی
|
||||
filter.private = خصوصی
|
||||
|
||||
[aria]
|
||||
navbar = نوار ناوبری
|
||||
footer = پاورقی
|
||||
footer.software = درباره این نرمافزار
|
||||
footer.links = پیوندها
|
||||
|
||||
[heatmap]
|
||||
number_of_contributions_in_the_last_12_months = %s همکاری در ۱۲ ماه گذشته
|
||||
contributions_zero = بدون همکاری
|
||||
contributions_format = {همکاری} در {روز}{ماه}{سال}
|
||||
contributions_one = همکاری
|
||||
contributions_few = همکاریها
|
||||
less = کمتر
|
||||
more = بیشتر
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip = افزودن سرصفحه
|
||||
buttons.bold.tooltip = افزودن متن درشت
|
||||
buttons.italic.tooltip = افزودن متن کج
|
||||
buttons.quote.tooltip = افزودن نقلقول
|
||||
buttons.code.tooltip = افزودن کد
|
||||
buttons.link.tooltip = افزودن یک پیوند
|
||||
buttons.list.unordered.tooltip = افزودن یک فهرست نقطهای
|
||||
buttons.list.ordered.tooltip = افزودن یک فهرست شمارهدار
|
||||
buttons.list.task.tooltip = افزودن یک فهرست کارها
|
||||
buttons.mention.tooltip = یادکردن از کاربر یا گروهی
|
||||
buttons.ref.tooltip = اشاره به مشکلی یا درخواست واکشی
|
||||
buttons.switch_to_legacy.tooltip = به جای آن از ویرایشگر کهنهتر استفاده کن
|
||||
buttons.enable_monospace_font = فونت یکپارچه را فعال کن
|
||||
buttons.disable_monospace_font = فونت یکپارچه را غیرفعال کن
|
||||
buttons.indent.tooltip = اجزا را با یک سطح گروهبندی کن
|
||||
buttons.unindent.tooltip = اجزا را با یک سطح گروهبندی نکن
|
||||
buttons.new_table.tooltip = افزودن جدول
|
||||
table_modal.header = افزودن جدول
|
||||
table_modal.placeholder.header = سرآیند
|
||||
table_modal.placeholder.content = محتوا
|
||||
table_modal.label.rows = ردیفها
|
||||
table_modal.label.columns = ستونها
|
||||
|
||||
[filter]
|
||||
string.asc = آ - ی
|
||||
string.desc = ی - آ
|
||||
|
||||
[error]
|
||||
missing_csrf=درخواست بد: بلیط CSRF ندارد
|
||||
|
||||
occurred = خطایی رخ داد
|
||||
report_message = اگر گمان میبرید این اشکال از فورججو است، لطفا در مشکلات در <a href="%s" target="_blank">کدبرگ</a> را بگردید یا اگر لازم است یک مشکل باز کنید.
|
||||
not_found = هدف را نمیتوان یافت.
|
||||
network_error = خطای شبکه
|
||||
server_internal = خطای درونی کارساز
|
||||
|
||||
[startpage]
|
||||
app_desc=یک سرویس گیت بیدرد سر و راحت
|
||||
install=راهاندازی ساده
|
||||
|
@ -154,16 +230,19 @@ lightweight_desc=گیتی با حداقل منابع میتوانید برای
|
|||
license=متن باز
|
||||
license_desc=برو به <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! به ملحق شوید با <a target="_blank" rel="noopener noreferrer" href="%[2]s"> مشارکت کردن</a> برای این که این پروژه بهتر شود. برای مشارکت کردن خجالت نکشید!
|
||||
|
||||
install_desc = به آسانی <a target="_blank" rel="noopener noreferrer" href="%[1]s">اعداد دو دویی</a> را برای سکوی خود اجرا کنید. با <a target="_blank" rel="noopener noreferrer" href="%[2]s">داکر</a> آن را ارسال کنید، یا <a target="_blank" rel="noopener noreferrer" href="%[3]s">بستهبندی</a> تحویل بگیرید.
|
||||
platform_desc = فورججو برای اجرا بر روی سامانهعاملهای آزاد مانند گنو/لینوکس و بیاسدی آزاد و همچنین معماریهای گوناگون پردازنده ثبات دارد. هر چی میلتان هست انتخاب کنید!
|
||||
|
||||
[install]
|
||||
install=نصب و راه اندازی
|
||||
title=تنظیمات اولیه
|
||||
title=پیکربندی اولیه
|
||||
docker_helper=اگر گیتی را با داکر اجرا کردهاید، لطفا قبل از هر تغییری <a target="_blank" rel="noopener noreferrer" href="%s">مستندات</a> را مطالعه نمایید.
|
||||
db_title=تنظیمات پایگاه داده
|
||||
db_type=نوع پایگاه داده
|
||||
db_title=تنظیمات پایگاهداده
|
||||
db_type=گونه پایگاهداده
|
||||
host=میزبان
|
||||
user=نام کاربری
|
||||
password=رمز عبور
|
||||
db_name=نام پایگاه داده
|
||||
db_name=نام پایگاهداده
|
||||
db_schema=قالب
|
||||
db_schema_helper=برای مقدار پیش فرض پایگاه داده خالی بگذارید ("public").
|
||||
ssl_mode=SSL
|
||||
|
@ -178,24 +257,24 @@ err_empty_db_path=مسیر دیتابیس SQLite3 نمیتواند خالی با
|
|||
no_admin_and_disable_registration=شما بدون ایجاد حساب کاربری مدیر نمیتوانید عضویت را غیر فعال کنید.
|
||||
err_empty_admin_password=کلمه عبور حساب مدیر نمی تواند خالی باشد.
|
||||
err_empty_admin_email=رایانامه (ایمیل) مدیر نمی تواند خالی باشد.
|
||||
err_admin_name_is_reserved=نام کاربری مدیر اشتباه است. نام کاربری قبلا استفاده شده است
|
||||
err_admin_name_is_reserved=نامکاربری مدیر اشتباه است، نامکاربری قبلا استفاده شده است
|
||||
err_admin_name_pattern_not_allowed=نام کاربری مدیر اشتباه است. نام کاربری قبلا استفاده شده است
|
||||
err_admin_name_is_invalid=نام کابری مدیر اشتباه است
|
||||
|
||||
general_title=تنظیمات عمومی
|
||||
app_name=عنوان سایت
|
||||
app_name_helper=شما می توانید نام شرکت خود را در اینجا وارد کنید.
|
||||
app_name=تیتر نمونه
|
||||
app_name_helper=شما می توانید نام نمونه خود را در اینجا وارد کنید. آن در همه برگهها به نمایش در خواهد آمد.
|
||||
repo_path=مسیر ریشه مخزن
|
||||
repo_path_helper=تمام مخازن کد راه دور در این پوشه ذخیره میشوند.
|
||||
lfs_path=مسیر Git LFS
|
||||
lfs_path=مسیر ریشه ذخیرهسازی پرونده بزرگ گیت
|
||||
lfs_path_helper=فایل هایی که توسط Git LFS دنبال میشوند در این پوشه ذخیره خواهند شد. درصورت خالی بودن فیلد این قابلیت غیرفعال خواهد بود.
|
||||
run_user=اجرا به عنوان نام کاربری
|
||||
domain=دامنه سرور
|
||||
run_user=اجرای کاربر به عنوان
|
||||
domain=دامنه کارساز
|
||||
domain_helper=آدرس میزبان یا دامنه برای سرور.
|
||||
ssh_port=پورت SSH سرور
|
||||
ssh_port_helper=شماره درگاهی که سرور SSH گوش می دهد. برای غیر فعال کردن خالی بگذارید.
|
||||
http_port=پورت HTTP گیتی
|
||||
http_port_helper=پورت سرور وب گیتی.
|
||||
ssh_port=درگاه کارساز پوستهامن
|
||||
ssh_port_helper=شماره درگاهی که سرور پوستهامن استفاده میکند. برای غیر فعال کردن خالی بگذارید.
|
||||
http_port=درگاه شنونده اچتیتیپی
|
||||
http_port_helper=شماره درگاهی که توسط کارساز وب فرججو استفاده میشود.
|
||||
app_url=آدرس پایه گیتی
|
||||
app_url_helper=آدرس پایه برای URLهای اجماع HTTP(S) و هشدار های رایانامه (ایمیل).
|
||||
log_root_path=مسیر گزارشها
|
||||
|
@ -256,6 +335,12 @@ no_reply_address=مخفی کردن دامنه ایمیل
|
|||
no_reply_address_helper=نام دامنه برای کاربران دارای آدرس ایمیل پنهان است. به عنوان مثال ، اگر نام دامنه ایمیل مخفی روی "noreply.example.org" تنظیم شده باشد ، نام کاربری "joe" در Git به عنوان "joe@noreply.example.org" وارد می شود
|
||||
password_algorithm=الگوریتم درهمساز گذرواژه
|
||||
|
||||
require_db_desc = فروججو به مایاسکیوال، پستگریاسکیوال،اسکیولایت۳ یا تیدیبی نیاز دارد.
|
||||
|
||||
app_slogan = شعار نمونه
|
||||
app_slogan_helper = شعار نمونه خود را اینجا وارد کنید. برای غیرفعال شدن خالی بگذارید.
|
||||
run_user_helper = نامکاربری سامانهعامل که با عنوان فرججو اجرا میشود. به یادداشته باشید که کاربر باید دسترسی به مسیر ریشه مخازن داشته باشد.
|
||||
|
||||
[home]
|
||||
uname_holder=نام کاربری یا نشانی ایمیل
|
||||
password_holder=گذرواژه
|
||||
|
@ -881,7 +966,7 @@ migrate.migrating_failed=مهاجرت از <b>%s</b> ناموفق بود.
|
|||
migrate.migrating_failed_no_addr=مهاجرت ناموفق بود.
|
||||
migrate.git.description=کوچ یک مخزن فقط از یک سرویس Git.
|
||||
migrate.gitlab.description=مهاجرت داده از gitlabb.com یا پیادهسازیهای دیگر GitLab.
|
||||
migrate.gitea.description=مهاجرت داده از gitea.com یا پیادهسازیهای دیگر Gitea/Forgejo.
|
||||
migrate.gitea.description=مهاجرت داده از gitea.com یا پیادهسازیهای دیگر Gitea.
|
||||
migrate.gogs.description=مهاجرت داده از notabug.com یا پیادهسازیهای دیگر Gogs.
|
||||
migrate.onedev.description=مهاجرت داده از code.onedev.io یا پیادهسازیهای دیگر OneDev.
|
||||
migrate.codebase.description=مهاجر داده ها از codebasehq.com.
|
||||
|
@ -951,6 +1036,7 @@ file_copy_permalink=پرمالینک را کپی کنید
|
|||
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
||||
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
|
||||
stored_lfs=ذخیره شده با GIT LFS
|
||||
stored_annex=ذخیره شده با GIT Annex
|
||||
symbolic_link=پیوند نمادین
|
||||
commit_graph=نمودار کامیت
|
||||
commit_graph.select=انتخاب برنچها
|
||||
|
@ -968,6 +1054,7 @@ editor.upload_file=بارگذاری پرونده
|
|||
editor.edit_file=ویرایش پرونده
|
||||
editor.preview_changes=پیش نمایش تغییرات
|
||||
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
|
||||
editor.cannot_edit_annex_files=پرونده های Annex در صحفه وب قابل تغییر نیست.
|
||||
editor.cannot_edit_non_text_files=پروندههای دودویی در صفحه وب قابل تغییر نیست.
|
||||
editor.edit_this_file=ویرایش پرونده
|
||||
editor.this_file_locked=پرونده قفل شده است
|
||||
|
@ -1987,6 +2074,8 @@ error.csv.too_large=نمی توان این فایل را رندر کرد زیر
|
|||
error.csv.unexpected=نمی توان این فایل را رندر کرد زیرا حاوی یک کاراکتر غیرمنتظره در خط %d و ستون %d است.
|
||||
error.csv.invalid_field_count=نمی توان این فایل را رندر کرد زیرا تعداد فیلدهای آن در خط %d اشتباه است.
|
||||
|
||||
milestones.filter_sort.name = نام
|
||||
|
||||
[graphs]
|
||||
|
||||
[org]
|
||||
|
@ -2291,7 +2380,7 @@ auths.bind_password=اتصال گذرواژه
|
|||
auths.user_base=پایگاه جستجوی کاربر
|
||||
auths.user_dn=کاربر DN
|
||||
auths.attribute_username=ویژگی نام کاربری
|
||||
auths.attribute_username_placeholder=نام کاربری را خالی بگذارید برای انتخاب نام کاربری gitea انتخاب شود.
|
||||
auths.attribute_username_placeholder=نام کاربری را خالی بگذارید برای انتخاب نام کاربری Forgejo انتخاب شود.
|
||||
auths.attribute_name=ویژگی نام
|
||||
auths.attribute_surname=ویژگی نام خانوادگی
|
||||
auths.attribute_mail=ویژگی ایمیل
|
||||
|
@ -2540,6 +2629,9 @@ notices.op=عملیات.
|
|||
notices.delete_success=گزارش سیستم حذف شده است.
|
||||
|
||||
|
||||
config_summary = چکیده
|
||||
config_settings = تنظيمات
|
||||
|
||||
[action]
|
||||
create_repo=مخزن ایجاد شده <a href="%s"> %s</a>
|
||||
rename_repo=مخزن تغییر نام داد از <code>%[1]s</code> به <a href="%[2]s">%[3]s</a>
|
||||
|
@ -2669,3 +2761,29 @@ executable_file = فایل اجرایی
|
|||
normal_file = فایل معمولی
|
||||
changed_filemode = %[1] ها ← %[2] ها
|
||||
directory = پوشه
|
||||
|
||||
[search]
|
||||
search = جستجو...
|
||||
type_tooltip = جستجو گونه
|
||||
fuzzy = درهم
|
||||
fuzzy_tooltip = پیامدهایی را درج کنید که دقیقا با عبارت جستجو همخوانی داشته باشند
|
||||
union = بهم پیوستگی
|
||||
exact = مو به مو
|
||||
exact_tooltip = نتایجی را در بر بگیر که مو به مو با اصطلاح جستجو شده یکی باشد
|
||||
regexp = عبارات باقاعده
|
||||
regexp_tooltip = اصطلاح جستجو شده را با عبارات باقاعده تفسیر کن
|
||||
repo_kind = جستجو مخازن...
|
||||
user_kind = جستجو کاربران...
|
||||
org_kind = جستجو سازمانها...
|
||||
team_kind = جستجو گروهها...
|
||||
code_kind = جستجو کدها...
|
||||
code_search_unavailable = جستجوی کد اکنون در دسترس نیست. لطفا با مدیر سایت درمیان بگذارید.
|
||||
package_kind = جستجو بستهها...
|
||||
project_kind = جستجو پروژهها...
|
||||
branch_kind = جستجو شاخهها...
|
||||
commit_kind = جستجو سپردهها...
|
||||
runner_kind = جستجو دوندهها...
|
||||
no_results = نتیجه درخوری یافت نشد.
|
||||
issue_kind = جستجو مشکلات...
|
||||
pull_kind = جستجو واکشیها...
|
||||
keyword_search_unavailable = جستجو کلیدواژه اکنون در درسترس نیست. لطفا با مدیر سایت در میان بگذارید.
|
||||
|
|
|
@ -289,10 +289,10 @@ mailer_password=SMTP-salasana
|
|||
register_confirm=Vaadi sähköpostinvahvistus rekisteröinnin edellytykseksi
|
||||
mail_notify=Ota sähköposti-ilmoitukset käyttöön
|
||||
server_service_title=Palvelimen ja kolmansien osapuolten palveluiden asetukset
|
||||
offline_mode=Ota käyttöön lokaali tila
|
||||
offline_mode=Ota käyttöön paikallinen tila
|
||||
offline_mode.description=Poista kolmannen osapuolen sisällönjakeluverkot ja tarjoa kaikki resurssit paikallisesti.
|
||||
disable_gravatar=Poista Gravatar käytöstä
|
||||
disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
|
||||
disable_gravatar.description=Poista Gravatar- tai muiden kolmansien osapuolien avatar-lähteet käytöstä. Oletuskuvia käytetään käyttäjien avatareissa, elleivät he uloslataa omaa avatariaan ilmentymään.
|
||||
federated_avatar_lookup=Käytä federoituja profiilikuvia
|
||||
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
|
||||
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
|
||||
|
@ -481,6 +481,8 @@ disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sä
|
|||
authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
|
||||
password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
|
||||
|
||||
prohibit_login_desc = Tilinne on estetty kanssakäymästä tämän instanssin kanssa. Ota yhteys instanssin järjestelmävalvojaan pääsyn uudelleenmahdollistamiseksi.
|
||||
|
||||
[mail]
|
||||
view_it_on=Näytä %s
|
||||
link_not_working_do_paste=Eikö linkki toimi? Yritä kopioida ja liittää se selaimesi osoitepalkkiin.
|
||||
|
@ -545,6 +547,13 @@ repo.collaborator.added.text = Sinut on lisätty avustajaksi repoon:
|
|||
primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asetettiin %[1]s. Se tarkoittaa, että tämä sähköpostiosoite ei enää vastaanota tilisi ilmoituksia sähköpostitse.
|
||||
team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
|
||||
|
||||
issue_assigned.pull = @%[1]s osoitti sinulle vetopyynnön %[2]s repossa %[3]s.
|
||||
issue_assigned.issue = @%[1]s osoitti sinulle ongelman %[2]s repossa %[3]s.
|
||||
|
||||
register_notify.text_1 = tämä on %s:n rekistöröitymisen vahvistussähköposti!
|
||||
reset_password.text = jos tämä oli sinun toimestasi, ole hyvä ja klikkaa oheista linkkiä palauttaaksesi tilisi <b>%s</b> sisällä:
|
||||
totp_disabled.no_2fa = Muita kaksivaiheisen tunnistautumisen menetelmiä ei ole konfiguroituna, joten et tarvitse kaksivaiheista tunnistautumista kirjautuaaksesi tilillesi.
|
||||
|
||||
[modal]
|
||||
yes=Kyllä
|
||||
no=Ei
|
||||
|
@ -627,6 +636,9 @@ must_use_public_key = Antamasi avain on yksityinen avain. Älä lähetä yksityi
|
|||
still_own_packages = Tilisi omistaa yhden tai useamman paketin, poista ne ensin.
|
||||
|
||||
|
||||
AccessToken = Pääsypoletti
|
||||
enterred_invalid_owner_name = Uuden omistajan nimi ei ole kelvollinen.
|
||||
|
||||
[user]
|
||||
change_avatar=Vaihda profiilikuvasi…
|
||||
repositories=Repot
|
||||
|
@ -963,7 +975,7 @@ repo_name=Repon nimi
|
|||
repo_name_helper=Hyvä repon nimi on lyhyt, mieleenpainuva ja yksilöllinen.
|
||||
repo_size=Repon koko
|
||||
template=Malli
|
||||
template_select=Valitse malli.
|
||||
template_select=Valitse malli
|
||||
template_helper=Tee reposta mallipohja
|
||||
visibility=Näkyvyys
|
||||
visibility_description=Vain omistaja tai organisaation jäsenet, jos heillä on oikeudet, voivat nähdä sen.
|
||||
|
@ -978,7 +990,7 @@ repo_desc=Kuvaus
|
|||
repo_lang=Kieli
|
||||
repo_gitignore_helper=Valitse .gitignore-mallit
|
||||
issue_labels=Ongelmien tunnisteet
|
||||
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
|
||||
issue_labels_helper=Valitse nimiöjoukko
|
||||
license=Lisenssi
|
||||
license_helper=Valitse lisenssitiedosto
|
||||
readme=README
|
||||
|
@ -1517,12 +1529,12 @@ settings.protected_branch=Haaran suojaus
|
|||
settings.branch_protection=Haaran "<b>%s</b>" suojaussäännöt
|
||||
settings.protect_this_branch=Ota haaran suojaus käyttöön
|
||||
settings.protect_whitelist_deploy_keys=Lisää julkaisuavaimet sallittujen listalle mahdollistaaksesi repohin kirjoituksen.
|
||||
settings.protect_whitelist_users=Lista käyttäjistä joilla työntö oikeus:
|
||||
settings.protect_whitelist_users=Sallitut käyttäjät suhteessa työntämiseen
|
||||
settings.protect_whitelist_search_users=Etsi käyttäjiä…
|
||||
settings.protect_merge_whitelist_committers_desc=Salli vain listaan merkittyjen käyttäjien ja tiimien yhdistää vetopyynnöt tähän haaraan.
|
||||
settings.protect_merge_whitelist_users=Lista käyttäjistä joilla yhdistämis-oikeus:
|
||||
settings.protect_merge_whitelist_users=Sallitut käyttäjät suhteessa yhdistämiseen
|
||||
settings.protect_required_approvals=Vaadittavat hyväksynnät
|
||||
settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista:
|
||||
settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista
|
||||
settings.choose_branch=Valitse haara…
|
||||
settings.no_protected_branch=Suojattuja haaroja ei ole.
|
||||
settings.edit_protected_branch=Muokkaa
|
||||
|
@ -1696,7 +1708,7 @@ settings.event_issue_comment = Kommentit
|
|||
diff.download_patch = Lataa patch-tiedosto
|
||||
issues.filter_milestone_none = Ei merkkipaaluja
|
||||
issues.filter_milestone_open = Avoimet merkkipaalut
|
||||
new_repo_helper = Repositorio eli tietovarasto sisältää kaikki projektin tiedostot, mukaan lukien versiohistorian. Onko sinulla repo jo jossain muualla? <a href="%s">Tee repomigraatio.</a>
|
||||
new_repo_helper = Tietovarasto sisältää kaikki projektitiedostot, mukaan lukien tarkistushistoria. Järjestätkö jo sellaisen muualla? <a href="%s">Siirrä tietovarasto</a>.
|
||||
use_template = Käytä tätä mallipohjaa
|
||||
star_guest_user = Kirjaudu sisään lisätäksesi tähden tähän repoon.
|
||||
watch_guest_user = Kirjaudu sisään tarkkaillaksesi tätä repoa.
|
||||
|
@ -1766,7 +1778,7 @@ issues.close = Sulje ongelma
|
|||
issues.no_content = Ei kuvausta.
|
||||
pulls.reject_count_1 = %d muutospyyntö
|
||||
pulls.update_branch_success = Haarapäivitys onnistui
|
||||
milestones.completeness = <strong>%d%%</strong> valmiina
|
||||
milestones.completeness = <strong>%d% %</strong> valmiina
|
||||
contributors.contribution_type.additions = Lisäykset
|
||||
contributors.contribution_type.deletions = Poistot
|
||||
settings.webhook_deletion_success = Webkoukku on poistettu.
|
||||
|
@ -2097,6 +2109,29 @@ settings.archive.text = Repon arkistointi asettaa sen pelkkään lukutilaan. Se
|
|||
no_eol.text = Ei EOL:ää
|
||||
pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
|
||||
|
||||
new_from_template = Käytä mallipohjaa
|
||||
new_from_template_description = Voit valita olemassa olevan repon mallipohjan ja toteuttaa sen asetukset.
|
||||
new_advanced = Lisäasetukset
|
||||
new_advanced_expand = Laajenna napsauttamalla
|
||||
template_description = Repojen mallipohjat mahdollistavat uusien repojen luomisen halutulla hakemistorakenteella, tiedostoilla ja valinnaisilla asetuksilla.
|
||||
auto_init_description = Aloita Git-historia README-tiedostolla ja valinnaisesti License- ja .gitignore-tiedostoilla.
|
||||
settings.enter_repo_name = Kirjoita omistajan ja repon nimi täsmälleen kuten esitetty:
|
||||
settings.confirmation_string = Vahvistusteksti
|
||||
settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi repon <strong>%s</strong> mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset.
|
||||
|
||||
issues.new.assign_to_me = Osoita itselle
|
||||
issues.filter_assginee_no_select = Kaikki käsittelijät
|
||||
pulls.closed_at = `sulki tämän vetopyynnön <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
|
||||
generate_repo = Luo repo
|
||||
tree_path_not_found_commit = Polkua %[1]s ei ole olemassa kommitissa %[2]s
|
||||
tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s
|
||||
tree_path_not_found_tag = Polkua %[1]s ei ole olemassa tagissa %[2]s
|
||||
transfer.no_permission_to_accept = Sinulla ei ole oikeutta hyväksyä tätä siirtoa.
|
||||
transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa.
|
||||
|
||||
settings.web_hook_name_feishu = Feishu / Lark Suite
|
||||
|
||||
[graphs]
|
||||
component_loading_info = Tämä saattaa kestää hetken…
|
||||
component_failed_to_load = Odottamaton virhe.
|
||||
|
@ -2582,6 +2617,16 @@ compare_branch = Vertaa
|
|||
review_dismissed_reason = Syy:
|
||||
commit_repo = työnsi haaraan <a href="%[2]s">%[3]s</a> repossa <a href="%[1]s">%[4]s</a>
|
||||
|
||||
create_issue = `avasi ongelman <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_issue = `sulki ongelman <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_issue = `avasi uudelleen ongelman <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
create_pull_request = `loi vetopyynnön <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_pull_request = `sulki vetopyynnön <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_pull_request = `avasi uudelleen vetopyynnön <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
comment_issue = `kommentoi ongelmaa <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
comment_pull = `kommentoi vetopyyntöä <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
merge_pull_request = `yhdisti vetopyynnön <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
||||
[tool]
|
||||
now=nyt
|
||||
1s=1 sekunti
|
||||
|
@ -2628,6 +2673,8 @@ error.extract_sign = Allekirjoituksen purkaminen epäonnistui
|
|||
default_key = Allekirjoitettu oletusavaimella
|
||||
error.failed_retrieval_gpg_keys = Ei saatu yhtäkään kommitin tekijän tiliin liitettyä avainta
|
||||
|
||||
error.generate_hash = Tiivisteen luominen kommitista epäonnistui
|
||||
|
||||
[units]
|
||||
unit = Yksikkö
|
||||
|
||||
|
@ -2768,6 +2815,10 @@ owner.settings.cargo.rebuild.error = Cargo-indeksin rakentaminen uudelleen epäo
|
|||
owner.settings.cargo.rebuild.success = Cargo-indeksi rakennettiin uudelleen.
|
||||
owner.settings.cleanuprules.preview.none = Siivoussääntö ei vastaa yhtäkään pakettia.
|
||||
|
||||
settings.link.error = Repositorion linkin päivittäminen epäonnistui.
|
||||
owner.settings.cargo.initialize = Alusta indeksi
|
||||
owner.settings.cargo.initialize.description = Erityinen Git-repoindeksi vaaditaan Cargo-rekisterin käyttämiseksi. Tämän valinnan käyttäminen luo (tarvittaessa uudelleen) repon ja määrittää sen asetukset automaattisesti.
|
||||
|
||||
[secrets]
|
||||
creation.failed = Salaisuuden lisääminen epäonnistui.
|
||||
deletion = Poista salaisuus
|
||||
|
|
|
@ -231,10 +231,10 @@ ssl_mode = SSL
|
|||
path = Daanan
|
||||
sqlite_helper = File path para sa SQLite3 database.<br>Maglagay ng absolute path kapag tinatakbo mo ang Forgejo bilang serbisyo.
|
||||
reinstall_confirm_check_3 = Kinukumprima mo na sigurado ka talaga na ang Forgejo na ito ay tumatakbo sa tamang app.ini na lokasyon at sigurado ka na kailangan mo mag-reinstall. Kinukumpirma mo na kilalanin ang mga panganib sa itaas.
|
||||
err_empty_db_path = Hindi maaring walang laman ang path ng SQLite database.
|
||||
no_admin_and_disable_registration = Hindi mo maaring i-disable ang user self-registration nang hindi gumawa ng isang tagapangasiwa na account.
|
||||
err_empty_admin_password = Hindi maaring walang laman ang password ng tagapangasiwa.
|
||||
err_empty_admin_email = Hindi maaring walang laman ang email ng tagapangasiwa.
|
||||
err_empty_db_path = Hindi maaaring walang laman ang path ng SQLite database.
|
||||
no_admin_and_disable_registration = Hindi mo maaaring i-disable ang user self-registration nang hindi gumawa ng isang tagapangasiwa na account.
|
||||
err_empty_admin_password = Hindi maaaring walang laman ang password ng tagapangasiwa.
|
||||
err_empty_admin_email = Hindi maaaring walang laman ang email ng tagapangasiwa.
|
||||
err_admin_name_is_reserved = Hindi angkop ang username ng tagapangasiwa, naka-reserba ang username
|
||||
err_admin_name_is_invalid = Hindi angkop ang username ng tagapangasiwa
|
||||
general_title = Mga General Setting
|
||||
|
@ -250,9 +250,9 @@ domain_helper = Domain o host para sa server na ito.
|
|||
ssh_port = Port ng SSH Server
|
||||
http_port = Listen port sa HTTP
|
||||
lfs_path_helper = Ang mga file na naka-track sa Git LFS ay ilalagay sa directory na ito. Iwanang walang laman para i-disable.
|
||||
reinstall_confirm_message = Ang pag-install muli na may umiiral na Forgejo database ay maaring magdulot ng mga problema. Sa karamihan ng mga kaso, dapat mong gamitin ang iyong umiiral na "app.ini" para patakbuhin ang Forgejo. Kung alam mo ang ginagawa mo, kumpirmahin ang mga sumusunod:
|
||||
reinstall_confirm_check_1 = Ang data na naka-encrypt sa pamamagitan ng SECRET_KEY sa app.ini ay maaring mawala: baka hindi maka-log in ang mga user gamit ng 2FA/OTP at ang mga mirror ay maaring hindi gumana mg maayos. Sa pamamagitan ng pag-check ng box na ito kinukumpirma mo na ang kasalukuyang app.ini file ay naglalaman ng tamang SECRET_KEY.
|
||||
reinstall_confirm_check_2 = Ang mga repositoryo at mga setting ay maaring kailangang i-resynchronize. Sa pamamagitan ng pag-check ng box na ito kinukumprima mo na ire-resynchronize mo ang mga hook para sa mga repositoryo at authorized_keys ng mano-mano. Kinukumpirma mo na sisiguraduhin mo na tama ang mga setting ng repositoryo at mirror.
|
||||
reinstall_confirm_message = Ang pag-install muli na may umiiral na Forgejo database ay maaaring magdulot ng mga problema. Sa karamihan ng mga kaso, dapat mong gamitin ang iyong umiiral na "app.ini" para patakbuhin ang Forgejo. Kung alam mo ang ginagawa mo, kumpirmahin ang mga sumusunod:
|
||||
reinstall_confirm_check_1 = Ang data na naka-encrypt sa pamamagitan ng SECRET_KEY sa app.ini ay maaaring mawala: baka hindi maka-log in ang mga user gamit ng 2FA/OTP at ang mga mirror ay maaaring hindi gumana mg maayos. Sa pamamagitan ng pag-check ng box na ito kinukumpirma mo na ang kasalukuyang app.ini file ay naglalaman ng tamang SECRET_KEY.
|
||||
reinstall_confirm_check_2 = Ang mga repositoryo at mga setting ay maaaring kailangang i-resynchronize. Sa pamamagitan ng pag-check ng box na ito kinukumprima mo na ire-resynchronize mo ang mga hook para sa mga repositoryo at authorized_keys ng mano-mano. Kinukumpirma mo na sisiguraduhin mo na tama ang mga setting ng repositoryo at mirror.
|
||||
err_admin_name_pattern_not_allowed = Hindi angkop ang username ng tagapangasiwa, ang username ay tumutugma sa reserved pattern
|
||||
ssh_port_helper = Numero ng port na gagamitin ng SSH server. Iwanang walang laman para i-disable ang SSH server.
|
||||
server_service_title = Mga setting ng server at third-party na serbisyo
|
||||
|
@ -565,7 +565,7 @@ SSPISeparatorReplacement = Pang-hiwalay
|
|||
SSPIDefaultLanguage = Default na wika
|
||||
CommitSummary = Pangkalahatang-ideya ng commit
|
||||
glob_pattern_error = ` hindi angkop ang glob pattern: %s`
|
||||
require_error = ` hindi maaring walang laman.`
|
||||
require_error = ` hindi maaaring walang laman.`
|
||||
alpha_dash_error = ` dapat maglaman lamang ng alphanumeric, dash ("-") at underscore ("_") na mga character.`
|
||||
alpha_dash_dot_error = ` dapat maglaman lamang ng alphanumeric, dash ("-"), underscore ("_") at tuldok (".") na mga character.`
|
||||
git_ref_name_error = ` dapat na mahusay na nabuong pangalan ng Git reference`
|
||||
|
@ -613,8 +613,8 @@ unset_password = Hindi nagtakda ng password ang login user.
|
|||
unsupported_login_type = Hindi sinusuportahan ang uri ng pag-login para burahin ang account.
|
||||
user_not_exist = Hindi umiiral ang user.
|
||||
team_not_exist = Hindi umiiral ang koponan.
|
||||
last_org_owner = Hindi mo maaring tanggalin ang pinakahuling user sa "mga may-ari" na koponan. Kailangan may kahit isang may-ari para sa organisasyon.
|
||||
cannot_add_org_to_team = Hindi maaring madagdag ang isang organisasyon bilang miyembro ng koponan.
|
||||
last_org_owner = Hindi mo maaaring tanggalin ang pinakahuling user sa "mga may-ari" na koponan. Kailangan may kahit isang may-ari para sa organisasyon.
|
||||
cannot_add_org_to_team = Hindi maaaring madagdag ang isang organisasyon bilang miyembro ng koponan.
|
||||
duplicate_invite_to_team = Inimbita na ang user bilang miyembro ng koponan.
|
||||
organization_leave_success = Matagumpay kang umalis sa organisasyon na %s.
|
||||
invalid_ssh_key = Hindi ma-verify ang iyong SSH key: %s
|
||||
|
@ -629,7 +629,7 @@ still_own_packages = Ang iyong account ay nagmamay-ari ng isa o higit pang packa
|
|||
org_still_own_repo = Ang organisasyon na ito ay nagmamay-ari ng isa o higit pang mga repositoryo, burahin o ilipat sila muna.
|
||||
org_still_own_packages = Ang organisasyon na ito ay nagmamay-ari ng isa o higit pang mga package, burahin sila muna.
|
||||
target_branch_not_exist = Hindi umiiral ang target branch.
|
||||
admin_cannot_delete_self = Hindi mo maaring burahin ang sarili mo kapag isa kang tagapangasiwa. Paki-tanggal ang iyong pribilehiyong tagapangasiwa muna.
|
||||
admin_cannot_delete_self = Hindi mo maaaring burahin ang sarili mo kapag isa kang tagapangasiwa. Paki-tanggal ang iyong pribilehiyong tagapangasiwa muna.
|
||||
required_prefix = Ang input ay dapat magsimula sa "%s"
|
||||
FullName = Buong pangalan
|
||||
Description = Paglalarawan
|
||||
|
@ -641,6 +641,8 @@ Biography = Byograpya
|
|||
Location = Lokasyon
|
||||
visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita.
|
||||
|
||||
email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user <b>%s</b> sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama.
|
||||
|
||||
[user]
|
||||
joined_on = Sumali noong %s
|
||||
repositories = Mga Repositoryo
|
||||
|
@ -760,8 +762,8 @@ gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
|
|||
delete_token_success = Nabura na ang token. Ang mga application na gumagamit nito ay hindi na maa-access ang iyong account.
|
||||
add_email_confirmation_sent = Ang isang email na pang-kumpirma ay ipinadala sa %s. Para kumpirmahin ang iyong email address, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s.
|
||||
key_content_ssh_placeholder = Nagsisimula sa "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com"
|
||||
gpg_key_verified_long = Na-verify ang key na ito gamit ng isang token at maaring gamitin para i-verify ang mga commit na tumutugma sa anumang mga naka-activate na email address para sa user na ito kasama ang mga tumutugmang pagkakakilanlan para sa key na ito.
|
||||
ssh_key_verified_long = Ang key na ito ay na-verify gamit ng isang token at maaring gamitin para i-verify ang mga commit na tumutugma na email address para sa user na ito.
|
||||
gpg_key_verified_long = Na-verify ang key na ito gamit ng isang token at maaaring gamitin para i-verify ang mga commit na tumutugma sa anumang mga naka-activate na email address para sa user na ito kasama ang mga tumutugmang pagkakakilanlan para sa key na ito.
|
||||
ssh_key_verified_long = Ang key na ito ay na-verify gamit ng isang token at maaaring gamitin para i-verify ang mga commit na tumutugma na email address para sa user na ito.
|
||||
add_principal_success = Idinagdag na ang SSH certificate principal na "%s".
|
||||
ssh_key_deletion_desc = Ang pagtanggal ng SSH key ay matatanggihan ang pag-access sa iyong account. Magpatuloy?
|
||||
no_activity = Walang kamakilang aktibidad
|
||||
|
@ -820,7 +822,7 @@ keep_email_private = Itago ang email address
|
|||
openid_desc = Hinahayaan ka ng OpenID na mag-delegate ng pagpapatunay sa isang panlabas na tagabigay ng serbisyo.
|
||||
ssh_desc = Ang mga pampublikong SSH key na ito ay nauugnay sa iyong account. Pinapayagan ng kaukulang pribadong key ang buong pag-access sa iyong mga repositoryo. Ang mga SSH key na na-verify ay maaaring magamit upang mapatunayan ang mga naka-sign na Git commit sa pamamagitan ng SSH.
|
||||
principal_desc = Ang mga SSH principal na ito ay nauugnay sa iyong account at pinapayagan ang buong pag-access sa iyong mga repositoryo.
|
||||
ssh_helper = <strong>Kailangan ng tulong?</strong> Tignan ang guide sa <a href="%s">paggawa ng sarili mong mga SSH key</a> o ilutas ang <a href="%s">mga karaniwang problema</a> na maaring moong matagpo gamit ng SSH.
|
||||
ssh_helper = <strong>Kailangan ng tulong?</strong> Tignan ang guide sa <a href="%s">paggawa ng sarili mong mga SSH key</a> o ilutas ang <a href="%s">mga karaniwang problema</a> na maaaring moong matagpo gamit ng SSH.
|
||||
gpg_helper = <strong>Kailangan ng tulong?</strong> Tignan ang guide <a href="%s">tungkol sa GPG</a>.
|
||||
add_new_key = Magdagdag ng SSH key
|
||||
add_new_gpg_key = Magdagdag ng GPG key
|
||||
|
@ -830,7 +832,7 @@ ssh_key_been_used = Idinagdag na ang SSH key na ito sa server.
|
|||
ssh_key_name_used = Ang isang SSH key na may katulad na pangalan ay umiiral na sa iyong account.
|
||||
ssh_principal_been_used = Idinagdag na ang principal na ito sa server.
|
||||
gpg_key_matched_identities = Mga Tumutugma na Pagkakakilanlan:
|
||||
gpg_key_matched_identities_long = Ang mga naka-embed na pagkakakilanlan sa key na ito ay tumutugma sa mga sumusunod na naka-activate na email address para sa user na ito. Ang mga commit na tumutugma sa mga email address na ito ay maaring i-verify gamit ng key na ito.
|
||||
gpg_key_matched_identities_long = Ang mga naka-embed na pagkakakilanlan sa key na ito ay tumutugma sa mga sumusunod na naka-activate na email address para sa user na ito. Ang mga commit na tumutugma sa mga email address na ito ay maaaring i-verify gamit ng key na ito.
|
||||
gpg_key_verified = Naka-verify na key
|
||||
gpg_key_verify = I-verify
|
||||
gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma.
|
||||
|
@ -982,7 +984,7 @@ manage_account_links_desc = Ang mga panlabas na account na ito ay naka-link sa i
|
|||
hooks.desc = Magdagdag ng mga webhook na mati-trigger para sa <strong>lahat ng mga repositoryo</strong> na minamay-ari mo.
|
||||
orgs_none = Hindi ka isang miyembro ng anumang mga organisasyon.
|
||||
oauth2_application_create_description = Ang mga OAuth2 application ay pinapayagan ang mga third-party na aplikasyon na i-access ang mga user account sa instansya na ito.
|
||||
oauth2_application_locked = Ang Forgejo ay pini-pre register ang ibang mga OAuth2 application sa startup kapag naka-enable sa config. Para iwasan ang hindi inaasahang gawain, hindi ito maaring i-edit o tanggalin. Mangyaring sumangguni sa dokumentasyon ng OAuth2 para sa karagdagang impormasyon.
|
||||
oauth2_application_locked = Ang Forgejo ay pini-pre register ang ibang mga OAuth2 application sa startup kapag naka-enable sa config. Para iwasan ang hindi inaasahang gawain, hindi ito maaaring i-edit o tanggalin. Mangyaring sumangguni sa dokumentasyon ng OAuth2 para sa karagdagang impormasyon.
|
||||
remove_account_link_desc = Ang pagtanggal ng naka-link na account ay babawiin ang pag-access nito sa iyong Forgejo account. Magpatuloy?
|
||||
visibility.public_tooltip = Makikita ng lahat
|
||||
hints = Mga Pahiwatig
|
||||
|
@ -1011,7 +1013,7 @@ admin.enabled_flags = Mga flag na naka-enable para sa repositoryo:
|
|||
admin.update_flags = I-update ang mga flag
|
||||
admin.flags_replaced = Napalitan ang mga flag ng repositoryo
|
||||
owner = May-ari
|
||||
owner_helper = Maaring hindi mapapakita ang ibang organisasyon sa dropdown dahil sa pinakamataas na bilang ng repositoryo na limitasyon.
|
||||
owner_helper = Maaaring hindi mapapakita ang ibang organisasyon sa dropdown dahil sa pinakamataas na bilang ng repositoryo na limitasyon.
|
||||
repo_name = Pangalan ng repositoryo
|
||||
repo_name_helper = Ang mga magandang pangalan ng repositoryo ay gumagamit ng maliit, makakaalala, at unique na mga keyword.
|
||||
repo_size = Laki ng Repositoryo
|
||||
|
@ -1027,7 +1029,7 @@ fork_repo = I-fork ang repositoryo
|
|||
fork_from = I-fork mula sa
|
||||
already_forked = Na-fork mo na ang %s
|
||||
fork_to_different_account = Mag-fork sa ibang account
|
||||
fork_visibility_helper = Ang visibility ng isang naka-fork na repositoryo ay hindi maaring baguhin.
|
||||
fork_visibility_helper = Ang visibility ng isang naka-fork na repositoryo ay hindi maaaring baguhin.
|
||||
open_with_editor = Buksan gamit ang %s
|
||||
download_bundle = I-download ang BUNDLE
|
||||
repo_gitignore_helper_desc = Piliin kung anong mga file na hindi susubaybayin sa listahan ng mga template para sa mga karaniwang wika. Ang mga tipikal na artifact na ginagawa ng mga build tool ng wika ay kasama sa .gitignore ng default.
|
||||
|
@ -1112,7 +1114,7 @@ stars = Mga bitwin
|
|||
migrate_options_mirror_helper = Magiging salamin ang repositoryong ito
|
||||
migrate_options_lfs_endpoint.description.local = Sinusuporta rin ang lokal na server path.
|
||||
editor.this_file_locked = Nakakandado ang file
|
||||
editor.filename_cannot_be_empty = Hindi maaring walang laman ang pangalan ng file.
|
||||
editor.filename_cannot_be_empty = Hindi maaaring walang laman ang pangalan ng file.
|
||||
commits.message = Mensahe
|
||||
commits.newer = Mas bago
|
||||
commits.date = Petsa
|
||||
|
@ -1169,7 +1171,7 @@ template.avatar = Avatar
|
|||
migrate_options = Mga opsyon sa paglipat
|
||||
migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na repositoryo
|
||||
need_auth = Awtorisasyon
|
||||
migrate.github_token_desc = Maari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaring magdulot ng pag-block ng account.
|
||||
migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account.
|
||||
template.invalid = Kailangang pumili ng kahit isang template na repositoryo
|
||||
migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang <a target="_blank" rel="noopener noreferrer" href="%s">matukoy ang LFS server</a>. Maari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar.
|
||||
blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa <a href="%s">.git-blame-ignore-revs</a>.
|
||||
|
@ -1202,7 +1204,7 @@ adopt_preexisting_success = Pinagtibay ang mga file at ginawa ang repositoryo mu
|
|||
delete_preexisting_success = Burahin ang mga hindi pinatibay na file sa %s
|
||||
blame_prior = Tignan ang blame bago ang pagbabago na ito
|
||||
migrate.permission_denied = Hindi ka pinapayagang mag-import ng mga lokal na repositoryo.
|
||||
migrate.permission_denied_blocked = Hindi ka maaring mag-import mula sa mga hindi pinapayagang host, magyaring magtanong sa pangangasiwa na suriin ang ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS na mga setting.
|
||||
migrate.permission_denied_blocked = Hindi ka maaaring mag-import mula sa mga hindi pinapayagang host, magyaring magtanong sa pangangasiwa na suriin ang ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS na mga setting.
|
||||
migrate.invalid_local_path = Hindi wasto ang lokal na path. Hindi ito umiiral o hindi isang direktoryo.
|
||||
migrate.invalid_lfs_endpoint = Hindi wasto ang LFS endpoint.
|
||||
migrate.migrating_failed = Nabigo ang pag-migrate mula sa <b>%s</b>.
|
||||
|
@ -1251,7 +1253,7 @@ file_follow = Sundan ang symlink
|
|||
file_view_source = Tignan ang source
|
||||
file_view_rendered = Tignan ng naka-render
|
||||
ambiguous_runes_header = `Naglalaman ng file na ito ng mga hindi tiyak na Unicode character`
|
||||
ambiguous_runes_description = `Ang file na ito ay naglalaman ng mga Unicode character na maaring malilito sa ibang mga character. Kung sa tingin mo ay sinasadya ito, maari mong ligtas na hindi pansinin ang babala ito. Gamitin ang I-escape na button para ipakita sila.`
|
||||
ambiguous_runes_description = `Ang file na ito ay naglalaman ng mga Unicode character na maaaring malilito sa ibang mga character. Kung sa tingin mo ay sinasadya ito, maaari mong ligtas na hindi pansinin ang babala ito. Gamitin ang I-escape na button para ipakita sila.`
|
||||
file_copy_permalink = Kopyahin ang permalink
|
||||
view_git_blame = Tignan ang git blame
|
||||
video_not_supported_in_browser = Hindi sinusuportahan ng inyong browser ang HTML5 "video" tag.
|
||||
|
@ -1281,7 +1283,7 @@ broken_message = Ang Git data na pinagbabatayan sa repositoryo na ito ay hindi m
|
|||
file_history = Kasaysayan
|
||||
invisible_runes_header = `Nalalaman ng file na ito ng mga hindi nakikitang Unicode character`
|
||||
file_too_large = Masyadong malaki ang file para ipakita.
|
||||
invisible_runes_description = `Ang file na ito ay naglalaman ng mga hindi nakikitang Unicode character na hindi nakikilala ng mga tao ngunit maaring maproseso ng ibang paraan ng isang computer. Kung sa tingin mo ay sinasadya ito, maari mong ligtas na hindi pansinin ang babala na ito. Gamitin ang I-escape na button para ipakita sila.`
|
||||
invisible_runes_description = `Ang file na ito ay naglalaman ng mga hindi nakikitang Unicode character na hindi nakikilala ng mga tao ngunit maaaring maproseso ng ibang paraan ng isang computer. Kung sa tingin mo ay sinasadya ito, maaari mong ligtas na hindi pansinin ang babala na ito. Gamitin ang I-escape na button para ipakita sila.`
|
||||
commit.contained_in_default_branch = Ang commit na ito ay bahagi ng default na branch
|
||||
migrate.migrating_labels = Nililipat ang mga label
|
||||
filter_branch_and_tag = I-filter ang branch o tag
|
||||
|
@ -1315,7 +1317,7 @@ clone_this_repo = I-clone ang repositoryo na ito
|
|||
cite_this_repo = Banggitin ang repositoryo na ito
|
||||
create_new_repo_command = Paggawa ng bagong repositoryo sa command line
|
||||
code = Code
|
||||
ambiguous_character = `Ang %[1]c [U+%04[1]X] ay maaring malito sa %[2]c [U+%04[2]X]`
|
||||
ambiguous_character = `Ang %[1]c [U+%04[1]X] ay maaaring malito sa %[2]c [U+%04[2]X]`
|
||||
escape_control_characters = I-escape
|
||||
unescape_control_characters = I-unescape
|
||||
invisible_runes_line = `Ang linya na ito ay may mga hindi nakikitang Unicode character`
|
||||
|
@ -1329,7 +1331,7 @@ editor.must_be_on_a_branch = Dapat nasa branch ka upang gumawa o magmunkahi ng m
|
|||
editor.new_branch_name_desc = Bagong pangalan ng branch…
|
||||
editor.cancel = Kanselahin
|
||||
issues.role.member = Miyembro
|
||||
issues.remove_request_review_block = Hindi maaring tanggalin ang hiling sa pagsuri
|
||||
issues.remove_request_review_block = Hindi maaaring tanggalin ang hiling sa pagsuri
|
||||
issues.edit = Baguhin
|
||||
issues.cancel = Kanselahin
|
||||
issues.save = IImbak
|
||||
|
@ -1730,7 +1732,7 @@ issues.label_exclusive_desc = Pangalanan ang label na <code>scope/item</code> up
|
|||
issues.archived_label_description = (Naka-archive) %s
|
||||
issues.label.filter_sort.alphabetically = Ayon sa alpabeto
|
||||
issues.subscribe = Mag-subscribe
|
||||
issues.max_pinned = Hindi ka maaring mag-pin ng higit pang mga isyu
|
||||
issues.max_pinned = Hindi ka maaaring mag-pin ng higit pang mga isyu
|
||||
issues.pin_comment = na-pin ito %s
|
||||
issues.unpin_comment = na-unpin ito %s
|
||||
issues.lock = I-lock ang usapan
|
||||
|
@ -1786,7 +1788,7 @@ wiki.last_commit_info = Binago ni %s ang pahinang ito %s
|
|||
issues.content_history.edited = binago
|
||||
issues.ref_pull_from = `<a href="%[3]s">isinangguni ang hiling sa paghila na ito %[4]s </a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa <code>%[2]s</code> patungong <code>%[3]s</code> %[4]s
|
||||
settings.org_not_allowed_to_be_collaborator = Hindi maaring idagdag ang mga organizasyon bilang tagatulong.
|
||||
settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong.
|
||||
settings.add_collaborator_success = Naidagdag ang tagatulong.
|
||||
settings.federation_following_repos = Mga URL ng Mga Sinusundang Repositoryo. Hinihiwalay ng ";", walang whitespace.
|
||||
diff.comment.reply = Tumugon
|
||||
|
@ -1885,8 +1887,8 @@ issues.dependency.remove_info = Tanggalin ang dependency na ito
|
|||
issues.dependency.added_dependency = `nagdagdag ng bagong dependency %s`
|
||||
issues.review.dismissed_label = Nadismiss
|
||||
issues.review.dismissed = nadismiss ang pagsuri ni %s %s
|
||||
issues.review.self.approval = Hindi mo maaring aprubahan ang sarili mong hiling sa paghila.
|
||||
issues.review.self.rejection = Hindi mo maaring humiling ng pagbabago sa sarili mong hiling sa paghila.
|
||||
issues.review.self.approval = Hindi mo maaaring aprubahan ang sarili mong hiling sa paghila.
|
||||
issues.review.self.rejection = Hindi mo maaaring humiling ng pagbabago sa sarili mong hiling sa paghila.
|
||||
pulls.nothing_to_compare_have_tag = Magkapareho ang mga piniling branch/tag.
|
||||
issues.dependency.no_permission_1 = Wala kang pahintulot na basahin ang dependency na %d
|
||||
issues.dependency.no_permission_n = Wala kang pahintulot na basahin ang mga %d dependency
|
||||
|
@ -1920,7 +1922,7 @@ activity.active_prs_count_n = <strong>%d</strong> aktibong mga hiling sa paghila
|
|||
issues.author.tooltip.issue = May-akda ng iysung ito ang user.
|
||||
issues.author.tooltip.pr = May-akda ng hiling sa paghila na ito ang user na ito.
|
||||
issues.dependency.add_error_dep_exists = Umiiral na and dependency.
|
||||
issues.dependency.add_error_cannot_create_circular = Hindi ka maaring gumawa ng dependency na may dalawang isyu na humaharang sa isa't isa.
|
||||
issues.dependency.add_error_cannot_create_circular = Hindi ka maaaring gumawa ng dependency na may dalawang isyu na humaharang sa isa't isa.
|
||||
issues.dependency.add_error_same_issue = Hindi mo magagwang dumepende ang isyu sa sarili.
|
||||
issues.dependency.add_error_dep_not_same_repo = Dapat nasa katulad na repositoryo ang mga isyu.
|
||||
issues.dependency.add_error_dep_issue_not_exist = Hindi umiiral ang dumedependeng isyu.
|
||||
|
@ -2036,7 +2038,7 @@ pulls.wrong_commit_id = ang commit id ay dapat ang commit id sa patutunguhan na
|
|||
pulls.blocked_by_changed_protected_files_1 = Hinarangan ang hiling sa paghila na ito dahil nagbabago ito ng isang nakaprotektang file:
|
||||
pulls.blocked_by_changed_protected_files_n = Hinarangan ang hiling sa paghila na ito dahil nagbabago ito ng mga nakaprotektang file:
|
||||
pulls.blocked_by_official_review_requests = Hinarangan ang hiling sa paghila na ito dahil may nawawalang pag-apruba mula sa isa o higit pang mga opisyal na tagasuri.
|
||||
pulls.can_auto_merge_desc = Maaring isama ng awtomatiko ang hiling sa paghila na ito.
|
||||
pulls.can_auto_merge_desc = Maaaring isama ng awtomatiko ang hiling sa paghila na ito.
|
||||
pulls.num_conflicting_files_n = %d mga magkasalungat na file
|
||||
pulls.num_conflicting_files_1 = %d magkasalungat na file
|
||||
issues.review.add_review_requests = humiling ng mga pagsuri mula sa %[1]s %[2]s
|
||||
|
@ -2316,7 +2318,7 @@ settings.convert_confirm = I-convert ang repositoryo
|
|||
settings.webhook.replay.description_disabled = Para i-replay ang webhook na ito, i-activate ito.
|
||||
settings.tracker_issue_style.regexp = Regular na Ekspresyon
|
||||
settings.admin_stats_indexer = Taga-index ng istatistika ng code
|
||||
pulls.open_unmerged_pull_exists = `Hindi ka maaring gumawa ng pagbukas-muli na operasyon dahil may nakabinbin na hiling sa paghila (#%d) na may magkatulad na katangian.`
|
||||
pulls.open_unmerged_pull_exists = `Hindi ka maaaring gumawa ng pagbukas-muli na operasyon dahil may nakabinbin na hiling sa paghila (#%d) na may magkatulad na katangian.`
|
||||
milestones.deletion_success = Binura na ang milestone.
|
||||
pulls.auto_merge_has_pending_schedule = Naiskedyul ni %[1]s na awtomatiko na isama ang hiling sa paghila na ito kapag magtagumpay ang lahat ng mga pagsusuri %[2]s.
|
||||
issues.summary_card_alt = Pangkalahatang-ideyang card ng isyu na tawag na "%s" sa repositoryong %s
|
||||
|
@ -2384,9 +2386,9 @@ settings.external_wiki_url_desc = Ire-redirect ang mga bisita sa URL ng panlabas
|
|||
settings.use_external_issue_tracker = Gumamit ng panlabas na tagasubaybay na isyu
|
||||
settings.wiki_desc = I-enable ang wiki ng repositoryo
|
||||
settings.trust_model.default.desc = Gamitin ang default na modelo ng pagkatiwala ng repositoryo para sa installation na ito.
|
||||
settings.add_webhook.invalid_path = Hindi maaring maglaman ang path ng parte na "." o ".." o walang laman na string. Hindi maaring magsimula o magtapos sa slash.
|
||||
settings.add_webhook.invalid_path = Hindi maaaring maglaman ang path ng parte na "." o ".." o walang laman na string. Hindi maaaring magsimula o magtapos sa slash.
|
||||
settings.webhook_deletion = Tanggalin ang webhook
|
||||
settings.add_webhook.invalid_channel_name = Hindi maaring walang laman ang pangalan ng channel ng webhook at hindi maaring maglaman lang ng # na character.
|
||||
settings.add_webhook.invalid_channel_name = Hindi maaaring walang laman ang pangalan ng channel ng webhook at hindi maaaring maglaman lang ng # na character.
|
||||
pulls.update_branch = I-update ang branch sa pamamagitan ng pagsama
|
||||
pulls.status_checks_show_all = Ipakita ang lahat ng mga pagsusuri
|
||||
pulls.cmd_instruction_checkout_title = I-checkout
|
||||
|
@ -2439,8 +2441,8 @@ settings.mirror_settings.docs.doc_link_title = Paano ako mag-mirror ng mga repos
|
|||
settings.pull_mirror_sync_quota_exceeded = Nalagpasan ang quota, hindi hihila ng mga pagbabago.
|
||||
settings.mirror_settings.push_mirror.none_ssh = Wala
|
||||
settings.mirror_settings.push_mirror.copy_public_key = Kopyahin ang publikong key
|
||||
pulls.delete_after_merge.head_branch.is_protected = Ang head branch na gusto mong burahin ay isang pinoprotektahang branch at hindi maaring burahin.
|
||||
pulls.delete_after_merge.head_branch.is_default = Ang head branch na gusto mong burahin ay ang default branch at hindi maaring burahin.
|
||||
pulls.delete_after_merge.head_branch.is_protected = Ang head branch na gusto mong burahin ay isang pinoprotektahang branch at hindi maaaring burahin.
|
||||
pulls.delete_after_merge.head_branch.is_default = Ang head branch na gusto mong burahin ay ang default branch at hindi maaaring burahin.
|
||||
issues.num_reviews_few = %d mga pagsusuri
|
||||
issues.num_reviews_one = %d pagsusuri
|
||||
diff.image.swipe = I-swipe
|
||||
|
@ -2463,7 +2465,7 @@ diff.comment.add_single_comment = Magdagdag ng iisang komento
|
|||
diff.comment.placeholder = Mag-iwan ng komento
|
||||
release.detail = Mga detalye sa release
|
||||
release.tags = Mga tag
|
||||
release.title_empty = Hindi maaring walang laman ang paksa.
|
||||
release.title_empty = Hindi maaaring walang laman ang paksa.
|
||||
branch.included_desc = Ang branch na ito ay kabilang ng default branch
|
||||
release.source_code = Source code
|
||||
release.edit_subheader = Inaayos ng mga release ang mga bersyon ng proyekto.
|
||||
|
@ -2506,8 +2508,8 @@ settings.block_outdated_branch_desc = Hindi magiging posible ang pagsasama kung
|
|||
settings.block_rejected_reviews_desc = Hindi magiging posible ang pagsasama kapag may mga hiniling ng pagbabago ang mga opisyal na tagasuri, kahit na may sapat na pagapruba.
|
||||
settings.block_on_official_review_requests = Harangan ang merge sa opisyal na hiling sa pagsuri
|
||||
settings.tags.protection.allowed = Pinapayagan
|
||||
settings.lfs_delete_warning = Ang pagbura ng LFS file ay maaring magdulot ng mga "object does not exist" na error sa checkout. Sigurado ka ba?
|
||||
settings.protected_branch_required_approvals_min = Hindi maaring negatibo ang mga kinakailangang pagapruba.
|
||||
settings.lfs_delete_warning = Ang pagbura ng LFS file ay maaaring magdulot ng mga "object does not exist" na error sa checkout. Sigurado ka ba?
|
||||
settings.protected_branch_required_approvals_min = Hindi maaaring negatibo ang mga kinakailangang pagapruba.
|
||||
settings.lfs_lock_path = File path na kakandaduhin…
|
||||
settings.lfs_force_unlock = Pilitin ang pag-unlock
|
||||
settings.lfs_pointers.accessible = Naa-access ng user
|
||||
|
@ -2518,7 +2520,7 @@ settings.protect_merge_whitelist_users = Mga naka-whitelist na user para sa pags
|
|||
settings.protect_merge_whitelist_teams = Mga naka-whitelist na koponan para sa pagsasama
|
||||
settings.protect_check_status_contexts = I-enable ang pagsusuri ng estado
|
||||
settings.protect_status_check_patterns = Mga pattern sa pagsusuri ng estado
|
||||
settings.protect_status_check_patterns_desc = Ilagay ang mga pattern para i-specify kung aling mga pagsusuri ng estado na kailangang magpasa bago maisama ang mga branch sa isang branch na tumutugma sa rule na ito. Nagse-specify ang bawat linya ng pattern. Hindi maaring walang laman ang mga pattern.
|
||||
settings.protect_status_check_patterns_desc = Ilagay ang mga pattern para i-specify kung aling mga pagsusuri ng estado na kailangang magpasa bago maisama ang mga branch sa isang branch na tumutugma sa rule na ito. Nagse-specify ang bawat linya ng pattern. Hindi maaaring walang laman ang mga pattern.
|
||||
settings.protect_check_status_contexts_list = Mga pagsusuri ng estado na nahanap sa huling linggo para sa repositoryo na ito
|
||||
diff.generated = na-generate
|
||||
branch.confirm_create_branch = Gumawa ng branch
|
||||
|
@ -2668,9 +2670,9 @@ settings.protected_branch_deletion_desc = Ang pag-disable ng branch protection a
|
|||
settings.rename_branch_failed_protected = Hindi mababago ang pangalan ng branch na %s dahil ito ay isang nakaprotektang branch.
|
||||
editor.add_tmpl.filename = Pangalan ng file
|
||||
settings.protect_approvals_whitelist_users = Mga naka-whitelist na tagasuri
|
||||
settings.protect_protected_file_patterns_desc = Ang mga nakaprotektang file ay hindi pinapayagan na direktang mabago kahit na may karapatan ang user na magdagdag, i-edit, o burahin ang mga file sa branch na ito. Ang mga maraming pattern ay maaring mahiwalay gamit ng semicolon (";"). Tignan ang <a href="%[1]s">%[2]s</a> na dokumentasyon para sa pattern syntax. Mga halimbawa: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
branch.delete_branch_has_new_commits = Hindi maaring burahin ang branch na "%s" dahil may mga bagong commit na nadagdag matapos ang pagsasama.
|
||||
settings.protect_unprotected_file_patterns_desc = Ang mga hindi nakaprotektang file ay pinapayagan na direktang mabago kung may write access ang user, bina-bypass ang restriction ng pagtulak. Ang mga maraming pattern ay maaring mahiwalay gamit ng semicolon (";"). Tignan ang <a href="%[1]s">%[2]s</a> na dokumentasyon para sa pattern syntax. Mga halimbawa: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc = Ang mga nakaprotektang file ay hindi pinapayagan na direktang mabago kahit na may karapatan ang user na magdagdag, i-edit, o burahin ang mga file sa branch na ito. Ang mga maraming pattern ay maaaring mahiwalay gamit ng semicolon (";"). Tignan ang <a href="%[1]s">%[2]s</a> na dokumentasyon para sa pattern syntax. Mga halimbawa: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
branch.delete_branch_has_new_commits = Hindi maaaring burahin ang branch na "%s" dahil may mga bagong commit na nadagdag matapos ang pagsasama.
|
||||
settings.protect_unprotected_file_patterns_desc = Ang mga hindi nakaprotektang file ay pinapayagan na direktang mabago kung may write access ang user, bina-bypass ang restriction ng pagtulak. Ang mga maraming pattern ay maaaring mahiwalay gamit ng semicolon (";"). Tignan ang <a href="%[1]s">%[2]s</a> na dokumentasyon para sa pattern syntax. Mga halimbawa: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.no_protected_branch = Walang mga nakaprotekta na branch.
|
||||
settings.protected_branch_required_rule_name = Kinakailangan na pangalan ng rule
|
||||
settings.protected_branch_duplicate_rule_name = Mayroon nang rule para sa set ng mga branch na ito
|
||||
|
@ -2686,7 +2688,7 @@ branch.branch_name_conflict = Sumasalungat ang pangalan ng branch na "%s" sa umi
|
|||
branch.protected_deletion_failed = Nakaprotekta ang branch na "%s". Hindi ito mabubura.
|
||||
diff.file_after = Pagkatapos
|
||||
release.deletion_tag_desc = Buburahin ang tag na ito sa repositoryo. Mapapanatiling hindi nabago ang nilalaman at kasaysayan ng repositoryo. Magpatuloy?
|
||||
topic.format_prompt = Dapat magsimula ang mga topic ng numero o letra, maaring magsama ng mga dash ("-") at dot ("."), maaring hanggang sa 35 na character na haba. Kailangang lowercase ang mga character.
|
||||
topic.format_prompt = Dapat magsimula ang mga topic ng numero o letra, maaaring magsama ng mga dash ("-") at dot ("."), maaaring hanggang sa 35 na character na haba. Kailangang lowercase ang mga character.
|
||||
branch.new_branch_from = Gumawa ng bagong branch mula sa "%s"
|
||||
error.csv.unexpected = Hindi ma-render ang file na ito dahil naglalaman ito ng hindi inaasahang character sa linyang %d at column %d.
|
||||
settings.ignore_stale_approvals_desc = Huwag ibilang ang mga pagapruba na ginawa sa mga lumang commit (mga lipas na pagsusuri) sa kung gaano karaming pagapruba ang mayroon sa PR na ito. Walang kinalaman kung ang mga lipas na pagsusuri ay na-dismiss na.
|
||||
|
@ -2725,6 +2727,8 @@ issues.context.menu = Menu ng komento
|
|||
summary_card_alt = Pangkalahatang-ideyang card ng repositoryo na %s
|
||||
release.summary_card_alt = Pangkalahatang-ideyang card ng isang release na nakapamagat na "%s" sa repositoryo na %s
|
||||
|
||||
editor.commit_email = Email ng commit
|
||||
|
||||
[search]
|
||||
commit_kind = Maghanap ng mga commit…
|
||||
keyword_search_unavailable = Kasalukuyang hindi available ang paghahanap sa pamamagitan ng keyword. Mangyaring makipag-ugnayan sa tagapangasiwa ng site.
|
||||
|
@ -2834,11 +2838,11 @@ users.repos = Mga Repo
|
|||
users.send_register_notify = Abisuhan tungkol sa pagrehistro sa pamamagitan ng email
|
||||
users.is_admin = Tagapangasiwa na account
|
||||
users.is_restricted = Pinaghihigpitang account
|
||||
users.allow_import_local = Maaring mag-import ng mga lokal na repositoryo
|
||||
users.allow_import_local = Maaaring mag-import ng mga lokal na repositoryo
|
||||
users.allow_create_organization = Makakagawa ng mga organisasyon
|
||||
users.update_profile = I-update ang user account
|
||||
users.delete_account = Burahin ang user account
|
||||
users.cannot_delete_self = Hindi mo maaring burahin ang sarili mo
|
||||
users.cannot_delete_self = Hindi mo maaaring burahin ang sarili mo
|
||||
users.still_own_repo = Ang user na ito ay nagmamay-ari pa ng isa o higit pang mga repositoryo. Burahin o ilipat sila muna.
|
||||
users.list_status_filter.is_active = Aktibo
|
||||
users.list_status_filter.not_active = Hindi aktibo
|
||||
|
@ -2911,7 +2915,7 @@ dashboard.delete_old_system_notices = Burahin ang lahat ng mga lumang paunawa ng
|
|||
dashboard.gc_lfs = I-garbage collect ang mga LFS meta object
|
||||
dashboard.stop_zombie_tasks = Itigil ang mga zombie action task
|
||||
users.user_manage_panel = Ipamahala ang mga user account
|
||||
users.new_account = Gumawa ng User Account
|
||||
users.new_account = Gumawa ng user account
|
||||
users.auth_login_name = Pangalan ng sign-in authentication
|
||||
users.password_helper = Iwanang walang laman ang password upang panatilihing hindi nabago.
|
||||
users.max_repo_creation = Pinakamataas na numero ng mga repositoryo
|
||||
|
@ -3109,7 +3113,7 @@ config.allow_dots_in_usernames = Payagan ang mga user na gumamit ng mga dot sa k
|
|||
config.https_only = HTTPS lamang
|
||||
auths.tip.github = Magrehistro ng bagong OAuth application sa %s
|
||||
auths.tip.gitlab_new = Magrehistro ng bagong application sa %s
|
||||
emails.delete_primary_email_error = Hindi mo maaring burahin ang pangunahing email.
|
||||
emails.delete_primary_email_error = Hindi mo maaaring burahin ang pangunahing email.
|
||||
config.provider_config = Config ng provider
|
||||
config.cache_test_slow = Matagumpay ang pagsubok ng cache, ngunit mabagal ang tugon: %s.
|
||||
config.picture_config = Configuration ng larawan at avatar
|
||||
|
@ -3260,7 +3264,7 @@ config.cookie_name = Pangalan ng cookie
|
|||
config.gc_interval_time = Oras ng pagitan ng GC
|
||||
config.cookie_life_time = Lifetime ng cookie
|
||||
config.git_clone_timeout = Timeout ng operasyon na pag-clone
|
||||
monitor.process.cancel_desc = Ang pagkansela ng proseso ay maaring magdulot ng pagkawalan ng data
|
||||
monitor.process.cancel_desc = Ang pagkansela ng proseso ay maaaring magdulot ng pagkawalan ng data
|
||||
monitor.queue.name = Pangalan
|
||||
auths.oauth2_required_claim_value_helper = Itakda ang value na ito upang i-restrict ang pag-login mula sa pinagmulang ito sa mga user na may claim na may ganitong pangalan at value
|
||||
auths.tip.bitbucket = Magrehistro ng bagong OAuth consumer sa %s at idagdag ang pahintulot na "Account" - "Read"
|
||||
|
@ -3346,7 +3350,7 @@ members.member = Miyembro
|
|||
members.private_helper = Gawing visible
|
||||
settings.location = Lokasyon
|
||||
settings.update_setting_success = Nabago na ang mga setting ng organisasyon.
|
||||
teams.can_create_org_repo_helper = Maaring gumawa ang mga miyembro ng mga bagong repositoryo sa organisasyon. Magkakaroon ng tagapangasiwa na access ang tagagawa sa bagong repositoryo.
|
||||
teams.can_create_org_repo_helper = Maaaring gumawa ang mga miyembro ng mga bagong repositoryo sa organisasyon. Magkakaroon ng tagapangasiwa na access ang tagagawa sa bagong repositoryo.
|
||||
settings.change_orgname_prompt = Tandaan: Ang pagpalit ng pangalan ng organisasyon ay papalitan din ang URL ng organisasyon at mapapalaya ang lumang pangalan.
|
||||
settings.labels_desc = Magdagdag ng mga label na magagamit sa mga isyu para sa <strong>lahat ng mga repositoryo</strong> sa ilalim ng organisasyon.
|
||||
members.public_helper = Gawing nakatago
|
||||
|
@ -3619,7 +3623,7 @@ variables.deletion.description = Permanente ang pagtanggal ng isang variable at
|
|||
status.running = Tumatakbo
|
||||
runners.new_notice = Paano magsimula ng runner
|
||||
runners.update_runner_success = Matagumpay na na-update ang runner
|
||||
runners.delete_runner_notice = Kapag may trabaho na tumatakbo sa runner na ito, titigilan ito at mamarkahan bilang nabigo. Maaring sirain ang building workflow.
|
||||
runners.delete_runner_notice = Kapag may trabaho na tumatakbo sa runner na ito, titigilan ito at mamarkahan bilang nabigo. Maaaring sirain ang building workflow.
|
||||
runners.none = Walang mga available na runner
|
||||
runs.status_no_select = Lahat ng status
|
||||
runs.empty_commit_message = (walang laman na mensahe ng commit)
|
||||
|
@ -3664,6 +3668,8 @@ runs.expire_log_message = Na-purge ang mga log dahil masyado silang luma.
|
|||
runs.no_workflows.help_write_access = Hindi alam kung paano magsimula sa Forgejo Actions? Tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">mabilisang pagsimula sa user documentation</a> para magsimulang magsulat ng unang workflow, at <a target="_blank" rel="noopener noreferrer" href="%s">mag-setup ng Forgejo runner</a> para patakbuhin ang mga job.
|
||||
runs.no_workflows.help_no_write_access = Para matuto tungkol sa Forgejo Actions, tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">dokumentasyon</a>.
|
||||
|
||||
variables.not_found = Nabigong hanapin ang variable.
|
||||
|
||||
[action]
|
||||
commit_repo = itinulak sa <a href="%[2]s">%[3]s</a> sa <a href="%[1]s">%[4]s</a>
|
||||
create_issue = `binuksan ang isyu na <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
@ -3684,7 +3690,7 @@ approve_pull_request = `inaprubahan ang <a href="%[1]s">%[3]s#%[2]s</a>`
|
|||
review_dismissed_reason = Dahilan:
|
||||
compare_branch = Ikumpara
|
||||
reject_pull_request = `nagmungkahi ng mga pagbabago para sa <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
rename_repo = pinalitan ang pangalan ng repositoryo mula <code>%[1]s</code> sa <a href="%[2]s">%[3]#</a>
|
||||
rename_repo = pinalitan ang pangalan ng repositoryo mula <code>%[1]s</code> sa <a href="%[2]s">%[3]s</a>
|
||||
close_issue = `sinara ang isyu na <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
review_dismissed = `na-dismiss ang pagsusuri mula <b>%[4]s</b> para sa <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_pull_request = `sinara ang hiling sa paghila na <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
@ -3758,7 +3764,7 @@ error.unit_not_allowed = Hindi ka pinapayagang ma-access ang seksyon ng reposito
|
|||
|
||||
[dropzone]
|
||||
default_message = I-drop ang mga file o mag-click dito para mag-upload.
|
||||
invalid_input_type = Hindi ka maaring mag-upload ng mga file sa uri na ito.
|
||||
invalid_input_type = Hindi ka maaaring mag-upload ng mga file sa uri na ito.
|
||||
file_too_big = Ang laki ng file ({{filesize}}) MB) ay lumalagpas sa pinakamataas na size na ({{maxFilesize}} MB).
|
||||
remove_file = Tanggalin ang file
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue