Skip to content

Commit 94b2459

Browse files
committed
code cleanup
1 parent 7843431 commit 94b2459

File tree

1 file changed

+100
-108
lines changed

1 file changed

+100
-108
lines changed

src/main.rs

Lines changed: 100 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,101 @@ fn is_hidden(entry: &DirEntry) -> bool {
6666

6767
//converts the version string into an array of u32s
6868
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>(){
7070
Ok(x) => x,
7171
Err(_) => 0_u32,
7272
}).collect();
7373
}
7474

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+
75157
fn main() {
158+
//check arguments
76159
let args: Vec<_> = env::args().collect();
77160
if args.len() < 3 {
78161
println!("The first argument should be the path of the crates.io-index");
79162
println!("The second argument should be the path for the nixcrates index");
80-
return;
163+
return;
81164
}else{
82165
println!("Inputh path is {}", args[1]);
83166
println!("Output path is {}", args[2]);
@@ -101,7 +184,7 @@ fn main() {
101184
write!(packages, "\n{{");
102185
write!(packages, "\n allCrates = self: super: rec {{");
103186

104-
//traverse true the crates.io index
187+
//traverse through the crates.io index
105188
for entry in WalkDir::new(input).into_iter().filter_entry(|e| !is_hidden(e)) {
106189
let entry = entry.unwrap();
107190
if entry.file_type().is_dir(){
@@ -110,73 +193,38 @@ fn main() {
110193
fs::create_dir_all(new_path);
111194
}else if entry.file_type().is_file(){
112195
//create the equivalent nix file for the nix index
113-
196+
114197
//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") ||
116199
entry.path().to_str().unwrap().contains(".git") ||
117200
entry.path().to_str().unwrap().ends_with(".nix"){
118201
continue;
119202
}
120-
121203
//Open file
122204
let f = match File::open(entry.path()){
123205
Ok(x) => x,
124206
Err(_) => continue,
125207
};
126208
println!("{}", entry.path().to_str().unwrap());
127-
128-
let mut reader = BufReader::new(&f);
209+
129210

130211
//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+
}
132218

133219
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+
135222
let mut buffer = File::create(new_path).unwrap();
136223

137224
write!(buffer, "#DON'T EDIT. AUTOGENERATED FILE");
138225
write!(buffer, "\n{{buildCratesLib, allCrates}}:");
139226
write!(buffer, "\nrec {{");
140227

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-
180228
let (first_key, first_value) = all_versions.iter().next().unwrap();
181229
let mut prev = first_value.clone();
182230
let mut prev_version = first_key.clone();
@@ -187,64 +235,8 @@ fn main() {
187235
for (version, c) in &all_versions {
188236
let next_crate = c.clone();
189237
//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);
246239

247-
248240
let full_version = "_".to_string() + &next_crate.vers.replace(".", "_");
249241
let package_name = next_crate.name.clone() + &full_version;
250242
let data = HashBuilder::new()
@@ -258,7 +250,7 @@ fn main() {
258250
let mut rv = Cursor::new(Vec::new());
259251
data.render(template, &mut rv).unwrap();
260252
let res = String::from_utf8(rv.into_inner()).unwrap();
261-
253+
262254
write!(buffer, "{}", res);
263255
//add entry to the generated-crates.nix
264256
// write!(packages, "\n\"{}\" = all__{}.\"{}\";", package_name, name, package_name);
@@ -270,7 +262,7 @@ fn main() {
270262
// write!(packages, "\n\"{}\" = all__{}.\"{}\";", package_name, name, prev.name.clone() + &full_version);
271263
write!(buffer, "\n \"{}\" = {};", package_name, prev.name.clone() + &full_version);
272264
}
273-
265+
274266
if prev_version[0] < version[0] {
275267
let smal_version = "_".to_string() + &prev_version[0].to_string();
276268
let package_name = prev.name.clone() + &smal_version;

0 commit comments

Comments
 (0)