7 "git.curoverse.com/arvados.git/sdk/go/arvados"
8 "git.curoverse.com/arvados.git/sdk/go/arvadostest"
9 "gopkg.in/src-d/go-billy.v3/osfs"
10 git "gopkg.in/src-d/go-git.v4"
11 git_config "gopkg.in/src-d/go-git.v4/config"
12 git_plumbing "gopkg.in/src-d/go-git.v4/plumbing"
13 git_http "gopkg.in/src-d/go-git.v4/plumbing/transport/http"
14 "gopkg.in/src-d/go-git.v4/storage/memory"
17 type gitMount arvados.Mount
19 func (gm gitMount) validate() error {
21 return fmt.Errorf("cannot mount git_tree path %q -- only \"/\" is supported", gm.Path)
26 // ExtractTree extracts the specified tree into dir, which is an
27 // existing empty local directory.
28 func (gm gitMount) extractTree(ac IArvadosClient, dir string) error {
33 baseURL, err := ac.Discovery("gitUrl")
35 return fmt.Errorf("discover gitUrl from API: %s", err)
37 u, err := url.Parse(baseURL.(string))
39 return fmt.Errorf("parse gitUrl %q: %s", baseURL, err)
41 u, err = u.Parse("/" + gm.UUID + ".git")
43 return fmt.Errorf("build git url from %q, %q: %s", baseURL, gm.UUID, err)
45 store := memory.NewStorage()
46 repo, err := git.Init(store, osfs.New(dir))
48 return fmt.Errorf("init repo: %s", err)
50 _, err = repo.CreateRemote(&git_config.RemoteConfig{
52 URLs: []string{u.String()},
55 return fmt.Errorf("create remote %q: %s", u.String(), err)
57 err = repo.Fetch(&git.FetchOptions{
59 Auth: git_http.NewBasicAuth("none", arvadostest.ActiveToken),
62 return fmt.Errorf("git fetch %q: %s", u.String(), err)
64 wt, err := repo.Worktree()
66 return fmt.Errorf("worktree failed: %s", err)
68 err = wt.Checkout(&git.CheckoutOptions{
69 Hash: git_plumbing.NewHash(gm.Commit),
72 return fmt.Errorf("checkout failed: %s", err)