#[cfg(feature = "serialized_time")]
extern crate chrono;
#[cfg(feature = "serialized_git")]
extern crate git2;
#[cfg(feature = "serialized_version")]
extern crate semver;
#[cfg(feature = "serialized_git")]
use std::path;
#[cfg(feature = "serialized_version")]
pub fn parse_versions<'a, T>(
name_and_versions: T,
) -> impl Iterator<Item = (&'a str, semver::Version)>
where
T: IntoIterator<Item = &'a (&'a str, &'a str)>,
{
fn parse_version<'a>(t: &'a (&'a str, &'a str)) -> (&'a str, semver::Version) {
(t.0, t.1.parse().unwrap())
}
name_and_versions.into_iter().map(parse_version)
}
#[cfg(feature = "serialized_time")]
pub fn strptime(s: &str) -> chrono::DateTime<chrono::offset::Utc> {
chrono::DateTime::parse_from_rfc2822(s)
.unwrap()
.with_timezone(&chrono::offset::Utc)
}
#[cfg(feature = "serialized_git")]
pub fn get_repo_description<P: AsRef<path::Path>>(root: P) -> Result<Option<String>, git2::Error> {
match git2::Repository::discover(root) {
Ok(repo) => {
let mut desc_opt = git2::DescribeOptions::new();
desc_opt.describe_tags().show_commit_oid_as_fallback(true);
Ok(Some(
repo.describe(&desc_opt)
.and_then(|desc| desc.format(None))?,
))
}
Err(ref e)
if e.class() == git2::ErrorClass::Repository
&& e.code() == git2::ErrorCode::NotFound =>
{
Ok(None)
}
Err(e) => Err(e),
}
}
pub fn detect_ci() -> Option<super::CIPlatform> {
super::CIPlatform::detect_from_envmap(&super::get_environment())
}