func cloneCmd(args []string) { fs := flag.NewFlagSet("clone", flag.ExitOnError) urlStr := fs.String("url", "http://localhost:"+defaultPort, "base URL to a running vcsstore API server") sshKeyFile := fs.String("i", "", "ssh private key file for clone remote") fs.Usage = func() { fmt.Fprintln(os.Stderr, `usage: vcsstore clone [options] repo-id vcs-type clone-url Clones a repository on the server. Once finished, the repository will be available to the client via the vcsstore API. The options are: `) fs.PrintDefaults() os.Exit(1) } fs.Parse(args) if fs.NArg() != 3 { fs.Usage() } baseURL, err := url.Parse(*urlStr) if err != nil { log.Fatal(err) } repoPath, vcsType := fs.Arg(0), fs.Arg(1) cloneURL, err := url.Parse(fs.Arg(2)) if err != nil { log.Fatal(err) } var repo vcs.Repository c := vcsclient.New(baseURL, nil) repo, err = c.Repository(repoPath) if err != nil { log.Fatal("Open repository: ", err) } var opt vcs.RemoteOpts if *sshKeyFile != "" { key, err := ioutil.ReadFile(*sshKeyFile) if err != nil { log.Fatal(err) } opt.SSH = &vcs.SSHConfig{PrivateKey: key} } if repo, ok := repo.(vcsclient.RepositoryCloneUpdater); ok { err := repo.CloneOrUpdate(&vcsclient.CloneInfo{ VCS: vcsType, CloneURL: cloneURL.String(), RemoteOpts: opt, }) if err != nil { log.Fatal("Clone: ", err) } } else { log.Fatalf("Remote cloning is not implemented for %T.", repo) } fmt.Printf("%-5s cloned OK\n", repoPath) }