mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-08-23 08:01:28 +02:00
Backport #30392 by @jam7 This patch improves the migration from gitbucket to gitea. The gitbucket uses it's own internal perPage value (= 25) for paging and ignore per_page arguments in the requested URL. This cause gitea to migrate only 25 issues and 25 PRs from gitbucket repository. This may not happens on old gitbucket. But recent gitbucket 4.40 or 4.38.4 has this problem. This patch change to use this internally hardcoded perPage of gitbucket as gitea's maxPerPage numer when migrating from gitbucket. There are several perPage values in gitbucket like 25 for Isseus/PRs and 10 for Releases. Some of those API doesn't support paging yet. It sounds difficult to implement, but using the minimum number among them worked out very well. So, I use 10 in this patch. Brief descriptions of problems and this patch are also available in https://github.com/go-gitea/gitea/issues/30316. In addition, I'm not sure what kind of test cases are possible to write here. It's a test for migration, so it requires testing gitbucket server and gitea server, I guess. Please let me know if it is possible to write such test cases here. Thanks! Co-authored-by: Kazushi (Jam) Marukawa <jam@pobox.com> (cherry picked from commit b941d7485b53e5dd093a1cce3c9ff47c91d4fc58)
91 lines
3 KiB
Go
91 lines
3 KiB
Go
// Copyright 2021 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package migrations
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
base "code.gitea.io/gitea/modules/migration"
|
|
"code.gitea.io/gitea/modules/structs"
|
|
)
|
|
|
|
var (
|
|
_ base.Downloader = &GitBucketDownloader{}
|
|
_ base.DownloaderFactory = &GitBucketDownloaderFactory{}
|
|
)
|
|
|
|
func init() {
|
|
RegisterDownloaderFactory(&GitBucketDownloaderFactory{})
|
|
}
|
|
|
|
// GitBucketDownloaderFactory defines a GitBucket downloader factory
|
|
type GitBucketDownloaderFactory struct{}
|
|
|
|
// New returns a Downloader related to this factory according MigrateOptions
|
|
func (f *GitBucketDownloaderFactory) New(ctx context.Context, opts base.MigrateOptions) (base.Downloader, error) {
|
|
u, err := url.Parse(opts.CloneAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fields := strings.Split(u.Path, "/")
|
|
if len(fields) < 2 {
|
|
return nil, fmt.Errorf("invalid path: %s", u.Path)
|
|
}
|
|
baseURL := u.Scheme + "://" + u.Host + strings.TrimSuffix(strings.Join(fields[:len(fields)-2], "/"), "/git")
|
|
|
|
oldOwner := fields[len(fields)-2]
|
|
oldName := strings.TrimSuffix(fields[len(fields)-1], ".git")
|
|
|
|
log.Trace("Create GitBucket downloader. BaseURL: %s RepoOwner: %s RepoName: %s", baseURL, oldOwner, oldName)
|
|
return NewGitBucketDownloader(ctx, baseURL, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, oldOwner, oldName), nil
|
|
}
|
|
|
|
// GitServiceType returns the type of git service
|
|
func (f *GitBucketDownloaderFactory) GitServiceType() structs.GitServiceType {
|
|
return structs.GitBucketService
|
|
}
|
|
|
|
// GitBucketDownloader implements a Downloader interface to get repository information
|
|
// from GitBucket via GithubDownloader
|
|
type GitBucketDownloader struct {
|
|
*GithubDownloaderV3
|
|
}
|
|
|
|
// String implements Stringer
|
|
func (g *GitBucketDownloader) String() string {
|
|
return fmt.Sprintf("migration from gitbucket server %s %s/%s", g.baseURL, g.repoOwner, g.repoName)
|
|
}
|
|
|
|
func (g *GitBucketDownloader) LogString() string {
|
|
if g == nil {
|
|
return "<GitBucketDownloader nil>"
|
|
}
|
|
return fmt.Sprintf("<GitBucketDownloader %s %s/%s>", g.baseURL, g.repoOwner, g.repoName)
|
|
}
|
|
|
|
// NewGitBucketDownloader creates a GitBucket downloader
|
|
func NewGitBucketDownloader(ctx context.Context, baseURL, userName, password, token, repoOwner, repoName string) *GitBucketDownloader {
|
|
githubDownloader := NewGithubDownloaderV3(ctx, baseURL, userName, password, token, repoOwner, repoName)
|
|
// Gitbucket 4.40 uses different internal hard-coded perPage values.
|
|
// Issues, PRs, and other major parts use 25. Release page uses 10.
|
|
// Some API doesn't support paging yet. Sounds difficult, but using
|
|
// minimum number among them worked out very well.
|
|
githubDownloader.maxPerPage = 10
|
|
githubDownloader.SkipReactions = true
|
|
githubDownloader.SkipReviews = true
|
|
return &GitBucketDownloader{
|
|
githubDownloader,
|
|
}
|
|
}
|
|
|
|
// SupportGetRepoComments return true if it supports get repo comments
|
|
func (g *GitBucketDownloader) SupportGetRepoComments() bool {
|
|
return false
|
|
}
|