9
9
extern crate serde_derive;
10
10
11
11
extern crate cargo_registry;
12
+ extern crate chrono;
12
13
extern crate curl;
13
14
extern crate diesel;
14
15
extern crate docopt;
15
16
extern crate flate2;
17
+ extern crate itertools;
16
18
extern crate s3;
17
19
extern crate tar;
18
20
extern crate time;
19
21
extern crate toml;
20
22
extern crate url;
21
23
22
24
use curl:: easy:: { Easy , List } ;
25
+ use chrono:: { Utc , TimeZone } ;
23
26
use diesel:: prelude:: * ;
27
+ use diesel:: expression:: any;
24
28
use docopt:: Docopt ;
25
29
use flate2:: read:: GzDecoder ;
30
+ use itertools:: Itertools ;
26
31
use std:: io:: { Cursor , Read } ;
27
32
use std:: path:: Path ;
28
33
use std:: thread;
@@ -33,19 +38,21 @@ use cargo_registry::{Config, Version};
33
38
use cargo_registry:: schema:: * ;
34
39
use cargo_registry:: render:: markdown_to_html;
35
40
36
- const DEFAULT_PAGE_SIZE : i64 = 25 ;
41
+ const DEFAULT_PAGE_SIZE : usize = 25 ;
37
42
const USAGE : & ' static str = "
38
43
Usage: render-readmes [options]
39
44
render-readmes --help
40
45
41
46
Options:
42
47
-h, --help Show this message.
43
48
--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.
44
50
" ;
45
51
46
52
#[ derive( Deserialize ) ]
47
53
struct Args {
48
- flag_page_size : Option < i64 > ,
54
+ flag_page_size : Option < usize > ,
55
+ flag_older_than : Option < String > ,
49
56
}
50
57
51
58
fn main ( ) {
@@ -54,25 +61,50 @@ fn main() {
54
61
. unwrap_or_else ( |e| e. exit ( ) ) ;
55
62
let config: Config = Default :: default ( ) ;
56
63
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
- ) ;
60
64
61
- let page_size = args . flag_page_size . unwrap_or ( DEFAULT_PAGE_SIZE ) ;
65
+ let start_time = Utc :: now ( ) ;
62
66
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" )
65
70
} else {
66
- versions_count / page_size + 1
71
+ start_time
67
72
} ;
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
70
102
. inner_join ( crates:: table)
103
+ . filter ( versions:: id. eq ( any ( ids) ) )
71
104
. select ( ( versions:: all_columns, crates:: name) )
72
- . limit ( page_size)
73
- . offset ( current_page * page_size)
74
105
. load :: < ( Version , String ) > ( & conn)
75
106
. expect ( "error loading versions" ) ;
107
+
76
108
let mut tasks = Vec :: with_capacity ( page_size as usize ) ;
77
109
for ( version, krate_name) in versions {
78
110
let config = config. clone ( ) ;
0 commit comments