refactor(build): generate revision via build.rs

This commit is contained in:
OJ Kwon 2018-03-19 13:44:51 -07:00
parent 0671fcb5c7
commit f9230975f5
No known key found for this signature in database
GPG key ID: 2E469434030C7F09
4 changed files with 70 additions and 32 deletions

View file

@ -4,6 +4,7 @@ version = "0.0.1"
authors = ["The Servo Project Developers"]
license = "MPL-2.0"
publish = false
build = "build.rs"
[lib]
name = "compositing"
@ -29,3 +30,6 @@ style_traits = {path = "../style_traits"}
time = "0.1.17"
webrender = {git = "https://github.com/servo/webrender", features = ["capture"]}
webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]}
[build-dependencies]
toml = "0.4.5"

View file

@ -0,0 +1,65 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
extern crate toml;
use std::env;
use std::fs::File;
use std::io::{Read, Write};
const WEBRENDER_REVISION_TEMPLATE: &'static str =
"/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/// auto-generated by cargo. do not manually modify.
pub const REVISION: &'static str = ";
fn main() {
let current_path = env::current_dir().expect("Failed to access path to lockfile");
let lockfile_path = current_path.join("..").join("..").join("Cargo.lock");
let revision_file_path = current_path.join("webrender_revision.rs");
let mut existing_revision_exported = String::new();
match File::open(&revision_file_path) {
Ok(mut f) => {
f.read_to_string(&mut existing_revision_exported).unwrap_or_default();
},
Err(_) => ()
}
let mut lockfile = String::new();
File::open(lockfile_path).expect("Cannot open lockfile")
.read_to_string(&mut lockfile)
.expect("Failed to read lockfile");
match toml::from_str::<toml::value::Table>(&lockfile) {
Ok(result) => {
let packages = result.get("package").expect("Cargo lockfile should contain package list");
match *packages {
toml::Value::Array(ref arr) => {
let source = arr
.iter()
.find(|pkg| pkg.get("name").and_then(|name| name.as_str()).unwrap_or("") == "webrender")
.and_then(|pkg| pkg.get("source").and_then(|source| source.as_str()))
.unwrap_or("unknown");
let parsed: Vec<&str> = source.split("#").collect();
let revision = if parsed.len() > 1 { parsed[1] } else { source };
if let Some(_) = existing_revision_exported.find(revision) {
return
}
let revision_contents = format!("{}\"{}\";", WEBRENDER_REVISION_TEMPLATE, revision);
let mut revision_module_file = File::create(&revision_file_path).unwrap();
write!(&mut revision_module_file, "{}", revision_contents).unwrap();
},
_ => panic!("Cannot find package definitions in lockfile")
}
},
Err(e) => panic!(e)
}
}