fn write_revset_and_delta()

in rust-create-cascade/src/main.rs [576:625]


fn write_revset_and_delta(
    output_delta_dir: &Path,
    output_revset_file: &Path,
    prev_revset_file: &Path,
    revoked_dir: &Path,
    known_dir: &Path,
    reason_set: ReasonSet,
    statsd_client: Option<&statsd::Client>,
) {
    let prev_revset: HashSet<Vec<u8>> = match std::fs::read(prev_revset_file)
        .as_deref()
        .map(bincode::deserialize)
    {
        Ok(Ok(prev_revset)) => prev_revset,
        _ => {
            warn!("Could not load previous revset. Stash file will be large.");
            Default::default()
        }
    };
    let mut revset: HashSet<Vec<u8>> = HashSet::new();

    for pair in list_issuer_file_pairs(revoked_dir, known_dir).iter() {
        if let (issuer, Some(revoked_file), known_file) = pair {
            let issuer_bytes = decode_issuer(issuer.to_str().expect("non-unicode issuer string"));
            let revoked_serials: HashMap<Serial, Reason> =
                RevokedSerialAndReasonIterator::new(revoked_file, reason_set).into();
            let known_revoked_serials = KnownSerialIterator::new(known_file)
                .filter_map(|(_expiry, serial)| revoked_serials.get_key_value(&serial));
            let mut per_issuer_delta_file = File::create(output_delta_dir.join(issuer))
                .expect("could not create per-issuer delta file");
            for (serial, reason) in known_revoked_serials {
                let serial_bytes = decode_serial(serial);
                let key = crlite_key(&issuer_bytes, &serial_bytes);
                if !prev_revset.contains(&key) {
                    writeln!(per_issuer_delta_file, "{:02x}{}", (*reason) as u8, serial)
                        .expect("Could not write delta entry");
                }
                revset.insert(key);
            }
        }
    }

    let revset_bytes = bincode::serialize(&revset).unwrap();
    info!("Revset is {} bytes", revset_bytes.len());
    std::fs::write(output_revset_file, &revset_bytes).expect("can't write revset file");

    if let Some(client) = statsd_client {
        client.gauge("revset_size", revset_bytes.len() as f64);
    }
}