github.com/boson-project/source-to-image@v1.2.0/pkg/scm/scm.go (about)

     1  package scm
     2  
     3  import (
     4  	"github.com/openshift/source-to-image/pkg/build"
     5  	"github.com/openshift/source-to-image/pkg/errors"
     6  	"github.com/openshift/source-to-image/pkg/scm/downloaders/empty"
     7  	"github.com/openshift/source-to-image/pkg/scm/downloaders/file"
     8  	gitdownloader "github.com/openshift/source-to-image/pkg/scm/downloaders/git"
     9  	"github.com/openshift/source-to-image/pkg/scm/git"
    10  	"github.com/openshift/source-to-image/pkg/util/cmd"
    11  	"github.com/openshift/source-to-image/pkg/util/fs"
    12  	utillog "github.com/openshift/source-to-image/pkg/util/log"
    13  )
    14  
    15  var log = utillog.StderrLog
    16  
    17  // DownloaderForSource determines what SCM plugin should be used for downloading
    18  // the sources from the repository.
    19  func DownloaderForSource(fs fs.FileSystem, s *git.URL, forceCopy bool) (build.Downloader, error) {
    20  	log.V(4).Infof("DownloadForSource %s", s)
    21  
    22  	if s == nil {
    23  		return &empty.Noop{}, nil
    24  	}
    25  
    26  	if s.IsLocal() {
    27  		if forceCopy {
    28  			return &file.File{FileSystem: fs}, nil
    29  		}
    30  
    31  		isLocalNonBareGitRepo, err := git.IsLocalNonBareGitRepository(fs, s.LocalPath())
    32  		if err != nil {
    33  			return nil, err
    34  		}
    35  		if !isLocalNonBareGitRepo {
    36  			return &file.File{FileSystem: fs}, nil
    37  		}
    38  
    39  		isEmpty, err := git.LocalNonBareGitRepositoryIsEmpty(fs, s.LocalPath())
    40  		if err != nil {
    41  			return nil, err
    42  		}
    43  		if isEmpty {
    44  			return nil, errors.NewEmptyGitRepositoryError(s.LocalPath())
    45  		}
    46  
    47  		if !git.HasGitBinary() {
    48  			return &file.File{FileSystem: fs}, nil
    49  		}
    50  	}
    51  
    52  	return &gitdownloader.Clone{Git: git.New(fs, cmd.NewCommandRunner()), FileSystem: fs}, nil
    53  }