summaryrefslogtreecommitdiffstats
path: root/modules/migrations/gogs.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/migrations/gogs.go')
-rw-r--r--modules/migrations/gogs.go315
1 files changed, 0 insertions, 315 deletions
diff --git a/modules/migrations/gogs.go b/modules/migrations/gogs.go
deleted file mode 100644
index 06c944278b..0000000000
--- a/modules/migrations/gogs.go
+++ /dev/null
@@ -1,315 +0,0 @@
-// 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 (
- "context"
- "crypto/tls"
- "fmt"
- "net/http"
- "net/url"
- "strings"
- "time"
-
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/migrations/base"
- "code.gitea.io/gitea/modules/proxy"
- "code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/structs"
-
- "github.com/gogs/go-gogs-client"
-)
-
-var (
- _ base.Downloader = &GogsDownloader{}
- _ base.DownloaderFactory = &GogsDownloaderFactory{}
-)
-
-func init() {
- RegisterDownloaderFactory(&GogsDownloaderFactory{})
-}
-
-// GogsDownloaderFactory defines a gogs downloader factory
-type GogsDownloaderFactory struct {
-}
-
-// New returns a Downloader related to this factory according MigrateOptions
-func (f *GogsDownloaderFactory) New(ctx context.Context, opts base.MigrateOptions) (base.Downloader, error) {
- u, err := url.Parse(opts.CloneAddr)
- if err != nil {
- return nil, err
- }
-
- baseURL := u.Scheme + "://" + u.Host
- repoNameSpace := strings.TrimSuffix(u.Path, ".git")
- repoNameSpace = strings.Trim(repoNameSpace, "/")
-
- fields := strings.Split(repoNameSpace, "/")
- if len(fields) < 2 {
- return nil, fmt.Errorf("invalid path: %s", repoNameSpace)
- }
-
- log.Trace("Create gogs downloader. BaseURL: %s RepoOwner: %s RepoName: %s", baseURL, fields[0], fields[1])
- return NewGogsDownloader(ctx, baseURL, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, fields[0], fields[1]), nil
-}
-
-// GitServiceType returns the type of git service
-func (f *GogsDownloaderFactory) GitServiceType() structs.GitServiceType {
- return structs.GogsService
-}
-
-// GogsDownloader implements a Downloader interface to get repository information
-// from gogs via API
-type GogsDownloader struct {
- base.NullDownloader
- ctx context.Context
- client *gogs.Client
- baseURL string
- repoOwner string
- repoName string
- userName string
- password string
- openIssuesFinished bool
- openIssuesPages int
- transport http.RoundTripper
-}
-
-// SetContext set context
-func (g *GogsDownloader) SetContext(ctx context.Context) {
- g.ctx = ctx
-}
-
-// NewGogsDownloader creates a gogs Downloader via gogs API
-func NewGogsDownloader(ctx context.Context, baseURL, userName, password, token, repoOwner, repoName string) *GogsDownloader {
- var downloader = GogsDownloader{
- ctx: ctx,
- baseURL: baseURL,
- userName: userName,
- password: password,
- repoOwner: repoOwner,
- repoName: repoName,
- }
-
- var client *gogs.Client
- if len(token) != 0 {
- client = gogs.NewClient(baseURL, token)
- downloader.userName = token
- } else {
- downloader.transport = &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: setting.Migrations.SkipTLSVerify},
- Proxy: func(req *http.Request) (*url.URL, error) {
- req.SetBasicAuth(userName, password)
- return proxy.Proxy()(req)
- },
- }
-
- client = gogs.NewClient(baseURL, "")
- client.SetHTTPClient(&http.Client{
- Transport: &downloader,
- })
- }
-
- downloader.client = client
- return &downloader
-}
-
-// RoundTrip wraps the provided request within this downloader's context and passes it to our internal http.Transport.
-// This implements http.RoundTripper and makes the gogs client requests cancellable even though it is not cancellable itself
-func (g *GogsDownloader) RoundTrip(req *http.Request) (*http.Response, error) {
- return g.transport.RoundTrip(req.WithContext(g.ctx))
-}
-
-// GetRepoInfo returns a repository information
-func (g *GogsDownloader) GetRepoInfo() (*base.Repository, error) {
- gr, err := g.client.GetRepo(g.repoOwner, g.repoName)
- if err != nil {
- return nil, err
- }
-
- // convert gogs repo to stand Repo
- return &base.Repository{
- Owner: g.repoOwner,
- Name: g.repoName,
- IsPrivate: gr.Private,
- Description: gr.Description,
- CloneURL: gr.CloneURL,
- OriginalURL: gr.HTMLURL,
- DefaultBranch: gr.DefaultBranch,
- }, nil
-}
-
-// GetMilestones returns milestones
-func (g *GogsDownloader) GetMilestones() ([]*base.Milestone, error) {
- var perPage = 100
- var milestones = make([]*base.Milestone, 0, perPage)
-
- ms, err := g.client.ListRepoMilestones(g.repoOwner, g.repoName)
- if err != nil {
- return nil, err
- }
-
- for _, m := range ms {
- milestones = append(milestones, &base.Milestone{
- Title: m.Title,
- Description: m.Description,
- Deadline: m.Deadline,
- State: string(m.State),
- Closed: m.Closed,
- })
- }
-
- return milestones, nil
-}
-
-// GetLabels returns labels
-func (g *GogsDownloader) GetLabels() ([]*base.Label, error) {
- var perPage = 100
- var labels = make([]*base.Label, 0, perPage)
- ls, err := g.client.ListRepoLabels(g.repoOwner, g.repoName)
- if err != nil {
- return nil, err
- }
-
- for _, label := range ls {
- labels = append(labels, convertGogsLabel(label))
- }
-
- return labels, nil
-}
-
-// GetIssues returns issues according start and limit, perPage is not supported
-func (g *GogsDownloader) GetIssues(page, _ int) ([]*base.Issue, bool, error) {
- var state string
- if g.openIssuesFinished {
- state = string(gogs.STATE_CLOSED)
- page -= g.openIssuesPages
- } else {
- state = string(gogs.STATE_OPEN)
- g.openIssuesPages = page
- }
-
- issues, isEnd, err := g.getIssues(page, state)
- if err != nil {
- return nil, false, err
- }
-
- if isEnd {
- if g.openIssuesFinished {
- return issues, true, nil
- }
- g.openIssuesFinished = true
- }
-
- return issues, false, nil
-}
-
-func (g *GogsDownloader) getIssues(page int, state string) ([]*base.Issue, bool, error) {
- var allIssues = make([]*base.Issue, 0, 10)
-
- issues, err := g.client.ListRepoIssues(g.repoOwner, g.repoName, gogs.ListIssueOption{
- Page: page,
- State: state,
- })
- if err != nil {
- return nil, false, fmt.Errorf("error while listing repos: %v", err)
- }
-
- for _, issue := range issues {
- if issue.PullRequest != nil {
- continue
- }
- allIssues = append(allIssues, convertGogsIssue(issue))
- }
-
- return allIssues, len(issues) == 0, nil
-}
-
-// GetComments returns comments according issueNumber
-func (g *GogsDownloader) GetComments(opts base.GetCommentOptions) ([]*base.Comment, bool, error) {
- var allComments = make([]*base.Comment, 0, 100)
-
- comments, err := g.client.ListIssueComments(g.repoOwner, g.repoName, opts.Context.ForeignID())
- if err != nil {
- return nil, false, fmt.Errorf("error while listing repos: %v", err)
- }
- for _, comment := range comments {
- if len(comment.Body) == 0 || comment.Poster == nil {
- continue
- }
- allComments = append(allComments, &base.Comment{
- IssueIndex: opts.Context.LocalID(),
- PosterID: comment.Poster.ID,
- PosterName: comment.Poster.Login,
- PosterEmail: comment.Poster.Email,
- Content: comment.Body,
- Created: comment.Created,
- Updated: comment.Updated,
- })
- }
-
- return allComments, true, nil
-}
-
-// GetTopics return repository topics
-func (g *GogsDownloader) GetTopics() ([]string, error) {
- return []string{}, nil
-}
-
-// FormatCloneURL add authentification into remote URLs
-func (g *GogsDownloader) FormatCloneURL(opts MigrateOptions, remoteAddr string) (string, error) {
- if len(opts.AuthToken) > 0 || len(opts.AuthUsername) > 0 {
- u, err := url.Parse(remoteAddr)
- if err != nil {
- return "", err
- }
- if len(opts.AuthToken) != 0 {
- u.User = url.UserPassword(opts.AuthToken, "")
- } else {
- u.User = url.UserPassword(opts.AuthUsername, opts.AuthPassword)
- }
- return u.String(), nil
- }
- return remoteAddr, nil
-}
-
-func convertGogsIssue(issue *gogs.Issue) *base.Issue {
- var milestone string
- if issue.Milestone != nil {
- milestone = issue.Milestone.Title
- }
- var labels = make([]*base.Label, 0, len(issue.Labels))
- for _, l := range issue.Labels {
- labels = append(labels, convertGogsLabel(l))
- }
-
- var closed *time.Time
- if issue.State == gogs.STATE_CLOSED {
- // gogs client haven't provide closed, so we use updated instead
- closed = &issue.Updated
- }
-
- return &base.Issue{
- Title: issue.Title,
- Number: issue.Index,
- PosterID: issue.Poster.ID,
- PosterName: issue.Poster.Login,
- PosterEmail: issue.Poster.Email,
- Content: issue.Body,
- Milestone: milestone,
- State: string(issue.State),
- Created: issue.Created,
- Updated: issue.Updated,
- Labels: labels,
- Closed: closed,
- Context: base.BasicIssueContext(issue.Index),
- }
-}
-
-func convertGogsLabel(label *gogs.Label) *base.Label {
- return &base.Label{
- Name: label.Name,
- Color: label.Color,
- }
-}