updated github_to_gogs
This commit is contained in:
parent
c848dc5a80
commit
f82b4c900b
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"go.formatTool": "goimports"
|
||||||
|
}
|
194
functions.go
Normal file
194
functions.go
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetConfig fetch configuration
|
||||||
|
func GetConfig(configfile string, config *Config, globalconfig *GlobalConfig, githubconfig *GitHubConfig, gogsconfig *GogsConfig) {
|
||||||
|
flag.Usage = Usage
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
cfg, err := ini.Load(configfile)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
globalsection := cfg.Section("global")
|
||||||
|
githubsection := cfg.Section("github")
|
||||||
|
gogssection := cfg.Section("gogs")
|
||||||
|
|
||||||
|
globalconfig.UserAgent = globalsection.Key("user_agent").String()
|
||||||
|
globalconfig.RequestTimeout, err = globalsection.Key("request_timeout").Duration()
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
githubconfig.StarsPages = githubsection.Key("stars_pages").String()
|
||||||
|
githubconfig.MaxPagesNumber, err = githubsection.Key("max_pages_number").Int()
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
githubconfig.AuthUsername = githubsection.Key("auth_username").String()
|
||||||
|
githubconfig.AuthPassword = githubsection.Key("auth_password").String()
|
||||||
|
githubconfig.ContentType = githubsection.Key("content_type").String()
|
||||||
|
|
||||||
|
gogsconfig.UID = -1
|
||||||
|
gogsconfig.Username = gogssection.Key("username").String()
|
||||||
|
gogsconfig.DestUsername = gogssection.Key("dest_username").String()
|
||||||
|
gogsconfig.RepoURLTmpl = gogssection.Key("repo_url_tmpl").String()
|
||||||
|
gogsconfig.OrgsURLTmpl = gogssection.Key("orgs_url_tmpl").String()
|
||||||
|
gogsconfig.MigrateURL = gogssection.Key("migrate_url").String()
|
||||||
|
gogsconfig.AuthToken = gogssection.Key("auth_token").String()
|
||||||
|
gogsconfig.ContentType = gogssection.Key("content_type").String()
|
||||||
|
gogsconfig.Mirror, err = gogssection.Key("mirror").Bool()
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
*config = Config{globalconfig: *globalconfig,
|
||||||
|
githubconfig: *githubconfig,
|
||||||
|
gogsconfig: *gogsconfig}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckGogsIsExistingRepo ...
|
||||||
|
func CheckGogsIsExistingRepo(repo GitHubRepo) bool {
|
||||||
|
var isExists bool
|
||||||
|
|
||||||
|
client = &http.Client{}
|
||||||
|
resp = &http.Response{}
|
||||||
|
|
||||||
|
gogsrepourl := fmt.Sprintf(gogsconfig.RepoURLTmpl, gogsconfig.DestUsername, repo.Name)
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", gogsrepourl, nil)
|
||||||
|
req.Header.Set("Authorization", gogsconfig.AuthToken)
|
||||||
|
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
||||||
|
|
||||||
|
resp, err = client.Do(req)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
if resp.StatusCode == 200 {
|
||||||
|
isExists = true
|
||||||
|
} else {
|
||||||
|
isExists = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return isExists
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGogsUserUID ...
|
||||||
|
func GetGogsUserUID(config *Config) {
|
||||||
|
var gogsorg GogsOrg
|
||||||
|
client = &http.Client{}
|
||||||
|
resp = &http.Response{}
|
||||||
|
|
||||||
|
gogsrepourl := fmt.Sprintf(config.gogsconfig.OrgsURLTmpl, config.gogsconfig.DestUsername)
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", gogsrepourl, nil)
|
||||||
|
req.Header.Set("Authorization", config.gogsconfig.AuthToken)
|
||||||
|
req.Header.Set("User-Agent", config.globalconfig.UserAgent)
|
||||||
|
|
||||||
|
resp, err = client.Do(req)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
err = json.Unmarshal(*GetResponseBody(resp), &gogsorg)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
gogsconfig.UID = gogsorg.ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// MigrateReposToGogs ...
|
||||||
|
func MigrateReposToGogs(repolist []GitHubRepo) {
|
||||||
|
fmt.Println("Migrate repos to Gogs...")
|
||||||
|
|
||||||
|
client = &http.Client{}
|
||||||
|
resp = &http.Response{}
|
||||||
|
|
||||||
|
for _, elem := range repolist {
|
||||||
|
if !CheckGogsIsExistingRepo(elem) {
|
||||||
|
jsondata := fmt.Sprintf(`{"uid" : %d, "repo_name" : "%s" , "mirror" : %v, "clone_addr" : "%s"}`, gogsconfig.UID, elem.Name, true, elem.CloneURL)
|
||||||
|
fmt.Println(fmt.Sprintf("OK : Send migrating instruction for %s to gogs webservice", elem.Name))
|
||||||
|
|
||||||
|
req, err := http.NewRequest("POST", gogsconfig.MigrateURL, bytes.NewBufferString(jsondata))
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
req.Header.Add("Content-Type", gogsconfig.ContentType)
|
||||||
|
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
||||||
|
req.Header.Set("Authorization", gogsconfig.AuthToken)
|
||||||
|
|
||||||
|
client.Timeout = globalconfig.RequestTimeout
|
||||||
|
|
||||||
|
resp, err = client.Do(req)
|
||||||
|
HandleError(err)
|
||||||
|
} else {
|
||||||
|
fmt.Println(fmt.Sprintf("KO : Not migrating, %s exists ", elem.Name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetReposFromGitHub ...
|
||||||
|
func GetReposFromGitHub() []GitHubRepo {
|
||||||
|
var repolist []GitHubRepo
|
||||||
|
var repo []GitHubRepo
|
||||||
|
for num := 1; num <= githubconfig.MaxPagesNumber; num++ {
|
||||||
|
url := fmt.Sprintf(githubconfig.StarsPages, githubconfig.AuthUsername, num)
|
||||||
|
|
||||||
|
InvokeGitHub(url)
|
||||||
|
|
||||||
|
err = json.Unmarshal(*GetResponseBody(resp), &repo)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
for _, elem := range repo {
|
||||||
|
repolist = append(repolist, elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("Repositories from Github fetched !")
|
||||||
|
return repolist
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvokeGitHub ...
|
||||||
|
func InvokeGitHub(url string) {
|
||||||
|
client = &http.Client{}
|
||||||
|
resp = &http.Response{}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
HandleError(err)
|
||||||
|
|
||||||
|
req.Header.Add("Content-Type", githubconfig.ContentType)
|
||||||
|
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
||||||
|
req.SetBasicAuth(githubconfig.AuthUsername, githubconfig.AuthPassword)
|
||||||
|
|
||||||
|
resp, err = client.Do(req)
|
||||||
|
HandleError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResponseBody ...
|
||||||
|
func GetResponseBody(resp *http.Response) *[]byte {
|
||||||
|
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
||||||
|
HandleError(err)
|
||||||
|
return &bodyBytes
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleError handles errors to return err
|
||||||
|
func HandleError(err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleFatalError fatal errors
|
||||||
|
func HandleFatalError(err error) {
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usage displays possible arguments
|
||||||
|
func Usage() {
|
||||||
|
flag.PrintDefaults()
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
@ -1,240 +1,25 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"log"
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"io/ioutil"
|
|
||||||
"gopkg.in/ini.v1"
|
|
||||||
"time"
|
|
||||||
"os"
|
|
||||||
"flag"
|
"flag"
|
||||||
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var config Config
|
||||||
var globalconfig GlobalConfig
|
var globalconfig GlobalConfig
|
||||||
var githubconfig GitHubConfig
|
var githubconfig GitHubConfig
|
||||||
var gogsconfig GogsConfig
|
var gogsconfig GogsConfig
|
||||||
|
|
||||||
|
var err error
|
||||||
var client *http.Client
|
var client *http.Client
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
var err error
|
var configpath string
|
||||||
var repo []GitHubRepo
|
|
||||||
var repo_list []GitHubRepo
|
|
||||||
var gogsorg GogsOrg
|
|
||||||
|
|
||||||
type GitHubRepo struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Clone_Url string `json:"clone_url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GogsOrg struct {
|
|
||||||
Id int `json:"id"`
|
|
||||||
Username string `json:"username"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GogsMigrateRepo struct {
|
|
||||||
Name string
|
|
||||||
Clone_Url string
|
|
||||||
Uid int
|
|
||||||
Mirror bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type GlobalConfig struct {
|
|
||||||
RequestTimeout time.Duration
|
|
||||||
UserAgent string
|
|
||||||
}
|
|
||||||
|
|
||||||
type GitHubConfig struct {
|
|
||||||
StarsPages string
|
|
||||||
MaxPagesNumber int
|
|
||||||
AuthUsername string
|
|
||||||
AuthPassword string
|
|
||||||
ContentType string
|
|
||||||
}
|
|
||||||
|
|
||||||
type GogsConfig struct {
|
|
||||||
Uid int
|
|
||||||
Username string
|
|
||||||
DestUsername string
|
|
||||||
RepoUrlTmpl string
|
|
||||||
OrgsUrlTmpl string
|
|
||||||
MigrateUrl string
|
|
||||||
AuthToken string
|
|
||||||
ContentType string
|
|
||||||
Mirror bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
GetConfig()
|
flag.StringVar(&configpath, "configfile", "github_to_gogs.ini", "config file to use with github_to_gogs section")
|
||||||
GetGogsUserUid()
|
|
||||||
GetReposFromGitHub()
|
|
||||||
MigrateReposToGogs(repo_list)
|
|
||||||
}
|
|
||||||
|
|
||||||
func usage() {
|
|
||||||
fmt.Fprintf(os.Stderr, "usage: github_to_gogs [inputfile]\n")
|
|
||||||
flag.PrintDefaults()
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetConfig() {
|
|
||||||
flag.Usage = usage
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
GetConfig(configpath, &config, &globalconfig, &githubconfig, &gogsconfig)
|
||||||
var configfile string
|
GetGogsUserUID(&config)
|
||||||
|
repolist := GetReposFromGitHub()
|
||||||
if len(os.Args) > 1 {
|
MigrateReposToGogs(repolist)
|
||||||
configfile = os.Args[1]
|
|
||||||
} else {
|
|
||||||
usage()
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
config, err := ini.Load(configfile)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
global_section := config.Section("global")
|
|
||||||
github_section := config.Section("github")
|
|
||||||
gogs_section := config.Section("gogs")
|
|
||||||
|
|
||||||
globalconfig.UserAgent = global_section.Key("user_agent").String()
|
|
||||||
globalconfig.RequestTimeout, err = global_section.Key("request_timeout").Duration()
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
githubconfig.StarsPages = github_section.Key("stars_pages").String()
|
|
||||||
githubconfig.MaxPagesNumber, err = github_section.Key("max_pages_number").Int()
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
githubconfig.AuthUsername = github_section.Key("auth_username").String()
|
|
||||||
githubconfig.AuthPassword = github_section.Key("auth_password").String()
|
|
||||||
githubconfig.ContentType = github_section.Key("content_type").String()
|
|
||||||
|
|
||||||
gogsconfig.Uid = -1
|
|
||||||
gogsconfig.Username = gogs_section.Key("username").String()
|
|
||||||
gogsconfig.DestUsername = gogs_section.Key("dest_username").String()
|
|
||||||
gogsconfig.RepoUrlTmpl = gogs_section.Key("repo_url_tmpl").String()
|
|
||||||
gogsconfig.OrgsUrlTmpl = gogs_section.Key("orgs_url_tmpl").String()
|
|
||||||
gogsconfig.MigrateUrl = gogs_section.Key("migrate_url").String()
|
|
||||||
gogsconfig.AuthToken = gogs_section.Key("auth_token").String()
|
|
||||||
gogsconfig.ContentType = gogs_section.Key("content_type").String()
|
|
||||||
gogsconfig.Mirror, err = gogs_section.Key("mirror").Bool()
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func CheckGogsIsExistingRepo(repo GitHubRepo) bool {
|
|
||||||
var isExists bool = false
|
|
||||||
|
|
||||||
client = &http.Client{}
|
|
||||||
resp = &http.Response{}
|
|
||||||
|
|
||||||
var gogs_repo_url string = fmt.Sprintf(gogsconfig.RepoUrlTmpl,gogsconfig.DestUsername,repo.Name)
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", gogs_repo_url, nil)
|
|
||||||
req.Header.Set("Authorization", gogsconfig.AuthToken)
|
|
||||||
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
|
||||||
|
|
||||||
resp, err = client.Do(req)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
if resp.StatusCode == 200 {
|
|
||||||
isExists = true
|
|
||||||
} else {
|
|
||||||
isExists = false
|
|
||||||
}
|
|
||||||
|
|
||||||
return isExists
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetGogsUserUid() {
|
|
||||||
client = &http.Client{}
|
|
||||||
resp = &http.Response{}
|
|
||||||
|
|
||||||
var gogs_repo_url string = fmt.Sprintf(gogsconfig.OrgsUrlTmpl,gogsconfig.DestUsername)
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", gogs_repo_url, nil)
|
|
||||||
req.Header.Set("Authorization", gogsconfig.AuthToken)
|
|
||||||
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
|
||||||
|
|
||||||
resp, err = client.Do(req)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
err = json.Unmarshal(*GetResponseBody(resp), &gogsorg)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
gogsconfig.Uid = gogsorg.Id
|
|
||||||
}
|
|
||||||
|
|
||||||
func MigrateReposToGogs(repo_list []GitHubRepo) {
|
|
||||||
fmt.Println("Migrate repos to Gogs...")
|
|
||||||
|
|
||||||
client = &http.Client{}
|
|
||||||
resp = &http.Response{}
|
|
||||||
|
|
||||||
for _,elem := range(repo_list) {
|
|
||||||
if !CheckGogsIsExistingRepo(elem) {
|
|
||||||
jsondata := fmt.Sprintf(`{"uid" : %d, "repo_name" : "%s" , "mirror" : %v, "clone_addr" : "%s"}`, gogsconfig.Uid, elem.Name, true, elem.Clone_Url)
|
|
||||||
fmt.Println(fmt.Sprintf("OK : Send migrating instruction for %s to gogs webservice",elem.Name))
|
|
||||||
|
|
||||||
req, err := http.NewRequest("POST", gogsconfig.MigrateUrl, bytes.NewBufferString(jsondata))
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
req.Header.Add("Content-Type", gogsconfig.ContentType)
|
|
||||||
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
|
||||||
req.Header.Set("Authorization", gogsconfig.AuthToken)
|
|
||||||
|
|
||||||
client.Timeout = globalconfig.RequestTimeout
|
|
||||||
|
|
||||||
resp, err = client.Do(req)
|
|
||||||
HandleError(err)
|
|
||||||
} else {
|
|
||||||
fmt.Println(fmt.Sprintf("KO : Not migrating, %s exists ",elem.Name))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetReposFromGitHub() {
|
|
||||||
for num := 1; num <= githubconfig.MaxPagesNumber; num++ {
|
|
||||||
url := fmt.Sprintf(githubconfig.StarsPages, githubconfig.AuthUsername, num)
|
|
||||||
|
|
||||||
InvokeGitHub(url)
|
|
||||||
|
|
||||||
err = json.Unmarshal(*GetResponseBody(resp), &repo)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
for _,elem := range repo {
|
|
||||||
repo_list = append(repo_list, elem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Println("Repositories from Github fetched !")
|
|
||||||
}
|
|
||||||
|
|
||||||
func InvokeGitHub(url string) {
|
|
||||||
client = &http.Client{}
|
|
||||||
resp = &http.Response{}
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", url, nil)
|
|
||||||
HandleError(err)
|
|
||||||
|
|
||||||
req.Header.Add("Content-Type", githubconfig.ContentType)
|
|
||||||
req.Header.Set("User-Agent", globalconfig.UserAgent)
|
|
||||||
req.SetBasicAuth(githubconfig.AuthUsername,githubconfig.AuthPassword)
|
|
||||||
|
|
||||||
resp, err = client.Do(req)
|
|
||||||
HandleError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetResponseBody(resp *http.Response) *[]byte {
|
|
||||||
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
|
||||||
HandleError(err)
|
|
||||||
return &bodyBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
func HandleError(err error) {
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
58
types.go
Normal file
58
types.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// GitHubRepo githubrepo struct
|
||||||
|
type GitHubRepo struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
CloneURL string `json:"clone_url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GogsOrg gogsrepo struct
|
||||||
|
type GogsOrg struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GogsMigrateRepo ...
|
||||||
|
type GogsMigrateRepo struct {
|
||||||
|
Name string
|
||||||
|
CloneURL string
|
||||||
|
UID int
|
||||||
|
Mirror bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config ...
|
||||||
|
type Config struct {
|
||||||
|
globalconfig GlobalConfig
|
||||||
|
gogsconfig GogsConfig
|
||||||
|
githubconfig GitHubConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalConfig ...
|
||||||
|
type GlobalConfig struct {
|
||||||
|
RequestTimeout time.Duration
|
||||||
|
UserAgent string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GitHubConfig ...
|
||||||
|
type GitHubConfig struct {
|
||||||
|
StarsPages string
|
||||||
|
MaxPagesNumber int
|
||||||
|
AuthUsername string
|
||||||
|
AuthPassword string
|
||||||
|
ContentType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GogsConfig ...
|
||||||
|
type GogsConfig struct {
|
||||||
|
UID int
|
||||||
|
Username string
|
||||||
|
DestUsername string
|
||||||
|
RepoURLTmpl string
|
||||||
|
OrgsURLTmpl string
|
||||||
|
MigrateURL string
|
||||||
|
AuthToken string
|
||||||
|
ContentType string
|
||||||
|
Mirror bool
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user