Skip to content

Commit e6f084e

Browse files
authored
Merge pull request #832 from moonbitlang/single_mbt_md_deps
feat: support deps for .mbt.md
2 parents eacf15c + 070aa91 commit e6f084e

File tree

19 files changed

+278
-85
lines changed

19 files changed

+278
-85
lines changed

.github/workflows/ci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ jobs:
189189
if: ${{ matrix.os == 'windows-latest' }}
190190
run: cargo run --bin moon bundle --source-dir "$env:USERPROFILE\.moon\lib\core" --all
191191

192+
- name: moon update
193+
run: |
194+
cargo run --bin moon update
195+
192196
- name: Run tests
193197
run: cargo test
194198

@@ -299,6 +303,10 @@ jobs:
299303
if: ${{ matrix.os == 'windows-latest' }}
300304
run: cargo run --bin moon bundle --source-dir "$env:USERPROFILE\.moon\lib\core" --all
301305

306+
- name: moon update
307+
run: |
308+
cargo run --bin moon update
309+
302310
- name: Run tests
303311
run: cargo test
304312

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ petgraph = { version = "0.6.4", features = [
5252
serde = { version = "1.0.163", features = ["derive"] }
5353
serde_json = { version = "1.0.97", features = ["preserve_order"] }
5454
serde_json_lenient = { version = "0.2.1", features = ["preserve_order"] }
55+
serde_yaml = "0.9.33"
5556
sysinfo = "0.29.9"
5657
tokio = { version = "1.34.0", features = [
5758
"rt-multi-thread",

crates/moon/src/cli/check.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use moonbuild::watcher_is_running;
2424
use moonbuild::{entry, MOON_PID_NAME};
2525
use mooncake::pkg::sync::auto_sync;
2626
use moonutil::cli::UniversalFlags;
27-
use moonutil::common::WATCH_MODE_DIR;
2827
use moonutil::common::{lower_surface_targets, CheckOpt};
28+
use moonutil::common::{parse_front_matter_config, WATCH_MODE_DIR};
2929
use moonutil::common::{FileLock, TargetBackend};
3030
use moonutil::common::{MoonbuildOpt, PrePostBuild};
3131
use moonutil::common::{MooncOpt, OutputFormat, RunMode, DOT_MBT_DOT_MD};
@@ -160,16 +160,27 @@ fn run_check_internal(
160160
}
161161

162162
fn run_check_for_single_file(cli: &UniversalFlags, cmd: &CheckSubcommand) -> anyhow::Result<i32> {
163-
let target_backend = cmd
164-
.build_flags
165-
.target_backend
166-
.unwrap_or(TargetBackend::WasmGC);
167-
168163
let single_file_path = &dunce::canonicalize(cmd.single_file.as_ref().unwrap()).unwrap();
169164
let single_file_string = single_file_path.display().to_string();
170165
let source_dir = single_file_path.parent().unwrap().to_path_buf();
171166
let raw_target_dir = source_dir.join("target");
172167

168+
let mbt_md_header = parse_front_matter_config(single_file_path)?;
169+
let target_backend = if let Some(moonutil::common::MbtMdHeader {
170+
moonbit:
171+
moonutil::common::MbtMdSection {
172+
backend: Some(backend),
173+
..
174+
},
175+
}) = &mbt_md_header
176+
{
177+
TargetBackend::str_to_backend(backend)?
178+
} else {
179+
cmd.build_flags
180+
.target_backend
181+
.unwrap_or(TargetBackend::WasmGC)
182+
};
183+
173184
let release_flag = !cmd.build_flags.debug;
174185

175186
let target_dir = raw_target_dir
@@ -218,9 +229,9 @@ fn run_check_for_single_file(cli: &UniversalFlags, cmd: &CheckSubcommand) -> any
218229
enable_coverage: false,
219230
deny_warn: false,
220231
target_backend,
221-
warn_list: None,
222-
alert_list: None,
223-
enable_value_tracing: false,
232+
warn_list: cmd.build_flags.warn_list.clone(),
233+
alert_list: cmd.build_flags.alert_list.clone(),
234+
enable_value_tracing: cmd.build_flags.enable_value_tracing,
224235
},
225236
link_opt: moonutil::common::LinkCoreFlags {
226237
debug_flag: !release_flag,
@@ -236,9 +247,14 @@ fn run_check_for_single_file(cli: &UniversalFlags, cmd: &CheckSubcommand) -> any
236247
extra_build_opt: vec![],
237248
extra_link_opt: vec![],
238249
nostd: false,
239-
render: true,
250+
render: !cmd.build_flags.no_render,
240251
};
241-
let module = get_module_for_single_file_test(single_file_path, &moonc_opt, &moonbuild_opt)?;
252+
let module = get_module_for_single_file_test(
253+
single_file_path,
254+
&moonc_opt,
255+
&moonbuild_opt,
256+
mbt_md_header,
257+
)?;
242258

243259
if cli.dry_run {
244260
return dry_run::print_commands(&module, &moonc_opt, &moonbuild_opt);

crates/moon/src/cli/deps.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,7 @@ pub fn install_cli(cli: UniversalFlags, _cmd: InstallSubcommand) -> anyhow::Resu
3232
source_dir,
3333
target_dir,
3434
} = cli.source_tgt_dir.try_into_package_dirs()?;
35-
let registry_config = RegistryConfig::load();
36-
mooncake::pkg::install::install(
37-
&source_dir,
38-
&target_dir,
39-
&registry_config,
40-
cli.quiet,
41-
cli.verbose,
42-
)
35+
mooncake::pkg::install::install(&source_dir, &target_dir, cli.quiet, cli.verbose)
4336
}
4437

4538
pub fn remove_cli(cli: UniversalFlags, cmd: RemoveSubcommand) -> anyhow::Result<i32> {

crates/moon/src/cli/generate_test_driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ pub fn generate_test_driver(
232232
};
233233

234234
let module = if let Some(single_test_file) = cmd.single_test_file {
235-
get_module_for_single_file_test(&single_test_file, &moonc_opt, &moonbuild_opt)?
235+
get_module_for_single_file_test(&single_test_file, &moonc_opt, &moonbuild_opt, None)?
236236
} else {
237237
// Resolve dependencies, but don't download anything
238238
let (resolved_env, dir_sync_result) = auto_sync(

crates/moon/src/cli/pre_build.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ pub fn scan_with_x_build(
3737
) -> anyhow::Result<ModuleDB> {
3838
let mut module = moonutil::scan::scan(
3939
doc_mode,
40+
None,
4041
resolved_env,
4142
dir_sync_result,
4243
moonc_opt,
@@ -81,6 +82,7 @@ fn run_x_build(
8182
recreate_moon_db(&module.source_dir, &moonbuild_opt.target_dir)?;
8283
moonutil::scan::scan(
8384
false,
85+
None,
8486
resolved_env,
8587
dir_sync_result,
8688
moonc_opt,

crates/moon/src/cli/test.rs

Lines changed: 75 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,11 @@ use indexmap::IndexMap;
2222
use moonbuild::dry_run;
2323
use moonbuild::entry;
2424
use mooncake::pkg::sync::auto_sync;
25-
use moonutil::common::lower_surface_targets;
26-
use moonutil::common::FileLock;
27-
use moonutil::common::GeneratedTestDriver;
28-
use moonutil::common::MooncOpt;
29-
use moonutil::common::OutputFormat;
30-
use moonutil::common::RunMode;
31-
use moonutil::common::TargetBackend;
32-
use moonutil::common::{MoonbuildOpt, TestOpt};
25+
use mooncake::pkg::sync::auto_sync_for_single_mbt_md;
26+
use moonutil::common::{
27+
lower_surface_targets, parse_front_matter_config, FileLock, GeneratedTestDriver, MbtMdHeader,
28+
MoonbuildOpt, MooncOpt, OutputFormat, RunMode, TargetBackend, TestOpt, MOONBITLANG_CORE,
29+
};
3330
use moonutil::common::{BLACKBOX_TEST_DRIVER, DOT_MBT_DOT_MD, SINGLE_FILE_TEST_PACKAGE};
3431
use moonutil::cond_expr::CompileCondition;
3532
use moonutil::dirs::mk_arch_mode_dir;
@@ -180,16 +177,27 @@ fn run_test_internal(
180177
}
181178

182179
fn run_test_in_single_file(cli: &UniversalFlags, cmd: &TestSubcommand) -> anyhow::Result<i32> {
183-
let target_backend = cmd
184-
.build_flags
185-
.target_backend
186-
.unwrap_or(TargetBackend::WasmGC);
187-
188180
let single_file_path = &dunce::canonicalize(cmd.single_file.as_ref().unwrap()).unwrap();
189181
let single_file_string = single_file_path.display().to_string();
190182
let source_dir = single_file_path.parent().unwrap().to_path_buf();
191183
let raw_target_dir = source_dir.join("target");
192184

185+
let mbt_md_header = parse_front_matter_config(single_file_path)?;
186+
let target_backend = if let Some(moonutil::common::MbtMdHeader {
187+
moonbit:
188+
moonutil::common::MbtMdSection {
189+
backend: Some(backend),
190+
..
191+
},
192+
}) = &mbt_md_header
193+
{
194+
TargetBackend::str_to_backend(backend)?
195+
} else {
196+
cmd.build_flags
197+
.target_backend
198+
.unwrap_or(TargetBackend::WasmGC)
199+
};
200+
193201
let debug_flag = !cmd.build_flags.release;
194202

195203
let target_dir = raw_target_dir
@@ -237,13 +245,13 @@ fn run_test_in_single_file(cli: &UniversalFlags, cmd: &TestSubcommand) -> anyhow
237245
build_opt: moonutil::common::BuildPackageFlags {
238246
debug_flag,
239247
strip_flag: false,
240-
source_map: false,
248+
source_map: debug_flag,
241249
enable_coverage: false,
242250
deny_warn: false,
243251
target_backend,
244-
warn_list: None,
245-
alert_list: None,
246-
enable_value_tracing: false,
252+
warn_list: cmd.build_flags.warn_list.clone(),
253+
alert_list: cmd.build_flags.alert_list.clone(),
254+
enable_value_tracing: cmd.build_flags.enable_value_tracing,
247255
},
248256
link_opt: moonutil::common::LinkCoreFlags {
249257
debug_flag,
@@ -259,9 +267,14 @@ fn run_test_in_single_file(cli: &UniversalFlags, cmd: &TestSubcommand) -> anyhow
259267
extra_build_opt: vec![],
260268
extra_link_opt: vec![],
261269
nostd: false,
262-
render: true,
270+
render: !cmd.build_flags.no_render,
263271
};
264-
let module = get_module_for_single_file_test(single_file_path, &moonc_opt, &moonbuild_opt)?;
272+
let module = get_module_for_single_file_test(
273+
single_file_path,
274+
&moonc_opt,
275+
&moonbuild_opt,
276+
mbt_md_header,
277+
)?;
265278

266279
if cli.dry_run {
267280
return dry_run::print_commands(&module, &moonc_opt, &moonbuild_opt);
@@ -281,6 +294,7 @@ pub fn get_module_for_single_file_test(
281294
single_file_path: &Path,
282295
moonc_opt: &MooncOpt,
283296
moonbuild_opt: &MoonbuildOpt,
297+
front_matter_config: Option<MbtMdHeader>,
284298
) -> anyhow::Result<ModuleDB> {
285299
let gen_single_file_test_pkg = |moonc_opt: &MooncOpt, single_file_path: &Path| -> Package {
286300
let path_comp = PathComponent {
@@ -335,8 +349,8 @@ pub fn get_module_for_single_file_test(
335349
.join(pkg_rel_name)
336350
.join(format!("{}.core", pkg_rel_name)),
337351
link: None,
338-
warn_list: None,
339-
alert_list: None,
352+
warn_list: moonc_opt.build_opt.warn_list.clone(),
353+
alert_list: moonc_opt.build_opt.alert_list.clone(),
340354
targets: None,
341355
pre_build: None,
342356
patch_file: None,
@@ -357,25 +371,51 @@ pub fn get_module_for_single_file_test(
357371
link_search_paths: vec![],
358372
}
359373
};
374+
375+
let (resolved_env, dir_sync_result, moon_mod) =
376+
auto_sync_for_single_mbt_md(moonc_opt, moonbuild_opt, front_matter_config)?;
377+
378+
let mut module = moonutil::scan::scan(
379+
false,
380+
Some(moon_mod),
381+
&resolved_env,
382+
&dir_sync_result,
383+
moonc_opt,
384+
moonbuild_opt,
385+
)?;
386+
360387
let mut package = gen_single_file_test_pkg(moonc_opt, single_file_path);
361388
if !package.mbt_md_files.is_empty() {
362389
let pj_path = moonutil::doc_test::gen_md_test_patch(&package, moonc_opt)?;
363390
package.doc_test_patch_file = pj_path;
364391
}
392+
let imports = module
393+
.get_all_packages()
394+
.iter()
395+
.map(|(_, pkg)| moonutil::path::ImportComponent {
396+
path: moonutil::path::ImportPath {
397+
module_name: pkg.root.to_string(),
398+
rel_path: pkg.rel.clone(),
399+
is_3rd: true,
400+
},
401+
alias: None,
402+
sub_package: pkg.is_sub_package,
403+
})
404+
// we put "moonbitlang/core/abort" in ModuleDB.packages in scan step, it's logical, so we need to filter it out
405+
.filter(|import| import.path.module_name != MOONBITLANG_CORE)
406+
.collect::<Vec<_>>();
407+
package.imports = imports;
408+
409+
let packages = module.get_all_packages_mut();
410+
packages.insert(package.full_name(), package.clone());
411+
365412
let mut graph = petgraph::graph::DiGraph::new();
366-
graph.add_node(package.full_name());
367-
368-
Ok(ModuleDB::new(
369-
moonbuild_opt.source_dir.clone(),
370-
"moon/test".to_string(),
371-
indexmap::IndexMap::from([(package.full_name(), package)]),
372-
vec![0],
373-
vec![],
374-
graph,
375-
moonc_opt.link_opt.target_backend.to_string(),
376-
"debug".to_string(),
377-
None,
378-
))
413+
for (_, pkg) in packages.iter() {
414+
graph.add_node(pkg.full_name());
415+
}
416+
module.graph = graph;
417+
418+
Ok(module)
379419
}
380420

381421
pub(crate) struct TestLikeSubcommand<'a> {
@@ -537,6 +577,7 @@ pub(crate) fn run_test_or_bench_internal(
537577

538578
let mut module = moonutil::scan::scan(
539579
false,
580+
None,
540581
&resolved_env,
541582
&dir_sync_result,
542583
&moonc_opt,

0 commit comments

Comments
 (0)