From af450513bad20789234982f55d4b57e95ee055e1 Mon Sep 17 00:00:00 2001 From: Kyryl R Date: Tue, 25 Aug 2026 16:30:55 +0300 Subject: [PATCH 1/2] general: bump simplicityhl and align hashing with last release of simplex --- Cargo.lock | 4 +-- Cargo.toml | 2 +- src/project/mod.rs | 29 ++++++++++++---- src/project/tests.rs | 83 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 108 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 08aeda3..5de94e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -928,9 +928,9 @@ dependencies = [ [[package]] name = "simplicityhl" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc05eac7d1f37bfbc182566b4dc2f377be783e2f53a193d833fa27392f004898" +checksum = "6e9483a06afd760e341a3770dc0be007d61a0978c12353dc215ca9f39edd9efc" dependencies = [ "ariadne", "base64", diff --git a/Cargo.toml b/Cargo.toml index 37921e1..4deb70f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ thiserror = "2.0.17" ropey = "1.6.1" miniscript = "12" -simplicityhl = { version = "0.7.0", features = ["docs"] } +simplicityhl = { version = "0.7.1", features = ["docs"] } nom = "8.0.0" [dev-dependencies] diff --git a/src/project/mod.rs b/src/project/mod.rs index d3b5709..7e86f43 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -48,7 +48,9 @@ pub enum ProjectError { }, #[error("Configured Simplex manifest was not found at `{0}`")] MissingConfiguredManifest(PathBuf), - #[error("Dependency `{name}` in `{manifest}` must set exactly one of `path` or `git`")] + #[error( + "Dependency `{name}` in `{manifest}` must set exactly one of `path` or `git`; `path` cannot use `rev`/`tag`, and `git` may set at most one of them" + )] InvalidDependency { name: String, manifest: PathBuf }, #[error("Git dependency `{name}` from `{url}` is not installed at `{expected}`")] MissingGitDependency { @@ -90,6 +92,8 @@ impl Default for BuildConfig { struct DependencyConfig { path: Option, git: Option, + rev: Option, + tag: Option, } struct ProjectCollector { @@ -305,9 +309,22 @@ impl ProjectCollector { package_root: &Path, ) -> Result { match (&dependency.path, &dependency.git) { - (Some(path), None) => canonicalize(&package_root.join(path)), + (Some(path), None) if dependency.rev.is_none() && dependency.tag.is_none() => { + canonicalize(&package_root.join(path)) + } (None, Some(url)) => { - let relative = hashed_repository_path(url)?; + let reference = match (&dependency.rev, &dependency.tag) { + (None, None) => None, + (Some(rev), None) => Some(rev.as_str()), + (None, Some(tag)) => Some(tag.as_str()), + (Some(_), Some(_)) => { + return Err(ProjectError::InvalidDependency { + name: name.to_string(), + manifest: package_root.join(SIMPLEX_MANIFEST), + }); + } + }; + let relative = hashed_repository_path(url, reference)?; let expected = self .install_root .join(DEFAULT_DEPENDENCY_DIRECTORY) @@ -318,7 +335,7 @@ impl ProjectCollector { expected, }) } - (Some(_), Some(_)) | (None, None) => Err(ProjectError::InvalidDependency { + (_, None) | (Some(_), Some(_)) => Err(ProjectError::InvalidDependency { name: name.to_string(), manifest: package_root.join(SIMPLEX_MANIFEST), }), @@ -421,7 +438,7 @@ pub fn find_manifest(path: &Path) -> Option { start.ancestors().find_map(manifest_in) } -fn hashed_repository_path(url: &str) -> Result { +fn hashed_repository_path(url: &str, reference: Option<&str>) -> Result { let clean_url = url.strip_suffix(".git").unwrap_or(url); let repository_name = clean_url .split('/') @@ -430,7 +447,7 @@ fn hashed_repository_path(url: &str) -> Result { .ok_or_else(|| ProjectError::InvalidGitUrl(url.to_string()))?; let mut hasher = DefaultHasher::new(); - url.hash(&mut hasher); + format!("{url}@{}", reference.unwrap_or("HEAD")).hash(&mut hasher); Ok(PathBuf::from(format!( "{repository_name}-{:016x}", hasher.finish() diff --git a/src/project/tests.rs b/src/project/tests.rs index 45474e4..7876802 100644 --- a/src/project/tests.rs +++ b/src/project/tests.rs @@ -103,7 +103,13 @@ fn resolves_simplex_git_install_directory_exactly() { let temp = TempDir::new().unwrap(); let root = temp.path(); let url = "https://github.com/BlockstreamResearch/simplicityhl-std"; - let installed = root.join("deps").join(hashed_repository_path(url).unwrap()); + let installed = root + .join("deps") + .join(hashed_repository_path(url, None).unwrap()); + assert_eq!( + installed.file_name().unwrap(), + "simplicityhl-std-8bc347cc4ed271da" + ); write( &root.join(SIMPLEX_MANIFEST), &format!("[dependencies]\nstd = {{ git = '{url}' }}\n"), @@ -125,6 +131,81 @@ fn resolves_simplex_git_install_directory_exactly() { ); } +#[test] +fn resolves_simplex_git_install_directories_for_revision_and_tag() { + for (field, reference, expected_directory) in [ + ("rev", "deadbeef", "simplicityhl-std-c7c631fb6d854c6d"), + ("tag", "v1.2.3", "simplicityhl-std-38569687e465cad1"), + ] { + let temp = TempDir::new().unwrap(); + let root = temp.path(); + let url = "https://github.com/BlockstreamResearch/simplicityhl-std"; + let installed = root + .join("deps") + .join(hashed_repository_path(url, Some(reference)).unwrap()); + assert_eq!(installed.file_name().unwrap(), expected_directory); + write( + &root.join(SIMPLEX_MANIFEST), + &format!("[dependencies]\nstd = {{ git = '{url}', {field} = '{reference}' }}\n"), + ); + write(&root.join("simf/main.simf"), "fn main() {}\n"); + write(&installed.join(SIMPLEX_MANIFEST), ""); + write(&installed.join("simf/lib.simf"), "pub fn helper() {}\n"); + + let context = ProjectContext::discover( + &root.join("simf/main.simf"), + &ProjectSettings::default(), + &[root.to_path_buf()], + ) + .unwrap(); + + assert_eq!( + context.import_root(&root.join("simf/main.simf"), "std"), + Some(fs::canonicalize(installed.join("simf")).unwrap().as_path()) + ); + } +} + +#[test] +fn rejects_conflicting_simplex_git_references() { + let temp = TempDir::new().unwrap(); + let root = temp.path(); + write( + &root.join(SIMPLEX_MANIFEST), + "[dependencies]\nstd = { git = 'https://example.com/std', rev = 'deadbeef', tag = 'v1' }\n", + ); + write(&root.join("simf/main.simf"), "fn main() {}\n"); + + let error = ProjectContext::discover( + &root.join("simf/main.simf"), + &ProjectSettings::default(), + &[root.to_path_buf()], + ) + .unwrap_err(); + + assert!(matches!(error, ProjectError::InvalidDependency { .. })); +} + +#[test] +fn rejects_git_references_on_path_dependencies() { + let temp = TempDir::new().unwrap(); + let root = temp.path(); + write( + &root.join(SIMPLEX_MANIFEST), + "[dependencies]\nstd = { path = 'vendor/std', rev = 'deadbeef' }\n", + ); + write(&root.join("simf/main.simf"), "fn main() {}\n"); + + let error = ProjectContext::discover( + &root.join("simf/main.simf"), + &ProjectSettings::default(), + &[root.to_path_buf()], + ) + .unwrap_err(); + + assert!(matches!(error, ProjectError::InvalidDependency { .. })); +} + #[test] fn manual_mapping_overrides_manifest_mapping() { let temp = TempDir::new().unwrap(); From 4a5d10ebd7ed54f5287c944eda84fc07bb43ed00 Mon Sep 17 00:00:00 2001 From: Kyryl R Date: Tue, 25 Aug 2026 16:34:08 +0300 Subject: [PATCH 2/2] general: bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5de94e4..84721a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -948,7 +948,7 @@ dependencies = [ [[package]] name = "simplicityhl-lsp" -version = "0.7.3" +version = "0.7.4" dependencies = [ "env_logger", "miniscript", diff --git a/Cargo.toml b/Cargo.toml index 4deb70f..69846bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simplicityhl-lsp" -version = "0.7.3" +version = "0.7.4" edition = "2021" rust-version = "1.85.0" description = "Language Server Protocol (LSP) server for SimplicityHL."