github.com/thetechnoweenie/graven@v1.0.2/commands/freeze.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/cbegin/graven/domain"
     8  	"github.com/cbegin/graven/util"
     9  	"github.com/cbegin/graven/vendortool"
    10  	"github.com/urfave/cli"
    11  	"github.com/cbegin/graven/repotool"
    12  )
    13  
    14  var supportedVendorTools = []vendortool.VendorTool{
    15  	&vendortool.GovendorVendorTool{},
    16  	&vendortool.GlideVendorTool{},
    17  	&vendortool.DepVendorTool{},
    18  }
    19  
    20  var FreezeCommand = cli.Command{
    21  	Name:   "freeze",
    22  	Usage:  "Freezes vendor dependencies to avoid having to check in source",
    23  	Action: freeze,
    24  }
    25  
    26  
    27  func selectVendorTool(project *domain.Project) (vendortool.VendorTool, error) {
    28  	for _, vt := range supportedVendorTools {
    29  		if vt.VendorFileExists(project) {
    30  			fmt.Printf("Using %v vendor tool.\n", vt.Name())
    31  			return vt, nil
    32  		}
    33  	}
    34  	return nil, fmt.Errorf("Could not find supported vendor file.")
    35  }
    36  
    37  func freeze(c *cli.Context) error {
    38  	project, err := domain.FindProject()
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	vendorTool, err := selectVendorTool(project)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	err = vendorTool.LoadFile(project)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	freezerPath := project.ProjectPath(".freezer")
    54  
    55  	if _, err := os.Stat(freezerPath); !os.IsNotExist(err) {
    56  		if err := os.RemoveAll(freezerPath); err != nil {
    57  			return fmt.Errorf("Could not clean .freezer: %v", err)
    58  		}
    59  	}
    60  
    61  	if err := os.Mkdir(freezerPath, 0755); err != nil {
    62  		return fmt.Errorf("Could not make .freezer: %v", err)
    63  	}
    64  
    65  	for _, p := range vendorTool.Dependencies() {
    66  		sourcePath := project.ProjectPath("vendor", p.PackagePath())
    67  		targetFile := project.ProjectPath(".freezer", p.ArchiveFileName())
    68  
    69  		if _, err := os.Stat(sourcePath); os.IsNotExist(err) {
    70  			fmt.Printf("MISSING dependency %v\n", p.PackagePath())
    71  			continue
    72  		}
    73  
    74  		err = util.ZipDir(sourcePath, targetFile, false)
    75  		if err != nil {
    76  			return err
    77  		}
    78  
    79  		for repoName, repo := range project.Repositories {
    80  			if repo.HasRole(domain.RepositoryRoleDependency) {
    81  				if repoTool, ok := repotool.RepoRegistry[repo.Type]; ok {
    82  					if err := repoTool.UploadDependency(project, repoName, targetFile, vendortool.Coordinates(p)); err != nil {
    83  						fmt.Println(err)
    84  					}
    85  
    86  				} else {
    87  					fmt.Printf("Unkown repository type %v for %v\n", repo.Type, repoName)
    88  					break
    89  				}
    90  			}
    91  		}
    92  	}
    93  
    94  	return err
    95  }