WIP private repository support

This commit is contained in:
Shreyas Goenka 2023-06-29 15:28:13 +02:00
parent 8e92131a46
commit 5f9ec5dd29
No known key found for this signature in database
GPG Key ID: 92A07DF49CCB0622
3 changed files with 69 additions and 4 deletions

View File

@ -0,0 +1,21 @@
package internal
import (
"path/filepath"
"testing"
"github.com/databricks/cli/libs/git"
"github.com/stretchr/testify/assert"
)
func TestAccGitClonePrivateRepository(t *testing.T) {
tmpDir := t.TempDir()
// This is a private repository only accessible to databricks employees
err := git.Clone("databricks", "bundle-samples-internal", tmpDir)
assert.NoError(t, err)
// assert examples from the private repository
assert.DirExists(t, filepath.Join(tmpDir, "shark_sightings"))
assert.DirExists(t, filepath.Join(tmpDir, "wikipedia_clickstream"))
}

View File

@ -1,19 +1,40 @@
package git
import (
"errors"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"github.com/databricks/cli/libs/zip"
)
var errNotFound = errors.New("not found")
func githubZipUrl(org string, name string, ref string) string {
return fmt.Sprintf(`https://github.com/%s/%s/archive/%s.zip`, org, name, ref)
return fmt.Sprintf(`%s/archive/%s.zip`, githubUrl(org, name), ref)
}
func githubUrl(org string, name string) string {
return fmt.Sprintf(`https://github.com/%s/%s`, org, name)
}
type RepositoryNotFoundError struct {
url string
}
func (err RepositoryNotFoundError) Error() string {
return fmt.Sprintf("repository not found: %s", err.url)
}
func (err RepositoryNotFoundError) Is(other error) bool {
return other == errNotFound
}
// TODO: pass context to these the get requests
func download(url string, dest string) error {
resp, err := http.Get(url)
if err != nil {
@ -22,7 +43,7 @@ func download(url string, dest string) error {
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
return fmt.Errorf("repository not found: %s", url)
return RepositoryNotFoundError{url}
}
if resp.StatusCode != http.StatusOK {
@ -38,7 +59,18 @@ func download(url string, dest string) error {
return err
}
func Clone(org string, repoName string, targetDir string) error {
func clonePrivate(org string, repoName string, targetDir string) error {
zipUrl := githubUrl(org, repoName)
// We append repoName-main to targetDir to be symmetric to clonePublic
targetDir = filepath.Join(targetDir, repoName+"-main")
// TODO: pass context to the command execution
cmd := exec.Command("git", "clone", zipUrl, targetDir, "--branch", "main")
return cmd.Run()
}
func clonePublic(org string, repoName string, targetDir string) error {
zipDst := filepath.Join(targetDir, repoName+".zip")
zipUrl := githubZipUrl(org, repoName, "main")
@ -57,3 +89,15 @@ func Clone(org string, repoName string, targetDir string) error {
// Remove the ZIP file
return os.Remove(zipDst)
}
func Clone(org, repoName string, targetDir string) error {
// First we try to clone the repository as a public URL, as that does not
// require the git CLI
err := clonePublic(org, repoName, targetDir)
if err != nil && !errors.Is(err, errNotFound) {
return err
}
// Since a public repository was not found, we defer to the git CLI
return clonePrivate(org, repoName, targetDir)
}

View File

@ -12,7 +12,7 @@ func TestGitClonePublicRepository(t *testing.T) {
tmpDir := t.TempDir()
var err error
err = Clone("databricks", "cli", tmpDir)
err = clonePublic("databricks", "cli", tmpDir)
assert.NoError(t, err)
assert.DirExists(t, filepath.Join(tmpDir, "cli-main"))