47
47
48
48
49
49
DEFAULT_SOURCE = "https://github.com/snowflakedb/snowflake-cli-templates"
50
- DEFAULT_CI_SOURCE = DEFAULT_SOURCE + "/cicd"
51
50
52
51
log = logging .getLogger (__name__ )
53
52
@@ -220,52 +219,30 @@ def init(
220
219
variables_from_flags = {
221
220
v .key : v .value for v in parse_key_value_variables (variables )
222
221
}
223
- is_remote = any (
224
- template_source .startswith (prefix ) for prefix in ["git@" , "http://" , "https://" ] # type: ignore
225
- )
226
222
args_error_msg = f"Check whether { TemplateOption .param_decls [0 ]} and { SourceOption .param_decls [0 ]} arguments are correct."
227
223
228
224
# copy/download template into tmpdir, so it is going to be removed in case command ends with an error
229
225
with SecurePath .temporary_directory () as tmpdir :
230
- if is_remote :
231
- template_root = _fetch_remote_template (
232
- url = template_source , path = template , destination = tmpdir # type: ignore
233
- )
234
- else :
235
- template_root = _fetch_local_template (
236
- template_source = SecurePath (template_source ),
237
- path = template ,
238
- destination = tmpdir ,
239
- )
240
-
241
- if ci_provider :
242
- ci_provider_instance = CIProvider .from_choice (ci_provider )
243
- if ci_template_source is not None :
244
- with SecurePath .temporary_directory () as cicd_tmpdir :
245
- cicd_template_root = _fetch_remote_template (
246
- url = ci_template_source ,
247
- path = None ,
248
- destination = cicd_tmpdir
249
- # type: ignore
250
- )
251
- cicd_template_root .copy (template_root .path )
252
-
253
- elif ci_provider_instance .has_template (template_root ):
254
- pass # template has ci files
255
- else :
256
- # use generic ci/cd template
257
- with SecurePath .temporary_directory () as cicd_tmpdir :
258
- cicd_template_root = _fetch_remote_template (
259
- url = DEFAULT_SOURCE , path = f"cicd/{ ci_provider_instance .name .lower ()} " , destination = cicd_tmpdir # type: ignore
260
- )
261
- cicd_template_root .copy (template_root .path )
226
+ assert isinstance (template_source , str )
227
+ template_root = _fetch_template (template_source , template , tmpdir )
262
228
263
229
template_metadata = _read_template_metadata (
264
230
template_root , args_error_msg = args_error_msg
265
231
)
266
232
if template_metadata .minimum_cli_version :
267
233
_validate_cli_version (template_metadata .minimum_cli_version )
268
234
235
+ if ci_provider :
236
+ ci_provider_instance = CIProvider .from_choice (ci_provider )
237
+ clone (
238
+ ci_provider_instance ,
239
+ ci_template_source ,
240
+ template_metadata ,
241
+ template_root ,
242
+ )
243
+ else :
244
+ ci_provider_instance = None
245
+
269
246
variable_values = _determine_variable_values (
270
247
variables_metadata = template_metadata .variables ,
271
248
variables_from_flags = variables_from_flags ,
@@ -274,13 +251,12 @@ def init(
274
251
"project_dir_name" : SecurePath (path ).name ,
275
252
"snowflake_cli_version" : VERSION ,
276
253
}
277
- files_to_render = template_metadata . files_to_render + list (
278
- ci_provider_instance . get_files_to_render ( template_root )
254
+ log . debug (
255
+ "Rendering template files: %s" , ", " . join ( template_metadata . files_to_render )
279
256
)
280
- log .debug ("Rendering template files: %s" , ", " .join (files_to_render ))
281
257
render_template_files (
282
258
template_root = template_root ,
283
- files_to_render = files_to_render ,
259
+ files_to_render = template_metadata . files_to_render ,
284
260
data = variable_values ,
285
261
)
286
262
_remove_template_metadata_file (template_root )
@@ -291,5 +267,51 @@ def init(
291
267
return MessageResult (f"Initialized the new project in { path } " )
292
268
293
269
270
+ def clone (
271
+ ci_provider_instance : CIProvider ,
272
+ ci_template_source : Optional [str ],
273
+ template_metadata : Template ,
274
+ template_root : SecurePath ,
275
+ ):
276
+ if ci_template_source is not None :
277
+ with SecurePath .temporary_directory () as cicd_tmpdir :
278
+ cicd_template_root = _fetch_template (ci_template_source , None , cicd_tmpdir )
279
+ ci_provider_instance .copy (cicd_template_root , template_root )
280
+ ci_template_metadata = _read_template_metadata (
281
+ cicd_template_root ,
282
+ args_error_msg = "template.yml is required for --ci-template-source." ,
283
+ )
284
+ template_metadata .merge (ci_template_metadata )
285
+
286
+ elif ci_provider_instance .has_template (template_root ):
287
+ pass # template has ci files
288
+ else :
289
+ raise ClickException (
290
+ f"Template for { ci_provider_instance .NAME } not provided and not configured on selected template."
291
+ )
292
+
293
+
294
+ def _fetch_template (
295
+ template_source : str , template : Optional [str ], tmpdir : SecurePath
296
+ ) -> SecurePath :
297
+ if _is_remote_source (template_source ):
298
+ template_root = _fetch_remote_template (
299
+ url = template_source , path = template , destination = tmpdir # type: ignore
300
+ )
301
+ else :
302
+ template_root = _fetch_local_template (
303
+ template_source = SecurePath (template_source ),
304
+ path = template ,
305
+ destination = tmpdir ,
306
+ )
307
+ return template_root
308
+
309
+
310
+ def _is_remote_source (template_source : str ) -> bool :
311
+ return any (
312
+ template_source .startswith (prefix ) for prefix in ["git@" , "http://" , "https://" ] # type: ignore
313
+ )
314
+
315
+
294
316
def post_generate (template_root : SecurePath , ci_provider : Optional [CIProvider ]):
295
317
CIProviderManager .project_post_gen_cleanup (ci_provider , template_root )
0 commit comments