Skip to content

Commit ff7545f

Browse files
authored
Merge pull request #48 from dtolnay/findtimestamp
Add examples/find-timestamp.rs
2 parents 7524b60 + 3dc3e48 commit ff7545f

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

examples/find-timestamp.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//! $ cargo run --release --example find-timestamp -- 2023-01-13T23:42:25.800721Z
2+
//! Reverse lookup what crate got published at a particular time. Useful for
3+
//! attributing discontinuities in a `cargo tally` graph.
4+
5+
use chrono::DateTime;
6+
use db_dump::crates::CrateId;
7+
use semver::Version;
8+
use std::collections::BTreeMap as Map;
9+
use std::env;
10+
use std::io::{self, Write as _};
11+
use std::process;
12+
13+
fn main() -> db_dump::Result<()> {
14+
let mut query = Vec::new();
15+
for arg in env::args_os().skip(1) {
16+
let arg = arg.to_str().unwrap();
17+
let datetime = DateTime::parse_from_rfc3339(arg).unwrap();
18+
query.push(datetime.to_utc());
19+
}
20+
21+
if query.is_empty() {
22+
let _ = writeln!(
23+
io::stderr(),
24+
"Usage: cargo run --release --example find-timestamp -- 2023-01-13T23:42:25.800721Z",
25+
);
26+
process::exit(1);
27+
}
28+
29+
let mut crates: Map<CrateId, String> = Map::new();
30+
let mut versions: Vec<(CrateId, Version)> = Vec::new();
31+
db_dump::Loader::new()
32+
.crates(|row| {
33+
crates.insert(row.id, row.name);
34+
})
35+
.versions(|row| {
36+
if query.contains(&row.created_at) {
37+
versions.push((row.crate_id, row.num));
38+
}
39+
})
40+
.load("./db-dump.tar.gz")?;
41+
42+
for (crate_id, version) in versions {
43+
println!("{} v{}", crates[&crate_id], version);
44+
}
45+
46+
Ok(())
47+
}

0 commit comments

Comments
 (0)