Skip to content

Commit ef5aba6

Browse files
POD-859 | Use Environment Templates from Pro (loft-sh#1253)
* Bump github.com/loft-sh/api/v4 -> v4.1.0-alpha.10 * Add EnvironmentTemplate to CLIOptions * Support crane environment source * Allow overriding bin name * Change how crane command is build
1 parent 1d27dd7 commit ef5aba6

File tree

52 files changed

+1497
-153
lines changed

Some content is hidden

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

52 files changed

+1497
-153
lines changed

cmd/agent/workspace/up.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func prepareWorkspace(ctx context.Context, workspaceInfo *provider2.AgentWorkspa
286286
return nil
287287
}
288288

289-
if workspaceInfo.CLIOptions.DevContainerSource != "" && crane.IsAvailable() {
289+
if crane.ShouldUse(&workspaceInfo.CLIOptions) {
290290
log.Infof("Pulling devcontainer spec from %v", workspaceInfo.CLIOptions.DevContainerSource)
291291
return nil
292292
}

cmd/up.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ func NewUpCmd(flags *flags.GlobalFlags) *cobra.Command {
153153
upCmd.Flags().StringVar(&cmd.DevContainerImage, "devcontainer-image", "", "The container image to use, this will override the devcontainer.json value in the project")
154154
upCmd.Flags().StringVar(&cmd.DevContainerPath, "devcontainer-path", "", "The path to the devcontainer.json relative to the project")
155155
upCmd.Flags().StringVar(&cmd.DevContainerSource, "devcontainer-source", "", "External devcontainer.json source")
156+
upCmd.Flags().StringVar(&cmd.EnvironmentTemplate, "environment-template", "", "Environment template to use")
157+
_ = upCmd.Flags().MarkHidden("environment-template")
156158
upCmd.Flags().StringArrayVar(&cmd.ProviderOptions, "provider-option", []string{}, "Provider option in the form KEY=VALUE")
157159
upCmd.Flags().BoolVar(&cmd.Recreate, "recreate", false, "If true will remove any existing containers and recreate them")
158160
upCmd.Flags().BoolVar(&cmd.Reset, "reset", false, "If true will remove any existing containers including sources, and recreate them")

go.mod

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ require (
2020
github.com/google/uuid v1.6.0
2121
github.com/gorilla/websocket v1.5.1
2222
github.com/joho/godotenv v1.5.1
23-
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.1
24-
github.com/loft-sh/api/v4 v4.1.0-alpha.1
23+
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.10
24+
github.com/loft-sh/api/v4 v4.1.0-alpha.10
2525
github.com/loft-sh/log v0.0.0-20240219160058-26d83ffb46ac
2626
github.com/loft-sh/programming-language-detection v0.0.5
2727
github.com/loft-sh/ssh v0.0.4
@@ -50,14 +50,14 @@ require (
5050
gopkg.in/square/go-jose.v2 v2.6.0
5151
gopkg.in/yaml.v2 v2.4.0
5252
gotest.tools v2.2.0+incompatible
53-
k8s.io/api v0.30.1
54-
k8s.io/apimachinery v0.30.1
55-
k8s.io/client-go v0.30.1
53+
k8s.io/api v0.30.4
54+
k8s.io/apimachinery v0.30.4
55+
k8s.io/client-go v0.30.4
5656
k8s.io/klog/v2 v2.120.1
5757
k8s.io/kube-aggregator v0.30.1
5858
k8s.io/kubectl v0.29.1
5959
mvdan.cc/sh/v3 v3.6.0
60-
sigs.k8s.io/controller-runtime v0.18.4
60+
sigs.k8s.io/controller-runtime v0.18.5
6161
)
6262

6363
require (
@@ -131,7 +131,7 @@ require (
131131
github.com/json-iterator/go v1.1.12 // indirect
132132
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
133133
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
134-
github.com/loft-sh/admin-apis v0.0.0-20240203010124-3600c1c582a8 // indirect
134+
github.com/loft-sh/admin-apis v0.0.0-20240814093917-dc663916b354 // indirect
135135
github.com/loft-sh/apiserver v0.0.0-20240607231110-634aeeab2b36 // indirect
136136
github.com/mailru/easyjson v0.7.7 // indirect
137137
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
@@ -176,10 +176,10 @@ require (
176176
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
177177
gopkg.in/inf.v0 v0.9.1 // indirect
178178
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
179-
k8s.io/apiextensions-apiserver v0.30.1 // indirect
180-
k8s.io/apiserver v0.30.1 // indirect
179+
k8s.io/apiextensions-apiserver v0.30.4 // indirect
180+
k8s.io/apiserver v0.30.4 // indirect
181181
k8s.io/cli-runtime v0.29.1 // indirect
182-
k8s.io/component-base v0.30.1 // indirect
182+
k8s.io/component-base v0.30.4 // indirect
183183
k8s.io/kube-openapi v0.0.0-20240521193020-835d969ad83a // indirect
184184
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect
185185
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect

go.sum

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,10 +676,16 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9
676676
github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
677677
github.com/loft-sh/admin-apis v0.0.0-20240203010124-3600c1c582a8 h1:nuY9Vgvabh2FlaTYp9yhzh3cBzY6jjFEFSsOvw9ZAJw=
678678
github.com/loft-sh/admin-apis v0.0.0-20240203010124-3600c1c582a8/go.mod h1:MWczNwKvWssHo1KaeZKaWDdRLYSNbWqQBGsTLoCNd7U=
679+
github.com/loft-sh/admin-apis v0.0.0-20240814093917-dc663916b354 h1:aqT1UeosCYB+3DEzfxW0evhcYHxhoBVAEWtkXLXFimI=
680+
github.com/loft-sh/admin-apis v0.0.0-20240814093917-dc663916b354/go.mod h1:MWczNwKvWssHo1KaeZKaWDdRLYSNbWqQBGsTLoCNd7U=
679681
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.1 h1:exsfePvLXhVnuQHhFqXK5FxbPzBZpQiLhj8jQQ1zq8c=
680682
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.1/go.mod h1:5U2JmT3BpfROQg1rX+DIpJ3/JuF62OYBveZ7GzOQA9o=
683+
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.10 h1:XUtSAPorloQbXelYKX98L9TtxLbHTQVFjBhJVxpkYVA=
684+
github.com/loft-sh/agentapi/v4 v4.1.0-alpha.10/go.mod h1:fj/fZ17NpJo63Bpx75eSx+ZmonfTWr52WgIZVwevc48=
681685
github.com/loft-sh/api/v4 v4.1.0-alpha.1 h1:SLOhaRlJE3fkZfllaTeOiNnuOQMe/7u14wJXfqgkMio=
682686
github.com/loft-sh/api/v4 v4.1.0-alpha.1/go.mod h1:1p5qVavAJC/gVZZpJ/x1YQQt91fux7wZaqSixCX5QlI=
687+
github.com/loft-sh/api/v4 v4.1.0-alpha.10 h1:vUIQ7PgaLOA0wTOu1uPkHjgXvcO6myh2ersBsdxZo1c=
688+
github.com/loft-sh/api/v4 v4.1.0-alpha.10/go.mod h1:GTwXhRrjQGSaEhk9d/PkcEuoXl/jQwOZS6Tfjfa3ixQ=
683689
github.com/loft-sh/apiserver v0.0.0-20240607231110-634aeeab2b36 h1:1euJ7mNHMI2MMA+g+jEYYKtoMrHZTkUMapHnmjHb9lM=
684690
github.com/loft-sh/apiserver v0.0.0-20240607231110-634aeeab2b36/go.mod h1:XxI95azXiqXHiIDRiyDTpZcxdtXQlUqeU5VMMDz8INA=
685691
github.com/loft-sh/log v0.0.0-20240219160058-26d83ffb46ac h1:Gz/7Lb7WgdgIv+KJz87ORA1zvQW52tUqKPGyunlp4dQ=
@@ -1517,31 +1523,43 @@ k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
15171523
k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
15181524
k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY=
15191525
k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM=
1526+
k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs=
1527+
k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0=
15201528
k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws=
15211529
k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4=
1530+
k8s.io/apiextensions-apiserver v0.30.4 h1:FwOMIk/rzZvM/Gx0IOz0+biZ+dlnlCeyfXW17uzV1qE=
1531+
k8s.io/apiextensions-apiserver v0.30.4/go.mod h1:m8cAkJ9PVU8Olb4cPW4hrUDBZGvoSJ0kY0G0CfdGQac=
15221532
k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
15231533
k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
15241534
k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
15251535
k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U=
15261536
k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
1537+
k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY=
1538+
k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
15271539
k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
15281540
k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
15291541
k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
15301542
k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8=
15311543
k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo=
1544+
k8s.io/apiserver v0.30.4 h1:rHkGJhxd+m4jILrgkenwSmG4X0QXk6ecGuybzS/PQak=
1545+
k8s.io/apiserver v0.30.4/go.mod h1:oyGAj9B9/0+I9huJyf4/8SMBF2mNh2bTMlu7703dkH8=
15321546
k8s.io/cli-runtime v0.29.1 h1:By3WVOlEWYfyxhGko0f/IuAOLQcbBSMzwSaDren2JUs=
15331547
k8s.io/cli-runtime v0.29.1/go.mod h1:vjEY9slFp8j8UoMhV5AlO8uulX9xk6ogfIesHobyBDU=
15341548
k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
15351549
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
15361550
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
15371551
k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q=
15381552
k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc=
1553+
k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY=
1554+
k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc=
15391555
k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
15401556
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
15411557
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
15421558
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
15431559
k8s.io/component-base v0.30.1 h1:bvAtlPh1UrdaZL20D9+sWxsJljMi0QZ3Lmw+kmZAaxQ=
15441560
k8s.io/component-base v0.30.1/go.mod h1:e/X9kDiOebwlI41AvBHuWdqFriSRrX50CdwA9TFaHLI=
1561+
k8s.io/component-base v0.30.4 h1:FlgKqazIkIIxpLA4wFXsiPiDllJn9fhsN3G4TeX7T7U=
1562+
k8s.io/component-base v0.30.4/go.mod h1:Qd3h+OJxV/LrnriXG/E15ZK83dzd306qJHW9+87S5ls=
15451563
k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
15461564
k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
15471565
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
@@ -1577,6 +1595,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 h1:/U5vjBbQn3RCh
15771595
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0/go.mod h1:z7+wmGM2dfIiLRfrC6jb5kV2Mq/sK1ZP303cxzkV5Y4=
15781596
sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw=
15791597
sigs.k8s.io/controller-runtime v0.18.4/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
1598+
sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk=
1599+
sigs.k8s.io/controller-runtime v0.18.5/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg=
15801600
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
15811601
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
15821602
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=

pkg/devcontainer/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ func (r *runner) getRawConfig(options provider2.CLIOptions) (*config.DevContaine
3333
},
3434
Origin: "",
3535
}, nil
36-
} else if options.DevContainerSource != "" && crane.IsAvailable() {
37-
localWorkspaceFolder, err := crane.PullConfigFromSource(r.WorkspaceConfig, r.Log)
36+
} else if crane.ShouldUse(&options) {
37+
localWorkspaceFolder, err := crane.PullConfigFromSource(r.WorkspaceConfig, &options, r.Log)
3838
if err != nil {
3939
return nil, err
4040
}

pkg/devcontainer/crane/run.go

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,39 @@ const (
2020
PullCommand = "pull"
2121
DecryptCommand = "decrypt"
2222

23-
GitCrane = "git"
23+
GitCrane = "git"
24+
EnvironmentCrane = "environment"
2425

25-
BinPath = "devpod-crane" // FIXME
26-
27-
tmpDirTemplate = "devpod-crane-*"
26+
defaultBinName = "devpod-crane"
27+
envDevPodCraneName = "DEVPOD_CRANE_NAME"
28+
tmpDirTemplate = "devpod-crane-*"
2829
)
2930

3031
type Content struct {
3132
Files map[string]string `json:"files"`
3233
}
3334

34-
// IsAvailable checks if devpod crane is installed in host system
35-
func IsAvailable() bool {
36-
_, err := exec.LookPath(BinPath)
37-
return err == nil
35+
type command struct {
36+
cmd string
37+
args []string
3838
}
3939

40-
func runCommand(command string, args ...string) (string, error) {
41-
cmd := exec.Command(BinPath, append([]string{command}, args...)...)
40+
func New(cmd string) *command {
41+
return &command{cmd: cmd}
42+
}
43+
44+
func (c *command) WithFlag(flag, val string) *command {
45+
c.args = append(c.args, flag, val)
46+
return c
47+
}
48+
49+
func (c *command) WithArg(arg string) *command {
50+
c.args = append(c.args, arg)
51+
return c
52+
}
53+
54+
func (c *command) Run() (string, error) {
55+
cmd := exec.Command(c.cmd, c.args...)
4256

4357
var outBuf, errBuf bytes.Buffer
4458
cmd.Stdout = &outBuf
@@ -51,15 +65,37 @@ func runCommand(command string, args ...string) (string, error) {
5165
return outBuf.String(), nil
5266
}
5367

68+
// ShouldUse takes CLIOptions and returns true if crane should be used
69+
func ShouldUse(cliOptions *provider2.CLIOptions) bool {
70+
return IsAvailable() && (cliOptions.DevContainerSource != "" ||
71+
cliOptions.EnvironmentTemplate != "")
72+
}
73+
74+
// IsAvailable checks if devpod crane is installed in host system
75+
func IsAvailable() bool {
76+
_, err := exec.LookPath(getBinName())
77+
return err == nil
78+
}
79+
5480
// PullConfigFromSource pulls devcontainer config from configSource using git crane and returns config path
55-
func PullConfigFromSource(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) (string, error) {
56-
data, err := runCommand(PullCommand, GitCrane, workspaceInfo.CLIOptions.DevContainerSource)
81+
func PullConfigFromSource(workspaceInfo *provider2.AgentWorkspaceInfo, options *provider2.CLIOptions, log log.Logger) (string, error) {
82+
var data string
83+
var err error
84+
85+
switch {
86+
case options.EnvironmentTemplate != "":
87+
data, err = New(PullCommand).WithArg(EnvironmentCrane).WithArg(options.EnvironmentTemplate).Run()
88+
case options.DevContainerSource != "":
89+
data, err = New(PullCommand).WithArg(GitCrane).WithArg(options.DevContainerSource).Run()
90+
default:
91+
err = fmt.Errorf("failed to pull config from source based on options")
92+
}
5793
if err != nil {
5894
return "", err
5995
}
6096

6197
if craneSigningKey != "" {
62-
data, err = runCommand(DecryptCommand, data, "--key", craneSigningKey)
98+
data, err = New(DecryptCommand).WithArg(data).WithFlag("--key", craneSigningKey).Run()
6399
if err != nil {
64100
return "", err
65101
}
@@ -111,3 +147,10 @@ func storeFilesInDirectory(content *Content, path string) (string, error) {
111147

112148
return path, nil
113149
}
150+
151+
func getBinName() string {
152+
if name := os.Getenv(envDevPodCraneName); name != "" {
153+
return name
154+
}
155+
return defaultBinName
156+
}

pkg/devcontainer/setup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (r *runner) setupContainer(
7979
Agent: r.WorkspaceConfig.Agent,
8080
ContentFolder: r.WorkspaceConfig.ContentFolder,
8181
}
82-
if r.WorkspaceConfig.CLIOptions.DevContainerSource != "" && crane.IsAvailable() {
82+
if crane.ShouldUse(&r.WorkspaceConfig.CLIOptions) {
8383
workspaceConfig.PullFromInsideContainer = "true"
8484
}
8585
// compress container workspace info

pkg/provider/workspace.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ type CLIOptions struct {
191191
DevContainerImage string `json:"devContainerImage,omitempty"`
192192
DevContainerPath string `json:"devContainerPath,omitempty"`
193193
DevContainerSource string `json:"devContainerSource,omitempty"`
194+
EnvironmentTemplate string `json:"environmentTemplate,omitempty"`
194195
WorkspaceEnv []string `json:"workspaceEnv,omitempty"`
195196
WorkspaceEnvFile []string `json:"workspaceEnvFile,omitempty"`
196197
InitEnv []string `json:"initEnv,omitempty"`

vendor/github.com/dimchansky/utfbom/.travis.yml

Lines changed: 29 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/loft-sh/admin-apis/pkg/licenseapi/features.go

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)