Compare commits

...

12 commits

Author SHA1 Message Date
Earl Warren f45a6cb3b7 Merge pull request '[v7.0/forgejo] FIX gogs migration if gogs is hosted at a subpath' (#3588) from bp-v7.0/forgejo-4a2959b into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3588
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-05-03 17:17:00 +00:00
Otto 5b6a375d05 Merge pull request '[v7.0/forgejo] Fix text selection color' (#3611) from bp-v7.0/forgejo-787b16a into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3611
Reviewed-by: Otto <otto@codeberg.org>
2024-05-02 22:06:17 +00:00
Earl Warren ac34a68a93 Merge pull request 'Port Fix checkbox field markup' (#3592) from 0ko/forgejo:a-commit into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3592
Reviewed-by: Otto <otto@codeberg.org>
2024-05-02 18:10:20 +00:00
Earl Warren fcf85b12af Merge pull request '[v7.0/forgejo] UI: Actions: Replace runs list description semicolon' (#3582) from bp-v7.0/forgejo-870a1c8 into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3582
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-05-02 18:01:28 +00:00
Earl Warren 2949bbcad1 Merge pull request '[v7.0/forgejo] Show repo count in blocked users tab' (#3609) from bp-v7.0/forgejo-d50efa6 into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3609
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
2024-05-02 17:49:17 +00:00
0ko b23d4ec4bb [THEME] fix text selection color
regression of c2280a2009

(cherry picked from commit 787b16a7be)
2024-05-02 17:46:07 +00:00
Panagiotis "Ivory" Vasilopoulos d758633c91 UI: Actions: Replace runs list description semicolon
The current format makes the text look somewhat like this:

```
testing.yml #15065 :Commit 103306f00c pushed by n0toose
```

This looks wrong. We will have to work on that list at a later point
in time anyways, as well as make the way that we separate information
in subheaders in lists like this one more consistent.

However, this should do for now.

This change should make each entry look like this instead:

```
testing.yml #15065 - Commit 103306f00c pushed by n0toose
```

(cherry picked from commit 870a1c85c7)
2024-05-02 17:10:28 +00:00
JakobDev d449fcff0a Show repo count in blocked users tab (#3601)
Fixes #3595

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3601
Reviewed-by: Otto <otto@codeberg.org>
Co-authored-by: JakobDev <jakobdev@gmx.de>
Co-committed-by: JakobDev <jakobdev@gmx.de>
(cherry picked from commit d50efa626a)
2024-05-02 17:10:06 +00:00
Earl Warren a7400b1812 Merge pull request 'Upgrade github.com/editorconfig-checker/editorconfig-checker to v2.8.0' (#3610) from earl-warren/forgejo:wip-lint-editorconfig into v7.0/forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3610
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Reviewed-by: thefox <thefox@noreply.codeberg.org>
Reviewed-by: Otto <otto@codeberg.org>
2024-05-02 17:09:33 +00:00
Earl Warren a6d31a30a2
Upgrade github.com/editorconfig-checker/editorconfig-checker to v2.8.0
Manual backport: https://codeberg.org/forgejo/forgejo/pulls/3181
because it conflicts with a number of evolutions in how the tools are
upgraded in the development branch.
2024-05-02 17:38:26 +01:00
silverwind b917571d81 Fix checkbox field markup (#30666)
Fixes https://github.com/go-gitea/gitea/issues/30664.

Previous use was not a supported way by fomantic and the misuse only
became visible after the checkbox migration.

(cherry picked from commit 1a2ae64b16f10b8d1e17197d18b9eb373faf58db)
2024-05-01 23:31:42 +05:00
varp0n c91f7d3599 FIX gogs migration if gogs is hosted at a subpath (#3572)
Also add a test for GogsDownloaderFactory.New() to make sure
that the URL of the source repository is parsed correctly.

When the source gogs instance is hosted at a subpath like `https://git.example.com/gogs/<username>/<reponame>` the migration fails.
This PR fixes that.

Co-authored-by: hecker <tomas.hecker@gmail.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3572
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: varp0n <tom@gkstn.de>
Co-committed-by: varp0n <tom@gkstn.de>
(cherry picked from commit 4a2959b3ec)
2024-05-01 16:32:17 +00:00
13 changed files with 291 additions and 13 deletions

View file

@ -27,7 +27,7 @@ DIFF ?= diff --unified
XGO_VERSION := go-1.21.x
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.49.0
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.7.0
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v2/cmd/editorconfig-checker@2.8.0
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.1
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11

View file

@ -0,0 +1 @@
Fix gogs migration if gogs is hosted at a subpath

View file

@ -0,0 +1 @@
Fix text selection color

View file

@ -10,6 +10,7 @@ import (
"code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
shared_user "code.gitea.io/gitea/routers/web/shared/user"
"code.gitea.io/gitea/services/context"
user_service "code.gitea.io/gitea/services/user"
)
@ -27,6 +28,12 @@ func BlockedUsers(ctx *context.Context) {
return
}
err = shared_user.LoadHeaderCount(ctx)
if err != nil {
ctx.ServerError("LoadHeaderCount", err)
return
}
ctx.Data["BlockedUsers"] = blockedUsers
ctx.HTML(http.StatusOK, tplBlockedUsers)

View file

@ -38,17 +38,24 @@ func (f *GogsDownloaderFactory) New(ctx context.Context, opts base.MigrateOption
return nil, err
}
baseURL := u.Scheme + "://" + u.Host
repoNameSpace := strings.TrimSuffix(u.Path, ".git")
repoNameSpace = strings.Trim(repoNameSpace, "/")
fields := strings.Split(repoNameSpace, "/")
if len(fields) < 2 {
numFields := len(fields)
if numFields < 2 {
return nil, fmt.Errorf("invalid path: %s", repoNameSpace)
}
log.Trace("Create gogs downloader. BaseURL: %s RepoOwner: %s RepoName: %s", baseURL, fields[0], fields[1])
return NewGogsDownloader(ctx, baseURL, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, fields[0], fields[1]), nil
repoOwner := fields[numFields-2]
repoName := fields[numFields-1]
u.Path = ""
u = u.JoinPath(fields[:numFields-2]...)
baseURL := u.String()
log.Trace("Create gogs downloader. BaseURL: %s RepoOwner: %s RepoName: %s", baseURL, repoOwner, repoName)
return NewGogsDownloader(ctx, baseURL, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, repoOwner, repoName), nil
}
// GitServiceType returns the type of git service

View file

@ -137,3 +137,87 @@ func TestGogsDownloadRepo(t *testing.T) {
_, _, err = downloader.GetPullRequests(1, 3)
assert.Error(t, err)
}
func TestGogsDownloaderFactory_New(t *testing.T) {
tests := []struct {
name string
args base.MigrateOptions
baseURL string
repoOwner string
repoName string
wantErr bool
}{
{
name: "Gogs_at_root",
args: base.MigrateOptions{
CloneAddr: "https://git.example.com/user/repo.git",
AuthUsername: "username",
AuthPassword: "password",
AuthToken: "authtoken",
},
baseURL: "https://git.example.com/",
repoOwner: "user",
repoName: "repo",
wantErr: false,
},
{
name: "Gogs_at_sub_path",
args: base.MigrateOptions{
CloneAddr: "https://git.example.com/subpath/user/repo.git",
AuthUsername: "username",
AuthPassword: "password",
AuthToken: "authtoken",
},
baseURL: "https://git.example.com/subpath",
repoOwner: "user",
repoName: "repo",
wantErr: false,
},
{
name: "Gogs_at_2nd_sub_path",
args: base.MigrateOptions{
CloneAddr: "https://git.example.com/sub1/sub2/user/repo.git",
AuthUsername: "username",
AuthPassword: "password",
AuthToken: "authtoken",
},
baseURL: "https://git.example.com/sub1/sub2",
repoOwner: "user",
repoName: "repo",
wantErr: false,
},
{
name: "Gogs_URL_too_short",
args: base.MigrateOptions{
CloneAddr: "https://git.example.com/repo.git",
AuthUsername: "username",
AuthPassword: "password",
AuthToken: "authtoken",
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
f := &GogsDownloaderFactory{}
opts := base.MigrateOptions{
CloneAddr: tt.args.CloneAddr,
AuthUsername: tt.args.AuthUsername,
AuthPassword: tt.args.AuthPassword,
AuthToken: tt.args.AuthToken,
}
got, err := f.New(context.Background(), opts)
if (err != nil) != tt.wantErr {
t.Errorf("GogsDownloaderFactory.New() error = %v, wantErr %v", err, tt.wantErr)
return
} else if err != nil {
return
}
assert.IsType(t, &GogsDownloader{}, got)
assert.EqualValues(t, tt.baseURL, got.(*GogsDownloader).baseURL)
assert.EqualValues(t, tt.repoOwner, got.(*GogsDownloader).repoOwner)
assert.EqualValues(t, tt.repoName, got.(*GogsDownloader).repoName)
})
}
}

View file

@ -6,6 +6,7 @@
{{if .RepoCount}}
<div class="ui small label">{{.RepoCount}}</div>
{{end}}
<span hidden test-name="repository-count">{{.RepoCount}}</span>
</a>
{{if .CanReadProjects}}
<a class="{{if .PageIsViewProjects}}active {{end}}item" href="{{$.Org.HomeLink}}/-/projects">
@ -13,6 +14,7 @@
{{if .ProjectCount}}
<div class="ui small label">{{.ProjectCount}}</div>
{{end}}
<span hidden test-name="project-count">{{.ProjectCount}}</span>
</a>
{{end}}
{{if and .IsPackageEnabled .CanReadPackages}}
@ -31,6 +33,7 @@
<div class="ui small label">{{.NumMembers}}</div>
</a>
{{end}}
<span hidden test-name="member-count">{{.NumMembers}}</span>
{{if .IsOrganizationMember}}
<a class="{{if $.PageIsOrgTeams}}active {{end}}item" href="{{$.OrgLink}}/teams">
{{svg "octicon-people"}} {{ctx.Locale.Tr "org.teams"}}
@ -39,6 +42,7 @@
{{end}}
</a>
{{end}}
<span hidden test-name="team-count">{{.NumTeams}}</span>
{{if .IsOrganizationOwner}}
<a id="settings-btn" class="{{if .PageIsOrgSettings}}active {{end}}right item" href="{{.OrgLink}}/settings">
{{svg "octicon-tools"}} {{ctx.Locale.Tr "repo.settings"}}

View file

@ -15,7 +15,7 @@
{{if .Title}}{{.Title}}{{else}}{{ctx.Locale.Tr "actions.runs.empty_commit_message"}}{{end}}
</a>
<div class="flex-item-body">
<b>{{if not $.CurWorkflow}}{{.WorkflowID}} {{end}}#{{.Index}}</b>:
<b>{{if not $.CurWorkflow}}{{.WorkflowID}} {{end}}#{{.Index}}</b> -
{{- if .ScheduleID -}}
{{ctx.Locale.Tr "actions.runs.scheduled"}}
{{- else -}}

View file

@ -10,6 +10,7 @@
{{if .RepoCount}}
<div class="ui small label">{{.RepoCount}}</div>
{{end}}
<span hidden test-name="repository-count">{{.RepoCount}}</span>
</a>
{{if or .ContextUser.IsIndividual .CanReadProjects}}
<a href="{{.ContextUser.HomeLink}}/-/projects" class="{{if .PageIsViewProjects}}active {{end}}item">
@ -17,6 +18,7 @@
{{if .ProjectCount}}
<div class="ui small label">{{.ProjectCount}}</div>
{{end}}
<span hidden test-name="project-count">{{.ProjectCount}}</span>
</a>
{{end}}
{{if and .IsPackageEnabled (or .ContextUser.IsIndividual .CanReadPackages)}}

View file

@ -41,9 +41,11 @@
<label for="redirect-uris">{{ctx.Locale.Tr "settings.oauth2_redirect_uris"}}</label>
<textarea name="redirect_uris" id="redirect-uris" required>{{StringUtils.Join .App.RedirectURIs "\n"}}</textarea>
</div>
<div class="field ui checkbox {{if .Err_ConfidentialClient}}error{{end}}">
<label>{{ctx.Locale.Tr "settings.oauth2_confidential_client"}}</label>
<input type="checkbox" name="confidential_client" {{if .App.ConfidentialClient}}checked{{end}}>
<div class="field {{if .Err_ConfidentialClient}}error{{end}}">
<div class="ui checkbox">
<label>{{ctx.Locale.Tr "settings.oauth2_confidential_client"}}</label>
<input type="checkbox" name="confidential_client" {{if .App.ConfidentialClient}}checked{{end}}>
</div>
</div>
<button class="ui primary button">
{{ctx.Locale.Tr "settings.save_application"}}

View file

@ -61,9 +61,11 @@
<label for="redirect-uris">{{ctx.Locale.Tr "settings.oauth2_redirect_uris"}}</label>
<textarea name="redirect_uris" id="redirect-uris" required></textarea>
</div>
<div class="field ui checkbox {{if .Err_ConfidentialClient}}error{{end}}">
<label>{{ctx.Locale.Tr "settings.oauth2_confidential_client"}}</label>
<input type="checkbox" name="confidential_client" checked>
<div class="field {{if .Err_ConfidentialClient}}error{{end}}">
<div class="ui checkbox">
<label>{{ctx.Locale.Tr "settings.oauth2_confidential_client"}}</label>
<input type="checkbox" name="confidential_client" checked>
</div>
</div>
<button class="ui primary button">
{{ctx.Locale.Tr "settings.create_oauth2_application_button"}}

View file

@ -0,0 +1,167 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"fmt"
"net/http"
"strconv"
"testing"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/organization"
project_model "code.gitea.io/gitea/models/project"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/tests"
"github.com/PuerkitoBio/goquery"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type userCountTest struct {
doer *user_model.User
user *user_model.User
session *TestSession
repoCount int64
projectCount int64
memberCount int64
teamCount int64
}
func (countTest *userCountTest) Init(t *testing.T, doerID, userID int64) {
countTest.doer = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: doerID})
countTest.user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
countTest.session = loginUser(t, countTest.doer.Name)
var err error
countTest.repoCount, err = repo_model.CountRepository(db.DefaultContext, &repo_model.SearchRepoOptions{
Actor: countTest.doer,
OwnerID: countTest.user.ID,
Private: true,
Collaborate: optional.Some(false),
})
require.NoError(t, err)
var projectType project_model.Type
if countTest.user.IsOrganization() {
projectType = project_model.TypeOrganization
} else {
projectType = project_model.TypeIndividual
}
countTest.projectCount, err = db.Count[project_model.Project](db.DefaultContext, project_model.SearchOptions{
OwnerID: countTest.user.ID,
IsClosed: optional.Some(false),
Type: projectType,
})
require.NoError(t, err)
if !countTest.user.IsOrganization() {
return
}
org := (*organization.Organization)(countTest.user)
isMember, err := org.IsOrgMember(db.DefaultContext, countTest.doer.ID)
require.NoError(t, err)
countTest.memberCount, err = organization.CountOrgMembers(db.DefaultContext, &organization.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: !isMember,
})
require.NoError(t, err)
teams, err := org.LoadTeams(db.DefaultContext)
require.NoError(t, err)
countTest.teamCount = int64(len(teams))
}
func (countTest *userCountTest) getCount(doc *goquery.Document, name string) (int64, error) {
selection := doc.Find(fmt.Sprintf("[test-name=\"%s\"]", name))
if selection.Length() != 1 {
return 0, fmt.Errorf("%s was not found", name)
}
return strconv.ParseInt(selection.Text(), 10, 64)
}
func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) {
t.Run(page, func(t *testing.T) {
var userLink string
if orgLink {
userLink = countTest.user.OrganisationLink()
} else {
userLink = countTest.user.HomeLink()
}
req := NewRequestf(t, "GET", "%s/%s", userLink, page)
resp := countTest.session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
repoCount, err := countTest.getCount(htmlDoc.doc, "repository-count")
require.NoError(t, err)
assert.Equal(t, countTest.repoCount, repoCount)
projectCount, err := countTest.getCount(htmlDoc.doc, "project-count")
require.NoError(t, err)
assert.Equal(t, countTest.projectCount, projectCount)
if !countTest.user.IsOrganization() {
return
}
memberCount, err := countTest.getCount(htmlDoc.doc, "member-count")
require.NoError(t, err)
assert.Equal(t, countTest.memberCount, memberCount)
teamCount, err := countTest.getCount(htmlDoc.doc, "team-count")
require.NoError(t, err)
assert.Equal(t, countTest.teamCount, teamCount)
})
}
func TestFrontendHeaderCountUser(t *testing.T) {
defer tests.PrepareTestEnv(t)()
countTest := new(userCountTest)
countTest.Init(t, 2, 2)
countTest.TestPage(t, "", false)
countTest.TestPage(t, "?tab=repositories", false)
countTest.TestPage(t, "-/projects", false)
countTest.TestPage(t, "-/packages", false)
countTest.TestPage(t, "?tab=activity", false)
countTest.TestPage(t, "?tab=stars", false)
}
func TestFrontendHeaderCountOrg(t *testing.T) {
defer tests.PrepareTestEnv(t)()
countTest := new(userCountTest)
countTest.Init(t, 15, 17)
countTest.TestPage(t, "", false)
countTest.TestPage(t, "-/projects", false)
countTest.TestPage(t, "-/packages", false)
countTest.TestPage(t, "members", true)
countTest.TestPage(t, "teams", true)
countTest.TestPage(t, "settings", true)
countTest.TestPage(t, "settings/hooks", true)
countTest.TestPage(t, "settings/labels", true)
countTest.TestPage(t, "settings/applications", true)
countTest.TestPage(t, "settings/packages", true)
countTest.TestPage(t, "settings/actions/runners", true)
countTest.TestPage(t, "settings/actions/secrets", true)
countTest.TestPage(t, "settings/actions/variables", true)
countTest.TestPage(t, "settings/blocked_users", true)
countTest.TestPage(t, "settings/delete", true)
}

View file

@ -141,6 +141,7 @@
/* other colors */
--color-gold: #b1983b;
--color-white: #ffffff;
--color-pure-black: #000000;
--color-diff-removed-word-bg: #783030;
--color-diff-added-word-bg: #255c39;
--color-diff-removed-row-bg: #432121;
@ -304,7 +305,7 @@ i.grey.icon.icon.icon.icon {
}
::selection {
background: var(--steel-100) !important;
color: var(--color-white) !important;
color: var(--color-pure-black) !important;
}
strong.attention-important, svg.attention-important {
color: var(--color-violet-light);