github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/pkg/git-package.go (about) 1 package pkg 2 3 import ( 4 "fmt" 5 "net/url" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "strings" 10 11 "github.com/criteo/command-launcher/internal/command" 12 ) 13 14 type gitPackage struct { 15 folderPackage 16 } 17 18 func CreateGitRepoPackage(urlAsString string) (command.Package, error) { 19 if _, err := url.Parse(urlAsString); err != nil { 20 return nil, fmt.Errorf("invalid url or pathname: %s (%v)", urlAsString, err) 21 } 22 23 tmpDir, err := os.MkdirTemp("", "git-package-*") 24 if err != nil { 25 return nil, fmt.Errorf("cannot create the folder to clone the git repo: %v", err) 26 } 27 28 cloneDir, mf, err := cloneRepo(urlAsString, tmpDir) 29 if err != nil { 30 return nil, fmt.Errorf("git command has failed: %v", err) 31 } 32 33 pkg := gitPackage{ 34 folderPackage: folderPackage{ 35 defaultPackage: defaultPackage{ 36 Manifest: mf, 37 }, 38 sourceDir: cloneDir, 39 }, 40 } 41 42 return &pkg, nil 43 } 44 45 func cloneRepo(gitUrl string, targetDir string) (string, command.PackageManifest, error) { 46 ctx := exec.Command("git", "clone", gitUrl) 47 ctx.Dir = targetDir 48 ctx.Stdout = os.Stdout 49 ctx.Stderr = os.Stderr 50 ctx.Stdin = os.Stdin 51 52 if err := ctx.Run(); err != nil { 53 return "", nil, fmt.Errorf("git command has failed: %v", err) 54 } 55 56 repoDir := strings.ReplaceAll(filepath.Base(gitUrl), filepath.Ext(gitUrl), "") 57 manifestFile, err := os.Open(filepath.Join(targetDir, repoDir, "manifest.mf")) 58 if err != nil { 59 return "", nil, err 60 } 61 defer manifestFile.Close() 62 63 mf, err := ReadManifest(manifestFile) 64 if err != nil { 65 return "", nil, err 66 } 67 68 return filepath.Join(targetDir, repoDir), mf, nil 69 }