fix(solc): do not overwrite existing cache (#629)
previously if 1 file changed, it'd overwrite the existing cache on disk with just that 1 changed file. this change reads the cache from disk and merges it with the new checksums
This commit is contained in:
parent
e1476a1156
commit
7bb90935ed
|
@ -1190,6 +1190,7 @@ dependencies = [
|
||||||
"tempdir",
|
"tempdir",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tracing",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ use crate::{
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{
|
use std::{
|
||||||
collections::BTreeMap,
|
collections::BTreeMap,
|
||||||
fs,
|
fs::{self, File},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
time::{Duration, UNIX_EPOCH},
|
time::{Duration, UNIX_EPOCH},
|
||||||
};
|
};
|
||||||
|
@ -36,7 +36,7 @@ impl SolFilesCache {
|
||||||
/// use ethers_solc::artifacts::Source;
|
/// use ethers_solc::artifacts::Source;
|
||||||
/// use ethers_solc::cache::SolFilesCache;
|
/// use ethers_solc::cache::SolFilesCache;
|
||||||
/// let files = Source::read_all_from("./sources").unwrap();
|
/// let files = Source::read_all_from("./sources").unwrap();
|
||||||
/// let config = SolFilesCache::builder().insert_files(files).unwrap();
|
/// let config = SolFilesCache::builder().insert_files(files, None).unwrap();
|
||||||
/// ```
|
/// ```
|
||||||
pub fn builder() -> SolFilesCacheBuilder {
|
pub fn builder() -> SolFilesCacheBuilder {
|
||||||
SolFilesCacheBuilder::default()
|
SolFilesCacheBuilder::default()
|
||||||
|
@ -200,7 +200,7 @@ impl SolFilesCacheBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_files(self, sources: Sources) -> Result<SolFilesCache> {
|
pub fn insert_files(self, sources: Sources, dest: Option<PathBuf>) -> Result<SolFilesCache> {
|
||||||
let format = self.format.unwrap_or_else(|| HH_FORMAT_VERSION.to_string());
|
let format = self.format.unwrap_or_else(|| HH_FORMAT_VERSION.to_string());
|
||||||
let solc_config =
|
let solc_config =
|
||||||
self.solc_config.map(Ok).unwrap_or_else(|| SolcConfig::builder().build())?;
|
self.solc_config.map(Ok).unwrap_or_else(|| SolcConfig::builder().build())?;
|
||||||
|
@ -234,7 +234,23 @@ impl SolFilesCacheBuilder {
|
||||||
files.insert(file, entry);
|
files.insert(file, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(SolFilesCache { format, files })
|
let cache = if let Some(ref dest) = dest {
|
||||||
|
if dest.exists() {
|
||||||
|
// read the existing cache and extend it by the files that changed
|
||||||
|
// (if we just wrote to the cache file, we'd overwrite the existing data)
|
||||||
|
let reader = std::io::BufReader::new(File::open(dest)?);
|
||||||
|
let mut cache: SolFilesCache = serde_json::from_reader(reader)?;
|
||||||
|
assert_eq!(cache.format, format);
|
||||||
|
cache.files.extend(files);
|
||||||
|
cache
|
||||||
|
} else {
|
||||||
|
SolFilesCache { format, files }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SolFilesCache { format, files }
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(cache)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ impl<Artifacts: ArtifactOutput> Project<Artifacts> {
|
||||||
let mut cache = SolFilesCache::builder()
|
let mut cache = SolFilesCache::builder()
|
||||||
.root(&self.paths.root)
|
.root(&self.paths.root)
|
||||||
.solc_config(self.solc_config.clone())
|
.solc_config(self.solc_config.clone())
|
||||||
.insert_files(sources)?;
|
.insert_files(sources, Some(self.paths.cache.clone()))?;
|
||||||
|
|
||||||
// add the artifacts for each file to the cache entry
|
// add the artifacts for each file to the cache entry
|
||||||
for (file, artifacts) in artifacts {
|
for (file, artifacts) in artifacts {
|
||||||
|
|
Loading…
Reference in New Issue