@@ -16,6 +16,19 @@ type secretsFlags struct {
16
16
config configFlags
17
17
}
18
18
19
+ func (f * secretsFlags ) envsec (cmd * cobra.Command ) (* envsec.Envsec , error ) {
20
+ box , err := devbox .Open (& devopt.Opts {
21
+ Dir : f .config .path ,
22
+ Environment : f .config .environment ,
23
+ Stderr : cmd .ErrOrStderr (),
24
+ })
25
+ if err != nil {
26
+ return nil , errors .WithStack (err )
27
+ }
28
+
29
+ return box .Secrets (cmd .Context ())
30
+ }
31
+
19
32
type secretsInitCmdFlags struct {
20
33
force bool
21
34
}
@@ -25,6 +38,14 @@ type secretsListFlags struct {
25
38
format string
26
39
}
27
40
41
+ type secretsDownloadFlags struct {
42
+ format string
43
+ }
44
+
45
+ type secretsUploadFlags struct {
46
+ format string
47
+ }
48
+
28
49
func secretsCmd () * cobra.Command {
29
50
flags := & secretsFlags {}
30
51
cmd := & cobra.Command {
@@ -33,10 +54,12 @@ func secretsCmd() *cobra.Command {
33
54
Short : "Interact with devbox secrets in jetpack cloud." ,
34
55
PersistentPreRunE : ensureNixInstalled ,
35
56
}
57
+ cmd .AddCommand (secretsDownloadCmd (flags ))
36
58
cmd .AddCommand (secretsInitCmd (flags ))
37
59
cmd .AddCommand (secretsListCmd (flags ))
38
60
cmd .AddCommand (secretsRemoveCmd (flags ))
39
61
cmd .AddCommand (secretsSetCmd (flags ))
62
+ cmd .AddCommand (secretsUploadCmd (flags ))
40
63
cmd .Hidden = true
41
64
42
65
flags .config .registerPersistent (cmd )
@@ -76,27 +99,12 @@ func secretsSetCmd(flags *secretsFlags) *cobra.Command {
76
99
return envsec .ValidateSetArgs (args )
77
100
},
78
101
RunE : func (cmd * cobra.Command , args []string ) error {
79
- ctx := cmd .Context ()
80
- box , err := devbox .Open (& devopt.Opts {
81
- Dir : flags .config .path ,
82
- Environment : flags .config .environment ,
83
- Stderr : cmd .ErrOrStderr (),
84
- })
85
- if err != nil {
86
- return errors .WithStack (err )
87
- }
88
-
89
- secrets , err := box .Secrets (ctx )
90
- if err != nil {
91
- return errors .WithStack (err )
92
- }
93
-
94
- envID , err := secrets .EnvID ()
102
+ secrets , err := flags .envsec (cmd )
95
103
if err != nil {
96
104
return errors .WithStack (err )
97
105
}
98
106
99
- return secrets .SetFromArgs (ctx , envID , args )
107
+ return secrets .SetFromArgs (cmd . Context () , args )
100
108
},
101
109
}
102
110
}
@@ -108,27 +116,12 @@ func secretsRemoveCmd(flags *secretsFlags) *cobra.Command {
108
116
Aliases : []string {"rm" },
109
117
Args : cobra .MinimumNArgs (1 ),
110
118
RunE : func (cmd * cobra.Command , args []string ) error {
111
- ctx := cmd .Context ()
112
- box , err := devbox .Open (& devopt.Opts {
113
- Dir : flags .config .path ,
114
- Environment : flags .config .environment ,
115
- Stderr : cmd .ErrOrStderr (),
116
- })
117
- if err != nil {
118
- return errors .WithStack (err )
119
- }
120
-
121
- secrets , err := box .Secrets (ctx )
122
- if err != nil {
123
- return errors .WithStack (err )
124
- }
125
-
126
- envID , err := secrets .EnvID ()
119
+ secrets , err := flags .envsec (cmd )
127
120
if err != nil {
128
121
return errors .WithStack (err )
129
122
}
130
123
131
- return secrets .DeleteAll (ctx , envID , args ... )
124
+ return secrets .DeleteAll (cmd . Context () , args ... )
132
125
},
133
126
}
134
127
}
@@ -141,33 +134,18 @@ func secretsListCmd(commonFlags *secretsFlags) *cobra.Command {
141
134
Short : "List all secrets" ,
142
135
Args : cobra .ExactArgs (0 ),
143
136
RunE : func (cmd * cobra.Command , args []string ) error {
144
- ctx := cmd .Context ()
145
- box , err := devbox .Open (& devopt.Opts {
146
- Dir : commonFlags .config .path ,
147
- Environment : commonFlags .config .environment ,
148
- Stderr : cmd .ErrOrStderr (),
149
- })
137
+ secrets , err := commonFlags .envsec (cmd )
150
138
if err != nil {
151
139
return errors .WithStack (err )
152
140
}
153
141
154
- secrets , err := box .Secrets (ctx )
155
- if err != nil {
156
- return errors .WithStack (err )
157
- }
158
-
159
- envID , err := secrets .EnvID ()
160
- if err != nil {
161
- return errors .WithStack (err )
162
- }
163
-
164
- vars , err := secrets .List (ctx , envID )
142
+ vars , err := secrets .List (cmd .Context ())
165
143
if err != nil {
166
144
return err
167
145
}
168
146
169
- return envsec .PrintEnvVars (
170
- vars , cmd .OutOrStdout (), flags .show , flags .format )
147
+ return envsec .PrintEnvVar (
148
+ cmd .OutOrStdout (), secrets . EnvID , vars , flags .show , flags .format )
171
149
},
172
150
}
173
151
@@ -188,6 +166,60 @@ func secretsListCmd(commonFlags *secretsFlags) *cobra.Command {
188
166
return cmd
189
167
}
190
168
169
+ func secretsDownloadCmd (commonFlags * secretsFlags ) * cobra.Command {
170
+ flags := secretsDownloadFlags {}
171
+ command := & cobra.Command {
172
+ Use : "download <file1>" ,
173
+ Short : "Download environment variables into the specified file" ,
174
+ Args : cobra .ExactArgs (1 ),
175
+ PreRunE : func (cmd * cobra.Command , args []string ) error {
176
+ return envsec .ValidateFormat (flags .format )
177
+ },
178
+ RunE : func (cmd * cobra.Command , args []string ) error {
179
+ secrets , err := commonFlags .envsec (cmd )
180
+ if err != nil {
181
+ return errors .WithStack (err )
182
+ }
183
+ if err != nil {
184
+ return errors .WithStack (err )
185
+ }
186
+ return secrets .Download (cmd .Context (), args [0 ], flags .format )
187
+ },
188
+ }
189
+
190
+ command .Flags ().StringVarP (
191
+ & flags .format , "format" , "f" , "" , "file format: dotenv or json" )
192
+
193
+ return command
194
+ }
195
+
196
+ func secretsUploadCmd (commonFlags * secretsFlags ) * cobra.Command {
197
+ flags := & secretsUploadFlags {}
198
+ command := & cobra.Command {
199
+ Use : "upload <file1> [<fileN>]..." ,
200
+ Short : "Upload variables defined in one or more .env files." ,
201
+ Args : cobra .MinimumNArgs (1 ),
202
+ PreRunE : func (cmd * cobra.Command , args []string ) error {
203
+ return envsec .ValidateFormat (flags .format )
204
+ },
205
+ RunE : func (cmd * cobra.Command , paths []string ) error {
206
+ secrets , err := commonFlags .envsec (cmd )
207
+ if err != nil {
208
+ return errors .WithStack (err )
209
+ }
210
+ if err != nil {
211
+ return errors .WithStack (err )
212
+ }
213
+ return secrets .Upload (cmd .Context (), paths , flags .format )
214
+ },
215
+ }
216
+
217
+ command .Flags ().StringVarP (
218
+ & flags .format , "format" , "f" , "" , "File format: dotenv or json" )
219
+
220
+ return command
221
+ }
222
+
191
223
func secretsInitFunc (
192
224
cmd * cobra.Command ,
193
225
flags secretsInitCmdFlags ,
@@ -201,10 +233,10 @@ func secretsInitFunc(
201
233
if err != nil {
202
234
return errors .WithStack (err )
203
235
}
204
- secrets , err := box . Secrets ( ctx )
205
- if err != nil {
206
- return errors . WithStack ( err )
207
- }
236
+
237
+ // devbox.Secrets() by default assumes project is initialized (and shows
238
+ // error if not). So we use UninitializedSecrets() here instead.
239
+ secrets := box . UninitializedSecrets ( ctx )
208
240
209
241
if _ , err := secrets .ProjectConfig (); err == nil &&
210
242
box .Config ().EnvFrom != "jetpack-cloud" {
0 commit comments