feat(solc): make cache entries relative to root dir (#1307)
* feat(solc): make cache entries relative to root dir * chore: update CHANGELOG
This commit is contained in:
parent
37f3df5234
commit
95862bc62c
|
@ -95,6 +95,8 @@
|
||||||
|
|
||||||
### Unreleased
|
### Unreleased
|
||||||
|
|
||||||
|
- Save cache entry objects with relative paths
|
||||||
|
[#1307](https://github.com/gakonst/ethers-rs/pull/1307)
|
||||||
- Bundle svm, svm-builds and sha2 dependencies in new `svm-solc` feature
|
- Bundle svm, svm-builds and sha2 dependencies in new `svm-solc` feature
|
||||||
[#1071](https://github.com/gakonst/ethers-rs/pull/1071)
|
[#1071](https://github.com/gakonst/ethers-rs/pull/1071)
|
||||||
- Emit artifact files for source files without any ContractDefinition
|
- Emit artifact files for source files without any ContractDefinition
|
||||||
|
|
|
@ -104,7 +104,12 @@ impl SolFilesCache {
|
||||||
Ok(cache)
|
Ok(cache)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Reads the cache json file from the given path and returns the cache with modified paths
|
/// Reads the cache json file from the given path and returns the cache with paths adjoined to
|
||||||
|
/// the `ProjectPathsConfig`.
|
||||||
|
///
|
||||||
|
/// This expects the `artifact` files to be relative to the artifacts dir of the `paths` and the
|
||||||
|
/// `CachEntry` paths to be relative to the root dir of the `paths`
|
||||||
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
|
@ -120,7 +125,7 @@ impl SolFilesCache {
|
||||||
/// ```
|
/// ```
|
||||||
pub fn read_joined(paths: &ProjectPathsConfig) -> Result<Self> {
|
pub fn read_joined(paths: &ProjectPathsConfig) -> Result<Self> {
|
||||||
let mut cache = SolFilesCache::read(&paths.cache)?;
|
let mut cache = SolFilesCache::read(&paths.cache)?;
|
||||||
cache.join_artifacts_files(&paths.artifacts);
|
cache.join_entries(&paths.root).join_artifacts_files(&paths.artifacts);
|
||||||
Ok(cache)
|
Ok(cache)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +144,26 @@ impl SolFilesCache {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the `CacheEntry`'s file paths to `root` adjoined to `self.file`.
|
||||||
|
pub fn join_entries(&mut self, root: impl AsRef<Path>) -> &mut Self {
|
||||||
|
let root = root.as_ref();
|
||||||
|
self.files = std::mem::take(&mut self.files)
|
||||||
|
.into_iter()
|
||||||
|
.map(|(path, entry)| (root.join(path), entry))
|
||||||
|
.collect();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Removes `base` from all `CacheEntry` paths
|
||||||
|
pub fn strip_entries_prefix(&mut self, base: impl AsRef<Path>) -> &mut Self {
|
||||||
|
let base = base.as_ref();
|
||||||
|
self.files = std::mem::take(&mut self.files)
|
||||||
|
.into_iter()
|
||||||
|
.map(|(path, entry)| (path.strip_prefix(base).map(Into::into).unwrap_or(path), entry))
|
||||||
|
.collect();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the artifact files location to `base` adjoined to the `CachEntries` artifacts.
|
/// Sets the artifact files location to `base` adjoined to the `CachEntries` artifacts.
|
||||||
pub fn join_artifacts_files(&mut self, base: impl AsRef<Path>) -> &mut Self {
|
pub fn join_artifacts_files(&mut self, base: impl AsRef<Path>) -> &mut Self {
|
||||||
let base = base.as_ref();
|
let base = base.as_ref();
|
||||||
|
@ -182,7 +207,7 @@ impl SolFilesCache {
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// fn t() {
|
/// # fn t() {
|
||||||
/// use ethers_solc::artifacts::contract::CompactContract;
|
/// use ethers_solc::artifacts::contract::CompactContract;
|
||||||
/// use ethers_solc::cache::SolFilesCache;
|
/// use ethers_solc::cache::SolFilesCache;
|
||||||
/// use ethers_solc::Project;
|
/// use ethers_solc::Project;
|
||||||
|
@ -934,10 +959,13 @@ impl<'a, T: ArtifactOutput> ArtifactsCache<'a, T> {
|
||||||
cache
|
cache
|
||||||
.extend(dirty_source_files.into_iter().map(|(file, (entry, _))| (file, entry)));
|
.extend(dirty_source_files.into_iter().map(|(file, (entry, _))| (file, entry)));
|
||||||
|
|
||||||
cache.strip_artifact_files_prefixes(project.artifacts_path());
|
|
||||||
|
|
||||||
// write to disk
|
// write to disk
|
||||||
if write_to_disk {
|
if write_to_disk {
|
||||||
|
// make all `CacheEntry` paths relative to the project root and all artifact
|
||||||
|
// paths relative to the artifact's directory
|
||||||
|
cache
|
||||||
|
.strip_entries_prefix(project.root())
|
||||||
|
.strip_artifact_files_prefixes(project.artifacts_path());
|
||||||
cache.write(project.cache_path())?;
|
cache.write(project.cache_path())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1708,3 +1708,65 @@ fn can_parse_notice() {
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_relative_cache_entries() {
|
||||||
|
let project = TempProject::dapptools().unwrap();
|
||||||
|
let _a = project
|
||||||
|
.add_source(
|
||||||
|
"A",
|
||||||
|
r#"
|
||||||
|
pragma solidity ^0.8.10;
|
||||||
|
contract A { }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let _b = project
|
||||||
|
.add_source(
|
||||||
|
"B",
|
||||||
|
r#"
|
||||||
|
pragma solidity ^0.8.10;
|
||||||
|
contract B { }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let _c = project
|
||||||
|
.add_source(
|
||||||
|
"C",
|
||||||
|
r#"
|
||||||
|
pragma solidity ^0.8.10;
|
||||||
|
contract C { }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let _d = project
|
||||||
|
.add_source(
|
||||||
|
"D",
|
||||||
|
r#"
|
||||||
|
pragma solidity ^0.8.10;
|
||||||
|
contract D { }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let compiled = project.compile().unwrap();
|
||||||
|
println!("{}", compiled);
|
||||||
|
assert!(!compiled.has_compiler_errors());
|
||||||
|
|
||||||
|
let cache = SolFilesCache::read(project.cache_path()).unwrap();
|
||||||
|
|
||||||
|
let entries = vec![
|
||||||
|
PathBuf::from("src/A.sol"),
|
||||||
|
PathBuf::from("src/B.sol"),
|
||||||
|
PathBuf::from("src/C.sol"),
|
||||||
|
PathBuf::from("src/D.sol"),
|
||||||
|
];
|
||||||
|
assert_eq!(entries, cache.files.keys().cloned().collect::<Vec<_>>());
|
||||||
|
|
||||||
|
let cache = SolFilesCache::read_joined(project.paths()).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
entries.into_iter().map(|p| project.root().join(p)).collect::<Vec<_>>(),
|
||||||
|
cache.files.keys().cloned().collect::<Vec<_>>()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue