From f82b4c900b27c8807469c247c69965381dee3882 Mon Sep 17 00:00:00 2001 From: Paul Lecuq Date: Sun, 9 Jun 2019 14:44:07 +0200 Subject: [PATCH] updated github_to_gogs --- .vscode/settings.json | 3 + functions.go | 194 ++++++++++++++++++++++++++++++++++ github_to_gogs.go | 237 ++---------------------------------------- types.go | 58 +++++++++++ 4 files changed, 266 insertions(+), 226 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 functions.go create mode 100644 types.go diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8c45cda --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.formatTool": "goimports" +} \ No newline at end of file diff --git a/functions.go b/functions.go new file mode 100644 index 0000000..842c1be --- /dev/null +++ b/functions.go @@ -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) +} diff --git a/github_to_gogs.go b/github_to_gogs.go index 63d9f70..bb7b7ec 100644 --- a/github_to_gogs.go +++ b/github_to_gogs.go @@ -1,240 +1,25 @@ package main 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 githubconfig GitHubConfig var gogsconfig GogsConfig +var err error var client *http.Client var resp *http.Response -var err error -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 -} +var configpath string func main() { - GetConfig() - 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() - - 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) - } + flag.StringVar(&configpath, "configfile", "github_to_gogs.ini", "config file to use with github_to_gogs section") + flag.Parse() + GetConfig(configpath, &config, &globalconfig, &githubconfig, &gogsconfig) + GetGogsUserUID(&config) + repolist := GetReposFromGitHub() + MigrateReposToGogs(repolist) } diff --git a/types.go b/types.go new file mode 100644 index 0000000..fdcecef --- /dev/null +++ b/types.go @@ -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 +}