Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 0 additions & 63 deletions internal/conformance/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,55 +44,13 @@
"darwin"
]
},
"oils/array-literal.test.sh::Tilde expansions in RHS of [k]=v (BashArray)": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/array-literal.test.sh::Tilde expansions in RHS of [k]=v (BashAssoc)": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/array.test.sh::Tilde expansion within array": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/brace-expansion.test.sh::Tilde expansion": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/brace-expansion.test.sh::Tilde expansion come before var expansion": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/brace-expansion.test.sh::Tilde expansion with brace expansion": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/brace-expansion.test.sh::Two kinds of tilde expansion": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/bugs.test.sh::#2640 Hanging when reading from character devices": {
"mode": "xfail",
"reason": "conformance: Darwin bash oracle lacks GNU coreutils timeout for this character-device regression",
Expand Down Expand Up @@ -488,13 +446,6 @@
"linux"
]
},
"oils/glob.test.sh::no glob after ~ expansion": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/globignore.test.sh::Ignore globs with char patterns like [!ab]": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
Expand Down Expand Up @@ -534,13 +485,6 @@
"linux"
]
},
"oils/loop.test.sh::Tilde expansion within for loop": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/parse-errors.test.sh::interactive parse error (regression)": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
Expand Down Expand Up @@ -841,13 +785,6 @@
"darwin"
]
},
"oils/word-split.test.sh::Tilde sub is not split, but var sub is": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
"goos": [
"darwin"
]
},
"oils/ysh-builtin-private.test.sh::builtin cat usage": {
"mode": "xfail",
"reason": "conformance: gbash behavior differs from bash",
Expand Down
1 change: 1 addition & 0 deletions internal/shell/interp/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -1200,6 +1200,7 @@ func (r *Runner) Reset() {
*r = Runner{
Env: r.Env,
tempDir: r.tempDir,
platform: r.platform,
callHandler: r.callHandler,
execHandler: r.execHandler,
openHandler: r.openHandler,
Expand Down
58 changes: 41 additions & 17 deletions internal/shell/interp/compound_array_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package interp
import (
"testing"

"github.com/ewhauser/gbash/host"
"github.com/ewhauser/gbash/shell/expand"
)

Expand Down Expand Up @@ -171,29 +172,52 @@ printf 'after\n'
}
}

func TestCompoundArrayKeyedValuesUseLiveHomeForAssignmentTildes(t *testing.T) {
func TestCompoundArrayKeyedValuesUseStartupHomeForAssignmentTildes(t *testing.T) {
t.Parallel()

stdout, stderr, err := runInterpScriptConfig(t, &RunnerConfig{
Dir: "/tmp",
StartupHome: "/startup",
Env: expand.ListEnviron(
"HOME=/home/user",
),
}, `
tests := []struct {
name string
platform host.Platform
want string
}{
{
name: "DarwinPlatform",
platform: host.Platform{OS: host.OSDarwin},
want: "/startup\n/startup:/startup:/startup\n/startup\n/startup:/startup:/startup\n",
},
{
name: "LinuxPlatform",
platform: host.Platform{OS: host.OSLinux},
want: "/home/live\n/home/live:/home/live:/home/live\n/home/live\n/home/live:/home/live:/home/live\n",
},
}

for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
stdout, stderr, err := runInterpScriptConfig(t, &RunnerConfig{
Dir: "/tmp",
Platform: tc.platform,
StartupHome: "/startup",
Env: expand.ListEnviron(
"HOME=/home/user",
),
}, `
HOME=/home/live
a=([2]=~ [4]=~:~:~)
printf '%s\n%s\n' "${a[2]}" "${a[4]}"
declare -A assoc=([home]=~ [hello]=~:~:~)
printf '%s\n%s\n' "${assoc[home]}" "${assoc[hello]}"
`)
if err != nil {
t.Fatalf("Run error = %v, stdout=%q stderr=%q", err, stdout, stderr)
}
const want = "/home/user\n/home/user:/home/user:/home/user\n/home/user\n/home/user:/home/user:/home/user\n"
if stdout != want {
t.Fatalf("stdout = %q, want %q", stdout, want)
}
if stderr != "" {
t.Fatalf("stderr = %q, want empty", stderr)
if err != nil {
t.Fatalf("Run error = %v, stdout=%q stderr=%q", err, stdout, stderr)
}
if stdout != tc.want {
t.Fatalf("stdout = %q, want %q", stdout, tc.want)
}
if stderr != "" {
t.Fatalf("stderr = %q, want empty", stderr)
}
})
}
}
3 changes: 3 additions & 0 deletions internal/shell/interp/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"syscall"
"time"

"github.com/ewhauser/gbash/host"
shellpattern "github.com/ewhauser/gbash/internal/shellpattern"
"github.com/ewhauser/gbash/shell/analysis"
"github.com/ewhauser/gbash/shell/expand"
Expand Down Expand Up @@ -200,9 +201,11 @@ func (r *Runner) fillExpandConfig(ctx context.Context) {
r.ecfg.ResetRuntimeState()
r.ecfg.Env = expandEnv{r}
r.ecfg.Runtime = r
r.ecfg.PlatformOS = r.platform.OS.String()
r.ecfg.LangVariant = r.parserLangVariant()
r.ecfg.TildeEnv = tildeExpandEnv{r}
r.ecfg.StartupHome = r.startupHome
r.ecfg.PreferStartupHomeForArgTilde = r.platform.OS == host.OSDarwin
r.updateExpandOpts()
r.ecfgInit = true
}
Expand Down
47 changes: 47 additions & 0 deletions internal/shell/interp/varref_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"
"testing"

"github.com/ewhauser/gbash/host"
"github.com/ewhauser/gbash/shell/expand"
"github.com/ewhauser/gbash/shell/syntax"
"github.com/ewhauser/gbash/shellvariant"
Expand All @@ -27,6 +28,7 @@ func runInterpScriptConfig(t *testing.T, cfg *RunnerConfig, src string) (string,
cfg = &RunnerConfig{Dir: "/tmp"}
}
cfg = &RunnerConfig{
Platform: cfg.Platform,
StartupHome: cfg.StartupHome,
Env: cfg.Env,
Dir: cfg.Dir,
Expand Down Expand Up @@ -1703,6 +1705,51 @@ echo x=~
}
}

func TestArgvTildeUsesConfiguredPlatform(t *testing.T) {
t.Parallel()

tests := []struct {
name string
platform host.Platform
want string
}{
{
name: "DarwinPlatform",
platform: host.Platform{OS: host.OSDarwin},
want: "/startup/src\n",
},
{
name: "LinuxPlatform",
platform: host.Platform{OS: host.OSLinux},
want: "/home/live/src\n",
},
}

for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
stdout, stderr, err := runInterpScriptConfig(t, &RunnerConfig{
Platform: tc.platform,
StartupHome: "/startup",
Env: expand.ListEnviron("HOME=/home/original"),
Dir: "/tmp",
}, `
HOME=/home/live
echo ~/src
`)
if err != nil {
t.Fatalf("Run error = %v", err)
}
if stdout != tc.want {
t.Fatalf("stdout = %q, want %q", stdout, tc.want)
}
if stderr != "" {
t.Fatalf("stderr = %q, want empty", stderr)
}
})
}
}

func TestAssignmentParamDefaultTildeUsesLiveHome(t *testing.T) {
t.Parallel()

Expand Down
6 changes: 5 additions & 1 deletion internal/shell/interp/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -1518,7 +1518,11 @@ func (r *Runner) expandCompoundArrayElems(elems []*syntax.ArrayElem) []expandedA
}
default:
if elem.Value != nil {
item.value = r.assignmentLiteral(elem.Value)
cfg := r.ecfg
cfg.PreferStartupHomeForAssignmentTilde = r.platform.OS == host.OSDarwin
str, err := expand.AssignmentLiteral(&cfg, elem.Value)
r.expandErr(err)
item.value = str
}
}
expanded = append(expanded, item)
Expand Down
Loading
Loading