mirror of https://github.com/databricks/cli.git
Add dbfs scheme prefix to paths in cp command output (#516)
## Changes Adds the dbfs:/ prefix to paths output by the cp command so they can be used with the CLI ## Tests Manually Currently there are no integration tests for command output, I'll add them in separately --------- Co-authored-by: Pieter Noordhuis <pieter.noordhuis@databricks.com>
This commit is contained in:
parent
c64a3336c5
commit
1f5cdfda29
59
cmd/fs/cp.go
59
cmd/fs/cp.go
|
@ -15,9 +15,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type copy struct {
|
type copy struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
sourceFiler filer.Filer
|
sourceFiler filer.Filer
|
||||||
targetFiler filer.Filer
|
targetFiler filer.Filer
|
||||||
|
sourceScheme string
|
||||||
|
targetScheme string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *copy) cpWriteCallback(sourceDir, targetDir string) fs.WalkDirFunc {
|
func (c *copy) cpWriteCallback(sourceDir, targetDir string) fs.WalkDirFunc {
|
||||||
|
@ -78,29 +80,47 @@ func (c *copy) cpFileToFile(sourcePath, targetPath string) error {
|
||||||
err = c.targetFiler.Write(c.ctx, targetPath, r)
|
err = c.targetFiler.Write(c.ctx, targetPath, r)
|
||||||
// skip if file already exists
|
// skip if file already exists
|
||||||
if err != nil && errors.Is(err, fs.ErrExist) {
|
if err != nil && errors.Is(err, fs.ErrExist) {
|
||||||
return emitCpFileSkippedEvent(c.ctx, sourcePath, targetPath)
|
return c.emitFileSkippedEvent(sourcePath, targetPath)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return emitCpFileCopiedEvent(c.ctx, sourcePath, targetPath)
|
return c.emitFileCopiedEvent(sourcePath, targetPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: emit these events on stderr
|
// TODO: emit these events on stderr
|
||||||
// TODO: add integration tests for these events
|
// TODO: add integration tests for these events
|
||||||
func emitCpFileSkippedEvent(ctx context.Context, sourcePath, targetPath string) error {
|
func (c *copy) emitFileSkippedEvent(sourcePath, targetPath string) error {
|
||||||
event := newFileSkippedEvent(sourcePath, targetPath)
|
fullSourcePath := sourcePath
|
||||||
|
if c.sourceScheme != "" {
|
||||||
|
fullSourcePath = path.Join(c.sourceScheme+":", sourcePath)
|
||||||
|
}
|
||||||
|
fullTargetPath := targetPath
|
||||||
|
if c.targetScheme != "" {
|
||||||
|
fullTargetPath = path.Join(c.targetScheme+":", targetPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
event := newFileSkippedEvent(fullSourcePath, fullTargetPath)
|
||||||
template := "{{.SourcePath}} -> {{.TargetPath}} (skipped; already exists)\n"
|
template := "{{.SourcePath}} -> {{.TargetPath}} (skipped; already exists)\n"
|
||||||
|
|
||||||
return cmdio.RenderWithTemplate(ctx, event, template)
|
return cmdio.RenderWithTemplate(c.ctx, event, template)
|
||||||
}
|
}
|
||||||
|
|
||||||
func emitCpFileCopiedEvent(ctx context.Context, sourcePath, targetPath string) error {
|
func (c *copy) emitFileCopiedEvent(sourcePath, targetPath string) error {
|
||||||
event := newFileCopiedEvent(sourcePath, targetPath)
|
fullSourcePath := sourcePath
|
||||||
|
if c.sourceScheme != "" {
|
||||||
|
fullSourcePath = path.Join(c.sourceScheme+":", sourcePath)
|
||||||
|
}
|
||||||
|
fullTargetPath := targetPath
|
||||||
|
if c.targetScheme != "" {
|
||||||
|
fullTargetPath = path.Join(c.targetScheme+":", targetPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
event := newFileCopiedEvent(fullSourcePath, fullTargetPath)
|
||||||
template := "{{.SourcePath}} -> {{.TargetPath}}\n"
|
template := "{{.SourcePath}} -> {{.TargetPath}}\n"
|
||||||
|
|
||||||
return cmdio.RenderWithTemplate(ctx, event, template)
|
return cmdio.RenderWithTemplate(c.ctx, event, template)
|
||||||
}
|
}
|
||||||
|
|
||||||
var cpOverwrite bool
|
var cpOverwrite bool
|
||||||
|
@ -144,10 +164,21 @@ var cpCmd = &cobra.Command{
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceScheme := ""
|
||||||
|
if isDbfsPath(fullSourcePath) {
|
||||||
|
sourceScheme = "dbfs"
|
||||||
|
}
|
||||||
|
targetScheme := ""
|
||||||
|
if isDbfsPath(fullTargetPath) {
|
||||||
|
targetScheme = "dbfs"
|
||||||
|
}
|
||||||
|
|
||||||
c := copy{
|
c := copy{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
sourceFiler: sourceFiler,
|
sourceFiler: sourceFiler,
|
||||||
targetFiler: targetFiler,
|
targetFiler: targetFiler,
|
||||||
|
sourceScheme: sourceScheme,
|
||||||
|
targetScheme: targetScheme,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get information about file at source path
|
// Get information about file at source path
|
||||||
|
|
|
@ -45,3 +45,7 @@ func filerForPath(ctx context.Context, fullPath string) (filer.Filer, string, er
|
||||||
f, err := filer.NewDbfsClient(w, "/")
|
f, err := filer.NewDbfsClient(w, "/")
|
||||||
return f, path, err
|
return f, path, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isDbfsPath(path string) bool {
|
||||||
|
return strings.HasPrefix(path, "dbfs:/")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue