diff --git a/go.mod b/go.mod index 03fc2ae4bf..164702c90e 100644 --- a/go.mod +++ b/go.mod @@ -107,7 +107,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/syndtr/goleveldb v1.0.0 github.com/tstranex/u2f v1.0.0 - github.com/ulikunitz/xz v0.5.12 + github.com/ulikunitz/xz v0.5.15 github.com/urfave/cli-docs/v3 v3.0.0-alpha6 github.com/urfave/cli/v3 v3.3.3 github.com/wneessen/go-mail v0.6.2 diff --git a/go.sum b/go.sum index b912466eb0..d30acd79e1 100644 --- a/go.sum +++ b/go.sum @@ -684,8 +684,8 @@ github.com/tstranex/u2f v1.0.0/go.mod h1:eahSLaqAS0zsIEv80+vXT7WanXs7MQQDg3j3wGB github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= -github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= github.com/urfave/cli-docs/v3 v3.0.0-alpha6 h1:w/l/N0xw1rO/aHRIGXJ0lDwwYFOzilup1qGvIytP3BI= diff --git a/models/auth/session.go b/models/auth/session.go index 0378d0ec6f..dbdcde03a0 100644 --- a/models/auth/session.go +++ b/models/auth/session.go @@ -86,7 +86,7 @@ func RegenerateSession(ctx context.Context, oldKey, newKey string) (*Session, er } } - if _, err := db.Exec(ctx, "UPDATE "+db.TableName(&Session{})+" SET `key` = ? WHERE `key`=?", newKey, oldKey); err != nil { + if _, err := db.Exec(ctx, "UPDATE `session` SET `key` = ? WHERE `key`=?", newKey, oldKey); err != nil { return nil, err } diff --git a/models/auth/source_test.go b/models/auth/source_test.go index 285f55a24b..ebc462c581 100644 --- a/models/auth/source_test.go +++ b/models/auth/source_test.go @@ -8,7 +8,6 @@ import ( "testing" auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/json" @@ -40,7 +39,7 @@ func (source *TestSource) ToDB() ([]byte, error) { func TestDumpAuthSource(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) - authSourceSchema, err := db.TableInfo(new(auth_model.Source)) + authSourceSchema, err := unittest.GetXORMEngine().TableInfo(new(auth_model.Source)) assert.NoError(t, err) auth_model.RegisterTypeConfig(auth_model.OAuth2, new(TestSource)) diff --git a/models/db/context.go b/models/db/context.go index cac9721747..8bb14f1389 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -21,28 +21,8 @@ type engineContextKeyType struct{} var engineContextKey = engineContextKeyType{} -type xormContextType struct { - context.Context - engine Engine -} - -var xormContext *xormContextType - -func newContext(ctx context.Context, e Engine) *xormContextType { - return &xormContextType{Context: ctx, engine: e} -} - -// Value shadows Value for context.Context but allows us to get ourselves and an Engined object -func (ctx *xormContextType) Value(key any) any { - if key == engineContextKey { - return ctx - } - return ctx.Context.Value(key) -} - -// WithContext returns this engine tied to this context -func (ctx *xormContextType) WithContext(other context.Context) *xormContextType { - return newContext(ctx, ctx.engine.Context(other)) +func withContextEngine(ctx context.Context, e Engine) context.Context { + return context.WithValue(ctx, engineContextKey, e) } var ( @@ -81,17 +61,19 @@ func contextSafetyCheck(e Engine) { callerNum := runtime.Callers(3, callers) // skip 3: runtime.Callers, contextSafetyCheck, GetEngine for i := range callerNum { if slices.Contains(contextSafetyDeniedFuncPCs, callers[i]) { - panic(errors.New("using database context in an iterator would cause corrupted results")) + panic(errors.New("using session context in an iterator would cause corrupted results")) } } } // GetEngine gets an existing db Engine/Statement or creates a new Session -func GetEngine(ctx context.Context) (e Engine) { - defer func() { contextSafetyCheck(e) }() - if e := getExistingEngine(ctx); e != nil { - return e +func GetEngine(ctx context.Context) Engine { + if engine, ok := ctx.Value(engineContextKey).(Engine); ok { + // if reusing the existing session, need to do "contextSafetyCheck" because the Iterate creates a "autoResetStatement=false" session + contextSafetyCheck(engine) + return engine } + // no need to do "contextSafetyCheck" because it's a new Session return xormEngine.Context(ctx) } @@ -99,17 +81,6 @@ func GetXORMEngineForTesting() *xorm.Engine { return xormEngine } -// getExistingEngine gets an existing db Engine/Statement from this context or returns nil -func getExistingEngine(ctx context.Context) (e Engine) { - if engined, ok := ctx.(*xormContextType); ok { - return engined.engine - } - if engined, ok := ctx.Value(engineContextKey).(*xormContextType); ok { - return engined.engine - } - return nil -} - // Committer represents an interface to Commit or Close the Context type Committer interface { Commit() error @@ -152,8 +123,8 @@ func (c *halfCommitter) Close() error { // And all operations submitted by the caller stack will be rollbacked as well, not only the operations in the current function. // d. It doesn't mean rollback is forbidden, but always do it only when there is an error, and you do want to rollback. func TxContext(parentCtx context.Context) (context.Context, Committer, error) { - if sess, ok := inTransaction(parentCtx); ok { - return newContext(parentCtx, sess), &halfCommitter{committer: sess}, nil + if sess := getTransactionSession(parentCtx); sess != nil { + return withContextEngine(parentCtx, sess), &halfCommitter{committer: sess}, nil } sess := xormEngine.NewSession() @@ -161,15 +132,14 @@ func TxContext(parentCtx context.Context) (context.Context, Committer, error) { _ = sess.Close() return nil, nil, err } - - return newContext(xormContext, sess), sess, nil + return withContextEngine(parentCtx, sess), sess, nil } // WithTx represents executing database operations on a transaction, if the transaction exist, // this function will reuse it otherwise will create a new one and close it when finished. func WithTx(parentCtx context.Context, f func(ctx context.Context) error) error { - if sess, ok := inTransaction(parentCtx); ok { - err := f(newContext(parentCtx, sess)) + if sess := getTransactionSession(parentCtx); sess != nil { + err := f(withContextEngine(parentCtx, sess)) if err != nil { // rollback immediately, in case the caller ignores returned error and tries to commit the transaction. _ = sess.Close() @@ -195,7 +165,7 @@ func txWithNoCheck(parentCtx context.Context, f func(ctx context.Context) error) return err } - if err := f(newContext(parentCtx, sess)); err != nil { + if err := f(withContextEngine(parentCtx, sess)); err != nil { return err } @@ -333,32 +303,15 @@ func CountByBean(ctx context.Context, bean any) (int64, error) { return GetEngine(ctx).Count(bean) } -// TableName returns the table name according a bean object -func TableName(bean any) string { - return xormEngine.TableName(bean) -} - // InTransaction returns true if the engine is in a transaction otherwise return false func InTransaction(ctx context.Context) bool { - _, ok := inTransaction(ctx) - return ok + return getTransactionSession(ctx) != nil } -func inTransaction(ctx context.Context) (*xorm.Session, bool) { - e := getExistingEngine(ctx) - if e == nil { - return nil, false - } - - switch t := e.(type) { - case *xorm.Engine: - return nil, false - case *xorm.Session: - if t.IsInTx() { - return t, true - } - return nil, false - default: - return nil, false +func getTransactionSession(ctx context.Context) *xorm.Session { + e, _ := ctx.Value(engineContextKey).(Engine) + if sess, ok := e.(*xorm.Session); ok && sess.IsInTx() { + return sess } + return nil } diff --git a/models/db/context_test.go b/models/db/context_test.go index 1bc84ffbf9..1719a7bfe8 100644 --- a/models/db/context_test.go +++ b/models/db/context_test.go @@ -100,31 +100,36 @@ func TestContextSafety(t *testing.T) { assert.NoError(t, db.Insert(t.Context(), &TestModel2{ID: int64(-i)})) } - actualCount := 0 - // here: db.GetEngine(t.Context()) is a new *Session created from *Engine - _ = db.WithTx(t.Context(), func(ctx context.Context) error { - _ = db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error { - // here: db.GetEngine(ctx) is always the unclosed "Iterate" *Session with autoResetStatement=false, - // and the internal states (including "cond" and others) are always there and not be reset in this callback. - m1 := bean.(*TestModel1) - assert.EqualValues(t, i+1, m1.ID) + t.Run("Show-XORM-Bug", func(t *testing.T) { + actualCount := 0 + // here: db.GetEngine(t.Context()) is a new *Session created from *Engine + _ = db.WithTx(t.Context(), func(ctx context.Context) error { + _ = db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error { + // here: db.GetEngine(ctx) is always the unclosed "Iterate" *Session with autoResetStatement=false, + // and the internal states (including "cond" and others) are always there and not be reset in this callback. + m1 := bean.(*TestModel1) + assert.EqualValues(t, i+1, m1.ID) - // here: XORM bug, it fails because the SQL becomes "WHERE id=-1", "WHERE id=-1 AND id=-2", "WHERE id=-1 AND id=-2 AND id=-3" ... - // and it conflicts with the "Iterate"'s internal states. - // has, err := db.GetEngine(ctx).Get(&TestModel2{ID: -m1.ID}) + // here: XORM bug, it fails because the SQL becomes "WHERE id=-1", "WHERE id=-1 AND id=-2", "WHERE id=-1 AND id=-2 AND id=-3" ... + // and it conflicts with the "Iterate"'s internal states. + // has, err := db.GetEngine(ctx).Get(&TestModel2{ID: -m1.ID}) - actualCount++ + actualCount++ + return nil + }) return nil }) - return nil + assert.Equal(t, testCount, actualCount) }) - assert.Equal(t, testCount, actualCount) - // deny the bad usages - assert.PanicsWithError(t, "using database context in an iterator would cause corrupted results", func() { - _ = unittest.GetXORMEngine().Iterate(&TestModel1{}, func(i int, bean any) error { - _ = db.GetEngine(t.Context()) - return nil + t.Run("DenyBadUsage", func(t *testing.T) { + assert.PanicsWithError(t, "using session context in an iterator would cause corrupted results", func() { + _ = db.WithTx(t.Context(), func(ctx context.Context) error { + return db.GetEngine(ctx).Iterate(&TestModel1{}, func(i int, bean any) error { + _ = db.GetEngine(ctx) + return nil + }) + }) }) }) } diff --git a/models/db/engine.go b/models/db/engine.go index 4b12925b1c..b08799210e 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -12,7 +12,6 @@ import ( "strings" "xorm.io/xorm" - "xorm.io/xorm/schemas" _ "github.com/go-sql-driver/mysql" // Needed for the MySQL driver _ "github.com/lib/pq" // Needed for the Postgresql driver @@ -67,11 +66,6 @@ var ( _ Engine = (*xorm.Session)(nil) ) -// TableInfo returns table's information via an object -func TableInfo(v any) (*schemas.Table, error) { - return xormEngine.TableInfo(v) -} - // RegisterModel registers model, if initFuncs provided, it will be invoked after data model sync func RegisterModel(bean any, initFunc ...func() error) { registeredModels = append(registeredModels, bean) diff --git a/models/db/engine_init.go b/models/db/engine_init.go index 373a99e7b5..f26189b805 100644 --- a/models/db/engine_init.go +++ b/models/db/engine_init.go @@ -86,7 +86,6 @@ func InitEngine(ctx context.Context) error { func SetDefaultEngine(ctx context.Context, eng *xorm.Engine) { xormEngine = eng xormEngine.SetDefaultContext(ctx) - xormContext = &xormContextType{Context: ctx, engine: xormEngine} } // UnsetDefaultEngine closes and unsets the default engine @@ -98,7 +97,6 @@ func UnsetDefaultEngine() { _ = xormEngine.Close() xormEngine = nil } - xormContext = nil } // InitEngineWithMigration initializes a new xorm.Engine and sets it as the XORM's default context diff --git a/models/db/engine_test.go b/models/db/engine_test.go index 167525a5a8..1c218df77f 100644 --- a/models/db/engine_test.go +++ b/models/db/engine_test.go @@ -70,7 +70,7 @@ func TestPrimaryKeys(t *testing.T) { } for _, bean := range beans { - table, err := db.TableInfo(bean) + table, err := db.GetXORMEngineForTesting().TableInfo(bean) if err != nil { t.Fatal(err) } diff --git a/models/db/index.go b/models/db/index.go index 29254b1f07..7a11645bd4 100644 --- a/models/db/index.go +++ b/models/db/index.go @@ -19,12 +19,7 @@ type ResourceIndex struct { MaxIndex int64 `xorm:"index"` } -var ( - // ErrResouceOutdated represents an error when request resource outdated - ErrResouceOutdated = errors.New("resource outdated") - // ErrGetResourceIndexFailed represents an error when resource index retries 3 times - ErrGetResourceIndexFailed = errors.New("get resource index failed") -) +var ErrGetResourceIndexFailed = errors.New("get resource index failed") // SyncMaxResourceIndex sync the max index with the resource func SyncMaxResourceIndex(ctx context.Context, tableName string, groupID, maxIndex int64) (err error) { diff --git a/models/organization/org_list.go b/models/organization/org_list.go index 81457191fe..f37961b5f6 100644 --- a/models/organization/org_list.go +++ b/models/organization/org_list.go @@ -105,11 +105,6 @@ type MinimalOrg = Organization // GetUserOrgsList returns all organizations the given user has access to func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, error) { - schema, err := db.TableInfo(new(user_model.User)) - if err != nil { - return nil, err - } - outputCols := []string{ "id", "name", @@ -122,7 +117,7 @@ func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, selectColumns := &strings.Builder{} for i, col := range outputCols { - fmt.Fprintf(selectColumns, "`%s`.%s", schema.Name, col) + _, _ = fmt.Fprintf(selectColumns, "`user`.%s", col) if i < len(outputCols)-1 { selectColumns.WriteString(", ") } diff --git a/models/repo/release.go b/models/repo/release.go index 0db57503ce..67aa390e6d 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -282,11 +282,8 @@ func (opts FindReleasesOptions) ToOrders() string { // GetTagNamesByRepoID returns a list of release tag names of repository. func GetTagNamesByRepoID(ctx context.Context, repoID int64) ([]string, error) { - listOptions := db.ListOptions{ - ListAll: true, - } opts := FindReleasesOptions{ - ListOptions: listOptions, + ListOptions: db.ListOptionsAll, IncludeDrafts: true, IncludeTags: true, HasSha1: optional.Some(true), diff --git a/models/unittest/consistency.go b/models/unittest/consistency.go index b51cadce0a..8447bd93ba 100644 --- a/models/unittest/consistency.go +++ b/models/unittest/consistency.go @@ -45,7 +45,7 @@ func CheckConsistencyFor(t TestingT, beansToCheck ...any) { } func checkForConsistency(t TestingT, bean any) { - tb, err := db.TableInfo(bean) + tb, err := GetXORMEngine().TableInfo(bean) assert.NoError(t, err) f := consistencyCheckMap[tb.Name] require.NotNil(t, f, "unknown bean type: %#v", bean) diff --git a/models/unittest/fixtures_loader.go b/models/unittest/fixtures_loader.go index 0560da8349..d92b0cdb14 100644 --- a/models/unittest/fixtures_loader.go +++ b/models/unittest/fixtures_loader.go @@ -218,7 +218,7 @@ func NewFixturesLoader(x *xorm.Engine, opts FixturesOptions) (FixturesLoader, er xormBeans, _ := db.NamesToBean() f.xormTableNames = map[string]bool{} for _, bean := range xormBeans { - f.xormTableNames[db.TableName(bean)] = true + f.xormTableNames[x.TableName(bean)] = true } return f, nil diff --git a/models/unittest/unit_tests.go b/models/unittest/unit_tests.go index 49d42d7fe6..c49b26fea4 100644 --- a/models/unittest/unit_tests.go +++ b/models/unittest/unit_tests.go @@ -159,7 +159,7 @@ func DumpQueryResult(t require.TestingT, sqlOrBean any, sqlArgs ...any) { goDB := x.DB().DB sql, ok := sqlOrBean.(string) if !ok { - sql = "SELECT * FROM " + db.TableName(sqlOrBean) + sql = "SELECT * FROM " + x.TableName(sqlOrBean) } else if !strings.Contains(sql, " ") { sql = "SELECT * FROM " + sql } diff --git a/modules/git/foreachref/parser.go b/modules/git/foreachref/parser.go index de69eaa2c8..ebdc7344d0 100644 --- a/modules/git/foreachref/parser.go +++ b/modules/git/foreachref/parser.go @@ -30,6 +30,10 @@ type Parser struct { func NewParser(r io.Reader, format Format) *Parser { scanner := bufio.NewScanner(r) + // default MaxScanTokenSize = 64 kiB may be too small for some references, + // so allow the buffer to grow up to 4x if needed + scanner.Buffer(nil, 4*bufio.MaxScanTokenSize) + // in addition to the reference delimiter we specified in the --format, // `git for-each-ref` will always add a newline after every reference. refDelim := make([]byte, 0, len(format.refDelim)+1) @@ -70,6 +74,9 @@ func NewParser(r io.Reader, format Format) *Parser { // { "objecttype": "tag", "refname:short": "v1.16.4", "object": "f460b7543ed500e49c133c2cd85c8c55ee9dbe27" } func (p *Parser) Next() map[string]string { if !p.scanner.Scan() { + if err := p.scanner.Err(); err != nil { + p.err = err + } return nil } fields, err := p.parseRef(p.scanner.Text()) diff --git a/modules/git/repo_tag_gogit.go b/modules/git/repo_tag_gogit.go index 3e1b4e89ad..878ab55bf2 100644 --- a/modules/git/repo_tag_gogit.go +++ b/modules/git/repo_tag_gogit.go @@ -7,8 +7,6 @@ package git import ( - "strings" - "code.gitea.io/gitea/modules/log" "github.com/go-git/go-git/v5/plumbing" @@ -20,40 +18,6 @@ func (repo *Repository) IsTagExist(name string) bool { return err == nil } -// GetTags returns all tags of the repository. -// returning at most limit tags, or all if limit is 0. -func (repo *Repository) GetTags(skip, limit int) ([]string, error) { - var tagNames []string - - tags, err := repo.gogitRepo.Tags() - if err != nil { - return nil, err - } - - _ = tags.ForEach(func(tag *plumbing.Reference) error { - tagNames = append(tagNames, strings.TrimPrefix(tag.Name().String(), TagPrefix)) - return nil - }) - - // Reverse order - for i := 0; i < len(tagNames)/2; i++ { - j := len(tagNames) - i - 1 - tagNames[i], tagNames[j] = tagNames[j], tagNames[i] - } - - // since we have to reverse order we can paginate only afterwards - if len(tagNames) < skip { - tagNames = []string{} - } else { - tagNames = tagNames[skip:] - } - if limit != 0 && len(tagNames) > limit { - tagNames = tagNames[:limit] - } - - return tagNames, nil -} - // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) func (repo *Repository) GetTagType(id ObjectID) (string, error) { // Get tag type diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 3d2b4f52bd..5f79b68a9a 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -22,13 +22,6 @@ func (repo *Repository) IsTagExist(name string) bool { return repo.IsReferenceExist(TagPrefix + name) } -// GetTags returns all tags of the repository. -// returning at most limit tags, or all if limit is 0. -func (repo *Repository) GetTags(skip, limit int) (tags []string, err error) { - tags, _, err = callShowRef(repo.Ctx, repo.Path, TagPrefix, TrustedCmdArgs{TagPrefix, "--sort=-taggerdate"}, skip, limit) - return tags, err -} - // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) func (repo *Repository) GetTagType(id ObjectID) (string, error) { wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) diff --git a/modules/git/repo_tag_test.go b/modules/git/repo_tag_test.go index 4abb7c4ed9..e6f8e75a0e 100644 --- a/modules/git/repo_tag_test.go +++ b/modules/git/repo_tag_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestRepository_GetTags(t *testing.T) { +func TestRepository_GetTagInfos(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) if err != nil { diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index cb0c2373ed..15a4c019c4 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -120,6 +120,7 @@ error404=Níl an leathanach atá tú ag iarraidh a bhaint amach ann@%[1]s lançou a versão %[2]s em %[3]s release.title=Título: %s release.note=Nota: release.downloads=Downloads: -release.download.zip=Código Fonte (ZIP) -release.download.targz=Código Fonte (TAR.GZ) +release.download.zip=Código-Fonte (ZIP) +release.download.targz=Código-Fonte (TAR.GZ) repo.transfer.subject_to=%s gostaria de transferir "%s" para %s repo.transfer.subject_to_you=%s gostaria de transferir "%s" para você @@ -1010,6 +1010,7 @@ new_repo_helper=Um repositório contém todos os arquivos do projeto, inclusive owner=Proprietário owner_helper=Algumas organizações podem não aparecer no menu devido a um limite de contagem dos repositórios. repo_name=Nome do repositório +repo_name_helper=Bons nomes de repositórios usam palavras-chave curtas, memorizáveis e únicas. Um repositório chamado ".profile" ou ".profile-private" pode ser usado para adicionar um README.md para seu perfil de usuário/organização. repo_size=Tamanho do repositório template=Modelo template_select=Selecione um modelo. @@ -1021,7 +1022,7 @@ visibility_helper=Tornar o repositório privado visibility_helper_forced=O administrador do site força novos repositórios a serem privados. visibility_fork_helper=(Esta alteração irá afetar todos os forks.) clone_helper=Precisa de ajuda com o clone? Visite a Ajuda. -fork_repo=Fork do repositório +fork_repo=Fork do Repositório fork_from=Fork de already_forked=Você já fez o fork de %s fork_to_different_account=Faça um fork para uma conta diferente @@ -1030,12 +1031,13 @@ fork_branch=Branch a ser clonado para o fork all_branches=Todos os branches view_all_branches=Ver todos branches view_all_tags=Ver todas as tags +fork_no_valid_owners=Não é possível fazer um fork desse repositório porque não há proprietários validos. use_template=Usar este modelo open_with_editor=Abrir com %s download_zip=Baixar ZIP download_tar=Baixar TAR.GZ download_bundle=Baixar PACOTE -generate_repo=Gerar repositório +generate_repo=Gerar Repositório generate_from=Gerar de repo_desc=Descrição repo_desc_helper=Digite uma breve descrição (opcional) @@ -1043,7 +1045,7 @@ repo_no_desc=Descrição não fornecida repo_lang=Linguagens repo_gitignore_helper=Selecione modelos do .gitignore. repo_gitignore_helper_desc=Escolha os arquivos que não serão rastreados da lista de modelos para linguagens comuns. Artefatos típicos gerados pelos compiladores de cada linguagem estão incluídos no .gitignore por padrão. -issue_labels=Etiquetas de issue +issue_labels=Etiquetas de Issue issue_labels_helper=Selecione um conjunto de etiquetas de issue. license=Licença license_helper=Selecione um arquivo de licença. @@ -1058,7 +1060,7 @@ trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaborad trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers trust_model_helper_collaborator_committer=Colaborador+Committer: Confiar em assinaturas dos colaboradores que correspondem ao committer trust_model_helper_default=Padrão: Usar o modelo de confiança padrão para esta instalação -create_repo=Criar repositório +create_repo=Criar Repositório default_branch=Branch Padrão default_branch_label=padrão default_branch_helper=O branch padrão é o branch base para pull requests e commits de código. @@ -1088,6 +1090,7 @@ stars=Favoritos reactions_more=e %d mais unit_disabled=O administrador do site desabilitou esta seção do repositório. language_other=Outra +adopt_search=Digite o nome de usuário para pesquisar por repositórios órfãos… (deixe em branco para encontrar todos) adopt_preexisting_label=Adotar Arquivos adopt_preexisting=Adotar arquivos pré-existentes adopt_preexisting_content=Criar repositório a partir de %s @@ -1125,6 +1128,8 @@ template.issue_labels=Etiquetas de issue template.one_item=Deve-se selecionar pelo menos um item de modelo template.invalid=Deve-se selecionar um repositório de modelo +archive.title=Este repositório está arquivado. Você pode visualizar arquivos e cloná-lo. Você não pode abrir issues ou pull requests ou fazer push de commits. +archive.title_date=Este repositório foi arquivado em %s. Você pode visualizar arquivos e cloná-lo. Você não pode abrir issues ou pull requests ou fazer push de commits. archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar nas issues. archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar nos pull requests. @@ -1141,6 +1146,7 @@ migrate_options_lfs=Migrar arquivos LFS migrate_options_lfs_endpoint.label=Destino LFS migrate_options_lfs_endpoint.description=A migração tentará usar seu controle remoto Git para determinar o servidor LFS. Você também pode especificar um destino personalizado se os dados do repositório LFS forem armazenados em outro lugar. migrate_options_lfs_endpoint.description.local=Um caminho de servidor local também é suportado. +migrate_options_lfs_endpoint.placeholder=Se for deixado em branco, o destino será derivado do URL de clone. migrate_items=Itens da migração migrate_items_wiki=Wiki migrate_items_milestones=Marcos @@ -1149,11 +1155,13 @@ migrate_items_issues=Issues migrate_items_pullrequests=Pull Requests migrate_items_merge_requests=Requisições de merge migrate_items_releases=Versões -migrate_repo=Migrar repositório +migrate_repo=Migrar Repositório migrate.clone_address=Migrar / Clonar de URL migrate.clone_address_desc=URL HTTP (S) ou Git 'clone' de um repositório existente +migrate.github_token_desc=Você pode colocar um ou mais tokens aqui, separados por vírgulas, para tornar a migração mais rápida, contornando os limites da API do GitHub. AVISO: abusar deste recurso pode violar a política do provedor de serviços e pode levar a que a sua(s) conta(s) seja bloqueada. migrate.clone_local_path=ou um caminho de servidor local migrate.permission_denied=Você não pode importar repositórios locais. +migrate.permission_denied_blocked=Você não pode importar dos hosts não permitidos, por favor peça ao administrador para verificar as configurações ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. migrate.invalid_local_path=O caminho local é inválido. Ele não existe ou não é um diretório. migrate.invalid_lfs_endpoint=O destino LFS não é válido. migrate.failed=Migração falhou: %v @@ -1161,6 +1169,7 @@ migrate.migrate_items_options=Um Token de Acesso é necessário para migrar iten migrated_from=Migrado de %[2]s migrated_from_fake=Migrado de %[1]s migrate.migrate=Migrar de %s +migrate.migrating=Migrando de %s… migrate.migrating_failed=Migração a partir de %s falhou. migrate.migrating_failed.error=Falha ao migrar: %s migrate.migrating_failed_no_addr=A migração falhou. @@ -1172,14 +1181,19 @@ migrate.gogs.description=Migrar dados de notabug.org ou de outras instâncias do migrate.onedev.description=Migrar dados de code.onedev.io ou de outras instâncias do OneDev. migrate.codebase.description=Migrar dados de codebasehq.com. migrate.gitbucket.description=Migrar dados de instâncias do GitBucket. +migrate.codecommit.description=Migrar dados do AWS CodeCommit. +migrate.codecommit.aws_access_key_id=Chave ID AWS (Access Key ID) +migrate.codecommit.aws_secret_access_key=Chave Secreta AWS (Secret Access Key) +migrate.codecommit.https_git_credentials_username=Nome de Usuário para Git HTTPS +migrate.codecommit.https_git_credentials_password=Senha para Git HTTPS migrate.migrating_git=Migrando dados Git -migrate.migrating_topics=Migrando tópicos +migrate.migrating_topics=Migrando Tópicos migrate.migrating_milestones=Migrando Marcos migrate.migrating_labels=Migrando Rótulos migrate.migrating_releases=Migrando Versões migrate.migrating_issues=Migrando Issues migrate.migrating_pulls=Migrando Pull Requests -migrate.cancel_migrating_title=Cancelar migração +migrate.cancel_migrating_title=Cancelar Migração migrate.cancel_migrating_confirm=Você quer cancelar essa migração? migration_status=Status da migração @@ -1195,7 +1209,8 @@ watch=Observar unstar=Retirar dos favoritos star=Juntar aos favoritos fork=Fork -download_archive=Baixar repositório +action.blocked_user=Não é possível executar a ação porque você está bloqueado pelo proprietário do repositório. +download_archive=Baixar Repositório more_operations=Mais Operações quick_guide=Guia Rápido @@ -1203,6 +1218,7 @@ clone_this_repo=Clonar este repositório cite_this_repo=Citar este repositório create_new_repo_command=Criando um novo repositório por linha de comando push_exist_repo=Realizando push para um repositório existente por linha de comando +empty_message=Este repositório está vazio. broken_message=Os dados Git subjacentes a este repositório não podem ser lidos. Entre em contato com o administrador desta instância ou exclua este repositório. code=Código @@ -1220,6 +1236,7 @@ projects=Projetos packages=Pacotes actions=Ações labels=Etiquetas +org_labels_desc=Etiquetas a nível de organização que podem ser usadas com todos os repositórios sob esta organização org_labels_desc_manage=gerenciar milestone=Marco @@ -1234,9 +1251,9 @@ tagged_this=criou essa tag file.title=%s em %s file_raw=Original file_history=Histórico -file_view_source=Exibir código-fonte +file_view_source=Exibir Código-Fonte file_view_rendered=Ver Renderizado -file_view_raw=Ver original +file_view_raw=Ver Original file_permalink=Link permanente file_too_large=O arquivo é muito grande para ser mostrado. file_is_empty=O arquivo está vazio. @@ -1254,9 +1271,9 @@ view_git_blame=Ver Git Blame video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5. audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5. symbolic_link=Link simbólico -executable_file=Arquivo executável +executable_file=Arquivo Executável generated=Gerado -commit_graph=Gráfico de commits +commit_graph=Gráfico de Commits commit_graph.select=Selecionar branches commit_graph.hide_pr_refs=Esconder Pull Requests commit_graph.monochrome=Monocromático @@ -1272,34 +1289,35 @@ lines=linhas from_comment=(comentário) editor.add_file=Adicionar Arquivo -editor.new_file=Novo arquivo -editor.upload_file=Enviar arquivo -editor.edit_file=Editar arquivo -editor.preview_changes=Visualizar alterações +editor.new_file=Novo Arquivo +editor.upload_file=Enviar Arquivo +editor.edit_file=Editar Arquivo +editor.preview_changes=Visualizar Alterações editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web. editor.cannot_edit_too_large_file=O arquivo é muito grande para ser editado. editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web. editor.file_not_editable_hint=Mas você ainda pode renomear ou movê-lo. -editor.edit_this_file=Editar arquivo +editor.edit_this_file=Editar Arquivo editor.this_file_locked=Arquivo está bloqueado editor.must_be_on_a_branch=Você deve estar em um branch para propor alterações neste arquivo. editor.fork_before_edit=Você deve fazer um fork desse repositório para fazer ou propor alterações neste arquivo. -editor.delete_this_file=Excluir arquivo +editor.delete_this_file=Excluir Arquivo editor.must_have_write_access=Você deve ter permissão de escrita para fazer ou propor alterações neste arquivo. editor.file_delete_success=O arquivo "%s" foi excluído. editor.name_your_file=Nomeie o seu arquivo… editor.filename_help=Adicione um diretório digitando seu nome seguido por uma barra ('/'). Remova um diretório digitando o backspace no início do campo de entrada. editor.or=ou editor.cancel_lower=Cancelar -editor.commit_signed_changes=Commit de alteradores assinadas -editor.commit_changes=Aplicar commit das alterações +editor.commit_signed_changes=Criar Commit das Alterações Assinadas +editor.commit_changes=Criar Commit das Alterações editor.add_tmpl=Adicionar '{filename}' editor.add=Adicionar %s editor.update=Atualizar %s editor.delete=Excluir %s editor.patch=Aplicar Correção editor.patching=Corrigindo: -editor.new_patch=Nova correção +editor.fail_to_apply_patch=Não foi possível aplicar correção +editor.new_patch=Nova Correção editor.commit_message_desc=Adicione uma descrição detalhada (opcional)... editor.signoff_desc=Adicione um assinado-por-committer no final do log do commit. editor.commit_directly_to_this_branch=Commit diretamente no branch %s. @@ -1323,7 +1341,7 @@ editor.commit_empty_file_text=O arquivo que você está prestes fazer commit est editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.push_rejected_no_message=A alteração foi rejeitada pelo servidor sem uma mensagem. Por favor, verifique os Hooks Git. editor.push_rejected=A alteração foi rejeitada pelo servidor. Por favor, verifique os Hooks Git. -editor.push_rejected_summary=Mensagem completa de rejeição: +editor.push_rejected_summary=Mensagem Completa de Rejeição: editor.add_subdir=Adicionar um subdiretório... editor.unable_to_upload_files=Ocorreu um erro ao enviar arquivos para "%s": %v editor.upload_file_is_locked=Arquivo "%s" está bloqueado por %s. @@ -1338,11 +1356,12 @@ editor.failed_to_commit=Falha ao criar commit das alterações. editor.failed_to_commit_summary=Mensagem de Erro: -commits.desc=Veja o histórico de alterações do código de fonte. +commits.desc=Veja o histórico de alterações do código-fonte. commits.commits=Commits commits.no_commits=Nenhum commit em comum. "%s" e "%s" tem históricos completamente diferentes. commits.nothing_to_compare=Estes branches são iguais. commits.search.tooltip=Você pode prefixar as palavras-chave com "author:" (autor da mudança), "committer:" (autor do commit), "after:" (depois) ou "before:" (antes). Por exemplo: "revert author:Ana before:2019-01-13".\ +commits.search_branch=Este Branch commits.search_all=Todos os branches commits.author=Autor commits.message=Mensagem @@ -1415,40 +1434,40 @@ issues.filter_labels=Filtrar Rótulo issues.filter_reviewers=Filtrar Revisor issues.filter_no_results=Nenhum resultado issues.filter_no_results_placeholder=Tente ajustar seus filtros de pesquisa. -issues.new=Nova issue +issues.new=Nova Issue issues.new.title_empty=Título não pode ser em branco issues.new.labels=Etiquetas -issues.new.no_label=Sem etiqueta +issues.new.no_label=Sem Etiqueta issues.new.clear_labels=Limpar etiquetas issues.new.projects=Projetos issues.new.clear_projects=Limpar projetos issues.new.no_projects=Sem projeto issues.new.open_projects=Abrir Projetos -issues.new.closed_projects=Projetos fechados +issues.new.closed_projects=Projetos Fechados issues.new.no_items=Nenhum item issues.new.milestone=Marco -issues.new.no_milestone=Sem marco +issues.new.no_milestone=Sem Marco issues.new.clear_milestone=Limpar marco issues.new.assignees=Responsáveis issues.new.clear_assignees=Limpar responsáveis -issues.new.no_assignees=Sem responsável -issues.choose.get_started=Primeiros passos +issues.new.no_assignees=Sem Responsáveis +issues.choose.get_started=Primeiros Passos issues.choose.open_external_link=Abrir issues.choose.blank=Padrão issues.choose.blank_about=Criar uma issue a partir do modelo padrão. issues.choose.ignore_invalid_templates=Modelos inválidos foram ignorados issues.choose.invalid_templates=%v modelo(s) inválido(s) encontrado(s) issues.choose.invalid_config=A configuração da issue contém erros: -issues.no_ref=Nenhum branch/tag especificado -issues.create=Criar issue +issues.no_ref=Nenhum Branch/Tag Especificado +issues.create=Criar Issue issues.new_label=Nova Etiqueta issues.new_label_placeholder=Nome da etiqueta issues.new_label_desc_placeholder=Descrição -issues.create_label=Criar etiqueta +issues.create_label=Criar Etiqueta issues.label_templates.title=Carregue um conjunto de etiquetas pré-definidas issues.label_templates.info=Ainda não existem etiquetas. Crie uma etiqueta em 'Nova etiqueta' ou use um conjunto de etiquetas predefinida: issues.label_templates.helper=Selecione um conjunto de etiquetas -issues.label_templates.use=Use o conjunto de etiquetas +issues.label_templates.use=Usar Conjunto de Etiquetas issues.label_templates.fail_to_load_file=Falha ao carregar o modelo de etiquetas "%s": %v issues.add_label=adicionou o rótulo %s %s issues.add_labels=adicionou os rótulos %s %s @@ -1531,11 +1550,11 @@ issues.commented_at=`comentou %s` issues.delete_comment_confirm=Tem certeza que deseja excluir este comentário? issues.context.copy_link=Copiar Link issues.context.quote_reply=Citar Resposta -issues.context.reference_issue=Referência em uma nova issue +issues.context.reference_issue=Referência em uma Nova Issue issues.context.edit=Editar issues.context.delete=Excluir issues.no_content=Nenhuma descrição fornecida. -issues.close=Fechar issue +issues.close=Fechar Issue issues.comment_pull_merged_at=aplicou o merge do commit %[1]s em %[2]s %[3]s issues.comment_manually_pull_merged_at=aplicou o merge manual do commit %[1]s em %[2]s %[3]s issues.close_comment_issue=Comentar e Fechar @@ -1568,7 +1587,7 @@ issues.re_request_review=Re-solicitar revisão issues.is_stale=Houve alterações nessa PR desde essa revisão issues.remove_request_review=Remover solicitação de revisão issues.remove_request_review_block=Não é possível remover a solicitação de revisão -issues.dismiss_review=Descartar revisão +issues.dismiss_review=Descartar Revisão issues.dismiss_review_warning=Tem certeza de que deseja descartar esta revisão? issues.sign_in_require_desc=Acesse para participar desta conversação. issues.edit=Editar @@ -1579,17 +1598,18 @@ issues.label_description=Descrição da etiqueta issues.label_color=Cor da etiqueta issues.label_color_invalid=Cor inválida issues.label_exclusive=Exclusivo -issues.label_archive=Arquivar etiqueta +issues.label_archive=Arquivar Etiqueta issues.label_archived_filter=Mostrar etiquetas arquivadas issues.label_archive_tooltip=Etiquetas arquivadas são excluídas, por padrão, das sugestões ao pesquisar por etiqueta. issues.label_exclusive_desc=Nomeie o rótulo escopo/item para torná-lo mutuamente exclusivo com outros rótulos do escopo/. issues.label_exclusive_warning=Quaisquer rótulos com escopo conflitantes serão removidos ao editar os rótulos de uma issue ou pull request. +issues.label_exclusive_order=Ordem issues.label_count=%d etiquetas issues.label_open_issues=%d issues abertas issues.label_edit=Editar issues.label_delete=Excluir -issues.label_modify=Editar etiqueta -issues.label_deletion=Excluir etiqueta +issues.label_modify=Editar Etiqueta +issues.label_deletion=Excluir Etiqueta issues.label_deletion_desc=A exclusão desta etiqueta irá removê-la de todas as issues. Tem certeza que deseja continuar? issues.label_deletion_success=A etiqueta foi excluída. issues.label.filter_sort.alphabetically=Alfabeticamente @@ -1643,7 +1663,7 @@ issues.del_time_history=`removeu tempo gasto %s` issues.add_time_hours=Horas issues.add_time_minutes=Minutos issues.add_time_sum_to_small=Nenhum tempo foi inserido. -issues.time_spent_total=Tempo total gasto +issues.time_spent_total=Tempo Total Gasto issues.time_spent_from_all_authors=`Tempo total gasto: %s` issues.due_date=Data Limite @@ -1683,7 +1703,7 @@ issues.dependency.pr_close_blocks=Este pull request bloqueia o fechamento das se issues.dependency.issue_batch_close_blocked=Não é possível fechar as issues que você escolheu, porque a issue #%d ainda tem dependências abertas issues.dependency.blocks_short=Bloqueia issues.dependency.blocked_by_short=Depende de -issues.dependency.remove_header=Remover dependência +issues.dependency.remove_header=Remover Dependência issues.dependency.issue_remove_text=Isto removerá a dependência desta issue. Continuar? issues.dependency.pr_remove_text=Isto removerá a dependência deste pull request. Continuar? issues.dependency.setting=Habilitar Dependências para Issues e Pull Requests @@ -1871,7 +1891,8 @@ milestones.no_due_date=Sem data limite milestones.open=Reabrir milestones.close=Fechar milestones.new_subheader=Os marcos podem ajudá-lo a organizar os problemas e acompanhar seu progresso. -milestones.create=Criar marco +milestones.completeness=%d%% Concluído +milestones.create=Criar Marco milestones.title=Título milestones.desc=Descrição milestones.due_date=Data limite (opcional) @@ -1883,7 +1904,7 @@ milestones.edit_subheader=Marcos organizam as issues e acompanham o progresso. milestones.cancel=Cancelar milestones.modify=Atualizar Marco milestones.edit_success=O marco "%s" foi atualizado. -milestones.deletion=Excluir marco +milestones.deletion=Excluir Marco milestones.deletion_desc=A exclusão deste marco irá removê-lo de todas as issues. Tem certeza que deseja continuar? milestones.deletion_success=O marco foi excluído. milestones.filter_sort.name=Nome @@ -1938,6 +1959,7 @@ wiki.original_git_entry_tooltip=Ver o arquivo Git original em vez de usar o link activity=Atividade activity.navbar.pulse=Pulso activity.navbar.contributors=Contribuidores +activity.navbar.recent_commits=Commits Recentes activity.period.filter_label=Período: activity.period.daily=1 dia activity.period.halfweekly=3 dias @@ -2373,16 +2395,16 @@ settings.rename_branch_from=nome antigo do branch settings.rename_branch_to=novo nome do branch settings.rename_branch=Renomear branch -diff.browse_source=Ver código fonte +diff.browse_source=Ver Código-Fonte diff.parent=pai diff.commit=commit diff.git-notes=Notas -diff.data_not_available=Conteúdo de diff não disponível -diff.options_button=Opções de diferenças -diff.download_patch=Baixar arquivo de patch -diff.download_diff=Baixar arquivo de diferenças -diff.show_split_view=Visão dividida -diff.show_unified_view=Visão unificada +diff.data_not_available=Conteúdo de Diff Não Disponível +diff.options_button=Opções de Diff +diff.download_patch=Baixar Arquivo de Patch +diff.download_diff=Baixar Arquivo de Diff +diff.show_split_view=Visão Dividida +diff.show_unified_view=Visão Unificada diff.whitespace_button=Espaço em branco diff.whitespace_show_everything=Mostrar todas as alterações diff.whitespace_ignore_all_whitespace=Ignorar todas as alterações de espaço em branco @@ -2392,7 +2414,7 @@ diff.stats_desc= %d arquivos alterados com %d adições diff.stats_desc_file=%d alterações: %d adições e %d exclusões diff.bin=BIN diff.bin_not_shown=Arquivo binário não exibido. -diff.view_file=Ver arquivo +diff.view_file=Ver Arquivo diff.file_before=Antes diff.file_after=Depois diff.file_image_width=Largura @@ -2401,7 +2423,7 @@ diff.file_byte_size=Tamanho diff.file_suppressed=Diferenças do arquivo suprimidas por serem muito extensas diff.file_suppressed_line_too_long=Diff do arquivo suprimido porque uma ou mais linhas são muito longas diff.too_many_files=Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff -diff.show_more=Mostrar mais +diff.show_more=Mostrar Mais diff.load=Carregar Diff diff.generated=gerado diff.vendored=externo @@ -2441,7 +2463,7 @@ release.edit=editar release.ahead.commits=%d commits release.ahead.target=para %s desde esta versão tag.ahead.target=para %s desde esta tag -release.source_code=Código Fonte +release.source_code=Código-Fonte release.new_subheader=Lançamentos organizam versões do projeto. release.edit_subheader=Lançamentos organizam versões do projeto. release.tag_name=Nome da tag @@ -2688,7 +2710,7 @@ settings=Configurações de Administrador dashboard.statistic=Resumo dashboard.maintenance_operations=Operações de Manutenção dashboard.system_status=Status do sistema -dashboard.operation_name=Nome da operação +dashboard.operation_name=Nome da Operação dashboard.operation_switch=Trocar dashboard.operation_run=Executar dashboard.clean_unbind_oauth=Limpar conexões OAuth não vinculadas @@ -2720,7 +2742,7 @@ dashboard.cleanup_packages=Limpar pacotes expirados dashboard.cleanup_actions=Limpar recursos de actions expiradas dashboard.server_uptime=Tempo de atividade do Servidor dashboard.current_goroutine=Goroutines Atuais -dashboard.current_memory_usage=Uso de memória atual +dashboard.current_memory_usage=Uso de Memória Atual dashboard.total_memory_allocated=Total de memória alocada dashboard.memory_obtained=Memória obtida dashboard.pointer_lookup_times=Nº de consultas a ponteiros @@ -2965,14 +2987,14 @@ auths.login_source_of_type_exist=Uma fonte de autenticação deste tipo já exis auths.unable_to_initialize_openid=Não é possível inicializar o Provedor OpenID Connect: %s auths.invalid_openIdConnectAutoDiscoveryURL=URL do Auto Discovery inválida (deve ser uma URL válida, começando com http:// ou https://) -config.server_config=Configuração do servidor +config.server_config=Configuração do Servidor config.app_name=Nome do Site config.app_ver=Versão do Gitea config.app_url=URL base do Gitea config.custom_conf=Caminho do Arquivo de Configuração config.custom_file_root_path=Caminho Raiz para Arquivo Personalizado config.domain=Domínio do Servidor -config.offline_mode=Modo local +config.offline_mode=Modo Local config.disable_router_log=Desabilitar o Log do roteador config.run_user=Executar como nome de usuário config.run_mode=Modo de Execução @@ -2988,7 +3010,7 @@ config.ssh_enabled=Habilitado config.ssh_start_builtin_server=Usar o servidor embutido config.ssh_domain=Domínio do servidor SSH config.ssh_port=Porta -config.ssh_listen_port=Porta de escuta +config.ssh_listen_port=Porta de Escuta config.ssh_root_path=Caminho da raiz config.ssh_minimum_key_size_check=Verificar tamanho mínimo da chave config.ssh_minimum_key_sizes=Tamanhos mínimos da chave @@ -3007,16 +3029,16 @@ config.db_schema=Esquema config.db_ssl_mode=SSL config.db_path=Caminho -config.service_config=Configuração do serviço +config.service_config=Configuração do Serviço config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar config.disable_register=Desabilitar Auto-Cadastro config.allow_only_internal_registration=Permitir Registro Somente Através do Próprio Gitea config.allow_only_external_registration=Permitir Cadastro Somente por Meio de Serviços Externos config.enable_openid_signup=Habilitar o auto-cadastro via OpenID config.enable_openid_signin=Habilitar acesso via OpenID -config.show_registration_button=Mostrar botão de cadastro +config.show_registration_button=Mostrar Botão de Cadastro config.require_sign_in_view=Exigir acesso do usuário para a visualização de páginas -config.mail_notify=Habilitar notificações de e-mail +config.mail_notify=Habilitar Notificações de E-mail config.enable_captcha=Habilitar o CAPTCHA config.active_code_lives=Ativar Code Lives config.reset_password_code_lives=Tempo de expiração do código de recuperação de conta @@ -3024,13 +3046,13 @@ config.default_keep_email_private=Ocultar Endereços de E-mail por Padrão config.default_allow_create_organization=Permitir a Criação de Organizações por Padrão config.enable_timetracking=Habilitar Cronômetro config.default_enable_timetracking=Habilitar o Cronômetro por Padrão -config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o cronômetro -config.no_reply_address=Ocultar domínio de e-mail +config.default_allow_only_contributors_to_track_time=Permitir que Apenas os Colaboradores Acompanhem o Cronômetro +config.no_reply_address=Ocultar Domínio de E-mail config.default_visibility_organization=Visibilidade padrão para novas organizações config.webhook_config=Configuração de Hook da Web -config.queue_length=Tamanho da fila -config.deliver_timeout=Intervalo de entrega +config.queue_length=Tamanho da Fila +config.deliver_timeout=Intervalo de Entrega config.skip_tls_verify=Ignorar verificação de TLS config.mailer_config=Configuração de Envio de E-mail @@ -3061,19 +3083,19 @@ config.cache_interval=Intervalo de Cache config.cache_conn=Conexão de Cache config.cache_item_ttl=Item de cache TTL -config.session_config=Configuração da sessão +config.session_config=Configuração da Sessão config.session_provider=Provedor da sessão -config.provider_config=Configuração do provedor +config.provider_config=Configuração do Provedor config.cookie_name=Nome do Cookie config.gc_interval_time=Tempo de Intervalo do GC config.session_life_time=Tempo de vida da sessão config.https_only=Apenas HTTPS config.cookie_life_time=Tempo de Vida do Cookie -config.picture_config=Configuração de imagem e avatar +config.picture_config=Configuração de Imagem e Avatar config.picture_service=Serviço de imagens config.disable_gravatar=Desabilitar o Gravatar -config.enable_federated_avatar=Habilitar avatares federativos +config.enable_federated_avatar=Habilitar Avatares Federativos config.git_config=Configuração do Git config.git_disable_diff_highlight=Desabilitar realce de mudanças no diff @@ -3083,11 +3105,11 @@ config.git_max_diff_files=Máximo de arquivos a serem mostrados no diff config.git_gc_args=Argumentos do GC config.git_migrate_timeout=Tempo limite de migração config.git_mirror_timeout=Tempo limite de atualização de espelhamento -config.git_clone_timeout=Tempo limite para operação de clone +config.git_clone_timeout=Tempo Limite para Operação de Clone config.git_pull_timeout=Tempo limite para operação de pull config.git_gc_timeout=Tempo limite para execução do GC -config.log_config=Configuração de log +config.log_config=Configuração de Log config.logger_name_fmt=Logger: %s config.disabled_logger=Desabilitado config.access_log_mode=Modo log Access diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index e69b7729a0..2f5a969b6b 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -736,14 +736,14 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err // Default branch only updated if changed and exist or the repository is empty updateRepoLicense := false if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, *opts.DefaultBranch)) { + repo.DefaultBranch = *opts.DefaultBranch if !repo.IsEmpty { - if err := gitrepo.SetDefaultBranch(ctx, ctx.Repo.Repository, *opts.DefaultBranch); err != nil { + if err := gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { ctx.APIErrorInternal(err) return err } updateRepoLicense = true } - repo.DefaultBranch = *opts.DefaultBranch } if err := repo_service.UpdateRepository(ctx, repo, visibilityChanged); err != nil { diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 27837196af..d2fdf02d97 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -707,12 +707,6 @@ func PrepareCompareDiff( } func getBranchesAndTagsForRepo(ctx gocontext.Context, repo *repo_model.Repository) (branches, tags []string, err error) { - gitRepo, err := gitrepo.OpenRepository(ctx, repo) - if err != nil { - return nil, nil, err - } - defer gitRepo.Close() - branches, err = git_model.FindBranchNames(ctx, git_model.FindBranchOptions{ RepoID: repo.ID, ListOptions: db.ListOptionsAll, @@ -721,7 +715,7 @@ func getBranchesAndTagsForRepo(ctx gocontext.Context, repo *repo_model.Repositor if err != nil { return nil, nil, err } - tags, err = gitRepo.GetTags(0, 0) + tags, err = repo_model.GetTagNamesByRepoID(ctx, repo.ID) if err != nil { return nil, nil, err } diff --git a/services/repository/branch.go b/services/repository/branch.go index 793cbc9bec..1c2c1a4fae 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -532,8 +532,8 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R // database branch record not exist or it's a deleted branch notExist := git_model.IsErrBranchNotExist(err) || rawBranch.IsDeleted - commit, err := gitRepo.GetBranchCommit(branchName) - if err != nil { + branchCommit, err := gitRepo.GetBranchCommit(branchName) + if err != nil && !errors.Is(err, util.ErrNotExist) { return err } @@ -552,6 +552,9 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R return fmt.Errorf("DeleteBranch: %v", err) } } + if branchCommit == nil { + return nil + } return gitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ Force: true, @@ -560,20 +563,24 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R return err } - objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) + if branchCommit == nil { + return nil + } // Don't return error below this + + objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) if err := PushUpdate( &repo_module.PushUpdateOptions{ RefFullName: git.RefNameFromBranch(branchName), - OldCommitID: commit.ID.String(), + OldCommitID: branchCommit.ID.String(), NewCommitID: objectFormat.EmptyObjectID().String(), PusherID: doer.ID, PusherName: doer.Name, RepoUserName: repo.OwnerName, RepoName: repo.Name, }); err != nil { - log.Error("Update: %v", err) + log.Error("PushUpdateOptions: %v", err) } return nil diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 0a955406e2..2edfa90acf 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -43,7 +43,7 @@ func InitWiki(ctx context.Context, repo *repo_model.Repository) error { return fmt.Errorf("InitRepository: %w", err) } else if err = gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { return fmt.Errorf("createDelegateHooks: %w", err) - } else if _, _, err = git.NewCommand("symbolic-ref", "HEAD").AddDynamicArguments(git.BranchPrefix+repo.DefaultWikiBranch).RunStdString(ctx, &git.RunOpts{Dir: repo.WikiPath()}); err != nil { + } else if err = gitrepo.SetDefaultBranch(ctx, repo.WikiStorageRepo(), repo.DefaultWikiBranch); err != nil { return fmt.Errorf("unable to set default wiki branch to %q: %w", repo.DefaultWikiBranch, err) } return nil