in cmd/zoekt-mirror-gitlab/main.go [42:138]
func main() {
dest := flag.String("dest", "", "destination directory")
gitlabURL := flag.String("url", "https://gitlab.com/api/v4/", "Gitlab URL. If not set https://gitlab.com/api/v4/ will be used")
token := flag.String("token",
filepath.Join(os.Getenv("HOME"), ".gitlab-token"),
"file holding API token.")
isMember := flag.Bool("membership", false, "only mirror repos this user is a member of ")
isPublic := flag.Bool("public", false, "only mirror public repos")
deleteRepos := flag.Bool("delete", false, "delete missing repos")
namePattern := flag.String("name", "", "only clone repos whose name matches the given regexp.")
excludePattern := flag.String("exclude", "", "don't mirror repos whose names match this regexp.")
flag.Parse()
if *dest == "" {
log.Fatal("must set --dest")
}
var host string
rootURL, err := url.Parse(*gitlabURL)
if err != nil {
log.Fatal(err)
}
host = rootURL.Host
destDir := filepath.Join(*dest, host)
if err := os.MkdirAll(destDir, 0o755); err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadFile(*token)
if err != nil {
log.Fatal(err)
}
apiToken := strings.TrimSpace(string(content))
client := gitlab.NewClient(nil, apiToken)
client.SetBaseURL(*gitlabURL)
opt := &gitlab.ListProjectsOptions{
ListOptions: gitlab.ListOptions{
PerPage: 10,
Page: 1,
},
Membership: isMember,
}
if *isPublic {
opt.Visibility = gitlab.Visibility(gitlab.PublicVisibility)
}
var gitlabProjects []*gitlab.Project
for {
projects, resp, err := client.Projects.ListProjects(opt)
if err != nil {
log.Fatal(err)
}
for _, project := range projects {
// Skip projects without a default branch - these should be projects
// where the repository isn't enabled
if project.DefaultBranch == "" {
continue
}
gitlabProjects = append(gitlabProjects, project)
}
if resp.CurrentPage >= resp.TotalPages {
break
}
opt.Page = resp.NextPage
}
filter, err := gitindex.NewFilter(*namePattern, *excludePattern)
if err != nil {
log.Fatal(err)
}
{
trimmed := gitlabProjects[:0]
for _, p := range gitlabProjects {
if filter.Include(p.NameWithNamespace) {
trimmed = append(trimmed, p)
}
}
gitlabProjects = trimmed
}
fetchProjects(destDir, apiToken, gitlabProjects)
if *deleteRepos {
if err := deleteStaleProjects(*dest, filter, gitlabProjects); err != nil {
log.Fatalf("deleteStaleProjects: %v", err)
}
}
}