Skip to content

Commit c5b0f66

Browse files
authored
CLI, first class lang support: on demand common (#2834)
* cleanup test-component wit * remove common leftovers * reworked app templates * remove temp dir customization and generate on-demand-common templates after preload * move on-demand-common init into app context * cleanups * cleanups / fixes * make fix * make llm rust templates devOnly * on-demand-common hashing * allow only 1 common and on-demand-common template per language * make fix
1 parent aa5c2cc commit c5b0f66

File tree

119 files changed

+1777
-1622
lines changed

Some content is hidden

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

119 files changed

+1777
-1622
lines changed

cli/golem-cli/src/app/build/clean.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ pub fn clean_app(ctx: &BuildContext<'_>, mode: CleanMode) -> anyhow::Result<()>
6969
};
7070

7171
for (context, path) in paths {
72-
fs::delete_path_logged(context, &path)?;
72+
fs::delete_logged(context, &path)?;
7373
}
7474
}
7575

@@ -79,13 +79,13 @@ pub fn clean_app(ctx: &BuildContext<'_>, mode: CleanMode) -> anyhow::Result<()>
7979
let _indent = LogIndent::new();
8080

8181
for clean in ctx.application().common_clean() {
82-
fs::delete_path_logged("common clean target", &clean.source.join(&clean.value))?;
82+
fs::delete_logged("common clean target", &clean.source.join(&clean.value))?;
8383
}
8484

8585
log_action("Cleaning", "application build dir");
8686
let _indent = LogIndent::new();
8787

88-
fs::delete_path_logged("temp dir", ctx.application().temp_dir())?;
88+
fs::delete_logged("temp dir", ctx.application().temp_dir())?;
8989
}
9090
CleanMode::SelectedComponentsOnly => {
9191
// NOP

cli/golem-cli/src/app/build/command.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ pub async fn execute_external_command(
334334
let _ident = LogIndent::new();
335335
for dir in &command.rmdirs {
336336
let dir = build_dir.join(dir);
337-
fs::delete_path_logged("directory", &dir)?;
337+
fs::delete_logged("directory", &dir)?;
338338
}
339339
}
340340

cli/golem-cli/src/app/context.rs

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::app::build::build_app;
1616
use crate::app::build::clean::clean_app;
1717
use crate::app::build::command::execute_custom_command;
1818
use crate::app::error::{format_warns, AppValidationError, CustomCommandError};
19-
use crate::fs;
19+
use crate::app::template::AppTemplateRepo;
2020
use crate::log::{log_action, logln, LogColorize, LogIndent, LogOutput, Output};
2121
use crate::model::app::{
2222
includes_from_yaml_file, AppBuildStep, Application, ApplicationComponentSelectMode,
@@ -28,6 +28,7 @@ use crate::model::text::fmt::format_component_applied_layers;
2828
use crate::model::text::server::ToFormattedServerContext;
2929
use crate::model::{app_raw, GuestLanguage};
3030
use crate::validation::{ValidatedResult, ValidationBuilder};
31+
use crate::{fs, SdkOverrides};
3132
use anyhow::anyhow;
3233
use colored::Colorize;
3334
use golem_common::model::application::ApplicationName;
@@ -36,6 +37,7 @@ use golem_common::model::environment::EnvironmentName;
3637
use itertools::Itertools;
3738
use std::collections::{BTreeMap, BTreeSet, HashSet};
3839
use std::path::{Path, PathBuf};
40+
3941
pub struct BuildContext<'a> {
4042
application_context: &'a ApplicationContext,
4143
build_config: &'a BuildConfig,
@@ -137,9 +139,9 @@ pub struct ApplicationPreloadResult {
137139
pub source_mode: ApplicationSourceMode,
138140
pub loaded_with_warnings: bool,
139141
pub application_name_and_environments: Option<ApplicationNameAndEnvironments>,
142+
pub used_language_templates: HashSet<GuestLanguage>,
140143
}
141144

142-
// TODO: review pub fields?
143145
pub struct ApplicationContext {
144146
loaded_with_warnings: bool,
145147
config: ApplicationConfig,
@@ -151,12 +153,14 @@ pub struct ApplicationContext {
151153
}
152154

153155
impl ApplicationContext {
154-
pub fn preload_sources_and_get_environments(
156+
pub fn preload_application(
155157
source_mode: ApplicationSourceMode,
158+
dev_mode: bool,
159+
sdk_overrides: &SdkOverrides,
156160
) -> anyhow::Result<ApplicationPreloadResult> {
157161
let _output = LogOutput::new(Output::None);
158162

159-
match load_environments(source_mode) {
163+
match preload_app(source_mode, dev_mode, sdk_overrides) {
160164
Some(environments) => to_anyhow(
161165
"Failed to load application manifest environments, see problems above",
162166
environments,
@@ -169,6 +173,7 @@ impl ApplicationContext {
169173
source_mode: ApplicationSourceMode::None,
170174
loaded_with_warnings: false,
171175
application_name_and_environments: None,
176+
used_language_templates: HashSet::new(),
172177
}),
173178
}
174179
}
@@ -571,25 +576,76 @@ fn load_app(
571576
})
572577
}
573578

574-
fn load_environments(
579+
fn preload_app(
575580
source_mode: ApplicationSourceMode,
581+
dev_mode: bool,
582+
sdk_overrides: &SdkOverrides,
576583
) -> Option<ValidatedResult<ApplicationPreloadResult>> {
577584
load_raw_apps(source_mode).map(|raw_apps_and_calling_working_dir| {
578585
raw_apps_and_calling_working_dir.and_then(|(raw_apps, calling_working_dir)| {
579-
Application::environments_from_raw_apps(raw_apps.as_slice()).map(
580-
|application_name_and_environments| ApplicationPreloadResult {
581-
source_mode: ApplicationSourceMode::Preloaded {
582-
raw_apps,
583-
calling_working_dir,
586+
let used_language_templates = Application::language_templates_from_raw_apps(&raw_apps);
587+
588+
Application::environments_from_raw_apps(raw_apps.as_slice())
589+
.and_then(|application_name_and_environments| {
590+
ValidatedResult::from_result(ensure_on_demand_commons(
591+
&used_language_templates,
592+
dev_mode,
593+
sdk_overrides,
594+
))
595+
.map(|on_demand_common_raw_apps| {
596+
(on_demand_common_raw_apps, application_name_and_environments)
597+
})
598+
})
599+
.map(
600+
|(on_demand_common_raw_apps, application_name_and_environments)| {
601+
let raw_apps = {
602+
let mut raw_apps = raw_apps;
603+
raw_apps.extend(on_demand_common_raw_apps);
604+
raw_apps
605+
};
606+
607+
ApplicationPreloadResult {
608+
source_mode: ApplicationSourceMode::Preloaded {
609+
raw_apps,
610+
calling_working_dir,
611+
},
612+
loaded_with_warnings: false,
613+
application_name_and_environments: Some(
614+
application_name_and_environments,
615+
),
616+
used_language_templates,
617+
}
584618
},
585-
loaded_with_warnings: false,
586-
application_name_and_environments: Some(application_name_and_environments),
587-
},
588-
)
619+
)
589620
})
590621
})
591622
}
592623

624+
fn ensure_on_demand_commons(
625+
languages: &HashSet<GuestLanguage>,
626+
dev_mode: bool,
627+
sdk_overrides: &SdkOverrides,
628+
) -> anyhow::Result<Vec<app_raw::ApplicationWithSource>> {
629+
let app_template_repo = AppTemplateRepo::get(dev_mode)?;
630+
631+
let mut on_demand_raw_apps = Vec::new();
632+
633+
for language in languages {
634+
if let Some(template) = app_template_repo.common_on_demand_template(*language)? {
635+
let target_dir = Application::on_demand_common_dir_for_language(template.0.language);
636+
template.generate(&target_dir, sdk_overrides)?;
637+
let golem_yaml_path = target_dir.join("golem.yaml");
638+
if golem_yaml_path.exists() {
639+
on_demand_raw_apps.push(app_raw::ApplicationWithSource::from_yaml_file(
640+
golem_yaml_path,
641+
)?);
642+
}
643+
}
644+
}
645+
646+
Ok(on_demand_raw_apps)
647+
}
648+
593649
fn load_raw_apps(
594650
source_mode: ApplicationSourceMode,
595651
) -> Option<ValidatedResult<(Vec<app_raw::ApplicationWithSource>, PathBuf)>> {

cli/golem-cli/src/app/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ pub mod build;
1717
pub mod context;
1818
pub mod error;
1919
pub mod remote_components;
20+
pub mod template;

0 commit comments

Comments
 (0)