use std;
use std::path::Path;
use crate::config::{Locked, LockedPackage, LockedSource, PrefixPaths};
use crate::debugln;
use crate::error::*;
pub fn read_lockfile(path: &Path, root_dir: &Path) -> Result<Locked> {
debugln!("read_lockfile: {:?}", path);
use std::fs::File;
let file = File::open(path)
.map_err(|cause| Error::chain(format!("Cannot open lockfile {:?}.", path), cause))?;
let locked_loaded: Result<Locked> = serde_yaml_ng::from_reader(file)
.map_err(|cause| Error::chain(format!("Syntax error in lockfile {:?}.", path), cause));
Ok(Locked {
packages: locked_loaded?
.packages
.iter()
.map(|pack| {
Ok(if let LockedSource::Path(path) = &pack.1.source {
(
pack.0.clone(),
LockedPackage {
source: LockedSource::Path(if path.is_relative() {
path.clone().prefix_paths(root_dir)?
} else {
path.clone()
}),
..pack.1.clone()
},
)
} else {
(pack.0.clone(), pack.1.clone())
})
})
.collect::<Result<_>>()?,
})
}
pub fn write_lockfile(locked: &Locked, path: &Path, root_dir: &Path) -> Result<()> {
debugln!("write_lockfile: {:?}", path);
let adapted_locked = Locked {
packages: locked
.packages
.iter()
.map(|pack| {
if let LockedSource::Path(path) = &pack.1.source {
(
pack.0.clone(),
LockedPackage {
source: LockedSource::Path(
path.strip_prefix(root_dir).unwrap_or(path).to_path_buf(),
),
..pack.1.clone()
},
)
} else {
(pack.0.clone(), pack.1.clone())
}
})
.collect(),
};
use std::fs::File;
let file = File::create(path)
.map_err(|cause| Error::chain(format!("Cannot create lockfile {:?}.", path), cause))?;
serde_yaml_ng::to_writer(file, &adapted_locked)
.map_err(|cause| Error::chain(format!("Cannot write lockfile {:?}.", path), cause))?;
Ok(())
}