package main import ( "flag" "io/ioutil" "log" "os" "os/exec" "code.gitea.io/sdk/gitea" "github.com/facebookarchive/flagenv" "github.com/gogs/go-gogs-client" _ "github.com/joho/godotenv/autoload" ) var ( gogsApiKey = flag.String("gogs-api-key", "", "gogs api key") gogsURL = flag.String("gogs-url", "", "gogs url") gogsUsername = flag.String("gogs-username", "", "gogs username") giteaApiKey = flag.String("gitea-api-key", "", "gitea api key") giteaURL = flag.String("gitea-url", "", "gitea url") giteaUsername = flag.String("gitea-username", "", "gitea username") ) func main() { flagenv.Parse() flag.Parse() gogsClient := gogs.NewClient(*gogsURL, *gogsApiKey) giteaClient := gitea.NewClient(*giteaURL, *giteaApiKey) repos, err := gogsClient.ListMyRepos() if err != nil { log.Fatal(err) } for _, gogsRepo := range repos { log.Printf("gogs repo %s", gogsRepo.FullName) giteaRepo, err := giteaClient.GetRepo(*giteaUsername, gogsRepo.Name) if err == nil { log.Printf("skipping gogs repo %s", gogsRepo.FullName) continue } giteaRepo, err = giteaClient.CreateRepo(gitea.CreateRepoOption{ Name: gogsRepo.Name, Description: gogsRepo.Description, Private: gogsRepo.Private, }) if err != nil { log.Printf("can't create repo for gogs repo %s: %v, skipping", gogsRepo.FullName, err) continue } tmpDir, err := ioutil.TempDir("", "gogs2gitea") if err != nil { panic(err) } defer os.RemoveAll(tmpDir) cmd := exec.Command("git", "clone", "--bare", gogsRepo.SSHURL, tmpDir) err = cmd.Run() if err != nil { log.Printf("can't clone gogs repo %s: %v, skipping", gogsRepo.FullName, err) continue } cmd = exec.Command("git", "push", "--mirror", giteaRepo.SSHURL) cmd.Dir = tmpDir err = cmd.Run() if err != nil { log.Printf("can't push repo to gitea repo %s: %v, skipping", giteaRepo.FullName, err) continue } } }