Compare commits

..

No commits in common. "0bd05a9f1cbf7839d943e5812f84bdeb7d95dfee" and "bb25f85ce8f559fa3e9f462ad1027b5b5a8e2da3" have entirely different histories.

20 changed files with 21 additions and 137 deletions

View File

@ -4,53 +4,6 @@ This changelog goes through all the changes that have been made in each release
without substantial changes to our git log; to see the highlights of what has without substantial changes to our git log; to see the highlights of what has
been added to each release, please refer to the [blog](https://blog.gitea.io). been added to each release, please refer to the [blog](https://blog.gitea.io).
## [1.19.2](https://github.com/go-gitea/gitea/releases/tag/1.19.2) - 2023-04-26
* SECURITY
* Require repo scope for PATs for private repos and basic authentication (#24362) (#24364)
* Only delete secrets belonging to its owner (#24284) (#24286)
* API
* Fix typo in API route (#24310) (#24332)
* Fix access token issue on some public endpoints (#24194) (#24259)
* ENHANCEMENTS
* Fix broken clone script on an empty archived repo (#24339) (#24348)
* Fix Monaco IOS keyboard button (#24341) (#24347)
* Don't set meta `theme-color` by default (#24340) (#24346)
* Wrap too long push mirror addresses (#21120) (#24334)
* Add --font-weight-bold and set previous bold to 601 (#24307) (#24331)
* Unify nightly naming across binaries and docker images (#24116) (#24308)
* Fix footer display (#24251) (#24269)
* Fix label color, fix divider in dropdown (#24215) (#24244)
* Vertical widths of containers removed (#24184) (#24211)
* Use correct locale key for forks page (#24172) (#24175)
* Sort repo topic labels by name (#24123) (#24153)
* Highlight selected file in the PR file tree (#23947) (#24126)
* BUGFIXES
* Fix auth check bug (#24382) (#24387)
* Add tags list for repos whose release setting is disabled (#23465) (#24369)
* Fix wrong error info in RepoRefForAPI (#24344) (#24351)
* Fix no edit/close/delete button in org repo project view page (#24349)
* Respect the REGISTER_MANUAL_CONFIRM setting when registering via OIDC (#24035) (#24333)
* Remove org users who belong to no teams (#24247) (#24313)
* Fix bug when deleting wiki with no code write permission (#24274) (#24295)
* Handle canceled workflow as a warning instead of a fail (#24282) (#24292)
* Load reviewer for comments when dismissing a review (#24281) (#24288)
* Show commit history for closed/merged PRs (#24238) (#24261)
* Fix owner team access mode value in team_unit table (#24224)
* Fix issue attachment handling (#24202) (#24221)
* Fix incorrect CORS default values (#24206) (#24217)
* Fix template error in pull request with deleted head repo (#24192) (#24216)
* Don't list root repository on compare page if pulls not allowed (#24183) (#24210)
* Fix calReleaseNumCommitsBehind (#24148) (#24197)
* Fix Org edit page bugs: renaming detection, maxlength (#24161) (#24171)
* Update redis library to support redis v7 (#24114) (#24156)
* Use 1.18's aria role for dropdown menus (#24144) (#24155)
* Fix 2-dot direct compare to use the right base commit (#24133) (#24150)
* Fix incorrect server error content in RunnersList (#24118) (#24121)
* Fix mismatch between hook events and github event types (#24048) (#24091)
* BUILD
* Support converting varchar to nvarchar for mssql database (#24105) (#24168)
## [1.19.1](https://github.com/go-gitea/gitea/releases/tag/v1.19.1) - 2023-04-12 ## [1.19.1](https://github.com/go-gitea/gitea/releases/tag/v1.19.1) - 2023-04-12
* BREAKING * BREAKING

View File

@ -82,11 +82,6 @@ func main() {
panic(err) panic(err)
} }
// Ensure file has a final newline
if jsonBytes[len(jsonBytes)-1] != '\n' {
jsonBytes = append(jsonBytes, '\n')
}
err = os.WriteFile(out, jsonBytes, 0o644) err = os.WriteFile(out, jsonBytes, 0o644)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html{{ with site.LanguageCode | default site.Language.Lang }} lang="{{ . }}"{{ end }}>
<head>
<meta charset="utf-8">
<title>{{ .Permalink }}</title>
<link rel="canonical" href="{{ .Permalink }}">
<meta name="robots" content="noindex">
<noscript><meta http-equiv="refresh" content="0; url={{ .Permalink }}"></noscript>
<script>
window.location = "{{ .Permalink }}" + window.location.search + window.location.hash;
</script>
</head>
</html>

View File

@ -726,9 +726,12 @@ func GetRepositoriesMapByIDs(ids []int64) (map[int64]*Repository, error) {
return repos, db.GetEngine(db.DefaultContext).In("id", ids).Find(&repos) return repos, db.GetEngine(db.DefaultContext).In("id", ids).Find(&repos)
} }
// IsRepositoryModelOrDirExist returns true if the repository with given name under user has already existed. // IsRepositoryExist returns true if the repository with given name under user has already existed.
func IsRepositoryModelOrDirExist(ctx context.Context, u *user_model.User, repoName string) (bool, error) { func IsRepositoryExist(ctx context.Context, u *user_model.User, repoName string) (bool, error) {
has, err := IsRepositoryModelExist(ctx, u, repoName) has, err := db.GetEngine(ctx).Get(&Repository{
OwnerID: u.ID,
LowerName: strings.ToLower(repoName),
})
if err != nil { if err != nil {
return false, err return false, err
} }
@ -736,13 +739,6 @@ func IsRepositoryModelOrDirExist(ctx context.Context, u *user_model.User, repoNa
return has || isDir, err return has || isDir, err
} }
func IsRepositoryModelExist(ctx context.Context, u *user_model.User, repoName string) (bool, error) {
return db.GetEngine(ctx).Get(&Repository{
OwnerID: u.ID,
LowerName: strings.ToLower(repoName),
})
}
// GetTemplateRepo populates repo.TemplateRepo for a generated repository and // GetTemplateRepo populates repo.TemplateRepo for a generated repository and
// returns an error on failure (NOTE: no error is returned for // returns an error on failure (NOTE: no error is returned for
// non-generated repositories, and TemplateRepo will be left untouched) // non-generated repositories, and TemplateRepo will be left untouched)

View File

@ -116,7 +116,7 @@ func CheckCreateRepository(doer, u *user_model.User, name string, overwriteOrAdo
return err return err
} }
has, err := IsRepositoryModelOrDirExist(db.DefaultContext, u, name) has, err := IsRepositoryExist(db.DefaultContext, u, name)
if err != nil { if err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err) return fmt.Errorf("IsRepositoryExist: %w", err)
} else if has { } else if has {
@ -147,7 +147,7 @@ func ChangeRepositoryName(doer *user_model.User, repo *Repository, newRepoName s
return err return err
} }
has, err := IsRepositoryModelOrDirExist(db.DefaultContext, repo.Owner, newRepoName) has, err := IsRepositoryExist(db.DefaultContext, repo.Owner, newRepoName)
if err != nil { if err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err) return fmt.Errorf("IsRepositoryExist: %w", err)
} else if has { } else if has {

View File

@ -172,7 +172,7 @@ func CreatePendingRepositoryTransfer(ctx context.Context, doer, newOwner *user_m
} }
// Check if new owner has repository with same name. // Check if new owner has repository with same name.
if has, err := repo_model.IsRepositoryModelExist(ctx, newOwner, repo.Name); err != nil { if has, err := repo_model.IsRepositoryExist(ctx, newOwner, repo.Name); err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err) return fmt.Errorf("IsRepositoryExist: %w", err)
} else if has { } else if has {
return repo_model.ErrRepoAlreadyExist{ return repo_model.ErrRepoAlreadyExist{
@ -249,7 +249,7 @@ func TransferOwnership(doer *user_model.User, newOwnerName string, repo *repo_mo
newOwnerName = newOwner.Name // ensure capitalisation matches newOwnerName = newOwner.Name // ensure capitalisation matches
// Check if new owner has repository with same name. // Check if new owner has repository with same name.
if has, err := repo_model.IsRepositoryModelOrDirExist(ctx, newOwner, repo.Name); err != nil { if has, err := repo_model.IsRepositoryExist(ctx, newOwner, repo.Name); err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err) return fmt.Errorf("IsRepositoryExist: %w", err)
} else if has { } else if has {
return repo_model.ErrRepoAlreadyExist{ return repo_model.ErrRepoAlreadyExist{

View File

@ -35,7 +35,7 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
return err return err
} }
has, err := repo_model.IsRepositoryModelExist(ctx, u, repo.Name) has, err := repo_model.IsRepositoryExist(ctx, u, repo.Name)
if err != nil { if err != nil {
return fmt.Errorf("IsRepositoryExist: %w", err) return fmt.Errorf("IsRepositoryExist: %w", err)
} else if has { } else if has {

View File

@ -18,7 +18,3 @@ func (su *StringUtils) HasPrefix(s, prefix string) bool {
func (su *StringUtils) Contains(s, substr string) bool { func (su *StringUtils) Contains(s, substr string) bool {
return strings.Contains(s, substr) return strings.Contains(s, substr)
} }
func (su *StringUtils) Split(s, sep string) []string {
return strings.Split(s, sep)
}

View File

@ -13,7 +13,6 @@ import (
"code.gitea.io/gitea/modules/options" "code.gitea.io/gitea/modules/options"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/translation/i18n" "code.gitea.io/gitea/modules/translation/i18n"
"code.gitea.io/gitea/modules/util"
"golang.org/x/text/language" "golang.org/x/text/language"
"golang.org/x/text/message" "golang.org/x/text/message"
@ -242,12 +241,5 @@ func (l *locale) TrN(cnt any, key1, keyN string, args ...any) string {
func (l *locale) PrettyNumber(v any) string { func (l *locale) PrettyNumber(v any) string {
// TODO: this mechanism is not good enough, the complete solution is to switch the translation system to ICU message format // TODO: this mechanism is not good enough, the complete solution is to switch the translation system to ICU message format
if s, ok := v.(string); ok {
if num, err := util.ToInt64(s); err == nil {
v = num
} else if num, err := util.ToFloat64(s); err == nil {
v = num
}
}
return l.msgPrinter.Sprintf("%v", number.Decimal(v)) return l.msgPrinter.Sprintf("%v", number.Decimal(v))
} }

View File

@ -21,12 +21,7 @@ func TestPrettyNumber(t *testing.T) {
l := NewLocale("id-ID") l := NewLocale("id-ID")
assert.EqualValues(t, "1.000.000", l.PrettyNumber(1000000)) assert.EqualValues(t, "1.000.000", l.PrettyNumber(1000000))
assert.EqualValues(t, "1.000.000,1", l.PrettyNumber(1000000.1))
assert.EqualValues(t, "1.000.000", l.PrettyNumber("1000000"))
assert.EqualValues(t, "1.000.000", l.PrettyNumber("1000000.0"))
assert.EqualValues(t, "1.000.000,1", l.PrettyNumber("1000000.1"))
l = NewLocale("nosuch") l = NewLocale("nosuch")
assert.EqualValues(t, "1,000,000", l.PrettyNumber(1000000)) assert.EqualValues(t, "1,000,000", l.PrettyNumber(1000000))
assert.EqualValues(t, "1,000,000.1", l.PrettyNumber(1000000.1))
} }

View File

@ -2380,7 +2380,7 @@ branch.already_exists = A branch named "%s" already exists.
branch.delete_head = Delete branch.delete_head = Delete
branch.delete = Delete Branch "%s" branch.delete = Delete Branch "%s"
branch.delete_html = Delete Branch branch.delete_html = Delete Branch
branch.delete_desc = Deleting a branch is permanent. Although the deleted branch may exist for a short time before cleaning up, in most cases it CANNOT be undone. Continue? branch.delete_desc = Deleting a branch is permanent. It <strong>CANNOT</strong> be undone. Continue?
branch.deletion_success = Branch "%s" has been deleted. branch.deletion_success = Branch "%s" has been deleted.
branch.deletion_failed = Failed to delete branch "%s". branch.deletion_failed = Failed to delete branch "%s".
branch.delete_branch_has_new_commits = Branch "%s" cannot be deleted because new commits have been added after merging. branch.delete_branch_has_new_commits = Branch "%s" cannot be deleted because new commits have been added after merging.

View File

@ -61,7 +61,7 @@ new_project_column=创建列
manage_org=管理我的组织 manage_org=管理我的组织
admin_panel=管理后台 admin_panel=管理后台
account_settings=帐户设置 account_settings=帐户设置
settings=设置 settings=帐户设置
your_profile=个人信息 your_profile=个人信息
your_starred=已点赞 your_starred=已点赞
your_settings=设置 your_settings=设置

View File

@ -95,7 +95,7 @@ func AdoptRepository(ctx *context.APIContext) {
} }
// check not a repo // check not a repo
has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName) has, err := repo_model.IsRepositoryExist(ctx, ctxUser, repoName)
if err != nil { if err != nil {
ctx.InternalServerError(err) ctx.InternalServerError(err)
return return
@ -157,7 +157,7 @@ func DeleteUnadoptedRepository(ctx *context.APIContext) {
} }
// check not a repo // check not a repo
has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName) has, err := repo_model.IsRepositoryExist(ctx, ctxUser, repoName)
if err != nil { if err != nil {
ctx.InternalServerError(err) ctx.InternalServerError(err)
return return

View File

@ -133,7 +133,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) {
repoName := dirSplit[1] repoName := dirSplit[1]
// check not a repo // check not a repo
has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName) has, err := repo_model.IsRepositoryExist(ctx, ctxUser, repoName)
if err != nil { if err != nil {
ctx.ServerError("IsRepositoryExist", err) ctx.ServerError("IsRepositoryExist", err)
return return

View File

@ -31,7 +31,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) {
root := user_model.UserPath(ctxUser.LowerName) root := user_model.UserPath(ctxUser.LowerName)
// check not a repo // check not a repo
has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, dir) has, err := repo_model.IsRepositoryExist(ctx, ctxUser, dir)
if err != nil { if err != nil {
ctx.ServerError("IsRepositoryExist", err) ctx.ServerError("IsRepositoryExist", err)
return return

View File

@ -206,7 +206,7 @@ func DeleteUnadoptedRepository(ctx context.Context, doer, u *user_model.User, re
} }
} }
if exist, err := repo_model.IsRepositoryModelExist(ctx, u, repoName); err != nil { if exist, err := repo_model.IsRepositoryExist(ctx, u, repoName); err != nil {
return err return err
} else if exist { } else if exist {
return repo_model.ErrRepoAlreadyExist{ return repo_model.ErrRepoAlreadyExist{

View File

@ -71,7 +71,7 @@
{{$userName}} {{$userName}}
{{end}} {{end}}
</span> </span>
<span class="time gt-df gt-ac">{{DateTime "full" $commit.Date}}</span> <span class="time gt-df gt-ac">{{$commit.Date}}</span>
{{end}} {{end}}
</li> </li>
{{end}} {{end}}

View File

@ -15,9 +15,7 @@
</div> </div>
{{end}} {{end}}
<div class="item"> <div class="item">
{{$fileSizeFormatted := FileSize .Repository.Size}}{{/* the formatted string is always "{val} {unit}" */}} <span>{{svg "octicon-database"}} <b>{{FileSize .Repository.Size}}</b></span>
{{$fileSizeFields := StringUtils.Split $fileSizeFormatted " "}}
<span>{{svg "octicon-database"}} <b>{{.locale.PrettyNumber (index $fileSizeFields 0)}}</b> {{index $fileSizeFields 1}}</span>
</div> </div>
{{end}} {{end}}
</div> </div>

View File

@ -4,7 +4,6 @@
package integration package integration
import ( import (
"io"
"net/http" "net/http"
"net/url" "net/url"
"testing" "testing"
@ -160,30 +159,3 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2) req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
MakeRequest(t, req, http.StatusOK) MakeRequest(t, req, http.StatusOK)
} }
func TestAPIGetContentsRefFormats(t *testing.T) {
onGiteaRun(t, func(t *testing.T, u *url.URL) {
file := "README.md"
sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d"
content := "# repo1\n\nDescription for repo1"
noRef := setting.AppURL + "api/v1/repos/user2/repo1/raw/" + file
refInPath := setting.AppURL + "api/v1/repos/user2/repo1/raw/" + sha + "/" + file
refInQuery := setting.AppURL + "api/v1/repos/user2/repo1/raw/" + file + "?ref=" + sha
resp := MakeRequest(t, NewRequest(t, http.MethodGet, noRef), http.StatusOK)
raw, err := io.ReadAll(resp.Body)
assert.NoError(t, err)
assert.EqualValues(t, content, string(raw))
resp = MakeRequest(t, NewRequest(t, http.MethodGet, refInPath), http.StatusOK)
raw, err = io.ReadAll(resp.Body)
assert.NoError(t, err)
assert.EqualValues(t, content, string(raw))
resp = MakeRequest(t, NewRequest(t, http.MethodGet, refInQuery), http.StatusOK)
raw, err = io.ReadAll(resp.Body)
assert.NoError(t, err)
assert.EqualValues(t, content, string(raw))
})
}