terraform/config/module/get_hg.go

70 lines
1.3 KiB
Go

package module
import (
"fmt"
"net/url"
"os"
"os/exec"
)
// HgGetter is a Getter implementation that will download a module from
// a Mercurial repository.
type HgGetter struct{}
func (g *HgGetter) Get(dst string, u *url.URL) error {
if _, err := exec.LookPath("hg"); err != nil {
return fmt.Errorf("hg must be available and on the PATH")
}
// Extract some query parameters we use
var rev string
q := u.Query()
if len(q) > 0 {
rev = q.Get("rev")
q.Del("rev")
// Copy the URL
var newU url.URL = *u
u = &newU
u.RawQuery = q.Encode()
}
_, err := os.Stat(dst)
if err != nil && !os.IsNotExist(err) {
return err
}
if err != nil {
if err := g.clone(dst, u); err != nil {
return err
}
}
if err := g.pull(dst, u); err != nil {
return err
}
return g.update(dst, u, rev)
}
func (g *HgGetter) clone(dst string, u *url.URL) error {
cmd := exec.Command("hg", "clone", "-U", u.String(), dst)
return getRunCommand(cmd)
}
func (g *HgGetter) pull(dst string, u *url.URL) error {
cmd := exec.Command("hg", "pull")
cmd.Dir = dst
return getRunCommand(cmd)
}
func (g *HgGetter) update(dst string, u *url.URL, rev string) error {
args := []string{"update"}
if rev != "" {
args = append(args, rev)
}
cmd := exec.Command("hg", args...)
cmd.Dir = dst
return getRunCommand(cmd)
}