Skip to content

Commit d4e7c32

Browse files
committed
Render readmes earlier than a particular time to enable restarting
1 parent 89eb251 commit d4e7c32

File tree

4 files changed

+51
-14
lines changed

4 files changed

+51
-14
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ chrono = "0.4.0"
5151
pulldown-cmark = { version = "0.0.15", default-features = false }
5252
ammonia = "0.5.0"
5353
docopt = "0.8.1"
54+
itertools = "0.6.0"
5455

5556
conduit = "0.8"
5657
conduit-conditional-get = "0.8"

src/bin/render-readmes.rs

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,25 @@
99
extern crate serde_derive;
1010

1111
extern crate cargo_registry;
12+
extern crate chrono;
1213
extern crate curl;
1314
extern crate diesel;
1415
extern crate docopt;
1516
extern crate flate2;
17+
extern crate itertools;
1618
extern crate s3;
1719
extern crate tar;
1820
extern crate time;
1921
extern crate toml;
2022
extern crate url;
2123

2224
use curl::easy::{Easy, List};
25+
use chrono::{Utc, TimeZone};
2326
use diesel::prelude::*;
27+
use diesel::expression::any;
2428
use docopt::Docopt;
2529
use flate2::read::GzDecoder;
30+
use itertools::Itertools;
2631
use std::io::{Cursor, Read};
2732
use std::path::Path;
2833
use std::thread;
@@ -33,19 +38,21 @@ use cargo_registry::{Config, Version};
3338
use cargo_registry::schema::*;
3439
use cargo_registry::render::markdown_to_html;
3540

36-
const DEFAULT_PAGE_SIZE: i64 = 25;
41+
const DEFAULT_PAGE_SIZE: usize = 25;
3742
const USAGE: &'static str = "
3843
Usage: render-readmes [options]
3944
render-readmes --help
4045
4146
Options:
4247
-h, --help Show this message.
4348
--page-size NUM How many versions should be queried and processed at a time.
49+
--older-than DATE Only rerender readmes that are older than this date.
4450
";
4551

4652
#[derive(Deserialize)]
4753
struct Args {
48-
flag_page_size: Option<i64>,
54+
flag_page_size: Option<usize>,
55+
flag_older_than: Option<String>,
4956
}
5057

5158
fn main() {
@@ -54,25 +61,50 @@ fn main() {
5461
.unwrap_or_else(|e| e.exit());
5562
let config: Config = Default::default();
5663
let conn = cargo_registry::db::connect_now().unwrap();
57-
let versions_count = versions::table.count().get_result::<i64>(&conn).expect(
58-
"error counting versions",
59-
);
6064

61-
let page_size = args.flag_page_size.unwrap_or(DEFAULT_PAGE_SIZE);
65+
let start_time = Utc::now();
6266

63-
let pages = if versions_count % page_size == 0 {
64-
versions_count / page_size
67+
let older_than = if let Some(ref time) = args.flag_older_than {
68+
Utc.datetime_from_str(&time, "%Y-%m-%d %H:%M:%S")
69+
.expect("Could not parse --older-than argument as a time")
6570
} else {
66-
versions_count / page_size + 1
71+
start_time
6772
};
68-
for current_page in 0..pages {
69-
let versions: Vec<(Version, String)> = versions::table
73+
let older_than = older_than.naive_utc();
74+
75+
println!("Start time: {}", start_time);
76+
println!("Rendering readmes older than: {}", older_than);
77+
78+
let version_ids = versions::table
79+
.inner_join(readme_rendering::table)
80+
.filter(readme_rendering::rendered_at.lt(older_than))
81+
.select(versions::id)
82+
.load::<(i32)>(&conn)
83+
.expect("error loading version ids");
84+
85+
let total_versions = version_ids.len();
86+
println!("Rendering {} versions", total_versions);
87+
88+
let page_size = args.flag_page_size.unwrap_or(DEFAULT_PAGE_SIZE);
89+
90+
let total_pages = total_versions / page_size;
91+
let total_pages = if total_versions % page_size == 0 { total_pages } else { total_pages + 1 };
92+
93+
let mut page_num = 0;
94+
95+
for version_ids_chunk in &version_ids.into_iter().chunks(page_size) {
96+
page_num += 1;
97+
println!("= Page {} of {} ==================================", page_num, total_pages);
98+
99+
let ids: Vec<_> = version_ids_chunk.collect();
100+
101+
let versions = versions::table
70102
.inner_join(crates::table)
103+
.filter(versions::id.eq(any(ids)))
71104
.select((versions::all_columns, crates::name))
72-
.limit(page_size)
73-
.offset(current_page * page_size)
74105
.load::<(Version, String)>(&conn)
75106
.expect("error loading versions");
107+
76108
let mut tasks = Vec::with_capacity(page_size as usize);
77109
for (version, krate_name) in versions {
78110
let config = config.clone();

src/version.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use util::errors::CargoError;
2424
use util::{RequestUtils, CargoResult, human};
2525
use license_exprs;
2626

27+
// Queryable has a custom implementation below
2728
#[derive(Clone, Identifiable, Associations, Debug)]
2829
#[belongs_to(Crate)]
2930
pub struct Version {
@@ -71,8 +72,10 @@ pub struct VersionLinks {
7172
pub authors: String,
7273
}
7374

74-
#[derive(Insertable, Debug, Clone, Copy)]
75+
#[derive(Insertable, Identifiable, Queryable, Associations, Debug, Clone, Copy)]
76+
#[belongs_to(Version)]
7577
#[table_name = "readme_rendering"]
78+
#[primary_key(version_id)]
7679
struct ReadmeRendering {
7780
version_id: i32,
7881
rendered_at: Timespec,

0 commit comments

Comments
 (0)