From 0eeded66c4c642d78d54d07976ab84328d08d586 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Tue, 28 Mar 2023 13:56:19 -0700 Subject: [PATCH 01/10] Added dep override parsing and local path normalization --- .../src/resolution/dependency_graph.rs | 8 ++++++++ .../src/source_package/manifest_parser.rs | 18 +++++++++++++++++- .../src/source_package/parsed_manifest.rs | 4 +++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index f59088add6..16e32f98f8 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -74,6 +74,7 @@ pub struct Dependency { pub mode: DependencyMode, pub subst: Option, pub digest: Option, + pub dep_override: PM::DepOverride, } /// Indicates whether one package always depends on another, or only in dev-mode. @@ -202,6 +203,7 @@ impl DependencyGraph { mode: DependencyMode::Always, subst: subst.map(parse_substitution).transpose()?, digest: digest.map(Symbol::from), + dep_override: false, }, ); } @@ -219,6 +221,7 @@ impl DependencyGraph { mode: DependencyMode::DevOnly, subst: subst.map(parse_substitution).transpose()?, digest: digest.map(Symbol::from), + dep_override: false, }, ); } @@ -287,6 +290,7 @@ impl DependencyGraph { mode: DependencyMode::Always, subst: subst.map(parse_substitution).transpose()?, digest: digest.map(Symbol::from), + dep_override: false, }, ); } @@ -304,6 +308,7 @@ impl DependencyGraph { mode: DependencyMode::DevOnly, subst: subst.map(parse_substitution).transpose()?, digest: digest.map(Symbol::from), + dep_override: false, }, ); } @@ -643,6 +648,7 @@ impl DependencyGraph { version, subst, digest, + dep_override, } = dep; let mut pkg = Package { @@ -666,6 +672,7 @@ impl DependencyGraph { mode, subst, digest, + dep_override, }, ); @@ -871,6 +878,7 @@ impl<'a> fmt::Display for DependencyTOML<'a> { mode: _, subst, digest, + dep_override: _, }, ) = self; diff --git a/language/tools/move-package/src/source_package/manifest_parser.rs b/language/tools/move-package/src/source_package/manifest_parser.rs index 25971a4922..da082852a2 100644 --- a/language/tools/move-package/src/source_package/manifest_parser.rs +++ b/language/tools/move-package/src/source_package/manifest_parser.rs @@ -334,6 +334,11 @@ pub fn parse_dependency(dep_name: &str, mut tval: TV) -> Result .transpose()?; let version = table.remove("version").map(parse_version).transpose()?; let digest = table.remove("digest").map(parse_digest).transpose()?; + let dep_override = table + .remove("override") + .map(parse_dep_override) + .transpose()? + .map_or(false, |o| o); let kind = match ( table.remove("local"), @@ -350,7 +355,10 @@ pub fn parse_dependency(dep_name: &str, mut tval: TV) -> Result bail!("Local source path not a string") }; - PM::DependencyKind::Local(local) + PM::DependencyKind::Local( + // with allow_cwd_parent set to true, it never fails + PM::normalize_path(local, true /* allow_cwd_parent */).unwrap(), + ) } (None, subdir, Some(git_url), None) => { @@ -433,6 +441,7 @@ pub fn parse_dependency(dep_name: &str, mut tval: TV) -> Result subst, version, digest, + dep_override, })) } @@ -502,6 +511,13 @@ fn parse_digest(tval: TV) -> Result { Ok(PM::PackageDigest::from(digest_str)) } +fn parse_dep_override(tval: TV) -> Result { + if !tval.is_bool() { + bail!("Invalid dependency override value"); + } + Ok(tval.as_bool().unwrap()) +} + // check that only recognized names are provided at the top-level fn warn_if_unknown_field_names(table: &toml::map::Map, known_names: &[&str]) { let mut unknown_names = BTreeSet::new(); diff --git a/language/tools/move-package/src/source_package/parsed_manifest.rs b/language/tools/move-package/src/source_package/parsed_manifest.rs index 1337d9113b..7ac1f38792 100644 --- a/language/tools/move-package/src/source_package/parsed_manifest.rs +++ b/language/tools/move-package/src/source_package/parsed_manifest.rs @@ -16,6 +16,7 @@ pub type NamedAddress = Symbol; pub type PackageName = Symbol; pub type FileName = Symbol; pub type PackageDigest = Symbol; +pub type DepOverride = bool; pub type AddressDeclarations = BTreeMap>; pub type DevAddressDeclarations = BTreeMap; @@ -55,6 +56,7 @@ pub struct InternalDependency { pub subst: Option, pub version: Option, pub digest: Option, + pub dep_override: DepOverride, } #[derive(Debug, Clone, Eq, PartialEq)] @@ -154,7 +156,7 @@ impl Default for DependencyKind { /// or is prefixed by accesses to parent directories when `allow_cwd_parent` is false. /// /// Returns the normalized path on success. -fn normalize_path(path: impl AsRef, allow_cwd_parent: bool) -> Result { +pub fn normalize_path(path: impl AsRef, allow_cwd_parent: bool) -> Result { use Component::*; let mut stack = Vec::new(); From 631277291a1d7abe61bfa01e82f99897110d6dfd Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Thu, 30 Mar 2023 11:36:17 -0700 Subject: [PATCH 02/10] [move-package] Support dependency overrides --- .../src/resolution/dependency_graph.rs | 489 ++++++++++++++---- .../tests/test_dependency_graph.rs | 40 +- .../dep_dev_dep_diamond/Move.resolved | 16 +- .../dep_good_digest/Move.resolved | 4 +- .../Move.resolved | 11 +- .../Move.resolved | 3 + .../diamond_problem_dep_conflict/Move.toml | 7 + .../deps_only/A/Move.toml | 6 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 3 + .../Move.resolved | 3 + .../Move.toml | 13 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 6 + .../Move.resolved | 1 + .../Move.toml | 22 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 7 + .../deps_only/C/Move.toml | 10 + .../Move.resolved | 3 + .../Move.toml | 28 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 7 + .../deps_only/C/Move.toml | 6 + .../Move.locked | 29 ++ .../Move.resolved | 236 +++++++++ .../Move.toml | 13 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 6 + .../Move.locked | 30 ++ .../Move.resolved | 273 ++++++++++ .../Move.toml | 14 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 6 + .../Move.locked | 38 ++ .../Move.resolved | 320 ++++++++++++ .../Move.toml | 23 + .../deps_only/A/Move.toml | 6 + .../deps_only/ADep/Move.toml | 3 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 10 + .../Move.resolved | 3 + .../Move.toml | 20 + .../deps_only/A/Move.toml | 7 + .../deps_only/B/Move.toml | 7 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 3 + .../Move.resolved | 1 + .../Move.toml | 20 + .../deps_only/A/Move.toml | 7 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 3 + .../Move.resolved | 3 + .../Move.toml | 20 + .../deps_only/A/Move.toml | 6 + .../deps_only/B/Move.toml | 7 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 3 + .../Move.resolved | 3 + .../Move.toml | 24 + .../deps_only/A/Move.toml | 7 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 7 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 6 + .../deps_only/F/Move.toml | 6 + .../deps_only/G/Move.toml | 3 + .../Move.locked | 47 ++ .../Move.resolved | 420 +++++++++++++++ .../Move.toml | 24 + .../deps_only/A/Move.toml | 7 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 3 + .../Move.resolved | 3 + .../Move.toml | 23 + .../deps_only/A/Move.toml | 8 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 3 + .../diamond_problem_dep_override/Move.locked | 30 ++ .../Move.resolved | 285 ++++++++++ .../diamond_problem_dep_override/Move.toml | 8 + .../deps_only/A/Move.toml | 6 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 3 + .../Move.locked | 43 ++ .../Move.resolved | 406 +++++++++++++++ .../Move.toml | 27 + .../deps_only/A/Move.toml | 6 + .../deps_only/B1/Move.toml | 3 + .../deps_only/B2/Move.toml | 6 + .../deps_only/C/Move.toml | 7 + .../deps_only/D/Move.toml | 3 + .../deps_only/E/Move.toml | 6 + .../Move.locked | 48 ++ .../Move.resolved | 445 ++++++++++++++++ .../Move.toml | 25 + .../deps_only/A/Move.toml | 8 + .../deps_only/B/Move.toml | 6 + .../deps_only/C/Move.toml | 6 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 3 + .../diamond_problem_no_conflict/Move.resolved | 11 +- .../tests/test_sources/external/Move.locked | 4 +- .../tests/test_sources/external/Move.resolved | 7 +- .../test_sources/external_bad_dep/Move.locked | 4 +- .../external_bad_dep/Move.resolved | 2 +- .../test_sources/external_dev_dep/Move.locked | 8 +- .../external_dev_dep/Move.resolved | 14 +- .../test_sources/external_overlap/Move.locked | 2 +- .../external_overlap/Move.resolved | 8 +- .../test_sources/external_silent/Move.locked | 4 +- .../multiple_deps_rename/Move.resolved | 8 +- .../nested_deps_git_local/Move.resolved | 4 + .../nested_deps_override/Move.locked | 20 + .../nested_deps_override/Move.toml | 6 + .../deps_only/nested/Move.toml | 6 + .../deps_only/nested/more/Move.toml | 3 + .../tests/test_sources/one_dep/Move.resolved | 4 +- .../one_dep_assigned_address/Move.resolved | 4 +- .../Move.resolved | 4 +- .../one_dep_override/Move.compiled | 26 + .../test_sources/one_dep_override/Move.locked | 12 + .../one_dep_override/Move.resolved | 138 +++++ .../test_sources/one_dep_override/Move.toml | 9 + .../deps_only/other_dep/Move.toml | 6 + .../deps_only/other_dep/sources/B.move | 3 + .../one_dep_override/sources/OneDep.move | 6 + .../one_dep_reassigned_address/Move.resolved | 4 +- .../Move.resolved | 4 +- 139 files changed, 4114 insertions(+), 134 deletions(-) create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/ADep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/F/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/G/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B1/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B2/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/nested_deps_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/nested_deps_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/more/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/Move.compiled create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/Move.locked create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/sources/B.move create mode 100644 language/tools/move-package/tests/test_sources/one_dep_override/sources/OneDep.move diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index 16e32f98f8..8ed10f1d81 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -42,6 +42,44 @@ use super::{ /// /// In order to be `BuildConfig` agnostic, it contains `dev-dependencies` as well as `dependencies` /// and labels edges in the graph accordingly, as `DevOnly`, or `Always` dependencies. +/// +/// +/// +/// When building a dependency graph, different versions of the same (transitively) dependent +/// package can be encountered. If this is indeed the case, a single version must be chosen by the +/// developer to be the override, and this override must be specified in a manifest file whose +/// package dominates all the conflicting "uses" of the dependent package. These overrides are taken +/// into consideration during the dependency graph construction. +/// +/// When constructing the graph (top to bottom) for internal dependencies (external dependencies are +/// batch-processed at the end of the graph construction), we maintain a set of the current +/// overrides collected when processing dependencies (starting with an empty set), and do the +/// following when processing a package (starting at root): +/// +/// - process overrides first to collect a list of overrides to be added to the set (if they are not +/// yet in the set - outer overrides "win") and then process non-overridden dependencies using a +/// freshly updated overrides set +/// - when trying to insert a package into the graph, mark it as being on the "override path" if the +/// set of overrides is non-empty: +/// - if no package exists in the graph, insert it +/// - if a conflicting package already exists in the graph, override it if an override can be +/// found in the set (if it does not, report an error) +/// - if the same package already exists in the graph, and this package is on the "override path" +/// keep checking its dependencies to make sure that previously used overrides are correct +/// (dominate all uses of the package) +/// - after a package is fully processed, remove its own overrides from the set. +/// +/// External dependencies are provided by external resolvers as fully formed dependency sub-graphs +/// that need to be inserted into the "main" dependency graph being constructed. Whenever an +/// external dependency is encountered, it's "recorded" for future batch-processing along with the +/// set of overrides available at the point of sub-graph insertion. When processing an individual +/// sub-graph insertion, we do a depth first search of the subgraph in order to: +/// +/// - detect which of the sub-graph's packages need to be overridden (in which case their +/// dependencies in the sub-graph no longer should be inserted into the main graph) +///- avoid inserting sub-graph edges into the main dependency graph if they belong to overridden +/// packages +/// #[derive(Debug, Clone)] pub struct DependencyGraph { /// Path to the root package and its name (according to its manifest) @@ -61,12 +99,25 @@ pub struct DependencyGraph { pub always_deps: BTreeSet, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, Eq)] pub struct Package { pub kind: PM::DependencyKind, pub version: Option, /// Optional field set if the package was externally resolved. resolver: Option, + /// Set if the package was inserted while some overrides were active. + overridden_path: bool, +} + +impl PartialEq for Package { + fn eq(&self, other: &Self) -> bool { + // comparison should neither contain overridden_path (as it's only used to determine if + // package should be re-inspected) nor the type of resolver (as it would actually lead to + // incorrect result when comparing packages during insertion of externally resolved ones - + // an internally resolved existing package in the graph would not be recognized as a + // potential different version of the externally resolved one) + self.kind == other.kind && self.version == other.version + } } #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] @@ -92,6 +143,8 @@ pub struct ExternalRequest { to: Symbol, resolver: Symbol, pkg_path: PathBuf, + // overrides at the point of external graph insertion + overrides: BTreeMap, } /// Wrapper struct to display a package as an inline table in the lock file (matching the @@ -136,6 +189,7 @@ impl DependencyGraph { &root_path, dependency_cache, &mut external_requests, + &mut BTreeMap::new(), progress_output, ) .with_context(|| { @@ -151,10 +205,19 @@ impl DependencyGraph { to, resolver, pkg_path, + overrides, } in external_requests { graph - .resolve_externally(mode, from, to, resolver, &pkg_path, progress_output) + .resolve_externally( + mode, + from, + to, + resolver, + &pkg_path, + &overrides, + progress_output, + ) .with_context(|| { format!( "Failed to resolve dependencies for package '{}'", @@ -258,6 +321,7 @@ impl DependencyGraph { kind: source.kind, version: source.version, resolver: None, + overridden_path: false, }; match package_table.entry(pkg_name) { @@ -390,15 +454,22 @@ impl DependencyGraph { Ok(()) } - /// Add the graph in `extension` to `self` consuming it in the process. Assumes the root of - /// `extension` is the only shared node between the two, and fails if this is not the case. - /// Labels packages coming from `extension` as being resolved by `resolver`. + /// Add the graph in `extension` to `self. Assumes the root of `extension` is the only shared + /// node between the two, and fails if this is not the case. Labels packages coming from + /// `extension` as being resolved by `resolver`. /// /// It is an error to attempt to merge into `self` after its `always_deps` (the set of packages /// that are always transitive dependencies of its root, regardless of mode) has been /// calculated. This usually happens when the graph is created, so this function is intended /// primarily for internal use, but is exposed for testing. - pub fn merge(&mut self, extension: DependencyGraph, resolver: Symbol) -> Result<()> { + pub fn merge( + &mut self, + from: PM::PackageName, + merged_pkg_name: PM::PackageName, + extension: DependencyGraph, + resolver: Symbol, + overrides: &BTreeMap, + ) -> Result<()> { let DependencyGraph { root_package: ext_root, package_graph: ext_graph, @@ -420,45 +491,106 @@ impl DependencyGraph { bail!("Merging dependencies into a graph after calculating its 'always' dependencies"); } - for (ext_name, mut ext_pkg) in ext_table { - ext_pkg.resolver = Some(resolver); + if ext_table.is_empty() { + // the external graph is effectively empty - nothing to merge + return Ok(()); + } - // The root package is not present in the package table (because it doesn't have a - // source). If it appears in the other table, it indicates a cycle. - if ext_name == self.root_package { - bail!( - "Conflicting dependencies found:\n{0} = 'root'\n{0} = {1}", - ext_name, - PackageWithResolverTOML(&ext_pkg), - ); - } + // unwrap safe as the table must have the package if the graph has it + let merged_pkg = ext_table.get(&merged_pkg_name).unwrap(); + // unwrap is safe as all edges have a Dependency weight + let merged_dep = ext_graph.edge_weight(from, merged_pkg_name).unwrap(); + self.package_graph + .add_edge(from, merged_pkg_name, merged_dep.clone()); + self.merge_pgk( + merged_pkg.clone(), + merged_pkg_name, + &ext_graph, + &ext_table, + resolver, + overrides, + )?; - match self.package_table.entry(ext_name) { - Entry::Vacant(entry) => { - entry.insert(ext_pkg); - } + Ok(()) + } + + fn merge_pgk( + &mut self, + mut ext_pkg: Package, + ext_name: PM::PackageName, + ext_graph: &DiGraphMap, + ext_table: &BTreeMap, + resolver: Symbol, + overrides: &BTreeMap, + ) -> Result<()> { + ext_pkg.resolver = Some(resolver); + + // The root package is not present in the package table (because it doesn't have a + // source). If it appears in the other table, it indicates a cycle. + if ext_name == self.root_package { + bail!( + "Conflicting dependencies found:\n{0} = 'root'\n{0} = {1}", + ext_name, + PackageWithResolverTOML(&ext_pkg), + ); + } - // Seeing the same package in `extension` is OK only if it has the same set of - // dependencies as the existing one.i - Entry::Occupied(_) => { - let (self_deps, ext_deps) = - pkg_deps_equal(ext_name, &self.package_graph, &ext_graph); - if self_deps != ext_deps { - bail!( + match self.package_table.entry(ext_name) { + Entry::Vacant(entry) => { + entry.insert(ext_pkg); + } + + // Seeing the same package in `extension` is OK only if it has the same set of + // dependencies as the existing one.i + Entry::Occupied(entry) if entry.get() == &ext_pkg => { + let (self_deps, ext_deps) = + pkg_deps_equal(ext_name, &self.package_graph, ext_graph); + if self_deps != ext_deps { + bail!( "Conflicting dependencies found for '{ext_name}' during external resolution by '{resolver}':\n{}{}", format_deps("\nExternal dependencies not found:", self_deps), format_deps("\nNew external dependencies:", ext_deps), ); - } } + // check if acyclic to avoid infinite recursion + self.check_acyclic()?; + self.override_verify(&ext_pkg, ext_name, overrides)?; + // same package, no reason to process its dependencies + return Ok(()); } - } - // Because all the packages in `extensions`'s package table didn't exist in `self`'s, all - // `ext_graph`'s edges are known to not occur in `self.package_graph` and can be added - // without worrying about introducing duplicate edges. - for (from, to, dep) in ext_graph.all_edges() { - self.package_graph.add_edge(from, to, dep.clone()); + Entry::Occupied(mut entry) => { + if let Some(overridden_pkg) = overrides.get(&ext_name) { + // override found - use it and return - no reason to process its dependencies + entry.insert(overridden_pkg.clone()); + return Ok(()); + } else { + bail!( + "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", + ext_name, + PackageWithResolverTOML(entry.get()), + PackageWithResolverTOML(&ext_pkg), + ); + } + } + }; + + // if we are here, it means that a new package has been inserted into the graph - we need to + // process its dependencies and add appropriate edges to them + for dst in ext_graph.neighbors_directed(ext_name, Direction::Outgoing) { + // unwrap safe as the table must have the package if the graph has it + let dst_pkg = ext_table.get(&dst).unwrap(); + // unwrap is safe as all edges have a Dependency weight + let ext_dep = ext_graph.edge_weight(ext_name, dst).unwrap(); + self.package_graph.add_edge(ext_name, dst, ext_dep.clone()); + self.merge_pgk( + dst_pkg.clone(), + dst, + ext_graph, + ext_table, + resolver, + overrides, + )?; } Ok(()) @@ -498,55 +630,154 @@ impl DependencyGraph { package_path: &Path, dependency_cache: &mut DependencyCache, external_requests: &mut Vec, + overrides: &mut BTreeMap, progress_output: &mut Progress, ) -> Result<()> { let from = package.package.name; - for (to, dep) in &package.dependencies { - match dep { - PM::Dependency::External(resolver) => external_requests.push(ExternalRequest { - mode: DependencyMode::Always, - from, - to: *to, - resolver: *resolver, - pkg_path: package_path.to_path_buf(), - }), - PM::Dependency::Internal(dep) => self.resolve_internally( - DependencyMode::Always, - from, - *to, - parent, - dep.clone(), - dependency_cache, - external_requests, - progress_output, - )?, + + self.extend_with_dependencies( + DependencyMode::Always, + &package.dependencies, + from, + parent, + package_path, + dependency_cache, + external_requests, + overrides, + progress_output, + )?; + + self.extend_with_dependencies( + DependencyMode::DevOnly, + &package.dev_dependencies, + from, + parent, + package_path, + dependency_cache, + external_requests, + overrides, + progress_output, + )?; + + Ok(()) + } + + fn extend_with_dependencies( + &mut self, + mode: DependencyMode, + dependencies: &PM::Dependencies, + from: Symbol, + parent: &PM::DependencyKind, + package_path: &Path, + dependency_cache: &mut DependencyCache, + external_requests: &mut Vec, + overrides: &mut BTreeMap, + progress_output: &mut Progress, + ) -> Result<()> { + // partition dep into overrides and not + let (overridden_deps, deps): (Vec<_>, Vec<_>) = + dependencies.iter().partition(|(_, dep)| { + if let PM::Dependency::Internal(d) = dep { + d.dep_override + } else { + false + } + }); + + // Process overrides first to include them in processing of non-overridden deps. It is + // important to do so as a dependency override may "prune" portions of a dependency graph + // that would otherwise prevent other dependencies from kicking in. In other words, a given + // override may be the dominant one only if another override eliminates some graph + // edges. See diamond_problem_dep_transitive_nested_override for an example of such + // situation. + // + // It's also pretty important that we do not extend overrides with the override being + // currently processed as we have no way of knowing if it's the correct one (dominating all + // package "uses"). If we did, we could override an existing (non-overridden) entry in the + // graph with an incorrect override without being able to detect it. + let mut local_overrides = BTreeMap::new(); + for (to, dep) in overridden_deps { + let inserted_pkg = self.extend_with_dep( + mode, + from, + *to, + dep, + parent, + package_path, + dependency_cache, + external_requests, + overrides, + progress_output, + )?; + // do not include already overridden overrides + if let Some(pkg) = inserted_pkg { + if !overrides.contains_key(to) { + local_overrides.insert(*to, pkg); + } } } - for (to, dep) in &package.dev_dependencies { - match dep { - PM::Dependency::External(resolver) => external_requests.push(ExternalRequest { - mode: DependencyMode::DevOnly, + // add new overrides to the set + overrides.extend(local_overrides.clone()); + + for (to, dep) in deps { + self.extend_with_dep( + mode, + from, + *to, + dep, + parent, + package_path, + dependency_cache, + external_requests, + overrides, + progress_output, + )?; + } + // remove locally added overrides from the set + overrides.retain(|k, _| !local_overrides.contains_key(k)); + Ok(()) + } + + fn extend_with_dep( + &mut self, + mode: DependencyMode, + from: Symbol, + to: Symbol, + dep: &PM::Dependency, + parent: &PM::DependencyKind, + package_path: &Path, + dependency_cache: &mut DependencyCache, + external_requests: &mut Vec, + overrides: &mut BTreeMap, + progress_output: &mut Progress, + ) -> Result> { + let inserted_pkg = match dep { + PM::Dependency::External(resolver) => { + external_requests.push(ExternalRequest { + mode, from, - to: *to, + to, resolver: *resolver, pkg_path: package_path.to_path_buf(), - }), - - PM::Dependency::Internal(dep) => self.resolve_internally( - DependencyMode::DevOnly, - from, - *to, - parent, - dep.clone(), - dependency_cache, - external_requests, - progress_output, - )?, + overrides: overrides.clone(), + }); + None } - } - Ok(()) + PM::Dependency::Internal(dep) => Some(self.resolve_internally( + mode, + from, + to, + parent, + dep.clone(), + dependency_cache, + external_requests, + overrides, + progress_output, + )?), + }; + Ok(inserted_pkg) } /// Resolve the packages described at dependency `to` of package `from` with manifest at path @@ -563,6 +794,7 @@ impl DependencyGraph { to: PM::PackageName, resolver: Symbol, package_path: &Path, + overrides: &BTreeMap, progress_output: &mut Progress, ) -> Result<()> { let mode_label = if mode == DependencyMode::DevOnly { @@ -619,9 +851,10 @@ impl DependencyGraph { format!("Parsing response from '{resolver}' for dependency '{to}' of package '{from}'") })?; - self.merge(sub_graph, resolver).with_context(|| { - format!("Adding dependencies from {resolver} for dependency '{to}' in '{from}'") - })?; + self.merge(from, to, sub_graph, resolver, overrides) + .with_context(|| { + format!("Adding dependencies from {resolver} for dependency '{to}' in '{from}'") + })?; Ok(()) } @@ -641,8 +874,9 @@ impl DependencyGraph { dep: PM::InternalDependency, dependency_cache: &mut DependencyCache, external_requests: &mut Vec, + overrides: &mut BTreeMap, progress_output: &mut Progress, - ) -> Result<()> { + ) -> Result { let PM::InternalDependency { kind, version, @@ -651,18 +885,22 @@ impl DependencyGraph { dep_override, } = dep; + // are there active overrides for this path in the graph? + let overridden_path = !overrides.is_empty(); let mut pkg = Package { kind, version, resolver: None, + overridden_path, }; pkg.kind.reroot(parent)?; - self.process_dependency( + let inserted_pkg = self.process_dependency( pkg, to, dependency_cache, external_requests, + overrides, progress_output, )?; self.package_graph.add_edge( @@ -676,7 +914,7 @@ impl DependencyGraph { }, ); - Ok(()) + Ok(inserted_pkg) } /// Ensures that package `pkg_name` and all its transitive dependencies are present in the @@ -689,24 +927,41 @@ impl DependencyGraph { name: PM::PackageName, dependency_cache: &mut DependencyCache, external_requests: &mut Vec, + overrides: &mut BTreeMap, progress_output: &mut Progress, - ) -> Result<()> { + ) -> Result { let pkg = match self.package_table.entry(name) { Entry::Vacant(entry) => entry.insert(pkg), - // Seeing the same package again, pointing to the same dependency: OK, return early. + // Seeing the same package again, pointing to the same dependency: OK, return early but + // only if seeing a package that was not on an "override path" (was created when no + // override was active); otherwise we need to keep inspecting the graph to make sure + // that the overrides introduced on this path correctly dominate all "uses" of a given + // package Entry::Occupied(entry) if entry.get() == &pkg => { - return Ok(()); + if entry.get().overridden_path { + // check if acyclic to avoid infinite recursion + self.check_acyclic()?; + self.override_verify(&pkg, name, overrides)?; + } + return Ok(pkg); } - // Seeing the same package again, but pointing to a different dependency: Not OK. - Entry::Occupied(entry) => { - bail!( - "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", - name, - PackageWithResolverTOML(entry.get()), - PackageWithResolverTOML(&pkg), - ); + // Seeing the same package again, but pointing to a different dependency: Not OK unless + // there is an override. + Entry::Occupied(mut entry) => { + if let Some(overridden_pkg) = overrides.get(&name) { + // override found - use it + entry.insert(overridden_pkg.clone()); + entry.into_mut() + } else { + bail!( + "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", + name, + PackageWithResolverTOML(entry.get()), + PackageWithResolverTOML(&pkg), + ); + } } }; @@ -718,6 +973,7 @@ impl DependencyGraph { let manifest = parse_move_manifest_from_file(&pkg_path) .with_context(|| format!("Parsing manifest for '{}'", name))?; + let inserted_pkg = pkg.clone(); let kind = pkg.kind.clone(); self.extend_graph( &kind, @@ -725,9 +981,59 @@ impl DependencyGraph { &pkg_path, dependency_cache, external_requests, + overrides, progress_output, ) - .with_context(|| format!("Resolving dependencies for package '{}'", name)) + .with_context(|| format!("Resolving dependencies for package '{}'", name))?; + Ok(inserted_pkg) + } + + fn override_verify( + &self, + pkg: &Package, + name: PM::PackageName, + overrides: &BTreeMap, + ) -> Result<()> { + // check if any (should be 0 or 1) edges are the overrides of pkg + let pkg_overrides: Vec<_> = self + .package_graph + .neighbors_directed(name, Direction::Incoming) + .filter(|src| { + // unwrap is safe as all edges have a Dependency weight + self.package_graph + .edge_weight(*src, name) + .unwrap() + .dep_override + }) + .collect(); + + if !pkg_overrides.is_empty() { + let Some(overridden_pkg) = overrides.get(&name) else { + bail!("Incorrect override of {} in {} (an override should dominate all uses of the overridden package)", name, pkg_overrides[0]); + }; + if overridden_pkg != pkg { + // This should never happen as we process overridden dependencies first. Since the + // overridden dependency is omitted from the set of all overrides (see a comment in + // extend_with_dependencies to see why), a conflicting override will be caught as a + // "simple" conflicting dependency + bail!( + "Incorrect override of {} in {} (conflicting overrides)", + name, + pkg_overrides[0] + ); + } + } + + // recursively check all other packages in the subgraph + for dst in self + .package_graph + .neighbors_directed(name, Direction::Outgoing) + { + // unwrap is safe as dst is in the graph so it must also be in package table + let dst_pkg = self.package_table.get(&dst).unwrap(); + self.override_verify(dst_pkg, dst, overrides)?; + } + Ok(()) } /// Check that every dependency in the graph, excluding the root package, is present in the @@ -804,6 +1110,7 @@ impl<'a> fmt::Display for PackageTOML<'a> { kind, version, resolver: _, + overridden_path: _, } = self.0; f.write_str("{ ")?; diff --git a/language/tools/move-package/tests/test_dependency_graph.rs b/language/tools/move-package/tests/test_dependency_graph.rs index 2b19b1da94..caded4fac8 100644 --- a/language/tools/move-package/tests/test_dependency_graph.rs +++ b/language/tools/move-package/tests/test_dependency_graph.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use std::{ - collections::BTreeSet, + collections::{BTreeMap, BTreeSet}, fs::{self, File}, io::Write, path::PathBuf, @@ -184,7 +184,15 @@ fn merge_simple() { ) .expect("Reading inner"); - assert!(outer.merge(inner, Symbol::from("")).is_ok()); + assert!(outer + .merge( + Symbol::from("A"), + Symbol::from("A"), + inner, + Symbol::from(""), + &BTreeMap::new(), + ) + .is_ok()); assert_eq!( outer.topological_order(), @@ -214,7 +222,15 @@ fn merge_into_root() { ) .expect("Reading inner"); - assert!(outer.merge(inner, Symbol::from("")).is_ok()); + assert!(outer + .merge( + Symbol::from("Root"), + Symbol::from("A"), + inner, + Symbol::from(""), + &BTreeMap::new(), + ) + .is_ok()); assert_eq!( outer.topological_order(), @@ -243,7 +259,7 @@ fn merge_detached() { ) .expect("Reading inner"); - let Err(err) = outer.merge(inner, Symbol::from("")) else { + let Err(err) = outer.merge(Symbol::from("OtherDep"), Symbol::from("A"), inner, Symbol::from(""), &BTreeMap::new()) else { panic!("Inner's root is not part of outer's graph, so this should fail"); }; @@ -267,7 +283,7 @@ fn merge_after_calculating_always_deps() { ) .expect("Reading inner"); - let Err(err) = outer.merge(inner, Symbol::from("")) else { + let Err(err) = outer.merge(Symbol::from("A"),Symbol::from("A"), inner, Symbol::from(""), &BTreeMap::new()) else { panic!("Outer's always deps have already been calculated so this should fail"); }; @@ -295,7 +311,15 @@ fn merge_overlapping() { ) .expect("Reading inner"); - assert!(outer.merge(inner, Symbol::from("")).is_ok()); + assert!(outer + .merge( + Symbol::from("B"), + Symbol::from("A"), + inner, + Symbol::from(""), + &BTreeMap::new(), + ) + .is_ok()); } #[test] @@ -319,7 +343,7 @@ fn merge_overlapping_different_deps() { ) .expect("Reading inner"); - let Err(err) = outer.merge(inner, Symbol::from("")) else { + let Err(err) = outer.merge(Symbol::from("B"),Symbol::from("A"), inner, Symbol::from(""), &BTreeMap::new()) else { panic!("Outer and inner mention package A which has different dependencies in both."); }; @@ -347,7 +371,7 @@ fn merge_cyclic() { ) .expect("Reading inner"); - let Err(err) = outer.merge(inner, Symbol::from("")) else { + let Err(err) = outer.merge(Symbol::from("B"), Symbol::from("Root"), inner, Symbol::from(""), &BTreeMap::new()) else { panic!("Inner refers back to outer's root"); }; diff --git a/language/tools/move-package/tests/test_sources/dep_dev_dep_diamond/Move.resolved b/language/tools/move-package/tests/test_sources/dep_dev_dep_diamond/Move.resolved index f5f4bc18b2..5edc3e77e4 100644 --- a/language/tools/move-package/tests/test_sources/dep_dev_dep_diamond/Move.resolved +++ b/language/tools/move-package/tests/test_sources/dep_dev_dep_diamond/Move.resolved @@ -69,6 +69,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "B": Package { kind: Local( @@ -76,6 +77,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "C": Package { kind: Local( @@ -83,6 +85,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "D": Package { kind: Local( @@ -90,6 +93,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -142,6 +146,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -154,6 +159,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -189,6 +195,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -266,21 +273,23 @@ ResolvedGraph { "A": Internal( InternalDependency { kind: Local( - "./deps_only/A", + "deps_only/A", ), subst: None, version: None, digest: None, + dep_override: false, }, ), "C": Internal( InternalDependency { kind: Local( - "./deps_only/C", + "deps_only/C", ), subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -288,11 +297,12 @@ ResolvedGraph { "B": Internal( InternalDependency { kind: Local( - "./deps_only/B", + "deps_only/B", ), subst: None, version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/dep_good_digest/Move.resolved b/language/tools/move-package/tests/test_sources/dep_good_digest/Move.resolved index d9f0967f08..106a51f969 100644 --- a/language/tools/move-package/tests/test_sources/dep_good_digest/Move.resolved +++ b/language/tools/move-package/tests/test_sources/dep_good_digest/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -104,7 +105,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -117,6 +118,7 @@ ResolvedGraph { digest: Some( "6A88B7888D6049EB0121900E22B6FA2C0E702F042C8C8D4FD62AD5C990B9F9A8", ), + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_backflow_resolution/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_backflow_resolution/Move.resolved index 692aa398ff..357edc8d63 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_backflow_resolution/Move.resolved +++ b/language/tools/move-package/tests/test_sources/diamond_problem_backflow_resolution/Move.resolved @@ -51,6 +51,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "B": Package { kind: Local( @@ -58,6 +59,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "C": Package { kind: Local( @@ -65,6 +67,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -123,6 +126,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, @@ -171,6 +175,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, @@ -238,17 +243,18 @@ ResolvedGraph { "A": Internal( InternalDependency { kind: Local( - "./deps_only/A", + "deps_only/A", ), subst: None, version: None, digest: None, + dep_override: false, }, ), "B": Internal( InternalDependency { kind: Local( - "./deps_only/B", + "deps_only/B", ), subst: Some( { @@ -259,6 +265,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.resolved new file mode 100644 index 0000000000..c20fcea9f1 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'B': Conflicting dependencies found: +C = { local = "deps_only/C", version = "2.0.0" } +C = { local = "deps_only/C", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.toml new file mode 100644 index 0000000000..69cc1e8ca1 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/A/Move.toml new file mode 100644 index 0000000000..b4bded6d53 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/B/Move.toml new file mode 100644 index 0000000000..1ee8a9c06d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/C/Move.toml new file mode 100644 index 0000000000..73ed836961 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_conflict/deps_only/C/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "C" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.resolved new file mode 100644 index 0000000000..e4b751a0e3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Adding dependencies from ../resolvers/successful.sh for dependency 'A' in 'Root': Conflicting dependencies found: +ADep = { local = "deps_only/ADep", version = "1.0.0" } +ADep = { local = "deps_only/ADep" } # Resolved by ../resolvers/successful.sh diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.toml new file mode 100644 index 0000000000..3a04d8d3e6 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/Move.toml @@ -0,0 +1,13 @@ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +B = { local = "./deps_only/B" } + +[dependencies.A] +resolver = "../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/B/Move.toml new file mode 100644 index 0000000000..7b3d1f6cd2 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_conflict/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.resolved new file mode 100644 index 0000000000..9a30327390 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.resolved @@ -0,0 +1 @@ +Failed to resolve dependencies for package 'Root': Adding dependencies from ../../../resolvers/successful.sh for dependency 'A' in 'C': Incorrect override of ADep in B (an override should dominate all uses of the overridden package) diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml new file mode 100644 index 0000000000..30594c9b9c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml @@ -0,0 +1,22 @@ +# Dependency graph and and override (ov) +# C's dependency on A and ADep is externally resolved (override is incorrect) +# +# +----+ +# +---->| C |----+ +# | +----+ | +# | | +# +----+ | +---->+----+------>+-------+ +# |Root|----| | A | | ADep | +# +----+ | +---->+----+ +-->+-------+ +# | | | +# | +----+----+ ov(1) | +# +---->| B |-------------------+ +# +----+ + +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/B/Move.toml new file mode 100644 index 0000000000..08d399ad8e --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/B/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +A = { local = "../A" } +ADep = { local = "../ADep", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/C/Move.toml new file mode 100644 index 0000000000..88e670eb24 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/deps_only/C/Move.toml @@ -0,0 +1,10 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies.A] +resolver = "../../../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.resolved new file mode 100644 index 0000000000..e4b751a0e3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Adding dependencies from ../resolvers/successful.sh for dependency 'A' in 'Root': Conflicting dependencies found: +ADep = { local = "deps_only/ADep", version = "1.0.0" } +ADep = { local = "deps_only/ADep" } # Resolved by ../resolvers/successful.sh diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.toml new file mode 100644 index 0000000000..49ff712b99 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/Move.toml @@ -0,0 +1,28 @@ +# Dependency graph and and override (ov) +# Root's dependency on A and ADep is externally resolved (override is incorrect) +# +# +----+ +# +---->| A |------+ +# | +----+ | +# | | +# +----+ | +---------------->+-------+ +# |Root|----| +---------------->| ADep | +# +----+ | | +--->+-------+ +# | ov(1) | | +# | +----+------+ +----+ | +# +---->| B |--------->| C |---+ +# +----+ +----+ + +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +B = { local = "./deps_only/B" } + +[dependencies.A] +resolver = "../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/B/Move.toml new file mode 100644 index 0000000000..bf53f3f30b --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/B/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep", version = "1.0.0", override = true } +C = { local = "../C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/C/Move.toml new file mode 100644 index 0000000000..9c4cc80e09 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v2/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.locked new file mode 100644 index 0000000000..1302689e4f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.locked @@ -0,0 +1,29 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "ADep" }, +] + +[[move.package]] +name = "ADep" +source = { local = "deps_only/ADep" } + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "ADep" }, +] diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved new file mode 100644 index 0000000000..598c98c804 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved @@ -0,0 +1,236 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_external_no_conflict", + root_package: "Root", + package_graph: { + "Root": [ + ( + "B", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ], + "B": [ + ( + "ADep", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "ADep": [ + ( + "B", + Incoming, + ), + ( + "A", + Incoming, + ), + ], + "A": [ + ( + "Root", + Incoming, + ), + ( + "ADep", + Outgoing, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: Some( + "../resolvers/successful.sh", + ), + overridden_path: false, + }, + "ADep": Package { + kind: Local( + "deps_only/ADep", + ), + version: None, + resolver: None, + overridden_path: false, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "A", + "ADep", + "B", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "ADep": Internal( + InternalDependency { + kind: Local( + "../ADep", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "ADep": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "ADep", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "ADep": Internal( + InternalDependency { + kind: Local( + "../ADep", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": External( + "../resolvers/successful.sh", + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.toml new file mode 100644 index 0000000000..3a04d8d3e6 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.toml @@ -0,0 +1,13 @@ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +B = { local = "./deps_only/B" } + +[dependencies.A] +resolver = "../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/B/Move.toml new file mode 100644 index 0000000000..9829975c15 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.locked new file mode 100644 index 0000000000..a2c2956e76 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.locked @@ -0,0 +1,30 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "ADep" }, + { name = "B" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "ADep" }, +] + +[[move.package]] +name = "ADep" +source = { local = "deps_only/ADep", version = "1.0.0" } + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "ADep" }, +] diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved new file mode 100644 index 0000000000..8b093622da --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved @@ -0,0 +1,273 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_external_override", + root_package: "Root", + package_graph: { + "Root": [ + ( + "ADep", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ], + "ADep": [ + ( + "Root", + Incoming, + ), + ( + "B", + Incoming, + ), + ( + "A", + Incoming, + ), + ], + "B": [ + ( + "ADep", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "A": [ + ( + "Root", + Incoming, + ), + ( + "ADep", + Outgoing, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: Some( + "../resolvers/successful.sh", + ), + overridden_path: false, + }, + "ADep": Package { + kind: Local( + "deps_only/ADep", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + }, + always_deps: { + "A", + "ADep", + "B", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "ADep": Internal( + InternalDependency { + kind: Local( + "../ADep", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "ADep": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "ADep", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "ADep": Internal( + InternalDependency { + kind: Local( + "../ADep", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": External( + "../resolvers/successful.sh", + ), + "ADep": Internal( + InternalDependency { + kind: Local( + "deps_only/ADep", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.toml new file mode 100644 index 0000000000..ec66c555ab --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.toml @@ -0,0 +1,14 @@ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +B = { local = "./deps_only/B" } +ADep = { local = "./deps_only/ADep", version = "1.0.0", override = true } + +[dependencies.A] +resolver = "../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/B/Move.toml new file mode 100644 index 0000000000..7b3d1f6cd2 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.locked new file mode 100644 index 0000000000..6baaa304eb --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.locked @@ -0,0 +1,38 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, + { name = "C" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A", version = "1.0.0" } + +dependencies = [ + { name = "ADep" }, +] + +[[move.package]] +name = "ADep" +source = { local = "deps_only/ADep" } + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "A" }, +] + +[[move.package]] +name = "C" +source = { local = "deps_only/C" } + +dependencies = [ + { name = "A" }, +] diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.resolved new file mode 100644 index 0000000000..1df8add04c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.resolved @@ -0,0 +1,320 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_external_override_root", + root_package: "Root", + package_graph: { + "Root": [ + ( + "A", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ( + "C", + Outgoing, + ), + ], + "A": [ + ( + "ADep", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ( + "B", + Incoming, + ), + ( + "C", + Incoming, + ), + ], + "ADep": [ + ( + "A", + Incoming, + ), + ], + "B": [ + ( + "A", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "C": [ + ( + "Root", + Incoming, + ), + ( + "A", + Outgoing, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + "ADep": Package { + kind: Local( + "deps_only/ADep", + ), + version: None, + resolver: None, + overridden_path: false, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "C": Package { + kind: Local( + "deps_only/C", + ), + version: None, + resolver: None, + overridden_path: true, + }, + }, + always_deps: { + "A", + "ADep", + "B", + "C", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "ADep": Internal( + InternalDependency { + kind: Local( + "../ADep", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "ADep": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "ADep", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "../A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": External( + "../../../resolvers/successful.sh", + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "C": Internal( + InternalDependency { + kind: Local( + "deps_only/C", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.toml new file mode 100644 index 0000000000..d67cc93e50 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/Move.toml @@ -0,0 +1,23 @@ +# Dependency graph and and override (ov) +# C's dependency on A and ADep is externally resolved (override should kick in) +# +# +----+ +# +---->| C |----+ +# | +----+ | +# | | +# +----+ | ov(1) +---->+----+ +-------+ +# |Root|----+-------------------->| A |------>| ADep | +# +----+ | +---->+----+ +-------+ +# | | +# | +----+ | +# +---->| B |----+ +# +----+ + +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A", version = "1.0.0", override = true } +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/A/Move.toml new file mode 100644 index 0000000000..74ba633d52 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +ADep = { local = "../ADep" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/ADep/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/ADep/Move.toml new file mode 100644 index 0000000000..27032db1a4 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/ADep/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "ADep" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/B/Move.toml new file mode 100644 index 0000000000..45e755ee23 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +A = { local = "../A" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/C/Move.toml new file mode 100644 index 0000000000..88e670eb24 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override_root/deps_only/C/Move.toml @@ -0,0 +1,10 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies.A] +resolver = "../../../resolvers/successful.sh" + +[dependencies.A.packages] +Contains = "Anything" +Has = { No = "Schema" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.resolved new file mode 100644 index 0000000000..d571d31471 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'B': Conflicting dependencies found: +D = { local = "deps_only/D", version = "2.0.0" } +D = { local = "deps_only/D", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.toml new file mode 100644 index 0000000000..780de5c60d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/Move.toml @@ -0,0 +1,20 @@ +# Dependency graph and and override (ov) - incorrect conflicting overrides. +# +# +----+ ov(3) +# +---->| B |----------------------+ +# | +----+----+ | +# | | | +# +----+ | | +----+ v1 +--->+----+ +# |Root|----+ +---->| C |---------->| D | +# +----+ | | +----+ +--->+----+ +# | | | +# | +----+----+ ov(2) | +# +---->| A |----------------------+ +# +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/A/Move.toml new file mode 100644 index 0000000000..380fa3b664 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/A/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D", version = "2.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/B/Move.toml new file mode 100644 index 0000000000..d84c576b12 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/B/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D", version = "3.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/C/Move.toml new file mode 100644 index 0000000000..af684071a3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +D = { local = "../D", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/D/Move.toml new file mode 100644 index 0000000000..c9cc629460 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_conflicting_overrides/deps_only/D/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "D" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.resolved new file mode 100644 index 0000000000..801ffc7a9a --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.resolved @@ -0,0 +1 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'B': Incorrect override of D in A (an override should dominate all uses of the overridden package) diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.toml new file mode 100644 index 0000000000..24c3a4c93a --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/Move.toml @@ -0,0 +1,20 @@ +# Dependency graph and and override (ov) - when override is processed there is no entry in the graph +# yet (override is incorrect). +# +----+ +# +---->| B |----+ +# | +----+ | +# | | +# +----+ | | +----+ v1 +----+ +# |Root|----+ +---->| C |-------->| D | +# +----+ | | +----+ +--->+----+ +# | | | +# | +----+----+ ov(2) | +# +---->| A |--------------------+ +# +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/A/Move.toml new file mode 100644 index 0000000000..380fa3b664 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/A/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D", version = "2.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/B/Move.toml new file mode 100644 index 0000000000..f3a7a12b0d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/C/Move.toml new file mode 100644 index 0000000000..af684071a3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +D = { local = "../D", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/D/Move.toml new file mode 100644 index 0000000000..c9cc629460 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_empty/deps_only/D/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "D" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.resolved new file mode 100644 index 0000000000..0e703bc74c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'B': Conflicting dependencies found: +D = { local = "deps_only/D", version = "1.0.0" } +D = { local = "deps_only/D", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.toml new file mode 100644 index 0000000000..a46cda4836 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/Move.toml @@ -0,0 +1,20 @@ +# Dependency graph and and override (ov) - when override is processed there is already an entry in +# the graph (override is incorrect). +# +----+ ov(2) +# +---->| B |----------------------+ +# | +----+----+ | +# | | | +# +----+ | | +----+ v1 +--->+----+ +# |Root|----+ +---->| C |---------->| D | +# +----+ | | +----+ +----+ +# | | +# | +----+----+ +# +---->| A | +# +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/A/Move.toml new file mode 100644 index 0000000000..58bf5ee785 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/B/Move.toml new file mode 100644 index 0000000000..ae7378d6ea --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/B/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D", version = "2.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/C/Move.toml new file mode 100644 index 0000000000..af684071a3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +D = { local = "../D", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/D/Move.toml new file mode 100644 index 0000000000..c9cc629460 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_occupied/deps_only/D/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "D" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.resolved new file mode 100644 index 0000000000..247d4179c7 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'A': Resolving dependencies for package 'C': Resolving dependencies for package 'F': Conflicting dependencies found: +G = { local = "deps_only/G", version = "1.0.0" } +G = { local = "deps_only/G", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml new file mode 100644 index 0000000000..bb77bfee7c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml @@ -0,0 +1,24 @@ +# Dependency graph - conflicting dependencies. +# +# +----+ +# +---->| F |--------------+ +# | +----+ | +# | | +# +----+ +----+ | | +# +---->| A |---->| C |----+ | +# | +----+ +----+ | | +# | | | +# +----+ | | +----+ | +# |Root|----+ +---->| E |------+ | +# +----+ | +----+ | | +# | v1 | | +# | +----+ +---+ v3 +----+<-----+ | +# +---->| B +---->| D |---------->| G | v2 | +# +----+ +---+ +----+<-------------+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/A/Move.toml new file mode 100644 index 0000000000..a606d04583 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/A/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/B/Move.toml new file mode 100644 index 0000000000..b35ffc1bce --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +D = { local = "../D" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/C/Move.toml new file mode 100644 index 0000000000..02631391d7 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/C/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E" } +F = { local = "../F" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/D/Move.toml new file mode 100644 index 0000000000..f99eb1b327 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +G = { local = "../G", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/E/Move.toml new file mode 100644 index 0000000000..71ce2f2760 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/E/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "E" +version = "0.0.0" + +[dependencies] +G = { local = "../G", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/F/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/F/Move.toml new file mode 100644 index 0000000000..b77155c25e --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/F/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "F" +version = "0.0.0" + +[dependencies] +G = { local = "../G", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/G/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/G/Move.toml new file mode 100644 index 0000000000..16e8cb4ef2 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/deps_only/G/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "G" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.locked new file mode 100644 index 0000000000..8e9e8edca7 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.locked @@ -0,0 +1,47 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, + { name = "E" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "C" }, + { name = "D" }, +] + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "C" +source = { local = "deps_only/C" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "D" +source = { local = "deps_only/D" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "E" +source = { local = "deps_only/E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.resolved new file mode 100644 index 0000000000..b1a9cb1f88 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.resolved @@ -0,0 +1,420 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_nested_override", + root_package: "Root", + package_graph: { + "Root": [ + ( + "E", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ], + "E": [ + ( + "Root", + Incoming, + ), + ( + "C", + Incoming, + ), + ( + "D", + Incoming, + ), + ( + "B", + Incoming, + ), + ], + "C": [ + ( + "E", + Outgoing, + ), + ( + "A", + Incoming, + ), + ], + "A": [ + ( + "C", + Outgoing, + ), + ( + "D", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "D": [ + ( + "E", + Outgoing, + ), + ( + "A", + Incoming, + ), + ], + "B": [ + ( + "E", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "C": Package { + kind: Local( + "deps_only/C", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "D": Package { + kind: Local( + "deps_only/D", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "E": Package { + kind: Local( + "deps_only/E", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "A", + "B", + "C", + "D", + "E", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "D": Internal( + InternalDependency { + kind: Local( + "../D", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 3, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "D": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "D", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "E": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "E", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "E": Internal( + InternalDependency { + kind: Local( + "deps_only/E", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.toml new file mode 100644 index 0000000000..dae84db882 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/Move.toml @@ -0,0 +1,24 @@ +# Dependency graph and an override (ov) - override should succeed. +# +----+ +# +---->| C |--------------+ +# | +----+ | +# | | +# +----+ | | +# +---->| A |----+ | +# | +----+ | | +# | | | +# +----+ | ov(1) | +----+ | +# |Root|----+------------+ +---->| D |------+ | +# +----+ | | +----+ | | +# | | v1 | | +# | +----+ +------->+----+<-----+ | +# +---->| B |--------->| E | v2 | +# +----+ v3 +----+<-------------+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +E = { local = "./deps_only/E", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/A/Move.toml new file mode 100644 index 0000000000..a606d04583 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/A/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/B/Move.toml new file mode 100644 index 0000000000..c4ad219336 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/C/Move.toml new file mode 100644 index 0000000000..9c1c69cb1f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/D/Move.toml new file mode 100644 index 0000000000..5b594aae20 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.resolved new file mode 100644 index 0000000000..da6f447a5c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'B': Conflicting dependencies found: +E = { local = "deps_only/E", version = "1.0.0" } +E = { local = "deps_only/E", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.toml new file mode 100644 index 0000000000..e907ab76b9 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/Move.toml @@ -0,0 +1,23 @@ +# Dependency graph and an (insufficient) override (ov) - override is incorrect. +# +----+ +# +---->| C |--------------+ +# | +----+ | +# | | +# +----+ | | +# +---->| A |----+ | +# | +----+ | | +# | | | | +# +----+ | | | +----+ | +# |Root|----+ |ov(1) +---->| D |------+ | +# +----+ | +----+ +----+ | | +# | | v1 | | +# | +----+ +------->+----+<-----+ | +# +---->| B |--------->| E | v2 | +# +----+ v3 +----+<-------------+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/A/Move.toml new file mode 100644 index 0000000000..ab913a367a --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/A/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C"} +D = { local = "../D"} +E = { local = "../E", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/B/Move.toml new file mode 100644 index 0000000000..c4ad219336 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/C/Move.toml new file mode 100644 index 0000000000..5aa35b1ac8 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/D/Move.toml new file mode 100644 index 0000000000..5b594aae20 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_override_insufficient_low/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.locked new file mode 100644 index 0000000000..0ba7e9c31d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.locked @@ -0,0 +1,30 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, + { name = "C" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "C" }, +] + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "C" }, +] + +[[move.package]] +name = "C" +source = { local = "deps_only/C", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.resolved new file mode 100644 index 0000000000..0b1398e329 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.resolved @@ -0,0 +1,285 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_override", + root_package: "Root", + package_graph: { + "Root": [ + ( + "C", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ], + "C": [ + ( + "Root", + Incoming, + ), + ( + "A", + Incoming, + ), + ( + "B", + Incoming, + ), + ], + "A": [ + ( + "C", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "B": [ + ( + "C", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "C": Package { + kind: Local( + "deps_only/C", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "A", + "B", + "C", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "C": Internal( + InternalDependency { + kind: Local( + "deps_only/C", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.toml new file mode 100644 index 0000000000..f624dd7f7a --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/A/Move.toml new file mode 100644 index 0000000000..b4bded6d53 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/B/Move.toml new file mode 100644 index 0000000000..1ee8a9c06d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/C/Move.toml new file mode 100644 index 0000000000..73ed836961 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_override/deps_only/C/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "C" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.locked new file mode 100644 index 0000000000..9b23a9b0ca --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.locked @@ -0,0 +1,43 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, + { name = "C" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "B" }, +] + +[[move.package]] +name = "B" +source = { local = "deps_only/B1", version = "2.0.0" } + +[[move.package]] +name = "C" +source = { local = "deps_only/C" } + +dependencies = [ + { name = "D" }, + { name = "E" }, +] + +[[move.package]] +name = "D" +source = { local = "deps_only/D", version = "3.0.0" } + +[[move.package]] +name = "E" +source = { local = "deps_only/E" } + +dependencies = [ + { name = "D" }, +] diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.resolved new file mode 100644 index 0000000000..9c4d47c7ba --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.resolved @@ -0,0 +1,406 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_transitive_nested_override", + root_package: "Root", + package_graph: { + "Root": [ + ( + "B", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ( + "C", + Outgoing, + ), + ], + "B": [ + ( + "Root", + Incoming, + ), + ( + "A", + Incoming, + ), + ], + "A": [ + ( + "B", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "C": [ + ( + "D", + Outgoing, + ), + ( + "E", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "D": [ + ( + "C", + Incoming, + ), + ( + "E", + Incoming, + ), + ], + "E": [ + ( + "D", + Outgoing, + ), + ( + "C", + Incoming, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "B": Package { + kind: Local( + "deps_only/B1", + ), + version: Some( + ( + 2, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + "C": Package { + kind: Local( + "deps_only/C", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "D": Package { + kind: Local( + "deps_only/D", + ), + version: Some( + ( + 3, + 0, + 0, + ), + ), + resolver: None, + overridden_path: true, + }, + "E": Package { + kind: Local( + "deps_only/E", + ), + version: None, + resolver: None, + overridden_path: true, + }, + }, + always_deps: { + "A", + "B", + "C", + "D", + "E", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "B": Internal( + InternalDependency { + kind: Local( + "../B2", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "D": Internal( + InternalDependency { + kind: Local( + "../D", + ), + subst: None, + version: Some( + ( + 3, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "D": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "D", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "E": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "E", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "D": Internal( + InternalDependency { + kind: Local( + "../D", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B1", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + "C": Internal( + InternalDependency { + kind: Local( + "deps_only/C", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.toml new file mode 100644 index 0000000000..ba57ab888d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/Move.toml @@ -0,0 +1,27 @@ +# Dependency graph and and override (ov) - both overrides should succeed as after ov(2) kicks in, C +# will dominate E and D (and this override will always kick in before any other dependencies are +# processed as overrides are processed first). +# +# +----+ ov(3) +----+ +# +------>| C |------------------------------>| D | +# | +----+----------+ +--->+----+ +# | | | v1 +# | +----+ | | +# +------>| A | | | +# | +----+ +---->+----+ | +# | | v1 +----+ | E |----+ +# +----+ | +----->| B2 |-------->+----+ +# |Root|----+ +----+ +# +----+ | +# | +# | ov(2) +----+ +# +------------->| B1 | +# +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B1", version = "2.0.0", override = true } +C = { local = "./deps_only/C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/A/Move.toml new file mode 100644 index 0000000000..e8d027ed1f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/A/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +B = { local = "../B2", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B1/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B1/Move.toml new file mode 100644 index 0000000000..64596e5a35 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B1/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "B" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B2/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B2/Move.toml new file mode 100644 index 0000000000..0053de6d45 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/B2/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +E = { local = "../E" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/C/Move.toml new file mode 100644 index 0000000000..b29c9c8691 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/C/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E" } +D = { local = "../D", version ="3.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/D/Move.toml new file mode 100644 index 0000000000..c9cc629460 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/D/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "D" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/E/Move.toml new file mode 100644 index 0000000000..32168607ed --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_transitive_nested_override/deps_only/E/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "E" +version = "0.0.0" + +[dependencies] +D = { local = "../D", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.locked b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.locked new file mode 100644 index 0000000000..6e5a860676 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.locked @@ -0,0 +1,48 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "A" }, + { name = "B" }, + { name = "E" }, +] + +[[move.package]] +name = "A" +source = { local = "deps_only/A" } + +dependencies = [ + { name = "C" }, + { name = "D" }, + { name = "E" }, +] + +[[move.package]] +name = "B" +source = { local = "deps_only/B" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "C" +source = { local = "deps_only/C" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "D" +source = { local = "deps_only/D" } + +dependencies = [ + { name = "E" }, +] + +[[move.package]] +name = "E" +source = { local = "deps_only/E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.resolved new file mode 100644 index 0000000000..ea534ce9fd --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.resolved @@ -0,0 +1,445 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_two_nested_overrides", + root_package: "Root", + package_graph: { + "Root": [ + ( + "E", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ], + "E": [ + ( + "Root", + Incoming, + ), + ( + "A", + Incoming, + ), + ( + "C", + Incoming, + ), + ( + "D", + Incoming, + ), + ( + "B", + Incoming, + ), + ], + "A": [ + ( + "E", + Outgoing, + ), + ( + "C", + Outgoing, + ), + ( + "D", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "C": [ + ( + "E", + Outgoing, + ), + ( + "A", + Incoming, + ), + ], + "D": [ + ( + "E", + Outgoing, + ), + ( + "A", + Incoming, + ), + ], + "B": [ + ( + "E", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "C": Package { + kind: Local( + "deps_only/C", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "D": Package { + kind: Local( + "deps_only/D", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "E": Package { + kind: Local( + "deps_only/E", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "A", + "B", + "C", + "D", + "E", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "D": Internal( + InternalDependency { + kind: Local( + "../D", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 3, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "D": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "D", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 2, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "E": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "E", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "E": Internal( + InternalDependency { + kind: Local( + "deps_only/E", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.toml new file mode 100644 index 0000000000..6fafbb4d5c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/Move.toml @@ -0,0 +1,25 @@ +# Dependency graph and and override (ov) - only ov(1) should succeed. +# +----+ +# +---->| C |--------------+ +# | +----+ | +# | | +# +----+ | | +# +---->| A |--------+ | +# | +----+----+ | | +# | | | | +# +----+ | ov(1) | | +----+ | +# |Root|----+------------+ | +---->| D |------+ | +# +----+ | | | +----+ | | +# | | | ov2 v1 | | +# | +----+ | +-------->+----+<-----+ | +# +---->| B | +----------->| E | v2 | +# +----+------------->+----+<-------------+ +# v3 +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +E = { local = "./deps_only/E", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/A/Move.toml new file mode 100644 index 0000000000..f6105a6c14 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/A/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +D = { local = "../D" } +E = { local = "../E", version = "2.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/B/Move.toml new file mode 100644 index 0000000000..c4ad219336 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/C/Move.toml new file mode 100644 index 0000000000..9c1c69cb1f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/D/Move.toml new file mode 100644 index 0000000000..5b594aae20 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_two_nested_overrides/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_no_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_no_conflict/Move.resolved index d11ef21667..00ca515691 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_no_conflict/Move.resolved +++ b/language/tools/move-package/tests/test_sources/diamond_problem_no_conflict/Move.resolved @@ -51,6 +51,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "B": Package { kind: Local( @@ -58,6 +59,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "C": Package { kind: Local( @@ -65,6 +67,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -123,6 +126,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, @@ -171,6 +175,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, @@ -238,7 +243,7 @@ ResolvedGraph { "A": Internal( InternalDependency { kind: Local( - "./deps_only/A", + "deps_only/A", ), subst: Some( { @@ -249,12 +254,13 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), "B": Internal( InternalDependency { kind: Local( - "./deps_only/B", + "deps_only/B", ), subst: Some( { @@ -265,6 +271,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/external/Move.locked b/language/tools/move-package/tests/test_sources/external/Move.locked index 687c1e5fcf..2b7382a74e 100644 --- a/language/tools/move-package/tests/test_sources/external/Move.locked +++ b/language/tools/move-package/tests/test_sources/external/Move.locked @@ -9,7 +9,7 @@ dependencies = [ [[move.package]] name = "A" -source = { local = "./deps_only/A" } +source = { local = "deps_only/A" } dependencies = [ { name = "ADep" }, @@ -17,4 +17,4 @@ dependencies = [ [[move.package]] name = "ADep" -source = { local = "./deps_only/ADep" } +source = { local = "deps_only/ADep" } diff --git a/language/tools/move-package/tests/test_sources/external/Move.resolved b/language/tools/move-package/tests/test_sources/external/Move.resolved index 7f336d242e..873567ead4 100644 --- a/language/tools/move-package/tests/test_sources/external/Move.resolved +++ b/language/tools/move-package/tests/test_sources/external/Move.resolved @@ -29,21 +29,23 @@ ResolvedGraph { package_table: { "A": Package { kind: Local( - "./deps_only/A", + "deps_only/A", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, "ADep": Package { kind: Local( - "./deps_only/ADep", + "deps_only/ADep", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, }, always_deps: { @@ -95,6 +97,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/external_bad_dep/Move.locked b/language/tools/move-package/tests/test_sources/external_bad_dep/Move.locked index 687c1e5fcf..2b7382a74e 100644 --- a/language/tools/move-package/tests/test_sources/external_bad_dep/Move.locked +++ b/language/tools/move-package/tests/test_sources/external_bad_dep/Move.locked @@ -9,7 +9,7 @@ dependencies = [ [[move.package]] name = "A" -source = { local = "./deps_only/A" } +source = { local = "deps_only/A" } dependencies = [ { name = "ADep" }, @@ -17,4 +17,4 @@ dependencies = [ [[move.package]] name = "ADep" -source = { local = "./deps_only/ADep" } +source = { local = "deps_only/ADep" } diff --git a/language/tools/move-package/tests/test_sources/external_bad_dep/Move.resolved b/language/tools/move-package/tests/test_sources/external_bad_dep/Move.resolved index ec09f7afc6..d03823e289 100644 --- a/language/tools/move-package/tests/test_sources/external_bad_dep/Move.resolved +++ b/language/tools/move-package/tests/test_sources/external_bad_dep/Move.resolved @@ -1 +1 @@ -Resolving package 'ADep': Unable to find package manifest at "tests/test_sources/external_bad_dep/./deps_only/ADep": No such file or directory (os error 2) +Resolving package 'ADep': Unable to find package manifest at "tests/test_sources/external_bad_dep/deps_only/ADep": No such file or directory (os error 2) diff --git a/language/tools/move-package/tests/test_sources/external_dev_dep/Move.locked b/language/tools/move-package/tests/test_sources/external_dev_dep/Move.locked index 0b79d343c4..566ce195a4 100644 --- a/language/tools/move-package/tests/test_sources/external_dev_dep/Move.locked +++ b/language/tools/move-package/tests/test_sources/external_dev_dep/Move.locked @@ -13,7 +13,7 @@ dev-dependencies = [ [[move.package]] name = "A" -source = { local = "./deps_only/A" } +source = { local = "deps_only/A" } dependencies = [ { name = "ADep" }, @@ -21,11 +21,11 @@ dependencies = [ [[move.package]] name = "ADep" -source = { local = "./deps_only/ADep" } +source = { local = "deps_only/ADep" } [[move.package]] name = "B" -source = { local = "./deps_only/B" } +source = { local = "deps_only/B" } dependencies = [ { name = "BDep" }, @@ -33,4 +33,4 @@ dependencies = [ [[move.package]] name = "BDep" -source = { local = "./deps_only/BDep" } +source = { local = "deps_only/BDep" } diff --git a/language/tools/move-package/tests/test_sources/external_dev_dep/Move.resolved b/language/tools/move-package/tests/test_sources/external_dev_dep/Move.resolved index 2025f07a3e..c9fd6e4d41 100644 --- a/language/tools/move-package/tests/test_sources/external_dev_dep/Move.resolved +++ b/language/tools/move-package/tests/test_sources/external_dev_dep/Move.resolved @@ -49,39 +49,43 @@ ResolvedGraph { package_table: { "A": Package { kind: Local( - "./deps_only/A", + "deps_only/A", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, "ADep": Package { kind: Local( - "./deps_only/ADep", + "deps_only/ADep", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, "B": Package { kind: Local( - "./deps_only/B", + "deps_only/B", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, "BDep": Package { kind: Local( - "./deps_only/BDep", + "deps_only/BDep", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, }, always_deps: { @@ -133,6 +137,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -192,6 +197,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/external_overlap/Move.locked b/language/tools/move-package/tests/test_sources/external_overlap/Move.locked index ba39cf1d16..0a60df86c5 100644 --- a/language/tools/move-package/tests/test_sources/external_overlap/Move.locked +++ b/language/tools/move-package/tests/test_sources/external_overlap/Move.locked @@ -10,7 +10,7 @@ dependencies = [ [[move.package]] name = "A" -source = { local = "./deps_only/A" } +source = { local = "deps_only/A" } dependencies = [ { name = "ADep" }, diff --git a/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved b/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved index fab2c62e74..e68b03db74 100644 --- a/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved +++ b/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved @@ -37,12 +37,13 @@ ResolvedGraph { package_table: { "A": Package { kind: Local( - "./deps_only/A", + "deps_only/A", ), version: None, resolver: Some( "../resolvers/successful.sh", ), + overridden_path: false, }, "ADep": Package { kind: Local( @@ -50,6 +51,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -101,6 +103,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -158,11 +161,12 @@ ResolvedGraph { "ADep": Internal( InternalDependency { kind: Local( - "./deps_only/ADep", + "deps_only/ADep", ), subst: None, version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/external_silent/Move.locked b/language/tools/move-package/tests/test_sources/external_silent/Move.locked index 687c1e5fcf..2b7382a74e 100644 --- a/language/tools/move-package/tests/test_sources/external_silent/Move.locked +++ b/language/tools/move-package/tests/test_sources/external_silent/Move.locked @@ -9,7 +9,7 @@ dependencies = [ [[move.package]] name = "A" -source = { local = "./deps_only/A" } +source = { local = "deps_only/A" } dependencies = [ { name = "ADep" }, @@ -17,4 +17,4 @@ dependencies = [ [[move.package]] name = "ADep" -source = { local = "./deps_only/ADep" } +source = { local = "deps_only/ADep" } diff --git a/language/tools/move-package/tests/test_sources/multiple_deps_rename/Move.resolved b/language/tools/move-package/tests/test_sources/multiple_deps_rename/Move.resolved index bf37c21ed8..fcd78e5e61 100644 --- a/language/tools/move-package/tests/test_sources/multiple_deps_rename/Move.resolved +++ b/language/tools/move-package/tests/test_sources/multiple_deps_rename/Move.resolved @@ -33,6 +33,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "D": Package { kind: Local( @@ -40,6 +41,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -156,7 +158,7 @@ ResolvedGraph { "C": Internal( InternalDependency { kind: Local( - "./deps_only/C", + "deps_only/C", ), subst: Some( { @@ -167,12 +169,13 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), "D": Internal( InternalDependency { kind: Local( - "./deps_only/D", + "deps_only/D", ), subst: Some( { @@ -183,6 +186,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/nested_deps_git_local/Move.resolved b/language/tools/move-package/tests/test_sources/nested_deps_git_local/Move.resolved index 951f7f5ab1..58c52690f3 100644 --- a/language/tools/move-package/tests/test_sources/nested_deps_git_local/Move.resolved +++ b/language/tools/move-package/tests/test_sources/nested_deps_git_local/Move.resolved @@ -37,6 +37,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, "MoveStdlib": Package { kind: Git( @@ -48,6 +49,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -103,6 +105,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, @@ -184,6 +187,7 @@ ResolvedGraph { subst: None, version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/nested_deps_override/Move.locked b/language/tools/move-package/tests/test_sources/nested_deps_override/Move.locked new file mode 100644 index 0000000000..c8dbf13329 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/nested_deps_override/Move.locked @@ -0,0 +1,20 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "Nested" }, +] + +[[move.package]] +name = "More" +source = { local = "deps_only/nested/more" } + +[[move.package]] +name = "Nested" +source = { local = "deps_only/nested" } + +dependencies = [ + { name = "More" }, +] diff --git a/language/tools/move-package/tests/test_sources/nested_deps_override/Move.toml b/language/tools/move-package/tests/test_sources/nested_deps_override/Move.toml new file mode 100644 index 0000000000..1cae9ebd2f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/nested_deps_override/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "NestedDeps" +version = "0.0.0" + +[dependencies] +Nested = { local = "./deps_only/nested" } diff --git a/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/Move.toml b/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/Move.toml new file mode 100644 index 0000000000..920c7bf302 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "Nested" +version = "0.0.0" + +[dependencies] +More = { local = "./more", override = true } diff --git a/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/more/Move.toml b/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/more/Move.toml new file mode 100644 index 0000000000..83a2b21fa6 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/nested_deps_override/deps_only/nested/more/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "More" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/one_dep/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep/Move.resolved index 1436fe5ac3..b8c718e05f 100644 --- a/language/tools/move-package/tests/test_sources/one_dep/Move.resolved +++ b/language/tools/move-package/tests/test_sources/one_dep/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -104,7 +105,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -115,6 +116,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/one_dep_assigned_address/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep_assigned_address/Move.resolved index e01e2b394a..df43e52737 100644 --- a/language/tools/move-package/tests/test_sources/one_dep_assigned_address/Move.resolved +++ b/language/tools/move-package/tests/test_sources/one_dep_assigned_address/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -100,7 +101,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -111,6 +112,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/one_dep_multiple_of_same_name/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep_multiple_of_same_name/Move.resolved index e6f93e7e9c..ec1609776c 100644 --- a/language/tools/move-package/tests/test_sources/one_dep_multiple_of_same_name/Move.resolved +++ b/language/tools/move-package/tests/test_sources/one_dep_multiple_of_same_name/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -104,7 +105,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -115,6 +116,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/Move.compiled b/language/tools/move-package/tests/test_sources/one_dep_override/Move.compiled new file mode 100644 index 0000000000..848d6eee74 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/Move.compiled @@ -0,0 +1,26 @@ +CompiledPackageInfo { + package_name: "Root", + address_alias_instantiation: { + "A": 00000000000000000000000000000001, + }, + source_digest: Some( + "ELIDED_FOR_TEST", + ), + build_flags: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, +} diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/Move.locked b/language/tools/move-package/tests/test_sources/one_dep_override/Move.locked new file mode 100644 index 0000000000..fb1915365b --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/Move.locked @@ -0,0 +1,12 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 0 + +dependencies = [ + { name = "OtherDep", addr_subst = { "A" = "B" } }, +] + +[[move.package]] +name = "OtherDep" +source = { local = "deps_only/other_dep" } diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep_override/Move.resolved new file mode 100644 index 0000000000..845cb91a60 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/Move.resolved @@ -0,0 +1,138 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/one_dep_override", + root_package: "Root", + package_graph: { + "Root": [ + ( + "OtherDep", + Outgoing, + ), + ], + "OtherDep": [ + ( + "Root", + Incoming, + ), + ], + }, + package_table: { + "OtherDep": Package { + kind: Local( + "deps_only/other_dep", + ), + version: None, + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "OtherDep", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "OtherDep": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "OtherDep", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: Some( + { + "B": None, + }, + ), + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: { + "B": 00000000000000000000000000000001, + }, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: Some( + { + "A": Some( + 00000000000000000000000000000001, + ), + }, + ), + dev_address_assignments: None, + build: None, + dependencies: { + "OtherDep": Internal( + InternalDependency { + kind: Local( + "deps_only/other_dep", + ), + subst: Some( + { + "A": RenameFrom( + "B", + ), + }, + ), + version: None, + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: { + "A": ( + "OtherDep", + "B", + ), + }, + resolved_table: { + "A": 00000000000000000000000000000001, + }, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/Move.toml b/language/tools/move-package/tests/test_sources/one_dep_override/Move.toml new file mode 100644 index 0000000000..8b6a067ba5 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/Move.toml @@ -0,0 +1,9 @@ +[package] +name = "Root" +version = "0.0.0" + +[addresses] +A = "0x1" + +[dependencies] +OtherDep = { local = "./deps_only/other_dep", addr_subst = { "A" = "B" }, override = true } diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/Move.toml b/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/Move.toml new file mode 100644 index 0000000000..e0af1caa59 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "OtherDep" +version = "0.0.0" + +[addresses] +B = "_" diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/sources/B.move b/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/sources/B.move new file mode 100644 index 0000000000..e49d694537 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/deps_only/other_dep/sources/B.move @@ -0,0 +1,3 @@ +module B::B { + public fun foo() { } +} diff --git a/language/tools/move-package/tests/test_sources/one_dep_override/sources/OneDep.move b/language/tools/move-package/tests/test_sources/one_dep_override/sources/OneDep.move new file mode 100644 index 0000000000..41fd77fecf --- /dev/null +++ b/language/tools/move-package/tests/test_sources/one_dep_override/sources/OneDep.move @@ -0,0 +1,6 @@ +module A::OneDep { + use A::B; + public fun do_b() { + B::foo() + } +} diff --git a/language/tools/move-package/tests/test_sources/one_dep_reassigned_address/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep_reassigned_address/Move.resolved index b341517885..8c9ed32b1c 100644 --- a/language/tools/move-package/tests/test_sources/one_dep_reassigned_address/Move.resolved +++ b/language/tools/move-package/tests/test_sources/one_dep_reassigned_address/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -106,7 +107,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -117,6 +118,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, diff --git a/language/tools/move-package/tests/test_sources/one_dep_unification_across_local_renamings/Move.resolved b/language/tools/move-package/tests/test_sources/one_dep_unification_across_local_renamings/Move.resolved index 358f2e1dea..6a878dfce8 100644 --- a/language/tools/move-package/tests/test_sources/one_dep_unification_across_local_renamings/Move.resolved +++ b/language/tools/move-package/tests/test_sources/one_dep_unification_across_local_renamings/Move.resolved @@ -23,6 +23,7 @@ ResolvedGraph { ), version: None, resolver: None, + overridden_path: false, }, }, always_deps: { @@ -104,7 +105,7 @@ ResolvedGraph { "OtherDep": Internal( InternalDependency { kind: Local( - "./deps_only/other_dep", + "deps_only/other_dep", ), subst: Some( { @@ -115,6 +116,7 @@ ResolvedGraph { ), version: None, digest: None, + dep_override: false, }, ), }, From 9b461a3e06f9bb261eed594c42317ae7c4f1e5e1 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Thu, 30 Mar 2023 16:22:10 -0700 Subject: [PATCH 03/10] Fixed a linting problem --- language/tools/move-package/src/resolution/dependency_graph.rs | 2 +- .../Move.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index 8ed10f1d81..e178e4e582 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -77,7 +77,7 @@ use super::{ /// /// - detect which of the sub-graph's packages need to be overridden (in which case their /// dependencies in the sub-graph no longer should be inserted into the main graph) -///- avoid inserting sub-graph edges into the main dependency graph if they belong to overridden +/// - avoid inserting sub-graph edges into the main dependency graph if they belong to overridden /// packages /// #[derive(Debug, Clone)] diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml index 30594c9b9c..183e027601 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_incorrect_override_v1/Move.toml @@ -9,7 +9,7 @@ # |Root|----| | A | | ADep | # +----+ | +---->+----+ +-->+-------+ # | | | -# | +----+----+ ov(1) | +# | +----+----+ ov(1) | # +---->| B |-------------------+ # +----+ From b9870eddc6782c91102674d64c2df9abe2af5932 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Mon, 17 Apr 2023 17:17:38 +0200 Subject: [PATCH 04/10] Addressing review comments - round one --- .../src/resolution/dependency_graph.rs | 50 +++++++++++-------- .../Move.resolved | 8 +-- .../Move.resolved | 8 +-- .../external_overlap/Move.resolved | 8 +-- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index e178e4e582..12432aa3a8 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -43,8 +43,6 @@ use super::{ /// In order to be `BuildConfig` agnostic, it contains `dev-dependencies` as well as `dependencies` /// and labels edges in the graph accordingly, as `DevOnly`, or `Always` dependencies. /// -/// -/// /// When building a dependency graph, different versions of the same (transitively) dependent /// package can be encountered. If this is indeed the case, a single version must be chosen by the /// developer to be the override, and this override must be specified in a manifest file whose @@ -143,7 +141,7 @@ pub struct ExternalRequest { to: Symbol, resolver: Symbol, pkg_path: PathBuf, - // overrides at the point of external graph insertion + /// overrides at the point of external graph insertion overrides: BTreeMap, } @@ -454,9 +452,15 @@ impl DependencyGraph { Ok(()) } - /// Add the graph in `extension` to `self. Assumes the root of `extension` is the only shared - /// node between the two, and fails if this is not the case. Labels packages coming from - /// `extension` as being resolved by `resolver`. + /// Add the graph in `extension` to `self`. Packages can be shared between the two as long as + /// either: + /// - they are consistent (have the same name and the same set of dependencies) + /// - if a valid override exists for the otherwise conflicting packages + /// + /// Merging starts by creating an edge from the package containing the extension as its + /// dependency (`from`) to the package being the "root" of the extension + /// (`merged_pkg_name`). During merge, packages coming from `extension` are labeled as being + /// resolved by `resolver`. /// /// It is an error to attempt to merge into `self` after its `always_deps` (the set of packages /// that are always transitive dependencies of its root, regardless of mode) has been @@ -498,11 +502,7 @@ impl DependencyGraph { // unwrap safe as the table must have the package if the graph has it let merged_pkg = ext_table.get(&merged_pkg_name).unwrap(); - // unwrap is safe as all edges have a Dependency weight - let merged_dep = ext_graph.edge_weight(from, merged_pkg_name).unwrap(); - self.package_graph - .add_edge(from, merged_pkg_name, merged_dep.clone()); - self.merge_pgk( + self.merge_pkg( merged_pkg.clone(), merged_pkg_name, &ext_graph, @@ -510,11 +510,15 @@ impl DependencyGraph { resolver, overrides, )?; + // unwrap is safe as all edges have a Dependency weight + let merged_dep = ext_graph.edge_weight(from, merged_pkg_name).unwrap(); + self.package_graph + .add_edge(from, merged_pkg_name, merged_dep.clone()); Ok(()) } - fn merge_pgk( + fn merge_pkg( &mut self, mut ext_pkg: Package, ext_name: PM::PackageName, @@ -541,7 +545,7 @@ impl DependencyGraph { } // Seeing the same package in `extension` is OK only if it has the same set of - // dependencies as the existing one.i + // dependencies as the existing one. Entry::Occupied(entry) if entry.get() == &ext_pkg => { let (self_deps, ext_deps) = pkg_deps_equal(ext_name, &self.package_graph, ext_graph); @@ -580,10 +584,7 @@ impl DependencyGraph { for dst in ext_graph.neighbors_directed(ext_name, Direction::Outgoing) { // unwrap safe as the table must have the package if the graph has it let dst_pkg = ext_table.get(&dst).unwrap(); - // unwrap is safe as all edges have a Dependency weight - let ext_dep = ext_graph.edge_weight(ext_name, dst).unwrap(); - self.package_graph.add_edge(ext_name, dst, ext_dep.clone()); - self.merge_pgk( + self.merge_pkg( dst_pkg.clone(), dst, ext_graph, @@ -591,6 +592,9 @@ impl DependencyGraph { resolver, overrides, )?; + // unwrap is safe as all edges have a Dependency weight + let ext_dep = ext_graph.edge_weight(ext_name, dst).unwrap(); + self.package_graph.add_edge(ext_name, dst, ext_dep.clone()); } Ok(()) @@ -677,11 +681,13 @@ impl DependencyGraph { // partition dep into overrides and not let (overridden_deps, deps): (Vec<_>, Vec<_>) = dependencies.iter().partition(|(_, dep)| { - if let PM::Dependency::Internal(d) = dep { - d.dep_override - } else { - false - } + matches!( + dep, + PM::Dependency::Internal(PM::InternalDependency { + dep_override: true, + .. + }) + ) }); // Process overrides first to include them in processing of non-overridden deps. It is diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved index 598c98c804..5d4a38380a 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_no_conflict/Move.resolved @@ -34,14 +34,14 @@ ResolvedGraph { ), ], "A": [ - ( - "Root", - Incoming, - ), ( "ADep", Outgoing, ), + ( + "Root", + Incoming, + ), ], }, package_table: { diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved index 8b093622da..708fb3ca06 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_external_override/Move.resolved @@ -42,14 +42,14 @@ ResolvedGraph { ), ], "A": [ - ( - "Root", - Incoming, - ), ( "ADep", Outgoing, ), + ( + "Root", + Incoming, + ), ], }, package_table: { diff --git a/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved b/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved index e68b03db74..d753660c8d 100644 --- a/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved +++ b/language/tools/move-package/tests/test_sources/external_overlap/Move.resolved @@ -24,14 +24,14 @@ ResolvedGraph { ), ], "A": [ - ( - "Root", - Incoming, - ), ( "ADep", Outgoing, ), + ( + "Root", + Incoming, + ), ], }, package_table: { From aafc6558c7249184703a3a3191120a9b9dc06897 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Thu, 20 Apr 2023 15:10:44 +0200 Subject: [PATCH 05/10] Addressing review comments - round two --- .../src/resolution/dependency_graph.rs | 46 ++++++++++++++----- .../Move.resolved | 1 + .../Move.toml | 27 +++++++++++ .../deps_only/A/Move.toml | 7 +++ .../deps_only/B/Move.toml | 6 +++ .../deps_only/C/Move.toml | 6 +++ .../deps_only/D/Move.toml | 7 +++ .../deps_only/E/Move.toml | 3 ++ 8 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/C/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/E/Move.toml diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index 12432aa3a8..01b6960efe 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -556,8 +556,11 @@ impl DependencyGraph { format_deps("\nNew external dependencies:", ext_deps), ); } - // check if acyclic to avoid infinite recursion + // check if acyclic to avoid infinite recursion - see the + // diamond_problem_dep_incorrect_override_cycle (in tests) for an example of such + // situation self.check_acyclic()?; + // inspect the rest of the graph and report error if a problem is found self.override_verify(&ext_pkg, ext_name, overrides)?; // same package, no reason to process its dependencies return Ok(()); @@ -565,7 +568,9 @@ impl DependencyGraph { Entry::Occupied(mut entry) => { if let Some(overridden_pkg) = overrides.get(&ext_name) { - // override found - use it and return - no reason to process its dependencies + // override found - use it and return - its dependencies have already been + // processed the first time override pkg was processed (before it was inserted + // into overrides set) entry.insert(overridden_pkg.clone()); return Ok(()); } else { @@ -694,13 +699,23 @@ impl DependencyGraph { // important to do so as a dependency override may "prune" portions of a dependency graph // that would otherwise prevent other dependencies from kicking in. In other words, a given // override may be the dominant one only if another override eliminates some graph - // edges. See diamond_problem_dep_transitive_nested_override for an example of such - // situation. + // edges. See diamond_problem_dep_transitive_nested_override for an example (in tests) of + // such situation. // // It's also pretty important that we do not extend overrides with the override being - // currently processed as we have no way of knowing if it's the correct one (dominating all - // package "uses"). If we did, we could override an existing (non-overridden) entry in the - // graph with an incorrect override without being able to detect it. + // currently processed. The reason for it is that in order to detect incorrect overrides + // (such that do not dominate all package "uses") we rely on the package being reachable via + // different paths: + // - if it's reached via an overridden path again for the same override, it's OK + // - if it's reached via an overridden path again for a different override, it's an error + // - if it's reached via a non-overridden path, it's an error (insufficient override) + // + // While the first type of error could still be detected if we injected the currently + // processed override into the overrides set, the second one would not. Consider + // diamond_problem_dep_incorrect_override_occupied example (in tests) to see a situation + // when a non-overridden path is chosen first to insert the package and then insufficient + // override could be considered correct if we injected it into the overrides set (as we will + // not have another path to explore that would disqualify it). let mut local_overrides = BTreeMap::new(); for (to, dep) in overridden_deps { let inserted_pkg = self.extend_with_dep( @@ -919,7 +934,6 @@ impl DependencyGraph { dep_override, }, ); - Ok(inserted_pkg) } @@ -946,8 +960,11 @@ impl DependencyGraph { // package Entry::Occupied(entry) if entry.get() == &pkg => { if entry.get().overridden_path { - // check if acyclic to avoid infinite recursion + // check if acyclic to avoid infinite recursion - see the + // diamond_problem_dep_incorrect_override_cycle (in tests) for an example of + // such situation self.check_acyclic()?; + // inspect the rest of the graph and report error if a problem is found self.override_verify(&pkg, name, overrides)?; } return Ok(pkg); @@ -957,9 +974,11 @@ impl DependencyGraph { // there is an override. Entry::Occupied(mut entry) => { if let Some(overridden_pkg) = overrides.get(&name) { - // override found - use it + // override found - use it and return - its dependencies have already been + // processed the first time override pkg was processed (before it was inserted + // into overrides set) entry.insert(overridden_pkg.clone()); - entry.into_mut() + return Ok(pkg); } else { bail!( "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", @@ -994,6 +1013,11 @@ impl DependencyGraph { Ok(inserted_pkg) } + /// Inspect the rest of the graph by simply following existing nodes and edges. If during + /// inspection we encounter a package inserted as a result of an override but this override is + /// not in the current overrides set (or a different override for the same package is in the + /// overrides set), then the previously used override was incorrect (insufficient) and an error + /// must be reported. fn override_verify( &self, pkg: &Package, diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.resolved new file mode 100644 index 0000000000..91218b07ca --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.resolved @@ -0,0 +1 @@ +Failed to resolve dependencies for package 'Root': Found cycle between packages: D -> B -> C -> D diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml new file mode 100644 index 0000000000..8b4e444a13 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml @@ -0,0 +1,27 @@ +# Dependency graph and and override (ov) - when override is processed there is no entry in the graph +# yet (override is incorrect). This part is the same as in the +# diamond_problem_dep_incorrect_override_empty test. Additionally, a cycle introduced during graph +# construction interferes with part of the algorithm responsible for validating potentially +# incorrect overrides (dependency_graph::override_verify) and if not explicitly handled would +# trigger infinite recursion. +# +# +--------------------------------------------+ +# | | +# +---->+----+ | +# +---->| B |----+ | +# | +----+ | | +# | | | +# +----+ | | +----+ +----+--+ v1 +----+ +# |Root|----+ +---->| C |-------->| D |--------->| E | +# +----+ | | +----+ +----+ +--->+----+ +# | | | +# | +----+----+ ov(2) | +# +---->| A |------------------------------------+ +# +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/A/Move.toml new file mode 100644 index 0000000000..d7457fe927 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/A/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } +E = { local = "../E", version = "2.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/B/Move.toml new file mode 100644 index 0000000000..f3a7a12b0d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/C/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/C/Move.toml new file mode 100644 index 0000000000..af684071a3 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/C/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +D = { local = "../D", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/D/Move.toml new file mode 100644 index 0000000000..70eceb166c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/D/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +B = { local = "../B" } +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" From 2ddd632dee10c204cac02887d0d4b169e40bc9e5 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Thu, 20 Apr 2023 17:47:17 +0200 Subject: [PATCH 06/10] Refactoring and documentation updates --- .../src/resolution/dependency_graph.rs | 217 ++++++++++-------- 1 file changed, 116 insertions(+), 101 deletions(-) diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index 01b6960efe..6bdaa36bc0 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -51,33 +51,20 @@ use super::{ /// /// When constructing the graph (top to bottom) for internal dependencies (external dependencies are /// batch-processed at the end of the graph construction), we maintain a set of the current -/// overrides collected when processing dependencies (starting with an empty set), and do the -/// following when processing a package (starting at root): +/// overrides collected when processing dependencies (starting with an empty set at the root package). /// -/// - process overrides first to collect a list of overrides to be added to the set (if they are not -/// yet in the set - outer overrides "win") and then process non-overridden dependencies using a -/// freshly updated overrides set -/// - when trying to insert a package into the graph, mark it as being on the "override path" if the -/// set of overrides is non-empty: -/// - if no package exists in the graph, insert it -/// - if a conflicting package already exists in the graph, override it if an override can be -/// found in the set (if it does not, report an error) -/// - if the same package already exists in the graph, and this package is on the "override path" -/// keep checking its dependencies to make sure that previously used overrides are correct -/// (dominate all uses of the package) -/// - after a package is fully processed, remove its own overrides from the set. +/// When processing dependencies of a given package, we process overrides first to collect a list of +/// overrides to be added to the set (if they are not yet in the set - outer overrides "win") and +/// then process non-overridden dependencies using a freshly updated overrides set. We use this +/// overrides set when attempting to insert a package into the graph (with an entry for this package +/// already existing or not) via the `process_graph_entry` function. After a package is fully +/// processed, remove its own overrides from the set. /// /// External dependencies are provided by external resolvers as fully formed dependency sub-graphs /// that need to be inserted into the "main" dependency graph being constructed. Whenever an /// external dependency is encountered, it's "recorded" for future batch-processing along with the -/// set of overrides available at the point of sub-graph insertion. When processing an individual -/// sub-graph insertion, we do a depth first search of the subgraph in order to: -/// -/// - detect which of the sub-graph's packages need to be overridden (in which case their -/// dependencies in the sub-graph no longer should be inserted into the main graph) -/// - avoid inserting sub-graph edges into the main dependency graph if they belong to overridden -/// packages -/// +/// set of overrides available at the point of sub-graph insertion, and batch-merged (using `merge` +/// function) after construction of the entire internally resolved graph is completed. #[derive(Debug, Clone)] pub struct DependencyGraph { /// Path to the root package and its name (according to its manifest) @@ -452,15 +439,16 @@ impl DependencyGraph { Ok(()) } - /// Add the graph in `extension` to `self`. Packages can be shared between the two as long as - /// either: + /// A "root" function responsible for adding the graph in `extension` to `self` (the core of the + /// merging process is implemented recursively in the `merge_pkg` function). Packages can be + /// shared between the two as long as either: /// - they are consistent (have the same name and the same set of dependencies) /// - if a valid override exists for the otherwise conflicting packages /// /// Merging starts by creating an edge from the package containing the extension as its /// dependency (`from`) to the package being the "root" of the extension - /// (`merged_pkg_name`). During merge, packages coming from `extension` are labeled as being - /// resolved by `resolver`. + /// (`merged_pkg_name`). During merge, which happens on a per-package basis in the `merge_pkg` + /// functions, packages coming from `extension` are labeled as being resolved by `resolver`. /// /// It is an error to attempt to merge into `self` after its `always_deps` (the set of packages /// that are always transitive dependencies of its root, regardless of mode) has been @@ -518,6 +506,15 @@ impl DependencyGraph { Ok(()) } + /// This function (recursively) merges package from an `extension` graph (resolved by an + /// external resolver) to `self`. The extension graph is traversed in a depth-first fashion in + /// order to: + /// - detect which of the sub-graph's packages need to be overridden (in which case their + /// dependencies in the sub-graph should no longer be inserted into the main graph) + /// - avoid inserting sub-graph edges into the main dependency graph if they belong to + /// overridden packages + /// + /// Similarly to how internally resolved packages are inserted into the graph, fn merge_pkg( &mut self, mut ext_pkg: Package, @@ -539,50 +536,19 @@ impl DependencyGraph { ); } - match self.package_table.entry(ext_name) { - Entry::Vacant(entry) => { - entry.insert(ext_pkg); - } - - // Seeing the same package in `extension` is OK only if it has the same set of - // dependencies as the existing one. - Entry::Occupied(entry) if entry.get() == &ext_pkg => { - let (self_deps, ext_deps) = - pkg_deps_equal(ext_name, &self.package_graph, ext_graph); - if self_deps != ext_deps { - bail!( - "Conflicting dependencies found for '{ext_name}' during external resolution by '{resolver}':\n{}{}", - format_deps("\nExternal dependencies not found:", self_deps), - format_deps("\nNew external dependencies:", ext_deps), - ); - } - // check if acyclic to avoid infinite recursion - see the - // diamond_problem_dep_incorrect_override_cycle (in tests) for an example of such - // situation - self.check_acyclic()?; - // inspect the rest of the graph and report error if a problem is found - self.override_verify(&ext_pkg, ext_name, overrides)?; - // same package, no reason to process its dependencies - return Ok(()); - } - - Entry::Occupied(mut entry) => { - if let Some(overridden_pkg) = overrides.get(&ext_name) { - // override found - use it and return - its dependencies have already been - // processed the first time override pkg was processed (before it was inserted - // into overrides set) - entry.insert(overridden_pkg.clone()); - return Ok(()); - } else { - bail!( - "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", - ext_name, - PackageWithResolverTOML(entry.get()), - PackageWithResolverTOML(&ext_pkg), - ); - } - } - }; + if self + .process_graph_entry( + &ext_pkg, + ext_name, + overrides, + Some(ext_graph), + Some(resolver), + )? + .is_some() + { + // existing entry was found + return Ok(()); + } // if we are here, it means that a new package has been inserted into the graph - we need to // process its dependencies and add appropriate edges to them @@ -950,24 +916,93 @@ impl DependencyGraph { overrides: &mut BTreeMap, progress_output: &mut Progress, ) -> Result { - let pkg = match self.package_table.entry(name) { - Entry::Vacant(entry) => entry.insert(pkg), + if let Some(existing_entry) = self.process_graph_entry( + &pkg, name, overrides, /* external_subgraph */ None, /* resolver */ None, + )? { + // existing entry was found + return Ok(existing_entry); + } + // a package has been inserted into the graph - process its dependencies + + dependency_cache + .download_and_update_if_remote(name, &pkg.kind, progress_output) + .with_context(|| format!("Fetching '{}'", name))?; + + let pkg_path = self.root_path.join(local_path(&pkg.kind)); + let manifest = parse_move_manifest_from_file(&pkg_path) + .with_context(|| format!("Parsing manifest for '{}'", name))?; + + let inserted_pkg = pkg.clone(); + let kind = pkg.kind.clone(); + self.extend_graph( + &kind, + &manifest, + &pkg_path, + dependency_cache, + external_requests, + overrides, + progress_output, + ) + .with_context(|| format!("Resolving dependencies for package '{}'", name))?; + Ok(inserted_pkg) + } + + /// This function attempts to insert a newly encountered package to the graph which may or may + /// not already contain an entry for the same package name: + /// - if no package exists in the graph, insert it + /// - if a conflicting package already exists in the graph, override it if an override can be + /// found in the set (if it does not, report an error) + /// - if the same package already exists in the graph, and this package is on the "override + /// path" keep checking its dependencies to make sure that previously used overrides are + /// correct (dominate all uses of the package); a package is marked to be on the "override + /// path" if it is inserted into the graph while the overrides set is non-empty making this + /// mark into a pretty coarse indicator of whether portions of the graph need to be + /// (re)validated + fn process_graph_entry( + &mut self, + pkg: &Package, + name: PM::PackageName, + overrides: &BTreeMap, + external_subgraph: Option<&DiGraphMap>, + resolver: Option, + ) -> Result> { + match self.package_table.entry(name) { + Entry::Vacant(entry) => { + entry.insert(pkg.clone()); + Ok(None) + } // Seeing the same package again, pointing to the same dependency: OK, return early but // only if seeing a package that was not on an "override path" (was created when no // override was active); otherwise we need to keep inspecting the graph to make sure // that the overrides introduced on this path correctly dominate all "uses" of a given // package - Entry::Occupied(entry) if entry.get() == &pkg => { + Entry::Occupied(entry) if entry.get() == pkg => { + if let Some(ext_graph) = external_subgraph { + // when trying to insert a package into the graph as part of merging an external + // subgraph it's not enough to check for package equality as it does not capture + // dependencies that may differ between the internally and externally resolved + // packages. + let (self_deps, ext_deps) = + pkg_deps_equal(name, &self.package_graph, ext_graph); + if self_deps != ext_deps { + bail!( + "Conflicting dependencies found for '{name}' during external resolution by '{}':\n{}{}", + resolver.unwrap(), // safe because external_subgraph exists + format_deps("\nExternal dependencies not found:", self_deps), + format_deps("\nNew external dependencies:", ext_deps), + ); + } + } if entry.get().overridden_path { // check if acyclic to avoid infinite recursion - see the // diamond_problem_dep_incorrect_override_cycle (in tests) for an example of // such situation self.check_acyclic()?; // inspect the rest of the graph and report error if a problem is found - self.override_verify(&pkg, name, overrides)?; + self.override_verify(pkg, name, overrides)?; } - return Ok(pkg); + Ok(Some(pkg.clone())) } // Seeing the same package again, but pointing to a different dependency: Not OK unless @@ -977,40 +1012,20 @@ impl DependencyGraph { // override found - use it and return - its dependencies have already been // processed the first time override pkg was processed (before it was inserted // into overrides set) - entry.insert(overridden_pkg.clone()); - return Ok(pkg); + if overridden_pkg != entry.get() { + entry.insert(overridden_pkg.clone()); + } + Ok(Some(overridden_pkg.clone())) } else { bail!( "Conflicting dependencies found:\n{0} = {1}\n{0} = {2}", name, PackageWithResolverTOML(entry.get()), - PackageWithResolverTOML(&pkg), + PackageWithResolverTOML(pkg), ); } } - }; - - dependency_cache - .download_and_update_if_remote(name, &pkg.kind, progress_output) - .with_context(|| format!("Fetching '{}'", name))?; - - let pkg_path = self.root_path.join(local_path(&pkg.kind)); - let manifest = parse_move_manifest_from_file(&pkg_path) - .with_context(|| format!("Parsing manifest for '{}'", name))?; - - let inserted_pkg = pkg.clone(); - let kind = pkg.kind.clone(); - self.extend_graph( - &kind, - &manifest, - &pkg_path, - dependency_cache, - external_requests, - overrides, - progress_output, - ) - .with_context(|| format!("Resolving dependencies for package '{}'", name))?; - Ok(inserted_pkg) + } } /// Inspect the rest of the graph by simply following existing nodes and edges. If during From 2672c711981090b6e357a83bf2a75a94334d5e86 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Fri, 21 Apr 2023 09:49:08 +0200 Subject: [PATCH 07/10] Finessed some comments --- .../src/resolution/dependency_graph.rs | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index 6bdaa36bc0..a7c51d0a10 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -62,9 +62,9 @@ use super::{ /// /// External dependencies are provided by external resolvers as fully formed dependency sub-graphs /// that need to be inserted into the "main" dependency graph being constructed. Whenever an -/// external dependency is encountered, it's "recorded" for future batch-processing along with the -/// set of overrides available at the point of sub-graph insertion, and batch-merged (using `merge` -/// function) after construction of the entire internally resolved graph is completed. +/// external dependency is encountered, it's "recorded" along with the set of overrides available at +/// the point of sub-graph insertion, and batch-merged (using the `merge` function) after +/// construction of the entire internally resolved graph is completed. #[derive(Debug, Clone)] pub struct DependencyGraph { /// Path to the root package and its name (according to its manifest) @@ -446,9 +446,10 @@ impl DependencyGraph { /// - if a valid override exists for the otherwise conflicting packages /// /// Merging starts by creating an edge from the package containing the extension as its - /// dependency (`from`) to the package being the "root" of the extension - /// (`merged_pkg_name`). During merge, which happens on a per-package basis in the `merge_pkg` - /// functions, packages coming from `extension` are labeled as being resolved by `resolver`. + /// dependency (`from` argument) to the package being the "root" of the extension + /// (`merged_pkg_name` argument). During merge, which happens on a per-package basis in the + /// `merge_pkg` function, packages coming from `extension` are labeled as being resolved by + /// `resolver`. /// /// It is an error to attempt to merge into `self` after its `always_deps` (the set of packages /// that are always transitive dependencies of its root, regardless of mode) has been @@ -506,15 +507,12 @@ impl DependencyGraph { Ok(()) } - /// This function (recursively) merges package from an `extension` graph (resolved by an - /// external resolver) to `self`. The extension graph is traversed in a depth-first fashion in - /// order to: - /// - detect which of the sub-graph's packages need to be overridden (in which case their - /// dependencies in the sub-graph should no longer be inserted into the main graph) - /// - avoid inserting sub-graph edges into the main dependency graph if they belong to - /// overridden packages - /// - /// Similarly to how internally resolved packages are inserted into the graph, + /// Recursively merge package from an `extension` graph (resolved by an external resolver) to + /// `self`. The extension graph is traversed in a depth-first manner, successively adding + /// packages and their connecting edges to `self` via the `process_graph_entry` + /// function. Additionally, during traversal the algorithm detects which of the sub-graph's + /// packages need to be overridden (in which case their dependencies in `extension` should no + /// longer be inserted into `self`). fn merge_pkg( &mut self, mut ext_pkg: Package, @@ -637,6 +635,8 @@ impl DependencyGraph { Ok(()) } + /// Iterate over the set of a given package's dependencies (overridden dependencies first). to + /// add them to the dependency graph. fn extend_with_dependencies( &mut self, mode: DependencyMode, @@ -726,6 +726,7 @@ impl DependencyGraph { Ok(()) } + /// Extend the dependency graph with a single dependent package. fn extend_with_dep( &mut self, mode: DependencyMode, @@ -903,10 +904,10 @@ impl DependencyGraph { Ok(inserted_pkg) } - /// Ensures that package `pkg_name` and all its transitive dependencies are present in the - /// graph, all sourced from their respective packages, `pkg`. Fails if any of the packages in - /// the dependency sub-graph rooted at `pkg_name` are already present in `self` but sourced from - /// a different dependency. + /// Ensure that package `pkg_name` and all its transitive dependencies are present in the graph, + /// all sourced from their respective packages, `pkg`. Fails if any of the packages in the + /// dependency sub-graph rooted at `pkg_name` are already present in `self` but sourced from a + /// different dependency. fn process_dependency( &mut self, pkg: Package, @@ -947,17 +948,16 @@ impl DependencyGraph { Ok(inserted_pkg) } - /// This function attempts to insert a newly encountered package to the graph which may or may - /// not already contain an entry for the same package name: + /// Attempt to insert a newly encountered package to the graph which may or may not already + /// contain an entry for the same package name: /// - if no package exists in the graph, insert it /// - if a conflicting package already exists in the graph, override it if an override can be /// found in the set (if it does not, report an error) /// - if the same package already exists in the graph, and this package is on the "override /// path" keep checking its dependencies to make sure that previously used overrides are /// correct (dominate all uses of the package); a package is marked to be on the "override - /// path" if it is inserted into the graph while the overrides set is non-empty making this - /// mark into a pretty coarse indicator of whether portions of the graph need to be - /// (re)validated + /// path" if it is inserted into the graph while the overrides set is non-empty, making this + /// mark into a coarse indicator of whether portions of the graph need to be (re)validated. fn process_graph_entry( &mut self, pkg: &Package, @@ -1028,7 +1028,7 @@ impl DependencyGraph { } } - /// Inspect the rest of the graph by simply following existing nodes and edges. If during + /// Inspect a portion of the graph by simply following existing nodes and edges. If during /// inspection we encounter a package inserted as a result of an override but this override is /// not in the current overrides set (or a different override for the same package is in the /// overrides set), then the previously used override was incorrect (insufficient) and an error @@ -1319,8 +1319,7 @@ fn format_deps(msg: &str, dependencies: Vec<(&Dependency, PM::PackageName)>) -> s } -/// Checks if dependencies of a given package in two different dependency graph maps are the -/// same. +/// Check if dependencies of a given package in two different dependency graph maps are the same. fn pkg_deps_equal<'a>( pkg_name: Symbol, pkg_graph: &'a DiGraphMap, From 97267a8f32ee5bb7b6c298a09c4e6e2d3acf79b1 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Fri, 21 Apr 2023 14:35:54 +0200 Subject: [PATCH 08/10] Added more tests and updated comments --- .../src/resolution/dependency_graph.rs | 5 + .../Move.toml | 2 +- .../Move.toml | 6 +- .../Move.resolved | 433 ++++++++++++++++++ .../diamond_problem_dep_with_deps/Move.toml | 28 ++ .../deps_only/A/Move.toml | 8 + .../deps_only/B/Move.toml | 6 + .../deps_only/C1/Move.toml | 6 + .../deps_only/C2/Move.toml | 6 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 3 + .../#Move.toml# | 27 ++ .../.#Move.toml | 1 + .../Move.resolved | 3 + .../Move.toml | 27 ++ .../deps_only/A/Move.toml | 8 + .../deps_only/B/Move.toml | 6 + .../deps_only/C1/Move.toml | 6 + .../deps_only/C2/Move.toml | 6 + .../deps_only/D/Move.toml | 6 + .../deps_only/E/Move.toml | 3 + 21 files changed, 598 insertions(+), 4 deletions(-) create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C1/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C2/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/E/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# create mode 120000 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.resolved create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/A/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/B/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C1/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C2/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/D/Move.toml create mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/E/Move.toml diff --git a/language/tools/move-package/src/resolution/dependency_graph.rs b/language/tools/move-package/src/resolution/dependency_graph.rs index a7c51d0a10..b1ed96cf9c 100644 --- a/language/tools/move-package/src/resolution/dependency_graph.rs +++ b/language/tools/move-package/src/resolution/dependency_graph.rs @@ -968,6 +968,11 @@ impl DependencyGraph { ) -> Result> { match self.package_table.entry(name) { Entry::Vacant(entry) => { + // Note that we simply insert a dependent package here without checking the + // overrides set. The reason for it is that if there was an override for this entry, + // it would have already been inserted as the overrides are processed before + // non-overridden dependencies (and only after they are processed, the overrides set + // is populated). entry.insert(pkg.clone()); Ok(None) } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml index 8b4e444a13..61b7959a76 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_incorrect_override_cycle/Move.toml @@ -1,4 +1,4 @@ -# Dependency graph and and override (ov) - when override is processed there is no entry in the graph +# Dependency graph and override (ov) - when override is processed there is no entry in the graph # yet (override is incorrect). This part is the same as in the # diamond_problem_dep_incorrect_override_empty test. Additionally, a cycle introduced during graph # construction interferes with part of the algorithm responsible for validating potentially diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml index bb77bfee7c..953ff7046e 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_nested_conflict/Move.toml @@ -12,9 +12,9 @@ # |Root|----+ +---->| E |------+ | # +----+ | +----+ | | # | v1 | | -# | +----+ +---+ v3 +----+<-----+ | -# +---->| B +---->| D |---------->| G | v2 | -# +----+ +---+ +----+<-------------+ +# | +----+ +----+ v3 +----+<-----+ | +# +---->| B +---->| D |--------->| G | v2 | +# +----+ +----+ +----+<-------------+ [package] name = "Root" version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.resolved new file mode 100644 index 0000000000..a64bf95bb5 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.resolved @@ -0,0 +1,433 @@ +ResolvedGraph { + graph: DependencyGraph { + root_path: "tests/test_sources/diamond_problem_dep_with_deps", + root_package: "Root", + package_graph: { + "Root": [ + ( + "C", + Outgoing, + ), + ( + "A", + Outgoing, + ), + ( + "B", + Outgoing, + ), + ], + "C": [ + ( + "E", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ( + "A", + Incoming, + ), + ( + "B", + Incoming, + ), + ], + "E": [ + ( + "C", + Incoming, + ), + ( + "A", + Incoming, + ), + ( + "D", + Incoming, + ), + ], + "A": [ + ( + "E", + Outgoing, + ), + ( + "C", + Outgoing, + ), + ( + "D", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + "D": [ + ( + "E", + Outgoing, + ), + ( + "A", + Incoming, + ), + ], + "B": [ + ( + "C", + Outgoing, + ), + ( + "Root", + Incoming, + ), + ], + }, + package_table: { + "A": Package { + kind: Local( + "deps_only/A", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "B": Package { + kind: Local( + "deps_only/B", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "C": Package { + kind: Local( + "deps_only/C2", + ), + version: None, + resolver: None, + overridden_path: false, + }, + "D": Package { + kind: Local( + "deps_only/D", + ), + version: None, + resolver: None, + overridden_path: true, + }, + "E": Package { + kind: Local( + "deps_only/E", + ), + version: Some( + ( + 1, + 0, + 0, + ), + ), + resolver: None, + overridden_path: false, + }, + }, + always_deps: { + "A", + "B", + "C", + "D", + "E", + "Root", + }, + }, + build_options: BuildConfig { + dev_mode: true, + test_mode: false, + generate_docs: false, + generate_abis: false, + install_dir: Some( + "ELIDED_FOR_TEST", + ), + force_recompilation: false, + lock_file: Some( + "ELIDED_FOR_TEST", + ), + additional_named_addresses: {}, + architecture: None, + fetch_deps_only: false, + skip_fetch_latest_git_deps: false, + }, + package_table: { + "A": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "A", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C1", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "D": Internal( + InternalDependency { + kind: Local( + "../D", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "B": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "B", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "C": Internal( + InternalDependency { + kind: Local( + "../C2", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "C": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "C", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "D": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "D", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "E": Internal( + InternalDependency { + kind: Local( + "../E", + ), + subst: None, + version: Some( + ( + 1, + 0, + 0, + ), + ), + digest: None, + dep_override: false, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "E": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "E", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: {}, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + "Root": Package { + source_package: SourceManifest { + package: PackageInfo { + name: "Root", + version: ( + 0, + 0, + 0, + ), + authors: [], + license: None, + custom_properties: {}, + }, + addresses: None, + dev_address_assignments: None, + build: None, + dependencies: { + "A": Internal( + InternalDependency { + kind: Local( + "deps_only/A", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "B": Internal( + InternalDependency { + kind: Local( + "deps_only/B", + ), + subst: None, + version: None, + digest: None, + dep_override: false, + }, + ), + "C": Internal( + InternalDependency { + kind: Local( + "deps_only/C2", + ), + subst: None, + version: None, + digest: None, + dep_override: true, + }, + ), + }, + dev_dependencies: {}, + }, + package_path: "ELIDED_FOR_TEST", + renaming: {}, + resolved_table: {}, + source_digest: "ELIDED_FOR_TEST", + }, + }, +} diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml new file mode 100644 index 0000000000..14bef30d0d --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml @@ -0,0 +1,28 @@ +# Dependency graph and two overrides - one correct one (in Root) and the other one insufficient (in +# A). The correct override eliminates C1's dependency on E's version 2 and the insufficient override +# becomes unnecessary as the graph becomes consistent with all remaining dependencies on package E +# are for version 1. +# +# +----+ v2 +# +---->| C1 |-------+ +# | +----+ | +# | | +# +----+ | ov(1) | +# +---->| A |-----+--------------+ | +# | +----+ | | | +# | | | +->+----+ +# +----+ | ov(2) | +----+ v1 +----->| | +# |Root|----+-------------+ +-->| D |----------->| E | +# +----+ | | +----+ | | +# | | +----->+----+ +# | +----+ +->+----+ v1 | +# +---->| B |---->| C2 |---------+ +# +----+ +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C2", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/A/Move.toml new file mode 100644 index 0000000000..ab5f1f86b0 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/A/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C1" } +D = { local = "../D" } +E = { local = "../E", version = "1.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/B/Move.toml new file mode 100644 index 0000000000..50872e3a6b --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C2" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C1/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C1/Move.toml new file mode 100644 index 0000000000..9c1c69cb1f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C1/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C2/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C2/Move.toml new file mode 100644 index 0000000000..5aa35b1ac8 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/C2/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/D/Move.toml new file mode 100644 index 0000000000..3904311160 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# new file mode 100644 index 0000000000..ca540f3c4b --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# @@ -0,0 +1,27 @@ +# Dependency graph - conflicting dependencies. Even though override in Root eliminates C1's +# dependency on E's version 2, we still have a conflicting dependency on E from A, which is an +# override, but an insufficient one. +# +# +----+ v2 +# +---->| C1 |-------+ +# | +----+ | +# | | +# +----+ | ov(3) | +# +---->| A |-----+--------------+ | +# | +----+ | | | +# | | | +->+----+ +# +----+ | ov(2) | +----+ v1 +----->| | +# |Root|----+-------------+ +-->| D |----------->| E | +# +----+ | | +----+ | | +# | | +----->+----+ +# | +----+ +->+----+ v1 | +# +---->| B |---->| C2 |---------+ +# +----+ +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C2", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml new file mode 120000 index 0000000000..5217175dbb --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml @@ -0,0 +1 @@ +adamwelc@Adams-Laptop.local.85810 \ No newline at end of file diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.resolved b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.resolved new file mode 100644 index 0000000000..371d9f642f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.resolved @@ -0,0 +1,3 @@ +Failed to resolve dependencies for package 'Root': Resolving dependencies for package 'A': Conflicting dependencies found: +E = { local = "deps_only/E", version = "1.0.0" } +E = { local = "deps_only/E", version = "3.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml new file mode 100644 index 0000000000..1ac1a5787c --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml @@ -0,0 +1,27 @@ +# Dependency graph - conflicting dependencies. Even though, we eliminate C1's dependency on E's +# version 2, we still have a conflicting dependency on E from A, which is an override, but an +# insufficient one. +# +# +----+ v2 +# +---->| C1 |-------+ +# | +----+ | +# | | +# +----+ | ov(3) | +# +---->| A |-----+--------------+ | +# | +----+ | | | +# | | | +->+----+ +# +----+ | ov(2) | +----+ v1 +----->| | +# |Root|----+-------------+ +-->| D |----------->| E | +# +----+ | | +----+ | | +# | | +----->+----+ +# | +----+ +->+----+ v1 | +# +---->| B |---->| C2 |---------+ +# +----+ +----+ +[package] +name = "Root" +version = "0.0.0" + +[dependencies] +A = { local = "./deps_only/A" } +B = { local = "./deps_only/B" } +C = { local = "./deps_only/C2", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/A/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/A/Move.toml new file mode 100644 index 0000000000..5de29dc255 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/A/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "A" +version = "0.0.0" + +[dependencies] +C = { local = "../C1" } +D = { local = "../D" } +E = { local = "../E", version = "3.0.0", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/B/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/B/Move.toml new file mode 100644 index 0000000000..50872e3a6b --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/B/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "B" +version = "0.0.0" + +[dependencies] +C = { local = "../C2" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C1/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C1/Move.toml new file mode 100644 index 0000000000..9c1c69cb1f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C1/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "2.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C2/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C2/Move.toml new file mode 100644 index 0000000000..5aa35b1ac8 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/C2/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "C" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/D/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/D/Move.toml new file mode 100644 index 0000000000..3904311160 --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/D/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "D" +version = "0.0.0" + +[dependencies] +E = { local = "../E", version = "1.0.0" } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/E/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/E/Move.toml new file mode 100644 index 0000000000..dc97c6690f --- /dev/null +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/deps_only/E/Move.toml @@ -0,0 +1,3 @@ +[package] +name = "E" +version = "0.0.0" From 371296b005a5707068353b7b78343c12bb2bbaba Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Fri, 21 Apr 2023 15:00:37 +0200 Subject: [PATCH 09/10] Removed accidentally added temp files --- .../#Move.toml# | 27 ------------------- .../.#Move.toml | 1 - 2 files changed, 28 deletions(-) delete mode 100644 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# delete mode 120000 language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# deleted file mode 100644 index ca540f3c4b..0000000000 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/#Move.toml# +++ /dev/null @@ -1,27 +0,0 @@ -# Dependency graph - conflicting dependencies. Even though override in Root eliminates C1's -# dependency on E's version 2, we still have a conflicting dependency on E from A, which is an -# override, but an insufficient one. -# -# +----+ v2 -# +---->| C1 |-------+ -# | +----+ | -# | | -# +----+ | ov(3) | -# +---->| A |-----+--------------+ | -# | +----+ | | | -# | | | +->+----+ -# +----+ | ov(2) | +----+ v1 +----->| | -# |Root|----+-------------+ +-->| D |----------->| E | -# +----+ | | +----+ | | -# | | +----->+----+ -# | +----+ +->+----+ v1 | -# +---->| B |---->| C2 |---------+ -# +----+ +----+ -[package] -name = "Root" -version = "0.0.0" - -[dependencies] -A = { local = "./deps_only/A" } -B = { local = "./deps_only/B" } -C = { local = "./deps_only/C2", override = true } diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml deleted file mode 120000 index 5217175dbb..0000000000 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/.#Move.toml +++ /dev/null @@ -1 +0,0 @@ -adamwelc@Adams-Laptop.local.85810 \ No newline at end of file From fa8a38f1cea23c9199952e6b70e0f2fe10eae207 Mon Sep 17 00:00:00 2001 From: Adam Welc Date: Fri, 21 Apr 2023 15:07:00 +0200 Subject: [PATCH 10/10] Fixed linting errors --- .../diamond_problem_dep_with_deps/Move.toml | 4 ++-- .../diamond_problem_dep_with_deps_conflict/Move.toml | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml index 14bef30d0d..40d7b75ce2 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps/Move.toml @@ -15,9 +15,9 @@ # |Root|----+-------------+ +-->| D |----------->| E | # +----+ | | +----+ | | # | | +----->+----+ -# | +----+ +->+----+ v1 | +# | +----+ +->+----+ v1 | # +---->| B |---->| C2 |---------+ -# +----+ +----+ +# +----+ +----+ [package] name = "Root" version = "0.0.0" diff --git a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml index 1ac1a5787c..8df8419ef0 100644 --- a/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml +++ b/language/tools/move-package/tests/test_sources/diamond_problem_dep_with_deps_conflict/Move.toml @@ -1,6 +1,6 @@ -# Dependency graph - conflicting dependencies. Even though, we eliminate C1's dependency on E's -# version 2, we still have a conflicting dependency on E from A, which is an override, but an -# insufficient one. +# Dependency graph - conflicting dependencies. Even though override in Root eliminates C1's +# dependency on E's version 2, we still have a conflicting dependency on E from A, which is an +# override, but an insufficient one. # # +----+ v2 # +---->| C1 |-------+ @@ -14,9 +14,9 @@ # |Root|----+-------------+ +-->| D |----------->| E | # +----+ | | +----+ | | # | | +----->+----+ -# | +----+ +->+----+ v1 | +# | +----+ +->+----+ v1 | # +---->| B |---->| C2 |---------+ -# +----+ +----+ +# +----+ +----+ [package] name = "Root" version = "0.0.0"