diff --git a/bitbucket/bitbucket.go b/bitbucket/bitbucket.go index 6793ef7..2f76efb 100644 --- a/bitbucket/bitbucket.go +++ b/bitbucket/bitbucket.go @@ -33,14 +33,14 @@ func Get(conf *types.Conf) []types.Repo { for _, r := range repositories.Items { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.Links["clone"].([]interface{})[0].(map[string]interface{})["href"].(string), SshUrl: r.Links["clone"].([]interface{})[1].(map[string]interface{})["href"].(string), Token: "", Defaultbranch: r.Mainbranch.Name, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.Links["clone"].([]interface{})[0].(map[string]interface{})["href"].(string), SshUrl: r.Links["clone"].([]interface{})[1].(map[string]interface{})["href"].(string), Token: "", Defaultbranch: r.Mainbranch.Name, Origin: repo, Owner: r.Owner["nickname"].(string), Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.Links["clone"].([]interface{})[0].(map[string]interface{})["href"].(string), SshUrl: r.Links["clone"].([]interface{})[1].(map[string]interface{})["href"].(string), Token: "", Defaultbranch: r.Mainbranch.Name, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.Links["clone"].([]interface{})[0].(map[string]interface{})["href"].(string), SshUrl: r.Links["clone"].([]interface{})[1].(map[string]interface{})["href"].(string), Token: "", Defaultbranch: r.Mainbranch.Name, Origin: repo, Owner: r.Owner["nickname"].(string), Hoster: types.GetHost(repo.Url)}) } } } diff --git a/config.example.yml b/config.example.yml index c341023..f04eb10 100644 --- a/config.example.yml +++ b/config.example.yml @@ -106,6 +106,7 @@ destination: url: http(s)://url-to-gitlab local: - path: /some/path/gickup + structured: true # checks repos out like hostersite/user|organization/repo cron: 0 22 * * * # optional # https://crontab.guru/ diff --git a/gitea/gitea.go b/gitea/gitea.go index 40510c7..ec1d99d 100644 --- a/gitea/gitea.go +++ b/gitea/gitea.go @@ -83,14 +83,14 @@ func Get(conf *types.Conf) []types.Repo { for _, r := range gitearepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(repo.Include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) } } orgopt := gitea.ListOptions{Page: 1, PageSize: 50} @@ -125,14 +125,14 @@ func Get(conf *types.Conf) []types.Repo { } for _, r := range orgrepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(repo.Include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) } } } diff --git a/github/github.go b/github/github.go index 35db722..d2c0a69 100644 --- a/github/github.go +++ b/github/github.go @@ -54,7 +54,7 @@ func Get(conf *types.Conf) []types.Repo { for _, r := range githubrepos { if include[*r.Name] { - repos = append(repos, types.Repo{Name: r.GetName(), Url: r.GetCloneURL(), SshUrl: r.GetSSHURL(), Token: repo.Token, Defaultbranch: r.GetDefaultBranch(), Origin: repo}) + repos = append(repos, types.Repo{Name: r.GetName(), Url: r.GetCloneURL(), SshUrl: r.GetSSHURL(), Token: repo.Token, Defaultbranch: r.GetDefaultBranch(), Origin: repo, Owner: r.GetOwner().GetLogin(), Hoster: "github.com"}) continue } if exclude[*r.Name] { @@ -64,7 +64,7 @@ func Get(conf *types.Conf) []types.Repo { continue } if len(repo.Include) == 0 { - repos = append(repos, types.Repo{Name: r.GetName(), Url: r.GetCloneURL(), SshUrl: r.GetSSHURL(), Token: repo.Token, Defaultbranch: r.GetDefaultBranch(), Origin: repo}) + repos = append(repos, types.Repo{Name: r.GetName(), Url: r.GetCloneURL(), SshUrl: r.GetSSHURL(), Token: repo.Token, Defaultbranch: r.GetDefaultBranch(), Origin: repo, Owner: r.GetOwner().GetLogin(), Hoster: "github.com"}) } } } diff --git a/gitlab/gitlab.go b/gitlab/gitlab.go index 699e91b..410a90f 100644 --- a/gitlab/gitlab.go +++ b/gitlab/gitlab.go @@ -97,14 +97,14 @@ func Get(conf *types.Conf) []types.Repo { for _, r := range gitlabrepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.Username, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.Username, Hoster: types.GetHost(repo.Url)}) } } if repo.Token != "" { @@ -142,14 +142,14 @@ func Get(conf *types.Conf) []types.Repo { } for _, r := range gitlabgrouprepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.Username, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.HTTPURLToRepo, SshUrl: r.SSHURLToRepo, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.Username, Hoster: types.GetHost(repo.Url)}) } } } diff --git a/gogs/gogs.go b/gogs/gogs.go index d44317d..f4f8505 100644 --- a/gogs/gogs.go +++ b/gogs/gogs.go @@ -55,14 +55,14 @@ func Get(conf *types.Conf) []types.Repo { for _, r := range gogsrepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) } } orgs, err := client.ListUserOrgs(repo.User) @@ -86,14 +86,14 @@ func Get(conf *types.Conf) []types.Repo { } for _, r := range orgrepos { if include[r.Name] { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) continue } if exclude[r.Name] { continue } if len(repo.Include) == 0 { - repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo}) + repos = append(repos, types.Repo{Name: r.Name, Url: r.CloneURL, SshUrl: r.SSHURL, Token: repo.Token, Defaultbranch: r.DefaultBranch, Origin: repo, Owner: r.Owner.UserName, Hoster: types.GetHost(repo.Url)}) } } } diff --git a/local/local.go b/local/local.go index fb8c7d2..39c76b6 100644 --- a/local/local.go +++ b/local/local.go @@ -18,6 +18,9 @@ import ( ) func Locally(repo types.Repo, l types.Local, dry bool) { + if l.Structured { + repo.Name = path.Join(repo.Hoster, repo.Owner, repo.Name) + } stat, err := os.Stat(l.Path) if os.IsNotExist(err) && !dry { err := os.MkdirAll(l.Path, 0777) diff --git a/main.go b/main.go index 2349765..15bcf34 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,9 @@ import ( "fmt" "io/ioutil" "os" + "os/user" "path/filepath" + "strings" "gickup/bitbucket" "gickup/gitea" @@ -56,6 +58,13 @@ func Backup(repos []types.Repo, conf *types.Conf) { log.Info().Str("stage", "backup").Msgf("starting backup for %s", r.Url) for i, d := range conf.Destination.Local { if !checkedpath { + usr, _ := user.Current() + dir := usr.HomeDir + if d.Path == "~" { + d.Path = dir + } else if strings.HasPrefix(d.Path, "~/") { + d.Path = filepath.Join(dir, d.Path[2:]) + } path, err := filepath.Abs(d.Path) if err != nil { log.Fatal().Str("stage", "locally").Str("path", d.Path).Msg(err.Error()) diff --git a/types/types.go b/types/types.go index 188804a..8034d03 100644 --- a/types/types.go +++ b/types/types.go @@ -21,7 +21,8 @@ type Destination struct { // Local type Local struct { - Path string `yaml:"path"` + Path string `yaml:"path"` + Structured bool `yaml:"structured"` } // Conf @@ -103,6 +104,8 @@ type Repo struct { Token string Defaultbranch string Origin GenRepo + Owner string + Hoster string } // Site @@ -112,6 +115,19 @@ type Site struct { Port int } +func GetHost(url string) string { + if strings.Contains(url, "http://") { + url = strings.Split(url, "http://")[1] + } + if strings.Contains(url, "https://") { + url = strings.Split(url, "https://")[1] + } + if strings.Contains(url, "/") { + url = strings.Split(url, "/")[0] + } + return url +} + func (s *Site) GetValues(url string) error { if strings.HasPrefix(url, "ssh://") { url = strings.Split(url, "ssh://")[1]