git_perf/
measurement_storage.rs

1use anyhow::{Context, Result};
2use itertools::Itertools;
3use std::{
4    collections::HashMap,
5    time::{SystemTime, UNIX_EPOCH},
6};
7
8use chrono::prelude::*;
9
10use crate::{
11    config,
12    data::MeasurementData,
13    defaults,
14    git::git_interop::{add_note_line, resolve_committish},
15    serialization::{serialize_multiple, serialize_single, DELIMITER},
16};
17
18pub fn add_multiple_to_commit(
19    commit: &str,
20    measurement: &str,
21    values: &[f64],
22    key_values: &[(String, String)],
23) -> Result<()> {
24    // Validate commit exists
25    let resolved_commit =
26        resolve_committish(commit).context(format!("Failed to resolve commit '{}'", commit))?;
27
28    let timestamp = SystemTime::now()
29        .duration_since(UNIX_EPOCH)
30        .context("Failed to get system time")?;
31
32    let timestamp = timestamp.as_secs_f64();
33    let key_values: HashMap<_, _> = key_values.iter().cloned().collect();
34    let epoch = config::determine_epoch_from_config(measurement).unwrap_or(defaults::DEFAULT_EPOCH);
35    let name = measurement.to_owned();
36
37    let mds = values
38        .iter()
39        .map(|&val| MeasurementData {
40            epoch,
41            name: name.clone(),
42            timestamp,
43            val,
44            key_values: key_values.clone(),
45        })
46        .collect_vec();
47
48    let serialized = serialize_multiple(&mds);
49
50    add_note_line(&resolved_commit, &serialized)?;
51
52    Ok(())
53}
54
55pub fn add_multiple(
56    measurement: &str,
57    values: &[f64],
58    key_values: &[(String, String)],
59) -> Result<()> {
60    let head =
61        crate::git::git_interop::get_head_revision().context("Failed to get HEAD revision")?;
62    add_multiple_to_commit(&head, measurement, values, key_values)
63}
64
65pub fn add_to_commit(
66    commit: &str,
67    measurement: &str,
68    value: f64,
69    key_values: &[(String, String)],
70) -> Result<()> {
71    // Validate commit exists
72    let resolved_commit =
73        resolve_committish(commit).context(format!("Failed to resolve commit '{}'", commit))?;
74
75    let timestamp = SystemTime::now()
76        .duration_since(UNIX_EPOCH)
77        .context("Failed to get system time")?;
78
79    let timestamp = timestamp.as_secs_f64();
80    let key_values: HashMap<_, _> = key_values.iter().cloned().collect();
81
82    let md = MeasurementData {
83        epoch: config::determine_epoch_from_config(measurement).unwrap_or(defaults::DEFAULT_EPOCH),
84        name: measurement.to_owned(),
85        timestamp,
86        val: value,
87        key_values,
88    };
89
90    let serialized = serialize_single(&md, DELIMITER);
91
92    add_note_line(&resolved_commit, &serialized)?;
93
94    Ok(())
95}
96
97pub fn add(measurement: &str, value: f64, key_values: &[(String, String)]) -> Result<()> {
98    let head =
99        crate::git::git_interop::get_head_revision().context("Failed to get HEAD revision")?;
100    add_to_commit(&head, measurement, value, key_values)
101}
102
103pub fn remove_measurements_from_commits(
104    older_than: DateTime<Utc>,
105    prune: bool,
106    dry_run: bool,
107) -> Result<()> {
108    crate::git::git_interop::remove_measurements_from_commits(older_than, prune, dry_run)
109}