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 }