git_perf/
measurement_storage.rs1use 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 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 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}