mirror of https://github.com/go-gitea/gitea.git
Merge branch 'main' into misspell050
This commit is contained in:
commit
7292423323
|
@ -38,6 +38,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: pip install poetry
|
||||
- run: make deps-py
|
||||
- run: make deps-frontend
|
||||
|
@ -65,6 +67,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend
|
||||
- run: make lint-swagger
|
||||
|
||||
|
@ -134,6 +138,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend
|
||||
- run: make lint-frontend
|
||||
- run: make checks-frontend
|
||||
|
@ -181,6 +187,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend
|
||||
- run: make lint-md
|
||||
- run: make docs
|
||||
|
|
|
@ -24,6 +24,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend frontend deps-backend
|
||||
- run: npx playwright install --with-deps
|
||||
- run: make test-e2e-sqlite
|
||||
|
|
|
@ -25,6 +25,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend deps-backend
|
||||
# xgo build
|
||||
- run: make release
|
||||
|
|
|
@ -24,6 +24,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend deps-backend
|
||||
# xgo build
|
||||
- run: make release
|
||||
|
|
|
@ -26,6 +26,8 @@ jobs:
|
|||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: package-lock.json
|
||||
- run: make deps-frontend deps-backend
|
||||
# xgo build
|
||||
- run: make release
|
||||
|
|
File diff suppressed because it is too large
Load Diff
5382
CHANGELOG.md
5382
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
4
Makefile
4
Makefile
|
@ -143,9 +143,9 @@ TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMAN
|
|||
GO_DIRS := build cmd models modules routers services tests
|
||||
WEB_DIRS := web_src/js web_src/css
|
||||
|
||||
ESLINT_FILES := web_src/js tools *.config.js tests/e2e
|
||||
ESLINT_FILES := web_src/js tools *.js tests/e2e
|
||||
STYLELINT_FILES := web_src/css web_src/js/components/*.vue
|
||||
SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github
|
||||
SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(filter-out CHANGELOG.md, $(wildcard *.go *.js *.md *.yml *.yaml *.toml))
|
||||
EDITORCONFIG_FILES := templates .github/workflows options/locale/locale_en-US.ini
|
||||
|
||||
GO_SOURCES := $(wildcard *.go)
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -4,6 +4,7 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"text/tabwriter"
|
||||
|
@ -91,7 +92,7 @@ func runListAuth(c *cli.Context) error {
|
|||
|
||||
func runDeleteAuth(c *cli.Context) error {
|
||||
if !c.IsSet("id") {
|
||||
return fmt.Errorf("--id flag is missing")
|
||||
return errors.New("--id flag is missing")
|
||||
}
|
||||
|
||||
ctx, cancel := installSignals()
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
|
||||
|
@ -193,7 +194,7 @@ func runAddOauth(c *cli.Context) error {
|
|||
|
||||
func runUpdateOauth(c *cli.Context) error {
|
||||
if !c.IsSet("id") {
|
||||
return fmt.Errorf("--id flag is missing")
|
||||
return errors.New("--id flag is missing")
|
||||
}
|
||||
|
||||
ctx, cancel := installSignals()
|
||||
|
|
|
@ -5,7 +5,6 @@ package cmd
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
|
@ -166,7 +165,7 @@ func runAddSMTP(c *cli.Context) error {
|
|||
|
||||
func runUpdateSMTP(c *cli.Context) error {
|
||||
if !c.IsSet("id") {
|
||||
return fmt.Errorf("--id flag is missing")
|
||||
return errors.New("--id flag is missing")
|
||||
}
|
||||
|
||||
ctx, cancel := installSignals()
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
|
@ -42,7 +43,7 @@ var microcmdUserDelete = &cli.Command{
|
|||
|
||||
func runDeleteUser(c *cli.Context) error {
|
||||
if !c.IsSet("id") && !c.IsSet("username") && !c.IsSet("email") {
|
||||
return fmt.Errorf("You must provide the id, username or email of a user to delete")
|
||||
return errors.New("You must provide the id, username or email of a user to delete")
|
||||
}
|
||||
|
||||
ctx, cancel := installSignals()
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
|
@ -42,7 +43,7 @@ var microcmdUserGenerateAccessToken = &cli.Command{
|
|||
|
||||
func runGenerateAccessToken(c *cli.Context) error {
|
||||
if !c.IsSet("username") {
|
||||
return fmt.Errorf("You must provide a username to generate a token for")
|
||||
return errors.New("You must provide a username to generate a token for")
|
||||
}
|
||||
|
||||
ctx, cancel := installSignals()
|
||||
|
@ -68,7 +69,7 @@ func runGenerateAccessToken(c *cli.Context) error {
|
|||
return err
|
||||
}
|
||||
if exist {
|
||||
return fmt.Errorf("access token name has been used already")
|
||||
return errors.New("access token name has been used already")
|
||||
}
|
||||
|
||||
// make sure the scopes are valid
|
||||
|
|
|
@ -157,9 +157,9 @@ func runViewDo(c *cli.Context) error {
|
|||
}
|
||||
|
||||
if len(matchedAssetFiles) == 0 {
|
||||
return fmt.Errorf("no files matched the given pattern")
|
||||
return errors.New("no files matched the given pattern")
|
||||
} else if len(matchedAssetFiles) > 1 {
|
||||
return fmt.Errorf("too many files matched the given pattern, try to be more specific")
|
||||
return errors.New("too many files matched the given pattern, try to be more specific")
|
||||
}
|
||||
|
||||
data, err := matchedAssetFiles[0].fs.ReadFile(matchedAssetFiles[0].name)
|
||||
|
@ -180,7 +180,7 @@ func runExtractDo(c *cli.Context) error {
|
|||
}
|
||||
|
||||
if c.NArg() == 0 {
|
||||
return fmt.Errorf("a list of pattern of files to extract is mandatory (e.g. '**' for all)")
|
||||
return errors.New("a list of pattern of files to extract is mandatory (e.g. '**' for all)")
|
||||
}
|
||||
|
||||
destdir := "."
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
|
@ -249,7 +250,7 @@ func runAddFileLogger(c *cli.Context) error {
|
|||
if c.IsSet("filename") {
|
||||
vals["filename"] = c.String("filename")
|
||||
} else {
|
||||
return fmt.Errorf("filename must be set when creating a file logger")
|
||||
return errors.New("filename must be set when creating a file logger")
|
||||
}
|
||||
if c.IsSet("rotate") {
|
||||
vals["rotate"] = c.Bool("rotate")
|
||||
|
|
3
go.mod
3
go.mod
|
@ -16,7 +16,6 @@ require (
|
|||
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
|
||||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
|
||||
github.com/NYTimes/gziphandler v1.1.1
|
||||
github.com/PuerkitoBio/goquery v1.9.1
|
||||
github.com/alecthomas/chroma/v2 v2.13.0
|
||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
|
||||
|
@ -67,7 +66,7 @@ require (
|
|||
github.com/json-iterator/go v1.1.12
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
|
||||
github.com/klauspost/compress v1.17.7
|
||||
github.com/klauspost/compress v1.17.8
|
||||
github.com/klauspost/cpuid/v2 v2.2.7
|
||||
github.com/lib/pq v1.10.9
|
||||
github.com/markbates/goth v1.79.0
|
||||
|
|
6
go.sum
6
go.sum
|
@ -70,8 +70,6 @@ github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBa
|
|||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
||||
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
|
||||
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
||||
github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI=
|
||||
|
@ -500,8 +498,8 @@ github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs
|
|||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
|
||||
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"crypto/sha256"
|
||||
"encoding/base32"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
|
@ -294,7 +295,7 @@ func UpdateOAuth2Application(ctx context.Context, opts UpdateOAuth2ApplicationOp
|
|||
return nil, err
|
||||
}
|
||||
if app.UID != opts.UserID {
|
||||
return nil, fmt.Errorf("UID mismatch")
|
||||
return nil, errors.New("UID mismatch")
|
||||
}
|
||||
builtinApps := BuiltinApplications()
|
||||
if _, builtin := builtinApps[app.ClientID]; builtin {
|
||||
|
|
|
@ -5,7 +5,7 @@ package git
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"errors"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -148,7 +148,7 @@ func DeleteLFSLockByID(ctx context.Context, id int64, repo *repo_model.Repositor
|
|||
}
|
||||
|
||||
if !force && u.ID != lock.OwnerID {
|
||||
return nil, fmt.Errorf("user doesn't own lock and force flag is not set")
|
||||
return nil, errors.New("user doesn't own lock and force flag is not set")
|
||||
}
|
||||
|
||||
if _, err := db.GetEngine(dbCtx).ID(id).Delete(new(LFSLock)); err != nil {
|
||||
|
|
|
@ -118,7 +118,7 @@ func removeAllRepositories(ctx context.Context, t *organization.Team) (err error
|
|||
|
||||
// Remove watches from all users and now unaccessible repos
|
||||
for _, user := range t.Members {
|
||||
has, err := access_model.HasAccess(ctx, user.ID, repo)
|
||||
has, err := access_model.HasAnyUnitAccess(ctx, user.ID, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
|
@ -544,7 +544,7 @@ func ReconsiderRepoIssuesAssignee(ctx context.Context, repo *repo_model.Reposito
|
|||
}
|
||||
|
||||
func ReconsiderWatches(ctx context.Context, repo *repo_model.Repository, user *user_model.User) error {
|
||||
if has, err := access_model.HasAccess(ctx, user.ID, repo); err != nil || has {
|
||||
if has, err := access_model.HasAnyUnitAccess(ctx, user.ID, repo); err != nil || has {
|
||||
return err
|
||||
}
|
||||
if err := repo_model.WatchRepo(ctx, user, repo, false); err != nil {
|
||||
|
|
|
@ -287,9 +287,10 @@ func (opts *PackageSearchOptions) configureOrderBy(e db.Engine) {
|
|||
// SearchVersions gets all versions of packages matching the search options
|
||||
func SearchVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) {
|
||||
sess := db.GetEngine(ctx).
|
||||
Where(opts.ToConds()).
|
||||
Select("package_version.*").
|
||||
Table("package_version").
|
||||
Join("INNER", "package", "package.id = package_version.package_id")
|
||||
Join("INNER", "package", "package.id = package_version.package_id").
|
||||
Where(opts.ToConds())
|
||||
|
||||
opts.configureOrderBy(sess)
|
||||
|
||||
|
@ -304,19 +305,18 @@ func SearchVersions(ctx context.Context, opts *PackageSearchOptions) ([]*Package
|
|||
|
||||
// SearchLatestVersions gets the latest version of every package matching the search options
|
||||
func SearchLatestVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) {
|
||||
cond := opts.ToConds().
|
||||
And(builder.Expr("pv2.id IS NULL"))
|
||||
|
||||
joinCond := builder.Expr("package_version.package_id = pv2.package_id AND (package_version.created_unix < pv2.created_unix OR (package_version.created_unix = pv2.created_unix AND package_version.id < pv2.id))")
|
||||
if opts.IsInternal.Has() {
|
||||
joinCond = joinCond.And(builder.Eq{"pv2.is_internal": opts.IsInternal.Value()})
|
||||
}
|
||||
in := builder.
|
||||
Select("MAX(package_version.id)").
|
||||
From("package_version").
|
||||
InnerJoin("package", "package.id = package_version.package_id").
|
||||
Where(opts.ToConds()).
|
||||
GroupBy("package_version.package_id")
|
||||
|
||||
sess := db.GetEngine(ctx).
|
||||
Select("package_version.*").
|
||||
Table("package_version").
|
||||
Join("LEFT", "package_version pv2", joinCond).
|
||||
Join("INNER", "package", "package.id = package_version.package_id").
|
||||
Where(cond)
|
||||
Where(builder.In("package_version.id", in))
|
||||
|
||||
opts.configureOrderBy(sess)
|
||||
|
||||
|
|
|
@ -79,17 +79,17 @@ func TestHasAccess(t *testing.T) {
|
|||
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
|
||||
assert.True(t, repo2.IsPrivate)
|
||||
|
||||
has, err := access_model.HasAccess(db.DefaultContext, user1.ID, repo1)
|
||||
has, err := access_model.HasAnyUnitAccess(db.DefaultContext, user1.ID, repo1)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, has)
|
||||
|
||||
_, err = access_model.HasAccess(db.DefaultContext, user1.ID, repo2)
|
||||
_, err = access_model.HasAnyUnitAccess(db.DefaultContext, user1.ID, repo2)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo1)
|
||||
_, err = access_model.HasAnyUnitAccess(db.DefaultContext, user2.ID, repo1)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo2)
|
||||
_, err = access_model.HasAnyUnitAccess(db.DefaultContext, user2.ID, repo2)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,8 @@ type Permission struct {
|
|||
|
||||
units []*repo_model.RepoUnit
|
||||
unitsMode map[unit.Type]perm_model.AccessMode
|
||||
|
||||
everyoneAccessMode map[unit.Type]perm_model.AccessMode
|
||||
}
|
||||
|
||||
// IsOwner returns true if current user is the owner of repository.
|
||||
|
@ -36,9 +38,24 @@ func (p *Permission) IsAdmin() bool {
|
|||
return p.AccessMode >= perm_model.AccessModeAdmin
|
||||
}
|
||||
|
||||
// HasAccess returns true if the current user might have at least read access to any unit of this repository
|
||||
func (p *Permission) HasAccess() bool {
|
||||
return len(p.unitsMode) > 0 || p.AccessMode >= perm_model.AccessModeRead
|
||||
// HasAnyUnitAccess returns true if the user might have at least one access mode to any unit of this repository.
|
||||
// It doesn't count the "everyone access mode".
|
||||
func (p *Permission) HasAnyUnitAccess() bool {
|
||||
for _, v := range p.unitsMode {
|
||||
if v >= perm_model.AccessModeRead {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return p.AccessMode >= perm_model.AccessModeRead
|
||||
}
|
||||
|
||||
func (p *Permission) HasAnyUnitAccessOrEveryoneAccess() bool {
|
||||
for _, v := range p.everyoneAccessMode {
|
||||
if v >= perm_model.AccessModeRead {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return p.HasAnyUnitAccess()
|
||||
}
|
||||
|
||||
// HasUnits returns true if the permission contains attached units
|
||||
|
@ -56,16 +73,16 @@ func (p *Permission) GetFirstUnitRepoID() int64 {
|
|||
}
|
||||
|
||||
// UnitAccessMode returns current user access mode to the specify unit of the repository
|
||||
// It also considers "everyone access mode"
|
||||
func (p *Permission) UnitAccessMode(unitType unit.Type) perm_model.AccessMode {
|
||||
if p.unitsMode != nil {
|
||||
// if the units map contains the access mode, use it, but admin/owner mode could override it
|
||||
if m, ok := p.unitsMode[unitType]; ok {
|
||||
return util.Iif(p.AccessMode >= perm_model.AccessModeAdmin, p.AccessMode, m)
|
||||
}
|
||||
// if the units map contains the access mode, use it, but admin/owner mode could override it
|
||||
if m, ok := p.unitsMode[unitType]; ok {
|
||||
return util.Iif(p.AccessMode >= perm_model.AccessModeAdmin, p.AccessMode, m)
|
||||
}
|
||||
// if the units map does not contain the access mode, return the default access mode if the unit exists
|
||||
unitDefaultAccessMode := max(p.AccessMode, p.everyoneAccessMode[unitType])
|
||||
hasUnit := slices.ContainsFunc(p.units, func(u *repo_model.RepoUnit) bool { return u.Type == unitType })
|
||||
return util.Iif(hasUnit, p.AccessMode, perm_model.AccessModeNone)
|
||||
return util.Iif(hasUnit, unitDefaultAccessMode, perm_model.AccessModeNone)
|
||||
}
|
||||
|
||||
func (p *Permission) SetUnitsWithDefaultAccessMode(units []*repo_model.RepoUnit, mode perm_model.AccessMode) {
|
||||
|
@ -159,14 +176,15 @@ func (p *Permission) LogString() string {
|
|||
}
|
||||
|
||||
func applyEveryoneRepoPermission(user *user_model.User, perm *Permission) {
|
||||
if user != nil && user.ID > 0 {
|
||||
for _, u := range perm.units {
|
||||
if perm.unitsMode == nil {
|
||||
perm.unitsMode = make(map[unit.Type]perm_model.AccessMode)
|
||||
}
|
||||
if u.EveryoneAccessMode >= perm_model.AccessModeRead && u.EveryoneAccessMode > perm.unitsMode[u.Type] {
|
||||
perm.unitsMode[u.Type] = u.EveryoneAccessMode
|
||||
if user == nil || user.ID <= 0 {
|
||||
return
|
||||
}
|
||||
for _, u := range perm.units {
|
||||
if u.EveryoneAccessMode >= perm_model.AccessModeRead && u.EveryoneAccessMode > perm.everyoneAccessMode[u.Type] {
|
||||
if perm.everyoneAccessMode == nil {
|
||||
perm.everyoneAccessMode = make(map[unit.Type]perm_model.AccessMode)
|
||||
}
|
||||
perm.everyoneAccessMode[u.Type] = u.EveryoneAccessMode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -373,8 +391,8 @@ func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model.
|
|||
perm.CanAccessAny(perm_model.AccessModeRead, unit.TypePullRequests), nil
|
||||
}
|
||||
|
||||
// HasAccess returns true if user has access to repo
|
||||
func HasAccess(ctx context.Context, userID int64, repo *repo_model.Repository) (bool, error) {
|
||||
// HasAnyUnitAccess see the comment of "perm.HasAnyUnitAccess"
|
||||
func HasAnyUnitAccess(ctx context.Context, userID int64, repo *repo_model.Repository) (bool, error) {
|
||||
var user *user_model.User
|
||||
var err error
|
||||
if userID > 0 {
|
||||
|
@ -387,7 +405,7 @@ func HasAccess(ctx context.Context, userID int64, repo *repo_model.Repository) (
|
|||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return perm.HasAccess(), nil
|
||||
return perm.HasAnyUnitAccess(), nil
|
||||
}
|
||||
|
||||
// getUsersWithAccessMode returns users that have at least given access mode to the repository.
|
||||
|
|
|
@ -14,16 +14,54 @@ import (
|
|||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestHasAnyUnitAccess(t *testing.T) {
|
||||
perm := Permission{}
|
||||
assert.False(t, perm.HasAnyUnitAccess())
|
||||
|
||||
perm = Permission{
|
||||
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
|
||||
}
|
||||
assert.False(t, perm.HasAnyUnitAccess())
|
||||
assert.False(t, perm.HasAnyUnitAccessOrEveryoneAccess())
|
||||
|
||||
perm = Permission{
|
||||
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
|
||||
everyoneAccessMode: map[unit.Type]perm_model.AccessMode{unit.TypeIssues: perm_model.AccessModeRead},
|
||||
}
|
||||
assert.False(t, perm.HasAnyUnitAccess())
|
||||
assert.True(t, perm.HasAnyUnitAccessOrEveryoneAccess())
|
||||
|
||||
perm = Permission{
|
||||
AccessMode: perm_model.AccessModeRead,
|
||||
units: []*repo_model.RepoUnit{{Type: unit.TypeWiki}},
|
||||
}
|
||||
assert.True(t, perm.HasAnyUnitAccess())
|
||||
|
||||
perm = Permission{
|
||||
unitsMode: map[unit.Type]perm_model.AccessMode{unit.TypeWiki: perm_model.AccessModeRead},
|
||||
}
|
||||
assert.True(t, perm.HasAnyUnitAccess())
|
||||
}
|
||||
|
||||
func TestApplyEveryoneRepoPermission(t *testing.T) {
|
||||
perm := Permission{
|
||||
AccessMode: perm_model.AccessModeNone,
|
||||
units: []*repo_model.RepoUnit{
|
||||
{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeNone},
|
||||
{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
|
||||
},
|
||||
}
|
||||
applyEveryoneRepoPermission(nil, &perm)
|
||||
assert.False(t, perm.CanRead(unit.TypeWiki))
|
||||
|
||||
perm = Permission{
|
||||
AccessMode: perm_model.AccessModeNone,
|
||||
units: []*repo_model.RepoUnit{
|
||||
{Type: unit.TypeWiki, EveryoneAccessMode: perm_model.AccessModeRead},
|
||||
},
|
||||
}
|
||||
applyEveryoneRepoPermission(&user_model.User{ID: 0}, &perm)
|
||||
assert.False(t, perm.CanRead(unit.TypeWiki))
|
||||
|
||||
perm = Permission{
|
||||
AccessMode: perm_model.AccessModeNone,
|
||||
units: []*repo_model.RepoUnit{
|
||||
|
@ -40,8 +78,8 @@ func TestApplyEveryoneRepoPermission(t *testing.T) {
|
|||
},
|
||||
}
|
||||
applyEveryoneRepoPermission(&user_model.User{ID: 1}, &perm)
|
||||
assert.True(t, perm.CanRead(unit.TypeWiki))
|
||||
assert.False(t, perm.CanWrite(unit.TypeWiki)) // because there is no unit mode, so the everyone-mode is used as the unit's access mode
|
||||
// it should work the same as "EveryoneAccessMode: none" because the default AccessMode should be applied to units
|
||||
assert.True(t, perm.CanWrite(unit.TypeWiki))
|
||||
|
||||
perm = Permission{
|
||||
units: []*repo_model.RepoUnit{
|
||||
|
|
|
@ -5,6 +5,7 @@ package models
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
|
@ -147,7 +148,7 @@ func DeleteRepositoryTransfer(ctx context.Context, repoID int64) error {
|
|||
func TestRepositoryReadyForTransfer(status repo_model.RepositoryStatus) error {
|
||||
switch status {
|
||||
case repo_model.RepositoryBeingMigrated:
|
||||
return fmt.Errorf("repo is not ready, currently migrating")
|
||||
return errors.New("repo is not ready, currently migrating")
|
||||
case repo_model.RepositoryPendingTransfer:
|
||||
return ErrRepoTransferInProgress{}
|
||||
}
|
||||
|
|
|
@ -468,7 +468,7 @@ func parseCommitFileStatus(fileStatus *CommitFileStatus, stdout io.Reader) {
|
|||
_, _ = rd.Discard(1)
|
||||
}
|
||||
for {
|
||||
modifier, err := rd.ReadSlice('\x00')
|
||||
modifier, err := rd.ReadString('\x00')
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
log.Error("Unexpected error whilst reading from git log --name-status. Error: %v", err)
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
var (
|
||||
backoffBegin = 50 * time.Millisecond
|
||||
backoffUpper = 2 * time.Second
|
||||
)
|
||||
|
@ -18,6 +18,14 @@ type (
|
|||
backoffFuncErr func() (retry bool, err error)
|
||||
)
|
||||
|
||||
func mockBackoffDuration(d time.Duration) func() {
|
||||
oldBegin, oldUpper := backoffBegin, backoffUpper
|
||||
backoffBegin, backoffUpper = d, d
|
||||
return func() {
|
||||
backoffBegin, backoffUpper = oldBegin, oldUpper
|
||||
}
|
||||
}
|
||||
|
||||
func backoffRetErr[T any](ctx context.Context, begin, upper time.Duration, end <-chan time.Time, fn backoffFuncRetErr[T]) (ret T, err error) {
|
||||
d := begin
|
||||
for {
|
||||
|
|
|
@ -250,6 +250,7 @@ func TestWorkerPoolQueueShutdown(t *testing.T) {
|
|||
|
||||
func TestWorkerPoolQueueWorkerIdleReset(t *testing.T) {
|
||||
defer test.MockVariableValue(&workerIdleDuration, 10*time.Millisecond)()
|
||||
defer mockBackoffDuration(10 * time.Millisecond)()
|
||||
|
||||
handler := func(items ...int) (unhandled []int) {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
|
|
|
@ -6,9 +6,6 @@ package session
|
|||
import (
|
||||
"net/http"
|
||||
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/web/middleware"
|
||||
|
||||
"gitea.com/go-chi/session"
|
||||
)
|
||||
|
||||
|
@ -21,10 +18,12 @@ type Store interface {
|
|||
|
||||
// RegenerateSession regenerates the underlying session and returns the new store
|
||||
func RegenerateSession(resp http.ResponseWriter, req *http.Request) (Store, error) {
|
||||
// Ensure that a cookie with a trailing slash does not take precedence over
|
||||
// the cookie written by the middleware.
|
||||
middleware.DeleteLegacySiteCookie(resp, setting.SessionConfig.CookieName)
|
||||
|
||||
for _, f := range BeforeRegenerateSession {
|
||||
f(resp, req)
|
||||
}
|
||||
s, err := session.RegenerateSession(resp, req)
|
||||
return s, err
|
||||
}
|
||||
|
||||
// BeforeRegenerateSession is a list of functions that are called before a session is regenerated.
|
||||
var BeforeRegenerateSession []func(http.ResponseWriter, *http.Request)
|
||||
|
|
|
@ -128,6 +128,16 @@ func hasResponseBeenWritten(argsIn []reflect.Value) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func wrapHandlerProvider[T http.Handler](hp func(next http.Handler) T, funcInfo *routing.FuncInfo) func(next http.Handler) http.Handler {
|
||||
return func(next http.Handler) http.Handler {
|
||||
h := hp(next) // this handle could be dynamically generated, so we can't use it for debug info
|
||||
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
||||
routing.UpdateFuncInfo(req.Context(), funcInfo)
|
||||
h.ServeHTTP(resp, req)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// toHandlerProvider converts a handler to a handler provider
|
||||
// A handler provider is a function that takes a "next" http.Handler, it can be used as a middleware
|
||||
func toHandlerProvider(handler any) func(next http.Handler) http.Handler {
|
||||
|
@ -138,13 +148,9 @@ func toHandlerProvider(handler any) func(next http.Handler) http.Handler {
|
|||
}
|
||||
|
||||
if hp, ok := handler.(func(next http.Handler) http.Handler); ok {
|
||||
return func(next http.Handler) http.Handler {
|
||||
h := hp(next) // this handle could be dynamically generated, so we can't use it for debug info
|
||||
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
||||
routing.UpdateFuncInfo(req.Context(), funcInfo)
|
||||
h.ServeHTTP(resp, req)
|
||||
})
|
||||
}
|
||||
return wrapHandlerProvider(hp, funcInfo)
|
||||
} else if hp, ok := handler.(func(http.Handler) http.HandlerFunc); ok {
|
||||
return wrapHandlerProvider(hp, funcInfo)
|
||||
}
|
||||
|
||||
provider := func(next http.Handler) http.Handler {
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"net/url"
|
||||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/session"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
)
|
||||
|
||||
|
@ -48,12 +49,12 @@ func SetSiteCookie(resp http.ResponseWriter, name, value string, maxAge int) {
|
|||
// Previous versions would use a cookie path with a trailing /.
|
||||
// These are more specific than cookies without a trailing /, so
|
||||
// we need to delete these if they exist.
|
||||
DeleteLegacySiteCookie(resp, name)
|
||||
deleteLegacySiteCookie(resp, name)
|
||||
}
|
||||
|
||||
// DeleteLegacySiteCookie deletes the cookie with the given name at the cookie
|
||||
// deleteLegacySiteCookie deletes the cookie with the given name at the cookie
|
||||
// path with a trailing /, which would unintentionally override the cookie.
|
||||
func DeleteLegacySiteCookie(resp http.ResponseWriter, name string) {
|
||||
func deleteLegacySiteCookie(resp http.ResponseWriter, name string) {
|
||||
if setting.SessionConfig.CookiePath == "" || strings.HasSuffix(setting.SessionConfig.CookiePath, "/") {
|
||||
// If the cookie path ends with /, no legacy cookies will take
|
||||
// precedence, so do nothing. The exception is that cookies with no
|
||||
|
@ -74,3 +75,11 @@ func DeleteLegacySiteCookie(resp http.ResponseWriter, name string) {
|
|||
}
|
||||
resp.Header().Add("Set-Cookie", cookie.String())
|
||||
}
|
||||
|
||||
func init() {
|
||||
session.BeforeRegenerateSession = append(session.BeforeRegenerateSession, func(resp http.ResponseWriter, _ *http.Request) {
|
||||
// Ensure that a cookie with a trailing slash does not take precedence over
|
||||
// the cookie written by the middleware.
|
||||
deleteLegacySiteCookie(resp, setting.SessionConfig.CookieName)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -150,6 +150,10 @@ filter.private=Privé
|
|||
|
||||
|
||||
[search]
|
||||
exact=Exact
|
||||
exact_tooltip=Inclure uniquement les résultats qui correspondent exactement au terme de recherche
|
||||
issue_kind=Recherche de tickets…
|
||||
pull_kind=Recherche de demandes d’ajouts…
|
||||
|
||||
[aria]
|
||||
navbar=Barre de navigation
|
||||
|
@ -824,6 +828,7 @@ repo_and_org_access=Accès aux Organisations et Dépôts
|
|||
permissions_public_only=Publique uniquement
|
||||
permissions_access_all=Tout (public, privé et limité)
|
||||
select_permissions=Sélectionner les autorisations
|
||||
permission_not_set=Non défini
|
||||
permission_no_access=Aucun accès
|
||||
permission_read=Lecture
|
||||
permission_write=Lecture et écriture
|
||||
|
@ -2016,6 +2021,7 @@ settings.branches.add_new_rule=Ajouter une nouvelle règle
|
|||
settings.advanced_settings=Paramètres avancés
|
||||
settings.wiki_desc=Activer le wiki du dépôt
|
||||
settings.use_internal_wiki=Utiliser le wiki interne
|
||||
settings.default_wiki_everyone_access=Autorisation d’accès par défaut pour les utilisateurs connectés :
|
||||
settings.use_external_wiki=Utiliser un wiki externe
|
||||
settings.external_wiki_url=URL Wiki externe
|
||||
settings.external_wiki_url_error=L’URL du wiki externe n’est pas une URL valide.
|
||||
|
|
|
@ -44,7 +44,7 @@ webauthn_use_twofa=携帯電話から2要素認証コードを使用する
|
|||
webauthn_error=セキュリティキーを読み取ることができません。
|
||||
webauthn_unsupported_browser=お使いのブラウザは現在 WebAuthn をサポートしていません。
|
||||
webauthn_error_unknown=不明なエラーが発生しました。 もう一度やり直してください。
|
||||
webauthn_error_insecure=WebAuthn はセキュアな接続のみをサポートしています。HTTP 経由でテストする場合は、"localhost" または "127.0.0.1" のオリジンが使用できます。
|
||||
webauthn_error_insecure=WebAuthn は安全な接続でのみ使用できます。 HTTPでのテストには "localhost" または "127.0.0.1" のオリジンが使用できます。
|
||||
webauthn_error_unable_to_process=サーバーがリクエストを処理できませんでした。
|
||||
webauthn_error_duplicated=このリクエストに対しては、許可されていないセキュリティキーです。 キーが未登録であることを確認してください。
|
||||
webauthn_error_empty=このキーに名前を設定する必要があります。
|
||||
|
@ -163,21 +163,21 @@ no_results_found=見つかりません。
|
|||
search=検索…
|
||||
type_tooltip=検索タイプ
|
||||
fuzzy=あいまい
|
||||
fuzzy_tooltip=検索ワードに近い結果も含めます
|
||||
fuzzy_tooltip=検索語におおよそ一致する結果も含めます
|
||||
repo_kind=リポジトリを検索...
|
||||
user_kind=ユーザーを検索...
|
||||
org_kind=組織を検索...
|
||||
team_kind=チームを検索…
|
||||
code_kind=コードを検索...
|
||||
code_search_unavailable=現在コード検索は利用できません。 サイト管理者にお問い合わせください。
|
||||
code_search_by_git_grep=現在のコード検索結果は "git grep" で提供されています。 サイト管理者がリポジトリインデクサーを有効にすると、より良い結果が得られるかもしれません。
|
||||
code_search_unavailable=コード検索は現在利用できません。 サイト管理者にお問い合わせください。
|
||||
code_search_by_git_grep=現在のコード検索は "git grep" によって行われています。 サイト管理者がリポジトリインデクサーを有効にすれば、より優れた結果が得られる可能性があります。
|
||||
package_kind=パッケージを検索...
|
||||
project_kind=プロジェクトを検索...
|
||||
branch_kind=ブランチを検索...
|
||||
commit_kind=コミットを検索...
|
||||
runner_kind=ランナーを検索...
|
||||
no_results=一致する結果が見つかりませんでした
|
||||
keyword_search_unavailable=現在キーワード検索は利用できません。 サイト管理者にお問い合わせください。
|
||||
keyword_search_unavailable=キーワード検索は現在利用できません。 サイト管理者にお問い合わせください。
|
||||
|
||||
[aria]
|
||||
navbar=ナビゲーションバー
|
||||
|
@ -212,9 +212,9 @@ string.asc=A - Z
|
|||
string.desc=Z - A
|
||||
|
||||
[error]
|
||||
occurred=エラーが発生しました.
|
||||
occurred=エラーが発生しました
|
||||
report_message=Gitea のバグが疑われる場合は、<a href="https://github.com/go-gitea/gitea/issues" target="_blank">GitHub</a>でIssueを検索して、見つからなければ新しいIssueを作成してください。
|
||||
missing_csrf=不正なリクエスト: CSRFトークンが不明です
|
||||
missing_csrf=不正なリクエスト: CSRFトークンがありません
|
||||
invalid_csrf=不正なリクエスト: CSRFトークンが無効です
|
||||
not_found=ターゲットが見つかりませんでした。
|
||||
network_error=ネットワークエラー
|
||||
|
@ -224,11 +224,11 @@ app_desc=自分で立てる、超簡単 Git サービス
|
|||
install=簡単インストール
|
||||
install_desc=シンプルに、プラットフォームに応じて<a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.com/installation/install-from-binary">バイナリを実行</a>したり、<a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea/tree/master/docker">Docker</a>で動かしたり、<a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.com/installation/install-from-package">パッケージ</a>を使うだけ。
|
||||
platform=クロスプラットフォーム
|
||||
platform_desc=Giteaは<a target="_blank" rel="noopener noreferrer" href="http://golang.org/">Go</a>でコンパイルできる環境ならどこでも動きます: Windows、macOS、Linux、ARM等々、好きなものを選んでください!
|
||||
platform_desc=Giteaは<a target="_blank" rel="noopener noreferrer" href="http://golang.org/">Go</a>がコンパイル可能なあらゆる環境で動きます: Windows、macOS、Linux、ARMなど。 あなたの好きなものを選んでください!
|
||||
lightweight=軽量
|
||||
lightweight_desc=Gitea の最小動作要件は小さくて、安価な Raspberry Pi でも動きます。エネルギー消費を節約しましょう!
|
||||
lightweight_desc=Gitea の最小動作要件は小さいため、安価な Raspberry Pi でも動きます。エネルギーを節約しましょう!
|
||||
license=オープンソース
|
||||
license_desc=Go get <a target="_blank" rel="noopener noreferrer" href="https://code.gitea.io/gitea">code.gitea.io/gitea</a>! 私たちと一緒にこのプロジェクトをより良くしていくために、何か<a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea">貢献</a>してみませんか。 些細なことでも大丈夫! 積極的にお願いします!
|
||||
license_desc=Go get <a target="_blank" rel="noopener noreferrer" href="https://code.gitea.io/gitea">code.gitea.io/gitea</a>! このプロジェクトをさらに向上させるため、ぜひ<a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea">貢献</a>して参加してください。 貢献者になることを恥ずかしがらないで!
|
||||
|
||||
[install]
|
||||
install=インストール
|
||||
|
@ -393,6 +393,7 @@ forgot_password_title=パスワードを忘れた
|
|||
forgot_password=パスワードをお忘れですか?
|
||||
sign_up_now=アカウントが必要ですか? 今すぐ登録しましょう。
|
||||
sign_up_successful=アカウントは無事に作成されました。ようこそ!
|
||||
confirmation_mail_sent_prompt_ex=新しい確認メールを <b>%s</b> に送信しました。 %s以内にメールボックスを確認し、登録手続きを完了してください。 登録メールアドレスが間違っている場合は、もういちどサインインすると変更することができます。
|
||||
must_change_password=パスワードの更新
|
||||
allow_password_change=ユーザーはパスワードの変更が必要 (推奨)
|
||||
reset_password_mail_sent_prompt=<b>%s</b> に確認メールを送信しました。 %s以内に受信トレイを確認し、アカウント回復手続きを完了してください。
|
||||
|
@ -402,6 +403,7 @@ prohibit_login=サインイン禁止
|
|||
prohibit_login_desc=あなたのアカウントはサインインを禁止されています。 サイト管理者にお問い合わせください。
|
||||
resent_limit_prompt=少し前に、あなたからアクティベーションメールが要求されています。 3分待ったのち、もう一度試してください。
|
||||
has_unconfirmed_mail=こんにちは %s さん、あなたのメール アドレス (<b>%s</b>) は確認がとれていません。 確認メールを受け取っていない場合や、改めて送信したい場合は、下のボタンをクリックしてください。
|
||||
change_unconfirmed_mail_address=登録のメールアドレスが間違っている場合は、こちらで変更して新しい確認メールを再送信することができます。
|
||||
resend_mail=アクティベーションメールを再送信するにはここをクリック
|
||||
email_not_associate=このメールアドレスは、どのアカウントにも関連付けられていません。
|
||||
send_reset_mail=アカウント回復メールを送信
|
||||
|
@ -582,6 +584,7 @@ team_name_been_taken=チーム名が既に使用されています。
|
|||
team_no_units_error=リポジトリセクションは、少なくともひとつはアクセスを許可してください。
|
||||
email_been_used=メールアドレスが既に使用されています。
|
||||
email_invalid=メールアドレスが不正です。
|
||||
email_domain_is_not_allowed=ユーザーのメールアドレス <b>%s</b> のドメインが、EMAIL_DOMAIN_ALLOWLIST または EMAIL_DOMAIN_BLOCKLIST に違反しています。 あなたの操作が適切なものであるか確認してください。
|
||||
openid_been_used=OpenIDのアドレス "%s" は既に使用されています。
|
||||
username_password_incorrect=ユーザー名またはパスワードが間違っています。
|
||||
password_complexity=パスワードが複雑性の要件を満たしていません:
|
||||
|
@ -593,6 +596,8 @@ enterred_invalid_repo_name=入力したリポジトリ名が間違っていま
|
|||
enterred_invalid_org_name=入力した Organization の名前が間違っています。
|
||||
enterred_invalid_owner_name=新しいオーナーの名前が正しくありません。
|
||||
enterred_invalid_password=入力されたパスワードが間違っています。
|
||||
unset_password=ログインユーザーはパスワードを設定していません。
|
||||
unsupported_login_type=ログインの種類がアカウントの削除に対応していません。
|
||||
user_not_exist=指定されたユーザーは存在しません。
|
||||
team_not_exist=チームが存在していません。
|
||||
last_org_owner='Owners'チームから最後のユーザーを削除することはできません。ひとつの組織には少なくとも一人のオーナーが必要です。
|
||||
|
@ -707,6 +712,7 @@ cancel=キャンセル
|
|||
language=言語
|
||||
ui=テーマ
|
||||
hidden_comment_types=非表示にするコメントの種類
|
||||
hidden_comment_types_description=ここでチェックを入れたコメントの種類は、イシューのページには表示されません。 たとえば「ラベル」にチェックを入れると、「{ユーザー} が {ラベル} を追加/削除」といったコメントはすべて除外されます。
|
||||
hidden_comment_types.ref_tooltip=このイシューが別のイシューやコミット等から参照された、というコメント
|
||||
hidden_comment_types.issue_ref_tooltip=このイシューのブランチやタグへの関連付けをユーザーが変更した、というコメント
|
||||
comment_type_group_reference=参照
|
||||
|
@ -1225,6 +1231,8 @@ file_view_rendered=レンダリング表示
|
|||
file_view_raw=Rawデータを見る
|
||||
file_permalink=パーマリンク
|
||||
file_too_large=このファイルは大きすぎるため、表示できません。
|
||||
code_preview_line_from_to=%[1]d 行目から %[2]d 行目 in %[3]s
|
||||
code_preview_line_in=%[1]d 行目 in %[2]s
|
||||
invisible_runes_header=このファイルには不可視のUnicode文字が含まれています
|
||||
invisible_runes_description=このファイルには人間が識別できない不可視のUnicode文字が含まれており、コンピューターによって特殊な処理が行われる可能性があります。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 不可視文字を表示するにはエスケープボタンを使用します。
|
||||
ambiguous_runes_header=このファイルには曖昧(ambiguous)なUnicode文字が含まれています
|
||||
|
@ -1279,6 +1287,7 @@ editor.or=または
|
|||
editor.cancel_lower=キャンセル
|
||||
editor.commit_signed_changes=署名した変更をコミット
|
||||
editor.commit_changes=変更をコミット
|
||||
editor.add_tmpl='{ファイル名}' を追加
|
||||
editor.add=%s を追加
|
||||
editor.update=%s を更新
|
||||
editor.delete=%s を削除
|
||||
|
@ -3076,12 +3085,14 @@ auths.tips=ヒント
|
|||
auths.tips.oauth2.general=OAuth2認証
|
||||
auths.tips.oauth2.general.tip=新しいOAuth2認証を登録するときは、コールバック/リダイレクトURLは以下になります:
|
||||
auths.tip.oauth2_provider=OAuth2プロバイダー
|
||||
auths.tip.bitbucket=新しいOAuthコンシューマーを https://bitbucket.org/account/user/{あなたのユーザー名}/oauth-consumers/new から登録し、"アカウント" に "読み取り" 権限を追加してください。
|
||||
auths.tip.nextcloud=新しいOAuthコンシューマーを、インスタンスのメニュー "Settings -> Security -> OAuth 2.0 client" から登録してください。
|
||||
auths.tip.dropbox=新しいアプリケーションを https://www.dropbox.com/developers/apps から登録してください。
|
||||
auths.tip.facebook=新しいアプリケーションを https://developers.facebook.com/apps で登録し、"Facebook Login"を追加してください。
|
||||
auths.tip.github=新しいOAuthアプリケーションを https://github.com/settings/applications/new から登録してください。
|
||||
auths.tip.gitlab_new=新しいアプリケーションを https://gitlab.com/-/profile/applications から登録してください。
|
||||
auths.tip.google_plus=OAuth2クライアント資格情報を、Google APIコンソール https://console.developers.google.com/ から取得してください。
|
||||
auths.tip.openid_connect=OpenID Connect DiscoveryのURL "https://{server}/.well-known/openid-configuration" をエンドポイントとして指定してください
|
||||
auths.tip.twitter=https://dev.twitter.com/apps へアクセスしてアプリケーションを作成し、“Allow this application to be used to Sign in with Twitter”オプションを有効にしてください。
|
||||
auths.tip.discord=新しいアプリケーションを https://discordapp.com/developers/applications/me から登録してください。
|
||||
auths.tip.gitea=新しいOAuthアプリケーションを登録してください。 利用ガイドは https://docs.gitea.com/development/oauth2-provider にあります
|
||||
|
|
|
@ -164,6 +164,8 @@ search=Pesquisar...
|
|||
type_tooltip=Tipo de pesquisa
|
||||
fuzzy=Aproximada
|
||||
fuzzy_tooltip=Incluir também os resultados que estejam próximos do termo de pesquisa
|
||||
exact=Fiel
|
||||
exact_tooltip=Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa
|
||||
repo_kind=Pesquisar repositórios...
|
||||
user_kind=Pesquisar utilizadores...
|
||||
org_kind=Pesquisar organizações...
|
||||
|
@ -177,6 +179,8 @@ branch_kind=Pesquisar ramos...
|
|||
commit_kind=Pesquisar cometimentos...
|
||||
runner_kind=Pesquisar executores...
|
||||
no_results=Não foram encontrados resultados correspondentes.
|
||||
issue_kind=Pesquisar questões...
|
||||
pull_kind=Pesquisar puxadas...
|
||||
keyword_search_unavailable=Pesquisar por palavra-chave não está disponível, neste momento. Entre em contacto com o administrador.
|
||||
|
||||
[aria]
|
||||
|
@ -712,6 +716,7 @@ cancel=Cancelar
|
|||
language=Idioma
|
||||
ui=Tema
|
||||
hidden_comment_types=Tipos de comentários ocultos
|
||||
hidden_comment_types_description=Os tipos de comentário marcados aqui não serão mostrados dentro das páginas das questões. Marcar "Rótulo", por exemplo, remove todos os comentários "{user} adicionou/removeu {label}".
|
||||
hidden_comment_types.ref_tooltip=Comentários onde esta questão foi referenciada a partir de outra questão/cometimento/…
|
||||
hidden_comment_types.issue_ref_tooltip=Comentários onde o utilizador altera o ramo/etiqueta associado à questão
|
||||
comment_type_group_reference=Referência
|
||||
|
@ -882,6 +887,7 @@ repo_and_org_access=Acesso aos repositórios e às organizações
|
|||
permissions_public_only=Apenas público
|
||||
permissions_access_all=Tudo (público, privado e limitado)
|
||||
select_permissions=Escolher permissões
|
||||
permission_not_set=Não definido
|
||||
permission_no_access=Sem acesso
|
||||
permission_read=Lidas
|
||||
permission_write=Leitura e escrita
|
||||
|
@ -1286,6 +1292,7 @@ editor.or=ou
|
|||
editor.cancel_lower=Cancelar
|
||||
editor.commit_signed_changes=Cometer modificações assinadas
|
||||
editor.commit_changes=Cometer modificações
|
||||
editor.add_tmpl=Adicionar '{filename}'
|
||||
editor.add=Adicionar %s
|
||||
editor.update=Modificar %s
|
||||
editor.delete=Eliminar %s
|
||||
|
@ -2092,6 +2099,7 @@ settings.advanced_settings=Configurações avançadas
|
|||
settings.wiki_desc=Habilitar wiki do repositório
|
||||
settings.use_internal_wiki=Usar o wiki nativo
|
||||
settings.default_wiki_branch_name=Nome do ramo predefinido do wiki
|
||||
settings.default_wiki_everyone_access=Permissão de acesso predefinida para utilizadores registados:
|
||||
settings.failed_to_change_default_wiki_branch=Falhou ao mudar o nome do ramo predefinido do wiki.
|
||||
settings.use_external_wiki=Usar um wiki externo
|
||||
settings.external_wiki_url=URL do wiki externo
|
||||
|
@ -3083,12 +3091,14 @@ auths.tips=Dicas
|
|||
auths.tips.oauth2.general=Autenticação OAuth2
|
||||
auths.tips.oauth2.general.tip=Ao registar uma nova autenticação OAuth2, o URL da ligação de retorno ou do reencaminhamento deve ser:
|
||||
auths.tip.oauth2_provider=Fornecedor OAuth2
|
||||
auths.tip.bitbucket=Registe um novo consumidor de OAuth em https://bitbucket.org/account/user/{your-username}/oauth-consumers/new e adicione a permissão 'Account' - 'Read'
|
||||
auths.tip.nextcloud=`Registe um novo consumidor OAuth na sua instância usando o seguinte menu "Configurações → Segurança → Cliente OAuth 2.0"`
|
||||
auths.tip.dropbox=Crie uma nova aplicação em https://www.dropbox.com/developers/apps
|
||||
auths.tip.facebook=`Registe uma nova aplicação em https://developers.facebook.com/apps e adicione o produto "Facebook Login"`
|
||||
auths.tip.github=Registe uma nova aplicação OAuth em https://github.com/settings/applications/new
|
||||
auths.tip.gitlab_new=Registe uma nova aplicação em https://gitlab.com/-/profile/applications
|
||||
auths.tip.google_plus=Obtenha credenciais de cliente OAuth2 a partir da consola do Google API em https://console.developers.google.com/
|
||||
auths.tip.openid_connect=Use o URL da descoberta de conexão OpenID "https://{server}/.well-known/openid-configuration" para especificar os extremos
|
||||
auths.tip.twitter=`Vá a https://dev.twitter.com/apps, crie uma aplicação e certifique-se de que está habilitada a opção "Allow this application to be used to Sign in with Twitter"`
|
||||
auths.tip.discord=Registe uma nova aplicação em https://discordapp.com/developers/applications/me
|
||||
auths.tip.gitea=Registe uma nova aplicação OAuth2. O guia pode ser encontrado em https://docs.gitea.com/development/oauth2-provider
|
||||
|
|
|
@ -25,6 +25,7 @@ enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir.
|
|||
toc=İçindekiler Tablosu
|
||||
licenses=Lisanslar
|
||||
return_to_gitea=Gitea'ya Dön
|
||||
more_items=Daha fazla öğe
|
||||
|
||||
username=Kullanıcı Adı
|
||||
email=E-posta Adresi
|
||||
|
@ -113,6 +114,7 @@ loading=Yükleniyor…
|
|||
error=Hata
|
||||
error404=Ulaşmaya çalıştığınız sayfa <strong>mevcut değil</strong> veya <strong>görüntüleme yetkiniz yok</strong>.
|
||||
go_back=Geri Git
|
||||
invalid_data=Geçersiz veri: %v
|
||||
|
||||
never=Asla
|
||||
unknown=Bilinmiyor
|
||||
|
@ -123,6 +125,7 @@ pin=Sabitle
|
|||
unpin=Sabitlemeyi kaldır
|
||||
|
||||
artifacts=Yapılar
|
||||
confirm_delete_artifact=%s yapısını silmek istediğinizden emin misiniz?
|
||||
|
||||
archived=Arşivlenmiş
|
||||
|
||||
|
@ -142,13 +145,43 @@ name=İsim
|
|||
value=Değer
|
||||
|
||||
filter=Filtre
|
||||
filter.clear=Filtreyi Temizle
|
||||
filter.is_archived=Arşivlenmiş
|
||||
filter.not_archived=Arşivlenmemiş
|
||||
filter.is_fork=Çatallanmış
|
||||
filter.not_fork=Çatallanmamış
|
||||
filter.is_mirror=Yansılanmış
|
||||
filter.not_mirror=Yansılanmamış
|
||||
filter.is_template=Şablon
|
||||
filter.not_template=Şablon değil
|
||||
filter.public=Genel
|
||||
filter.private=Özel
|
||||
|
||||
no_results_found=Sonuç bulunamadı.
|
||||
|
||||
[search]
|
||||
search=Ara...
|
||||
type_tooltip=Arama türü
|
||||
fuzzy=Bulanık
|
||||
fuzzy_tooltip=Arama terimine benzeyen sonuçları da içer
|
||||
exact=Tam
|
||||
exact_tooltip=Sadece arama terimiyle tamamen eşleşen sonuçları içer
|
||||
repo_kind=Depoları ara...
|
||||
user_kind=Kullanıcıları ara...
|
||||
org_kind=Organizasyonları ara...
|
||||
team_kind=Takımları ara...
|
||||
code_kind=Kod ara...
|
||||
code_search_unavailable=Kod arama şu an mevcut değil. Lütfen site yöneticisiyle iletişime geçin.
|
||||
code_search_by_git_grep=Mevcut kod arama sonuçları "git grep" ile sağlanıyor. Eğer yönetici Depo Dizinleyici'yi etkinleştirirse daha iyi sonuçlar çıkabilir.
|
||||
package_kind=Paketleri ara...
|
||||
project_kind=Projeleri ara...
|
||||
branch_kind=Dalları ara...
|
||||
commit_kind=İşlemeleri ara...
|
||||
runner_kind=Çalıştırıcıları ara...
|
||||
no_results=Eşleşen sonuç bulunamadı.
|
||||
issue_kind=Konuları ara...
|
||||
pull_kind=Değişiklikleri ara...
|
||||
keyword_search_unavailable=Anahtar kelime ile arama şu an mevcut değil. Lütfen site yöneticinizle iletişime geçin.
|
||||
|
||||
[aria]
|
||||
navbar=Gezinti Çubuğu
|
||||
|
@ -255,6 +288,7 @@ email_title=E-posta Ayarları
|
|||
smtp_addr=SMTP Sunucusu
|
||||
smtp_port=SMTP Portu
|
||||
smtp_from=E-posta Gönderen
|
||||
smtp_from_invalid=`"E-posta Olarak Gönder" adresi geçersiz`
|
||||
smtp_from_helper=Gitea'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" <eposta@ornek.com> biçimini kullanın.
|
||||
mailer_user=SMTP Kullanıcı Adı
|
||||
mailer_password=SMTP Parolası
|
||||
|
@ -314,6 +348,7 @@ env_config_keys=Ortam Yapılandırma
|
|||
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
|
||||
|
||||
[home]
|
||||
nav_menu=Gezinti Menüsü
|
||||
uname_holder=Kullanıcı Adı veya E-Posta Adresi
|
||||
password_holder=Parola
|
||||
switch_dashboard_context=Panoya Geçiş Yap
|
||||
|
@ -362,6 +397,7 @@ forgot_password_title=Şifremi unuttum
|
|||
forgot_password=Şifrenizi mi unuttunuz?
|
||||
sign_up_now=Bir hesaba mı ihtiyacınız var? Hemen kaydolun.
|
||||
sign_up_successful=Hesap başarılı bir şekilde oluşturuldu. Hoşgeldiniz!
|
||||
confirmation_mail_sent_prompt_ex=Yeni bir doğrulama e-postası <b>%s</b> adresine gönderildi. Lütfen kayıt sürecini tamamlamak için %s içinde gelen kutunuzu denetleyin. Eğer kayıt e-posta adresiniz hatalı ise, tekrar oturum açıp değiştirebilirsiniz.
|
||||
must_change_password=Parolanızı güncelleyin
|
||||
allow_password_change=Kullanıcıyı parola değiştirmeye zorla (önerilen)
|
||||
reset_password_mail_sent_prompt=<b>%s</b> adresine bir onay e-postası gönderildi. Hesap kurtarma işlemini tamamlamak için lütfen gelen kutunuzu sonraki %s içinde kontrol edin.
|
||||
|
@ -371,6 +407,7 @@ prohibit_login=Oturum Açma Yasağı
|
|||
prohibit_login_desc=Hesabınız ile oturum açmanız yasaklanmış, lütfen site yöneticinizle iletişime geçin.
|
||||
resent_limit_prompt=Zaten bir etkinleştirme e-postası talep ettiniz. Lütfen 3 dakika bekleyip tekrar deneyin.
|
||||
has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (<b>%s</b>). Bir doğrulama e-postası almadıysanız ya da yenisine ihtiyacınız varsa lütfen aşağıdaki düğmeye tıklayın.
|
||||
change_unconfirmed_mail_address=Eğer kayıt e-posta adresiniz hatalı ise, burada değiştirebilir ve yeni bir doğrulama e-postası gönderebilirsiniz.
|
||||
resend_mail=Etkinleştirme e-postasını tekrar almak için buraya tıklayın
|
||||
email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir.
|
||||
send_reset_mail=Hesap Kurtarma E-postası Gönder
|
||||
|
@ -418,6 +455,7 @@ authorization_failed_desc=Geçersiz bir istek tespit ettiğimiz için yetkilendi
|
|||
sspi_auth_failed=SSPI kimlik doğrulaması başarısız oldu
|
||||
password_pwned=Seçtiğiniz parola, daha önce herkese açık veri ihlallerinde açığa çıkan bir <a target="_blank" rel="noopener noreferrer" href="https://haveibeenpwned.com/Passwords">çalınan parola listesindedir</a>. Lütfen farklı bir parola ile tekrar deneyin ve başka yerlerde de bu parolayı değiştirmeyi düşünün.
|
||||
password_pwned_err=HaveIBeenPwned'e yapılan istek tamamlanamadı
|
||||
last_admin=Son yöneticiyi silemezsiniz. En azından bir yönetici olmalıdır.
|
||||
|
||||
[mail]
|
||||
view_it_on=%s üzerinde görüntüle
|
||||
|
@ -550,6 +588,7 @@ team_name_been_taken=Takım adı zaten alınmış.
|
|||
team_no_units_error=En az bir depo bölümüne erişimine izin ver.
|
||||
email_been_used=E-posta adresi zaten kullanılıyor.
|
||||
email_invalid=E-posta adresi geçersiz.
|
||||
email_domain_is_not_allowed=Kullanıcı e-posta adresi <b>%s</b> alan adı EMAIL_DOMAIN_ALLOWLIST veya EMAIL_DOMAIN_BLOCKLIST ile çelişiyor. Lütfen işleminizin beklendiğinden emin olun.
|
||||
openid_been_used=OpenID adresi "%s" zaten kullanılıyor.
|
||||
username_password_incorrect=Kullanıcı adı veya parola hatalı.
|
||||
password_complexity=Parola, karmaşıklık gereksinimlerini karşılamıyor:
|
||||
|
@ -561,6 +600,8 @@ enterred_invalid_repo_name=Girdiğiniz depo adı hatalı.
|
|||
enterred_invalid_org_name=Girdiğiniz organizsyon adı hatalı.
|
||||
enterred_invalid_owner_name=Yeni sahip ismi hatalı.
|
||||
enterred_invalid_password=Girdiğiniz parola hatalı.
|
||||
unset_password=Oturum açma kullanıcısı parola belirlemedi.
|
||||
unsupported_login_type=Oturum açma türü hesap silmeyi desteklemiyor.
|
||||
user_not_exist=Böyle bir kullanıcı yok.
|
||||
team_not_exist=Böyle bir takım bulunmuyor.
|
||||
last_org_owner=Son kullanıcıyı 'sahipler' takımından çıkaramazsınız. Bir organizasyonun en az bir sahibi olmalıdır.
|
||||
|
@ -583,6 +624,7 @@ org_still_own_packages=Bu organizasyon hala bir veya daha fazla pakete sahip, ö
|
|||
|
||||
target_branch_not_exist=Hedef dal mevcut değil.
|
||||
|
||||
admin_cannot_delete_self=Yöneticiyken kendinizi silemezsiniz. Lütfen önce yönetici haklarınızı kaldırın.
|
||||
|
||||
[user]
|
||||
change_avatar=Profil resmini değiştir…
|
||||
|
@ -609,6 +651,29 @@ form.name_reserved=`"%s" kullanıcı adı rezerve edilmiş.`
|
|||
form.name_pattern_not_allowed=Kullanıcı adında "%s" deseni kullanılamaz.
|
||||
form.name_chars_not_allowed=`"%s" kullanıcı adı geçersiz karakterler içeriyor.`
|
||||
|
||||
block.block=Engelle
|
||||
block.block.user=Kullanıcıyı engelle
|
||||
block.block.org=Kullanıcıyı organizasyonda engelle
|
||||
block.block.failure=Kullanıcı engellenemedi: %s
|
||||
block.unblock=Engeli kaldır
|
||||
block.unblock.failure=Kullanıcının engeli kaldırılamadı: %s
|
||||
block.blocked=Bu kullanıcıyı engelledin.
|
||||
block.title=Bir kullanıcı engelle
|
||||
block.info=Bir kullanıcıyı engellemek depoarla, değişiklik isteği veya konu açmak veya yorumlamak gibi, etkileşim kurmasını önler. Bir kullanıcı engelleme hakkında daha fazlasını öğrenin.
|
||||
block.info_1=Bir kullanıcıyı engellemek, hesabınızda ve depolarınızda şu eylemleri önler:
|
||||
block.info_2=hesabınızı takip etmek
|
||||
block.info_3=kullanıcı adınızdan @bahsederek size bildirim göndermek
|
||||
block.info_4=kendi depolarına sizi katkıcı olarak davet etmek
|
||||
block.info_5=depolara yıldız koymak, çatallamak veya izlemek
|
||||
block.info_6=konu veya değişiklik isteği açmak ve yorum eklemek
|
||||
block.info_7=konularda veya değişiklik isteklerinde yorumlarınıza tepki vermek
|
||||
block.user_to_block=Engellenecek kullanıcı
|
||||
block.note=Not
|
||||
block.note.title=İsteğe bağlı not:
|
||||
block.note.info=Not engellenen kullanıcıya gösterilmez.
|
||||
block.note.edit=Notu düzenle
|
||||
block.list=Engellenmiş kullanıcılar
|
||||
block.list.none=Engellediğiniz kullanıcı yok.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
|
@ -651,6 +716,7 @@ cancel=İptal
|
|||
language=Dil
|
||||
ui=Tema
|
||||
hidden_comment_types=Gizli yorum türleri
|
||||
hidden_comment_types_description=Burada işaretlenen yorum türleri konu sayfalarında görüntülenmeyecektir. Örneğin "Etiket" seçildiğinde tüm "{user}, {label} ekledi/çıkardı" yorumları kalkacaktır.
|
||||
hidden_comment_types.ref_tooltip=Bu konuya başka konu/işlem tarafından değinilen yorumlar…
|
||||
hidden_comment_types.issue_ref_tooltip=Kullanıcının konuyla ilişkili dalı/etiketi değiştirdiği yorumlar
|
||||
comment_type_group_reference=Referans
|
||||
|
@ -821,6 +887,7 @@ repo_and_org_access=Depo ve Organizasyon Erişimi
|
|||
permissions_public_only=Yalnızca herkese açık
|
||||
permissions_access_all=Tümü (herkese açık, özel ve sınırlı)
|
||||
select_permissions=İzinleri seçin
|
||||
permission_not_set=Ayarlanmadı
|
||||
permission_no_access=Erişim Yok
|
||||
permission_read=Okunmuş
|
||||
permission_write=Okuma ve Yazma
|
||||
|
@ -945,7 +1012,9 @@ fork_visibility_helper=Çatallanmış bir deponun görünürlüğü değiştiril
|
|||
fork_branch=Çatala klonlanacak dal
|
||||
all_branches=Tüm dallar
|
||||
fork_no_valid_owners=Geçerli bir sahibi olmadığı için bu depo çatallanamaz.
|
||||
fork.blocked_user=Depo çatallanamıyor, depo sahibi tarafından engellenmişsiniz.
|
||||
use_template=Bu şablonu kullan
|
||||
open_with_editor=%s ile aç
|
||||
download_zip=ZIP indir
|
||||
download_tar=TAR.GZ indir
|
||||
download_bundle=BUNDLE indir
|
||||
|
@ -961,6 +1030,8 @@ issue_labels_helper=Bir konu etiket seti seçin.
|
|||
license=Lisans
|
||||
license_helper=Bir lisans dosyası seçin.
|
||||
license_helper_desc=Bir lisans, başkalarının kodunuzla neler yapıp yapamayacağını yönetir. Projeniz için hangisinin doğru olduğundan emin değil misiniz? <a target="_blank" rel="noopener noreferrer" href="%s">Lisans seçme</a> konusuna bakın
|
||||
object_format=Nesne Biçimi
|
||||
object_format_helper=Deponun nesne biçimi. Daha sonra değiştirilemez. SHA1 en uyumlu olandır.
|
||||
readme=README
|
||||
readme_helper=Bir README dosyası şablonu seçin.
|
||||
readme_helper_desc=Projeniz için eksiksiz bir açıklama yazabileceğiniz yer burasıdır.
|
||||
|
@ -978,6 +1049,7 @@ mirror_prune=Buda
|
|||
mirror_prune_desc=Kullanılmayan uzak depoları izleyen referansları kaldır
|
||||
mirror_interval=Yansı Aralığı (geçerli zaman birimleri 'h', 'm', 's'). Periyodik senkronizasyonu devre dışı bırakmak için 0 kullanın. (Asgari aralık: %s)
|
||||
mirror_interval_invalid=Yansı süre aralığı geçerli değil.
|
||||
mirror_sync=eşitlendi
|
||||
mirror_sync_on_commit=İşlemeler gönderildiğinde senkronize et
|
||||
mirror_address=URL'den Klonla
|
||||
mirror_address_desc=Yetkilendirme bölümüne gerekli tüm kimlik bilgilerini girin.
|
||||
|
@ -995,6 +1067,7 @@ watchers=İzleyenler
|
|||
stargazers=Yıldızlayanlar
|
||||
stars_remove_warning=Bu depodan tüm yıldızları kaldıracaktır.
|
||||
forks=Çatallamalar
|
||||
stars=Yıldızlar
|
||||
reactions_more=ve %d daha fazla
|
||||
unit_disabled=Site yöneticisi bu depo bölümünü devre dışı bıraktı.
|
||||
language_other=Diğer
|
||||
|
@ -1028,6 +1101,7 @@ desc.public=Genel
|
|||
desc.template=Şablon
|
||||
desc.internal=Dahili
|
||||
desc.archived=Arşivlenmiş
|
||||
desc.sha256=SHA256
|
||||
|
||||
template.items=Şablon Öğeleri
|
||||
template.git_content=Git İçeriği (Varsayılan Dal)
|
||||
|
@ -1115,6 +1189,7 @@ watch=İzle
|
|||
unstar=Yıldızı Kaldır
|
||||
star=Yıldızla
|
||||
fork=Çatalla
|
||||
action.blocked_user=İşlem gerçekleştirilemiyor, depo sahibi tarafından engellenmişsiniz.
|
||||
download_archive=Depoyu İndir
|
||||
more_operations=Daha Fazla İşlem
|
||||
|
||||
|
@ -1161,6 +1236,8 @@ file_view_rendered=Oluşturulanları Görüntüle
|
|||
file_view_raw=Ham Görünüm
|
||||
file_permalink=Kalıcı Bağlantı
|
||||
file_too_large=Bu dosya görüntülemek için çok büyük.
|
||||
code_preview_line_from_to=%[3]s içinde %[1]d ve %[2]d arasındaki satırlar
|
||||
code_preview_line_in=%[2]s içinde %[1]d satırı
|
||||
invisible_runes_header=`Bu dosya görünmez Evrensel Kodlu karakter içeriyor`
|
||||
invisible_runes_description=`Bu dosya, insanlar tarafından ayırt edilemeyen ama bir bilgisayar tarafından farklı bir şekilde işlenebilecek görünmez evrensel kodlu karakter içeriyor. Eğer bunu kasıtlı olarak yaptıysanız bu uyarıyı yok sayabilirsiniz. Gizli karakterleri göstermek için Kaçış Karakterli düğmesine tıklayın.`
|
||||
ambiguous_runes_header=`Bu dosya muğlak Evrensel Kodlu karakter içeriyor`
|
||||
|
@ -1178,6 +1255,8 @@ audio_not_supported_in_browser=Tarayıcınız HTML5 'audio' etiketini desteklemi
|
|||
stored_lfs=Git LFS ile depolandı
|
||||
symbolic_link=Sembolik Bağlantı
|
||||
executable_file=Çalıştırılabilir Dosya
|
||||
vendored=Sağlanmış
|
||||
generated=Üretilmiş
|
||||
commit_graph=İşleme Grafiği
|
||||
commit_graph.select=Dalları seç
|
||||
commit_graph.hide_pr_refs=Değişiklik İsteklerini Gizle
|
||||
|
@ -1213,6 +1292,7 @@ editor.or=veya
|
|||
editor.cancel_lower=İptal
|
||||
editor.commit_signed_changes=İmzalı Değişiklikleri İşle
|
||||
editor.commit_changes=Değişiklikleri Uygula
|
||||
editor.add_tmpl='{filename}' ekle
|
||||
editor.add=%s Ekle
|
||||
editor.update=%s Güncelle
|
||||
editor.delete=%s Sil
|
||||
|
@ -1240,6 +1320,8 @@ editor.file_editing_no_longer_exists=Düzenlenmekte olan "%s" dosyası artık bu
|
|||
editor.file_deleting_no_longer_exists=Silinen "%s" dosyası artık bu depoda yer almıyor.
|
||||
editor.file_changed_while_editing=Düzenlemeye başladığınızdan beri dosya içeriği değişti. Görmek için <a target="_blank" rel="noopener noreferrer" href="%s">burayı tıklayın</a> veya üzerine yazmak için <strong>değişiklikleri yine de işleyin</strong>.
|
||||
editor.file_already_exists=Bu depoda "%s" isimli bir dosya zaten var.
|
||||
editor.commit_id_not_matching=İşleme ID'si, düzenlemeye başladığınız ID ile uyuşmuyor, bir yama dalına işleme yapın ve sonra birleştirin.
|
||||
editor.push_out_of_date=İtme eskimiş.
|
||||
editor.commit_empty_file_header=Boş bir dosya işle
|
||||
editor.commit_empty_file_text=İşlemek üzere olduğunuz dosya boş. Devam edilsin mi?
|
||||
editor.no_changes_to_show=Gösterilecek değişiklik yok.
|
||||
|
@ -1264,6 +1346,7 @@ commits.commits=İşleme
|
|||
commits.no_commits=Ortak bir işleme yok. "%s" ve "%s" tamamen farklı geçmişlere sahip.
|
||||
commits.nothing_to_compare=Bu dallar eşit.
|
||||
commits.search.tooltip=Anahtar kelimeleri "author:", "committer:", "after:" veya "before:" ile kullanabilirsiniz, örneğin "revert author:Alice before:2019-01-13".
|
||||
commits.search_branch=Bu Dal
|
||||
commits.search_all=Tüm Dallar
|
||||
commits.author=Yazar
|
||||
commits.message=Mesaj
|
||||
|
@ -1322,6 +1405,7 @@ projects.column.new=Yeni Sütun
|
|||
projects.column.set_default=Varsayılanı Ayarla
|
||||
projects.column.set_default_desc=Bu sütunu kategorize edilmemiş konular ve değişiklik istekleri için varsayılan olarak ayarlayın
|
||||
projects.column.delete=Sutün Sil
|
||||
projects.column.deletion_desc=Bir proje sütununun silinmesi, ilgili tüm konuları varsayılan sütuna taşır. Devam edilsin mi?
|
||||
projects.column.color=Renk
|
||||
projects.open=Aç
|
||||
projects.close=Kapat
|
||||
|
@ -1356,6 +1440,8 @@ issues.new.assignees=Atananlar
|
|||
issues.new.clear_assignees=Atamaları Temizle
|
||||
issues.new.no_assignees=Atanan Kişi Yok
|
||||
issues.new.no_reviewers=Değerlendirici yok
|
||||
issues.new.blocked_user=Konu oluşturulamıyor, depo sahibi tarafından engellenmişsiniz.
|
||||
issues.edit.blocked_user=İçerik düzenlenemiyor, gönderen veya depo sahibi tarafından engellenmişsiniz.
|
||||
issues.choose.get_started=Başla
|
||||
issues.choose.open_external_link=Aç
|
||||
issues.choose.blank=Varsayılan
|
||||
|
@ -1470,6 +1556,7 @@ issues.close_comment_issue=Yorum Yap ve Kapat
|
|||
issues.reopen_issue=Yeniden aç
|
||||
issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç
|
||||
issues.create_comment=Yorum yap
|
||||
issues.comment.blocked_user=Yorum oluşturulamıyor veya düzenlenemiyor, gönderen veya depo sahibi tarafından engellenmişsiniz.
|
||||
issues.closed_at=`<a id="%[1]s" href="#%[1]s">%[2]s</a> konusunu kapattı`
|
||||
issues.reopened_at=`<a id="%[1]s" href="#%[1]s">%[2]s</a> konusunu yeniden açtı`
|
||||
issues.commit_ref_at=`<a id="%[1]s" href="#%[1]s">%[2]s</a> işlemesinde bu konuyu işaret etti`
|
||||
|
@ -1668,6 +1755,7 @@ compare.compare_head=karşılaştır
|
|||
|
||||
pulls.desc=Değişiklik isteklerini ve kod incelemelerini etkinleştir.
|
||||
pulls.new=Yeni Değişiklik İsteği
|
||||
pulls.new.blocked_user=Değişiklik isteği oluşturulamıyor, depo sahibi tarafından engellenmişsiniz.
|
||||
pulls.view=Değişiklik İsteği Görüntüle
|
||||
pulls.compare_changes=Yeni Değişiklik İsteği
|
||||
pulls.allow_edits_from_maintainers=Bakımcıların düzenlemelerine izin ver
|
||||
|
@ -1692,6 +1780,7 @@ pulls.select_commit_hold_shift_for_range=İşleme seç. Bir aralık seçmek içi
|
|||
pulls.review_only_possible_for_full_diff=İnceleme sadece tam fark görüntülemede mümkündür
|
||||
pulls.filter_changes_by_commit=İşleme ile süz
|
||||
pulls.nothing_to_compare=Bu dallar eşit. Değişiklik isteği oluşturmaya gerek yok.
|
||||
pulls.nothing_to_compare_have_tag=Seçili dal/etiket aynı.
|
||||
pulls.nothing_to_compare_and_allow_empty_pr=Bu dallar eşittir. Bu Dİ boş olacak.
|
||||
pulls.has_pull_request=`Bu dallar arasında zaten bir değişiklik isteği var: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Değişiklik İsteği Oluştur
|
||||
|
@ -1750,6 +1839,7 @@ pulls.merge_pull_request=Birleştirme işlemi oluştur
|
|||
pulls.rebase_merge_pull_request=Yeniden yapılandır ve ileri sar
|
||||
pulls.rebase_merge_commit_pull_request=Yeniden yapılandır ve birleştirme işlemi oluştur
|
||||
pulls.squash_merge_pull_request=Ezme işlemi oluştur
|
||||
pulls.fast_forward_only_merge_pull_request=Sadece ileri sarma
|
||||
pulls.merge_manually=Elle birleştirildi
|
||||
pulls.merge_commit_id=Birleştirme işlemesi kimliği
|
||||
pulls.require_signed_wont_sign=Dal imzalı işlemeler gerektiriyor, ancak bu birleştirme imzalanmayacak
|
||||
|
@ -1886,6 +1976,10 @@ wiki.page_name_desc=Bu Viki sayfası için bir ad girin. Bazı özel isimler 'Ho
|
|||
wiki.original_git_entry_tooltip=Kolay bağlantı kullanmak yerine özgün Git dosyasını görüntüle.
|
||||
|
||||
activity=Aktivite
|
||||
activity.navbar.pulse=Eğilim
|
||||
activity.navbar.code_frequency=Kod Frekansı
|
||||
activity.navbar.contributors=Katkıda Bulunanlar
|
||||
activity.navbar.recent_commits=Son İşlemeler
|
||||
activity.period.filter_label=Dönem:
|
||||
activity.period.daily=1 gün
|
||||
activity.period.halfweekly=3 gün
|
||||
|
@ -1951,7 +2045,10 @@ activity.git_stats_and_deletions=ve
|
|||
activity.git_stats_deletion_1=%d silme oldu
|
||||
activity.git_stats_deletion_n=%d silme oldu
|
||||
|
||||
contributors.contribution_type.filter_label=Katkı türü:
|
||||
contributors.contribution_type.commits=İşleme
|
||||
contributors.contribution_type.additions=Eklemeler
|
||||
contributors.contribution_type.deletions=Silmeler
|
||||
|
||||
settings=Ayarlar
|
||||
settings.desc=Ayarlar, deponun ayarlarını yönetebileceğiniz yerdir
|
||||
|
@ -1979,6 +2076,7 @@ settings.mirror_settings.docs.doc_link_title=Depoların yansısını nasıl olu
|
|||
settings.mirror_settings.docs.doc_link_pull_section=belgelerin "uzak bir depodan çekmek" bölümü.
|
||||
settings.mirror_settings.docs.pulling_remote_title=Uzak bir depodan çekmek
|
||||
settings.mirror_settings.mirrored_repository=Yansıtılmış depo
|
||||
settings.mirror_settings.pushed_repository=İtilmiş depo
|
||||
settings.mirror_settings.direction=Yön
|
||||
settings.mirror_settings.direction.pull=Çek
|
||||
settings.mirror_settings.direction.push=Gönder
|
||||
|
@ -2000,6 +2098,9 @@ settings.branches.add_new_rule=Yeni Kural Ekle
|
|||
settings.advanced_settings=Gelişmiş Ayarlar
|
||||
settings.wiki_desc=Depo Wiki'sini Etkinkleştir
|
||||
settings.use_internal_wiki=Dahili Wiki Kullan
|
||||
settings.default_wiki_branch_name=Varsayılan Viki Dal Adı
|
||||
settings.default_wiki_everyone_access=Oturum açmış kullanıcılar için Varsayılan Erişim İzinleri:
|
||||
settings.failed_to_change_default_wiki_branch=Varsayılan viki dalı değiştirilemedi.
|
||||
settings.use_external_wiki=Harici Wiki Kullan
|
||||
settings.external_wiki_url=Harici Wiki bağlantısı
|
||||
settings.external_wiki_url_error=Harici wiki URL'si geçerli bir URL değil.
|
||||
|
@ -2030,6 +2131,9 @@ settings.pulls.default_allow_edits_from_maintainers=Bakımcıların düzenlemele
|
|||
settings.releases_desc=Depo Sürümlerini Etkinleştir
|
||||
settings.packages_desc=Depo Paket Kütüğünü Etkinleştir
|
||||
settings.projects_desc=Depo Projelerini Etkinleştir
|
||||
settings.projects_mode_desc=Proje Modu (ne tür projeler görüntülensin)
|
||||
settings.projects_mode_repo=Sadece depo projeleri
|
||||
settings.projects_mode_owner=Sadece kullanıcı veya organizasyon projeleri
|
||||
settings.projects_mode_all=Tüm projeler
|
||||
settings.actions_desc=Depo İşlemlerini Etkinleştir
|
||||
settings.admin_settings=Yönetici Ayarları
|
||||
|
@ -2056,6 +2160,7 @@ settings.convert_fork_succeed=Çatal normal bir depoya dönüştürüldü.
|
|||
settings.transfer=Sahipliği Aktar
|
||||
settings.transfer.rejected=Depo aktarımı reddedildi.
|
||||
settings.transfer.success=Depo aktarımı başarıyla tamamlandı.
|
||||
settings.transfer.blocked_user=Depo transfer edilemiyor, yeni sahibi tarafından engellenmişsiniz.
|
||||
settings.transfer_abort=Aktarımı iptal et
|
||||
settings.transfer_abort_invalid=Var olmayan bir depo aktarımını iptal edemezsiniz.
|
||||
settings.transfer_abort_success=%s tarafına yapılan depo aktarımı başarıyla iptal edildi.
|
||||
|
@ -2101,6 +2206,7 @@ settings.add_collaborator_success=Katkıcı eklendi.
|
|||
settings.add_collaborator_inactive_user=Etkin olmayan bir kullanıcı katkıcı olarak eklenemez.
|
||||
settings.add_collaborator_owner=Bir sahip katkıcı olarak eklenemez.
|
||||
settings.add_collaborator_duplicate=Katkıcı bu depoya zaten eklenmiş.
|
||||
settings.add_collaborator.blocked_user=Katkıcı depo sahibi tarafından engellenmiş veya depo sahibini engellemiş.
|
||||
settings.delete_collaborator=Sil
|
||||
settings.collaborator_deletion=Katkıcıyı Sil
|
||||
settings.collaborator_deletion_desc=Bir katkıcıyı silmek, bu depoya erişimini iptal edecektir. Devam et?
|
||||
|
@ -2285,6 +2391,8 @@ settings.protect_approvals_whitelist_users=Beyaz listedeki incelemeciler:
|
|||
settings.protect_approvals_whitelist_teams=Gözden geçirme için beyaz listedeki takımlar:
|
||||
settings.dismiss_stale_approvals=Eski onayları reddet
|
||||
settings.dismiss_stale_approvals_desc=Değişiklik isteğinin içeriğini değiştiren yeni işlemeler dala itildiğinde, eski onaylar reddedilir.
|
||||
settings.ignore_stale_approvals=Eskimiş onayları yoksay
|
||||
settings.ignore_stale_approvals_desc=Daha eski işlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduğunu belirlerken sayma. Eskimiş incelemeler atıldıysa bu ilgisizdir.
|
||||
settings.require_signed_commits=İmzalı İşleme Gerekli
|
||||
settings.require_signed_commits_desc=Reddetme, onlar imzasızsa veya doğrulanamazsa bu dala gönderir.
|
||||
settings.protect_branch_name_pattern=Korunmuş Dal Adı Deseni
|
||||
|
@ -2340,6 +2448,7 @@ settings.archive.error=Depoyu arşivlemeye çalışırken bir hata oluştu. Daha
|
|||
settings.archive.error_ismirror=Yansılanmış bir depoyu arşivleyemezsiniz.
|
||||
settings.archive.branchsettings_unavailable=Depo arşivlenirse dal ayarları kullanılamaz.
|
||||
settings.archive.tagsettings_unavailable=Depo arşivlenmişse etiket ayarları kullanılamaz.
|
||||
settings.archive.mirrors_unavailable=Depo arşivlenmişse yansılar kullanılamaz.
|
||||
settings.unarchive.button=Depoyu Arşivden Çıkar
|
||||
settings.unarchive.header=Bu Depoyu Arşivden Çıkar
|
||||
settings.unarchive.text=Depoyu arşivden çıkarmak, yeni sorunların ve değişiklik isteklerinin yanı sıra işleme ve itme yeteneğini de geri kazandıracaktır.
|
||||
|
@ -2536,8 +2645,16 @@ find_file.no_matching=Eşleşen dosya bulunamadı
|
|||
error.csv.too_large=Bu dosya çok büyük olduğu için işlenemiyor.
|
||||
error.csv.unexpected=%d satırı ve %d sütununda beklenmeyen bir karakter içerdiğinden bu dosya işlenemiyor.
|
||||
error.csv.invalid_field_count=%d satırında yanlış sayıda alan olduğundan bu dosya işlenemiyor.
|
||||
error.broken_git_hook=Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen <a target="_blank" rel="noreferrer" href="%s">belgelere</a> bakın, daha sonra durumu yenilemek için bazı işlemeler itin.
|
||||
|
||||
[graphs]
|
||||
component_loading=%s yükleniyor...
|
||||
component_loading_failed=%s yüklenemedi
|
||||
component_loading_info=Bu biraz sürebilir…
|
||||
component_failed_to_load=Beklenmedik bir hata oluştu.
|
||||
code_frequency.what=kod frekansı
|
||||
contributors.what=katkılar
|
||||
recent_commits.what=son işlemeler
|
||||
|
||||
[org]
|
||||
org_name_holder=Organizasyon Adı
|
||||
|
@ -2651,6 +2768,7 @@ teams.add_nonexistent_repo=Eklemeye çalıştığınz depo mevcut değil. Lütfe
|
|||
teams.add_duplicate_users=Kullanıcı zaten takımın üyesi.
|
||||
teams.repos.none=Bu takım tarafından hiçbir depoya erişilemedi.
|
||||
teams.members.none=Bu takımda üye yok.
|
||||
teams.members.blocked_user=Kullanıcı eklenemiyor, çünkü organizasyon tarafından engellenmiş.
|
||||
teams.specific_repositories=Belirli depolar
|
||||
teams.specific_repositories_helper=Üyeler, yalnızca takıma açıkça eklenen depolara erişebilir. Bunu seçmek, <i>Tüm depolarla</i> zaten eklenmiş olan depoları otomatik olarak <strong>kaldırmaz</strong>.
|
||||
teams.all_repositories=Tüm depolar
|
||||
|
@ -2663,7 +2781,9 @@ teams.invite.by=%s tarafından davet edildi
|
|||
teams.invite.description=Takıma katılmak için aşağıdaki düğmeye tıklayın.
|
||||
|
||||
[admin]
|
||||
maintenance=Bakım
|
||||
dashboard=Pano
|
||||
self_check=Öz Denetim
|
||||
identity_access=Kimlik ve Erişim
|
||||
users=Kullanıcı Hesapları
|
||||
organizations=Organizasyonlar
|
||||
|
@ -2685,6 +2805,7 @@ settings=Yönetici Ayarları
|
|||
|
||||
dashboard.new_version_hint=Gitea %s şimdi hazır, %s çalıştırıyorsunuz. Ayrıntılar için <a target="_blank" rel="noreferrer" href="https://blog.gitea.io">blog</a>'a bakabilirsiniz.
|
||||
dashboard.statistic=Özet
|
||||
dashboard.maintenance_operations=Bakım İşlemleri
|
||||
dashboard.system_status=Sistem Durumu
|
||||
dashboard.operation_name=İşlem Adı
|
||||
dashboard.operation_switch=Geç
|
||||
|
@ -2710,6 +2831,7 @@ dashboard.delete_missing_repos=Git dosyaları eksik olan tüm depoları sil
|
|||
dashboard.delete_missing_repos.started=Git dosyaları eksik olan tüm depoları silme görevi başladı.
|
||||
dashboard.delete_generated_repository_avatars=Oluşturulan depo resimlerini sil
|
||||
dashboard.sync_repo_branches=Eşzamanlama git verisinden veritabanlarına dalları kaçırdı
|
||||
dashboard.sync_repo_tags=Etiketleri git verisinden veritabanına eşitle
|
||||
dashboard.update_mirrors=Yansıları Güncelle
|
||||
dashboard.repo_health_check=Tüm depoların sağlığını denetle
|
||||
dashboard.check_repo_stats=Tüm depo istatistiklerini denetle
|
||||
|
@ -2764,6 +2886,7 @@ dashboard.stop_endless_tasks=Daimi görevleri durdur
|
|||
dashboard.cancel_abandoned_jobs=Terkedilmiş görevleri iptal et
|
||||
dashboard.start_schedule_tasks=Zamanlanmış görevleri başlat
|
||||
dashboard.sync_branch.started=Dal Eşzamanlaması başladı
|
||||
dashboard.sync_tag.started=Etiket eşitlemesi başladı
|
||||
dashboard.rebuild_issue_indexer=Konu indeksini yeniden oluştur
|
||||
|
||||
users.user_manage_panel=Kullanıcı Hesap Yönetimi
|
||||
|
@ -2968,11 +3091,14 @@ auths.tips=İpuçları
|
|||
auths.tips.oauth2.general=OAuth2 Kimlik Doğrulama
|
||||
auths.tips.oauth2.general.tip=Yeni bir OAuth2 kimlik doğrulama kaydederken, geri çağırma/yönlendirme URL'si şu olmalıdır:
|
||||
auths.tip.oauth2_provider=OAuth2 Sağlayıcısı
|
||||
auths.tip.bitbucket=https://bitbucket.org/account/user/{your-username}/oauth-consumers/new sayfasında yeni bir OAuth tüketicisi kaydedin ve 'Hesap' - 'Oku' iznini ekleyin
|
||||
auths.tip.nextcloud=Aşağıdaki "Ayarlar -> Güvenlik -> OAuth 2.0 istemcisi" menüsünü kullanarak örneğinize yeni bir OAuth tüketicisi kaydedin
|
||||
auths.tip.dropbox=https://www.dropbox.com/developers/apps adresinde yeni bir uygulama oluştur
|
||||
auths.tip.facebook=https://developers.facebook.com/apps adresinde yeni bir uygulama kaydedin ve "Facebook Giriş" ürününü ekleyin
|
||||
auths.tip.github=https://github.com/settings/applications/new adresinde yeni bir OAuth uygulaması kaydedin
|
||||
auths.tip.gitlab_new=https://gitlab.com/-/profile/applications adresinde yeni bir uygulama kaydedin
|
||||
auths.tip.google_plus=OAuth2 istemci kimlik bilgilerini https://console.developers.google.com/ adresindeki Google API konsolundan edinin
|
||||
auths.tip.openid_connect=Bitiş noktalarını belirlemek için OpenID Connect Discovery URL'sini (https://{server}/.well-known/openid-configuration) kullanın
|
||||
auths.tip.twitter=https://dev.twitter.com/apps adresine gidin, bir uygulama oluşturun ve “Bu uygulamanın Twitter ile oturum açmak için kullanılmasına izin ver” seçeneğinin etkin olduğundan emin olun
|
||||
auths.tip.discord=https://discordapp.com/developers/applications/me adresinde yeni bir uygulama kaydedin
|
||||
auths.tip.gitea=Yeni bir OAuth2 uygulaması kaydedin. Rehber https://docs.gitea.com/development/oauth2-provider adresinde bulunabilir
|
||||
|
@ -3106,6 +3232,7 @@ config.picture_config=Resim ve Avatar Yapılandırması
|
|||
config.picture_service=Resim Servisi
|
||||
config.disable_gravatar=Gravatar Hizmet Dışı
|
||||
config.enable_federated_avatar=Birleştirilmiş Avatarları Etkinleştir
|
||||
config.open_with_editor_app_help=Klon menüsü için "Birlikte aç" düzenleyicileri. Boş bırakılırsa, varsayılan kullanılacaktır. Varsayılanı görmek için genişletin.
|
||||
|
||||
config.git_config=Git Yapılandırması
|
||||
config.git_disable_diff_highlight=Değişiklik Sözdizimi Vurgusunu Devre Dışı Bırak
|
||||
|
@ -3184,6 +3311,13 @@ notices.desc=Açıklama
|
|||
notices.op=İşlem
|
||||
notices.delete_success=Sistem bildirimleri silindi.
|
||||
|
||||
self_check.no_problem_found=Henüz bir sorun bulunmadı.
|
||||
self_check.startup_warnings=Başlangıç uyarıları:
|
||||
self_check.database_collation_mismatch=Veritabanının şu harmanlamayı kullanmasını bekle: %s
|
||||
self_check.database_collation_case_insensitive=Veritabanı %s harmanlamasını kullanıyor, bu duyarsız bir harmanlamadır. Her ne kadar Gitea bununla çalışabilse de, beklendiği gibi çalışmadığı nadir durumlar ortaya çıkabilir.
|
||||
self_check.database_inconsistent_collation_columns=Veritabanı %s harmanlamasını kullanıyor, ancak bu sütunlar uyumsuz harmanlamalar kullanıyor. Bu beklenmedik sorunlar oluşturabilir.
|
||||
self_check.database_fix_mysql=MySQL/MariaDB kullanıcıları "gitea doctor convert" komutunu harmanlama sorunlarını çözmek için kullanabilir veya "ALTER ... COLLATE ..." SQL'lerini şahsen çalıştırarak sorunu çözebilirler.
|
||||
self_check.database_fix_mssql=MSSQL kullanıcıları sorunu şu an sadece "ALTER ... COLLATE ..." SQL'lerini şahsen çalıştırarak çözebilirler.
|
||||
|
||||
[action]
|
||||
create_repo=depo <a href="%s">%s</a> oluşturuldu
|
||||
|
@ -3371,6 +3505,7 @@ rpm.distros.suse=SUSE tabanlı dağıtımlarda
|
|||
rpm.install=Paketi kurmak için, aşağıdaki komutu çalıştırın:
|
||||
rpm.repository=Depo Bilgisi
|
||||
rpm.repository.architectures=Mimariler
|
||||
rpm.repository.multiple_groups=Bu paket birçok grupta mevcut.
|
||||
rubygems.install=Paketi gem ile kurmak için, şu komutu çalıştırın:
|
||||
rubygems.install2=veya paketi Gemfile dosyasına ekleyin:
|
||||
rubygems.dependencies.runtime=Çalışma Zamanı Bağımlılıkları
|
||||
|
@ -3497,12 +3632,15 @@ runs.scheduled=Zamanlanmış
|
|||
runs.pushed_by=iten
|
||||
runs.invalid_workflow_helper=İş akışı yapılandırma dosyası geçersiz. Lütfen yapılandırma dosyanızı denetleyin: %s
|
||||
runs.no_matching_online_runner_helper=Şu etiket ile eşleşen çevrimiçi çalıştırıcı bulunamadı: %s
|
||||
runs.no_job_without_needs=İş akışı en azından bağımlılığı olmayan bir görev içermelidir.
|
||||
runs.actor=Aktör
|
||||
runs.status=Durum
|
||||
runs.actors_no_select=Tüm aktörler
|
||||
runs.status_no_select=Tüm durumlar
|
||||
runs.no_results=Eşleşen sonuç yok.
|
||||
runs.no_workflows=Henüz hiç bir iş akışı yok.
|
||||
runs.no_workflows.quick_start=Gitea İşlemlerini nasıl başlatacağınızı bilmiyor musunuz? <a target="_blank" rel="noopener noreferrer" href="%s">Hızlı başlangıç kılavuzuna</a> bakabilirsiniz.
|
||||
runs.no_workflows.documentation=Gitea İşlemleri hakkında daha fazla bilgi için, <a target="_blank" rel="noopener noreferrer" href="%s">belgelere</a> bakabilirsiniz.
|
||||
runs.no_runs=İş akışı henüz hiç çalıştırılmadı.
|
||||
runs.empty_commit_message=(boş işleme iletisi)
|
||||
|
||||
|
@ -3521,6 +3659,7 @@ variables.none=Henüz hiçbir değişken yok.
|
|||
variables.deletion=Değişkeni kaldır
|
||||
variables.deletion.description=Bir değişkeni kaldırma kalıcıdır ve geri alınamaz. Devam edilsin mi?
|
||||
variables.description=Değişkenler belirli işlemlere aktarılacaktır, bunun dışında okunamaz.
|
||||
variables.id_not_exist=%d kimlikli değişken mevcut değil.
|
||||
variables.edit=Değişkeni Düzenle
|
||||
variables.deletion.failed=Değişken kaldırılamadı.
|
||||
variables.deletion.success=Değişken kaldırıldı.
|
||||
|
|
|
@ -164,6 +164,8 @@ search=搜索...
|
|||
type_tooltip=搜索类型
|
||||
fuzzy=模糊
|
||||
fuzzy_tooltip=包含近似匹配搜索词的结果
|
||||
exact=精确
|
||||
exact_tooltip=仅包含精确匹配搜索词的结果
|
||||
repo_kind=搜索仓库...
|
||||
user_kind=搜索用户...
|
||||
org_kind=搜索组织...
|
||||
|
@ -177,6 +179,8 @@ branch_kind=搜索分支...
|
|||
commit_kind=搜索提交记录...
|
||||
runner_kind=搜索runners...
|
||||
no_results=未找到匹配结果
|
||||
issue_kind=搜索工单...
|
||||
pull_kind=搜索合并请求...
|
||||
keyword_search_unavailable=按关键字搜索当前不可用。请联系站点管理员。
|
||||
|
||||
[aria]
|
||||
|
@ -712,6 +716,7 @@ cancel=取消操作
|
|||
language=界面语言
|
||||
ui=主题
|
||||
hidden_comment_types=隐藏的评论类型
|
||||
hidden_comment_types_description=此处选中的注释类型不会显示在问题页面中。比如,勾选”标签“删除所有 "<user> 添加/删除的 <label>" 注释。
|
||||
hidden_comment_types.ref_tooltip=注释此问题在何处被提及过,如另一个问题、代码提交等
|
||||
hidden_comment_types.issue_ref_tooltip=注释用户在何处更改了与此问题相关联的分支/标签
|
||||
comment_type_group_reference=引用
|
||||
|
@ -882,6 +887,7 @@ repo_and_org_access=仓库和组织访问权限
|
|||
permissions_public_only=仅公开
|
||||
permissions_access_all=全部(公开、私有和受限)
|
||||
select_permissions=选择权限
|
||||
permission_not_set=未设置
|
||||
permission_no_access=无访问权限
|
||||
permission_read=可读
|
||||
permission_write=读写
|
||||
|
@ -1286,6 +1292,7 @@ editor.or=或
|
|||
editor.cancel_lower=取消
|
||||
editor.commit_signed_changes=提交已签名的更改
|
||||
editor.commit_changes=提交变更
|
||||
editor.add_tmpl=添加 '{filename}'
|
||||
editor.add=添加 %s
|
||||
editor.update=更新 %s
|
||||
editor.delete=删除 %s
|
||||
|
@ -2092,6 +2099,7 @@ settings.advanced_settings=高级设置
|
|||
settings.wiki_desc=启用仓库百科
|
||||
settings.use_internal_wiki=使用内置百科
|
||||
settings.default_wiki_branch_name=默认百科分支名称
|
||||
settings.default_wiki_everyone_access=登录用户的默认访问权限:
|
||||
settings.failed_to_change_default_wiki_branch=更改百科默认分支失败。
|
||||
settings.use_external_wiki=使用外部百科
|
||||
settings.external_wiki_url=外部 Wiki 链接
|
||||
|
@ -3083,12 +3091,14 @@ auths.tips=帮助提示
|
|||
auths.tips.oauth2.general=OAuth2 认证
|
||||
auths.tips.oauth2.general.tip=当注册新的 OAuth2 身份验证时,回调/重定向 URL 应该是:
|
||||
auths.tip.oauth2_provider=OAuth2 提供程序
|
||||
auths.tip.bitbucket=在 https://bitbucket.org/account/user/{your username}/oauth-consumers/new 注册新的 OAuth 使用者同时添加权限“账号”-“读取”
|
||||
auths.tip.nextcloud=使用下面的菜单“设置(Settings) -> 安全(Security) -> OAuth 2.0 client”在您的实例上注册一个新的 OAuth 客户端。
|
||||
auths.tip.dropbox=在 https://www.dropbox.com/developers/apps 上创建一个新的应用程序
|
||||
auths.tip.facebook=`在 https://developers.facebook.com/apps 注册一个新的应用,并添加产品"Facebook 登录"`
|
||||
auths.tip.github=在 https://github.com/settings/applications/new 注册一个 OAuth 应用程序
|
||||
auths.tip.gitlab_new=在 https://gitlab.com/-/profile/applications 注册一个新的应用
|
||||
auths.tip.google_plus=从谷歌 API 控制台 (https://console.developers.google.com/) 获得 OAuth2 客户端凭据
|
||||
auths.tip.openid_connect=使用 OpenID 连接发现 URL ({server}/.well-known/openid-configuration) 来指定终点
|
||||
auths.tip.twitter=访问 https://dev.twitter.com/apps,创建应用并确保启用了"允许此应用程序用于登录 Twitter"的选项。
|
||||
auths.tip.discord=在 https://discordapp.com/developers/applications/me 上注册新应用程序
|
||||
auths.tip.gitea=注册一个新的 OAuth2 应用程序。可以访问 https://docs.gitea.com/development/oauth2-provider 查看帮助
|
||||
|
|
|
@ -218,7 +218,7 @@ func repoAssignment() func(ctx *context.APIContext) {
|
|||
}
|
||||
}
|
||||
|
||||
if !ctx.Repo.HasAccess() {
|
||||
if !ctx.Repo.Permission.HasAnyUnitAccess() {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
|
@ -412,7 +412,7 @@ func reqRepoReader(unitType unit.Type) func(ctx *context.APIContext) {
|
|||
// reqAnyRepoReader user should have any permission to read repository or permissions of site admin
|
||||
func reqAnyRepoReader() func(ctx *context.APIContext) {
|
||||
return func(ctx *context.APIContext) {
|
||||
if !ctx.Repo.HasAccess() && !ctx.IsUserSiteAdmin() {
|
||||
if !ctx.Repo.Permission.HasAnyUnitAccess() && !ctx.IsUserSiteAdmin() {
|
||||
ctx.Error(http.StatusForbidden, "reqAnyRepoReader", "user should have any permission to read repository or permissions of site admin")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -585,7 +585,7 @@ func GetByID(ctx *context.APIContext) {
|
|||
if err != nil {
|
||||
ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err)
|
||||
return
|
||||
} else if !permission.HasAccess() {
|
||||
} else if !permission.HasAnyUnitAccess() {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
|
|
|
@ -104,7 +104,7 @@ func Projects(ctx *context.Context) {
|
|||
}
|
||||
|
||||
for _, project := range projects {
|
||||
project.RenderedContent = templates.SanitizeHTML(project.Description) // FIXME: is it right? why not render?
|
||||
project.RenderedContent = templates.RenderMarkdownToHtml(ctx, project.Description)
|
||||
}
|
||||
|
||||
err = shared_user.LoadHeaderCount(ctx)
|
||||
|
@ -372,7 +372,7 @@ func ViewProject(ctx *context.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
project.RenderedContent = templates.SanitizeHTML(project.Description) // FIXME: is it right? why not render?
|
||||
project.RenderedContent = templates.RenderMarkdownToHtml(ctx, project.Description)
|
||||
ctx.Data["LinkedPRs"] = linkedPrsMap
|
||||
ctx.Data["PageIsViewProjects"] = true
|
||||
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
|
||||
|
|
|
@ -82,7 +82,7 @@ func ListPackages(ctx *context.Context) {
|
|||
ctx.ServerError("GetUserRepoPermission", err)
|
||||
return
|
||||
}
|
||||
repositoryAccessMap[pd.Repository.ID] = permission.HasAccess()
|
||||
repositoryAccessMap[pd.Repository.ID] = permission.HasAnyUnitAccess()
|
||||
}
|
||||
|
||||
hasPackages, err := packages_model.HasOwnerPackages(ctx, ctx.ContextUser.ID)
|
||||
|
@ -276,7 +276,7 @@ func ViewPackageVersion(ctx *context.Context) {
|
|||
ctx.ServerError("GetUserRepoPermission", err)
|
||||
return
|
||||
}
|
||||
hasRepositoryAccess = permission.HasAccess()
|
||||
hasRepositoryAccess = permission.HasAnyUnitAccess()
|
||||
}
|
||||
ctx.Data["HasRepositoryAccess"] = hasRepositoryAccess
|
||||
|
||||
|
|
|
@ -48,9 +48,9 @@ import (
|
|||
_ "code.gitea.io/gitea/modules/session" // to registers all internal adapters
|
||||
|
||||
"gitea.com/go-chi/captcha"
|
||||
"github.com/NYTimes/gziphandler"
|
||||
chi_middleware "github.com/go-chi/chi/v5/middleware"
|
||||
"github.com/go-chi/cors"
|
||||
"github.com/klauspost/compress/gzhttp"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
|
@ -241,11 +241,13 @@ func Routes() *web.Route {
|
|||
var mid []any
|
||||
|
||||
if setting.EnableGzip {
|
||||
h, err := gziphandler.GzipHandlerWithOpts(gziphandler.MinSize(GzipMinSize))
|
||||
// random jitter is recommended by: https://pkg.go.dev/github.com/klauspost/compress/gzhttp#readme-breach-mitigation
|
||||
// compression level 6 is the gzip default and a good general tradeoff between speed, CPU usage, and compression
|
||||
wrapper, err := gzhttp.NewWrapper(gzhttp.RandomJitter(32, 0, false), gzhttp.MinSize(GzipMinSize), gzhttp.CompressionLevel(6))
|
||||
if err != nil {
|
||||
log.Fatal("GzipHandlerWithOpts failed: %v", err)
|
||||
log.Fatal("gzhttp.NewWrapper failed: %v", err)
|
||||
}
|
||||
mid = append(mid, h)
|
||||
mid = append(mid, wrapper)
|
||||
}
|
||||
|
||||
if setting.Service.EnableCaptcha {
|
||||
|
@ -258,7 +260,7 @@ func Routes() *web.Route {
|
|||
routes.Get("/metrics", append(mid, Metrics)...)
|
||||
}
|
||||
|
||||
routes.Get("/robots.txt", append(mid, misc.RobotsTxt)...)
|
||||
routes.Methods("GET,HEAD", "/robots.txt", append(mid, misc.RobotsTxt)...)
|
||||
routes.Get("/ssh_info", misc.SSHInfo)
|
||||
routes.Get("/api/healthz", healthcheck.Check)
|
||||
|
||||
|
|
|
@ -78,6 +78,11 @@ func newNotifyInput(repo *repo_model.Repository, doer *user_model.User, event we
|
|||
}
|
||||
}
|
||||
|
||||
func newNotifyInputForSchedules(repo *repo_model.Repository) *notifyInput {
|
||||
// the doer here will be ignored as we force using action user when handling schedules
|
||||
return newNotifyInput(repo, user_model.NewActionsUser(), webhook_module.HookEventSchedule)
|
||||
}
|
||||
|
||||
func (input *notifyInput) WithDoer(doer *user_model.User) *notifyInput {
|
||||
input.Doer = doer
|
||||
return input
|
||||
|
@ -485,7 +490,7 @@ func handleSchedules(
|
|||
RepoID: input.Repo.ID,
|
||||
OwnerID: input.Repo.OwnerID,
|
||||
WorkflowID: dwf.EntryName,
|
||||
TriggerUserID: input.Doer.ID,
|
||||
TriggerUserID: user_model.ActionsUserID,
|
||||
Ref: ref,
|
||||
CommitSHA: commit.ID.String(),
|
||||
Event: input.Event,
|
||||
|
@ -527,7 +532,7 @@ func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository)
|
|||
// We need a notifyInput to call handleSchedules
|
||||
// if repo is a mirror, commit author maybe an external user,
|
||||
// so we use action user as the Doer of the notifyInput
|
||||
notifyInput := newNotifyInput(repo, user_model.NewActionsUser(), webhook_module.HookEventSchedule)
|
||||
notifyInput := newNotifyInputForSchedules(repo)
|
||||
|
||||
return handleSchedules(ctx, scheduleWorkflows, commit, notifyInput, repo.DefaultBranch)
|
||||
}
|
||||
|
|
|
@ -374,8 +374,7 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) {
|
|||
return
|
||||
}
|
||||
|
||||
// Check access.
|
||||
if !ctx.Repo.Permission.HasAccess() {
|
||||
if !ctx.Repo.Permission.HasAnyUnitAccessOrEveryoneAccess() {
|
||||
if ctx.FormString("go-get") == "1" {
|
||||
EarlyResponseForGoGetMeta(ctx)
|
||||
return
|
||||
|
|
|
@ -21,7 +21,7 @@ func ToPackage(ctx context.Context, pd *packages.PackageDescriptor, doer *user_m
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if permission.HasAccess() {
|
||||
if permission.HasAnyUnitAccess() {
|
||||
repo = ToRepo(ctx, pd.Repository, permission)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -374,7 +374,7 @@ func removeRepositoryFromTeam(ctx context.Context, t *organization.Team, repo *r
|
|||
return fmt.Errorf("GetTeamMembers: %w", err)
|
||||
}
|
||||
for _, member := range teamMembers {
|
||||
has, err := access_model.HasAccess(ctx, member.ID, repo)
|
||||
has, err := access_model.HasAnyUnitAccess(ctx, member.ID, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if has {
|
||||
|
|
|
@ -387,7 +387,7 @@ func StartRepositoryTransfer(ctx context.Context, doer, newOwner *user_model.Use
|
|||
}
|
||||
|
||||
// In case the new owner would not have sufficient access to the repo, give access rights for read
|
||||
hasAccess, err := access_model.HasAccess(ctx, newOwner.ID, repo)
|
||||
hasAccess, err := access_model.HasAnyUnitAccess(ctx, newOwner.ID, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -67,13 +67,13 @@ func TestStartRepositoryTransferSetPermission(t *testing.T) {
|
|||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
|
||||
repo.Owner = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
|
||||
|
||||
hasAccess, err := access_model.HasAccess(db.DefaultContext, recipient.ID, repo)
|
||||
hasAccess, err := access_model.HasAnyUnitAccess(db.DefaultContext, recipient.ID, repo)
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, hasAccess)
|
||||
|
||||
assert.NoError(t, StartRepositoryTransfer(db.DefaultContext, doer, recipient, repo, nil))
|
||||
|
||||
hasAccess, err = access_model.HasAccess(db.DefaultContext, recipient.ID, repo)
|
||||
hasAccess, err = access_model.HasAnyUnitAccess(db.DefaultContext, recipient.ID, repo)
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, hasAccess)
|
||||
|
||||
|
|
|
@ -4,11 +4,12 @@
|
|||
<title>Links for {{.PackageDescriptor.Package.Name}}</title>
|
||||
</head>
|
||||
<body>
|
||||
{{- /* PEP 503 – Simple Repository API: https://peps.python.org/pep-0503/ */ -}}
|
||||
<h1>Links for {{.PackageDescriptor.Package.Name}}</h1>
|
||||
{{range .PackageDescriptors}}
|
||||
{{$p := .}}
|
||||
{{$pd := .}}
|
||||
{{range .Files}}
|
||||
<a href="{{$.RegistryURL}}/files/{{$p.Package.LowerName}}/{{$p.Version.Version}}/{{.File.Name}}#sha256-{{.Blob.HashSHA256}}"{{if $p.Metadata.RequiresPython}} data-requires-python="{{$p.Metadata.RequiresPython}}"{{end}}>{{.File.Name}}</a><br>
|
||||
<a href="{{$.RegistryURL}}/files/{{$pd.Package.LowerName}}/{{$pd.Version.Version}}/{{.File.Name}}#sha256={{.Blob.HashSHA256}}"{{if $pd.Metadata.RequiresPython}} data-requires-python="{{$pd.Metadata.RequiresPython}}"{{end}}>{{.File.Name}}</a><br>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</body>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<button name="btn">submit get</button>
|
||||
</form>
|
||||
<form method="post" action="fetch-action-test?k=1" class="form-fetch-action">
|
||||
<div><textarea name="text" rows="3" class="js-quick-submit"></textarea></div>
|
||||
<div><textarea name="text" rows="3"></textarea></div>
|
||||
<div><label><input name="check" type="checkbox"> check</label></div>
|
||||
<div><button name="btn">submit post</button></div>
|
||||
</form>
|
||||
|
|
|
@ -85,32 +85,34 @@
|
|||
{{ctx.AvatarUtils.Avatar .SignedUser 40}}
|
||||
</a>
|
||||
<div class="content">
|
||||
<form class="ui segment form form-fetch-action" id="comment-form" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/comments" method="post">
|
||||
{{template "repo/issue/comment_tab" .}}
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="field footer">
|
||||
<div class="text right">
|
||||
{{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .DisableStatusChange)}}
|
||||
{{if .Issue.IsClosed}}
|
||||
<button id="status-button" class="ui primary basic button" data-status="{{ctx.Locale.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{ctx.Locale.Tr "repo.issues.reopen_comment_issue"}}" name="status" value="reopen">
|
||||
{{ctx.Locale.Tr "repo.issues.reopen_issue"}}
|
||||
</button>
|
||||
{{else}}
|
||||
{{$closeTranslationKey := "repo.issues.close"}}
|
||||
{{if .Issue.IsPull}}
|
||||
{{$closeTranslationKey = "repo.pulls.close"}}
|
||||
<div class="ui segment">
|
||||
<form class="ui form form-fetch-action" id="comment-form" action="{{$.RepoLink}}/issues/{{.Issue.Index}}/comments" method="post">
|
||||
{{template "repo/issue/comment_tab" .}}
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="field footer">
|
||||
<div class="text right">
|
||||
{{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .DisableStatusChange)}}
|
||||
{{if .Issue.IsClosed}}
|
||||
<button id="status-button" class="ui primary basic button" data-status="{{ctx.Locale.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{ctx.Locale.Tr "repo.issues.reopen_comment_issue"}}" name="status" value="reopen">
|
||||
{{ctx.Locale.Tr "repo.issues.reopen_issue"}}
|
||||
</button>
|
||||
{{else}}
|
||||
{{$closeTranslationKey := "repo.issues.close"}}
|
||||
{{if .Issue.IsPull}}
|
||||
{{$closeTranslationKey = "repo.pulls.close"}}
|
||||
{{end}}
|
||||
<button id="status-button" class="ui red basic button" data-status="{{ctx.Locale.Tr $closeTranslationKey}}" data-status-and-comment="{{ctx.Locale.Tr "repo.issues.close_comment_issue"}}" name="status" value="close">
|
||||
{{ctx.Locale.Tr $closeTranslationKey}}
|
||||
</button>
|
||||
{{end}}
|
||||
<button id="status-button" class="ui red basic button" data-status="{{ctx.Locale.Tr $closeTranslationKey}}" data-status-and-comment="{{ctx.Locale.Tr "repo.issues.close_comment_issue"}}" name="status" value="close">
|
||||
{{ctx.Locale.Tr $closeTranslationKey}}
|
||||
</button>
|
||||
{{end}}
|
||||
{{end}}
|
||||
<button class="ui primary button">
|
||||
{{ctx.Locale.Tr "repo.issues.create_comment"}}
|
||||
</button>
|
||||
<button class="ui primary button">
|
||||
{{ctx.Locale.Tr "repo.issues.create_comment"}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{else if .Repository.IsArchived}}
|
||||
|
|
|
@ -5,26 +5,24 @@
|
|||
<div class="content tw-text-left">
|
||||
<form class="ui form form-fetch-action" action="{{printf "%s/issues/new" .Repository.Link}}" method="post">
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="ui segment content">
|
||||
<div class="field">
|
||||
<span class="text"><strong>{{ctx.Locale.Tr "repository"}}</strong></span>
|
||||
<div class="ui search normal selection dropdown issue_reference_repository_search">
|
||||
<div class="default text">{{.Repository.FullName}}</div>
|
||||
<div class="menu"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<span class="text"><strong>{{ctx.Locale.Tr "repo.milestones.title"}}</strong></span>
|
||||
<input name="title" value="" autofocus required maxlength="255" autocomplete="off">
|
||||
</div>
|
||||
<div class="field">
|
||||
<span class="text"><strong>{{ctx.Locale.Tr "repo.issues.reference_issue.body"}}</strong></span>
|
||||
<textarea name="content" class="form-control"></textarea>
|
||||
</div>
|
||||
<div class="text right">
|
||||
<button class="ui primary button">{{ctx.Locale.Tr "repo.issues.create"}}</button>
|
||||
<div class="field">
|
||||
<label><strong>{{ctx.Locale.Tr "repository"}}</strong></label>
|
||||
<div class="ui search selection dropdown issue_reference_repository_search">
|
||||
<div class="default text">{{.Repository.FullName}}</div>
|
||||
<div class="menu"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label><strong>{{ctx.Locale.Tr "repo.milestones.title"}}</strong></label>
|
||||
<input name="title" value="" autofocus required maxlength="255" autocomplete="off">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label><strong>{{ctx.Locale.Tr "repo.issues.reference_issue.body"}}</strong></label>
|
||||
<textarea name="content" class="form-control"></textarea>
|
||||
</div>
|
||||
<div class="text right">
|
||||
<button class="ui primary button">{{ctx.Locale.Tr "repo.issues.create"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -45,7 +45,7 @@ Template Attributes:
|
|||
</div>
|
||||
</markdown-toolbar>
|
||||
<text-expander keys=": @" suffix="">
|
||||
<textarea class="markdown-text-editor js-quick-submit"{{if .TextareaName}} name="{{.TextareaName}}"{{end}}{{if .TextareaPlaceholder}} placeholder="{{.TextareaPlaceholder}}"{{end}}{{if .TextareaAriaLabel}} aria-label="{{.TextareaAriaLabel}}"{{end}}{{if .DisableAutosize}} data-disable-autosize="{{.DisableAutosize}}"{{end}}>{{.TextareaContent}}</textarea>
|
||||
<textarea class="markdown-text-editor"{{if .TextareaName}} name="{{.TextareaName}}"{{end}}{{if .TextareaPlaceholder}} placeholder="{{.TextareaPlaceholder}}"{{end}}{{if .TextareaAriaLabel}} aria-label="{{.TextareaAriaLabel}}"{{end}}{{if .DisableAutosize}} data-disable-autosize="{{.DisableAutosize}}"{{end}}>{{.TextareaContent}}</textarea>
|
||||
</text-expander>
|
||||
<script>
|
||||
if (localStorage?.getItem('markdown-editor-monospace') === 'true') {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{{template "base/head" .}}
|
||||
<div role="main" aria-label="{{.Title}}" class="page-content dashboard feeds">
|
||||
{{template "user/dashboard/navbar" .}}
|
||||
{{template "base/alert" .}}
|
||||
<div class="ui container flex-container">
|
||||
{{template "base/alert" .}}
|
||||
<div class="flex-container-main">
|
||||
{{template "user/heatmap" .}}
|
||||
{{template "user/dashboard/feeds" .}}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
</div>
|
||||
<div class="field {{if .Err_Content}}error{{end}}">
|
||||
<label for="ssh-key-content">{{ctx.Locale.Tr "settings.key_content"}}</label>
|
||||
<textarea id="ssh-key-content" name="content" class="js-quick-submit" placeholder="{{ctx.Locale.Tr "settings.key_content_ssh_placeholder"}}" required>{{.content}}</textarea>
|
||||
<textarea id="ssh-key-content" name="content" placeholder="{{ctx.Locale.Tr "settings.key_content_ssh_placeholder"}}" required>{{.content}}</textarea>
|
||||
</div>
|
||||
<input name="type" type="hidden" value="ssh">
|
||||
<button class="ui primary button">
|
||||
|
@ -84,7 +84,7 @@
|
|||
</div>
|
||||
<div class="field">
|
||||
<label for="signature">{{ctx.Locale.Tr "settings.ssh_token_signature"}}</label>
|
||||
<textarea id="ssh-key-signature" name="signature" class="js-quick-submit" placeholder="{{ctx.Locale.Tr "settings.key_signature_ssh_placeholder"}}" required>{{$.signature}}</textarea>
|
||||
<textarea id="ssh-key-signature" name="signature" placeholder="{{ctx.Locale.Tr "settings.key_signature_ssh_placeholder"}}" required>{{$.signature}}</textarea>
|
||||
</div>
|
||||
<input name="type" type="hidden" value="verify_ssh">
|
||||
<button class="ui primary button">
|
||||
|
|
|
@ -164,7 +164,7 @@ func TestPackagePyPI(t *testing.T) {
|
|||
nodes := htmlDoc.doc.Find("a").Nodes
|
||||
assert.Len(t, nodes, 2)
|
||||
|
||||
hrefMatcher := regexp.MustCompile(fmt.Sprintf(`%s/files/%s/%s/test\..+#sha256-%s`, root, regexp.QuoteMeta(packageName), regexp.QuoteMeta(packageVersion), hashSHA256))
|
||||
hrefMatcher := regexp.MustCompile(fmt.Sprintf(`%s/files/%s/%s/test\..+#sha256=%s`, root, regexp.QuoteMeta(packageName), regexp.QuoteMeta(packageVersion), hashSHA256))
|
||||
|
||||
for _, a := range nodes {
|
||||
for _, att := range a.Attr {
|
||||
|
|
|
@ -222,7 +222,7 @@ func TestAPISearchRepo(t *testing.T) {
|
|||
assert.Len(t, repoNames, expected.count)
|
||||
for _, repo := range body.Data {
|
||||
r := getRepo(t, repo.ID)
|
||||
hasAccess, err := access_model.HasAccess(db.DefaultContext, userID, r)
|
||||
hasAccess, err := access_model.HasAnyUnitAccess(db.DefaultContext, userID, r)
|
||||
assert.NoError(t, err, "Error when checking if User: %d has access to %s: %v", userID, repo.FullName, err)
|
||||
assert.True(t, hasAccess, "User: %d does not have access to %s", userID, repo.FullName)
|
||||
|
||||
|
|
|
@ -374,6 +374,7 @@ a.label,
|
|||
|
||||
.ui.selection.dropdown .menu > .item {
|
||||
border-color: var(--color-secondary);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.ui.selection.visible.dropdown > .text:not(.default) {
|
||||
|
@ -390,6 +391,12 @@ a.label,
|
|||
color: var(--color-text-light-2);
|
||||
}
|
||||
|
||||
.ui.dropdown > .text {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/* extend fomantic style '.ui.dropdown > .text > img' to include svg.img */
|
||||
.ui.dropdown > .text > .img {
|
||||
margin-left: 0;
|
||||
|
@ -494,6 +501,12 @@ img.ui.avatar,
|
|||
margin-top: calc(var(--page-spacing) - 1rem);
|
||||
}
|
||||
|
||||
/* add horizontal margin to elements that are outside top-level of .flex-container or .ui.container */
|
||||
.page-content > .flash-message {
|
||||
margin-left: var(--page-margin-x);
|
||||
margin-right: var(--page-margin-x);
|
||||
}
|
||||
|
||||
.ui.form .fields.error .field textarea,
|
||||
.ui.form .fields.error .field select,
|
||||
.ui.form .fields.error .field input:not([type]),
|
||||
|
|
|
@ -1080,8 +1080,8 @@ td .commit-summary {
|
|||
clear: none;
|
||||
}
|
||||
|
||||
.repository .comment.form .content .form::before,
|
||||
.repository .comment.form .content .form::after {
|
||||
.repository .comment.form .content .segment::before,
|
||||
.repository .comment.form .content .segment::after {
|
||||
right: 100%;
|
||||
top: 20px;
|
||||
border: solid transparent;
|
||||
|
@ -1092,13 +1092,13 @@ td .commit-summary {
|
|||
pointer-events: none;
|
||||
}
|
||||
|
||||
.repository .comment.form .content .form::before {
|
||||
.repository .comment.form .content .segment::before {
|
||||
border-right-color: var(--color-secondary);
|
||||
border-width: 9px;
|
||||
margin-top: -9px;
|
||||
}
|
||||
|
||||
.repository .comment.form .content .form::after {
|
||||
.repository .comment.form .content .segment::after {
|
||||
border-right-color: var(--color-box-body);
|
||||
border-width: 8px;
|
||||
margin-top: -8px;
|
||||
|
|
|
@ -46,10 +46,11 @@ export function initFootLanguageMenu() {
|
|||
}
|
||||
|
||||
export function initGlobalEnterQuickSubmit() {
|
||||
$(document).on('keydown', '.js-quick-submit', (e) => {
|
||||
if (((e.ctrlKey && !e.altKey) || e.metaKey) && (e.key === 'Enter')) {
|
||||
document.addEventListener('keydown', (e) => {
|
||||
const isQuickSubmitEnter = ((e.ctrlKey && !e.altKey) || e.metaKey) && (e.key === 'Enter');
|
||||
if (isQuickSubmitEnter && e.target.matches('textarea')) {
|
||||
e.preventDefault();
|
||||
handleGlobalEnterQuickSubmit(e.target);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -9,9 +9,5 @@ export function handleGlobalEnterQuickSubmit(target) {
|
|||
// here use the event to trigger the submit event (instead of calling `submit()` method directly)
|
||||
// otherwise the `areYouSure` handler won't be executed, then there will be an annoying "confirm to leave" dialog
|
||||
form.dispatchEvent(new SubmitEvent('submit', {bubbles: true, cancelable: true}));
|
||||
} else {
|
||||
// if no form, then the editor is for an AJAX request, dispatch an event to the target, let the target's event handler to do the AJAX request.
|
||||
// the 'ce-' prefix means this is a CustomEvent
|
||||
target.dispatchEvent(new CustomEvent('ce-quick-submit', {bubbles: true}));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue