various changes
This commit is contained in:
parent
c73a600096
commit
53f605dffc
17
.vscode/launch.json
vendored
Normal file
17
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Launch",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
"program": "${fileDirname}",
|
||||||
|
"env": {},
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
48
config.go
Normal file
48
config.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetConfig fetch configuration
|
||||||
|
func (config *Config) GetConfig() error {
|
||||||
|
var configfile string
|
||||||
|
|
||||||
|
flag.Usage = Usage
|
||||||
|
|
||||||
|
flag.StringVar(&configfile, "configfile", "g2g.ini", "config file to use with g2g section")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
cfg, err := ini.Load(configfile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
g2gsection := cfg.Section("g2g")
|
||||||
|
g2gsection.MapTo(config)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config is the global config of g2g
|
||||||
|
type Config struct {
|
||||||
|
G2gRequestTimeout time.Duration `ini:"g2g_request_timeout"`
|
||||||
|
G2gThreads int `ini:"g2g_threads"`
|
||||||
|
GitHubMaxPerPage int `ini:"github_max_per_page"`
|
||||||
|
GitHubPageNum int `ini:"github_page_num"`
|
||||||
|
GitHubAuthUsername string `ini:"github_auth_username"`
|
||||||
|
GitHubAuthPassword string `ini:"github_auth_password"`
|
||||||
|
GitHubContentType string
|
||||||
|
GiteaUID int
|
||||||
|
GiteaUsername string `ini:"gitea_username"`
|
||||||
|
GiteaDestUsername string `ini:"gitea_dest_username"`
|
||||||
|
GiteaRepoURLTmpl string `ini:"gitea_repo_url_tmpl"`
|
||||||
|
GiteaOrgsURLTmpl string `ini:"gitea_orgs_url_tmpl"`
|
||||||
|
GiteaMigrateURL string `ini:"gitea_migrate_url"`
|
||||||
|
GiteaAuthToken string `ini:"gitea_auth_token"`
|
||||||
|
GiteaContentType string
|
||||||
|
GiteaMirror bool `ini:"gitea_mirror"`
|
||||||
|
}
|
29
config_test.go
Normal file
29
config_test.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetConfig(t *testing.T) {
|
||||||
|
got := `
|
||||||
|
[g2g]
|
||||||
|
request_timeout=1200s
|
||||||
|
threads=4
|
||||||
|
|
||||||
|
github_stars_pages="https://api.github.com/users/%s/starred?page=%d"
|
||||||
|
github_max_per_page=500
|
||||||
|
github_page_num=3
|
||||||
|
github_auth_username="user"
|
||||||
|
github_auth_password="pass"
|
||||||
|
|
||||||
|
gitea_username="user"
|
||||||
|
gitea_dest_username="user_or_org"
|
||||||
|
gitea_repo_url_tmpl="https://gogs.example.com/api/v1/repos/%s/%s"
|
||||||
|
gitea_orgs_url_tmpl="https://git.paulbsd.com/api/v1/orgs/%s"
|
||||||
|
gitea_migrate_url="https://gogs.example.com/api/v1/repos/migrate"
|
||||||
|
gitea_auth_token="token xxxx"
|
||||||
|
gitea_mirror=true
|
||||||
|
`
|
||||||
|
fmt.Println(got)
|
||||||
|
}
|
90
functions.go
90
functions.go
@ -11,45 +11,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/ini.v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetConfig fetch configuration
|
|
||||||
func (config *Config) GetConfig() error {
|
|
||||||
var configfile string
|
|
||||||
|
|
||||||
flag.Usage = Usage
|
|
||||||
|
|
||||||
flag.StringVar(&configfile, "configfile", "g2g.ini", "config file to use with g2g section")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
cfg, err := ini.Load(configfile)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
g2gsection := cfg.Section("g2g")
|
|
||||||
|
|
||||||
config.UserAgent = g2gsection.Key("user_agent").MustString("Golang")
|
|
||||||
config.RequestTimeout = g2gsection.Key("request_timeout").MustDuration(1200)
|
|
||||||
config.Threads = g2gsection.Key("threads").MustInt(2)
|
|
||||||
config.GitHubPageNum = g2gsection.Key("github_page_num").MustInt(3)
|
|
||||||
config.GitHubMaxPerPage = g2gsection.Key("github_max_per_page").MustInt(100)
|
|
||||||
config.GitHubAuthUsername = g2gsection.Key("github_auth_username").MustString("username")
|
|
||||||
config.GitHubAuthPassword = g2gsection.Key("github_auth_password").MustString("password")
|
|
||||||
|
|
||||||
config.GiteaUsername = g2gsection.Key("gitea_username").MustString("username")
|
|
||||||
config.GiteaDestUsername = g2gsection.Key("gitea_dest_username").MustString("dest_username")
|
|
||||||
config.GiteaRepoURLTmpl = g2gsection.Key("gitea_repo_url_tmpl").MustString("repo_url")
|
|
||||||
config.GiteaOrgsURLTmpl = g2gsection.Key("gitea_orgs_url_tmpl").MustString("orgs_url")
|
|
||||||
config.GiteaMigrateURL = g2gsection.Key("gitea_migrate_url").MustString("migrate_url")
|
|
||||||
config.GiteaAuthToken = g2gsection.Key("gitea_auth_token").MustString("token")
|
|
||||||
config.GiteaMirror = g2gsection.Key("gitea_mirror").MustBool(true)
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReposFromGitHub get starred repositories from github
|
// GetReposFromGitHub get starred repositories from github
|
||||||
func GetReposFromGitHub(config *Config) ([]GitHubRepo, error) {
|
func GetReposFromGitHub(config *Config) ([]GitHubRepo, error) {
|
||||||
var repopartiallist []GitHubRepo
|
var repopartiallist []GitHubRepo
|
||||||
@ -60,7 +23,7 @@ func GetReposFromGitHub(config *Config) ([]GitHubRepo, error) {
|
|||||||
url := fmt.Sprintf("https://api.github.com/users/%s/starred?per_page=%d&page=%d", config.GitHubAuthUsername, config.GitHubMaxPerPage, num)
|
url := fmt.Sprintf("https://api.github.com/users/%s/starred?per_page=%d&page=%d", config.GitHubAuthUsername, config.GitHubMaxPerPage, num)
|
||||||
fmt.Println(url)
|
fmt.Println(url)
|
||||||
|
|
||||||
resp, err := InvokeGitHub(config, url)
|
resp, err := GetGitHubRepos(config, url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -84,15 +47,14 @@ func GetReposFromGitHub(config *Config) ([]GitHubRepo, error) {
|
|||||||
return repofulllist, nil
|
return repofulllist, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvokeGitHub ...
|
// GetGitHubRepos fetchs starred repositories on GitHub
|
||||||
func InvokeGitHub(config *Config, url string) (*http.Response, error) {
|
func GetGitHubRepos(config *Config, url string) (*http.Response, error) {
|
||||||
req, err := http.NewRequest("GET", url, nil)
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||||||
req.Header.Set("User-Agent", config.UserAgent)
|
|
||||||
req.SetBasicAuth(config.GitHubAuthUsername, config.GitHubAuthPassword)
|
req.SetBasicAuth(config.GitHubAuthUsername, config.GitHubAuthPassword)
|
||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
@ -101,18 +63,21 @@ func InvokeGitHub(config *Config, url string) (*http.Response, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return nil, fmt.Errorf("Error on status code %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckGiteaExistingRepo checks if there's an existing repository in gitea
|
// CheckGiteaExistingRepo checks if there's an existing repository in gitea
|
||||||
func CheckGiteaExistingRepo(config *Config, repo GitHubRepo) (bool, error) {
|
func CheckGiteaExistingRepo(config *Config, repo GitHubRepo) (bool, error) {
|
||||||
var isexists bool
|
var isExists bool
|
||||||
|
|
||||||
gitearepourl := fmt.Sprintf(config.GiteaRepoURLTmpl, config.GiteaDestUsername, repo.Name)
|
gitearepourl := fmt.Sprintf(config.GiteaRepoURLTmpl, config.GiteaDestUsername, repo.Name)
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", gitearepourl, nil)
|
req, err := http.NewRequest("GET", gitearepourl, nil)
|
||||||
req.Header.Set("Authorization", config.GiteaAuthToken)
|
req.Header.Set("Authorization", config.GiteaAuthToken)
|
||||||
req.Header.Set("User-Agent", config.UserAgent)
|
|
||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
@ -120,16 +85,15 @@ func CheckGiteaExistingRepo(config *Config, repo GitHubRepo) (bool, error) {
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.StatusCode == 200 {
|
if resp.StatusCode == http.StatusOK {
|
||||||
isexists = true
|
isExists = true
|
||||||
} else if resp.StatusCode == 404 {
|
} else if resp.StatusCode == http.StatusNotFound {
|
||||||
isexists = false
|
isExists = false
|
||||||
} else {
|
} else {
|
||||||
err = fmt.Errorf("Can't determine error, cancelling, error %d in gitea webservice", resp.StatusCode)
|
return false, fmt.Errorf("Can't determine error, cancelling, error %s in gitea webservice", resp.Status)
|
||||||
return false, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return isexists, nil
|
return isExists, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetGiteaUserUID get the logued user identifier
|
// GetGiteaUserUID get the logued user identifier
|
||||||
@ -144,7 +108,6 @@ func (config *Config) GetGiteaUserUID() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Set("Authorization", config.GiteaAuthToken)
|
req.Header.Set("Authorization", config.GiteaAuthToken)
|
||||||
req.Header.Set("User-Agent", config.UserAgent)
|
|
||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
@ -176,7 +139,7 @@ func RunMigration(config *Config, repolist []GitHubRepo) {
|
|||||||
done := make(chan bool)
|
done := make(chan bool)
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
for thr := range make([]int, config.Threads) {
|
for thr := range make([]int, config.G2gThreads) {
|
||||||
go MigrateReposToGitea(config, &wg, repochan, done, thr)
|
go MigrateReposToGitea(config, &wg, repochan, done, thr)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,10 +172,9 @@ func MigrateReposToGitea(config *Config, wg *sync.WaitGroup, jobs chan GitHubRep
|
|||||||
}
|
}
|
||||||
|
|
||||||
req.Header.Add("Content-Type", "application/json")
|
req.Header.Add("Content-Type", "application/json")
|
||||||
req.Header.Set("User-Agent", config.UserAgent)
|
|
||||||
req.Header.Set("Authorization", config.GiteaAuthToken)
|
req.Header.Set("Authorization", config.GiteaAuthToken)
|
||||||
|
|
||||||
client.Timeout = config.RequestTimeout
|
client.Timeout = config.G2gRequestTimeout
|
||||||
|
|
||||||
fmt.Println(fmt.Sprintf("Migrating repo %s to gitea rest api", elem.Name))
|
fmt.Println(fmt.Sprintf("Migrating repo %s to gitea rest api", elem.Name))
|
||||||
|
|
||||||
@ -242,3 +204,23 @@ func Usage() {
|
|||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GitHubRepo githubrepo struct
|
||||||
|
type GitHubRepo struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
CloneURL string `json:"clone_url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GiteaOrg gitearepo struct
|
||||||
|
type GiteaOrg struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GiteaMigrateRepo defines the repo to migrate
|
||||||
|
type GiteaMigrateRepo struct {
|
||||||
|
Name string
|
||||||
|
CloneURL string
|
||||||
|
UID int
|
||||||
|
Mirror bool
|
||||||
|
}
|
||||||
|
3
g2g.go
3
g2g.go
@ -7,6 +7,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
var config Config
|
var config Config
|
||||||
var err error
|
var err error
|
||||||
|
var repolist []GitHubRepo
|
||||||
|
|
||||||
err = config.GetConfig()
|
err = config.GetConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -18,7 +19,7 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
repolist, err := GetReposFromGitHub(&config)
|
repolist, err = GetReposFromGitHub(&config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
[g2g]
|
[g2g]
|
||||||
request_timeout=1200s
|
request_timeout=1200s
|
||||||
user_agent="Golang"
|
|
||||||
threads=4
|
threads=4
|
||||||
|
|
||||||
github_stars_pages="https://api.github.com/users/%s/starred?page=%d"
|
github_stars_pages="https://api.github.com/users/%s/starred?page=%d"
|
||||||
|
44
types.go
44
types.go
@ -1,44 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// GitHubRepo githubrepo struct
|
|
||||||
type GitHubRepo struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
CloneURL string `json:"clone_url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GiteaOrg gitearepo struct
|
|
||||||
type GiteaOrg struct {
|
|
||||||
ID int `json:"id"`
|
|
||||||
Username string `json:"username"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GiteaMigrateRepo defines the repo to migrate
|
|
||||||
type GiteaMigrateRepo struct {
|
|
||||||
Name string
|
|
||||||
CloneURL string
|
|
||||||
UID int
|
|
||||||
Mirror bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config is the global config of g2g
|
|
||||||
type Config struct {
|
|
||||||
RequestTimeout time.Duration
|
|
||||||
UserAgent string
|
|
||||||
Threads int
|
|
||||||
GitHubMaxPerPage int
|
|
||||||
GitHubPageNum int
|
|
||||||
GitHubAuthUsername string
|
|
||||||
GitHubAuthPassword string
|
|
||||||
GitHubContentType string
|
|
||||||
GiteaUID int
|
|
||||||
GiteaUsername string
|
|
||||||
GiteaDestUsername string
|
|
||||||
GiteaRepoURLTmpl string
|
|
||||||
GiteaOrgsURLTmpl string
|
|
||||||
GiteaMigrateURL string
|
|
||||||
GiteaAuthToken string
|
|
||||||
GiteaContentType string
|
|
||||||
GiteaMirror bool
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user