diff --git a/internal/cmd/launcher.go b/internal/cmd/launcher.go index 35cc6b96a2..70d7101819 100644 --- a/internal/cmd/launcher.go +++ b/internal/cmd/launcher.go @@ -39,7 +39,18 @@ func newIOFSBridge(fs fsext.Fs, pwd string) fs.FS { // Open implements fs.Fs Open func (b *ioFSBridge) Open(name string) (fs.File, error) { - f, err := b.fsext.Open(path.Join(b.pwd, name)) + _ = fsext.Walk(b.fsext, "/", func(path string, _ fs.FileInfo, _ error) error { + fmt.Println("walk: ", path) + return nil + }) + fmt.Println("ioFSBridge.Open", name) + name = filepath.ToSlash(filepath.Clean(fsext.FilePathSeparator + name)) + fmt.Println("ioFSBridge.Open post clean up", name) + if !path.IsAbs(name) { + name = path.Join(b.pwd, name) + } + fmt.Println("ioFSBridge.Open post isAbs", name) + f, err := b.fsext.Open(name) if err != nil { return nil, fmt.Errorf("opening file via launcher's bridge: %w", err) } @@ -324,7 +335,7 @@ func analyze(gs *state.GlobalState, args []string) (k6deps.Dependencies, error) } dopts.Script.Name = sourceRootPath dopts.Script.Contents = src.Data - dopts.Fs = newIOFSBridge(gs.FS, pwd) + dopts.Fs = newIOFSBridge(gs.FS, filepath.ToSlash(pwd)) } return k6deps.Analyze(dopts) diff --git a/internal/cmd/tests/cmd_run_test.go b/internal/cmd/tests/cmd_run_test.go index 2c2c5f3cc8..bc256a0d8e 100644 --- a/internal/cmd/tests/cmd_run_test.go +++ b/internal/cmd/tests/cmd_run_test.go @@ -1032,6 +1032,61 @@ func TestAbortedByScriptSetupErrorWithDependency(t *testing.T) { assert.Contains(t, stdout, "bogus summary") } +func TestRunFromNotBaseDirectory(t *testing.T) { + t.Parallel() + depScript := ` + export const p = 5; + ` + mainScript := ` + import { p } from "../../../b/dep.js"; + export default function() { + console.log("p = " + p); + }; + ` + + ts := NewGlobalTestState(t) + require.NoError(t, fsext.WriteFile(ts.FS, filepath.Join(ts.Cwd, "a/b/c/test.js"), []byte(mainScript), 0o644)) + require.NoError(t, fsext.WriteFile(ts.FS, filepath.Join(ts.Cwd, "b/dep.js"), []byte(depScript), 0o644)) + + ts.Cwd = filepath.Join(ts.Cwd, "./a/") + ts.CmdArgs = []string{"k6", "run", "-v", "--log-output=stdout", "b/c/test.js"} + + cmd.ExecuteWithGlobalState(ts.GlobalState) + + stdout := ts.Stdout.String() + t.Log(stdout) + require.Contains(t, stdout, `p = 5`) +} + +func TestRunFromSeparateDriveWindows(t *testing.T) { + t.Parallel() + if runtime.GOOS != "windows" { + t.Skip("test only for windows") + } + depScript := ` + export const p = 5; + ` + mainScript := ` + import { p } from "../../../b/dep.js"; + export default function() { + console.log("p = " + p); + }; + ` + + ts := NewGlobalTestState(t) + require.NoError(t, fsext.WriteFile(ts.FS, filepath.Join(ts.Cwd, "a/b/c/test.js"), []byte(mainScript), 0o644)) + require.NoError(t, fsext.WriteFile(ts.FS, filepath.Join(ts.Cwd, "b/dep.js"), []byte(depScript), 0o644)) + + ts.Cwd = "f:\\something somewhere\\and another\\" + ts.CmdArgs = []string{"k6", "run", "-v", "--log-output=stdout", "c:\\test\\a\\b\\c\\test.js"} + + cmd.ExecuteWithGlobalState(ts.GlobalState) + + stdout := ts.Stdout.String() + t.Log(stdout) + require.Contains(t, stdout, `p = 5`) +} + func runTestWithNoLinger(_ *testing.T, ts *GlobalTestState) { cmd.ExecuteWithGlobalState(ts.GlobalState) } diff --git a/vendor/github.com/grafana/k6deps/internal/rootfs/rootfs.go b/vendor/github.com/grafana/k6deps/internal/rootfs/rootfs.go index d211a70c9a..024d8a48d8 100644 --- a/vendor/github.com/grafana/k6deps/internal/rootfs/rootfs.go +++ b/vendor/github.com/grafana/k6deps/internal/rootfs/rootfs.go @@ -6,7 +6,6 @@ import ( "fmt" "io/fs" "os" - "path" "path/filepath" ) @@ -44,15 +43,7 @@ func (f *rootFS) Root() string { } func (f *rootFS) Open(filePath string) (fs.File, error) { - var err error - if filepath.IsAbs(filePath) { - filePath, err = filepath.Rel(f.root, filePath) - if err != nil { - return nil, err - } - } - - return f.fs.Open(filepath.ToSlash(path.Clean(filePath))) + return f.fs.Open(filePath) } // NewFromFS return a FS from a FS