Skip to content

Commit 91da34e

Browse files
authored
Merge branch 'main' into NO-git.NewCommand
2 parents 6bd0ca3 + 7b6c1f8 commit 91da34e

File tree

6 files changed

+155
-27
lines changed

6 files changed

+155
-27
lines changed

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,35 @@ This changelog goes through all the changes that have been made in each release
44
without substantial changes to our git log; to see the highlights of what has
55
been added to each release, please refer to the [blog](https://blog.gitea.io).
66

7+
## [1.16.1](https://github.com/go-gitea/gitea/releases/tag/v1.16.1) - 2022-02-06
8+
9+
* SECURITY
10+
* Update JS dependencies, fix lint (#18389) (#18540)
11+
* ENHANCEMENTS
12+
* Add dropdown icon to label set template dropdown (#18564) (#18571)
13+
* BUGFIXES
14+
* comments on migrated issues/prs must link to the comment ID (#18630) (#18637)
15+
* Stop logging an error when notes are not found (#18626) (#18635)
16+
* Ensure that blob-excerpt links work for wiki (#18587) (#18624)
17+
* Only attempt to flush queue if the underlying worker pool is not finished (#18593) (#18620)
18+
* Ensure commit-statuses box is sized correctly in headers (#18538) (#18606)
19+
* Prevent merge messages from being sorted to the top of email chains (#18566) (#18588)
20+
* Prevent panic on prohibited user login with oauth2 (#18562) (#18563)
21+
* Collaborator trust model should trust collaborators (#18539) (#18557)
22+
* Detect conflicts with 3way merge (#18536) (#18537)
23+
* In docker rootless use $GITEA_APP_INI if provided (#18524) (#18535)
24+
* Add `GetUserTeams` (#18499) (#18531)
25+
* Fix review excerpt (#18502) (#18530)
26+
* Fix for AvatarURL database type (#18487) (#18529)
27+
* Use `ImagedProvider` for gplus oauth2 provider (#18504) (#18505)
28+
* Fix OAuth Source Edit Page (#18495) (#18503)
29+
* Use "read" value for General Access (#18496) (#18500)
30+
* Prevent NPE on partial match of compare URL and allow short SHA1 compare URLs (#18472) (#18473)
31+
* BUILD
32+
* Make docker gitea/gitea:v1.16-dev etc refer to the latest build on that branch (#18551) (#18569)
33+
* DOCS
34+
* Update 1.16.0 changelog to set #17846 as breaking (#18533) (#18534)
35+
736
## [1.16.0](https://github.com/go-gitea/gitea/releases/tag/v1.16.0) - 2022-01-30
837

938
* BREAKING

integrations/dump_restore_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ func TestDumpRestore(t *testing.T) {
129129
assert.EqualValues(t, before[i].Created, after[i].Created)
130130
assert.EqualValues(t, before[i].Updated, after[i].Updated)
131131
assert.EqualValues(t, before[i].Labels, after[i].Labels)
132+
assert.EqualValues(t, before[i].Reactions, after[i].Reactions)
132133
}
133134
}
134135
})

models/user/user.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,19 @@ func GetUserNamesByIDs(ids []int64) ([]string, error) {
10251025
return unames, err
10261026
}
10271027

1028+
// GetUserNameByID returns username for the id
1029+
func GetUserNameByID(ctx context.Context, id int64) (string, error) {
1030+
var name string
1031+
has, err := db.GetEngine(ctx).Table("user").Where("id = ?", id).Cols("name").Get(&name)
1032+
if err != nil {
1033+
return "", err
1034+
}
1035+
if has {
1036+
return name, nil
1037+
}
1038+
return "", nil
1039+
}
1040+
10281041
// GetUserIDsByNames returns a slice of ids corresponds to names.
10291042
func GetUserIDsByNames(names []string, ignoreNonExistent bool) ([]int64, error) {
10301043
ids := make([]int64, 0, len(names))

services/migrations/gitea_uploader.go

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type GiteaLocalUploader struct {
4646
issues map[int64]*models.Issue
4747
gitRepo *git.Repository
4848
prHeadCache map[string]struct{}
49+
sameApp bool
4950
userMap map[int64]int64 // external user id mapping to user id
5051
prCache map[int64]*models.PullRequest
5152
gitServiceType structs.GitServiceType
@@ -128,6 +129,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
128129
MirrorInterval: opts.MirrorInterval,
129130
}, NewMigrationHTTPTransport())
130131

132+
g.sameApp = strings.HasPrefix(repo.OriginalURL, setting.AppURL)
131133
g.repo = r
132134
if err != nil {
133135
return err
@@ -256,7 +258,7 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
256258
CreatedUnix: timeutil.TimeStamp(release.Created.Unix()),
257259
}
258260

259-
if err := g.remapExternalUser(release, &rel); err != nil {
261+
if err := g.remapUser(release, &rel); err != nil {
260262
return err
261263
}
262264

@@ -373,7 +375,7 @@ func (g *GiteaLocalUploader) CreateIssues(issues ...*base.Issue) error {
373375
UpdatedUnix: timeutil.TimeStamp(issue.Updated.Unix()),
374376
}
375377

376-
if err := g.remapExternalUser(issue, &is); err != nil {
378+
if err := g.remapUser(issue, &is); err != nil {
377379
return err
378380
}
379381

@@ -386,7 +388,7 @@ func (g *GiteaLocalUploader) CreateIssues(issues ...*base.Issue) error {
386388
Type: reaction.Content,
387389
CreatedUnix: timeutil.TimeStampNow(),
388390
}
389-
if err := g.remapExternalUser(reaction, &res); err != nil {
391+
if err := g.remapUser(reaction, &res); err != nil {
390392
return err
391393
}
392394
is.Reactions = append(is.Reactions, &res)
@@ -437,7 +439,7 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
437439
UpdatedUnix: timeutil.TimeStamp(comment.Updated.Unix()),
438440
}
439441

440-
if err := g.remapExternalUser(comment, &cm); err != nil {
442+
if err := g.remapUser(comment, &cm); err != nil {
441443
return err
442444
}
443445

@@ -447,7 +449,7 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
447449
Type: reaction.Content,
448450
CreatedUnix: timeutil.TimeStampNow(),
449451
}
450-
if err := g.remapExternalUser(reaction, &res); err != nil {
452+
if err := g.remapUser(reaction, &res); err != nil {
451453
return err
452454
}
453455
cm.Reactions = append(cm.Reactions, &res)
@@ -471,7 +473,7 @@ func (g *GiteaLocalUploader) CreatePullRequests(prs ...*base.PullRequest) error
471473
return err
472474
}
473475

474-
if err := g.remapExternalUser(pr, gpr.Issue); err != nil {
476+
if err := g.remapUser(pr, gpr.Issue); err != nil {
475477
return err
476478
}
477479

@@ -626,7 +628,7 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
626628
UpdatedUnix: timeutil.TimeStamp(pr.Updated.Unix()),
627629
}
628630

629-
if err := g.remapExternalUser(pr, &issue); err != nil {
631+
if err := g.remapUser(pr, &issue); err != nil {
630632
return nil, err
631633
}
632634

@@ -636,7 +638,7 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
636638
Type: reaction.Content,
637639
CreatedUnix: timeutil.TimeStampNow(),
638640
}
639-
if err := g.remapExternalUser(reaction, &res); err != nil {
641+
if err := g.remapUser(reaction, &res); err != nil {
640642
return nil, err
641643
}
642644
issue.Reactions = append(issue.Reactions, &res)
@@ -710,7 +712,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
710712
UpdatedUnix: timeutil.TimeStamp(review.CreatedAt.Unix()),
711713
}
712714

713-
if err := g.remapExternalUser(review, &cm); err != nil {
715+
if err := g.remapUser(review, &cm); err != nil {
714716
return err
715717
}
716718

@@ -773,7 +775,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
773775
UpdatedUnix: timeutil.TimeStamp(comment.UpdatedAt.Unix()),
774776
}
775777

776-
if err := g.remapExternalUser(review, &c); err != nil {
778+
if err := g.remapUser(review, &c); err != nil {
777779
return err
778780
}
779781

@@ -816,23 +818,52 @@ func (g *GiteaLocalUploader) Finish() error {
816818
return repo_model.UpdateRepositoryCols(g.repo, "status")
817819
}
818820

819-
func (g *GiteaLocalUploader) remapExternalUser(source user_model.ExternalUserMigrated, target user_model.ExternalUserRemappable) (err error) {
821+
func (g *GiteaLocalUploader) remapUser(source user_model.ExternalUserMigrated, target user_model.ExternalUserRemappable) error {
822+
var userid int64
823+
var err error
824+
if g.sameApp {
825+
userid, err = g.remapLocalUser(source, target)
826+
} else {
827+
userid, err = g.remapExternalUser(source, target)
828+
}
829+
830+
if err != nil {
831+
return err
832+
}
833+
834+
if userid > 0 {
835+
return target.RemapExternalUser("", 0, userid)
836+
}
837+
return target.RemapExternalUser(source.GetExternalName(), source.GetExternalID(), g.doer.ID)
838+
}
839+
840+
func (g *GiteaLocalUploader) remapLocalUser(source user_model.ExternalUserMigrated, target user_model.ExternalUserRemappable) (int64, error) {
820841
userid, ok := g.userMap[source.GetExternalID()]
821-
tp := g.gitServiceType.Name()
822-
if !ok && tp != "" {
823-
userid, err = user_model.GetUserIDByExternalUserID(tp, fmt.Sprintf("%d", source.GetExternalID()))
842+
if !ok {
843+
name, err := user_model.GetUserNameByID(g.ctx, source.GetExternalID())
824844
if err != nil {
825-
log.Error("GetUserIDByExternalUserID: %v", err)
845+
return 0, err
826846
}
827-
if userid > 0 {
828-
g.userMap[source.GetExternalID()] = userid
847+
// let's not reuse an ID when the user was deleted or has a different user name
848+
if name != source.GetExternalName() {
849+
userid = 0
850+
} else {
851+
userid = source.GetExternalID()
829852
}
853+
g.userMap[source.GetExternalID()] = userid
830854
}
855+
return userid, nil
856+
}
831857

832-
if userid > 0 {
833-
err = target.RemapExternalUser("", 0, userid)
834-
} else {
835-
err = target.RemapExternalUser(source.GetExternalName(), source.GetExternalID(), g.doer.ID)
858+
func (g *GiteaLocalUploader) remapExternalUser(source user_model.ExternalUserMigrated, target user_model.ExternalUserRemappable) (userid int64, err error) {
859+
userid, ok := g.userMap[source.GetExternalID()]
860+
if !ok {
861+
userid, err = user_model.GetUserIDByExternalUserID(g.gitServiceType.Name(), fmt.Sprintf("%d", source.GetExternalID()))
862+
if err != nil {
863+
log.Error("GetUserIDByExternalUserID: %v", err)
864+
return 0, err
865+
}
866+
g.userMap[source.GetExternalID()] = userid
836867
}
837-
return
868+
return userid, nil
838869
}

services/migrations/gitea_uploader_test.go

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,68 @@ func TestGiteaUploadRepo(t *testing.T) {
117117
assert.Len(t, pulls[0].Issue.Comments, 2)
118118
}
119119

120+
func TestGiteaUploadRemapLocalUser(t *testing.T) {
121+
unittest.PrepareTestEnv(t)
122+
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
123+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
124+
125+
repoName := "migrated"
126+
uploader := NewGiteaLocalUploader(context.Background(), doer, doer.Name, repoName)
127+
// call remapLocalUser
128+
uploader.sameApp = true
129+
130+
externalID := int64(1234567)
131+
externalName := "username"
132+
source := base.Release{
133+
PublisherID: externalID,
134+
PublisherName: externalName,
135+
}
136+
137+
//
138+
// The externalID does not match any existing user, everything
139+
// belongs to the doer
140+
//
141+
target := models.Release{}
142+
uploader.userMap = make(map[int64]int64)
143+
err := uploader.remapUser(&source, &target)
144+
assert.NoError(t, err)
145+
assert.EqualValues(t, doer.ID, target.GetUserID())
146+
147+
//
148+
// The externalID matches a known user but the name does not match,
149+
// everything belongs to the doer
150+
//
151+
source.PublisherID = user.ID
152+
target = models.Release{}
153+
uploader.userMap = make(map[int64]int64)
154+
err = uploader.remapUser(&source, &target)
155+
assert.NoError(t, err)
156+
assert.EqualValues(t, doer.ID, target.GetUserID())
157+
158+
//
159+
// The externalID and externalName match an existing user, everything
160+
// belongs to the existing user
161+
//
162+
source.PublisherName = user.Name
163+
target = models.Release{}
164+
uploader.userMap = make(map[int64]int64)
165+
err = uploader.remapUser(&source, &target)
166+
assert.NoError(t, err)
167+
assert.EqualValues(t, user.ID, target.GetUserID())
168+
}
169+
120170
func TestGiteaUploadRemapExternalUser(t *testing.T) {
121171
unittest.PrepareTestEnv(t)
122172
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
123173

124174
repoName := "migrated"
125175
uploader := NewGiteaLocalUploader(context.Background(), doer, doer.Name, repoName)
126176
uploader.gitServiceType = structs.GiteaService
177+
// call remapExternalUser
178+
uploader.sameApp = false
127179

128180
externalID := int64(1234567)
129-
externalName := "url.or.something"
181+
externalName := "username"
130182
source := base.Release{
131183
PublisherID: externalID,
132184
PublisherName: externalName,
@@ -136,8 +188,9 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) {
136188
// When there is no user linked to the external ID, the migrated data is authored
137189
// by the doer
138190
//
191+
uploader.userMap = make(map[int64]int64)
139192
target := models.Release{}
140-
err := uploader.remapExternalUser(&source, &target)
193+
err := uploader.remapUser(&source, &target)
141194
assert.NoError(t, err)
142195
assert.EqualValues(t, doer.ID, target.GetUserID())
143196

@@ -158,8 +211,9 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) {
158211
// When a user is linked to the external ID, it becomes the author of
159212
// the migrated data
160213
//
214+
uploader.userMap = make(map[int64]int64)
161215
target = models.Release{}
162-
err = uploader.remapExternalUser(&source, &target)
216+
err = uploader.remapUser(&source, &target)
163217
assert.NoError(t, err)
164-
assert.EqualValues(t, target.GetUserID(), linkedUser.ID)
218+
assert.EqualValues(t, linkedUser.ID, target.GetUserID())
165219
}

templates/repo/issue/view_content/comments.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
{{ .OriginalAuthor }}
3030
</span>
3131
<span class="text grey">
32-
{{$.i18n.Tr "repo.issues.commented_at" (.Issue.HashTag|Escape) $createdStr | Safe}} {{if $.Repository.OriginalURL}}
32+
{{$.i18n.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} {{if $.Repository.OriginalURL}}
3333
</span>
3434
<span class="text migrate">
3535
({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}}

0 commit comments

Comments
 (0)