aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--models/issue.go44
-rw-r--r--models/issue_comment.go6
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v89.go36
-rw-r--r--models/repo.go15
-rw-r--r--modules/migrations/base/comment.go1
-rw-r--r--modules/migrations/base/issue.go1
-rw-r--r--modules/migrations/base/options.go20
-rw-r--r--modules/migrations/base/pullrequest.go1
-rw-r--r--modules/migrations/base/repo.go1
-rw-r--r--modules/migrations/gitea.go63
-rw-r--r--modules/migrations/gitea_test.go19
-rw-r--r--modules/migrations/github.go5
-rw-r--r--modules/migrations/github_test.go10
-rw-r--r--modules/migrations/migrate.go23
-rw-r--r--modules/structs/issue.go22
-rw-r--r--modules/structs/issue_comment.go14
-rw-r--r--modules/structs/repo.go1
-rw-r--r--modules/templates/helper.go11
-rw-r--r--options/locale/locale_en-US.ini2
-rw-r--r--public/css/index.css3
-rw-r--r--public/less/_base.less12
-rw-r--r--templates/repo/issue/list.tmpl5
-rw-r--r--templates/repo/issue/view_content.tmpl8
-rw-r--r--templates/repo/issue/view_content/comments.tmpl8
-rw-r--r--templates/repo/issue/view_title.tmpl22
-rw-r--r--templates/swagger/v1_json.tmpl22
-rw-r--r--templates/user/dashboard/issues.tmpl4
28 files changed, 263 insertions, 118 deletions
diff --git a/models/issue.go b/models/issue.go
index b5504beb71..63074cd40c 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -25,27 +25,29 @@ import (
// Issue represents an issue or pull request of repository.
type Issue struct {
- ID int64 `xorm:"pk autoincr"`
- RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
- Repo *Repository `xorm:"-"`
- Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
- PosterID int64 `xorm:"INDEX"`
- Poster *User `xorm:"-"`
- Title string `xorm:"name"`
- Content string `xorm:"TEXT"`
- RenderedContent string `xorm:"-"`
- Labels []*Label `xorm:"-"`
- MilestoneID int64 `xorm:"INDEX"`
- Milestone *Milestone `xorm:"-"`
- Priority int
- AssigneeID int64 `xorm:"-"`
- Assignee *User `xorm:"-"`
- IsClosed bool `xorm:"INDEX"`
- IsRead bool `xorm:"-"`
- IsPull bool `xorm:"INDEX"` // Indicates whether is a pull request or not.
- PullRequest *PullRequest `xorm:"-"`
- NumComments int
- Ref string
+ ID int64 `xorm:"pk autoincr"`
+ RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
+ Repo *Repository `xorm:"-"`
+ Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
+ PosterID int64 `xorm:"INDEX"`
+ Poster *User `xorm:"-"`
+ OriginalAuthor string
+ OriginalAuthorID int64
+ Title string `xorm:"name"`
+ Content string `xorm:"TEXT"`
+ RenderedContent string `xorm:"-"`
+ Labels []*Label `xorm:"-"`
+ MilestoneID int64 `xorm:"INDEX"`
+ Milestone *Milestone `xorm:"-"`
+ Priority int
+ AssigneeID int64 `xorm:"-"`
+ Assignee *User `xorm:"-"`
+ IsClosed bool `xorm:"INDEX"`
+ IsRead bool `xorm:"-"`
+ IsPull bool `xorm:"INDEX"` // Indicates whether is a pull request or not.
+ PullRequest *PullRequest `xorm:"-"`
+ NumComments int
+ Ref string
DeadlineUnix util.TimeStamp `xorm:"INDEX"`
diff --git a/models/issue_comment.go b/models/issue_comment.go
index c9f1bd9d5f..b930b0b12a 100644
--- a/models/issue_comment.go
+++ b/models/issue_comment.go
@@ -101,8 +101,10 @@ const (
type Comment struct {
ID int64 `xorm:"pk autoincr"`
Type CommentType
- PosterID int64 `xorm:"INDEX"`
- Poster *User `xorm:"-"`
+ PosterID int64 `xorm:"INDEX"`
+ Poster *User `xorm:"-"`
+ OriginalAuthor string
+ OriginalAuthorID int64
IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
LabelID int64
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index ef43b0453b..62fadf5f36 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -232,6 +232,8 @@ var migrations = []Migration{
NewMigration("add avatar field to repository", addAvatarFieldToRepository),
// v88 -> v89
NewMigration("add commit status context field to commit_status", addCommitStatusContext),
+ // v89 -> v90
+ NewMigration("add original author/url migration info to issues, comments, and repo ", addOriginalMigrationInfo),
}
// Migrate database to current version
diff --git a/models/migrations/v89.go b/models/migrations/v89.go
new file mode 100644
index 0000000000..83d0b1a8b9
--- /dev/null
+++ b/models/migrations/v89.go
@@ -0,0 +1,36 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package migrations
+
+import "github.com/go-xorm/xorm"
+
+func addOriginalMigrationInfo(x *xorm.Engine) error {
+ // Issue see models/issue.go
+ type Issue struct {
+ OriginalAuthor string
+ OriginalAuthorID int64
+ }
+
+ if err := x.Sync2(new(Issue)); err != nil {
+ return err
+ }
+
+ // Issue see models/issue_comment.go
+ type Comment struct {
+ OriginalAuthor string
+ OriginalAuthorID int64
+ }
+
+ if err := x.Sync2(new(Comment)); err != nil {
+ return err
+ }
+
+ // Issue see models/repo.go
+ type Repository struct {
+ OriginalURL string
+ }
+
+ return x.Sync2(new(Repository))
+}
diff --git a/models/repo.go b/models/repo.go
index 59ce18fa88..9bedeba952 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -136,6 +136,7 @@ type Repository struct {
Name string `xorm:"INDEX NOT NULL"`
Description string
Website string
+ OriginalURL string
DefaultBranch string
NumWatches int
@@ -847,6 +848,7 @@ func (repo *Repository) CloneLink() (cl *CloneLink) {
type MigrateRepoOptions struct {
Name string
Description string
+ OriginalURL string
IsPrivate bool
IsMirror bool
RemoteAddr string
@@ -878,6 +880,7 @@ func MigrateRepository(doer, u *User, opts MigrateRepoOptions) (*Repository, err
repo, err := CreateRepository(doer, u, CreateRepoOptions{
Name: opts.Name,
Description: opts.Description,
+ OriginalURL: opts.OriginalURL,
IsPrivate: opts.IsPrivate,
IsMirror: opts.IsMirror,
})
@@ -1092,6 +1095,7 @@ func initRepoCommit(tmpPath string, sig *git.Signature) (err error) {
type CreateRepoOptions struct {
Name string
Description string
+ OriginalURL string
Gitignores string
License string
Readme string
@@ -1358,6 +1362,7 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
Name: opts.Name,
LowerName: strings.ToLower(opts.Name),
Description: opts.Description,
+ OriginalURL: opts.OriginalURL,
IsPrivate: opts.IsPrivate,
IsFsckEnabled: !opts.IsMirror,
CloseIssuesViaCommitInAnyBranch: setting.Repository.DefaultCloseIssuesViaCommitsInAnyBranch,
@@ -2678,3 +2683,13 @@ func (repo *Repository) DeleteAvatar() error {
}
return sess.Commit()
}
+
+// GetOriginalURLHostname returns the hostname of a URL or the URL
+func (repo *Repository) GetOriginalURLHostname() string {
+ u, err := url.Parse(repo.OriginalURL)
+ if err != nil {
+ return repo.OriginalURL
+ }
+
+ return u.Host
+}
diff --git a/modules/migrations/base/comment.go b/modules/migrations/base/comment.go
index d89ec3a3f5..38c544d6e0 100644
--- a/modules/migrations/base/comment.go
+++ b/modules/migrations/base/comment.go
@@ -10,6 +10,7 @@ import "time"
// Comment is a standard comment information
type Comment struct {
IssueIndex int64
+ PosterID int64
PosterName string
PosterEmail string
Created time.Time
diff --git a/modules/migrations/base/issue.go b/modules/migrations/base/issue.go
index ddadd0c2b3..08d947b05d 100644
--- a/modules/migrations/base/issue.go
+++ b/modules/migrations/base/issue.go
@@ -10,6 +10,7 @@ import "time"
// Issue is a standard issue information
type Issue struct {
Number int64
+ PosterID int64
PosterName string
PosterEmail string
Title string
diff --git a/modules/migrations/base/options.go b/modules/migrations/base/options.go
index 262981b933..ba7fdc6815 100644
--- a/modules/migrations/base/options.go
+++ b/modules/migrations/base/options.go
@@ -12,15 +12,15 @@ type MigrateOptions struct {
AuthPassword string
Name string
Description string
+ OriginalURL string
- Wiki bool
- Issues bool
- Milestones bool
- Labels bool
- Releases bool
- Comments bool
- PullRequests bool
- Private bool
- Mirror bool
- IgnoreIssueAuthor bool // if true will not add original author information before issues or comments content.
+ Wiki bool
+ Issues bool
+ Milestones bool
+ Labels bool
+ Releases bool
+ Comments bool
+ PullRequests bool
+ Private bool
+ Mirror bool
}
diff --git a/modules/migrations/base/pullrequest.go b/modules/migrations/base/pullrequest.go
index 515cab3f91..42456fd314 100644
--- a/modules/migrations/base/pullrequest.go
+++ b/modules/migrations/base/pullrequest.go
@@ -15,6 +15,7 @@ type PullRequest struct {
Number int64
Title string
PosterName string
+ PosterID int64
PosterEmail string
Content string
Milestone string
diff --git a/modules/migrations/base/repo.go b/modules/migrations/base/repo.go
index 907d8fc09e..5cfb0de920 100644
--- a/modules/migrations/base/repo.go
+++ b/modules/migrations/base/repo.go
@@ -15,4 +15,5 @@ type Repository struct {
AuthUsername string
AuthPassword string
CloneURL string
+ OriginalURL string
}
diff --git a/modules/migrations/gitea.go b/modules/migrations/gitea.go
index 1df824c94f..b15aed5f4b 100644
--- a/modules/migrations/gitea.go
+++ b/modules/migrations/gitea.go
@@ -82,6 +82,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
r, err := models.MigrateRepository(g.doer, owner, models.MigrateRepoOptions{
Name: g.repoName,
Description: repo.Description,
+ OriginalURL: repo.OriginalURL,
IsMirror: repo.IsMirror,
RemoteAddr: repo.CloneURL,
IsPrivate: repo.IsPrivate,
@@ -247,17 +248,19 @@ func (g *GiteaLocalUploader) CreateIssues(issues ...*base.Issue) error {
}
var is = models.Issue{
- RepoID: g.repo.ID,
- Repo: g.repo,
- Index: issue.Number,
- PosterID: g.doer.ID,
- Title: issue.Title,
- Content: issue.Content,
- IsClosed: issue.State == "closed",
- IsLocked: issue.IsLocked,
- MilestoneID: milestoneID,
- Labels: labels,
- CreatedUnix: util.TimeStamp(issue.Created.Unix()),
+ RepoID: g.repo.ID,
+ Repo: g.repo,
+ Index: issue.Number,
+ PosterID: g.doer.ID,
+ OriginalAuthor: issue.PosterName,
+ OriginalAuthorID: issue.PosterID,
+ Title: issue.Title,
+ Content: issue.Content,
+ IsClosed: issue.State == "closed",
+ IsLocked: issue.IsLocked,
+ MilestoneID: milestoneID,
+ Labels: labels,
+ CreatedUnix: util.TimeStamp(issue.Created.Unix()),
}
if issue.Closed != nil {
is.ClosedUnix = util.TimeStamp(issue.Closed.Unix())
@@ -293,11 +296,13 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
}
cms = append(cms, &models.Comment{
- IssueID: issueID,
- Type: models.CommentTypeComment,
- PosterID: g.doer.ID,
- Content: comment.Content,
- CreatedUnix: util.TimeStamp(comment.Created.Unix()),
+ IssueID: issueID,
+ Type: models.CommentTypeComment,
+ PosterID: g.doer.ID,
+ OriginalAuthor: comment.PosterName,
+ OriginalAuthorID: comment.PosterID,
+ Content: comment.Content,
+ CreatedUnix: util.TimeStamp(comment.Created.Unix()),
})
// TODO: Reactions
@@ -430,18 +435,20 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
HasMerged: pr.Merged,
Issue: &models.Issue{
- RepoID: g.repo.ID,
- Repo: g.repo,
- Title: pr.Title,
- Index: pr.Number,
- PosterID: g.doer.ID,
- Content: pr.Content,
- MilestoneID: milestoneID,
- IsPull: true,
- IsClosed: pr.State == "closed",
- IsLocked: pr.IsLocked,
- Labels: labels,
- CreatedUnix: util.TimeStamp(pr.Created.Unix()),
+ RepoID: g.repo.ID,
+ Repo: g.repo,
+ Title: pr.Title,
+ Index: pr.Number,
+ PosterID: g.doer.ID,
+ OriginalAuthor: pr.PosterName,
+ OriginalAuthorID: pr.PosterID,
+ Content: pr.Content,
+ MilestoneID: milestoneID,
+ IsPull: true,
+ IsClosed: pr.State == "closed",
+ IsLocked: pr.IsLocked,
+ Labels: labels,
+ CreatedUnix: util.TimeStamp(pr.Created.Unix()),
},
}
diff --git a/modules/migrations/gitea_test.go b/modules/migrations/gitea_test.go
index 22da7da171..88a3a6d218 100644
--- a/modules/migrations/gitea_test.go
+++ b/modules/migrations/gitea_test.go
@@ -34,16 +34,15 @@ func TestGiteaUploadRepo(t *testing.T) {
Name: repoName,
AuthUsername: "",
- Wiki: true,
- Issues: true,
- Milestones: true,
- Labels: true,
- Releases: true,
- Comments: true,
- PullRequests: true,
- Private: true,
- Mirror: false,
- IgnoreIssueAuthor: false,
+ Wiki: true,
+ Issues: true,
+ Milestones: true,
+ Labels: true,
+ Releases: true,
+ Comments: true,
+ PullRequests: true,
+ Private: true,
+ Mirror: false,
})
assert.NoError(t, err)
diff --git a/modules/migrations/github.go b/modules/migrations/github.go
index e6b532df9c..93ba108548 100644
--- a/modules/migrations/github.go
+++ b/modules/migrations/github.go
@@ -107,13 +107,13 @@ func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) {
if err != nil {
return nil, err
}
-
// convert github repo to stand Repo
return &base.Repository{
Owner: g.repoOwner,
Name: gr.GetName(),
IsPrivate: *gr.Private,
Description: gr.GetDescription(),
+ OriginalURL: gr.GetHTMLURL(),
CloneURL: gr.GetCloneURL(),
}, nil
}
@@ -317,6 +317,7 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool,
allIssues = append(allIssues, &base.Issue{
Title: *issue.Title,
Number: int64(*issue.Number),
+ PosterID: *issue.User.ID,
PosterName: *issue.User.Login,
PosterEmail: email,
Content: body,
@@ -359,6 +360,7 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er
}
allComments = append(allComments, &base.Comment{
IssueIndex: issueNumber,
+ PosterID: *comment.User.ID,
PosterName: *comment.User.Login,
PosterEmail: email,
Content: *comment.Body,
@@ -451,6 +453,7 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
Title: *pr.Title,
Number: int64(*pr.Number),
PosterName: *pr.User.Login,
+ PosterID: *pr.User.ID,
PosterEmail: email,
Content: body,
Milestone: milestone,
diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go
index 700183bdc1..0f52a62eb2 100644
--- a/modules/migrations/github_test.go
+++ b/modules/migrations/github_test.go
@@ -68,6 +68,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
Owner: "go-gitea",
Description: "Git with a cup of tea, painless self-hosted git service",
CloneURL: "https://github.com/go-gitea/gitea.git",
+ OriginalURL: "https://github.com/go-gitea/gitea",
}, repo)
milestones, err := downloader.GetMilestones()
@@ -180,6 +181,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
Title: "Contribution system: History heatmap for user",
Content: "Hi guys,\r\n\r\nI think that is a possible feature, a history heatmap similar to github or gitlab.\r\nActually exists a plugin called Calendar HeatMap. I used this on mine project to heat application log and worked fine here.\r\nThen, is only a idea, what you think? :)\r\n\r\nhttp://cal-heatmap.com/\r\nhttps://github.com/wa0x6e/cal-heatmap\r\n\r\nReference: https://github.com/gogits/gogs/issues/1640",
Milestone: "1.7.0",
+ PosterID: 1520407,
PosterName: "joubertredrat",
State: "closed",
Created: time.Date(2016, 11, 02, 18, 51, 55, 0, time.UTC),
@@ -209,6 +211,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
Title: "display page revisions on wiki",
Content: "Hi guys,\r\n\r\nWiki on Gogs is very fine, I liked a lot, but I think that is good idea to be possible see other revisions from page as a page history.\r\n\r\nWhat you think?\r\n\r\nReference: https://github.com/gogits/gogs/issues/2991",
Milestone: "1.x.x",
+ PosterID: 1520407,
PosterName: "joubertredrat",
State: "open",
Created: time.Date(2016, 11, 02, 18, 57, 32, 0, time.UTC),
@@ -238,6 +241,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
Title: "audit logs",
Content: "Hi,\r\n\r\nI think that is good idea to have user operation log to admin see what the user is doing at Gogs. Similar to example below\r\n\r\n| user | operation | information |\r\n| --- | --- | --- |\r\n| joubertredrat | repo.create | Create repo MyProjectData |\r\n| joubertredrat | user.settings | Edit settings |\r\n| tboerger | repo.fork | Create Fork from MyProjectData to ForkMyProjectData |\r\n| bkcsoft | repo.remove | Remove repo MySource |\r\n| tboerger | admin.auth | Edit auth LDAP org-connection |\r\n\r\nThis resource can be used on user page too, as user activity, set that log row is public (repo._) or private (user._, admin.*) and display only public activity.\r\n\r\nWhat you think?\r\n\r\n[Chat summary from March 14, 2017](https://github.com/go-gitea/gitea/issues/8#issuecomment-286463807)\r\n\r\nReferences:\r\nhttps://github.com/gogits/gogs/issues/3016",
Milestone: "1.x.x",
+ PosterID: 1520407,
PosterName: "joubertredrat",
State: "open",
Created: time.Date(2016, 11, 02, 18, 59, 20, 0, time.UTC),
@@ -270,6 +274,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
assert.EqualValues(t, []*base.Comment{
{
IssueIndex: 6,
+ PosterID: 4726179,
PosterName: "bkcsoft",
Created: time.Date(2016, 11, 02, 18, 59, 48, 0, time.UTC),
Content: `I would prefer a solution that is in the backend, unless it's required to have it update without reloading. Unfortunately I can't seem to find anything that does that :unamused:
@@ -288,6 +293,7 @@ Also this would _require_ caching, since it will fetch huge amounts of data from
},
{
IssueIndex: 6,
+ PosterID: 1520407,
PosterName: "joubertredrat",
Created: time.Date(2016, 11, 02, 19, 16, 56, 0, time.UTC),
Content: `Yes, this plugin build on front-end, with backend I don't know too, but we can consider make component for this.
@@ -306,6 +312,7 @@ In my case I use ajax to get data, but build on frontend anyway
},
{
IssueIndex: 6,
+ PosterID: 1799009,
PosterName: "xinity",
Created: time.Date(2016, 11, 03, 13, 04, 56, 0, time.UTC),
Content: `following @bkcsoft retention strategy in cache is a must if we don't want gitea to waste ressources.
@@ -345,6 +352,7 @@ something like in the latest 15days could be enough don't you think ?
Title: "Rename import paths: \"github.com/gogits/gogs\" -> \"github.com/go-gitea/gitea\"",
Content: "",
Milestone: "1.0.0",
+ PosterID: 7011819,
PosterName: "andreynering",
State: "closed",
Created: time.Date(2016, 11, 02, 17, 01, 19, 0, time.UTC),
@@ -380,6 +388,7 @@ something like in the latest 15days could be enough don't you think ?
Title: "Fix sender of issue notifications",
Content: "It is the FROM field in mailer configuration that needs be used,\r\nnot the USER field, which is for authentication.\r\n\r\nMigrated from https://github.com/gogits/gogs/pull/3616\r\n",
Milestone: "1.0.0",
+ PosterID: 289678,
PosterName: "strk",
State: "closed",
Created: time.Date(2016, 11, 02, 17, 24, 19, 0, time.UTC),
@@ -417,6 +426,7 @@ something like in the latest 15days could be enough don't you think ?
Title: "Use proper url for libravatar dep",
Content: "Fetch go-libravatar from its official source, rather than from an unmaintained fork\r\n",
Milestone: "1.0.0",
+ PosterID: 289678,
PosterName: "strk",
State: "closed",
Created: time.Date(2016, 11, 02, 17, 34, 31, 0, time.UTC),
diff --git a/modules/migrations/migrate.go b/modules/migrations/migrate.go
index 7fc7911f21..a86614c317 100644
--- a/modules/migrations/migrate.go
+++ b/modules/migrations/migrate.go
@@ -6,8 +6,6 @@
package migrations
import (
- "fmt"
-
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/migrations/base"
@@ -155,11 +153,6 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
if err != nil {
return err
}
- for _, issue := range issues {
- if !opts.IgnoreIssueAuthor {
- issue.Content = fmt.Sprintf("Author: @%s \n\n%s", issue.PosterName, issue.Content)
- }
- }
if err := uploader.CreateIssues(issues...); err != nil {
return err
@@ -175,11 +168,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
if err != nil {
return err
}
- for _, comment := range comments {
- if !opts.IgnoreIssueAuthor {
- comment.Content = fmt.Sprintf("Author: @%s \n\n%s", comment.PosterName, comment.Content)
- }
- }
+
allComments = append(allComments, comments...)
if len(allComments) >= commentBatchSize {
@@ -212,11 +201,6 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
return err
}
- for _, pr := range prs {
- if !opts.IgnoreIssueAuthor {
- pr.Content = fmt.Sprintf("Author: @%s \n\n%s", pr.PosterName, pr.Content)
- }
- }
if err := uploader.CreatePullRequests(prs...); err != nil {
return err
}
@@ -231,11 +215,6 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
if err != nil {
return err
}
- for _, comment := range comments {
- if !opts.IgnoreIssueAuthor {
- comment.Content = fmt.Sprintf("Author: @%s \n\n%s", comment.PosterName, comment.Content)
- }
- }
allComments = append(allComments, comments...)
diff --git a/modules/structs/issue.go b/modules/structs/issue.go
index 6d7517bdc7..58fd7344b4 100644
--- a/modules/structs/issue.go
+++ b/modules/structs/issue.go
@@ -29,16 +29,18 @@ type PullRequestMeta struct {
// Issue represents an issue in a repository
// swagger:model
type Issue struct {
- ID int64 `json:"id"`
- URL string `json:"url"`
- Index int64 `json:"number"`
- Poster *User `json:"user"`
- Title string `json:"title"`
- Body string `json:"body"`
- Labels []*Label `json:"labels"`
- Milestone *Milestone `json:"milestone"`
- Assignee *User `json:"assignee"`
- Assignees []*User `json:"assignees"`
+ ID int64 `json:"id"`
+ URL string `json:"url"`
+ Index int64 `json:"number"`
+ Poster *User `json:"user"`
+ OriginalAuthor string `json:"original_author"`
+ OriginalAuthorID int64 `json:"original_author_id"`
+ Title string `json:"title"`
+ Body string `json:"body"`
+ Labels []*Label `json:"labels"`
+ Milestone *Milestone `json:"milestone"`
+ Assignee *User `json:"assignee"`
+ Assignees []*User `json:"assignees"`
// Whether the issue is open or closed
//
// type: string
diff --git a/modules/structs/issue_comment.go b/modules/structs/issue_comment.go
index 185f3910ed..0c8ac20017 100644
--- a/modules/structs/issue_comment.go
+++ b/modules/structs/issue_comment.go
@@ -10,12 +10,14 @@ import (
// Comment represents a comment on a commit or issue
type Comment struct {
- ID int64 `json:"id"`
- HTMLURL string `json:"html_url"`
- PRURL string `json:"pull_request_url"`
- IssueURL string `json:"issue_url"`
- Poster *User `json:"user"`
- Body string `json:"body"`
+ ID int64 `json:"id"`
+ HTMLURL string `json:"html_url"`
+ PRURL string `json:"pull_request_url"`
+ IssueURL string `json:"issue_url"`
+ Poster *User `json:"user"`
+ OriginalAuthor string `json:"original_author"`
+ OriginalAuthorID int64 `json:"original_author_id"`
+ Body string `json:"body"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
diff --git a/modules/structs/repo.go b/modules/structs/repo.go
index b4d162b776..81203319e0 100644
--- a/modules/structs/repo.go
+++ b/modules/structs/repo.go
@@ -31,6 +31,7 @@ type Repository struct {
HTMLURL string `json:"html_url"`
SSHURL string `json:"ssh_url"`
CloneURL string `json:"clone_url"`
+ OriginalURL string `json:"original_url"`
Website string `json:"website"`
Stars int `json:"stars_count"`
Forks int `json:"forks_count"`
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index c4551bb4be..5a3969c098 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -82,6 +82,7 @@ func NewFuncMap() []template.FuncMap {
"FileSize": base.FileSize,
"Subtract": base.Subtract,
"EntryIcon": base.EntryIcon,
+ "MigrationIcon": MigrationIcon,
"Add": func(a, b int) int {
return a + b
},
@@ -540,3 +541,13 @@ func TrN(lang string, cnt interface{}, key1, keyN string) string {
}
return keyN
}
+
+// MigrationIcon returns a Font Awesome name matching the service an issue/comment was migrated from
+func MigrationIcon(hostname string) string {
+ switch hostname {
+ case "github.com":
+ return "fa-github"
+ default:
+ return "fa-git-alt"
+ }
+}
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 223df91fda..0c83a7aef1 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -621,6 +621,8 @@ migrate.invalid_local_path = "The local path is invalid. It does not exist or is
migrate.failed = Migration failed: %v
migrate.lfs_mirror_unsupported = Mirroring LFS objects is not supported - use 'git lfs fetch --all' and 'git lfs push --all' instead.
migrate.migrate_items_options = When migrating from github, input a username and migration options will be displayed.
+migrated_from = Migrated from <a href="%[1]s">%[2]s</a>
+migrated_from_fake = Migrated From %[1]s
mirror_from = mirror of
forked_from = forked from
diff --git a/public/css/index.css b/public/css/index.css
index 437605e1d3..9039409f14 100644
--- a/public/css/index.css
+++ b/public/css/index.css
@@ -137,6 +137,9 @@ a{cursor:pointer}
.ui .background.purple{background-color:#6e5494!important}
.ui .background.yellow{background-color:#fbbf09!important}
.ui .background.gold{background-color:#a1882b!important}
+.ui .migrate{color:#888!important;opacity:.5}
+.ui .migrate a{color:#444!important}
+.ui .migrate a:hover{color:#000!important}
.ui .branch-tag-choice{line-height:20px}
@media only screen and (max-width:767px){.ui.pagination.menu .item.navigation span.navigation_label,.ui.pagination.menu .item:not(.active):not(.navigation){display:none}
}
diff --git a/public/less/_base.less b/public/less/_base.less
index 4ce1b8eff9..aae3b97c72 100644
--- a/public/less/_base.less
+++ b/public/less/_base.less
@@ -588,6 +588,18 @@ code,
}
}
+ .migrate {
+ color: #888888 !important;
+ opacity: 0.5;
+ a {
+ color: #444444 !important;
+
+ &:hover {
+ color: #000000 !important;
+ }
+ }
+ }
+
.branch-tag-choice {
line-height: 20px;
}
diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl
index 3007c99106..45b2cc67e3 100644
--- a/templates/repo/issue/list.tmpl
+++ b/templates/repo/issue/list.tmpl
@@ -234,8 +234,9 @@
<p class="desc">
{{ $timeStr := TimeSinceUnix .GetLastEventTimestamp $.Lang }}
-
- {{if gt .Poster.ID 0}}
+ {{if .OriginalAuthor }}
+ {{$.i18n.Tr .GetLastEventLabelFake $timeStr .OriginalAuthor | Safe}}
+ {{else if gt .Poster.ID 0}}
{{$.i18n.Tr .GetLastEventLabel $timeStr .Poster.HomeLink (.Poster.GetDisplayName | Escape) | Safe}}
{{else}}
{{$.i18n.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName | Escape) | Safe}}
diff --git a/templates/repo/issue/view_content.tmpl b/templates/repo/issue/view_content.tmpl
index 16700a8dc1..b3f88c662d 100644
--- a/templates/repo/issue/view_content.tmpl
+++ b/templates/repo/issue/view_content.tmpl
@@ -12,12 +12,20 @@
<div class="twelve wide column comment-list prevent-before-timeline">
<ui class="ui comments timeline-line">
<div class="comment">
+ {{if .Issue.OriginalAuthor }}
+ <span class="avatar"><img src="/img/avatar_default.png"></span>
+ {{else}}
<a class="avatar" {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>
<img src="{{.Issue.Poster.RelAvatarLink}}">
</a>
+ {{end}}
<div class="content">
<div class="ui top attached header">
+ {{if .Issue.OriginalAuthor }}
+ <span class="text black"><i class="fa {{MigrationIcon .Repository.GetOriginalURLHostname}}" aria-hidden="true"></i> {{ .Issue.OriginalAuthor }}</span><span class="text grey"> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}<span> <span class="text migrate">{{if .Repository.OriginalURL}} ({{$.i18n.Tr "repo.migrated_from" .Repository.OriginalURL .Repository.GetOriginalURLHostname | Safe }}){{end}}</span>
+ {{else}}
<span class="text grey"><a {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>{{.Issue.Poster.GetDisplayName}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span>
+ {{end}}
{{if not $.Repository.IsArchived}}
<div class="ui right actions">
{{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) }}
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index 20474f6302..68303cf1ca 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -9,12 +9,20 @@
22 = REVIEW, 23 = ISSUE_LOCKED, 24 = ISSUE_UNLOCKED -->
{{if eq .Type 0}}
<div class="comment" id="{{.HashTag}}">
+ {{if .OriginalAuthor }}
+ <span class="avatar"><img src="/img/avatar_default.png"></span>
+ {{else}}
<a class="avatar" {{if gt .Poster.ID 0}}href="{{.Poster.HomeLink}}"{{end}}>
<img src="{{.Poster.RelAvatarLink}}">
</a>
+ {{end}}
<div class="content">
<div class="ui top attached header">
+ {{if .OriginalAuthor }}
+ <span class="text black"><i class="fa {{MigrationIcon $.Repository.GetOriginalURLHostname}}" aria-hidden="true"></i> {{ .OriginalAuthor }}</span><span class="text grey"> {{$.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}} {{if $.Repository.OriginalURL}}</span><span class="text migrate">({{$.i18n.Tr "repo.migrated_from" $.Repository.OriginalURL $.Repository.GetOriginalURLHostname | Safe }}){{end}}</span>
+ {{else}}
<span class="text grey"><a {{if gt .Poster.ID 0}}href="{{.Poster.HomeLink}}"{{end}}>{{.Poster.GetDisplayName}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span>
+ {{end}}
{{if not $.Repository.IsArchived}}
<div class="ui right actions">
{{if gt .ShowTag 0}}
diff --git a/templates/repo/issue/view_title.tmpl b/templates/repo/issue/view_title.tmpl
index 78c892fa4d..4b254d2c4b 100644
--- a/templates/repo/issue/view_title.tmpl
+++ b/templates/repo/issue/view_title.tmpl
@@ -27,16 +27,28 @@
{{if .Issue.IsPull}}
{{if .Issue.PullRequest.HasMerged}}
{{ $mergedStr:= TimeSinceUnix .Issue.PullRequest.MergedUnix $.Lang }}
- <a {{if gt .Issue.PullRequest.Merger.ID 0}}href="{{.Issue.PullRequest.Merger.HomeLink}}"{{end}}>{{.Issue.PullRequest.Merger.GetDisplayName}}</a>
- <span class="pull-desc">{{$.i18n.Tr "repo.pulls.merged_title_desc" .NumCommits .HeadTarget .BaseTarget $mergedStr | Str2html}}</span>
+ {{if .Issue.OriginalAuthor }}
+ {{.Issue.OriginalAuthor}}
+ <span class="pull-desc">{{$.i18n.Tr "repo.pulls.merged_title_desc" .NumCommits .HeadTarget .BaseTarget $mergedStr | Str2html}}</span>
+ {{else}}
+ <a {{if gt .Issue.PullRequest.Merger.ID 0}}href="{{.Issue.PullRequest.Merger.HomeLink}}"{{end}}>{{.Issue.PullRequest.Merger.GetDisplayName}}</a>
+ <span class="pull-desc">{{$.i18n.Tr "repo.pulls.merged_title_desc" .NumCommits .HeadTarget .BaseTarget $mergedStr | Str2html}}</span>
+ {{end}}
{{else}}
- <a {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>{{.Issue.Poster.GetDisplayName}}</a>
- <span class="pull-desc">{{$.i18n.Tr "repo.pulls.title_desc" .NumCommits .HeadTarget .BaseTarget | Str2html}}</span>
+ {{if .Issue.OriginalAuthor }}
+ {{.Issue.OriginalAuthor}}
+ <span class="pull-desc">{{$.i18n.Tr "repo.pulls.title_desc" .NumCommits .HeadTarget .BaseTarget | Str2html}}</span>
+ {{else}}
+ <a {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>{{.Issue.Poster.GetDisplayName}}</a>
+ <span class="pull-desc">{{$.i18n.Tr "repo.pulls.title_desc" .NumCommits .HeadTarget .BaseTarget | Str2html}}</span>
+ {{end}}
{{end}}
{{else}}
{{ $createdStr:= TimeSinceUnix .Issue.CreatedUnix $.Lang }}
<span class="time-desc">
- {{if gt .Issue.Poster.ID 0}}
+ {{if .Issue.OriginalAuthor }}
+ {{$.i18n.Tr "repo.issues.opened_by_fake" $createdStr .Issue.OriginalAuthor | Safe}}
+ {{else if gt .Issue.Poster.ID 0}}
{{$.i18n.Tr "repo.issues.opened_by" $createdStr .Issue.Poster.HomeLink (.Issue.Poster.GetDisplayName|Escape) | Safe}}
{{else}}
{{$.i18n.Tr "repo.issues.opened_by_fake" $createdStr (.Issue.Poster.GetDisplayName|Escape) | Safe}}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index d6d501ed22..11f4161172 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -6971,6 +6971,15 @@
"type": "string",
"x-go-name": "IssueURL"
},
+ "original_author": {
+ "type": "string",
+ "x-go-name": "OriginalAuthor"
+ },
+ "original_author_id": {
+ "type": "integer",
+ "format": "int64",
+ "x-go-name": "OriginalAuthorID"
+ },
"pull_request_url": {
"type": "string",
"x-go-name": "PRURL"
@@ -8669,6 +8678,15 @@
"format": "int64",
"x-go-name": "Index"
},
+ "original_author": {
+ "type": "string",
+ "x-go-name": "OriginalAuthor"
+ },
+ "original_author_id": {
+ "type": "integer",
+ "format": "int64",
+ "x-go-name": "OriginalAuthorID"
+ },
"pull_request": {
"$ref": "#/definitions/PullRequestMeta"
},
@@ -9489,6 +9507,10 @@
"format": "int64",
"x-go-name": "OpenIssues"
},
+ "original_url": {
+ "type": "string",
+ "x-go-name": "OriginalURL"
+ },
"owner": {
"$ref": "#/definitions/User"
},
diff --git a/templates/user/dashboard/issues.tmpl b/templates/user/dashboard/issues.tmpl
index b69509d799..7083569164 100644
--- a/templates/user/dashboard/issues.tmpl
+++ b/templates/user/dashboard/issues.tmpl
@@ -93,7 +93,9 @@
{{end}}
<p class="desc">
- {{if gt .Poster.ID 0}}
+ {{if .OriginalAuthor}}
+ {{$.i18n.Tr .GetLastEventLabelFake $timeStr .OriginalAuthor | Safe}}
+ {{else if gt .Poster.ID 0}}
{{$.i18n.Tr .GetLastEventLabel $timeStr .Poster.HomeLink (.Poster.GetDisplayName|Escape) | Safe}}
{{else}}
{{$.i18n.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName|Escape) | Safe}}