github.com/chalford/terraform@v0.3.7-0.20150113080010-a78c69a8c81f/config/module/get_hg.go (about) 1 package module 2 3 import ( 4 "fmt" 5 "net/url" 6 "os" 7 "os/exec" 8 ) 9 10 // HgGetter is a Getter implementation that will download a module from 11 // a Mercurial repository. 12 type HgGetter struct{} 13 14 func (g *HgGetter) Get(dst string, u *url.URL) error { 15 if _, err := exec.LookPath("hg"); err != nil { 16 return fmt.Errorf("hg must be available and on the PATH") 17 } 18 19 // Extract some query parameters we use 20 var rev string 21 q := u.Query() 22 if len(q) > 0 { 23 rev = q.Get("rev") 24 q.Del("rev") 25 26 // Copy the URL 27 var newU url.URL = *u 28 u = &newU 29 u.RawQuery = q.Encode() 30 } 31 32 _, err := os.Stat(dst) 33 if err != nil && !os.IsNotExist(err) { 34 return err 35 } 36 if err != nil { 37 if err := g.clone(dst, u); err != nil { 38 return err 39 } 40 } 41 42 if err := g.pull(dst, u); err != nil { 43 return err 44 } 45 46 return g.update(dst, u, rev) 47 } 48 49 func (g *HgGetter) clone(dst string, u *url.URL) error { 50 cmd := exec.Command("hg", "clone", "-U", u.String(), dst) 51 return getRunCommand(cmd) 52 } 53 54 func (g *HgGetter) pull(dst string, u *url.URL) error { 55 cmd := exec.Command("hg", "pull") 56 cmd.Dir = dst 57 return getRunCommand(cmd) 58 } 59 60 func (g *HgGetter) update(dst string, u *url.URL, rev string) error { 61 args := []string{"update"} 62 if rev != "" { 63 args = append(args, rev) 64 } 65 66 cmd := exec.Command("hg", args...) 67 cmd.Dir = dst 68 return getRunCommand(cmd) 69 }