added features to change destination username via the name instead of user id

This commit is contained in:
Paul 2019-01-27 23:47:41 +01:00
parent d559356e57
commit 4386664cf5
3 changed files with 155 additions and 125 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
*.swp
github_to_gogs
github_to_gogs.ini

View File

@ -10,7 +10,7 @@ import (
"gopkg.in/ini.v1"
"time"
"os"
"flag"
"flag"
)
var globalconfig GlobalConfig
@ -20,193 +20,221 @@ var gogsconfig GogsConfig
var client *http.Client
var resp *http.Response
var err error
var repo []Githubrepo
var repo_list []Githubrepo
var repo []GitHubRepo
var repo_list []GitHubRepo
var gogsorg GogsOrg
type Githubrepo struct {
Name string `json:"name"`
Clone_Url string `json:"clone_url"`
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
Name string
Clone_Url string
Uid int
Mirror bool
}
type GlobalConfig struct {
RequestTimeout time.Duration
UserAgent string
RequestTimeout time.Duration
UserAgent string
}
type GitHubConfig struct {
StarsPages string
MaxPagesNumber int
AuthUsername string
AuthPassword string
ContentType string
StarsPages string
MaxPagesNumber int
AuthUsername string
AuthPassword string
ContentType string
}
type GogsConfig struct {
Uid int
Username string
RepoUrlTmpl string
MigrateUrl string
AuthToken string
ContentType string
Mirror bool
Uid int
Username string
DestUsername string
RepoUrlTmpl string
OrgsUrlTmpl string
MigrateUrl string
AuthToken string
ContentType string
Mirror bool
}
func main() {
GetConfig()
GetReposFromGitHub()
MigrateReposToGogs(repo_list)
GetConfig()
GetGogsUserUid()
GetReposFromGitHub()
MigrateReposToGogs(repo_list)
}
func usage() {
fmt.Fprintf(os.Stderr, "usage: github_to_gogs [inputfile]\n")
flag.PrintDefaults()
os.Exit(2)
fmt.Fprintf(os.Stderr, "usage: github_to_gogs [inputfile]\n")
flag.PrintDefaults()
os.Exit(2)
}
func GetConfig() {
flag.Usage = usage
flag.Parse()
flag.Usage = usage
flag.Parse()
var configfile string
var configfile string
if len(os.Args) > 1 {
configfile = os.Args[1]
} else {
usage()
os.Exit(2)
}
if len(os.Args) > 1 {
configfile = os.Args[1]
} else {
usage()
os.Exit(2)
}
HandleError(err)
config, err := ini.Load(configfile)
HandleError(err)
config, err := ini.Load(configfile)
HandleError(err)
global_section := config.Section("global")
github_section := config.Section("github")
gogs_section := config.Section("gogs")
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)
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.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()
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, err = gogs_section.Key("uid").Int()
HandleError(err)
gogsconfig.Username = gogs_section.Key("username").String()
gogsconfig.RepoUrlTmpl = gogs_section.Key("repo_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)
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
func CheckGogsIsExistingRepo(repo GitHubRepo) bool {
var isExists bool = false
client = &http.Client{}
resp = &http.Response{}
client = &http.Client{}
resp = &http.Response{}
var gogs_repo_url string = fmt.Sprintf(gogsconfig.RepoUrlTmpl,gogsconfig.Username,repo.Name)
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)
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)
resp, err = client.Do(req)
HandleError(err)
if resp.StatusCode == 200 {
isexists = true
} else {
isexists = false
}
if resp.StatusCode == 200 {
isExists = true
} else {
isExists = false
}
return isexists
return isExists
}
func MigrateReposToGogs(repo_list []Githubrepo) {
fmt.Println("Migrate repos to Gogs...")
func GetGogsUserUid() {
client = &http.Client{}
resp = &http.Response{}
client = &http.Client{}
resp = &http.Response{}
var gogs_repo_url string = fmt.Sprintf(gogsconfig.OrgsUrlTmpl,gogsconfig.DestUsername)
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("GET", gogs_repo_url, nil)
req.Header.Set("Authorization", gogsconfig.AuthToken)
req.Header.Set("User-Agent", globalconfig.UserAgent)
req, err := http.NewRequest("POST", gogsconfig.MigrateUrl, bytes.NewBufferString(jsondata))
HandleError(err)
resp, err = client.Do(req)
HandleError(err)
req.Header.Add("Content-Type", gogsconfig.ContentType)
req.Header.Set("User-Agent", globalconfig.UserAgent)
req.Header.Set("Authorization", gogsconfig.AuthToken)
err = json.Unmarshal(*GetResponseBody(resp), &gogsorg)
HandleError(err)
client.Timeout=globalconfig.RequestTimeout
gogsconfig.Uid = gogsorg.Id
}
resp, err = client.Do(req)
HandleError(err)
} else {
fmt.Println(fmt.Sprintf("KO : Not migrating, %s exists ",elem.Name))
}
}
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)
for num := 1; num <= githubconfig.MaxPagesNumber; num++ {
url := fmt.Sprintf(githubconfig.StarsPages, githubconfig.AuthUsername, num)
InvokeGitHub(url)
InvokeGitHub(url)
err = json.Unmarshal(*GetResponseBody(resp), &repo)
HandleError(err)
err = json.Unmarshal(*GetResponseBody(resp), &repo)
HandleError(err)
for _,elem := range repo {
repo_list = append(repo_list, elem)
}
}
fmt.Println("Repositories from Github fetched !")
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{}
client = &http.Client{}
resp = &http.Response{}
req, err := http.NewRequest("GET", url, nil)
HandleError(err)
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)
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)
resp, err = client.Do(req)
HandleError(err)
}
func GetResponseBody(resp *http.Response) *[]byte {
bodyBytes, err := ioutil.ReadAll(resp.Body)
HandleError(err)
return &bodyBytes
bodyBytes, err := ioutil.ReadAll(resp.Body)
HandleError(err)
return &bodyBytes
}
func HandleError(err error) {
if err != nil {
log.Fatal(err)
}
if err != nil {
log.Fatal(err)
}
}

View File

@ -10,9 +10,10 @@ auth_password="pass"
content_type="application/x-www-form-urlencoded"
[gogs]
uid=1
username="user"
dest_username="user_or_org"
repo_url_tmpl="https://gogs.example.com/api/v1/repos/%s/%s"
orgs_url_tmpl="https://git.paulbsd.com/api/v1/orgs/%s"
migrate_url="https://gogs.example.com/api/v1/repos/migrate"
auth_token="token xxxx"
content_type="application/json"