mod document;
mod metadata;
pub use document::{
PackageMetadata, Release, ensure_releases_section, recent_releases, update_document,
update_document_with_releases, update_releases_section,
};
pub mod readme {
use bake::{Context, Error, Result};
use std::fs;
use std::io::Write;
use std::path::PathBuf;
use super::{metadata::read_project_package, recent_releases, update_document_with_releases};
#[bake::task]
pub fn update(
context: &mut Context,
#[bake(
default = "readme.md",
help = "readme file relative to the project root."
)]
path: PathBuf,
) -> Result<()> {
let path = context.root().join(path).canonicalize()?;
let document = fs::read_to_string(&path)
.map_err(|error| Error::new(format!("{}: {error}", path.display())))?;
let package = read_project_package(context)?;
let release_path = context.root().join("releases.md");
let releases = if release_path.is_file() {
let release_document = fs::read_to_string(&release_path)
.map_err(|error| Error::new(format!("{}: {error}", release_path.display())))?;
recent_releases(&release_document)
} else {
Vec::new()
};
let updated = update_document_with_releases(&document, package.as_ref(), &releases);
if updated == document {
return Ok(());
}
let directory = path
.parent()
.ok_or_else(|| Error::new("readme file has no parent directory"))?;
let mut temporary = tempfile::NamedTempFile::new_in(directory)?;
temporary.write_all(updated.as_bytes())?;
temporary
.as_file()
.set_permissions(fs::metadata(&path)?.permissions())?;
temporary.as_file().sync_all()?;
temporary
.persist(&path)
.map_err(|error| Error::from(error.error))?;
Ok(())
}
}