// CloneAndCheckoutSources clones the remote repository using either regular // git clone operation or shallow git clone, based on the "ref" provided (you // cannot shallow clone using the 'ref'). // This function will return the full path to the buildable sources, including // the context directory if specified. func CloneAndCheckoutSources(repo git.Repository, remote, ref, localDir, contextDir string) (string, error) { if len(ref) == 0 { glog.V(5).Infof("No source ref specified, using shallow git clone") if err := repo.CloneWithOptions(localDir, remote, git.Shallow, "--recursive"); err != nil { return "", fmt.Errorf("shallow cloning repository %q to %q failed: %v", remote, localDir, err) } } else { glog.V(5).Infof("Requested ref %q, performing full git clone and git checkout", ref) if err := repo.Clone(localDir, remote); err != nil { return "", fmt.Errorf("cloning repository %q to %q failed: %v", remote, localDir, err) } } if len(ref) > 0 { if err := repo.Checkout(localDir, ref); err != nil { return "", fmt.Errorf("unable to checkout ref %q in %q repository: %v", ref, remote, err) } } if len(contextDir) > 0 { glog.V(5).Infof("Using context directory %q. The full source path is %q", contextDir, filepath.Join(localDir, contextDir)) } return filepath.Join(localDir, contextDir), nil }