Skip to content

Commit d6baa3f

Browse files
authored
Merge pull request #29 from stuartleeks/sl/exec-set-user
Handle user on exec
2 parents 1d73d87 + 7c221db commit d6baa3f

File tree

3 files changed

+101
-1
lines changed

3 files changed

+101
-1
lines changed

cmd/devcontainer/devcontainer.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import (
44
"fmt"
55
"os"
66
"os/exec"
7+
"path"
78
"sort"
9+
"strings"
810
"text/tabwriter"
911

1012
"github.com/spf13/cobra"
1113
"github.com/stuartleeks/devcontainer-cli/internal/pkg/devcontainers"
14+
"github.com/stuartleeks/devcontainer-cli/internal/pkg/wsl"
1215
)
1316

1417
func createListCommand() *cobra.Command {
@@ -114,7 +117,25 @@ func createExecCommand() *cobra.Command {
114117
return err
115118
}
116119

117-
dockerArgs := []string{"exec", "-it", "--workdir", mountPath, containerID}
120+
wslPath := localPath
121+
if strings.HasPrefix(wslPath, "\\\\wsl$") && wsl.IsWsl() {
122+
wslPath, err = wsl.ConvertWindowsPathToWslPath(wslPath)
123+
if err != nil {
124+
return fmt.Errorf("error converting path: %s", err)
125+
}
126+
}
127+
128+
devcontainerJsonPath := path.Join(wslPath, ".devcontainer/devcontainer.json")
129+
userName, err := devcontainers.GetDevContainerUserName(devcontainerJsonPath)
130+
if err != nil {
131+
return err
132+
}
133+
134+
dockerArgs := []string{"exec", "-it", "--workdir", mountPath}
135+
if userName != "" {
136+
dockerArgs = append(dockerArgs, "--user", userName)
137+
}
138+
dockerArgs = append(dockerArgs, containerID)
118139
dockerArgs = append(dockerArgs, args[1:]...)
119140

120141
dockerCmd := exec.Command("docker", dockerArgs...)

internal/pkg/devcontainers/template.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,20 @@ func SetDevcontainerName(devContainerJsonPath string, name string) error {
117117

118118
return nil
119119
}
120+
121+
// "remoteUser": "vscode"
122+
123+
func GetDevContainerUserName(devContainerJsonPath string) (string, error) {
124+
buf, err := ioutil.ReadFile(devContainerJsonPath)
125+
if err != nil {
126+
return "", fmt.Errorf("error reading file %q: %s", devContainerJsonPath, err)
127+
}
128+
129+
r := regexp.MustCompile("\n[^/]*\"remoteUser\"\\s*:\\s*\"([^\"]*)\"")
130+
match := r.FindStringSubmatch(string(buf))
131+
132+
if len(match) <= 0 {
133+
return "", nil
134+
}
135+
return match[1], nil
136+
}

internal/pkg/devcontainers/template_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,65 @@ func TestSetDevcontainerName(t *testing.T) {
3838
]
3939
}`, string(buf))
4040
}
41+
42+
func TestGetDevContainerUserName_Uncommented(t *testing.T) {
43+
44+
f, err := ioutil.TempFile("", "test.json")
45+
assert.NoError(t, err)
46+
defer os.Remove(f.Name())
47+
48+
_, _ = f.WriteString(`{
49+
"name": "initial",
50+
// here's a comment!
51+
"otherProperties": [
52+
"something",
53+
"here"
54+
],
55+
"remoteUser": "vscode"
56+
}`)
57+
58+
user, err := GetDevContainerUserName(f.Name())
59+
assert.NoError(t, err)
60+
assert.Equal(t, "vscode", user)
61+
}
62+
63+
func TestGetDevContainerUserName_NotSet(t *testing.T) {
64+
65+
f, err := ioutil.TempFile("", "test.json")
66+
assert.NoError(t, err)
67+
defer os.Remove(f.Name())
68+
69+
_, _ = f.WriteString(`{
70+
"name": "initial",
71+
// here's a comment!
72+
"otherProperties": [
73+
"something",
74+
"here"
75+
]
76+
}`)
77+
78+
user, err := GetDevContainerUserName(f.Name())
79+
assert.NoError(t, err)
80+
assert.Equal(t, "", user)
81+
}
82+
83+
func TestGetDevContainerUserName_Commented(t *testing.T) {
84+
85+
f, err := ioutil.TempFile("", "test.json")
86+
assert.NoError(t, err)
87+
defer os.Remove(f.Name())
88+
89+
_, _ = f.WriteString(`{
90+
"name": "initial",
91+
// here's a comment!
92+
"otherProperties": [
93+
"something",
94+
"here"
95+
],
96+
// "remoteUser": "vscode"
97+
}`)
98+
99+
user, err := GetDevContainerUserName(f.Name())
100+
assert.NoError(t, err)
101+
assert.Equal(t, "", user)
102+
}

0 commit comments

Comments
 (0)