Skip to content

Commit 583c0ab

Browse files
authored
feat: build projects on the target machine (#708)
Signed-off-by: Toma Puljak <[email protected]>
1 parent f4a0289 commit 583c0ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1703
-367
lines changed

go.mod

+10-4
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ require (
88
github.com/charmbracelet/bubbletea v0.25.0
99
github.com/charmbracelet/huh v0.2.3
1010
github.com/charmbracelet/lipgloss v0.9.1
11-
github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037
11+
github.com/compose-spec/compose-go/v2 v2.1.3
1212
github.com/creack/pty v1.1.21
1313
github.com/docker/docker v26.0.2+incompatible
1414
github.com/docker/go-connections v0.4.0
1515
github.com/fatedier/frp v0.54.0
16+
github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037
1617
github.com/gin-contrib/cors v1.5.0
1718
github.com/gin-gonic/gin v1.9.1
1819
github.com/glebarez/sqlite v1.10.0
@@ -27,6 +28,7 @@ require (
2728
github.com/kardianos/service v1.2.2
2829
github.com/kelseyhightower/envconfig v1.4.0
2930
github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5
31+
github.com/mitchellh/mapstructure v1.5.0
3032
github.com/opencontainers/image-spec v1.1.0-rc5
3133
github.com/pkg/sftp v1.13.6
3234
github.com/rs/zerolog v1.31.0
@@ -38,6 +40,7 @@ require (
3840
github.com/swaggo/files v1.0.1
3941
github.com/swaggo/gin-swagger v1.6.0
4042
github.com/swaggo/swag v1.16.3
43+
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a
4144
golang.org/x/crypto v0.23.0
4245
golang.org/x/mod v0.17.0
4346
golang.org/x/oauth2 v0.17.0
@@ -120,6 +123,7 @@ require (
120123
github.com/go-playground/locales v0.14.1 // indirect
121124
github.com/go-playground/universal-translator v0.18.1 // indirect
122125
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
126+
github.com/go-viper/mapstructure/v2 v2.0.0 // indirect
123127
github.com/goccy/go-json v0.10.2 // indirect
124128
github.com/godbus/dbus/v5 v5.1.1-0.20230522191255-76236955d466 // indirect
125129
github.com/gofrs/uuid/v5 v5.0.0 // indirect
@@ -166,6 +170,7 @@ require (
166170
github.com/magiconair/properties v1.8.7 // indirect
167171
github.com/mailru/easyjson v0.7.7 // indirect
168172
github.com/mattn/go-colorable v0.1.13 // indirect
173+
github.com/mattn/go-shellwords v1.0.12 // indirect
169174
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
170175
github.com/mdlayher/genetlink v1.3.2 // indirect
171176
github.com/mdlayher/netlink v1.7.2 // indirect
@@ -174,7 +179,6 @@ require (
174179
github.com/miekg/dns v1.1.57 // indirect
175180
github.com/mitchellh/go-ps v1.0.0 // indirect
176181
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 // indirect
177-
github.com/mitchellh/mapstructure v1.5.0 // indirect
178182
github.com/moby/docker-image-spec v1.3.1 // indirect
179183
github.com/moby/term v0.5.0 // indirect
180184
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -216,7 +220,6 @@ require (
216220
github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 // indirect
217221
github.com/tailscale/golang-x-crypto v0.0.0-20240108194725-7ce1f622c780 // indirect
218222
github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect
219-
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a // indirect
220223
github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 // indirect
221224
github.com/tailscale/setec v0.0.0-20230926024544-07dde05889e7 // indirect
222225
github.com/tailscale/tailsql v0.0.0-20231216172832-51483e0c711b // indirect
@@ -235,6 +238,9 @@ require (
235238
github.com/vishvananda/netns v0.0.4 // indirect
236239
github.com/x448/float16 v0.8.4 // indirect
237240
github.com/xanzy/ssh-agent v0.3.3 // indirect
241+
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
242+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
243+
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
238244
github.com/yusufpapurcu/wmi v1.2.4 // indirect
239245
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect
240246
go.opentelemetry.io/otel v1.25.0 // indirect
@@ -247,7 +253,7 @@ require (
247253
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
248254
go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect
249255
golang.org/x/arch v0.5.0 // indirect
250-
golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
256+
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect
251257
golang.org/x/tools v0.21.0 // indirect
252258
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
253259
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect

go.sum

+16-3
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
748748
github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
749749
github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
750750
github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
751+
github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE=
752+
github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc=
751753
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
752754
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
753755
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
@@ -836,6 +838,7 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq
836838
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
837839
github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037 h1:F1O6v+jmHAJErLdTevHtDuZwx3Upd3JA0RQLyhdl0wc=
838840
github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037/go.mod h1:ZEXoTRQmw7DEoiVE18I3ESWtdbevIr31GjQTv58Ptns=
841+
github.com/gfleury/go-bitbucket-v1/test/bb-mock-server v0.0.0-20230825095122-9bc1711434ab h1:BeG9dDWckFi/p5Gvqq3wTEDXsUV4G6bdvjEHMOT2B8E=
839842
github.com/gfleury/go-bitbucket-v1/test/bb-mock-server v0.0.0-20230825095122-9bc1711434ab/go.mod h1:VssB0kb1cETNaFFC/0mHVCj+7i5TS2xraYq+tl9JLwE=
840843
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
841844
github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
@@ -909,6 +912,8 @@ github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaC
909912
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
910913
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
911914
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
915+
github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc=
916+
github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
912917
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
913918
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
914919
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
@@ -1191,6 +1196,8 @@ github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRC
11911196
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
11921197
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
11931198
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
1199+
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
1200+
github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
11941201
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
11951202
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
11961203
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
@@ -1441,6 +1448,13 @@ github.com/xanzy/go-gitlab v0.97.0 h1:StMqJ1Kvt00X43pYIBBjj52dFlghwSeBhRDRfzaZ7x
14411448
github.com/xanzy/go-gitlab v0.97.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI=
14421449
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
14431450
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
1451+
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
1452+
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
1453+
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
1454+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
1455+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
1456+
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
1457+
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
14441458
github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 h1:EWU6Pktpas0n8lLQwDsRyZfmkPeRbdgPtW609es+/9E=
14451459
github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37/go.mod h1:HpMP7DB2CyokmAh4lp0EQnnWhmycP/TvwBGzvuie+H0=
14461460
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1542,8 +1556,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
15421556
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
15431557
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
15441558
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
1545-
golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
1546-
golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
1559+
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
1560+
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
15471561
golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9 h1:j3D9DvWRpUfIyFfDPws7LoIZ2MAI1OJHdQXtTnYtN+k=
15481562
golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
15491563
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
@@ -1841,7 +1855,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
18411855
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
18421856
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
18431857
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
1844-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
18451858
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
18461859
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
18471860
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=

hack/project_image/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ RUN apt update -y && \
88

99
USER daytona
1010

11-
ENTRYPOINT ["tail", "-f", "/dev/null"]
11+
ENTRYPOINT ["sudo", "dockerd"]

internal/constants/get_daytona_script.go

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ err() {
2020
exit 1
2121
}
2222
23+
# Check if daytona is already installed
24+
if [ -x "$(command -v daytona)" ]; then
25+
echo "Daytona already installed. Skipping installation..."
26+
exit 0
27+
fi
28+
2329
# Check machine architecture
2430
ARCH=$(uname -m)
2531
# Check operating system

internal/testing/docker/mocks/api_client.go

+5
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ func (m *MockApiClient) ContainerInspect(ctx context.Context, container string)
102102
return args.Get(0).(types.ContainerJSON), args.Error(1)
103103
}
104104

105+
func (m *MockApiClient) ContainerList(ctx context.Context, options container.ListOptions) ([]types.Container, error) {
106+
args := m.Called(ctx, options)
107+
return args.Get(0).([]types.Container), args.Error(1)
108+
}
109+
105110
func (m *MockApiClient) VolumeRemove(ctx context.Context, volume string, force bool) error {
106111
args := m.Called(ctx, volume, force)
107112
return args.Error(0)

internal/testing/server/workspaces/mocks/provisioner.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package mocks
77

88
import (
99
"github.com/daytonaio/daytona/pkg/containerregistry"
10+
"github.com/daytonaio/daytona/pkg/gitprovider"
1011
"github.com/daytonaio/daytona/pkg/provider"
1112
"github.com/daytonaio/daytona/pkg/workspace"
1213
"github.com/stretchr/testify/mock"
@@ -20,8 +21,8 @@ func NewMockProvisioner() *mockProvisioner {
2021
return &mockProvisioner{}
2122
}
2223

23-
func (p *mockProvisioner) CreateProject(project *workspace.Project, target *provider.ProviderTarget, cr *containerregistry.ContainerRegistry) error {
24-
args := p.Called(project, target, cr)
24+
func (p *mockProvisioner) CreateProject(project *workspace.Project, target *provider.ProviderTarget, cr *containerregistry.ContainerRegistry, gc *gitprovider.GitProviderConfig) error {
25+
args := p.Called(project, target, cr, gc)
2526
return args.Error(0)
2627
}
2728

internal/util/path.go

+16
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@ func GetHomeDir(activeProfile config.Profile, workspaceId string, projectName st
2828
}
2929

3030
func GetProjectDir(activeProfile config.Profile, workspaceId string, projectName string) (string, error) {
31+
err := config.EnsureSshConfigEntryAdded(activeProfile.Id, workspaceId, projectName)
32+
if err != nil {
33+
return "", err
34+
}
35+
36+
projectHostname := config.GetProjectHostname(activeProfile.Id, workspaceId, projectName)
37+
38+
daytonaProjectDir, err := exec.Command("ssh", projectHostname, "echo", "$DAYTONA_PROJECT_DIR").Output()
39+
if err != nil {
40+
return "", err
41+
}
42+
43+
if strings.TrimRight(string(daytonaProjectDir), "\n") != "" {
44+
return strings.TrimRight(string(daytonaProjectDir), "\n"), nil
45+
}
46+
3147
homeDir, err := GetHomeDir(activeProfile, workspaceId, projectName)
3248
if err != nil {
3349
return "", err

pkg/agent/config/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func GetLogFilePath() *string {
7979
return nil
8080
}
8181

82-
logFilePath = strings.Replace(logFilePath, "$HOME", os.Getenv("HOME"), 1)
82+
logFilePath = strings.Replace(logFilePath, "(HOME)", os.Getenv("HOME"), 1)
8383

8484
return &logFilePath
8585
}

pkg/builder/detect/detect.go

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright 2024 Daytona Platforms Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package detect
5+
6+
import (
7+
"os"
8+
"path"
9+
"path/filepath"
10+
11+
"github.com/daytonaio/daytona/pkg/ssh"
12+
"github.com/daytonaio/daytona/pkg/workspace"
13+
)
14+
15+
type BuilderType string
16+
17+
var (
18+
BuilderTypeDevcontainer BuilderType = "devcontainer"
19+
BuilderTypeImage BuilderType = "image"
20+
)
21+
22+
func DetectProjectBuilderType(project *workspace.Project, projectDir string, sshClient *ssh.Client) (BuilderType, error) {
23+
if project.Build != nil && project.Build.Devcontainer != nil {
24+
return BuilderTypeDevcontainer, nil
25+
}
26+
27+
if sshClient != nil {
28+
if _, err := sshClient.ReadFile(path.Join(projectDir, ".devcontainer/devcontainer.json")); err == nil {
29+
project.Build.Devcontainer = &workspace.ProjectBuildDevcontainer{
30+
DevContainerFilePath: ".devcontainer/devcontainer.json",
31+
}
32+
return BuilderTypeDevcontainer, nil
33+
}
34+
if _, err := sshClient.ReadFile(path.Join(projectDir, ".devcontainer.json")); err == nil {
35+
project.Build.Devcontainer = &workspace.ProjectBuildDevcontainer{
36+
DevContainerFilePath: ".devcontainer.json",
37+
}
38+
return BuilderTypeDevcontainer, nil
39+
}
40+
} else {
41+
if devcontainerFilePath, pathError := findDevcontainerConfigFilePath(projectDir); pathError == nil {
42+
project.Build.Devcontainer = &workspace.ProjectBuildDevcontainer{
43+
DevContainerFilePath: devcontainerFilePath,
44+
}
45+
46+
return BuilderTypeDevcontainer, nil
47+
}
48+
}
49+
50+
return BuilderTypeImage, nil
51+
}
52+
53+
func findDevcontainerConfigFilePath(projectDir string) (string, error) {
54+
devcontainerPath := ".devcontainer/devcontainer.json"
55+
isDevcontainer, err := fileExists(filepath.Join(projectDir, devcontainerPath))
56+
if err != nil {
57+
devcontainerPath = ".devcontainer.json"
58+
isDevcontainer, err = fileExists(filepath.Join(projectDir, devcontainerPath))
59+
if err != nil {
60+
return devcontainerPath, nil
61+
}
62+
}
63+
64+
if isDevcontainer {
65+
return devcontainerPath, nil
66+
}
67+
68+
return "", os.ErrNotExist
69+
}
70+
71+
func fileExists(filePath string) (bool, error) {
72+
_, err := os.Stat(filePath)
73+
if os.IsNotExist(err) {
74+
return false, nil
75+
} else if err != nil {
76+
// There was an error checking for the file
77+
return false, err
78+
}
79+
return true, nil
80+
}

pkg/builder/devcontainer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,12 @@ func (b *DevcontainerBuilder) readConfiguration() error {
259259
return err
260260
}
261261

262-
postCreateCommands, err := devcontainer.ConvertCommands(root.MergedConfiguration.PostCreateCommands)
262+
postCreateCommands, err := devcontainer.ConvertToArray(root.MergedConfiguration.PostCreateCommands)
263263
if err != nil {
264264
projectLogger.Write([]byte(fmt.Sprintf("Error converting post create commands: %v\n", err)))
265265
}
266266

267-
postStartCommands, err := devcontainer.ConvertCommands(root.MergedConfiguration.PostStartCommands)
267+
postStartCommands, err := devcontainer.ConvertToArray(root.MergedConfiguration.PostStartCommands)
268268
if err != nil {
269269
projectLogger.Write([]byte(fmt.Sprintf("Error converting post start commands: %v\n", err)))
270270
}

0 commit comments

Comments
 (0)