mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
Currently, we always fetch the default branch with an initial git clone and then fetch the ref after if it's specified. This changes it to only make one fetch instead of two if a ref is specified.
111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
// Copyright 2019 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package git
|
|
|
|
import (
|
|
"log"
|
|
"os/exec"
|
|
|
|
"github.com/pkg/errors"
|
|
"sigs.k8s.io/kustomize/api/filesys"
|
|
)
|
|
|
|
// Cloner is a function that can clone a git repo.
|
|
type Cloner func(repoSpec *RepoSpec) error
|
|
|
|
// ClonerUsingGitExec uses a local git install, as opposed
|
|
// to say, some remote API, to obtain a local clone of
|
|
// a remote repo.
|
|
func ClonerUsingGitExec(repoSpec *RepoSpec) error {
|
|
gitProgram, err := exec.LookPath("git")
|
|
if err != nil {
|
|
return errors.Wrap(err, "no 'git' program on path")
|
|
}
|
|
repoSpec.Dir, err = filesys.NewTmpConfirmedDir()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cmd := exec.Command(
|
|
gitProgram,
|
|
"init",
|
|
repoSpec.Dir.String())
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Printf("Error initializing git repo: %s", out)
|
|
return errors.Wrapf(
|
|
err,
|
|
"trouble initializing git repo in %s",
|
|
repoSpec.Dir.String())
|
|
}
|
|
|
|
cmd = exec.Command(
|
|
gitProgram,
|
|
"remote",
|
|
"add",
|
|
"origin",
|
|
repoSpec.CloneSpec())
|
|
cmd.Dir = repoSpec.Dir.String()
|
|
out, err = cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Printf("Error adding remote: %s", out)
|
|
return errors.Wrapf(err, "trouble adding remote %s", repoSpec.CloneSpec())
|
|
}
|
|
|
|
ref := "HEAD"
|
|
if repoSpec.Ref != "" {
|
|
ref = repoSpec.Ref
|
|
}
|
|
|
|
cmd = exec.Command(
|
|
gitProgram,
|
|
"fetch",
|
|
"--depth=1",
|
|
"origin",
|
|
ref)
|
|
cmd.Dir = repoSpec.Dir.String()
|
|
out, err = cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Printf("Error fetching ref: %s", out)
|
|
return errors.Wrapf(err, "trouble fetching %s", ref)
|
|
}
|
|
|
|
cmd = exec.Command(
|
|
gitProgram,
|
|
"checkout",
|
|
"FETCH_HEAD")
|
|
cmd.Dir = repoSpec.Dir.String()
|
|
out, err = cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Printf("Error checking out ref: %s", out)
|
|
return errors.Wrapf(err, "trouble checking out %s", ref)
|
|
}
|
|
|
|
cmd = exec.Command(
|
|
gitProgram,
|
|
"submodule",
|
|
"update",
|
|
"--init",
|
|
"--recursive")
|
|
cmd.Dir = repoSpec.Dir.String()
|
|
out, err = cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Printf("Error fetching submodules: %s", out)
|
|
return errors.Wrapf(err, "trouble fetching submodules for %s", repoSpec.CloneSpec())
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DoNothingCloner returns a cloner that only sets
|
|
// cloneDir field in the repoSpec. It's assumed that
|
|
// the cloneDir is associated with some fake filesystem
|
|
// used in a test.
|
|
func DoNothingCloner(dir filesys.ConfirmedDir) Cloner {
|
|
return func(rs *RepoSpec) error {
|
|
rs.Dir = dir
|
|
return nil
|
|
}
|
|
}
|