]> source.dussan.org Git - gitea.git/commitdiff
Display original author and URL information when showing migrated issues/comments...
authormrsdizzie <info@mrsdizzie.com>
Mon, 8 Jul 2019 02:14:12 +0000 (22:14 -0400)
committerLunny Xiao <xiaolunwen@gmail.com>
Mon, 8 Jul 2019 02:14:12 +0000 (10:14 +0800)
* Store original author info for migrated issues and comments

Keep original author name for displaying in Gitea interface and also
store original author user ID for potential future use in linking
accounts from old location.

* Add original_url for repo

Store the original URL for a migrated repo

Clean up migrations/tests

* fix migration

* fix golangci-lint

* make 'make revive' happy also

* Modify templates to use OriginalAuthor if set

Use the original author name in templates if it is set rather than the
user who migrated/currently owns the issues

* formatting fixes

* make generate-swagger

* Use default avatar for imported comments

* Remove no longer used IgnoreIssueAuthor option

* Add OriginalAuthorID to swagger also

28 files changed:
models/issue.go
models/issue_comment.go
models/migrations/migrations.go
models/migrations/v89.go [new file with mode: 0644]
models/repo.go
modules/migrations/base/comment.go
modules/migrations/base/issue.go
modules/migrations/base/options.go
modules/migrations/base/pullrequest.go
modules/migrations/base/repo.go
modules/migrations/gitea.go
modules/migrations/gitea_test.go
modules/migrations/github.go
modules/migrations/github_test.go
modules/migrations/migrate.go
modules/structs/issue.go
modules/structs/issue_comment.go
modules/structs/repo.go
modules/templates/helper.go
options/locale/locale_en-US.ini
public/css/index.css
public/less/_base.less
templates/repo/issue/list.tmpl
templates/repo/issue/view_content.tmpl
templates/repo/issue/view_content/comments.tmpl
templates/repo/issue/view_title.tmpl
templates/swagger/v1_json.tmpl
templates/user/dashboard/issues.tmpl

index b5504beb71bcd77c7316645a504a0b4665ac8479..63074cd40ce8cee28257297d781f9c8c6525251b 100644 (file)
@@ -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"`
 
index c9f1bd9d5f22d5597e467362f9713ca9cc68c5ec..b930b0b12a2f70fa916add282df342c3645e22d6 100644 (file)
@@ -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
index ef43b0453b092d4ba4c4029c3913e1f7274dd775..62fadf5f361d01e78c5de6669bf02f628573f4f4 100644 (file)
@@ -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 (file)
index 0000000..83d0b1a
--- /dev/null
@@ -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))
+}
index 59ce18fa88e9ec725da0c1cc30eacec3ad3c43e4..9bedeba952f5ee1a95d0202853b137252c458bcc 100644 (file)
@@ -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
+}
index d89ec3a3f5a08dc75d8be843f1aef35e3e31cf6f..38c544d6e04f3b190ae8db8f114be3b33e4b8ece 100644 (file)
@@ -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
index ddadd0c2b3d7b2b4daea52ab10e5f1951860caa7..08d947b05d34bf4b7f16b538ef028ae9f577c539 100644 (file)
@@ -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
index 262981b9332680dd6252143755dff792d6bd49a5..ba7fdc68156acda6f64eb3e57d9607f9287363e7 100644 (file)
@@ -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
 }
index 515cab3f91974def573eeff0dcbed24711b4eb3e..42456fd3141ed1e879f0c11ce79173ef608654c1 100644 (file)
@@ -15,6 +15,7 @@ type PullRequest struct {
        Number         int64
        Title          string
        PosterName     string
+       PosterID       int64
        PosterEmail    string
        Content        string
        Milestone      string
index 907d8fc09e76b4254c66c0d269837d4c89a879f1..5cfb0de920db041a52ff11c5bd584f2cf56980f9 100644 (file)
@@ -15,4 +15,5 @@ type Repository struct {
        AuthUsername string
        AuthPassword string
        CloneURL     string
+       OriginalURL  string
 }
index 1df824c94f1ee6ce6857d98deae68fb1d8f5f6dc..b15aed5f4be85649dd743f2de92dd7107f2f2ac6 100644 (file)
@@ -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()),
                },
        }
 
index 22da7da171a92605ccc616c7396b939d6520ba4c..88a3a6d2189dca7f18c9fb58c36f10050478f568 100644 (file)
@@ -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)
 
index e6b532df9c5f5382cf13b5eb46e1a96a59167537..93ba1085481a69ebbc6030f6ab6927ac5f7e16da 100644 (file)
@@ -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,
index 700183bdc1acda1328d87eabc62ee14a7daf49a8..0f52a62eb25251694ee48b2819999365ebfa290a 100644 (file)
@@ -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),
index 7fc7911f2189de7644bed4279f6c5a382d918733..a86614c3172af7f799c5fa7d70b0fcc7657c4cd3 100644 (file)
@@ -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...)
 
index 6d7517bdc7b346364f6bccfcf03faa0e2fc0f105..58fd7344b4f27641fccfb7df17b011efc94c011f 100644 (file)
@@ -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
index 185f3910ed468936c9f5c39600edaed8820cc2f2..0c8ac20017fbc2ee2464a8d9627bc2ca9d1871a1 100644 (file)
@@ -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
index b4d162b776fa9699e3b9f90a7cdfb60e289cad88..81203319e01bb9539d192d2b10db84567b6fc49d 100644 (file)
@@ -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"`
index c4551bb4be4da962cb756d68d97e3c5d296938d9..5a3969c098f83670a100a7c11caf4dd66eb7cfe6 100644 (file)
@@ -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"
+       }
+}
index 223df91fda4691aa84c27bbc8033587bb8a2bf11..0c83a7aef17835d5e07f64f1142cb13b28496b0c 100644 (file)
@@ -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
index 437605e1d31f08f8521b8e4870460275f7988203..9039409f146837ff23dae4a337a792c341f252d1 100644 (file)
@@ -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}
 }
index 4ce1b8eff9f4cc75e29aa4d788bb0edc03ba9d9f..aae3b97c72516c2678047a30f42800ae2071bce1 100644 (file)
@@ -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;
     }
index 3007c991061e43961b1662824a9d2bf2605b2699..45b2cc67e37567698dd8d2eb6bd60bbb0cc3e63c 100644 (file)
 
                                        <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}}
index 16700a8dc19a016295e204bcbcd1823f7e58b28f..b3f88c662d99750f17b2fad385f599cd3e62304e 100644 (file)
        <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) }}
index 20474f630207f5bc8785c2a6ef3d8ce1aaec5691..68303cf1ca28ca8c874c82380c229893d19a9069 100644 (file)
@@ -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}}
index 78c892fa4d523ede896c7fd3e15b4b80e2e5c009..4b254d2c4b4a92647fd431109bfa498d4438ad4f 100644 (file)
        {{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}}
index d6d501ed22ca06d1d912868de761ebc34a6e4379..11f41611726d253a1e083b2dd5d6d6941207522d 100644 (file)
           "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"
           "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"
         },
           "format": "int64",
           "x-go-name": "OpenIssues"
         },
+        "original_url": {
+          "type": "string",
+          "x-go-name": "OriginalURL"
+        },
         "owner": {
           "$ref": "#/definitions/User"
         },
index b69509d7992c1a211e0b18c18d2869be695b913c..7083569164fb7fca5344258357656907e5d935bc 100644 (file)
@@ -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}}