mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-10-02 13:29:10 +00:00
Compare commits
46 commits
ee6bae63e4
...
be6543a1bd
Author | SHA1 | Date | |
---|---|---|---|
|
be6543a1bd | ||
|
9b8c8ae64a | ||
|
641e08bc3d | ||
|
8b172db05f | ||
|
d591bc4afe | ||
|
ee2aa3cc88 | ||
|
26014e1e31 | ||
|
8f92d997a9 | ||
|
04ad9bea50 | ||
|
dd163e9b47 | ||
|
1bef5d52b7 | ||
|
487774db39 | ||
|
82655cba26 | ||
|
c932fe622b | ||
|
b32908d2e6 | ||
|
509801d6ef | ||
|
07bafddb8c | ||
|
36e6dd6e0e | ||
|
55d59738e6 | ||
|
9f29543776 | ||
|
f077d49bc6 | ||
|
55d9c1bad3 | ||
|
e6b84f9191 | ||
|
de99a9c93e | ||
|
36f2b8656e | ||
|
be373e948e | ||
|
f79d2fba07 | ||
|
d2eac83f6a | ||
|
df0e50a08f | ||
|
d25a3709d9 | ||
|
e28a1e1d38 | ||
|
aec55ac1b6 | ||
|
9a7fc2e55e | ||
|
2099c2af7c | ||
|
502a6a4461 | ||
|
c9ea78eb1c | ||
|
8178d6eaba | ||
|
36af3348bc | ||
|
b496317b5a | ||
|
5ccf79d05c | ||
|
30b8b45e5e | ||
|
65b3136261 | ||
|
ff65d34f03 | ||
|
a226064711 | ||
|
8f0a05a7e4 | ||
|
ed656ca0f3 |
45 changed files with 770 additions and 389 deletions
|
@ -6,7 +6,7 @@
|
|||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"version": "20"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/git-lfs:1.2.1": {},
|
||||
"ghcr.io/devcontainers/features/git-lfs:1.2.3": {},
|
||||
"ghcr.io/devcontainers-contrib/features/poetry:2": {},
|
||||
"ghcr.io/devcontainers/features/python:1": {
|
||||
"version": "3.12"
|
||||
|
|
|
@ -41,7 +41,7 @@ jobs:
|
|||
with:
|
||||
node-version: 20
|
||||
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "go.mod"
|
||||
|
||||
|
@ -87,7 +87,7 @@ jobs:
|
|||
|
||||
- name: cache node_modules
|
||||
id: node
|
||||
uses: https://code.forgejo.org/actions/cache@v3
|
||||
uses: https://code.forgejo.org/actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
node_modules
|
||||
|
|
|
@ -20,7 +20,7 @@ jobs:
|
|||
image: 'code.forgejo.org/oci/playwright:latest'
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "go.mod"
|
||||
- run: |
|
||||
|
|
|
@ -72,7 +72,7 @@ jobs:
|
|||
|
||||
- name: set up go for the DNS update below
|
||||
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
|
||||
uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
uses: https://code.forgejo.org/actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "go.mod"
|
||||
- name: update the _release.experimental DNS record
|
||||
|
|
|
@ -13,7 +13,7 @@ jobs:
|
|||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "go.mod"
|
||||
cache: false
|
||||
|
|
|
@ -23,7 +23,7 @@ jobs:
|
|||
${{ toJSON(github.event) }}
|
||||
EOF
|
||||
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: "go.mod"
|
||||
cache: false
|
||||
|
|
|
@ -20,10 +20,10 @@ jobs:
|
|||
${{ toJSON(github) }}
|
||||
EOF
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- run: su forgejo -c 'make deps-backend deps-tools'
|
||||
- run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
frontend-checks:
|
||||
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
|
||||
runs-on: docker
|
||||
|
@ -58,16 +58,16 @@ jobs:
|
|||
MINIO_ROOT_PASSWORD: 12345678
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: install git >= 2.42
|
||||
uses: ./.forgejo/workflows/composite/apt-install-from
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git
|
||||
- name: test release-notes-assistant.sh
|
||||
run: |
|
||||
apt-get -q install -qq -y jq
|
||||
./release-notes-assistant.sh test_main
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-backend test-check'
|
||||
timeout-minutes: 50
|
||||
|
@ -102,12 +102,12 @@ jobs:
|
|||
options: ${{ matrix.cacher.options }}
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: install git >= 2.42
|
||||
uses: ./.forgejo/workflows/composite/apt-install-from
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-remote-cacher test-check'
|
||||
timeout-minutes: 50
|
||||
|
@ -133,12 +133,12 @@ jobs:
|
|||
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows/composite/apt-install-from
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-mysql-migration test-mysql'
|
||||
timeout-minutes: 50
|
||||
|
@ -165,12 +165,12 @@ jobs:
|
|||
POSTGRES_PASSWORD: postgres
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows/composite/apt-install-from
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-pgsql-migration test-pgsql'
|
||||
timeout-minutes: 50
|
||||
|
@ -186,12 +186,12 @@ jobs:
|
|||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- name: install dependencies & git >= 2.42
|
||||
uses: ./.forgejo/workflows/composite/apt-install-from
|
||||
uses: ./.forgejo/workflows-composite/apt-install-from
|
||||
with:
|
||||
packages: git git-lfs
|
||||
- uses: ./.forgejo/workflows/composite/build-backend
|
||||
- uses: ./.forgejo/workflows-composite/build-backend
|
||||
- run: |
|
||||
su forgejo -c 'make test-sqlite-migration test-sqlite'
|
||||
timeout-minutes: 50
|
||||
|
@ -213,6 +213,6 @@ jobs:
|
|||
image: 'code.forgejo.org/oci/node:20-bookworm'
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: ./.forgejo/workflows/composite/setup-env
|
||||
- uses: ./.forgejo/workflows-composite/setup-env
|
||||
- run: su forgejo -c 'make deps-backend deps-tools'
|
||||
- run: su forgejo -c 'make security-check'
|
||||
|
|
11
cmd/serv.go
11
cmd/serv.go
|
@ -147,6 +147,12 @@ func runServ(c *cli.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
_ = fail(ctx, "Internal Server Error", "Panic: %v\n%s", err, log.Stack(2))
|
||||
}
|
||||
}()
|
||||
|
||||
keys := strings.Split(c.Args().First(), "-")
|
||||
if len(keys) != 2 || keys[0] != "key" {
|
||||
return fail(ctx, "Key ID format error", "Invalid key argument: %s", c.Args().First())
|
||||
|
@ -193,10 +199,7 @@ func runServ(c *cli.Context) error {
|
|||
}
|
||||
|
||||
verb := words[0]
|
||||
repoPath := words[1]
|
||||
if repoPath[0] == '/' {
|
||||
repoPath = repoPath[1:]
|
||||
}
|
||||
repoPath := strings.TrimPrefix(words[1], "/")
|
||||
|
||||
var lfsVerb string
|
||||
if verb == lfsAuthenticateVerb {
|
||||
|
|
|
@ -18,8 +18,32 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep {
|
|||
return fullStepsOfEmptySteps(task)
|
||||
}
|
||||
|
||||
firstStep := task.Steps[0]
|
||||
// firstStep is the first step that has run or running, not include preStep.
|
||||
// For example,
|
||||
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): firstStep is step1.
|
||||
// 2. preStep(Success) -> step1(Skipped) -> step2(Success) -> postStep(Success): firstStep is step2.
|
||||
// 3. preStep(Success) -> step1(Running) -> step2(Waiting) -> postStep(Waiting): firstStep is step1.
|
||||
// 4. preStep(Success) -> step1(Skipped) -> step2(Skipped) -> postStep(Skipped): firstStep is nil.
|
||||
// 5. preStep(Success) -> step1(Cancelled) -> step2(Cancelled) -> postStep(Cancelled): firstStep is nil.
|
||||
var firstStep *actions_model.ActionTaskStep
|
||||
// lastHasRunStep is the last step that has run.
|
||||
// For example,
|
||||
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1.
|
||||
// 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3.
|
||||
// 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2.
|
||||
// So its Stopped is the Started of postStep when there are no more steps to run.
|
||||
var lastHasRunStep *actions_model.ActionTaskStep
|
||||
|
||||
var logIndex int64
|
||||
for _, step := range task.Steps {
|
||||
if firstStep == nil && (step.Status.HasRun() || step.Status.IsRunning()) {
|
||||
firstStep = step
|
||||
}
|
||||
if step.Status.HasRun() {
|
||||
lastHasRunStep = step
|
||||
}
|
||||
logIndex += step.LogLength
|
||||
}
|
||||
|
||||
preStep := &actions_model.ActionTaskStep{
|
||||
Name: preStepName,
|
||||
|
@ -28,32 +52,17 @@ func FullSteps(task *actions_model.ActionTask) []*actions_model.ActionTaskStep {
|
|||
Status: actions_model.StatusRunning,
|
||||
}
|
||||
|
||||
if firstStep.Status.HasRun() || firstStep.Status.IsRunning() {
|
||||
// No step has run or is running, so preStep is equal to the task
|
||||
if firstStep == nil {
|
||||
preStep.Stopped = task.Stopped
|
||||
preStep.Status = task.Status
|
||||
} else {
|
||||
preStep.LogLength = firstStep.LogIndex
|
||||
preStep.Stopped = firstStep.Started
|
||||
preStep.Status = actions_model.StatusSuccess
|
||||
} else if task.Status.IsDone() {
|
||||
preStep.Stopped = task.Stopped
|
||||
preStep.Status = actions_model.StatusFailure
|
||||
if task.Status.IsSkipped() {
|
||||
preStep.Status = actions_model.StatusSkipped
|
||||
}
|
||||
}
|
||||
logIndex += preStep.LogLength
|
||||
|
||||
// lastHasRunStep is the last step that has run.
|
||||
// For example,
|
||||
// 1. preStep(Success) -> step1(Success) -> step2(Running) -> step3(Waiting) -> postStep(Waiting): lastHasRunStep is step1.
|
||||
// 2. preStep(Success) -> step1(Success) -> step2(Success) -> step3(Success) -> postStep(Success): lastHasRunStep is step3.
|
||||
// 3. preStep(Success) -> step1(Success) -> step2(Failure) -> step3 -> postStep(Waiting): lastHasRunStep is step2.
|
||||
// So its Stopped is the Started of postStep when there are no more steps to run.
|
||||
var lastHasRunStep *actions_model.ActionTaskStep
|
||||
for _, step := range task.Steps {
|
||||
if step.Status.HasRun() {
|
||||
lastHasRunStep = step
|
||||
}
|
||||
logIndex += step.LogLength
|
||||
}
|
||||
if lastHasRunStep == nil {
|
||||
lastHasRunStep = preStep
|
||||
}
|
||||
|
|
|
@ -137,6 +137,25 @@ func TestFullSteps(t *testing.T) {
|
|||
{Name: postStepName, Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "first step is skipped",
|
||||
task: &actions_model.ActionTask{
|
||||
Steps: []*actions_model.ActionTaskStep{
|
||||
{Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||
{Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090},
|
||||
},
|
||||
Status: actions_model.StatusSuccess,
|
||||
Started: 10000,
|
||||
Stopped: 10100,
|
||||
LogLength: 100,
|
||||
},
|
||||
want: []*actions_model.ActionTaskStep{
|
||||
{Name: preStepName, Status: actions_model.StatusSuccess, LogIndex: 0, LogLength: 10, Started: 10000, Stopped: 10010},
|
||||
{Status: actions_model.StatusSkipped, LogIndex: 0, LogLength: 0, Started: 0, Stopped: 0},
|
||||
{Status: actions_model.StatusSuccess, LogIndex: 10, LogLength: 80, Started: 10010, Stopped: 10090},
|
||||
{Name: postStepName, Status: actions_model.StatusSuccess, LogIndex: 90, LogLength: 10, Started: 10090, Stopped: 10100},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
|
|
@ -288,6 +288,8 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
|
|||
searchRequest.AddFacet("languages", bleve.NewFacetRequest("Language", 10))
|
||||
}
|
||||
|
||||
searchRequest.SortBy([]string{"-_score", "UpdatedAt"})
|
||||
|
||||
result, err := b.inner.Indexer.SearchInContext(ctx, searchRequest)
|
||||
if err != nil {
|
||||
return 0, nil, nil, err
|
||||
|
|
|
@ -318,7 +318,8 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
|
|||
NumOfFragments(0). // return all highting content on fragments
|
||||
HighlighterType("fvh"),
|
||||
).
|
||||
Sort("repo_id", true).
|
||||
Sort("_score", false).
|
||||
Sort("updated_at", true).
|
||||
From(start).Size(pageSize).
|
||||
Do(ctx)
|
||||
if err != nil {
|
||||
|
@ -349,7 +350,8 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
|
|||
NumOfFragments(0). // return all highting content on fragments
|
||||
HighlighterType("fvh"),
|
||||
).
|
||||
Sort("repo_id", true).
|
||||
Sort("_score", false).
|
||||
Sort("updated_at", true).
|
||||
From(start).Size(pageSize).
|
||||
Do(ctx)
|
||||
if err != nil {
|
||||
|
|
|
@ -33,7 +33,7 @@ password=Heslo
|
|||
access_token=Přístupový token
|
||||
re_type=Potvrzení hesla
|
||||
captcha=CAPTCHA
|
||||
twofa=Dvoufaktorové ověřování
|
||||
twofa=Dvoufázové ověření
|
||||
twofa_scratch=Dvoufaktorový kód
|
||||
passcode=Přístupový kód
|
||||
|
||||
|
@ -434,7 +434,7 @@ non_local_account=Externě ověřovaní uživatelé nemohou změnit své heslo p
|
|||
verify=Ověřit
|
||||
scratch_code=Záložní kód
|
||||
use_scratch_code=Použít záložní kód
|
||||
twofa_scratch_used=Použili jste váš záložní kód. Byli jste přesměrování na stránku s nastavením dvoufaktorového ověřování, kde můžete odstranit registraci vašeho zařízení nebo vygenerovat nový záložní kód.
|
||||
twofa_scratch_used=Použili jste svůj záložní kód. Byli jste přesměrování na stránku s nastavením dvoufázového ověření, kde můžete odstranit registraci vašeho zařízení nebo vygenerovat nový záložní kód.
|
||||
twofa_passcode_incorrect=Vaše heslo je neplatné. Pokud jste ztratili vaše zařízení, použijte záložní kód k přihlášení.
|
||||
twofa_scratch_token_incorrect=Váš záložní kód není správný.
|
||||
login_userpass=Přihlásit se
|
||||
|
@ -622,7 +622,7 @@ repository_files_already_exist.adopt=Soubory pro tento repozitář již existuj
|
|||
repository_files_already_exist.delete=Soubory pro tento repozitář již existují. Musíte je odstranit.
|
||||
repository_files_already_exist.adopt_or_delete=Soubory pro tento repozitář již existují. Přijměte je, nebo je odstraňte.
|
||||
visit_rate_limit=Dosaženo limitu rychlosti dotazů při vzdáleném přístupu.
|
||||
2fa_auth_required=Vzdálený přístup vyžaduje dvoufaktorové ověřování.
|
||||
2fa_auth_required=Vzdálený přístup vyžaduje dvoufázové ověření.
|
||||
org_name_been_taken=Název organizace je již použit.
|
||||
team_name_been_taken=Název týmu je již použit.
|
||||
team_no_units_error=Povolit přístup alespoň do jedné sekce repozitáře.
|
||||
|
@ -732,11 +732,11 @@ applications=Aplikace
|
|||
orgs=Organizace
|
||||
repos=Repozitáře
|
||||
delete=Smazat účet
|
||||
twofa=Dvoufaktorové ověřování (TOTP)
|
||||
twofa=Dvoufázové ověření (TOTP)
|
||||
account_link=Propojené účty
|
||||
organization=Organizace
|
||||
uid=UID
|
||||
webauthn=Dvoufaktorové ověřování (bezpečnostní klíče)
|
||||
webauthn=Dvoufázové ověření (bezpečnostní klíče)
|
||||
|
||||
public_profile=Veřejný profil
|
||||
biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown)
|
||||
|
@ -806,7 +806,7 @@ manage_emails=Správa e-mailových adres
|
|||
manage_themes=Výchozí motiv
|
||||
manage_openid=Adresy OpenID
|
||||
email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla, a pokud není skrytá, pro operace Gitu.
|
||||
theme_desc=Toto bude váš výchozí motiv vzhledu napříč stránkou.
|
||||
theme_desc=Toto bude váš výchozí motiv vzhledu na tomto webu.
|
||||
primary=Hlavní
|
||||
activated=Aktivován
|
||||
requires_activation=Vyžaduje aktivaci
|
||||
|
@ -898,7 +898,7 @@ ssh_principal_deletion_success=SSH Principal certifikát byl odstraněn.
|
|||
added_on=Přidáno %s
|
||||
valid_until_date=Platné do %s
|
||||
valid_forever=Platné navždy
|
||||
last_used=Naposledy použito dne
|
||||
last_used=Naposledy použito
|
||||
no_activity=Žádná aktuální aktivita
|
||||
can_read_info=Čtení
|
||||
can_write_info=Zápis
|
||||
|
@ -928,17 +928,17 @@ access_token_deletion_cancel_action=Zrušit
|
|||
access_token_deletion_confirm_action=Smazat
|
||||
access_token_deletion_desc=Smazání tokenu zruší přístup k vašemu účtu pro aplikace, které jej používají. Tuto akci nelze vrátit. Pokračovat?
|
||||
delete_token_success=Token byl odstraněn. Aplikace, které jej používají již nemají přístup k vašemu účtu.
|
||||
repo_and_org_access=Repozitář a přístup organizace
|
||||
permissions_public_only=Pouze veřejnost
|
||||
repo_and_org_access=Přístup k repozitářům a organizacím
|
||||
permissions_public_only=Pouze veřejné
|
||||
permissions_access_all=Vše (veřejné, soukromé a omezené)
|
||||
select_permissions=Vyberte oprávnění
|
||||
permission_no_access=Bez přístupu
|
||||
permission_read=Přečtené
|
||||
permission_no_access=Žádný přístup
|
||||
permission_read=Čtení
|
||||
permission_write=Čtení a zápis
|
||||
at_least_one_permission=Musíte vybrat alespoň jedno oprávnění pro vytvoření tokenu
|
||||
permissions_list=Oprávnění:
|
||||
|
||||
manage_oauth2_applications=Spravovat aplikace OAuth2
|
||||
manage_oauth2_applications=Správa aplikací OAuth2
|
||||
edit_oauth2_application=Upravit OAuth2 aplikaci
|
||||
oauth2_applications_desc=OAuth2 aplikace umožní aplikacím třetích stran bezpečně ověřit uživatele v této instanci Forgejo.
|
||||
remove_oauth2_application=Odstranit OAuth2 aplikaci
|
||||
|
@ -949,8 +949,8 @@ create_oauth2_application_button=Vytvořit aplikaci
|
|||
create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplikaci.
|
||||
update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci.
|
||||
oauth2_application_name=Název aplikace
|
||||
oauth2_confidential_client=Důvěrný klient. Zvolte jej pro aplikace, které ukládají soubor secret, například webové aplikace. Nevybírejte jej pro nativní aplikace včetně aplikací pro počítače a mobilní zařízení.
|
||||
oauth2_redirect_uris=Přesměrování URI. Použijte nový řádek pro každou URI.
|
||||
oauth2_confidential_client=Důvěrný klient. Vyberte pro aplikace, které udržují tajný klíč v bezpečí, například webové aplikace. Nevybírejte pro nativní aplikace včetně aplikací pro počítače a mobilní zařízení.
|
||||
oauth2_redirect_uris=Přesměrování URI. Zadejte každou URI na vlastní řádek.
|
||||
save_application=Uložit
|
||||
oauth2_client_id=ID klienta
|
||||
oauth2_client_secret=Tajný klíč klienta
|
||||
|
@ -958,12 +958,12 @@ oauth2_regenerate_secret=Obnovit tajný klíč
|
|||
oauth2_regenerate_secret_hint=Ztratili jste svůj tajný klíč?
|
||||
oauth2_client_secret_hint=Tajný klíč se znovu nezobrazí po opuštění nebo obnovení této stránky. Ujistěte se, že jste si jej uložili.
|
||||
oauth2_application_edit=Upravit
|
||||
oauth2_application_create_description=OAuth2 aplikace poskytuje přístup aplikacím třetích stran k uživatelským účtům na této instanci.
|
||||
oauth2_application_create_description=Aplikace OAuth2 poskytují přístup vašim aplikacím třetích stran k uživatelským účtům na této instanci.
|
||||
oauth2_application_remove_description=Odebráním OAuth2 aplikace zabrání přístupu ověřeným uživatelům na této instanci. Pokračovat?
|
||||
oauth2_application_locked=Gitea předregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
|
||||
|
||||
authorized_oauth2_applications=Autorizovat aplikaci OAuth2
|
||||
authorized_oauth2_applications_description=Úspěšně jste povolili přístup k vašemu osobnímu účtu této aplikaci třetí strany. Zrušte prosím přístup aplikacím, které již nejsou používány.
|
||||
authorized_oauth2_applications=Autorizované aplikace OAuth2
|
||||
authorized_oauth2_applications_description=Těmto aplikacím třetích stran jste udělili přístup ke svému osobnímu účtu Forgejo. Zrušte prosím přístup aplikacím, které již nejsou používány.
|
||||
revoke_key=Zrušit
|
||||
revoke_oauth2_grant=Zrušit přístup
|
||||
revoke_oauth2_grant_description=Zrušením přístupu této aplikaci třetí strany ji zabráníte v přístupu k vašim datům. Jste si jisti?
|
||||
|
@ -971,24 +971,24 @@ revoke_oauth2_grant_success=Přístup byl úspěšně zrušen.
|
|||
|
||||
twofa_desc=Dvoufaktorový způsob ověřování zvýší zabezpečení vašeho účtu.
|
||||
twofa_recovery_tip=Pokud ztratíte své zařízení, budete moci použít jednorázový obnovovací klíč k získání přístupu k vašemu účtu.
|
||||
twofa_is_enrolled=Váš účet aktuálně <strong>používá</strong> dvoufaktorové ověřování.
|
||||
twofa_not_enrolled=Váš účet aktuálně nepoužívá dvoufaktorové ověřování.
|
||||
twofa_disable=Zakázat dvoufaktorové ověřování
|
||||
twofa_is_enrolled=Váš účet aktuálně <strong>používá</strong> dvoufázové ověření.
|
||||
twofa_not_enrolled=Váš účet aktuálně nepoužívá dvoufázové ověření.
|
||||
twofa_disable=Zakázat dvoufázové ověření
|
||||
twofa_scratch_token_regenerate=Znovu vygenerovat jednorázový klíč pro obnovení
|
||||
twofa_scratch_token_regenerated=Váš jednorázový klíč pro obnovení je nyní %s. Uložte jej na bezpečné místo, protože se znovu nezobrazí.
|
||||
twofa_enroll=Povolit dvoufaktorové ověřování
|
||||
twofa_disable_note=Dvoufaktorové ověřování můžete zakázat, když bude potřeba.
|
||||
twofa_disable_desc=Zakážete-li dvoufaktorové ověřování, bude váš účet méně zabezpečený. Pokračovat?
|
||||
twofa_enroll=Povolit dvoufázové ověření
|
||||
twofa_disable_note=Dvoufázové ověření můžete v případě potřeby zakázat.
|
||||
twofa_disable_desc=Zakázáním dvoufázového ověření bude váš účet méně bezpečný. Pokračovat?
|
||||
regenerate_scratch_token_desc=Pokud jste ztratili svůj klíč pro obnovení nebo jste jej již použili k přihlášení, můžete jej resetovat zde.
|
||||
twofa_disabled=Dvoufaktorové ověřování bylo zakázáno.
|
||||
twofa_disabled=Dvoufázové ověření bylo zakázáno.
|
||||
scan_this_image=Naskenujte tento obrázek s vaší ověřovací aplikací:
|
||||
or_enter_secret=Nebo zadejte tajný kód: %s
|
||||
then_enter_passcode=A zadejte přístupový kód zobrazený ve vaší aplikaci:
|
||||
passcode_invalid=Přístupový kód není platný. Zkuste to znovu.
|
||||
twofa_enrolled=Ve vašem účtu bylo povoleno dvoufaktorové ověřování. Uložte si jednorázový obnovovací klíč (%s) na bezpečné místo, jelikož již nebude znovu zobrazen.
|
||||
twofa_enrolled=Ve vašem účtu bylo povoleno dvoufázové ověření. Uložte si jednorázový obnovovací klíč (%s) na bezpečné místo, jelikož již nebude znovu zobrazen.
|
||||
twofa_failed_get_secret=Nepodařilo se získat tajemství.
|
||||
|
||||
webauthn_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufaktorové ověřování. Bezpečnostní klíče musí podporovat <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a> standard.
|
||||
webauthn_desc=Bezpečnostní klíče jsou hardwarová zařízení obsahující kryptografické klíče. Mohou být použity pro dvoufázové ověření. Bezpečnostní klíče musí podporovat standard <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>.
|
||||
webauthn_register_key=Přidat bezpečnostní klíč
|
||||
webauthn_nickname=Přezdívka
|
||||
webauthn_delete_key=Odebrat bezpečnostní klíč
|
||||
|
@ -997,7 +997,7 @@ webauthn_key_loss_warning=Pokud ztratíte své bezpečnostní klíče, ztratíte
|
|||
webauthn_alternative_tip=Možná budete chtít nakonfigurovat další metodu ověřování.
|
||||
|
||||
manage_account_links=Propojené účty
|
||||
manage_account_links_desc=Tyto externí účty jsou propojeny s vaším Forgejo účtem.
|
||||
manage_account_links_desc=Tyto externí účty jsou propojeny s vaším účtem Forgejo.
|
||||
account_links_not_available=K vašemu Forgejo účtu nejsou aktuálně připojené žádné externí účty.
|
||||
link_account=Propojit účet
|
||||
remove_account_link=Odstranit propojený účet
|
||||
|
@ -1009,7 +1009,7 @@ hooks.desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repoz
|
|||
orgs_none=Nejste členem žádné organizace.
|
||||
repos_none=Nevlastníte žádné repozitáře.
|
||||
|
||||
delete_account=Odstranit svůj účet
|
||||
delete_account=Odstranit účet
|
||||
delete_prompt=Tato operace natrvalo odstraní váš uživatelský účet. <strong>NELZE</strong> ji vrátit zpět.
|
||||
delete_with_all_comments=Váš účet je mladší než %s. Pro zabránění fantomovým komentářům budou společně s ním odstraněny všechny komentáře u problémů a ŽS.
|
||||
confirm_delete_account=Potvrdit odstranění
|
||||
|
@ -1037,7 +1037,7 @@ access_token_desc = Oprávnění vybraného tokenu omezují autorizaci pouze na
|
|||
blocked_users_none = Nemáte žádné zablokované uživatele.
|
||||
blocked_since = Zablokován od %s
|
||||
hints = Nápovědy
|
||||
additional_repo_units_hint = Navrhnout povolení dalších jednotek úložiště
|
||||
additional_repo_units_hint = Navrhnout povolení dalších jednotek repozitáře
|
||||
update_hints = Aktualizovat nápovědy
|
||||
update_hints_success = Nápovědy byly aktualizovány.
|
||||
additional_repo_units_hint_description = Zobrazit tlačítko „Přidat další jednotky...“ u repozitářů, které nemají povolené všechny dostupné jednotky.
|
||||
|
@ -1058,7 +1058,7 @@ repo_name_helper=Dobrý název repozitáře většinou používá krátká, zapa
|
|||
repo_size=Velikost repozitáře
|
||||
template=Šablona
|
||||
template_select=Vyberte šablonu
|
||||
template_helper=Z repozitáře vytvořit šablonu
|
||||
template_helper=Nastavit repozitář jako šablonu
|
||||
template_description=Šablony repozitářů umožňují uživatelům generovat nové repositáře se stejnou strukturou, soubory a volitelnými nastaveními.
|
||||
visibility=Viditelnost
|
||||
visibility_description=Pouze majitelé nebo členové organizace to budou moci vidět, pokud mají práva.
|
||||
|
@ -1069,7 +1069,7 @@ clone_helper=Potřebujete pomoci s klonováním? Navštivte <a target="_blank" r
|
|||
fork_repo=Fork repozitáře
|
||||
fork_from=Fork z
|
||||
already_forked=Již jsi rozštěpil %s
|
||||
fork_to_different_account=Rozštěpit na jiný účet
|
||||
fork_to_different_account=Vytvořit fork na jiném účtu
|
||||
fork_visibility_helper=Viditelnost rozštěpeného repozitáře nemůže být změněna.
|
||||
fork_branch=Větev, která má být klonována pro fork
|
||||
all_branches=Všechny větve
|
||||
|
@ -1165,7 +1165,7 @@ template.items=Položky šablony
|
|||
template.git_content=Obsah Gitu (výchozí větev)
|
||||
template.git_hooks=Git hooks
|
||||
template.git_hooks_tooltip=Momentálně nemůžete po přidání upravovat nebo odebírat Git hooky. Vyberte pouze v případě, že důvěřujete šabloně repozitáře.
|
||||
template.webhooks=Webové háčky
|
||||
template.webhooks=Webhooky
|
||||
template.topics=Témata
|
||||
template.avatar=Avatar
|
||||
template.issue_labels=Štítky problémů
|
||||
|
@ -1238,7 +1238,7 @@ migrate.cancel_migrating_confirm=Chcete zrušit tuto migraci?
|
|||
mirror_from=zrcadlo
|
||||
forked_from=rozštěpen z
|
||||
generated_from=generováno z
|
||||
fork_from_self=Nemůžete rozštěpit váš vlastní repozitář.
|
||||
fork_from_self=Nemůžete vytvořit fork vašeho vlastního repozitáře.
|
||||
fork_guest_user=Přihlaste se pro vytvoření forku tohoto repozitáře.
|
||||
watch_guest_user=Pro sledování tohoto repozitáře se přihlaste.
|
||||
star_guest_user=Pro hodnocení tohoto repozitáře se přihlaste.
|
||||
|
@ -1246,7 +1246,7 @@ unwatch=Přestat sledovat
|
|||
watch=Sledovat
|
||||
unstar=Oblíbené
|
||||
star=Oblíbit
|
||||
fork=Rozštěpit
|
||||
fork=Fork
|
||||
download_archive=Stáhnout repozitář
|
||||
more_operations=Další operace
|
||||
|
||||
|
@ -1337,7 +1337,7 @@ editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány př
|
|||
editor.edit_this_file=Upravit soubor
|
||||
editor.this_file_locked=Soubor je uzamčen
|
||||
editor.must_be_on_a_branch=Musíte mít zvolenu větev pro úpravu či návrh změn tohoto souboru.
|
||||
editor.fork_before_edit=Musíte rozštěpit tento repozitář pro vytvoření nebo navržení změny tohoto souboru.
|
||||
editor.fork_before_edit=Pro vytvoření nebo navržení změn v tomto souboru musíte vytvořit fork tohoto repozitáře.
|
||||
editor.delete_this_file=Odstranit soubor
|
||||
editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru.
|
||||
editor.file_delete_success=Soubor „%s“ byl odstraněn.
|
||||
|
@ -1345,9 +1345,9 @@ editor.name_your_file=Pojmenujte váš soubor…
|
|||
editor.filename_help=Přidejte adresář zapsáním jeho jména následovaného lomítkem („/“). Adresář odeberete stiskem backspace na začátku vstupního pole.
|
||||
editor.or=nebo
|
||||
editor.cancel_lower=Zrušit
|
||||
editor.commit_signed_changes=Commitnout podepsané změny
|
||||
editor.commit_changes=Commitnout změny
|
||||
editor.add_tmpl=Přidat „<nazevsouboru>“
|
||||
editor.commit_signed_changes=Odeslat podepsané změny
|
||||
editor.commit_changes=Odeslat změny
|
||||
editor.add_tmpl=Přidán „<filename>“
|
||||
editor.add=Přidat %s
|
||||
editor.update=Aktualizovat %s
|
||||
editor.delete=Odstranit %s
|
||||
|
@ -1357,7 +1357,7 @@ editor.fail_to_apply_patch=Nelze použít záplatu „%s“
|
|||
editor.new_patch=Nová záplata
|
||||
editor.commit_message_desc=Přidat volitelný rozšířený popis…
|
||||
editor.signoff_desc=Přidat Signed-off-by podpis přispěvatele na konec zprávy o commitu.
|
||||
editor.commit_directly_to_this_branch=Odevzdat přímo do větve <strong class="branch-name">%s</strong>.
|
||||
editor.commit_directly_to_this_branch=Odeslat přímo do větve <strong class="branch-name">%s</strong>.
|
||||
editor.create_new_branch=Vytvořit <strong>novou větev</strong> pro tento commit a vytvořit žádost o sloučení.
|
||||
editor.create_new_branch_np=Vytvořte <strong>novou větev</strong> z tohoto commitu.
|
||||
editor.propose_file_change=Navrhnout změnu souboru
|
||||
|
@ -1375,8 +1375,8 @@ editor.file_editing_no_longer_exists=Upravovaný soubor „%s“ již není sou
|
|||
editor.file_deleting_no_longer_exists=Odstraňovaný soubor „%s“ již není součástí tohoto repozitáře.
|
||||
editor.file_changed_while_editing=Obsah souboru se od zahájení úprav změnil. <a target="_blank" rel="noopener noreferrer" href="%s">Klikněte sem</a> pro jejich zobrazení nebo <strong>proveďte commit změn ještě jednou</strong> pro jejich přepsání.
|
||||
editor.file_already_exists=Soubor „%s“ již existuje v tomto repozitáři.
|
||||
editor.commit_empty_file_header=Odevzdat prázdný soubor
|
||||
editor.commit_empty_file_text=Soubor, který se chystáte odevzdat, je prázdný. Pokračovat?
|
||||
editor.commit_empty_file_header=Odeslat prázdný soubor
|
||||
editor.commit_empty_file_text=Soubor, který se chystáte odeslat, je prázdný. Pokračovat?
|
||||
editor.no_changes_to_show=Žádné změny k zobrazení.
|
||||
editor.fail_to_update_file=Nepodařilo se aktualizovat/vytvořit soubor „%s“.
|
||||
editor.fail_to_update_file_summary=Chybová zpráva:
|
||||
|
@ -1386,9 +1386,9 @@ editor.push_rejected_summary=Úplná zpráva o zamítnutí:
|
|||
editor.add_subdir=Přidat adresář…
|
||||
editor.unable_to_upload_files=Nepodařilo se nahrát soubory do „%s“. Chyba: %v
|
||||
editor.upload_file_is_locked=Soubor „%s“ je uzamčen uživatelem %s.
|
||||
editor.upload_files_to_dir=Nahrát soubory do „%s“
|
||||
editor.upload_files_to_dir=Nahrány soubory do „%s“
|
||||
editor.cannot_commit_to_protected_branch=Nelze vytvořit commit v chráněné větvi „%s“.
|
||||
editor.no_commit_to_branch=Nelze odevzdat přímo do větve, protože:
|
||||
editor.no_commit_to_branch=Nepodařilo se odeslat přímo do větve:
|
||||
editor.user_no_push_to_branch=Uživatel nemůže nahrávat do větve
|
||||
editor.require_signed_commit=Větev vyžaduje podepsaný commit
|
||||
editor.cherry_pick=Cherry-pick %s na:
|
||||
|
@ -1909,7 +1909,7 @@ pulls.has_merged=Chyba: žádost byla sloučena, nelze ji znovu sloučit nebo zm
|
|||
pulls.push_rejected=Push selhal: nahrání bylo zamítnuto. Zkontrolujte Git hooky pro tento repozitář.
|
||||
pulls.push_rejected_summary=Úplná zpráva o zamítnutí
|
||||
pulls.push_rejected_no_message=Push selhal: nahrání bylo odmítnuto, ale nebyla nalezena žádná vzdálená zpráva. Zkontrolujte Git hooky pro tento repozitář
|
||||
pulls.open_unmerged_pull_exists=`Nemůžete provést operaci znovuotevření protože je tu čekající požadavek na natažení (#%d) s identickými vlastnostmi.`
|
||||
pulls.open_unmerged_pull_exists=`Nemůžete provést operaci opětovného otevření, protože máte čekající žádost o sloučení (#%d) s identickými vlastnostmi.`
|
||||
pulls.status_checking=Některé kontroly jsou nedořešeny
|
||||
pulls.status_checks_success=Všechny kontroly byly úspěšné
|
||||
pulls.status_checks_warning=Některé kontroly nahlásily varování
|
||||
|
@ -1925,8 +1925,8 @@ pulls.update_branch_success=Aktualizace větve byla úspěšná
|
|||
pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev
|
||||
pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi
|
||||
pulls.close=Zavřít žádost o sloučení
|
||||
pulls.closed_at=`uzavřel/a tento požadavek na natažení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.reopened_at=`znovuotevřel/a tento požadavek na natažení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.closed_at=`uzavřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.cmd_instruction_hint=Zobrazit instrukce příkazové řádky
|
||||
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
|
||||
pulls.cmd_instruction_merge_title=Sloučit
|
||||
|
@ -1935,18 +1935,18 @@ pulls.clear_merge_message=Vymazat zprávu o sloučení
|
|||
|
||||
pulls.auto_merge_button_when_succeed=(Když kontroly uspějí)
|
||||
pulls.auto_merge_when_succeed=Automaticky sloučit, když všechny kontroly uspějí
|
||||
pulls.auto_merge_newly_scheduled=Požadavek na natažení byl naplánován na sloučení, jakmile všechny kontroly uspějí.
|
||||
pulls.auto_merge_has_pending_schedule=%[1]s naplánoval/a tento požadavek na natažení pro automatické sloučení, když všechny kontroly uspějí v %[2]s.
|
||||
pulls.auto_merge_newly_scheduled=Žádost o sloučení bude sloučena, jakmile budou všechny kontroly úspěšné.
|
||||
pulls.auto_merge_has_pending_schedule=%[1]s naplánoval/a tuto žádost o sloučení na automatické sloučení, jakmile budou všechny kontroly úspěšné %[2]s.
|
||||
|
||||
pulls.auto_merge_cancel_schedule=Zrušit automatické sloučení
|
||||
pulls.auto_merge_not_scheduled=Tento požadavek na natažení není naplánován na automatické sloučení.
|
||||
pulls.auto_merge_canceled_schedule=Automatické sloučení bylo zrušeno pro tento požadavek na natažení.
|
||||
pulls.auto_merge_not_scheduled=Tato žádost o sloučení nebude automaticky sloučena.
|
||||
pulls.auto_merge_canceled_schedule=Automatické sloučení bylo u této žádosti o sloučení zrušeno.
|
||||
|
||||
pulls.auto_merge_newly_scheduled_comment=`požadavek na automatické sloučení tohoto požadavku na natažení je naplánován, když všechny kontroly uspějí %[1]s`
|
||||
pulls.auto_merge_canceled_schedule_comment=`zrušil/a automatické sloučení tohoto požadavku na natažení, když všechny kontroly uspějí %[1]s`
|
||||
pulls.auto_merge_newly_scheduled_comment=`naplánoval/a tuto žádost o sloučení na automatické sloučení, jakmile budou všechny kontroly úspěšné %[1]s`
|
||||
pulls.auto_merge_canceled_schedule_comment=`zrušil/a automatické sloučení této žádosti o sloučení, jakmile budou všechny kontroly úspěšné %[1]s`
|
||||
|
||||
pulls.delete.title=Odstranit tento požadavek na natažení?
|
||||
pulls.delete.text=Opravdu chcete tento požadavek na natažení smazat? (Tím se trvale odstraní veškerý obsah. Pokud jej hodláte archivovat, zvažte raději jeho uzavření.)
|
||||
pulls.delete.title=Odstranit tuto žádost o sloučení?
|
||||
pulls.delete.text=Opravdu chcete odstranit tuto žádost o sloučení? (Tímto trvale odstraníte všechen obsah. Pokud jej chcete archivovat, zvažte raději jeho uzavření)
|
||||
|
||||
|
||||
pull.deleted_branch=(odstraněno):%s
|
||||
|
@ -1987,12 +1987,12 @@ signing.wont_sign.nokey=Tato instance nemá žádný klíč k podepsání tohoto
|
|||
signing.wont_sign.never=Commity nejsou nikdy podepsány.
|
||||
signing.wont_sign.always=Commity jsou vždy podepsány.
|
||||
signing.wont_sign.pubkey=Commit nebude podepsán, protože nemáte veřejný klíč spojený s vaším účtem.
|
||||
signing.wont_sign.twofa=Pro podepsání commitů musíte mít povoleno dvoufaktorové ověření.
|
||||
signing.wont_sign.twofa=Pro podepisování commitů musíte mít zapnuto dvoufázové ověření.
|
||||
signing.wont_sign.parentsigned=Commit nebude podepsán, protože nadřazený commit není podepsán.
|
||||
signing.wont_sign.basesigned=Sloučení nebude podepsáno, protože základní commit není podepsaný.
|
||||
signing.wont_sign.headsigned=Sloučení nebude podepsáno, protože hlavní revize není podepsána.
|
||||
signing.wont_sign.commitssigned=Sloučení nebude podepsáno, protože všechny přidružené revize nejsou podepsány.
|
||||
signing.wont_sign.approved=Sloučení nebude podepsáno, protože požadavek na natažení není schválen.
|
||||
signing.wont_sign.approved=Sloučení nebude podepsáno, protože žádost o sloučení není schválena.
|
||||
signing.wont_sign.not_signed_in=Nejste přihlášeni.
|
||||
|
||||
ext_wiki=Externí wiki
|
||||
|
@ -2114,7 +2114,7 @@ settings.collaboration.write=Zápis
|
|||
settings.collaboration.read=Čtení
|
||||
settings.collaboration.owner=Vlastník
|
||||
settings.collaboration.undefined=Neurčeno
|
||||
settings.hooks=Webové háčky
|
||||
settings.hooks=Webhooky
|
||||
settings.githooks=Git hooky
|
||||
settings.basic_settings=Základní nastavení
|
||||
settings.mirror_settings=Nastavení zrcadla
|
||||
|
@ -2125,7 +2125,7 @@ settings.mirror_settings.docs.no_new_mirrors=Váš repozitář zrcadlí změny d
|
|||
settings.mirror_settings.docs.can_still_use=I když nemůžete upravit stávající zrcadla nebo vytvořit nová, stále můžete použít své stávající zrcadlo.
|
||||
settings.mirror_settings.docs.more_information_if_disabled=Více informací o zrcadlech pro nahrání a natažení naleznete zde:
|
||||
settings.mirror_settings.docs.doc_link_title=Jak mohu zrcadlit repozitáře?
|
||||
settings.mirror_settings.docs.pulling_remote_title=Stažení ze vzdáleného úložiště
|
||||
settings.mirror_settings.docs.pulling_remote_title=Stahování ze vzdáleného repozitáře
|
||||
settings.mirror_settings.mirrored_repository=Zrcadlený repozitář
|
||||
settings.mirror_settings.direction=Směr
|
||||
settings.mirror_settings.direction.pull=Natáhnout
|
||||
|
@ -2264,23 +2264,23 @@ settings.delete_team_tip=Tento tým má přístup ke všem repositářům a nem
|
|||
settings.remove_team_success=Přístup týmu k repozitáři byl odstraněn.
|
||||
settings.add_webhook=Přidat webhook
|
||||
settings.add_webhook.invalid_channel_name=Kanál webového háčku nemůže být prázdný a nemůže obsahovat pouze znak #.
|
||||
settings.hooks_desc=Webové háčky automaticky vytvářejí dotazy HTTP POST na server, když nastane určitá událost v Forgejo. Čtěte více v <a target="_blank" rel="noopener noreferrer" href="%s">příručce webových háčků</a>.
|
||||
settings.hooks_desc=Webhooky automaticky vytvářejí dotazy HTTP POST na server, když nastane určitá událost ve Forgejo. Více informací v <a target="_blank" rel="noopener noreferrer" href="%s">příručce webhooků</a>.
|
||||
settings.webhook_deletion=Odstranit webhook
|
||||
settings.webhook_deletion_desc=Odstranění webového háčku smaže jeho nastavení a historii doručení. Pokračovat?
|
||||
settings.webhook_deletion_success=Webový háček byl smazán.
|
||||
settings.webhook_deletion_success=Webhook byl smazán.
|
||||
settings.webhook.test_delivery=Test doručitelnosti
|
||||
settings.webhook.test_delivery_desc=Vyzkoušet tento webový háček pomocí falešné události.
|
||||
settings.webhook.test_delivery_desc_disabled=Chcete-li tento webový háček otestovat s falešnou událostí, aktivujte ho.
|
||||
settings.webhook.test_delivery_desc=Otestovat tento webhook pomocí falešné události.
|
||||
settings.webhook.test_delivery_desc_disabled=Chcete-li pomocí falešné události otestovat tento webhook, aktivujte ho.
|
||||
settings.webhook.request=Požadavek
|
||||
settings.webhook.response=Odpověď
|
||||
settings.webhook.headers=Hlavičky
|
||||
settings.webhook.payload=Obsah
|
||||
settings.webhook.body=Tělo zprávy
|
||||
settings.webhook.replay.description=Zopakovat tento webový háček.
|
||||
settings.webhook.replay.description_disabled=Chcete-li znovu spustit tento webový háček, aktivujte jej.
|
||||
settings.webhook.replay.description=Zopakovat tento webhook.
|
||||
settings.webhook.replay.description_disabled=Chcete-li zopakovat tento webhook, aktivujte jej.
|
||||
settings.webhook.delivery.success=Událost byla přidána do fronty doručení. Může to trvat několik sekund, než se zobrazí v historii doručení.
|
||||
settings.githooks_desc=Git hooks jsou spravovány samotným Gitem. Níže můžete upravit soubory hooků pro nastavení vlastních operací.
|
||||
settings.githook_edit_desc=Je-li háček neaktivní, bude zobrazen vzorový obsah. Nebude-li zadán žádný obsah, háček bude vypnut.
|
||||
settings.githook_edit_desc=Je-li webhook neaktivní, bude zobrazen vzorový obsah. Ponechte prázdné pro zakázání tohoto webhooku.
|
||||
settings.githook_name=Název hooku
|
||||
settings.githook_content=Obsah hooku
|
||||
settings.update_githook=Upravit hook
|
||||
|
@ -2303,7 +2303,7 @@ settings.event_create=Vytvořit
|
|||
settings.event_create_desc=Větev nebo značka vytvořena.
|
||||
settings.event_delete=Smazat
|
||||
settings.event_delete_desc=Větev nebo značka smazána.
|
||||
settings.event_fork=Rozštěpit
|
||||
settings.event_fork=Fork
|
||||
settings.event_fork_desc=Repozitář rozštěpen.
|
||||
settings.event_wiki=Wiki
|
||||
settings.event_wiki_desc=Wiki stránka vytvořena, přejmenována nebo smazána.
|
||||
|
@ -2348,9 +2348,9 @@ settings.authorization_header=Autorizační hlavička
|
|||
settings.authorization_header_desc=Pokud vyplněno, bude připojeno k požadavkům jako autorizační hlavička. Příklady: %s.
|
||||
settings.active=Aktivní
|
||||
settings.active_helper=Informace o spuštěných událostech budou odeslány na URL webového háčku.
|
||||
settings.add_hook_success=Webový háček byl přidán.
|
||||
settings.add_hook_success=Webhook byl přidán.
|
||||
settings.update_webhook=Upravit webhook
|
||||
settings.update_hook_success=Webový háček byl aktualizován.
|
||||
settings.update_hook_success=Webhook byl aktualizován.
|
||||
settings.delete_webhook=Odstranit webhook
|
||||
settings.recent_deliveries=Nedávná doručení
|
||||
settings.hook_type=Typ hooku
|
||||
|
@ -2582,7 +2582,7 @@ diff.hide_file_tree=Skrýt souborový strom
|
|||
|
||||
releases.desc=Sledování verzí projektu a souborů ke stažení.
|
||||
release.releases=Vydání
|
||||
release.detail=Podrobnosti vydání
|
||||
release.detail=Podrobnosti o vydání
|
||||
release.tags=Značky
|
||||
release.new_release=Nové vydání
|
||||
release.draft=Koncept
|
||||
|
@ -2727,7 +2727,7 @@ settings.pull_mirror_sync_in_progress = Probíhá načítání změn ze vzdálen
|
|||
settings.enter_repo_name = Zadejte majitele a repozitář přesně tak, jak je vidíte níže:
|
||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto akci lze v současné chvíli provést pouze v nabídce „Nová migrace“. Pro více informací viz:
|
||||
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
|
||||
settings.mirror_settings.pushed_repository = Pushnutý repozitář
|
||||
settings.mirror_settings.pushed_repository = Odeslaný repozitář
|
||||
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
|
||||
pulls.commit_ref_at = `se odkázal na tuto žádost o sloučení z commitu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
settings.wiki_rename_branch_main = Normalizovat název větve Wiki
|
||||
|
@ -2783,8 +2783,8 @@ settings.enforce_on_admins_desc = Správci repozitáře nemohou obejít toto pra
|
|||
issues.num_participants_one = %d účastník
|
||||
size_format = %[1]s: %[2]s, %[3]s: %[4]s
|
||||
issues.archived_label_description = (Archivován) %s
|
||||
release.download_count_one = %d stažení
|
||||
release.download_count_few = %d stažení
|
||||
release.download_count_one = %s stažení
|
||||
release.download_count_few = %s stažení
|
||||
release.system_generated = Tato příloha byla automaticky vygenerována.
|
||||
settings.add_webhook.invalid_path = Cesta nesmí obsahovat část, která je „.“ nebo „..“ nebo prázdný řetězec. Nesmí začínat ani končit lomítkem.
|
||||
settings.web_hook_name_sourcehut_builds = Sestavení SourceHut
|
||||
|
@ -2885,7 +2885,7 @@ settings.email=Kontaktní e-mail
|
|||
settings.website=Webové stránky
|
||||
settings.location=Umístění
|
||||
settings.permission=Oprávnění
|
||||
settings.repoadminchangeteam=Správce úložišť může týmům přidávat a odebírat přístup
|
||||
settings.repoadminchangeteam=Správce repozitářů může týmům přidávat a odebírat přístup
|
||||
settings.visibility=Viditelnost
|
||||
settings.visibility.public=Veřejná
|
||||
settings.visibility.limited=Omezená (viditelné pouze pro ověřené uživatele)
|
||||
|
@ -2904,7 +2904,7 @@ settings.delete_prompt=Organizace bude trvale odstraněna. Tato změna <strong>N
|
|||
settings.confirm_delete_account=Potvrdit odstranění
|
||||
settings.delete_org_title=Odstranit organizaci
|
||||
settings.delete_org_desc=Tato organizace bude trvale smazána. Pokračovat?
|
||||
settings.hooks_desc=Přidat webové háčky, které budou spouštěny pro <strong>všechny repozitáře</strong> v této organizaci.
|
||||
settings.hooks_desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> v této organizaci.
|
||||
|
||||
settings.labels_desc=Přidejte štítky, které mohou být použity pro problémy <strong>všech repozitářů</strong> v rámci této organizace.
|
||||
|
||||
|
@ -2983,7 +2983,7 @@ identity_access=Identita a přístup
|
|||
users=Uživatelské účty
|
||||
organizations=Organizace
|
||||
repositories=Repozitáře
|
||||
hooks=Webové háčky
|
||||
hooks=Webhooky
|
||||
integrations=Integrace
|
||||
authentication=Zdroje ověření
|
||||
emails=Uživatelské e-maily
|
||||
|
@ -3183,12 +3183,12 @@ packages.size=Velikost
|
|||
packages.published=Publikováno
|
||||
|
||||
defaulthooks=Výchozí webhooky
|
||||
defaulthooks.add_webhook=Přidat výchozí webový háček
|
||||
defaulthooks.update_webhook=Aktualizovat výchozí webový háček
|
||||
defaulthooks.add_webhook=Přidat výchozí webhook
|
||||
defaulthooks.update_webhook=Aktualizovat výchozí webhook
|
||||
|
||||
systemhooks=Systémové webhooky
|
||||
systemhooks.add_webhook=Přidat systémový webový háček
|
||||
systemhooks.update_webhook=Aktualizovat systémový webový háček
|
||||
systemhooks.add_webhook=Přidat systémový webhook
|
||||
systemhooks.update_webhook=Aktualizovat systémový webhook
|
||||
|
||||
auths.auth_manage_panel=Správa zdrojů ověřování
|
||||
auths.new=Přidat zdroj ověřování
|
||||
|
@ -3636,7 +3636,7 @@ error.unit_not_allowed=Nejste oprávněni přistupovat k této části repozitá
|
|||
[packages]
|
||||
title=Balíčky
|
||||
desc=Správa balíčků repozitáře.
|
||||
empty=Zatím nejsou žádné balíčky.
|
||||
empty=Zatím zde nejsou žádné balíčky.
|
||||
empty.documentation=Další informace o registru balíčků naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
||||
empty.repo=Nahráli jste balíček, ale nezobrazil se zde? Přejděte na <a href="%[1]s">nastavení balíčku</a> a propojte jej s tímto repozitářem.
|
||||
registry.documentation=Další informace o registru %s naleznete v <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaci</a>.
|
||||
|
@ -3754,7 +3754,7 @@ settings.delete.success=Balíček byl odstraněn.
|
|||
settings.delete.error=Nepodařilo se odstranit balíček.
|
||||
owner.settings.cargo.title=Index registru Cargo
|
||||
owner.settings.cargo.initialize=Inicializovat index
|
||||
owner.settings.cargo.initialize.description=Pro použití Cargo registru je zapotřebí speciální index Git. Použití této možnosti (znovu)vytvoří repozitář a automaticky jej nastaví.
|
||||
owner.settings.cargo.initialize.description=Pro použití registru Cargo je zapotřebí speciální index Git. Použití této možnosti (znovu) vytvoří repozitář a automaticky jej nastaví.
|
||||
owner.settings.cargo.initialize.error=Nepodařilo se inicializovat Cargo index: %v
|
||||
owner.settings.cargo.initialize.success=Index Cargo byl úspěšně vytvořen.
|
||||
owner.settings.cargo.rebuild=Znovu vytvořit index
|
||||
|
@ -3893,7 +3893,7 @@ workflow.disabled=Pracovní postup je zakázán.
|
|||
variables=Proměnné
|
||||
variables.management=Správa proměnných
|
||||
variables.creation=Přidat proměnnou
|
||||
variables.none=Zatím nejsou žádné proměnné.
|
||||
variables.none=Zatím zde nejsou žádné proměnné.
|
||||
variables.deletion=Odstranit proměnnou
|
||||
variables.deletion.description=Odstranění proměnné je trvalé a nelze jej vrátit zpět. Pokračovat?
|
||||
variables.description=Proměnné budou předány určitým akcím a nelze je přečíst jinak.
|
||||
|
|
|
@ -2434,7 +2434,7 @@ settings.require_signed_commits_desc=Pushes auf diesen Branch ablehnen, wenn Com
|
|||
settings.protect_branch_name_pattern=Muster für geschützte Branchnamen
|
||||
settings.protect_patterns=Muster
|
||||
settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt)
|
||||
settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%s">github.com/gobwas/glob</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%s">%s</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt)
|
||||
settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe <a href="%[1]s">%[2]s</a> Dokumentation zur Mustersyntax. Beispiele: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Schutz aktivieren
|
||||
|
@ -3974,7 +3974,7 @@ issues.write = <b>Schreiben:</b> Issues schließen und Metadaten wie Labels, Mei
|
|||
pulls.read = <b>Lesen:</b> Pull-Requests lesen und erstellen.
|
||||
releases.read = <b>Lesen:</b> Releases ansehen und herunterladen.
|
||||
releases.write = <b>Schreiben:</b> Releases und ihre Assets veröffentlichen, bearbeiten und löschen.
|
||||
wiki.read = <b>Read:</b> Das integrierte Wiki und seine Historie lesen.
|
||||
wiki.read = <b>Lesen:</b> Das integrierte Wiki und seine Historie lesen.
|
||||
wiki.write = <b>Schreiben:</b> Seiten im integrierten Wiki erstellen, aktualisieren und löschen.
|
||||
projects.read = <b>Lesen:</b> Zugriff auf Projektboards des Repositories.
|
||||
projects.write = <b>Schreiben:</b> Projekte und Spalten erstellen und bearbeiten.
|
||||
|
|
|
@ -2442,7 +2442,7 @@ settings.protect_branch_name_pattern=Μοτίβο προστατευμένου
|
|||
settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε <a href="%s">την τεκμηρίωση</a> για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/**
|
||||
settings.protect_patterns=Μοτίβα
|
||||
settings.protect_protected_file_patterns=Μοτίβα προστατευμένων αρχείων (διαχωρισμός με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
||||
settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση <a href='%s'>github.com/gobwas/glob</a>. Παράδειγμα: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση <a href='%s'>%s</a>. Παράδειγμα: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό):
|
||||
settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση <a href='%[1]s'>%[2]s</a> για τη σύνταξη του μοτίβου. Πχ: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Ενεργοποίηση προστασίας
|
||||
|
|
|
@ -2431,7 +2431,7 @@ settings.require_signed_commits_desc=Rechazar push en esta rama si los commits n
|
|||
settings.protect_branch_name_pattern=Patrón de nombre de ramas protegidas
|
||||
settings.protect_patterns=Patrones
|
||||
settings.protect_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma ';')
|
||||
settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de <a href='%s'>github.com/gobwas/glob</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de <a href='%s'>%s</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ";")
|
||||
settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de <a href='%[1]s'>%[2]s</a> para la sintaxis de patrones. Ejemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Activar protección
|
||||
|
|
|
@ -15,9 +15,9 @@ page=صفحه
|
|||
template=قالب
|
||||
language=زبان
|
||||
notifications=اعلانها
|
||||
active_stopwatch=فعال کردن ثبت زمان
|
||||
active_stopwatch=فعال کردن ردیاب زمان
|
||||
create_new=ایجاد…
|
||||
user_profile_and_more=پروفایل و تنظیمات…
|
||||
user_profile_and_more=نمایه و تنظیمات…
|
||||
signed_in_as=ورود به عنوان
|
||||
toc=فهرست محتویات
|
||||
licenses=گواهینامه ها
|
||||
|
|
|
@ -2008,6 +2008,8 @@ settings.mirror_settings.docs.disabled_push_mirror.info = Na-disable ng iyong ta
|
|||
settings.mirror_settings.docs.disabled_push_mirror.instructions = I-set up ang iyong proyekto na awtomatikong hilahin ang mga commit, tag at branch mula sa isa pang repositoryo.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = I-set up ang iyong proyekto na awtomatikong magtulak ng mga commit, tag at branch sa isa pang repositoryo. Na-disable ng iyong tagapangasiwa ng site ang mga pull mirror.
|
||||
activity.overview = Pangkalahatang Ideya
|
||||
mirror_public_key = Pampublikong susi ng SSH
|
||||
milestones.cancel =
|
||||
|
||||
[search]
|
||||
commit_kind = Maghanap ng mga commit...
|
||||
|
|
|
@ -2742,7 +2742,7 @@ settings.protect_status_check_patterns_desc = Inserisci sequenze per specificare
|
|||
settings.authorization_header_desc = Verrà inclusa come intestazione dell'autorizzazione per le richieste quando presente. Esempi: %s.
|
||||
pulls.title_desc_one = vuole fondere %[1]d commit da <code>%[2]s</code> in <code id="branch_target">%[3]s</code>
|
||||
settings.protect_unprotected_file_patterns_desc = File non protetti dei quali è consentita la modifica direttamente se l'utente ha permesso di scrittura, saltandole restrizioni di immissione. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su <a href="%[1]s">%[2]s</a> per la sintassi delle sequenze glob. Esempi <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su <a href="%s">github.com/gobwas/glob</a> per la sintassi della sequenze. Esempi: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su <a href="%s">%s</a> per la sintassi della sequenze. Esempi: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_no_valid_status_check_patterns = Nessuna sequenza valida per il controllo dello stato.
|
||||
settings.event_pull_request_review_request_desc = Richiesta la revisione della richiesta di modifica o richiesta di revisione rimossa.
|
||||
stars = Stelle
|
||||
|
|
|
@ -2413,7 +2413,7 @@ settings.protect_branch_name_pattern=保護ブランチ名のパターン
|
|||
settings.protect_branch_name_pattern_desc=保護ブランチ名のパターン。書き方については <a href="%s">ドキュメント</a> を参照してください。例: main, release/**
|
||||
settings.protect_patterns=パターン
|
||||
settings.protect_protected_file_patterns=保護されるファイルのパターン (セミコロン';'で区切る):
|
||||
settings.protect_protected_file_patterns_desc=保護されたファイルは、このブランチにファイルを追加・編集・削除する権限を持つユーザーであっても、直接変更することができなくなります。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については <a href='%s'>github.com/gobwas/glob</a> を参照してください。 例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>
|
||||
settings.protect_protected_file_patterns_desc=保護されたファイルは、このブランチにファイルを追加・編集・削除する権限を持つユーザーであっても、直接変更することができなくなります。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については <a href='%s'>%s</a> を参照してください。 例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>
|
||||
settings.protect_unprotected_file_patterns=保護しないファイルのパターン (セミコロン';'で区切る):
|
||||
settings.protect_unprotected_file_patterns_desc=保護しないファイルは、ユーザーに書き込み権限があればプッシュ制限をバイパスして直接変更できます。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については <a href='%[1]s'>%[2]s</a> を参照してください。 例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>
|
||||
settings.add_protected_branch=保護を有効にする
|
||||
|
|
|
@ -2323,7 +2323,7 @@ settings.protect_branch_name_pattern=Aizsargātā zara šablons
|
|||
settings.protect_branch_name_pattern_desc=Aizsargāto atzaru nosaukumu šabloni. Šablonu pierakstu skatīt <a href="%s">dokumentācijā</a>. Piemēri: main, release/**
|
||||
settings.protect_patterns=Šabloni
|
||||
settings.protect_protected_file_patterns=Aizsargāto failu šablons (vairākus var norādīt atdalot ar semikolu ';'):
|
||||
settings.protect_protected_file_patterns_desc=Aizsargātie faili, ko nevar mainīt, pat ja lietotājam ir tiesības veidot jaunus, labot vai dzēst failus šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama <a href='%s'>github.com/gobwas/glob</a> dokumentācijā. Piemēram, <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Aizsargātie faili, ko nevar mainīt, pat ja lietotājam ir tiesības veidot jaunus, labot vai dzēst failus šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama <a href='%s'>%s</a> dokumentācijā. Piemēram, <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Neaizsargāto failu šablons (vairākus var norādīt atdalot ar semikolu ';'):
|
||||
settings.protect_unprotected_file_patterns_desc=Neaizsargātie faili, ko iespējams mainīt apejot iesūtīšanas ierobežojumus, ja lietotājam ir tiesības iesūtīt izmaiņas šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama <a href='%[1]s'>%[2]s</a> dokumentācijā. Piemēram, <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Iespējot aizsargāšanu
|
||||
|
|
|
@ -2692,7 +2692,7 @@ settings.wiki_rename_branch_main_notices_2 = Dit zal de interne branch van %s's
|
|||
settings.trust_model.collaborator.desc = Geldige handtekeningen van samenwerkers van deze repository worden als "vertrouwd" gemarkeerd - (of ze nu overeenkomen met de committer of niet). Anders worden geldige handtekeningen gemarkeerd als "niet-vertrouwd" als de handtekening overeenkomt met de committer en "niet-gematcht" als dat niet het geval is.
|
||||
settings.trust_model.committer.desc = Geldige handtekeningen zullen alleen "vertrouwd" gemarkeerd worden als ze overeenkomen met de committer, anders zullen ze gemarkeerd worden als "ongeëvenaard". Dit dwingt Forgejo om de committer te zijn op ondertekende commits met de werkelijke committer gemarkeerd als Co-authored-by: en Co-committed-by: aanhanger in de commit. De standaard Forgejo sleutel moet overeenkomen met een gebruiker in de database.
|
||||
settings.pulls.enable_autodetect_manual_merge = Handmatig samenvoegen met autodetectie inschakelen (Opmerking: In sommige speciale gevallen kunnen hierdoor verkeerde beoordelingen optreden)
|
||||
settings.protect_protected_file_patterns_desc = Beschermde bestanden mogen niet direct gewijzigd worden, zelfs als de gebruiker rechten heeft om bestanden in deze branch toe te voegen, te bewerken of te verwijderen. Meerdere patronen kunnen gescheiden worden met een puntkomma (";"). Zie <a href="%s">github.com/gobwas/glob</a> documentatie voor patroon syntax. Voorbeelden: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc = Beschermde bestanden mogen niet direct gewijzigd worden, zelfs als de gebruiker rechten heeft om bestanden in deze branch toe te voegen, te bewerken of te verwijderen. Meerdere patronen kunnen gescheiden worden met een puntkomma (";"). Zie <a href="%s">%s</a> documentatie voor patroon syntax. Voorbeelden: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
wiki.delete_page_notice_1 = Het verwijderen van de wikipagina "%s" kan niet ongedaan worden gemaakt. Doorgaan?
|
||||
wiki.reserved_page = De wikipaginanaam "%s" is gereserveerd.
|
||||
activity.navbar.pulse = Puls
|
||||
|
|
|
@ -2370,7 +2370,7 @@ settings.require_signed_commits_desc=Rejeitar pushes para este branch se não es
|
|||
settings.protect_branch_name_pattern=Padrão de Nome de Branch Protegida
|
||||
settings.protect_patterns=Padrões
|
||||
settings.protect_protected_file_patterns=Padrões de arquivos protegidos (separados usando ponto e vírgula ';'):
|
||||
settings.protect_protected_file_patterns_desc=Arquivos protegidos não podem ser alterados diretamente, mesmo que o usuário tenha direitos para adicionar, editar ou excluir arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula (';'). Consulte a documentação <a href='%s'>github.com/gobwas/glob</a> para a sintaxe padrão. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Arquivos protegidos não podem ser alterados diretamente, mesmo que o usuário tenha direitos para adicionar, editar ou excluir arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula (';'). Consulte a documentação <a href='%s'>%s</a> para a sintaxe padrão. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Padrões de arquivos desprotegidos (separados usando ponto e vírgula ';'):
|
||||
settings.protect_unprotected_file_patterns_desc=Arquivos não protegidos que podem ser alterados diretamente se o usuário tiver acesso de gravação, ignorando as restrições de push. Vários padrões podem ser separados usando ponto e vírgula (\;'). Veja <a href='%[1]s'>%[2]s</a> documentação para sintaxe de padrões. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Habilitar proteção
|
||||
|
|
|
@ -2458,7 +2458,7 @@ settings.protect_branch_name_pattern=Padrão do nome do ramo protegido
|
|||
settings.protect_branch_name_pattern_desc=Padrões de nomes de ramos protegidos. Consulte <a href="%s">a documentação</a> para ver a sintaxe dos padrões. Exemplos: main, release/**
|
||||
settings.protect_patterns=Padrões
|
||||
settings.protect_protected_file_patterns=Padrões de ficheiros protegidos (separados com ponto e vírgula ";")
|
||||
settings.protect_protected_file_patterns_desc=Ficheiros protegidos não podem ser modificados imediatamente, mesmo que o utilizador tenha direitos para adicionar, editar ou eliminar ficheiros neste ramo. Múltiplos padrões podem ser separados com ponto e vírgula (";"). Veja a documentação em <a href="%s">github.com/gobwas/glob</a> para ver a sintaxe. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Ficheiros protegidos não podem ser modificados imediatamente, mesmo que o utilizador tenha direitos para adicionar, editar ou eliminar ficheiros neste ramo. Múltiplos padrões podem ser separados com ponto e vírgula (";"). Veja a documentação em <a href="%s">%s</a> para ver a sintaxe. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Padrões de ficheiros desprotegidos (separados com ponto e vírgula ";")
|
||||
settings.protect_unprotected_file_patterns_desc=Ficheiros desprotegidos que podem ser modificados imediatamente se o utilizador tiver direitos de escrita, contornando a restrição no envio. Padrões múltiplos podem ser separados com ponto e vírgula (";"). Veja a documentação em <a href="%[1]s">%[2]s</a> para ver a sintaxe. Exemplos: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Habilitar salvaguarda
|
||||
|
|
|
@ -1019,7 +1019,7 @@ visibility.public=Публичный
|
|||
visibility.public_tooltip=Виден всем, кто может открыть этот сайт
|
||||
visibility.limited=Ограниченный
|
||||
visibility.limited_tooltip=Виден только зарегистрированным пользователям сайта
|
||||
visibility.private=Частный
|
||||
visibility.private=Скрытый
|
||||
visibility.private_tooltip=Виден только участникам организаций, в которых вы состоите
|
||||
blocked_users_none = Заблокированных пользователей нет.
|
||||
user_block_success = Пользователь заблокирован.
|
||||
|
@ -2410,7 +2410,7 @@ settings.protect_branch_name_pattern=Шаблон названий защищё
|
|||
settings.protect_branch_name_pattern_desc=Шаблоны названий защищённых ветвей. О синтаксисе шаблонов читайте в <a href="%s">документации</a>. Примеры: main, release/**
|
||||
settings.protect_patterns=Шаблоны
|
||||
settings.protect_protected_file_patterns=Шаблоны защищённых файлов, разделённые точкой с запятой «;»
|
||||
settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветви. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации <a href="%s">github.com/gobwas/glob</a> . Примеры: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветви. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации <a href="%s">%s</a> . Примеры: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Шаблоны незащищённых файлов, разделённые точкой с запятой «;»
|
||||
settings.protect_unprotected_file_patterns_desc=Незащищенные файлы, которые допускается изменять напрямую, если пользователь имеет право на запись, несмотря на ограничение отправки изменений. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации <a href="%[1]s">%[2]s</a> . Примеры: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Включить защиту
|
||||
|
@ -3967,4 +3967,20 @@ test = хи-хи!
|
|||
|
||||
[repo.permissions]
|
||||
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов.
|
||||
code.read = <b>Чтение:</b> доступ к исходному коду репозитория и клонированию.
|
||||
code.read = <b>Чтение:</b> просмотр и клонирование исходного кода репозитория.
|
||||
issues.read = <b>Чтение:</b> просмотр и создание задач и комментариев.
|
||||
pulls.read = <b>Чтение:</b> просмотр и открытие запросов слияний.
|
||||
releases.read = <b>Чтение:</b> просмотр выпусков и скачивание файлов.
|
||||
releases.write = <b>Запись:</b> публикация, изменение и удаление выпусков и их файлов.
|
||||
wiki.read = <b>Чтение:</b> просмотр страниц и истории редактирования встроенной вики.
|
||||
projects.write = <b>Запись:</b> создание и изменение проектов и колонок.
|
||||
packages.write = <b>Запись:</b> публикация и удаление пакетов в репозитории.
|
||||
projects.read = <b>Чтение:</b> просмотр проектов в репозитории.
|
||||
ext_wiki = Доступ ко ссылке на внешнюю вики. Настройка разрешений выполняется вне сайта.
|
||||
actions.read = <b>Чтение:</b> просмотр интегрированных конвейеров CI/CD и их логов.
|
||||
pulls.write = <b>Запись:</b> закрытие запросов слияний и изменение их метаданных: меток, этапа, назначений, срока выполнения и зависимостей и пр.
|
||||
issues.write = <b>Запись:</b> закрытие задач и изменение их метаданных: меток, этапа, назначений, срока выполнения и зависимостей и пр.
|
||||
actions.write = <b>Запись:</b> ручной запуск, перезапуск, отмена и одобрение работы конвейеров CI/CD.
|
||||
wiki.write = <b>Запись:</b> создание, изменение и удаление страниц во встроенной вики.
|
||||
packages.read = <b>Чтение:</b> просмотр и скачивание пакетов в репозитории.
|
||||
ext_issues = Доступ к ссылке на внешний трекер задач. Настройка разрешений выполняется вне сайта.
|
|
@ -2344,7 +2344,7 @@ settings.protect_branch_name_pattern=Korunmuş Dal Adı Deseni
|
|||
settings.protect_branch_name_pattern_desc=Korunmuş dal isim desenleri. Desen sözdizimi için <a href="%s">belgelere</a> bakabilirsiniz. Örnekler: main, release/**
|
||||
settings.protect_patterns=Desenler
|
||||
settings.protect_protected_file_patterns=Korumalı dosya kalıpları (noktalı virgülle ayrılmış ';'):
|
||||
settings.protect_protected_file_patterns_desc=Kullanıcının bu dalda dosya ekleme, düzenleme veya silme hakları olsa bile doğrudan değiştirilmesine izin verilmeyen korumalı dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen sözdizimi için <a href='%s'>github.com/gobwas/glob</a> belgelerine bakın. Örnekler: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_protected_file_patterns_desc=Kullanıcının bu dalda dosya ekleme, düzenleme veya silme hakları olsa bile doğrudan değiştirilmesine izin verilmeyen korumalı dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen sözdizimi için <a href='%s'>%s</a> belgelerine bakın. Örnekler: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Korunmasız dosya desenleri (noktalı virgülle ayrılmış ';'):
|
||||
settings.protect_unprotected_file_patterns_desc=Kullanıcının yazma erişimi, itme kısıtlamasını atlama hakkı olduğunda doğrudan değiştirmesine izin verilen korunmasız dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen söz dizimi için <a href='%[1]s'>%[2]s</a> belgelerine bakın. Örnekler: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.add_protected_branch=Korumayı etkinleştir
|
||||
|
|
|
@ -2457,7 +2457,7 @@ settings.protect_branch_name_pattern=受保护的分支名称正则
|
|||
settings.protect_branch_name_pattern_desc=分支保护的名称匹配规则。语法请参阅<a href="%s">文档</a> 。如:main, release/**
|
||||
settings.protect_patterns=规则
|
||||
settings.protect_protected_file_patterns=受保护的文件模式(使用半角分号“;”分隔)
|
||||
settings.protect_protected_file_patterns_desc=即使用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。 可以使用半角分号(“;”)分隔多个模式。 见<a href='%s'>github.com/gobwas/glob</a>文档了解模式语法。例如: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>。
|
||||
settings.protect_protected_file_patterns_desc=即使用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。 可以使用半角分号(“;”)分隔多个模式。 见<a href='%s'>%s</a>文档了解模式语法。例如: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>。
|
||||
settings.protect_unprotected_file_patterns=不受保护的文件模式(使用半角分号“;”分隔)
|
||||
settings.protect_unprotected_file_patterns_desc=在用户有写权限的情况下允许绕过限制,直接修改设为不保护的文件。如有多个匹配模式,则可用半角分号(“;”)分隔开。见 <a href="%[1]s">%[2]s</a> 的文档以了解匹配模式的格式。例子: <code>.drone.yml</code>、<code>/docs/**/*.txt</code>。
|
||||
settings.add_protected_branch=启用保护
|
||||
|
|
|
@ -2288,7 +2288,7 @@ settings.require_signed_commits=僅接受經簽署的提交
|
|||
settings.require_signed_commits_desc=拒絕未經簽署或未經驗證的提交推送到此分支。
|
||||
settings.protect_branch_name_pattern=受保護的分支名稱式樣
|
||||
settings.protect_protected_file_patterns=受保護的檔案式樣 (以分號區隔「;」):
|
||||
settings.protect_protected_file_patterns_desc=即便使用者有權限新增、修改、刪除此分支的檔案,仍不允許直接修改受保護的檔案。可以用半形分號「;」分隔多個式樣。請於 <a href='%s'>github.com/gobwas/glob</a> 文件查看模式格式。範例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>。
|
||||
settings.protect_protected_file_patterns_desc=即便使用者有權限新增、修改、刪除此分支的檔案,仍不允許直接修改受保護的檔案。可以用半形分號「;」分隔多個式樣。請於 <a href='%s'>%s</a> 文件查看模式格式。範例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>。
|
||||
settings.protect_unprotected_file_patterns=未受保護的檔案模式 (以分號區隔「;」):
|
||||
settings.protect_unprotected_file_patterns_desc=當使用者有寫入權限時,可繞過推送限制,直接修改未受保護的檔案。可以用半形分號「;」分隔多個模式。請於 <a href='%[1]s'>%[2]s</a> 文件查看模式格式。範例: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>。
|
||||
settings.add_protected_branch=啟用保護
|
||||
|
|
416
package-lock.json
generated
416
package-lock.json
generated
|
@ -10,7 +10,7 @@
|
|||
"@citation-js/plugin-software-formats": "0.6.1",
|
||||
"@github/markdown-toolbar-element": "2.2.3",
|
||||
"@github/relative-time-element": "4.4.3",
|
||||
"@github/text-expander-element": "2.7.1",
|
||||
"@github/text-expander-element": "2.7.2",
|
||||
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
|
||||
"@primer/octicons": "19.9.0",
|
||||
"ansi_up": "6.0.2",
|
||||
|
@ -78,7 +78,7 @@
|
|||
"eslint-plugin-no-use-extend-native": "0.5.0",
|
||||
"eslint-plugin-playwright": "1.6.2",
|
||||
"eslint-plugin-regexp": "2.6.0",
|
||||
"eslint-plugin-sonarjs": "2.0.2",
|
||||
"eslint-plugin-sonarjs": "2.0.3",
|
||||
"eslint-plugin-unicorn": "55.0.0",
|
||||
"eslint-plugin-vitest-globals": "1.5.0",
|
||||
"eslint-plugin-vue": "9.28.0",
|
||||
|
@ -195,22 +195,22 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/core": {
|
||||
"version": "7.24.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
|
||||
"integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
|
||||
"version": "7.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
|
||||
"integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ampproject/remapping": "^2.2.0",
|
||||
"@babel/code-frame": "^7.24.2",
|
||||
"@babel/generator": "^7.24.1",
|
||||
"@babel/helper-compilation-targets": "^7.23.6",
|
||||
"@babel/helper-module-transforms": "^7.23.3",
|
||||
"@babel/helpers": "^7.24.1",
|
||||
"@babel/parser": "^7.24.1",
|
||||
"@babel/template": "^7.24.0",
|
||||
"@babel/traverse": "^7.24.1",
|
||||
"@babel/types": "^7.24.0",
|
||||
"@babel/code-frame": "^7.24.7",
|
||||
"@babel/generator": "^7.25.0",
|
||||
"@babel/helper-compilation-targets": "^7.25.2",
|
||||
"@babel/helper-module-transforms": "^7.25.2",
|
||||
"@babel/helpers": "^7.25.0",
|
||||
"@babel/parser": "^7.25.0",
|
||||
"@babel/template": "^7.25.0",
|
||||
"@babel/traverse": "^7.25.2",
|
||||
"@babel/types": "^7.25.2",
|
||||
"convert-source-map": "^2.0.0",
|
||||
"debug": "^4.1.0",
|
||||
"gensync": "^1.0.0-beta.2",
|
||||
|
@ -236,9 +236,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/eslint-parser": {
|
||||
"version": "7.24.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz",
|
||||
"integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==",
|
||||
"version": "7.25.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz",
|
||||
"integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
@ -251,7 +251,7 @@
|
|||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.11.0",
|
||||
"eslint": "^7.5.0 || ^8.0.0"
|
||||
"eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
|
||||
|
@ -713,6 +713,39 @@
|
|||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
|
||||
"version": "7.25.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
|
||||
"integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.24.8",
|
||||
"@babel/traverse": "^7.25.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
|
||||
"version": "7.25.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
|
||||
"integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.24.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
|
||||
"version": "7.25.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
|
||||
|
@ -765,15 +798,15 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-proposal-decorators": {
|
||||
"version": "7.24.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz",
|
||||
"integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==",
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz",
|
||||
"integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-create-class-features-plugin": "^7.24.1",
|
||||
"@babel/helper-plugin-utils": "^7.24.0",
|
||||
"@babel/plugin-syntax-decorators": "^7.24.1"
|
||||
"@babel/helper-create-class-features-plugin": "^7.24.7",
|
||||
"@babel/helper-plugin-utils": "^7.24.7",
|
||||
"@babel/plugin-syntax-decorators": "^7.24.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -1313,6 +1346,23 @@
|
|||
"@babel/core": "^7.0.0-0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
|
||||
"version": "7.25.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
|
||||
"integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-create-regexp-features-plugin": "^7.25.0",
|
||||
"@babel/helper-plugin-utils": "^7.24.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-transform-dynamic-import": {
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
|
||||
|
@ -2010,27 +2060,29 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/preset-env": {
|
||||
"version": "7.24.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz",
|
||||
"integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==",
|
||||
"version": "7.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz",
|
||||
"integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.24.1",
|
||||
"@babel/helper-compilation-targets": "^7.23.6",
|
||||
"@babel/helper-plugin-utils": "^7.24.0",
|
||||
"@babel/helper-validator-option": "^7.23.5",
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1",
|
||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1",
|
||||
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1",
|
||||
"@babel/compat-data": "^7.25.4",
|
||||
"@babel/helper-compilation-targets": "^7.25.2",
|
||||
"@babel/helper-plugin-utils": "^7.24.8",
|
||||
"@babel/helper-validator-option": "^7.24.8",
|
||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
|
||||
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
|
||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
|
||||
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
|
||||
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
|
||||
"@babel/plugin-syntax-async-generators": "^7.8.4",
|
||||
"@babel/plugin-syntax-class-properties": "^7.12.13",
|
||||
"@babel/plugin-syntax-class-static-block": "^7.14.5",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
|
||||
"@babel/plugin-syntax-import-assertions": "^7.24.1",
|
||||
"@babel/plugin-syntax-import-attributes": "^7.24.1",
|
||||
"@babel/plugin-syntax-import-assertions": "^7.24.7",
|
||||
"@babel/plugin-syntax-import-attributes": "^7.24.7",
|
||||
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
||||
"@babel/plugin-syntax-json-strings": "^7.8.3",
|
||||
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
|
||||
|
@ -2042,59 +2094,60 @@
|
|||
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
|
||||
"@babel/plugin-syntax-top-level-await": "^7.14.5",
|
||||
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
|
||||
"@babel/plugin-transform-arrow-functions": "^7.24.1",
|
||||
"@babel/plugin-transform-async-generator-functions": "^7.24.3",
|
||||
"@babel/plugin-transform-async-to-generator": "^7.24.1",
|
||||
"@babel/plugin-transform-block-scoped-functions": "^7.24.1",
|
||||
"@babel/plugin-transform-block-scoping": "^7.24.1",
|
||||
"@babel/plugin-transform-class-properties": "^7.24.1",
|
||||
"@babel/plugin-transform-class-static-block": "^7.24.1",
|
||||
"@babel/plugin-transform-classes": "^7.24.1",
|
||||
"@babel/plugin-transform-computed-properties": "^7.24.1",
|
||||
"@babel/plugin-transform-destructuring": "^7.24.1",
|
||||
"@babel/plugin-transform-dotall-regex": "^7.24.1",
|
||||
"@babel/plugin-transform-duplicate-keys": "^7.24.1",
|
||||
"@babel/plugin-transform-dynamic-import": "^7.24.1",
|
||||
"@babel/plugin-transform-exponentiation-operator": "^7.24.1",
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.24.1",
|
||||
"@babel/plugin-transform-for-of": "^7.24.1",
|
||||
"@babel/plugin-transform-function-name": "^7.24.1",
|
||||
"@babel/plugin-transform-json-strings": "^7.24.1",
|
||||
"@babel/plugin-transform-literals": "^7.24.1",
|
||||
"@babel/plugin-transform-logical-assignment-operators": "^7.24.1",
|
||||
"@babel/plugin-transform-member-expression-literals": "^7.24.1",
|
||||
"@babel/plugin-transform-modules-amd": "^7.24.1",
|
||||
"@babel/plugin-transform-modules-commonjs": "^7.24.1",
|
||||
"@babel/plugin-transform-modules-systemjs": "^7.24.1",
|
||||
"@babel/plugin-transform-modules-umd": "^7.24.1",
|
||||
"@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
|
||||
"@babel/plugin-transform-new-target": "^7.24.1",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
|
||||
"@babel/plugin-transform-numeric-separator": "^7.24.1",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.24.1",
|
||||
"@babel/plugin-transform-object-super": "^7.24.1",
|
||||
"@babel/plugin-transform-optional-catch-binding": "^7.24.1",
|
||||
"@babel/plugin-transform-optional-chaining": "^7.24.1",
|
||||
"@babel/plugin-transform-parameters": "^7.24.1",
|
||||
"@babel/plugin-transform-private-methods": "^7.24.1",
|
||||
"@babel/plugin-transform-private-property-in-object": "^7.24.1",
|
||||
"@babel/plugin-transform-property-literals": "^7.24.1",
|
||||
"@babel/plugin-transform-regenerator": "^7.24.1",
|
||||
"@babel/plugin-transform-reserved-words": "^7.24.1",
|
||||
"@babel/plugin-transform-shorthand-properties": "^7.24.1",
|
||||
"@babel/plugin-transform-spread": "^7.24.1",
|
||||
"@babel/plugin-transform-sticky-regex": "^7.24.1",
|
||||
"@babel/plugin-transform-template-literals": "^7.24.1",
|
||||
"@babel/plugin-transform-typeof-symbol": "^7.24.1",
|
||||
"@babel/plugin-transform-unicode-escapes": "^7.24.1",
|
||||
"@babel/plugin-transform-unicode-property-regex": "^7.24.1",
|
||||
"@babel/plugin-transform-unicode-regex": "^7.24.1",
|
||||
"@babel/plugin-transform-unicode-sets-regex": "^7.24.1",
|
||||
"@babel/plugin-transform-arrow-functions": "^7.24.7",
|
||||
"@babel/plugin-transform-async-generator-functions": "^7.25.4",
|
||||
"@babel/plugin-transform-async-to-generator": "^7.24.7",
|
||||
"@babel/plugin-transform-block-scoped-functions": "^7.24.7",
|
||||
"@babel/plugin-transform-block-scoping": "^7.25.0",
|
||||
"@babel/plugin-transform-class-properties": "^7.25.4",
|
||||
"@babel/plugin-transform-class-static-block": "^7.24.7",
|
||||
"@babel/plugin-transform-classes": "^7.25.4",
|
||||
"@babel/plugin-transform-computed-properties": "^7.24.7",
|
||||
"@babel/plugin-transform-destructuring": "^7.24.8",
|
||||
"@babel/plugin-transform-dotall-regex": "^7.24.7",
|
||||
"@babel/plugin-transform-duplicate-keys": "^7.24.7",
|
||||
"@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
|
||||
"@babel/plugin-transform-dynamic-import": "^7.24.7",
|
||||
"@babel/plugin-transform-exponentiation-operator": "^7.24.7",
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.24.7",
|
||||
"@babel/plugin-transform-for-of": "^7.24.7",
|
||||
"@babel/plugin-transform-function-name": "^7.25.1",
|
||||
"@babel/plugin-transform-json-strings": "^7.24.7",
|
||||
"@babel/plugin-transform-literals": "^7.25.2",
|
||||
"@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
|
||||
"@babel/plugin-transform-member-expression-literals": "^7.24.7",
|
||||
"@babel/plugin-transform-modules-amd": "^7.24.7",
|
||||
"@babel/plugin-transform-modules-commonjs": "^7.24.8",
|
||||
"@babel/plugin-transform-modules-systemjs": "^7.25.0",
|
||||
"@babel/plugin-transform-modules-umd": "^7.24.7",
|
||||
"@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
|
||||
"@babel/plugin-transform-new-target": "^7.24.7",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
|
||||
"@babel/plugin-transform-numeric-separator": "^7.24.7",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.24.7",
|
||||
"@babel/plugin-transform-object-super": "^7.24.7",
|
||||
"@babel/plugin-transform-optional-catch-binding": "^7.24.7",
|
||||
"@babel/plugin-transform-optional-chaining": "^7.24.8",
|
||||
"@babel/plugin-transform-parameters": "^7.24.7",
|
||||
"@babel/plugin-transform-private-methods": "^7.25.4",
|
||||
"@babel/plugin-transform-private-property-in-object": "^7.24.7",
|
||||
"@babel/plugin-transform-property-literals": "^7.24.7",
|
||||
"@babel/plugin-transform-regenerator": "^7.24.7",
|
||||
"@babel/plugin-transform-reserved-words": "^7.24.7",
|
||||
"@babel/plugin-transform-shorthand-properties": "^7.24.7",
|
||||
"@babel/plugin-transform-spread": "^7.24.7",
|
||||
"@babel/plugin-transform-sticky-regex": "^7.24.7",
|
||||
"@babel/plugin-transform-template-literals": "^7.24.7",
|
||||
"@babel/plugin-transform-typeof-symbol": "^7.24.8",
|
||||
"@babel/plugin-transform-unicode-escapes": "^7.24.7",
|
||||
"@babel/plugin-transform-unicode-property-regex": "^7.24.7",
|
||||
"@babel/plugin-transform-unicode-regex": "^7.24.7",
|
||||
"@babel/plugin-transform-unicode-sets-regex": "^7.25.4",
|
||||
"@babel/preset-modules": "0.1.6-no-external-plugins",
|
||||
"babel-plugin-polyfill-corejs2": "^0.4.10",
|
||||
"babel-plugin-polyfill-corejs3": "^0.10.4",
|
||||
"babel-plugin-polyfill-corejs3": "^0.10.6",
|
||||
"babel-plugin-polyfill-regenerator": "^0.6.1",
|
||||
"core-js-compat": "^3.31.0",
|
||||
"core-js-compat": "^3.37.1",
|
||||
"semver": "^6.3.1"
|
||||
},
|
||||
"engines": {
|
||||
|
@ -2115,15 +2168,15 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/preset-flow": {
|
||||
"version": "7.24.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz",
|
||||
"integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==",
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz",
|
||||
"integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.24.0",
|
||||
"@babel/helper-validator-option": "^7.23.5",
|
||||
"@babel/plugin-transform-flow-strip-types": "^7.24.1"
|
||||
"@babel/helper-plugin-utils": "^7.24.7",
|
||||
"@babel/helper-validator-option": "^7.24.7",
|
||||
"@babel/plugin-transform-flow-strip-types": "^7.24.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -2148,18 +2201,18 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@babel/preset-react": {
|
||||
"version": "7.24.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz",
|
||||
"integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==",
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
|
||||
"integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.24.0",
|
||||
"@babel/helper-validator-option": "^7.23.5",
|
||||
"@babel/plugin-transform-react-display-name": "^7.24.1",
|
||||
"@babel/plugin-transform-react-jsx": "^7.23.4",
|
||||
"@babel/plugin-transform-react-jsx-development": "^7.22.5",
|
||||
"@babel/plugin-transform-react-pure-annotations": "^7.24.1"
|
||||
"@babel/helper-plugin-utils": "^7.24.7",
|
||||
"@babel/helper-validator-option": "^7.24.7",
|
||||
"@babel/plugin-transform-react-display-name": "^7.24.7",
|
||||
"@babel/plugin-transform-react-jsx": "^7.24.7",
|
||||
"@babel/plugin-transform-react-jsx-development": "^7.24.7",
|
||||
"@babel/plugin-transform-react-pure-annotations": "^7.24.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
|
@ -2976,9 +3029,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@eslint-community/regexpp": {
|
||||
"version": "4.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
|
||||
"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
|
||||
"version": "4.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
|
||||
"integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
|
@ -3124,13 +3177,13 @@
|
|||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@github/text-expander-element": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.1.tgz",
|
||||
"integrity": "sha512-CWxfYxJRkeWVCUhJveproLs6pHsPrWtK8TsjL8ByYVcSCs8CJmNzF8b7ZawrUgfai0F2jb4aIdw2FoBTykj9XA==",
|
||||
"version": "2.7.2",
|
||||
"resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.2.tgz",
|
||||
"integrity": "sha512-eTIOUQKoBxe+e0yHKHQHoo4x61Erb7m0lhi2vMRHZS7TwI6OCGSj/3YydAr3obbQbZjevF9wPihLf1wADu3A9g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@github/combobox-nav": "^2.0.2",
|
||||
"dom-input-range": "^1.1.6"
|
||||
"dom-input-range": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
|
@ -8560,9 +8613,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-react-hooks": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
|
||||
"integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
|
||||
"integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
|
@ -8660,33 +8713,33 @@
|
|||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-2.0.2.tgz",
|
||||
"integrity": "sha512-0JUYTlUDk/up3mS0rFP9vHCRvhIYNTy06m99IPFeyMDUWL8u0ebz+nFPYn6OWDBTIEfbvQ/Xe0PdjWO8w0WD0Q==",
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-2.0.3.tgz",
|
||||
"integrity": "sha512-Xsy+x5xNxc/h+M/B2s8XMPoKw0o4gUL0cqT8gl6SiEtA6qKX6/SlOjj4Avp7bT7UIguHbjKv/RACy3AxIGOvwA==",
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-only",
|
||||
"dependencies": {
|
||||
"@babel/core": "7.24.3",
|
||||
"@babel/eslint-parser": "7.24.1",
|
||||
"@babel/plugin-proposal-decorators": "7.24.1",
|
||||
"@babel/preset-env": "7.24.3",
|
||||
"@babel/preset-flow": "7.24.1",
|
||||
"@babel/preset-react": "7.24.1",
|
||||
"@eslint-community/regexpp": "4.10.0",
|
||||
"@babel/core": "7.25.2",
|
||||
"@babel/eslint-parser": "7.25.1",
|
||||
"@babel/plugin-proposal-decorators": "7.24.7",
|
||||
"@babel/preset-env": "7.25.4",
|
||||
"@babel/preset-flow": "7.24.7",
|
||||
"@babel/preset-react": "7.24.7",
|
||||
"@eslint-community/regexpp": "4.11.1",
|
||||
"@typescript-eslint/eslint-plugin": "7.16.1",
|
||||
"@typescript-eslint/utils": "^7.16.1",
|
||||
"builtin-modules": "3.3.0",
|
||||
"bytes": "3.1.2",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||
"eslint-plugin-react": "^7.35.0",
|
||||
"eslint-plugin-react-hooks": "4.6.0",
|
||||
"eslint-scope": "8.0.1",
|
||||
"eslint-plugin-import": "^2.30.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.10.0",
|
||||
"eslint-plugin-react": "^7.36.1",
|
||||
"eslint-plugin-react-hooks": "4.6.2",
|
||||
"eslint-scope": "8.0.2",
|
||||
"functional-red-black-tree": "1.0.1",
|
||||
"jsx-ast-utils": "^3.3.5",
|
||||
"minimatch": "^9.0.3",
|
||||
"minimatch": "^10.0.1",
|
||||
"scslre": "0.3.0",
|
||||
"semver": "7.6.0",
|
||||
"semver": "7.6.3",
|
||||
"typescript": "*",
|
||||
"vue-eslint-parser": "9.4.3"
|
||||
},
|
||||
|
@ -8899,6 +8952,22 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/types": {
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
|
||||
|
@ -8963,6 +9032,23 @@
|
|||
"url": "https://opencollective.com/typescript-eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils": {
|
||||
"version": "7.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz",
|
||||
|
@ -9029,6 +9115,22 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/minimatch": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "7.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz",
|
||||
|
@ -9062,9 +9164,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/eslint-scope": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz",
|
||||
"integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==",
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz",
|
||||
"integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
|
@ -9091,58 +9193,6 @@
|
|||
"url": "https://opencollective.com/eslint"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/minimatch": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/semver": {
|
||||
"version": "7.6.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
|
||||
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-sonarjs/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/eslint-plugin-unicorn": {
|
||||
"version": "55.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz",
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"@citation-js/plugin-software-formats": "0.6.1",
|
||||
"@github/markdown-toolbar-element": "2.2.3",
|
||||
"@github/relative-time-element": "4.4.3",
|
||||
"@github/text-expander-element": "2.7.1",
|
||||
"@github/text-expander-element": "2.7.2",
|
||||
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
|
||||
"@primer/octicons": "19.9.0",
|
||||
"ansi_up": "6.0.2",
|
||||
|
@ -77,7 +77,7 @@
|
|||
"eslint-plugin-no-use-extend-native": "0.5.0",
|
||||
"eslint-plugin-playwright": "1.6.2",
|
||||
"eslint-plugin-regexp": "2.6.0",
|
||||
"eslint-plugin-sonarjs": "2.0.2",
|
||||
"eslint-plugin-sonarjs": "2.0.3",
|
||||
"eslint-plugin-unicorn": "55.0.0",
|
||||
"eslint-plugin-vitest-globals": "1.5.0",
|
||||
"eslint-plugin-vue": "9.28.0",
|
||||
|
|
3
release-notes/5416.md
Normal file
3
release-notes/5416.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
feat: [commit](https://codeberg.org/forgejo/forgejo/commit/8178d6eaba64d05799fd3b62fa889bd13bee07c7) Code search results when using the bleve indexer are sorted by relevance.
|
||||
fix: [commit](https://codeberg.org/forgejo/forgejo/commit/b496317b5a2aea970bc94ccf6fcde35cd417ec20) After migrating a repository that contains merged pull requests, the branch is missing and cannot be deleted.
|
||||
fix: [commit](https://codeberg.org/forgejo/forgejo/commit/a226064711899da07d6b1455a68ef758f2f3e7e0) Forgejo Actions artifact v4 upload above 8MB.
|
|
@ -123,6 +123,54 @@ func listChunksByRunID(st storage.ObjectStorage, runID int64) (map[int64][]*chun
|
|||
return chunksMap, nil
|
||||
}
|
||||
|
||||
func listChunksByRunIDV4(st storage.ObjectStorage, runID, artifactID int64, blist *BlockList) ([]*chunkFileItem, error) {
|
||||
storageDir := fmt.Sprintf("tmpv4%d", runID)
|
||||
var chunks []*chunkFileItem
|
||||
chunkMap := map[string]*chunkFileItem{}
|
||||
dummy := &chunkFileItem{}
|
||||
for _, name := range blist.Latest {
|
||||
chunkMap[name] = dummy
|
||||
}
|
||||
if err := st.IterateObjects(storageDir, func(fpath string, obj storage.Object) error {
|
||||
baseName := filepath.Base(fpath)
|
||||
if !strings.HasPrefix(baseName, "block-") {
|
||||
return nil
|
||||
}
|
||||
// when read chunks from storage, it only contains storage dir and basename,
|
||||
// no matter the subdirectory setting in storage config
|
||||
item := chunkFileItem{Path: storageDir + "/" + baseName, ArtifactID: artifactID}
|
||||
var size int64
|
||||
var b64chunkName string
|
||||
if _, err := fmt.Sscanf(baseName, "block-%d-%d-%s", &item.RunID, &size, &b64chunkName); err != nil {
|
||||
return fmt.Errorf("parse content range error: %v", err)
|
||||
}
|
||||
rchunkName, err := base64.URLEncoding.DecodeString(b64chunkName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to parse chunkName: %v", err)
|
||||
}
|
||||
chunkName := string(rchunkName)
|
||||
item.End = item.Start + size - 1
|
||||
if _, ok := chunkMap[chunkName]; ok {
|
||||
chunkMap[chunkName] = &item
|
||||
}
|
||||
return nil
|
||||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, name := range blist.Latest {
|
||||
chunk, ok := chunkMap[name]
|
||||
if !ok || chunk.Path == "" {
|
||||
return nil, fmt.Errorf("missing Chunk (%d/%d): %s", i, len(blist.Latest), name)
|
||||
}
|
||||
chunks = append(chunks, chunk)
|
||||
if i > 0 {
|
||||
chunk.Start = chunkMap[blist.Latest[i-1]].End + 1
|
||||
chunk.End += chunk.Start
|
||||
}
|
||||
}
|
||||
return chunks, nil
|
||||
}
|
||||
|
||||
func mergeChunksForRun(ctx *ArtifactContext, st storage.ObjectStorage, runID int64, artifactName string) error {
|
||||
// read all db artifacts by name
|
||||
artifacts, err := db.Find[actions.ActionArtifact](ctx, actions.FindArtifactsOptions{
|
||||
|
@ -230,7 +278,7 @@ func mergeChunksForArtifact(ctx *ArtifactContext, chunks []*chunkFileItem, st st
|
|||
rawChecksum := hash.Sum(nil)
|
||||
actualChecksum := hex.EncodeToString(rawChecksum)
|
||||
if !strings.HasSuffix(checksum, actualChecksum) {
|
||||
return fmt.Errorf("update artifact error checksum is invalid")
|
||||
return fmt.Errorf("update artifact error checksum is invalid %v vs %v", checksum, actualChecksum)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,8 +24,15 @@ package actions
|
|||
// PUT: http://localhost:3000/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=mO7y35r4GyjN7fwg0DTv3-Fv1NDXD84KLEgLpoPOtDI=&expires=2024-01-23+21%3A48%3A37.20833956+%2B0100+CET&artifactName=test&taskID=75&comp=block
|
||||
// 1.3. Continue Upload Zip Content to Blobstorage (unauthenticated request), repeat until everything is uploaded
|
||||
// PUT: http://localhost:3000/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=mO7y35r4GyjN7fwg0DTv3-Fv1NDXD84KLEgLpoPOtDI=&expires=2024-01-23+21%3A48%3A37.20833956+%2B0100+CET&artifactName=test&taskID=75&comp=appendBlock
|
||||
// 1.4. Unknown xml payload to Blobstorage (unauthenticated request), ignored for now
|
||||
// 1.4. BlockList xml payload to Blobstorage (unauthenticated request)
|
||||
// Files of about 800MB are parallel in parallel and / or out of order, this file is needed to enshure the correct order
|
||||
// PUT: http://localhost:3000/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=mO7y35r4GyjN7fwg0DTv3-Fv1NDXD84KLEgLpoPOtDI=&expires=2024-01-23+21%3A48%3A37.20833956+%2B0100+CET&artifactName=test&taskID=75&comp=blockList
|
||||
// Request
|
||||
// <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
// <BlockList>
|
||||
// <Latest>blockId1</Latest>
|
||||
// <Latest>blockId2</Latest>
|
||||
// </BlockList>
|
||||
// 1.5. FinalizeArtifact
|
||||
// Post: /twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact
|
||||
// Request
|
||||
|
@ -82,6 +89,7 @@ import (
|
|||
"crypto/hmac"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
@ -153,31 +161,34 @@ func ArtifactsV4Routes(prefix string) *web.Route {
|
|||
return m
|
||||
}
|
||||
|
||||
func (r artifactV4Routes) buildSignature(endp, expires, artifactName string, taskID int64) []byte {
|
||||
func (r artifactV4Routes) buildSignature(endp, expires, artifactName string, taskID, artifactID int64) []byte {
|
||||
mac := hmac.New(sha256.New, setting.GetGeneralTokenSigningSecret())
|
||||
mac.Write([]byte(endp))
|
||||
mac.Write([]byte(expires))
|
||||
mac.Write([]byte(artifactName))
|
||||
mac.Write([]byte(fmt.Sprint(taskID)))
|
||||
mac.Write([]byte(fmt.Sprint(artifactID)))
|
||||
return mac.Sum(nil)
|
||||
}
|
||||
|
||||
func (r artifactV4Routes) buildArtifactURL(endp, artifactName string, taskID int64) string {
|
||||
func (r artifactV4Routes) buildArtifactURL(endp, artifactName string, taskID, artifactID int64) string {
|
||||
expires := time.Now().Add(60 * time.Minute).Format("2006-01-02 15:04:05.999999999 -0700 MST")
|
||||
uploadURL := strings.TrimSuffix(setting.AppURL, "/") + strings.TrimSuffix(r.prefix, "/") +
|
||||
"/" + endp + "?sig=" + base64.URLEncoding.EncodeToString(r.buildSignature(endp, expires, artifactName, taskID)) + "&expires=" + url.QueryEscape(expires) + "&artifactName=" + url.QueryEscape(artifactName) + "&taskID=" + fmt.Sprint(taskID)
|
||||
"/" + endp + "?sig=" + base64.URLEncoding.EncodeToString(r.buildSignature(endp, expires, artifactName, taskID, artifactID)) + "&expires=" + url.QueryEscape(expires) + "&artifactName=" + url.QueryEscape(artifactName) + "&taskID=" + fmt.Sprint(taskID) + "&artifactID=" + fmt.Sprint(artifactID)
|
||||
return uploadURL
|
||||
}
|
||||
|
||||
func (r artifactV4Routes) verifySignature(ctx *ArtifactContext, endp string) (*actions.ActionTask, string, bool) {
|
||||
rawTaskID := ctx.Req.URL.Query().Get("taskID")
|
||||
rawArtifactID := ctx.Req.URL.Query().Get("artifactID")
|
||||
sig := ctx.Req.URL.Query().Get("sig")
|
||||
expires := ctx.Req.URL.Query().Get("expires")
|
||||
artifactName := ctx.Req.URL.Query().Get("artifactName")
|
||||
dsig, _ := base64.URLEncoding.DecodeString(sig)
|
||||
taskID, _ := strconv.ParseInt(rawTaskID, 10, 64)
|
||||
artifactID, _ := strconv.ParseInt(rawArtifactID, 10, 64)
|
||||
|
||||
expecedsig := r.buildSignature(endp, expires, artifactName, taskID)
|
||||
expecedsig := r.buildSignature(endp, expires, artifactName, taskID, artifactID)
|
||||
if !hmac.Equal(dsig, expecedsig) {
|
||||
log.Error("Error unauthorized")
|
||||
ctx.Error(http.StatusUnauthorized, "Error unauthorized")
|
||||
|
@ -272,6 +283,8 @@ func (r *artifactV4Routes) createArtifact(ctx *ArtifactContext) {
|
|||
return
|
||||
}
|
||||
artifact.ContentEncoding = ArtifactV4ContentEncoding
|
||||
artifact.FileSize = 0
|
||||
artifact.FileCompressedSize = 0
|
||||
if err := actions.UpdateArtifactByID(ctx, artifact.ID, artifact); err != nil {
|
||||
log.Error("Error UpdateArtifactByID: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error UpdateArtifactByID")
|
||||
|
@ -280,7 +293,7 @@ func (r *artifactV4Routes) createArtifact(ctx *ArtifactContext) {
|
|||
|
||||
respData := CreateArtifactResponse{
|
||||
Ok: true,
|
||||
SignedUploadUrl: r.buildArtifactURL("UploadArtifact", artifactName, ctx.ActionTask.ID),
|
||||
SignedUploadUrl: r.buildArtifactURL("UploadArtifact", artifactName, ctx.ActionTask.ID, artifact.ID),
|
||||
}
|
||||
r.sendProtbufBody(ctx, &respData)
|
||||
}
|
||||
|
@ -306,38 +319,77 @@ func (r *artifactV4Routes) uploadArtifact(ctx *ArtifactContext) {
|
|||
comp := ctx.Req.URL.Query().Get("comp")
|
||||
switch comp {
|
||||
case "block", "appendBlock":
|
||||
// get artifact by name
|
||||
artifact, err := r.getArtifactByName(ctx, task.Job.RunID, artifactName)
|
||||
if err != nil {
|
||||
log.Error("Error artifact not found: %v", err)
|
||||
ctx.Error(http.StatusNotFound, "Error artifact not found")
|
||||
return
|
||||
}
|
||||
blockid := ctx.Req.URL.Query().Get("blockid")
|
||||
if blockid == "" {
|
||||
// get artifact by name
|
||||
artifact, err := r.getArtifactByName(ctx, task.Job.RunID, artifactName)
|
||||
if err != nil {
|
||||
log.Error("Error artifact not found: %v", err)
|
||||
ctx.Error(http.StatusNotFound, "Error artifact not found")
|
||||
return
|
||||
}
|
||||
|
||||
if comp == "block" {
|
||||
artifact.FileSize = 0
|
||||
artifact.FileCompressedSize = 0
|
||||
_, err = appendUploadChunk(r.fs, ctx, artifact, artifact.FileSize, ctx.Req.ContentLength, artifact.RunID)
|
||||
if err != nil {
|
||||
log.Error("Error runner api getting task: task is not running")
|
||||
ctx.Error(http.StatusInternalServerError, "Error runner api getting task: task is not running")
|
||||
return
|
||||
}
|
||||
artifact.FileCompressedSize += ctx.Req.ContentLength
|
||||
artifact.FileSize += ctx.Req.ContentLength
|
||||
if err := actions.UpdateArtifactByID(ctx, artifact.ID, artifact); err != nil {
|
||||
log.Error("Error UpdateArtifactByID: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error UpdateArtifactByID")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
_, err := r.fs.Save(fmt.Sprintf("tmpv4%d/block-%d-%d-%s", task.Job.RunID, task.Job.RunID, ctx.Req.ContentLength, base64.URLEncoding.EncodeToString([]byte(blockid))), ctx.Req.Body, -1)
|
||||
if err != nil {
|
||||
log.Error("Error runner api getting task: task is not running")
|
||||
ctx.Error(http.StatusInternalServerError, "Error runner api getting task: task is not running")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
_, err = appendUploadChunk(r.fs, ctx, artifact, artifact.FileSize, ctx.Req.ContentLength, artifact.RunID)
|
||||
ctx.JSON(http.StatusCreated, "appended")
|
||||
case "blocklist":
|
||||
rawArtifactID := ctx.Req.URL.Query().Get("artifactID")
|
||||
artifactID, _ := strconv.ParseInt(rawArtifactID, 10, 64)
|
||||
_, err := r.fs.Save(fmt.Sprintf("tmpv4%d/%d-%d-blocklist", task.Job.RunID, task.Job.RunID, artifactID), ctx.Req.Body, -1)
|
||||
if err != nil {
|
||||
log.Error("Error runner api getting task: task is not running")
|
||||
ctx.Error(http.StatusInternalServerError, "Error runner api getting task: task is not running")
|
||||
return
|
||||
}
|
||||
artifact.FileCompressedSize += ctx.Req.ContentLength
|
||||
artifact.FileSize += ctx.Req.ContentLength
|
||||
if err := actions.UpdateArtifactByID(ctx, artifact.ID, artifact); err != nil {
|
||||
log.Error("Error UpdateArtifactByID: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error UpdateArtifactByID")
|
||||
return
|
||||
}
|
||||
ctx.JSON(http.StatusCreated, "appended")
|
||||
case "blocklist":
|
||||
ctx.JSON(http.StatusCreated, "created")
|
||||
}
|
||||
}
|
||||
|
||||
type BlockList struct {
|
||||
Latest []string `xml:"Latest"`
|
||||
}
|
||||
|
||||
type Latest struct {
|
||||
Value string `xml:",chardata"`
|
||||
}
|
||||
|
||||
func (r *artifactV4Routes) readBlockList(runID, artifactID int64) (*BlockList, error) {
|
||||
blockListName := fmt.Sprintf("tmpv4%d/%d-%d-blocklist", runID, runID, artifactID)
|
||||
s, err := r.fs.Open(blockListName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
xdec := xml.NewDecoder(s)
|
||||
blockList := &BlockList{}
|
||||
err = xdec.Decode(blockList)
|
||||
|
||||
delerr := r.fs.Delete(blockListName)
|
||||
if delerr != nil {
|
||||
log.Warn("Failed to delete blockList %s: %v", blockListName, delerr)
|
||||
}
|
||||
return blockList, err
|
||||
}
|
||||
|
||||
func (r *artifactV4Routes) finalizeArtifact(ctx *ArtifactContext) {
|
||||
var req FinalizeArtifactRequest
|
||||
|
||||
|
@ -356,18 +408,34 @@ func (r *artifactV4Routes) finalizeArtifact(ctx *ArtifactContext) {
|
|||
ctx.Error(http.StatusNotFound, "Error artifact not found")
|
||||
return
|
||||
}
|
||||
chunkMap, err := listChunksByRunID(r.fs, runID)
|
||||
|
||||
var chunks []*chunkFileItem
|
||||
blockList, err := r.readBlockList(runID, artifact.ID)
|
||||
if err != nil {
|
||||
log.Error("Error merge chunks: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
}
|
||||
chunks, ok := chunkMap[artifact.ID]
|
||||
if !ok {
|
||||
log.Error("Error merge chunks")
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
log.Warn("Failed to read BlockList, fallback to old behavior: %v", err)
|
||||
chunkMap, err := listChunksByRunID(r.fs, runID)
|
||||
if err != nil {
|
||||
log.Error("Error merge chunks: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
}
|
||||
chunks, ok = chunkMap[artifact.ID]
|
||||
if !ok {
|
||||
log.Error("Error merge chunks")
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
chunks, err = listChunksByRunIDV4(r.fs, runID, artifact.ID, blockList)
|
||||
if err != nil {
|
||||
log.Error("Error merge chunks: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
}
|
||||
artifact.FileSize = chunks[len(chunks)-1].End + 1
|
||||
artifact.FileCompressedSize = chunks[len(chunks)-1].End + 1
|
||||
}
|
||||
|
||||
checksum := ""
|
||||
if req.Hash != nil {
|
||||
checksum = req.Hash.Value
|
||||
|
@ -468,7 +536,7 @@ func (r *artifactV4Routes) getSignedArtifactURL(ctx *ArtifactContext) {
|
|||
}
|
||||
}
|
||||
if respData.SignedUrl == "" {
|
||||
respData.SignedUrl = r.buildArtifactURL("DownloadArtifact", artifactName, ctx.ActionTask.ID)
|
||||
respData.SignedUrl = r.buildArtifactURL("DownloadArtifact", artifactName, ctx.ActionTask.ID, artifact.ID)
|
||||
}
|
||||
r.sendProtbufBody(ctx, &respData)
|
||||
}
|
||||
|
|
|
@ -476,6 +476,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
|
|||
ctx.Data["PosterID"] = posterID
|
||||
ctx.Data["IsFuzzy"] = isFuzzy
|
||||
ctx.Data["Keyword"] = keyword
|
||||
ctx.Data["IsShowClosed"] = isShowClosed
|
||||
switch {
|
||||
case isShowClosed.Value():
|
||||
ctx.Data["State"] = "closed"
|
||||
|
|
|
@ -38,7 +38,6 @@ func TestCleanupSHA256(t *testing.T) {
|
|||
Type: packages.TypeContainer,
|
||||
}
|
||||
_, err := db.GetEngine(ctx).Insert(&p)
|
||||
// package_version").Where("version = ?", multiTag).Update(&packages_model.PackageVersion{MetadataJSON: `corrupted "manifests":[{ bad`})
|
||||
require.NoError(t, err)
|
||||
|
||||
var metadata string
|
||||
|
|
|
@ -430,13 +430,12 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
|
|||
}
|
||||
|
||||
rawBranch, err := git_model.GetBranch(ctx, repo.ID, branchName)
|
||||
if err != nil {
|
||||
if err != nil && !git_model.IsErrBranchNotExist(err) {
|
||||
return fmt.Errorf("GetBranch: %v", err)
|
||||
}
|
||||
|
||||
if rawBranch.IsDeleted {
|
||||
return nil
|
||||
}
|
||||
// database branch record not exist or it's a deleted branch
|
||||
notExist := git_model.IsErrBranchNotExist(err) || rawBranch.IsDeleted
|
||||
|
||||
commit, err := gitRepo.GetBranchCommit(branchName)
|
||||
if err != nil {
|
||||
|
@ -444,8 +443,10 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
|
|||
}
|
||||
|
||||
if err := db.WithTx(ctx, func(ctx context.Context) error {
|
||||
if err := git_model.AddDeletedBranch(ctx, repo.ID, branchName, doer.ID); err != nil {
|
||||
return err
|
||||
if !notExist {
|
||||
if err := git_model.AddDeletedBranch(ctx, repo.ID, branchName, doer.ID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return gitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{
|
||||
|
|
|
@ -12,6 +12,7 @@ import (
|
|||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
webhook_model "code.gitea.io/gitea/models/webhook"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
|
@ -179,8 +180,14 @@ func (d discordConvertor) Push(p *api.PushPayload) (DiscordPayload, error) {
|
|||
var text string
|
||||
// for each commit, generate attachment text
|
||||
for i, commit := range p.Commits {
|
||||
text += fmt.Sprintf("[%s](%s) %s - %s", commit.ID[:7], commit.URL,
|
||||
strings.TrimRight(commit.Message, "\r\n"), commit.Author.Name)
|
||||
// limit the commit message display to just the summary, otherwise it would be hard to read
|
||||
message := strings.TrimRight(strings.SplitN(commit.Message, "\n", 1)[0], "\r")
|
||||
|
||||
// a limit of 50 is set because GitHub does the same
|
||||
if utf8.RuneCountInString(message) > 50 {
|
||||
message = fmt.Sprintf("%.47s...", message)
|
||||
}
|
||||
text += fmt.Sprintf("[%s](%s) %s - %s", commit.ID[:7], commit.URL, message, commit.Author.Name)
|
||||
// add linebreak to each commit but the last
|
||||
if i < len(p.Commits)-1 {
|
||||
text += "\n"
|
||||
|
|
|
@ -80,6 +80,20 @@ func TestDiscordPayload(t *testing.T) {
|
|||
assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
|
||||
})
|
||||
|
||||
t.Run("PushWithLongCommitMessage", func(t *testing.T) {
|
||||
p := pushTestMultilineCommitMessagePayload()
|
||||
|
||||
pl, err := dc.Push(p)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Len(t, pl.Embeds, 1)
|
||||
assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title)
|
||||
assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1", pl.Embeds[0].Description)
|
||||
assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name)
|
||||
assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL)
|
||||
assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL)
|
||||
})
|
||||
|
||||
t.Run("Issue", func(t *testing.T) {
|
||||
p := issueTestPayload()
|
||||
|
||||
|
|
|
@ -64,9 +64,17 @@ func forkTestPayload() *api.ForkPayload {
|
|||
}
|
||||
|
||||
func pushTestPayload() *api.PushPayload {
|
||||
return pushTestPayloadWithCommitMessage("commit message")
|
||||
}
|
||||
|
||||
func pushTestMultilineCommitMessagePayload() *api.PushPayload {
|
||||
return pushTestPayloadWithCommitMessage("This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好 ⚠️⚠️️\n\nThis is the message body.")
|
||||
}
|
||||
|
||||
func pushTestPayloadWithCommitMessage(message string) *api.PushPayload {
|
||||
commit := &api.PayloadCommit{
|
||||
ID: "2020558fe2e34debb818a514715839cabd25e778",
|
||||
Message: "commit message",
|
||||
Message: message,
|
||||
URL: "http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778",
|
||||
Author: &api.PayloadUser{
|
||||
Name: "user1",
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<div class="ui secondary filter menu">
|
||||
{{if not .Repository.IsArchived}}
|
||||
<!-- Action Button -->
|
||||
{{if .IsShowClosed}}
|
||||
{{if and .IsShowClosed.Has .IsShowClosed.Value}}
|
||||
<button class="ui primary basic button issue-action" data-action="open" data-url="{{$.RepoLink}}/issues/status">{{ctx.Locale.Tr "repo.issues.action_open"}}</button>
|
||||
{{else}}
|
||||
{{else if and .IsShowClosed.Has (not .IsShowClosed.Value)}}
|
||||
<button class="ui red basic button issue-action" data-action="close" data-url="{{$.RepoLink}}/issues/status">{{ctx.Locale.Tr "repo.issues.action_close"}}</button>
|
||||
{{end}}
|
||||
{{if $.IsRepoAdmin}}
|
||||
|
|
|
@ -7,12 +7,14 @@ import (
|
|||
"bytes"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"encoding/xml"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/routers/api/actions"
|
||||
actions_service "code.gitea.io/gitea/services/actions"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
@ -175,6 +177,134 @@ func TestActionsArtifactV4UploadSingleFileWithRetentionDays(t *testing.T) {
|
|||
assert.True(t, finalizeResp.Ok)
|
||||
}
|
||||
|
||||
func TestActionsArtifactV4UploadSingleFileWithPotentialHarmfulBlockID(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
token, err := actions_service.CreateAuthorizationToken(48, 792, 193)
|
||||
require.NoError(t, err)
|
||||
|
||||
// acquire artifact upload url
|
||||
req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact", toProtoJSON(&actions.CreateArtifactRequest{
|
||||
Version: 4,
|
||||
Name: "artifactWithPotentialHarmfulBlockID",
|
||||
WorkflowRunBackendId: "792",
|
||||
WorkflowJobRunBackendId: "193",
|
||||
})).AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var uploadResp actions.CreateArtifactResponse
|
||||
protojson.Unmarshal(resp.Body.Bytes(), &uploadResp)
|
||||
assert.True(t, uploadResp.Ok)
|
||||
assert.Contains(t, uploadResp.SignedUploadUrl, "/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact")
|
||||
|
||||
// get upload urls
|
||||
idx := strings.Index(uploadResp.SignedUploadUrl, "/twirp/")
|
||||
url := uploadResp.SignedUploadUrl[idx:] + "&comp=block&blockid=%2f..%2fmyfile"
|
||||
blockListURL := uploadResp.SignedUploadUrl[idx:] + "&comp=blocklist"
|
||||
|
||||
// upload artifact chunk
|
||||
body := strings.Repeat("A", 1024)
|
||||
req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body))
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
// verify that the exploit didn't work
|
||||
_, err = storage.Actions.Stat("myfile")
|
||||
require.Error(t, err)
|
||||
|
||||
// upload artifact blockList
|
||||
blockList := &actions.BlockList{
|
||||
Latest: []string{
|
||||
"/../myfile",
|
||||
},
|
||||
}
|
||||
rawBlockList, err := xml.Marshal(blockList)
|
||||
require.NoError(t, err)
|
||||
req = NewRequestWithBody(t, "PUT", blockListURL, bytes.NewReader(rawBlockList))
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
t.Logf("Create artifact confirm")
|
||||
|
||||
sha := sha256.Sum256([]byte(body))
|
||||
|
||||
// confirm artifact upload
|
||||
req = NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact", toProtoJSON(&actions.FinalizeArtifactRequest{
|
||||
Name: "artifactWithPotentialHarmfulBlockID",
|
||||
Size: 1024,
|
||||
Hash: wrapperspb.String("sha256:" + hex.EncodeToString(sha[:])),
|
||||
WorkflowRunBackendId: "792",
|
||||
WorkflowJobRunBackendId: "193",
|
||||
})).
|
||||
AddTokenAuth(token)
|
||||
resp = MakeRequest(t, req, http.StatusOK)
|
||||
var finalizeResp actions.FinalizeArtifactResponse
|
||||
protojson.Unmarshal(resp.Body.Bytes(), &finalizeResp)
|
||||
assert.True(t, finalizeResp.Ok)
|
||||
}
|
||||
|
||||
func TestActionsArtifactV4UploadSingleFileWithChunksOutOfOrder(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
token, err := actions_service.CreateAuthorizationToken(48, 792, 193)
|
||||
require.NoError(t, err)
|
||||
|
||||
// acquire artifact upload url
|
||||
req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact", toProtoJSON(&actions.CreateArtifactRequest{
|
||||
Version: 4,
|
||||
Name: "artifactWithChunksOutOfOrder",
|
||||
WorkflowRunBackendId: "792",
|
||||
WorkflowJobRunBackendId: "193",
|
||||
})).AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var uploadResp actions.CreateArtifactResponse
|
||||
protojson.Unmarshal(resp.Body.Bytes(), &uploadResp)
|
||||
assert.True(t, uploadResp.Ok)
|
||||
assert.Contains(t, uploadResp.SignedUploadUrl, "/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact")
|
||||
|
||||
// get upload urls
|
||||
idx := strings.Index(uploadResp.SignedUploadUrl, "/twirp/")
|
||||
block1URL := uploadResp.SignedUploadUrl[idx:] + "&comp=block&blockid=block1"
|
||||
block2URL := uploadResp.SignedUploadUrl[idx:] + "&comp=block&blockid=block2"
|
||||
blockListURL := uploadResp.SignedUploadUrl[idx:] + "&comp=blocklist"
|
||||
|
||||
// upload artifact chunks
|
||||
bodyb := strings.Repeat("B", 1024)
|
||||
req = NewRequestWithBody(t, "PUT", block2URL, strings.NewReader(bodyb))
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
bodya := strings.Repeat("A", 1024)
|
||||
req = NewRequestWithBody(t, "PUT", block1URL, strings.NewReader(bodya))
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
// upload artifact blockList
|
||||
blockList := &actions.BlockList{
|
||||
Latest: []string{
|
||||
"block1",
|
||||
"block2",
|
||||
},
|
||||
}
|
||||
rawBlockList, err := xml.Marshal(blockList)
|
||||
require.NoError(t, err)
|
||||
req = NewRequestWithBody(t, "PUT", blockListURL, bytes.NewReader(rawBlockList))
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
t.Logf("Create artifact confirm")
|
||||
|
||||
sha := sha256.Sum256([]byte(bodya + bodyb))
|
||||
|
||||
// confirm artifact upload
|
||||
req = NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact", toProtoJSON(&actions.FinalizeArtifactRequest{
|
||||
Name: "artifactWithChunksOutOfOrder",
|
||||
Size: 2048,
|
||||
Hash: wrapperspb.String("sha256:" + hex.EncodeToString(sha[:])),
|
||||
WorkflowRunBackendId: "792",
|
||||
WorkflowJobRunBackendId: "193",
|
||||
})).
|
||||
AddTokenAuth(token)
|
||||
resp = MakeRequest(t, req, http.StatusOK)
|
||||
var finalizeResp actions.FinalizeArtifactResponse
|
||||
protojson.Unmarshal(resp.Body.Bytes(), &finalizeResp)
|
||||
assert.True(t, finalizeResp.Ok)
|
||||
}
|
||||
|
||||
func TestActionsArtifactV4DownloadSingle(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
|
|
|
@ -78,7 +78,6 @@ const sfc = {
|
|||
searchURL() {
|
||||
return `${this.subUrl}/repo/search?sort=updated&order=desc&uid=${this.uid}&team_id=${this.teamId}&q=${this.searchQuery
|
||||
}&page=${this.page}&limit=${this.searchLimit}&mode=${this.repoTypes[this.reposFilter].searchMode
|
||||
}${this.reposFilter !== 'all' ? '&exclusive=1' : ''
|
||||
}${this.archivedFilter === 'archived' ? '&archived=true' : ''}${this.archivedFilter === 'unarchived' ? '&archived=false' : ''
|
||||
}${this.privateFilter === 'private' ? '&is_private=true' : ''}${this.privateFilter === 'public' ? '&is_private=false' : ''
|
||||
}`;
|
||||
|
|
Loading…
Reference in a new issue