diff --git a/modules/migrations/base/downloader.go b/modules/migrations/base/downloader.go index 919f4b52a05f1..96df4d1136f45 100644 --- a/modules/migrations/base/downloader.go +++ b/modules/migrations/base/downloader.go @@ -24,6 +24,7 @@ type Downloader interface { GetPullRequests(page, perPage int) ([]*PullRequest, bool, error) GetReviews(pullRequestNumber int64) ([]*Review, error) FormatCloneURL(opts MigrateOptions, remoteAddr string) (string, error) + GetProjects() ([]*Project, error) } // DownloaderFactory defines an interface to match a downloader implementation and create a downloader diff --git a/modules/migrations/base/project.go b/modules/migrations/base/project.go new file mode 100644 index 0000000000000..7efa8c240702f --- /dev/null +++ b/modules/migrations/base/project.go @@ -0,0 +1,25 @@ +// Copyright 2020 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 base + +import "time" + +// Project is a standard project information +type Project struct { + Number int + Name string + Description string `xorm:"TEXT"` + State string + CreatedAt time.Time + UpdatedAt time.Time + Columns []*ProjectColumn +} + +type ProjectColumn struct { + Cards []*ProjectCard +} + +type ProjectCard struct { +} diff --git a/modules/migrations/base/uploader.go b/modules/migrations/base/uploader.go index dfcf81d052240..8e8bb2781d192 100644 --- a/modules/migrations/base/uploader.go +++ b/modules/migrations/base/uploader.go @@ -18,6 +18,7 @@ type Uploader interface { CreateComments(comments ...*Comment) error CreatePullRequests(prs ...*PullRequest) error CreateReviews(reviews ...*Review) error + CreateProjects(projects ...*Project) error Rollback() error Finish() error Close() diff --git a/modules/migrations/github.go b/modules/migrations/github.go index 4d832387ba30e..4ee5471456d27 100644 --- a/modules/migrations/github.go +++ b/modules/migrations/github.go @@ -740,3 +740,43 @@ func (g *GithubDownloaderV3) GetReviews(pullRequestNumber int64) ([]*base.Review } return allReviews, nil } + +func convertGithubProject(gp *github.Project) *base.Project { + var desc string + if gp.Body != nil { + desc = *gp.Body + } + return &base.Project{ + Name: *gp.Name, + Number: *gp.Number, + Description: desc, + State: *gp.State, + CreatedAt: gp.GetCreatedAt().Time, + UpdatedAt: gp.GetUpdatedAt().Time, + } +} + +func (g *GithubDownloaderV3) GetProjects() ([]*base.Project, error) { + var projects = make([]*base.Project, 0, 100) + opt := github.ListOptions{ + PerPage: 100, + } + for { + g.sleep() + gprojects, resp, err := g.client.Repositories.ListProjects(g.ctx, g.repoOwner, g.repoName, &github.ProjectListOptions{ + ListOptions: opt, + }) + if err != nil { + return nil, fmt.Errorf("error while listing projects: %v", err) + } + g.rate = &resp.Rate + for _, p := range gprojects { + projects = append(projects, convertGithubProject(p)) + } + if resp.NextPage == 0 { + break + } + opt.Page = resp.NextPage + } + return projects, nil +} diff --git a/modules/migrations/gitlab.go b/modules/migrations/gitlab.go index a697075ff892b..e4ea750ab8967 100644 --- a/modules/migrations/gitlab.go +++ b/modules/migrations/gitlab.go @@ -647,3 +647,8 @@ func (g *GitlabDownloader) awardToReaction(award *gitlab.AwardEmoji) *base.React Content: award.Name, } } + +// GetProjects returns projects for the repository +func (g *GitlabDownloader) GetProjects() ([]*base.Project, error) { + return nil, ErrNotSupported +} diff --git a/modules/structs/repo.go b/modules/structs/repo.go index d588813b21883..653f19a5ab973 100644 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -283,3 +283,30 @@ var ( GogsService, } ) + +// MigrateRepoOption options for migrating a repository from an external service +type MigrateRepoOption struct { + // required: true + CloneAddr string `json:"clone_addr" binding:"Required"` + AuthUsername string `json:"auth_username"` + AuthPassword string `json:"auth_password"` + AuthToken string `json:"auth_token"` + // required: true + UID int `json:"uid" binding:"Required"` + // required: true + RepoName string `json:"repo_name" binding:"Required"` + Mirror bool `json:"mirror"` + Private bool `json:"private"` + Description string `json:"description"` + OriginalURL string + GitServiceType GitServiceType + Wiki bool + Issues bool + Milestones bool + Labels bool + Releases bool + Comments bool + PullRequests bool + Projects bool + MigrateToRepoID int64 +}