mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package migrations
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/hanzoai/git/modules/log"
|
|
base "github.com/hanzoai/git/modules/migration"
|
|
"github.com/hanzoai/git/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)
|
|
}
|
|
|
|
// 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, error) {
|
|
githubDownloader, err := NewGithubDownloaderV3(ctx, baseURL, userName, password, token, repoOwner, repoName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// 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,
|
|
}, nil
|
|
}
|
|
|
|
// SupportGetRepoComments return true if it supports get repo comments
|
|
func (g *GitBucketDownloader) SupportGetRepoComments() bool {
|
|
return false
|
|
}
|