updated github_to_gogs

This commit is contained in:
Paul 2019-06-09 14:44:07 +02:00
parent c848dc5a80
commit f82b4c900b
4 changed files with 266 additions and 226 deletions

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"go.formatTool": "goimports"
}

194
functions.go Normal file
View 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)
}

View File

@ -1,240 +1,25 @@
package main package main
import ( import (
"fmt" "flag"
"net/http" "net/http"
"log"
"bytes"
"encoding/json"
"io/ioutil"
"gopkg.in/ini.v1"
"time"
"os"
"flag"
) )
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() flag.Parse()
GetReposFromGitHub() GetConfig(configpath, &config, &globalconfig, &githubconfig, &gogsconfig)
MigrateReposToGogs(repo_list) GetGogsUserUID(&config)
} repolist := GetReposFromGitHub()
MigrateReposToGogs(repolist)
func usage() {
fmt.Fprintf(os.Stderr, "usage: github_to_gogs [inputfile]\n")
flag.PrintDefaults()
os.Exit(2)
}
func GetConfig() {
flag.Usage = usage
flag.Parse()
var configfile string
if len(os.Args) > 1 {
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
View 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
}