Compare commits

..

No commits in common. "1e7d06cc3e1cd0c28b1d0e83cc7f0a52f18f4311" and "8b5bb37019f13d191a8aee5b1e584824c40fe48f" have entirely different histories.

6 changed files with 76 additions and 15 deletions

View File

@ -2,8 +2,6 @@ package mutator
import ( import (
"context" "context"
"errors"
"os"
"path/filepath" "path/filepath"
"github.com/databricks/cli/bundle" "github.com/databricks/cli/bundle"
@ -26,9 +24,7 @@ func (m *loadGitDetails) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagn
var diags diag.Diagnostics var diags diag.Diagnostics
info, err := git.FetchRepositoryInfo(ctx, b.BundleRoot.Native(), b.WorkspaceClient()) info, err := git.FetchRepositoryInfo(ctx, b.BundleRoot.Native(), b.WorkspaceClient())
if err != nil { if err != nil {
if !errors.Is(err, os.ErrNotExist) { diags = append(diags, diag.WarningFromErr(err)...)
diags = append(diags, diag.WarningFromErr(err)...)
}
} }
if info.WorktreeRoot == "" { if info.WorktreeRoot == "" {

View File

@ -18,7 +18,7 @@ import (
"github.com/databricks/cli/libs/env" "github.com/databricks/cli/libs/env"
"github.com/databricks/cli/libs/filer" "github.com/databricks/cli/libs/filer"
"github.com/databricks/cli/libs/flags" "github.com/databricks/cli/libs/flags"
"github.com/databricks/cli/libs/folders" "github.com/databricks/cli/libs/git"
"github.com/databricks/cli/libs/template" "github.com/databricks/cli/libs/template"
"github.com/databricks/databricks-sdk-go" "github.com/databricks/databricks-sdk-go"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -144,7 +144,7 @@ func getBundleRemoteRootPath(w *databricks.WorkspaceClient, t *testing.T, unique
} }
func blackBoxRun(t *testing.T, root string, args ...string) (stdout string, stderr string) { func blackBoxRun(t *testing.T, root string, args ...string) (stdout string, stderr string) {
gitRoot, err := folders.FindDirWithLeaf(".", ".git") gitRoot, err := git.FindLeafInTree(".", ".git")
require.NoError(t, err) require.NoError(t, err)
t.Setenv("BUNDLE_ROOT", root) t.Setenv("BUNDLE_ROOT", root)

View File

@ -101,7 +101,7 @@ func TestAccFetchRepositoryInfoAPI_FromNonRepo(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
} else { } else {
assert.Error(t, err) assert.Error(t, err)
assert.ErrorContains(t, err, test.msg) assert.Contains(t, err.Error(), test.msg)
} }
assertEmptyGitInfo(t, info) assertEmptyGitInfo(t, info)
}) })
@ -151,7 +151,7 @@ func TestAccFetchRepositoryInfoDotGit_FromNonGitRepo(t *testing.T) {
for _, input := range tests { for _, input := range tests {
t.Run(input, func(t *testing.T) { t.Run(input, func(t *testing.T) {
info, err := git.FetchRepositoryInfo(ctx, input, wt.W) info, err := git.FetchRepositoryInfo(ctx, input, wt.W)
assert.ErrorIs(t, err, os.ErrNotExist) assert.NoError(t, err)
assertEmptyGitInfo(t, info) assertEmptyGitInfo(t, info)
}) })
} }

View File

@ -9,10 +9,6 @@ import (
// FindDirWithLeaf returns the first directory that holds `leaf`, // FindDirWithLeaf returns the first directory that holds `leaf`,
// traversing up to the root of the filesystem, starting at `dir`. // traversing up to the root of the filesystem, starting at `dir`.
func FindDirWithLeaf(dir string, leaf string) (string, error) { func FindDirWithLeaf(dir string, leaf string) (string, error) {
dir, err := filepath.Abs(dir)
if err != nil {
return "", err
}
for { for {
_, err := os.Stat(filepath.Join(dir, leaf)) _, err := os.Stat(filepath.Join(dir, leaf))

View File

@ -2,12 +2,15 @@ package git
import ( import (
"context" "context"
"errors"
"io/fs"
"net/http" "net/http"
"os"
"path" "path"
"path/filepath"
"strings" "strings"
"github.com/databricks/cli/libs/dbr" "github.com/databricks/cli/libs/dbr"
"github.com/databricks/cli/libs/folders"
"github.com/databricks/cli/libs/log" "github.com/databricks/cli/libs/log"
"github.com/databricks/cli/libs/vfs" "github.com/databricks/cli/libs/vfs"
"github.com/databricks/databricks-sdk-go" "github.com/databricks/databricks-sdk-go"
@ -102,7 +105,7 @@ func ensureWorkspacePrefix(p string) string {
func fetchRepositoryInfoDotGit(ctx context.Context, path string) (RepositoryInfo, error) { func fetchRepositoryInfoDotGit(ctx context.Context, path string) (RepositoryInfo, error) {
result := RepositoryInfo{} result := RepositoryInfo{}
rootDir, err := folders.FindDirWithLeaf(path, GitDirectoryName) rootDir, err := FindLeafInTree(path, GitDirectoryName)
if rootDir == "" { if rootDir == "" {
return result, err return result, err
} }
@ -131,3 +134,31 @@ func fetchRepositoryInfoDotGit(ctx context.Context, path string) (RepositoryInfo
return result, nil return result, nil
} }
func FindLeafInTree(p string, leafName string) (string, error) {
p, err := filepath.Abs(p)
if err != nil {
return "", err
}
for i := 0; i < 10000; i++ {
_, err = os.Stat(filepath.Join(p, leafName))
if err == nil {
// Found [leafName] in p
return p, nil
}
// ErrNotExist means we continue traversal up the tree.
if errors.Is(err, fs.ErrNotExist) {
parent := filepath.Dir(p)
if parent == p {
return "", nil
}
p = parent
continue
}
break
}
return "", err
}

38
libs/git/info_test.go Normal file
View File

@ -0,0 +1,38 @@
package git
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestFindLeafInTree(t *testing.T) {
wd, err := os.Getwd()
require.NoError(t, err)
root := filepath.Join(wd, "..", "..")
// Find from working directory should work.
{
out, err := FindLeafInTree(wd, ".git")
assert.NoError(t, err)
assert.Equal(t, root, out)
}
// Find from project root itself should work.
{
out, err := FindLeafInTree(root, ".git")
assert.NoError(t, err)
assert.Equal(t, root, out)
}
// Find for something that doesn't exist should work.
{
out, err := FindLeafInTree(root, "this-leaf-doesnt-exist-anywhere")
assert.NoError(t, err)
assert.Equal(t, "", out)
}
}