From dfb3c5e2e7fa68da4ccfe3051ecec2bfcb842d0d Mon Sep 17 00:00:00 2001 From: YsielX Date: Tue, 31 Mar 2026 15:12:51 +0800 Subject: [PATCH] auto deploy denpendency --- Cargo.lock | 270 ++++++++++++++++++++++++++++----- crates/movy-sui/src/compile.rs | 169 +++++++++++++++++++-- crates/movy/src/sui/env.rs | 43 +++++- 3 files changed, 431 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f98bbf5..2caa4cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,7 +56,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -1490,6 +1490,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + [[package]] name = "chrono" version = "0.4.42" @@ -1760,7 +1771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -1896,6 +1907,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -2043,7 +2063,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", @@ -3447,11 +3467,25 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "ghash" version = "0.5.1" @@ -3970,6 +4004,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -4475,7 +4515,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -4552,6 +4592,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libafl" version = "0.15.4" @@ -6646,16 +6692,18 @@ dependencies = [ [[package]] name = "object_store" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2858065e55c148d294a9f3aae3b0fa9458edadb41a108397094566f4e3c0dfb" +checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" dependencies = [ "async-trait", "base64 0.22.1", "bytes", "chrono", "form_urlencoded", - "futures", + "futures-channel", + "futures-core", + "futures-util", "http", "http-body-util", "httparse", @@ -6665,8 +6713,8 @@ dependencies = [ "md-5", "parking_lot 0.12.5", "percent-encoding", - "quick-xml 0.38.4", - "rand 0.9.2", + "quick-xml 0.39.2", + "rand 0.10.0", "reqwest", "ring", "rustls-pki-types", @@ -7264,7 +7312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] @@ -7355,15 +7403,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" [[package]] name = "predicates-tree" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" dependencies = [ "predicates-core", "termtree", @@ -7673,9 +7721,9 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.13.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ "bitflags 2.10.0", "memchr", @@ -7723,9 +7771,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.4" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", "serde", @@ -7803,6 +7851,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.6.2" @@ -7860,6 +7914,17 @@ dependencies = [ "serde", ] +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -7918,6 +7983,12 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "rand_hc" version = "0.2.0" @@ -8969,7 +9040,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -8981,7 +9052,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.9.0", "opaque-debug", ] @@ -8993,7 +9064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -9574,7 +9645,7 @@ dependencies = [ "move-vm-config", "mysten-common", "nonzero_ext", - "object_store 0.13.1", + "object_store 0.13.2", "once_cell", "prometheus", "rand 0.8.5", @@ -10947,9 +11018,9 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6d8958ed3be404120ca43ffa0fb1e1fc7be214e96c8d33bd43a131b6eebc9e" +checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" dependencies = [ "prettyplease", "proc-macro2", @@ -10959,9 +11030,9 @@ dependencies = [ [[package]] name = "tonic-health" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a82868bf299e0a1d2e8dce0dc33a46c02d6f045b2c1f1d6cc8dc3d0bf1812ef" +checksum = "f4ff0636fef47afb3ec02818f5bceb4377b8abb9d6a386aeade18bd6212f8eb7" dependencies = [ "prost", "tokio", @@ -10983,9 +11054,9 @@ dependencies = [ [[package]] name = "tonic-prost-build" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65873ace111e90344b8973e94a1fc817c924473affff24629281f90daed1cd2e" +checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" dependencies = [ "prettyplease", "proc-macro2", @@ -10999,9 +11070,9 @@ dependencies = [ [[package]] name = "tonic-reflection" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e5f75c058c397bf4ecada0fe0a2299c49c252fcf484f4a2f47279b6fa7026b" +checksum = "aaf0685a51e6d02b502ba0764002e766b7f3042aed13d9234925b6ffbfa3fca7" dependencies = [ "prost", "prost-types", @@ -11013,9 +11084,9 @@ dependencies = [ [[package]] name = "tonic-web" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d56db85992f978d0c35a091674c03d42c48e029357833d311e95c6f7ec8f5a" +checksum = "29453d84de05f4f1b573db22e6f9f6c95c189a6089a440c9a098aa9dea009299" dependencies = [ "base64 0.22.1", "bytes", @@ -11576,7 +11647,16 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] @@ -11643,6 +11723,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.12.1", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -11656,6 +11758,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.12.1", + "semver 1.0.27", +] + [[package]] name = "web-sys" version = "0.3.82" @@ -12143,6 +12257,94 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.12.1", + "prettyplease", + "syn 2.0.111", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.111", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.10.0", + "indexmap 2.12.1", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.12.1", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.2" diff --git a/crates/movy-sui/src/compile.rs b/crates/movy-sui/src/compile.rs index 117a4a8..c3cbf52 100644 --- a/crates/movy-sui/src/compile.rs +++ b/crates/movy-sui/src/compile.rs @@ -1,10 +1,16 @@ -use std::{collections::BTreeSet, fmt::Display, io::Write, path::Path}; +use std::{ + collections::BTreeSet, + fmt::Display, + io::Write, + path::{Path, PathBuf}, +}; use color_eyre::eyre::eyre; use itertools::Itertools; use move_binary_format::CompiledModule; use move_compiler::{compiled_unit::NamedCompiledModule, editions::Flavor}; use move_core_types::account_address::AccountAddress; +use move_package_alt::RootPackage; use movy_types::{ abi::{MOVY_INIT, MOVY_ORACLE, MovePackageAbi}, error::MovyError, @@ -12,13 +18,11 @@ use movy_types::{ }; use serde::{Deserialize, Serialize}; use sui_move_build::{BuildConfig, CompiledPackage}; -use sui_types::base_types::ObjectID; +use sui_package_alt::SuiFlavor; +use sui_types::{base_types::ObjectID, is_system_package}; use tracing::{debug, trace}; -pub fn build_package_resolved( - folder: &Path, - test_mode: bool, -) -> Result { +fn sui_build_config(test_mode: bool) -> BuildConfig { let mut cfg = move_package_alt_compilation::build_config::BuildConfig::default(); cfg.default_flavor = Some(Flavor::Sui); cfg.test_mode = test_mode; @@ -28,17 +32,63 @@ pub fn build_package_resolved( // We overrite this and request the behavior of the old version cfg.set_unpublished_deps_to_zero = true; - let cfg = BuildConfig { + BuildConfig { config: cfg, run_bytecode_verifier: false, print_diags_to_stderr: false, environment: sui_package_alt::mainnet_environment(), - }; + } +} + +fn load_root_package(folder: &Path, test_mode: bool) -> Result, MovyError> { + let cfg = sui_build_config(test_mode); + cfg.config + .package_loader(folder, &cfg.environment) + .load_sync() + .map_err(|e| eyre!(e).into()) +} + +pub fn build_package_resolved( + folder: &Path, + test_mode: bool, +) -> Result { + let cfg = sui_build_config(test_mode); trace!("Build config is {:?}", &cfg.config); // cfg.compile_package(path, writer) // reference Ok(cfg.build(folder)?) } +pub fn resolve_local_dependency_paths( + folders: &[PathBuf], + test_mode: bool, +) -> Result, MovyError> { + let mut ordered = Vec::new(); + let mut seen = BTreeSet::new(); + + for folder in folders { + let root_package = load_root_package(folder, test_mode)?; + let mut packages = root_package.sorted_packages(); + packages.reverse(); + + for package in packages { + if package + .published() + .map(|addresses| is_system_package(ObjectID::from_address(addresses.original_id.0))) + .unwrap_or(false) + { + continue; + } + + let path = std::fs::canonicalize(package.path().path())?; + if seen.insert(path.clone()) { + ordered.push(path); + } + } + } + + Ok(ordered) +} + pub fn mock_module_address(address: ObjectID, module: &mut CompiledModule) { let sh = module.self_handle().clone(); let address_idx = sh.address; @@ -507,7 +557,11 @@ impl SuiCompiledPackage { #[cfg(test)] mod test { - use std::path::PathBuf; + use std::{ + fs, + path::{Path, PathBuf}, + time::{SystemTime, UNIX_EPOCH}, + }; use crate::compile::SuiCompiledPackage; @@ -540,4 +594,101 @@ public fun new(ctx: &mut TxContext, t2: &Test, t: &Test< ) .unwrap(); } + + fn unique_temp_dir() -> PathBuf { + let nonce = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos(); + std::env::temp_dir().join(format!( + "movy-sui-compile-tests-{}-{}", + std::process::id(), + nonce + )) + } + + fn write_move_package(path: &Path, name: &str, dependencies: &[(&str, &str)]) { + fs::create_dir_all(path.join("sources")).unwrap(); + + let mut manifest = format!( + r#"[package] +name = "{name}" +edition = "2024" + +[addresses] +{name} = "0x0" +"# + ); + + for (dep_name, local) in dependencies { + manifest.push_str(&format!( + "\n[dependencies.{dep_name}]\nlocal = \"{local}\"\n" + )); + } + + fs::write(path.join("Move.toml"), manifest).unwrap(); + fs::write( + path.join("sources").join(format!("{name}.move")), + format!("module {name}::{name};"), + ) + .unwrap(); + } + + #[test] + fn resolves_local_dependency_paths_in_dependency_first_order() { + let root = unique_temp_dir(); + let dep_a = root.join("dep_a"); + let dep_b = root.join("dep_b"); + let target = root.join("target"); + + write_move_package(&dep_a, "dep_a", &[]); + write_move_package(&dep_b, "dep_b", &[("dep_a", "../dep_a")]); + write_move_package( + &target, + "target", + &[("dep_b", "../dep_b"), ("dep_a", "../dep_a")], + ); + + let resolved = + crate::compile::resolve_local_dependency_paths(std::slice::from_ref(&target), true) + .unwrap(); + + assert_eq!( + resolved, + vec![ + fs::canonicalize(dep_a).unwrap(), + fs::canonicalize(dep_b).unwrap(), + fs::canonicalize(target).unwrap(), + ] + ); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn deduplicates_shared_local_dependency_paths_across_roots() { + let root = unique_temp_dir(); + let shared = root.join("shared"); + let left = root.join("left"); + let right = root.join("right"); + + write_move_package(&shared, "shared", &[]); + write_move_package(&left, "left", &[("shared", "../shared")]); + write_move_package(&right, "right", &[("shared", "../shared")]); + + let resolved = + crate::compile::resolve_local_dependency_paths(&[left.clone(), right.clone()], true) + .unwrap(); + + assert_eq!( + resolved, + vec![ + fs::canonicalize(shared).unwrap(), + fs::canonicalize(left).unwrap(), + fs::canonicalize(right).unwrap(), + ] + ); + + fs::remove_dir_all(root).unwrap(); + } } diff --git a/crates/movy/src/sui/env.rs b/crates/movy/src/sui/env.rs index 9b46b6f..8edf4f6 100644 --- a/crates/movy/src/sui/env.rs +++ b/crates/movy/src/sui/env.rs @@ -1,4 +1,8 @@ -use std::{collections::BTreeMap, fmt::Display, path::PathBuf}; +use std::{ + collections::{BTreeMap, BTreeSet}, + fmt::Display, + path::PathBuf, +}; use clap::Args; use color_eyre::eyre::eyre; @@ -9,7 +13,7 @@ use movy_replay::{ env::SuiTestingEnv, }; use movy_sui::{ - compile::SuiCompiledPackage, + compile::{SuiCompiledPackage, resolve_local_dependency_paths}, database::{cache::ObjectSuiStoreCommit, graphql::GraphQlDatabase}, }; use movy_types::{ @@ -74,8 +78,10 @@ impl SuiTargetArgs { pub fn local_abis(&self, test_mode: bool) -> Result, MovyError> { let mut out = vec![]; - for local in self.locals.iter().flatten() { - let package = SuiCompiledPackage::build_all_unpublished_from_folder(local, test_mode)?; + let resolved_locals = + resolve_local_dependency_paths(self.locals.as_deref().unwrap_or_default(), test_mode)?; + for local in resolved_locals { + let package = SuiCompiledPackage::build_all_unpublished_from_folder(&local, test_mode)?; out.push(package.abi()?); } Ok(out) @@ -103,6 +109,14 @@ impl SuiTargetArgs { { let mut target_packages = Vec::new(); let mut local_name_map = BTreeMap::new(); + let explicit_locals = self + .locals + .iter() + .flatten() + .map(std::fs::canonicalize) + .collect::, _>>()?; + let resolved_locals = + resolve_local_dependency_paths(self.locals.as_deref().unwrap_or_default(), true)?; for onchain in self.onchains.iter().flatten() { env.fetch_package_at_address(*onchain, rpc).await?; @@ -118,12 +132,23 @@ impl SuiTargetArgs { tracing::info!("Loading inner types..."); env.load_inner_types().await?; + if !resolved_locals.is_empty() { + tracing::info!( + "Resolved local deployment order: {}", + resolved_locals + .iter() + .map(|path| path.display().to_string()) + .join(" -> ") + ); + } + let mut local_abis = vec![]; - for local in self.locals.iter().flatten() { + for local in resolved_locals.iter() { + let is_explicit_target = explicit_locals.contains(local); tracing::info!("Deploying the local package at {}", local.display()); let (target_package, testing_abi, abi, package_names) = env .load_local( - local, + local.as_path(), deployer, attacker, epoch, @@ -139,8 +164,10 @@ impl SuiTargetArgs { for name in package_names.iter() { local_name_map.insert(name.clone(), target_package); } - local_abis.push((testing_abi, abi, package_names)); - target_packages.push(target_package); + if is_explicit_target { + local_abis.push((testing_abi, abi, package_names)); + target_packages.push(target_package); + } } tracing::info!("Reload inner types...");