package test
import (
"io/ioutil"
"net/url"
"os"
"path/filepath"
"testing"
"github.com/openshift/source-to-image/pkg/api"
"github.com/openshift/source-to-image/pkg/util"
)
// FakeGit provides a fake Git
type FakeGit struct {
ValidCloneSpecSource string
ValidCloneSpecResult bool
CloneSource string
CloneTarget string
CloneError error
CheckoutRepo string
CheckoutRef string
CheckoutError error
SubmoduleInitRepo string
SubmoduleInitError error
SubmoduleUpdateRepo string
SubmoduleUpdateInit bool
SubmoduleUpdateRecursive bool
SubmoduleUpdateError error
}
// ValidCloneSpec returns a valid Git clone specification
func (f *FakeGit) ValidCloneSpec(source string) (bool, error) {
f.ValidCloneSpecSource = source
return f.ValidCloneSpecResult, nil
}
//ValidCloneSpecRemoteOnly returns a valid Git clone specification
func (f *FakeGit) ValidCloneSpecRemoteOnly(source string) bool {
f.ValidCloneSpecSource = source
return f.ValidCloneSpecResult
}
//MungeNoProtocolURL returns a valid no protocol Git URL
func (f *FakeGit) MungeNoProtocolURL(source string, url *url.URL) error {
f.ValidCloneSpecSource = source
return nil
}
// Clone clones the fake source Git repository to target directory
func (f *FakeGit) Clone(source, target string, c api.CloneConfig) error {
f.CloneSource = source
f.CloneTarget = target
return f.CloneError
}
// Checkout checkouts a ref in the fake Git repository
func (f *FakeGit) Checkout(repo, ref string) error {
f.CheckoutRepo = repo
f.CheckoutRef = ref
return f.CheckoutError
}
// SubmoduleInit initializes / clones submodules.
func (f *FakeGit) SubmoduleInit(repo string) error {
f.SubmoduleInitRepo = repo
return f.SubmoduleInitError
}
// SubmoduleUpdate checks out submodules to their correct version
func (f *FakeGit) SubmoduleUpdate(repo string, init, recursive bool) error {
f.SubmoduleUpdateRepo = repo
f.SubmoduleUpdateRecursive = recursive
f.SubmoduleUpdateInit = init
return f.SubmoduleUpdateError
}
// LsTree returns a slice of os.FileInfo objects populated with the paths and
// file modes of files known to Git. This is used on Windows systems where the
// executable mode metadata is lost on git checkout.
func (f *FakeGit) LsTree(repo, ref string, recursive bool) ([]os.FileInfo, error) {
return []os.FileInfo{}, nil
}
// GetInfo retrieves the information about the source code and commit
func (f *FakeGit) GetInfo(repo string) *api.SourceInfo {
return &api.SourceInfo{
Ref: "master",
CommitID: "1bf4f04",
Location: "file:///foo",
}
}
// CreateLocalGitDirectory creates a git directory with a commit
func CreateLocalGitDirectory(t *testing.T) string {
cr := util.NewCommandRunner()
dir := CreateEmptyLocalGitDirectory(t)
f, err := os.Create(filepath.Join(dir, "testfile"))
if err != nil {
t.Fatal(err)
}
f.Close()
err = cr.RunWithOptions(util.CommandOpts{Dir: dir}, "git", "add", ".")
if err != nil {
t.Fatal(err)
}
err = cr.RunWithOptions(util.CommandOpts{Dir: dir, EnvAppend: []string{"GIT_AUTHOR_NAME=test", "GIT_AUTHOR_EMAIL=test@test", "GIT_COMMITTER_NAME=test", "GIT_COMMITTER_EMAIL=test@test"}}, "git", "commit", "-m", "testcommit")
if err != nil {
t.Fatal(err)
}
return dir
}
// CreateEmptyLocalGitDirectory creates a git directory with no checkin yet
func CreateEmptyLocalGitDirectory(t *testing.T) string {
cr := util.NewCommandRunner()
dir, err := ioutil.TempDir(os.TempDir(), "gitdir-s2i-test")
if err != nil {
t.Fatal(err)
}
err = cr.RunWithOptions(util.CommandOpts{Dir: dir}, "git", "init")
if err != nil {
t.Fatal(err)
}
return dir
}
// CreateLocalGitDirectoryWithSubmodule creates a git directory with a submodule
func CreateLocalGitDirectoryWithSubmodule(t *testing.T) string {
cr := util.NewCommandRunner()
submodule := CreateLocalGitDirectory(t)
defer os.RemoveAll(submodule)
if util.UsingCygwinGit {
var err error
submodule, err = util.ToSlashCygwin(submodule)
if err != nil {
t.Fatal(err)
}
}
dir := CreateEmptyLocalGitDirectory(t)
err := cr.RunWithOptions(util.CommandOpts{Dir: dir}, "git", "submodule", "add", submodule, "submodule")
if err != nil {
t.Fatal(err)
}
return dir
}