Ejemplo n.º 1
0
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)
}