@@ -66,18 +66,101 @@ fn is_hidden(entry: &DirEntry) -> bool {
66
66
67
67
//converts the version string into an array of u32s
68
68
fn convert_version ( version : & str ) -> Vec < u32 > {
69
- return version. split ( & [ '.' ] [ ..] ) . map ( |s| match s. parse :: < u32 > ( ) {
69
+ return version. split ( & [ '.' ] [ ..] ) . map ( |s| match s. parse :: < u32 > ( ) {
70
70
Ok ( x) => x,
71
71
Err ( _) => 0_u32 ,
72
72
} ) . collect ( ) ;
73
73
}
74
74
75
+ //Parses one single crates.io file
76
+ fn parseCrates ( f : & File ) -> BTreeMap < Vec < u32 > , MyCrate > {
77
+ let mut all_versions = BTreeMap :: new ( ) ;
78
+ let mut reader = BufReader :: new ( f) ;
79
+ //parse all crates
80
+ for line in reader. lines ( ) {
81
+ let l = line. unwrap ( ) ;
82
+
83
+ let mut next_crate: MyCrate = match json:: decode ( & l) {
84
+ Ok ( x) => x,
85
+ Err ( err) => continue ,
86
+ } ;
87
+
88
+ if next_crate. vers . contains ( "-" ) {
89
+ //skip beta versions
90
+ continue ;
91
+ }
92
+
93
+ //remove everything after an `+` since those vallues can be ignored for versioning
94
+ let prep_for_split = next_crate. vers . clone ( ) ;
95
+ let split: Vec < & str > = prep_for_split. split ( "+" ) . collect ( ) ;
96
+ let v: & str = split[ 0 ] ;
97
+ next_crate. vers = v. to_string ( ) ;
98
+
99
+ let version = convert_version ( & next_crate. vers ) ;
100
+ //check if this is the first valid version else it will be discarded
101
+ all_versions. entry ( version) . or_insert ( next_crate) ;
102
+ }
103
+ return all_versions;
104
+ }
105
+
106
+ //convert a vector of deps into a string and resolve the given versions.
107
+ fn create_dep_string ( deps : & Vec < Dep > ) -> String {
108
+ let mut dep_str = "" . to_string ( ) ;
109
+ for d in deps {
110
+ //FIXME this breaks things for windows ans macos
111
+ if !d. optional && d. kind != "dev" && !d. target . contains ( "windows" ) && !d. target . contains ( "macos" ) {
112
+ if d. req . contains ( "<" ) || d. req . contains ( "=" ) || d. req . contains ( ">" ) || d. req . contains ( "*" ) {
113
+ //Cant resolve use newest version
114
+ dep_str = dep_str + " " + & ( d. name ) ;
115
+ continue ;
116
+ }
117
+ let mut x: Vec < & str > = d. req . split ( "." ) . collect ( ) ;
118
+
119
+ if x. len ( ) > 3 {
120
+ //Cant resolve use newest version
121
+ dep_str = dep_str + " " + & ( d. name ) ;
122
+ continue ;
123
+ }
124
+ if d. req . starts_with ( "~" ) {
125
+ if x. len ( ) == 1 {
126
+ dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "~" ) ;
127
+ } else {
128
+ dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "~" ) + "_" + x[ 1 ] ;
129
+ }
130
+ } else if d. req . starts_with ( "^" ) {
131
+ dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "^" ) ;
132
+ x. remove ( 0 ) ;
133
+ for i in x {
134
+ dep_str = dep_str + "_" + i;
135
+ if i != "0" {
136
+ break ;
137
+ }
138
+ }
139
+
140
+ } else {
141
+ if x. len ( ) > 3 {
142
+ //Cant resolve use newest version
143
+ dep_str = dep_str + " " + & ( d. name ) ;
144
+ } else {
145
+ dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) ;
146
+ for i in x {
147
+ dep_str = dep_str + "_" + i;
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ return dep_str;
154
+ }
155
+
156
+
75
157
fn main ( ) {
158
+ //check arguments
76
159
let args: Vec < _ > = env:: args ( ) . collect ( ) ;
77
160
if args. len ( ) < 3 {
78
161
println ! ( "The first argument should be the path of the crates.io-index" ) ;
79
162
println ! ( "The second argument should be the path for the nixcrates index" ) ;
80
- return ;
163
+ return ;
81
164
} else {
82
165
println ! ( "Inputh path is {}" , args[ 1 ] ) ;
83
166
println ! ( "Output path is {}" , args[ 2 ] ) ;
@@ -101,7 +184,7 @@ fn main() {
101
184
write ! ( packages, "\n {{" ) ;
102
185
write ! ( packages, "\n allCrates = self: super: rec {{" ) ;
103
186
104
- //traverse true the crates.io index
187
+ //traverse through the crates.io index
105
188
for entry in WalkDir :: new ( input) . into_iter ( ) . filter_entry ( |e| !is_hidden ( e) ) {
106
189
let entry = entry. unwrap ( ) ;
107
190
if entry. file_type ( ) . is_dir ( ) {
@@ -110,73 +193,38 @@ fn main() {
110
193
fs:: create_dir_all ( new_path) ;
111
194
} else if entry. file_type ( ) . is_file ( ) {
112
195
//create the equivalent nix file for the nix index
113
-
196
+
114
197
//check if the file is the config.json
115
- if entry. path ( ) . to_str ( ) . unwrap ( ) . ends_with ( "config.json" ) ||
198
+ if entry. path ( ) . to_str ( ) . unwrap ( ) . ends_with ( "config.json" ) ||
116
199
entry. path ( ) . to_str ( ) . unwrap ( ) . contains ( ".git" ) ||
117
200
entry. path ( ) . to_str ( ) . unwrap ( ) . ends_with ( ".nix" ) {
118
201
continue ;
119
202
}
120
-
121
203
//Open file
122
204
let f = match File :: open ( entry. path ( ) ) {
123
205
Ok ( x) => x,
124
206
Err ( _) => continue ,
125
207
} ;
126
208
println ! ( "{}" , entry. path( ) . to_str( ) . unwrap( ) ) ;
127
-
128
- let mut reader = BufReader :: new ( & f) ;
209
+
129
210
130
211
//btree is used to store all versions (sorted).
131
- let mut all_versions = BTreeMap :: new ( ) ;
212
+ let mut all_versions = parseCrates ( & f) ;
213
+
214
+ if all_versions. len ( ) == 0 {
215
+ println ! ( "WARNING: empty package" ) ;
216
+ continue ;
217
+ }
132
218
133
219
let new_sub_path = ( entry. path ( ) . to_str ( ) . unwrap ( ) . trim_left_matches ( input) ) . to_string ( ) + ".nix" ;
134
- let new_path = output. to_string ( ) + & new_sub_path;
220
+ let new_path = output. to_string ( ) + & new_sub_path;
221
+
135
222
let mut buffer = File :: create ( new_path) . unwrap ( ) ;
136
223
137
224
write ! ( buffer, "#DON'T EDIT. AUTOGENERATED FILE" ) ;
138
225
write ! ( buffer, "\n {{buildCratesLib, allCrates}}:" ) ;
139
226
write ! ( buffer, "\n rec {{" ) ;
140
227
141
- let mut newest_crate = MyCrate {
142
- name : "" . to_string ( ) ,
143
- vers : "" . to_string ( ) ,
144
- deps : Vec :: new ( ) ,
145
- cksum : "" . to_string ( ) ,
146
- } ;
147
-
148
- //convert all crates to nix
149
- for line in reader. lines ( ) {
150
- let l = line. unwrap ( ) ;
151
-
152
- let mut next_crate: MyCrate = match json:: decode ( & l) {
153
- Ok ( x) => x,
154
- Err ( err) => continue ,
155
- } ;
156
-
157
- if next_crate. vers . contains ( "-" ) {
158
- //skip beta versions
159
- continue ;
160
- }
161
-
162
- //remove everything after an + since those vallues can be ignored for versioning
163
- let prep_for_split = next_crate. vers . clone ( ) ;
164
- let split: Vec < & str > = prep_for_split. split ( "+" ) . collect ( ) ;
165
- let v: & str = split[ 0 ] ;
166
- next_crate. vers = v. to_string ( ) ;
167
-
168
- //check if this is the newest version
169
- let version = convert_version ( & next_crate. vers ) ;
170
- //check if this is the first valid version
171
- all_versions. entry ( version) . or_insert ( next_crate) ;
172
-
173
- }
174
-
175
- if all_versions. len ( ) == 0 {
176
- println ! ( "WARNING: empty package" ) ;
177
- continue ;
178
- }
179
-
180
228
let ( first_key, first_value) = all_versions. iter ( ) . next ( ) . unwrap ( ) ;
181
229
let mut prev = first_value. clone ( ) ;
182
230
let mut prev_version = first_key. clone ( ) ;
@@ -187,64 +235,8 @@ fn main() {
187
235
for ( version, c) in & all_versions {
188
236
let next_crate = c. clone ( ) ;
189
237
//create a string containing all deps
190
- let mut dep_str = "" . to_string ( ) ;
191
- for d in next_crate. deps {
192
- //FIXME this breaks things for windows ans macos
193
- if !d. optional && d. kind != "dev" && !d. target . contains ( "windows" ) && !d. target . contains ( "macos" ) {
194
-
195
- // dep_str = dep_str + " " + &(d.name);
196
-
197
- if d. req . contains ( "<" ) || d. req . contains ( "=" ) || d. req . contains ( ">" ) || d. req . contains ( "*" ) {
198
- //Cant resolve use newest version
199
- dep_str = dep_str + " " + & ( d. name ) ;
200
- continue ;
201
- }
202
- let mut x: Vec < & str > = d. req . split ( "." ) . collect ( ) ;
203
- /*{
204
- Ok (x) => x,
205
- Err(_) => {
206
- //Cant resolve use newest version
207
- dep_str = dep_str + " " + &(d.name);
208
- continue;
209
- },
210
- };*/
211
-
212
- if x. len ( ) > 3 {
213
- //Cant resolve use newest version
214
- dep_str = dep_str + " " + & ( d. name ) ;
215
- continue ;
216
- }
217
- if d. req . starts_with ( "~" ) {
218
- if x. len ( ) == 1 {
219
- dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "~" ) ;
220
- } else {
221
- dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "~" ) + "_" + x[ 1 ] ;
222
- }
223
- } else if d. req . starts_with ( "^" ) {
224
- dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) + "_" + x[ 0 ] . trim_left_matches ( "^" ) ;
225
- x. remove ( 0 ) ;
226
- for i in x {
227
- dep_str = dep_str + "_" + i;
228
- if i != "0" {
229
- break ;
230
- }
231
- }
232
-
233
- } else {
234
- if x. len ( ) > 3 {
235
- //Cant resolve use newest version
236
- dep_str = dep_str + " " + & ( d. name ) ;
237
- } else {
238
- dep_str = dep_str + " all__" + & ( d. name ) + "." + & ( d. name ) ;
239
- for i in x {
240
- dep_str = dep_str + "_" + i;
241
- }
242
- }
243
- }
244
- }
245
- }
238
+ let dep_str = create_dep_string ( & next_crate. deps ) ;
246
239
247
-
248
240
let full_version = "_" . to_string ( ) + & next_crate. vers . replace ( "." , "_" ) ;
249
241
let package_name = next_crate. name . clone ( ) + & full_version;
250
242
let data = HashBuilder :: new ( )
@@ -258,7 +250,7 @@ fn main() {
258
250
let mut rv = Cursor :: new ( Vec :: new ( ) ) ;
259
251
data. render ( template, & mut rv) . unwrap ( ) ;
260
252
let res = String :: from_utf8 ( rv. into_inner ( ) ) . unwrap ( ) ;
261
-
253
+
262
254
write ! ( buffer, "{}" , res) ;
263
255
//add entry to the generated-crates.nix
264
256
// write!(packages, "\n\"{}\" = all__{}.\"{}\";", package_name, name, package_name);
@@ -270,7 +262,7 @@ fn main() {
270
262
// write!(packages, "\n\"{}\" = all__{}.\"{}\";", package_name, name, prev.name.clone() + &full_version);
271
263
write ! ( buffer, "\n \" {}\" = {};" , package_name, prev. name. clone( ) + & full_version) ;
272
264
}
273
-
265
+
274
266
if prev_version[ 0 ] < version[ 0 ] {
275
267
let smal_version = "_" . to_string ( ) + & prev_version[ 0 ] . to_string ( ) ;
276
268
let package_name = prev. name . clone ( ) + & smal_version;
0 commit comments