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  }