#[cfg(feature = "serialized_git")]
extern crate git2;
#[cfg(feature = "serialized_version")]
extern crate semver;
#[cfg(feature = "serialized_time")]
extern crate time;
#[cfg(feature = "serialized_version")]
use std::iter;
#[cfg(feature = "serialized_git")]
use std::path;
#[cfg(feature = "serialized_version")]
type VersionParser<'a> = fn(&'a (&'a str, &'a str)) -> (&'a str, semver::Version);
#[cfg(feature = "serialized_version")]
pub fn parse_versions<'a, T>(
name_and_versions: T,
) -> iter::Map<<T as iter::IntoIterator>::IntoIter, VersionParser<'a>>
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) -> time::Tm {
time::strptime(s, "%a, %d %b %Y %T GMT").unwrap()
}
#[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())
}