@@ -2,7 +2,7 @@ use enum_map::{Enum, EnumMap};
2
2
use serde_derive:: { Deserialize , Serialize } ;
3
3
use tokio:: sync:: Mutex ;
4
4
use tokio:: task:: { spawn_blocking, JoinSet } ;
5
- use tracing:: { debug, info , trace } ;
5
+ use tracing:: debug;
6
6
7
7
use crate :: config:: Config ;
8
8
use std:: collections:: BTreeMap ;
@@ -31,64 +31,66 @@ pub struct Repo {
31
31
pub has_cargo_lock : bool ,
32
32
}
33
33
34
- #[ derive( Debug , Clone ) ]
35
- pub struct Data {
34
+ #[ derive( Debug ) ]
35
+ pub struct InnerData {
36
36
data_dir : PathBuf ,
37
37
38
- state_lock : Arc < Mutex < ( ) > > ,
38
+ state_lock : Mutex < ( ) > ,
39
39
40
- state_cache : Arc < State > ,
40
+ state_cache : State ,
41
41
42
- repos_state : Arc < Mutex < EnumMap < Forge , BTreeMap < String , Repo > > > > ,
42
+ repos_state : Mutex < EnumMap < Forge , BTreeMap < String , Repo > > > ,
43
43
}
44
44
45
+ #[ derive( Debug , Clone ) ]
46
+ pub struct Data ( Arc < InnerData > ) ;
47
+
45
48
impl Data {
46
49
pub fn new ( config : & Config ) -> color_eyre:: Result < Self > {
47
50
fs:: create_dir_all ( & config. data_dir ) ?;
48
51
49
- let mut data = Data {
50
- data_dir : config. data_dir . clone ( ) ,
51
-
52
- state_lock : Arc :: new ( Mutex :: new ( ( ) ) ) ,
53
- state_cache : Arc :: new ( State :: default ( ) ) ,
54
- repos_state : Arc :: new ( Mutex :: new ( EnumMap :: default ( ) ) ) ,
52
+ let state_path = config. data_dir . join ( "state.json" ) ;
53
+ let state_cache = if state_path. exists ( ) {
54
+ serde_json:: from_slice ( & fs:: read ( & state_path) ?) ?
55
+ } else {
56
+ State :: default ( )
55
57
} ;
56
58
57
- let state_path = data. state_path ( ) ;
58
- if state_path. exists ( ) {
59
- let state_cache: State = serde_json:: from_slice ( & fs:: read ( & state_path) ?) ?;
59
+ let data = Self ( Arc :: new ( InnerData {
60
+ data_dir : config. data_dir . clone ( ) ,
60
61
61
- data. state_cache = Arc :: new ( state_cache)
62
- }
62
+ state_lock : Mutex :: new ( ( ) ) ,
63
+ state_cache,
64
+ repos_state : Mutex :: new ( EnumMap :: default ( ) ) ,
65
+ } ) ) ;
63
66
64
67
Ok ( data)
65
68
}
66
69
67
70
pub fn state_path ( & self ) -> PathBuf {
68
- self . data_dir . join ( "state.json" )
71
+ self . 0 . data_dir . join ( "state.json" )
69
72
}
70
73
71
74
pub fn csv_path ( & self , forge : Forge ) -> PathBuf {
72
75
match forge {
73
- Forge :: Github => self . data_dir . join ( "github.csv" ) ,
76
+ Forge :: Github => self . 0 . data_dir . join ( "github.csv" ) ,
74
77
}
75
78
}
76
79
77
80
pub fn get_last_id ( & self , forge : Forge ) -> usize {
78
- self . state_cache . 0 [ forge] . load ( std:: sync:: atomic:: Ordering :: SeqCst )
81
+ self . 0 . state_cache . 0 [ forge] . load ( std:: sync:: atomic:: Ordering :: SeqCst )
79
82
}
80
83
81
84
/// Store the state cache to disk, i.e. last fetched ids
82
85
async fn store_state_cache ( & self ) -> color_eyre:: Result < ( ) > {
83
- let state = self . state_cache . clone ( ) ;
84
- let lock = self . state_lock . clone ( ) ;
86
+ let this = self . clone ( ) ;
85
87
let state_path = self . state_path ( ) ;
86
88
spawn_blocking ( move || -> color_eyre:: Result < ( ) > {
87
- let guard = lock . blocking_lock ( ) ;
89
+ let guard = this . 0 . state_lock . blocking_lock ( ) ;
88
90
89
91
let file = File :: create ( state_path) ?;
90
92
let mut file = BufWriter :: new ( file) ;
91
- serde_json:: to_writer_pretty ( & mut file, state . as_ref ( ) ) ?;
93
+ serde_json:: to_writer_pretty ( & mut file, & this . 0 . state_cache ) ?;
92
94
file. write_all ( b"\n " ) ?;
93
95
94
96
drop ( guard) ;
@@ -102,7 +104,7 @@ impl Data {
102
104
/// Stores the repos found to disk in a CSV
103
105
async fn store_csv ( & self ) -> color_eyre:: Result < ( ) > {
104
106
debug ! ( "storing csv file" ) ;
105
- let mut repos = self . repos_state . lock ( ) . await ;
107
+ let mut repos = self . 0 . repos_state . lock ( ) . await ;
106
108
107
109
let mut js = JoinSet :: new ( ) ;
108
110
@@ -139,7 +141,7 @@ impl Data {
139
141
}
140
142
141
143
pub async fn set_last_id ( & self , forge : Forge , n : usize ) -> color_eyre:: Result < ( ) > {
142
- self . state_cache . 0 [ forge] . store ( n, std:: sync:: atomic:: Ordering :: SeqCst ) ;
144
+ self . 0 . state_cache . 0 [ forge] . store ( n, std:: sync:: atomic:: Ordering :: SeqCst ) ;
143
145
144
146
self . store_csv ( ) . await ?;
145
147
self . store_state_cache ( ) . await ?;
@@ -148,7 +150,7 @@ impl Data {
148
150
}
149
151
150
152
pub async fn store_repo ( & self , forge : Forge , repo : Repo ) {
151
- let mut repos_state = self . repos_state . lock ( ) . await ;
153
+ let mut repos_state = self . 0 . repos_state . lock ( ) . await ;
152
154
repos_state[ forge] . insert ( repo. name . clone ( ) , repo) ;
153
155
}
154
156
}
0 commit comments