gogs2gitea/cmd/gogs2gitea/main.go

76 lines
1.9 KiB
Go

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
}
}
}