in cmd/zoekt-mirror-bitbucket-server/main.go [37:148]
func main() {
dest := flag.String("dest", "", "destination directory")
serverUrl := flag.String("url", "", "BitBucket Server url")
disableTLS := flag.Bool("disable-tls", false, "disables TLS verification")
credentialsFile := flag.String("credentials", ".bitbucket-credentials", "file holding BitBucket Server credentials")
project := flag.String("project", "", "project to mirror")
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.")
projectType := flag.String("type", "", "only clone repos whose type matches the given string. "+
"Type can be either NORMAl or PERSONAL. Clones projects of both types if not set.")
flag.Parse()
if *serverUrl == "" {
log.Fatal("must set --url")
}
rootURL, err := url.Parse(*serverUrl)
if err != nil {
log.Fatalf("url.Parse(): %v", err)
}
if *dest == "" {
log.Fatal("must set --dest")
}
if *projectType != "" && !IsValidProjectType(*projectType) {
log.Fatal("type should be either NORMAL or PERSONAL")
}
destDir := filepath.Join(*dest, rootURL.Host)
if err := os.MkdirAll(destDir, 0o755); err != nil {
log.Fatal(err)
}
username := ""
password := ""
if *credentialsFile == "" {
log.Fatal("must set --credentials")
} else {
content, err := ioutil.ReadFile(*credentialsFile)
if err != nil {
log.Fatal(err)
}
credentials := strings.Fields(string(content))
username, password = credentials[0], credentials[1]
}
basicAuth := bitbucketv1.BasicAuth{UserName: username, Password: password}
ctx, cancel := context.WithTimeout(context.Background(), 120000*time.Millisecond)
ctx = context.WithValue(ctx, bitbucketv1.ContextBasicAuth, basicAuth)
defer cancel()
apiPath, err := url.Parse("/rest")
if err != nil {
log.Fatal(err)
}
apiBaseURL := rootURL.ResolveReference(apiPath).String()
var config *bitbucketv1.Configuration
if *disableTLS {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
httpClient := &http.Client{
Transport: tr,
}
httpClientConfig := func(configs *bitbucketv1.Configuration) {
configs.HTTPClient = httpClient
}
config = bitbucketv1.NewConfiguration(apiBaseURL, httpClientConfig)
} else {
config = bitbucketv1.NewConfiguration(apiBaseURL)
}
client := bitbucketv1.NewAPIClient(ctx, config)
var repos []bitbucketv1.Repository
if *project != "" {
repos, err = getProjectRepos(*client, *project)
} else {
repos, err = getAllRepos(*client)
}
if err != nil {
log.Fatal(err)
}
filter, err := gitindex.NewFilter(*namePattern, *excludePattern)
if err != nil {
log.Fatal(err)
}
trimmed := repos[:0]
for _, r := range repos {
if filter.Include(r.Slug) && (*projectType == "" || r.Project.Type == *projectType) {
trimmed = append(trimmed, r)
}
}
repos = trimmed
if err := cloneRepos(destDir, rootURL.Host, repos, password); err != nil {
log.Fatalf("cloneRepos: %v", err)
}
if *deleteRepos {
if err := deleteStaleRepos(*dest, filter, repos); err != nil {
log.Fatalf("deleteStaleRepos: %v", err)
}
}
}