Skip to content

Commit 8125b84

Browse files
authored
Merge branch 'master' into fix-go-gitea#6716
2 parents 508aa4a + e8f4c77 commit 8125b84

File tree

18 files changed

+270
-38
lines changed

18 files changed

+270
-38
lines changed

docs/content/doc/help/faq.en-us.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ menu:
1818
This page contains some common questions and answers.
1919
Also see [Support Options]({{< relref "doc/help/seek-help.en-us.md" >}})
2020

21+
* [Difference between 1.x and 1.x.x downloads](#difference-between-1-x-and-1-x-x-downloads)
2122
* [How to migrate from Gogs/GitHub/etc. to Gitea](#how-to-migrate-from-gogs-github-etc-to-gitea)
2223
* [Where does Gitea store "x" file](#where-does-gitea-store-x-file)
2324
* [Not seeing a clone URL or the clone URL being incorrect](#not-seeing-a-clone-url-or-the-clone-url-being-incorrect)
@@ -42,6 +43,17 @@ Also see [Support Options]({{< relref "doc/help/seek-help.en-us.md" >}})
4243
* [LFS Issues](#lfs-issues)
4344

4445

46+
## Difference between 1.x and 1.x.x downloads
47+
Version 1.7.x will be used for this example.
48+
**NOTE:** this example applies to Docker images as well!
49+
50+
On our [downloads page](https://dl.gitea.io/gitea/) you will see a 1.7 directory, as well as directories for 1.7.0, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, and 1.7.6.
51+
The 1.7 and 1.7.0 directories are **not** the same. The 1.7 directory is built on each merged commit to the [`release/v1.7`](https://github.com/go-gitea/gitea/tree/release/v1.7) branch.
52+
The 1.7.0 directory, however, is a build that was created when the [`v1.7.0`](https://github.com/go-gitea/gitea/releases/tag/v1.7.0) tag was created.
53+
54+
This means that 1.x downloads will change as commits are merged to their respective branch (think of it as a separate "master" branch for each release).
55+
On the other hand, 1.x.x downloads should never change.
56+
4557
## How to migrate from Gogs/GitHub/etc. to Gitea
4658
To migrate from Gogs to Gitea:
4759

integrations/api_org_test.go

Lines changed: 72 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,87 @@ package integrations
66

77
import (
88
"net/http"
9+
"net/url"
910
"strings"
1011
"testing"
1112

1213
"code.gitea.io/gitea/models"
14+
"code.gitea.io/gitea/modules/setting"
1315
api "code.gitea.io/sdk/gitea"
1416

1517
"github.com/stretchr/testify/assert"
1618
)
1719

1820
func TestAPIOrg(t *testing.T) {
19-
prepareTestEnv(t)
20-
21-
session := loginUser(t, "user1")
22-
23-
token := getTokenForLoggedInUser(t, session)
24-
var org = api.CreateOrgOption{
25-
UserName: "user1_org",
26-
FullName: "User1's organization",
27-
Description: "This organization created by user1",
28-
Website: "https://try.gitea.io",
29-
Location: "Shanghai",
30-
}
31-
req := NewRequestWithJSON(t, "POST", "/api/v1/orgs?token="+token, &org)
32-
resp := session.MakeRequest(t, req, http.StatusCreated)
33-
34-
var apiOrg api.Organization
35-
DecodeJSON(t, resp, &apiOrg)
36-
37-
assert.Equal(t, org.UserName, apiOrg.UserName)
38-
assert.Equal(t, org.FullName, apiOrg.FullName)
39-
assert.Equal(t, org.Description, apiOrg.Description)
40-
assert.Equal(t, org.Website, apiOrg.Website)
41-
assert.Equal(t, org.Location, apiOrg.Location)
42-
43-
models.AssertExistsAndLoadBean(t, &models.User{
44-
Name: org.UserName,
45-
LowerName: strings.ToLower(org.UserName),
46-
FullName: org.FullName,
21+
onGiteaRun(t, func(*testing.T, *url.URL) {
22+
session := loginUser(t, "user1")
23+
24+
token := getTokenForLoggedInUser(t, session)
25+
var org = api.CreateOrgOption{
26+
UserName: "user1_org",
27+
FullName: "User1's organization",
28+
Description: "This organization created by user1",
29+
Website: "https://try.gitea.io",
30+
Location: "Shanghai",
31+
}
32+
req := NewRequestWithJSON(t, "POST", "/api/v1/orgs?token="+token, &org)
33+
resp := session.MakeRequest(t, req, http.StatusCreated)
34+
35+
var apiOrg api.Organization
36+
DecodeJSON(t, resp, &apiOrg)
37+
38+
assert.Equal(t, org.UserName, apiOrg.UserName)
39+
assert.Equal(t, org.FullName, apiOrg.FullName)
40+
assert.Equal(t, org.Description, apiOrg.Description)
41+
assert.Equal(t, org.Website, apiOrg.Website)
42+
assert.Equal(t, org.Location, apiOrg.Location)
43+
44+
models.AssertExistsAndLoadBean(t, &models.User{
45+
Name: org.UserName,
46+
LowerName: strings.ToLower(org.UserName),
47+
FullName: org.FullName,
48+
})
49+
50+
req = NewRequestf(t, "GET", "/api/v1/orgs/%s", org.UserName)
51+
resp = session.MakeRequest(t, req, http.StatusOK)
52+
DecodeJSON(t, resp, &apiOrg)
53+
assert.EqualValues(t, org.UserName, apiOrg.UserName)
54+
55+
req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", org.UserName)
56+
resp = session.MakeRequest(t, req, http.StatusOK)
57+
58+
var repos []*api.Repository
59+
DecodeJSON(t, resp, &repos)
60+
for _, repo := range repos {
61+
assert.False(t, repo.Private)
62+
}
63+
64+
req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", org.UserName)
65+
resp = session.MakeRequest(t, req, http.StatusOK)
66+
67+
// user1 on this org is public
68+
var users []*api.User
69+
DecodeJSON(t, resp, &users)
70+
assert.EqualValues(t, 1, len(users))
71+
assert.EqualValues(t, "user1", users[0].UserName)
72+
})
73+
}
74+
75+
func TestAPIOrgDeny(t *testing.T) {
76+
onGiteaRun(t, func(*testing.T, *url.URL) {
77+
setting.Service.RequireSignInView = true
78+
defer func() {
79+
setting.Service.RequireSignInView = false
80+
}()
81+
82+
var orgName = "user1_org"
83+
req := NewRequestf(t, "GET", "/api/v1/orgs/%s", orgName)
84+
MakeRequest(t, req, http.StatusNotFound)
85+
86+
req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", orgName)
87+
MakeRequest(t, req, http.StatusNotFound)
88+
89+
req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", orgName)
90+
MakeRequest(t, req, http.StatusNotFound)
4791
})
4892
}

integrations/api_team_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
func TestAPITeam(t *testing.T) {
1818
prepareTestEnv(t)
19+
1920
teamUser := models.AssertExistsAndLoadBean(t, &models.TeamUser{}).(*models.TeamUser)
2021
team := models.AssertExistsAndLoadBean(t, &models.Team{ID: teamUser.TeamID}).(*models.Team)
2122
user := models.AssertExistsAndLoadBean(t, &models.User{ID: teamUser.UID}).(*models.User)
@@ -29,4 +30,16 @@ func TestAPITeam(t *testing.T) {
2930
DecodeJSON(t, resp, &apiTeam)
3031
assert.EqualValues(t, team.ID, apiTeam.ID)
3132
assert.Equal(t, team.Name, apiTeam.Name)
33+
34+
// non team member user will not access the teams details
35+
teamUser2 := models.AssertExistsAndLoadBean(t, &models.TeamUser{ID: 3}).(*models.TeamUser)
36+
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: teamUser2.UID}).(*models.User)
37+
38+
session = loginUser(t, user2.Name)
39+
token = getTokenForLoggedInUser(t, session)
40+
req = NewRequestf(t, "GET", "/api/v1/teams/%d?token="+token, teamUser.TeamID)
41+
resp = session.MakeRequest(t, req, http.StatusForbidden)
42+
43+
req = NewRequestf(t, "GET", "/api/v1/teams/%d", teamUser.TeamID)
44+
resp = session.MakeRequest(t, req, http.StatusUnauthorized)
3245
}

integrations/org_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright 2019 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package integrations
6+
7+
import (
8+
"net/http"
9+
"strings"
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestOrgRepos(t *testing.T) {
16+
prepareTestEnv(t)
17+
18+
var (
19+
users = []string{"user1", "user2"}
20+
cases = map[string][]string{
21+
"alphabetically": {"repo21", "repo3", "repo5"},
22+
"reversealphabetically": {"repo5", "repo3", "repo21"},
23+
}
24+
)
25+
26+
for _, user := range users {
27+
t.Run(user, func(t *testing.T) {
28+
session := loginUser(t, user)
29+
for sortBy, repos := range cases {
30+
req := NewRequest(t, "GET", "/user3?sort="+sortBy)
31+
resp := session.MakeRequest(t, req, http.StatusOK)
32+
33+
htmlDoc := NewHTMLParser(t, resp.Body)
34+
35+
sel := htmlDoc.doc.Find("a.name")
36+
assert.EqualValues(t, len(repos), len(sel.Nodes))
37+
for i := 0; i < len(repos); i++ {
38+
assert.EqualValues(t, repos[i], strings.TrimSpace(sel.Eq(i).Text()))
39+
}
40+
}
41+
})
42+
}
43+
}

models/migrations/v78.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,19 @@ func renameRepoIsBareToIsEmpty(x *xorm.Engine) error {
3333
_, err = sess.Exec("DROP INDEX IF EXISTS IDX_repository_is_bare")
3434
} else if models.DbCfg.Type == core.MSSQL {
3535
_, err = sess.Exec("DROP INDEX IF EXISTS IDX_repository_is_bare ON repository")
36+
} else if models.DbCfg.Type == core.MYSQL {
37+
indexes, err := sess.QueryString(`SHOW INDEX FROM repository WHERE KEY_NAME = 'IDX_repository_is_bare'`)
38+
if err != nil {
39+
return err
40+
}
41+
42+
if len(indexes) >= 1 {
43+
_, err = sess.Exec("DROP INDEX IDX_repository_is_bare ON repository")
44+
}
3645
} else {
3746
_, err = sess.Exec("DROP INDEX IDX_repository_is_bare ON repository")
3847
}
48+
3949
if err != nil {
4050
return fmt.Errorf("Drop index failed: %v", err)
4151
}

models/org.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ type AccessibleReposEnvironment interface {
657657
Repos(page, pageSize int) ([]*Repository, error)
658658
MirrorRepos() ([]*Repository, error)
659659
AddKeyword(keyword string)
660+
SetSort(SearchOrderBy)
660661
}
661662

662663
type accessibleReposEnv struct {
@@ -665,6 +666,7 @@ type accessibleReposEnv struct {
665666
teamIDs []int64
666667
e Engine
667668
keyword string
669+
orderBy SearchOrderBy
668670
}
669671

670672
// AccessibleReposEnv an AccessibleReposEnvironment for the repositories in `org`
@@ -683,6 +685,7 @@ func (org *User) accessibleReposEnv(e Engine, userID int64) (AccessibleReposEnvi
683685
userID: userID,
684686
teamIDs: teamIDs,
685687
e: e,
688+
orderBy: SearchOrderByRecentUpdated,
686689
}, nil
687690
}
688691

@@ -722,8 +725,8 @@ func (env *accessibleReposEnv) RepoIDs(page, pageSize int) ([]int64, error) {
722725
Table("repository").
723726
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id").
724727
Where(env.cond()).
725-
GroupBy("`repository`.id,`repository`.updated_unix").
726-
OrderBy("updated_unix DESC").
728+
GroupBy("`repository`.id,`repository`."+strings.Fields(string(env.orderBy))[0]).
729+
OrderBy(string(env.orderBy)).
727730
Limit(pageSize, (page-1)*pageSize).
728731
Cols("`repository`.id").
729732
Find(&repoIDs)
@@ -742,6 +745,7 @@ func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*Repository, error)
742745

743746
return repos, env.e.
744747
In("`repository`.id", repoIDs).
748+
OrderBy(string(env.orderBy)).
745749
Find(&repos)
746750
}
747751

@@ -752,7 +756,7 @@ func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) {
752756
Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true).
753757
Where(env.cond()).
754758
GroupBy("`repository`.id, `repository`.updated_unix").
755-
OrderBy("updated_unix DESC").
759+
OrderBy(string(env.orderBy)).
756760
Cols("`repository`.id").
757761
Find(&repoIDs)
758762
}
@@ -776,3 +780,7 @@ func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) {
776780
func (env *accessibleReposEnv) AddKeyword(keyword string) {
777781
env.keyword = keyword
778782
}
783+
784+
func (env *accessibleReposEnv) SetSort(orderBy SearchOrderBy) {
785+
env.orderBy = orderBy
786+
}

models/unit.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ const (
2525
UnitTypeExternalTracker // 7 ExternalTracker
2626
)
2727

28+
// Value returns integer value for unit type
29+
func (u UnitType) Value() int {
30+
return int(u)
31+
}
32+
2833
func (u UnitType) String() string {
2934
switch u {
3035
case UnitTypeCode:

modules/context/repo.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ func RedirectToRepo(ctx *Context, redirectRepoID int64) {
223223
fmt.Sprintf("%s/%s", repo.MustOwnerName(), repo.Name),
224224
1,
225225
)
226+
if ctx.Req.URL.RawQuery != "" {
227+
redirectPath += "?" + ctx.Req.URL.RawQuery
228+
}
226229
ctx.Redirect(redirectPath)
227230
}
228231

modules/markup/html.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ var (
6363
// well as the HTML5 spec:
6464
// http://spec.commonmark.org/0.28/#email-address
6565
// https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type%3Demail)
66-
emailRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)(?:\\s|$|\\)|\\]|\\.(\\s|$))")
66+
emailRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+)(?:\\s|$|\\)|\\]|\\.(\\s|$))")
6767

6868
linkRegex, _ = xurls.StrictMatchingScheme("https?://")
6969
)

modules/markup/html_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ func TestRender_email(t *testing.T) {
176176
test(
177177
178178
`<p><a href="mailto:[email protected]" rel="nofollow">[email protected]</a>.</p>`)
179+
test(
180+
181+
`<p><a href="mailto:[email protected]" rel="nofollow">[email protected]</a></p>`)
179182
test(
180183
"send email to [email protected].",
181184
`<p>send email to <a href="mailto:[email protected]" rel="nofollow">[email protected]</a>.</p>`)
@@ -190,6 +193,18 @@ func TestRender_email(t *testing.T) {
190193
test(
191194
"[email protected]:go-gitea/gitea.git",
192195
`<p>[email protected]:go-gitea/gitea.git</p>`)
196+
test(
197+
"gitea@3",
198+
`<p>gitea@3</p>`)
199+
test(
200+
201+
202+
test(
203+
204+
`<p>email@[email protected]</p>`)
205+
test(
206+
207+
193208
}
194209

195210
func TestRender_ShortLinks(t *testing.T) {

0 commit comments

Comments
 (0)