Lines
52.38 %
Functions
15.79 %
use crate::git_signatures::{check_signatures, get_signatures};
use git2::Repository;
use sequoia_openpgp::Cert;
use serde::Serialize;
use std::collections::BTreeSet;
type Result<T> = anyhow::Result<T>;
#[derive(Serialize, PartialEq)]
pub struct RepositoryAnalysis {
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
signatures: BTreeSet<SignatureAnalysis>,
missing_keys: BTreeSet<String>,
}
#[derive(Serialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct SignatureAnalysis {
handle: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
email: Vec<String>,
pub fn analyze_repository(certs: &[Cert], repo: &Repository) -> Result<RepositoryAnalysis> {
let signatures = get_signatures(repo)?;
let r = check_signatures(certs, signatures)?;
let mut signature_analyses = BTreeSet::new();
for key in r.found_keys {
let mut analysis = SignatureAnalysis {
handle: format!("{}", key.0),
email: Vec::new(),
};
for id in key.1.userids() {
if let Ok(Some(email)) = id.email_normalized() {
analysis.email.push(email);
signature_analyses.insert(analysis);
Ok(RepositoryAnalysis {
signatures: signature_analyses,
missing_keys: r.missing_keys.iter().map(|k| format!("{}", k)).collect(),
})