...

Source file src/sigs.k8s.io/kustomize/api/internal/git/gitrunner.go

Documentation: sigs.k8s.io/kustomize/api/internal/git

     1  // Copyright 2020 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package git
     5  
     6  import (
     7  	"os/exec"
     8  	"time"
     9  
    10  	"sigs.k8s.io/kustomize/api/internal/utils"
    11  	"sigs.k8s.io/kustomize/kyaml/errors"
    12  	"sigs.k8s.io/kustomize/kyaml/filesys"
    13  )
    14  
    15  // gitRunner runs the external git binary.
    16  type gitRunner struct {
    17  	gitProgram string
    18  	duration   time.Duration
    19  	dir        filesys.ConfirmedDir
    20  }
    21  
    22  // newCmdRunner returns a gitRunner if it can find the binary.
    23  // It also creats a temp directory for cloning repos.
    24  func newCmdRunner(timeout time.Duration) (*gitRunner, error) {
    25  	gitProgram, err := exec.LookPath("git")
    26  	if err != nil {
    27  		return nil, errors.WrapPrefixf(err, "no 'git' program on path")
    28  	}
    29  	dir, err := filesys.NewTmpConfirmedDir()
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  	return &gitRunner{
    34  		gitProgram: gitProgram,
    35  		duration:   timeout,
    36  		dir:        dir,
    37  	}, nil
    38  }
    39  
    40  // run a command with a timeout.
    41  func (r gitRunner) run(args ...string) error {
    42  	//nolint: gosec
    43  	cmd := exec.Command(r.gitProgram, args...)
    44  	cmd.Dir = r.dir.String()
    45  	return utils.TimedCall(
    46  		cmd.String(),
    47  		r.duration,
    48  		func() error {
    49  			out, err := cmd.CombinedOutput()
    50  			if err != nil {
    51  				return errors.WrapPrefixf(err, "failed to run '%s': %s", cmd.String(), string(out))
    52  			}
    53  			return err
    54  		})
    55  }
    56  

View as plain text