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  }