grin/src/build/build.rs
Gary Yu b4c2a9d1b2 Automatic setting up git hooks for the project: rustfmt, etc. (#1380)
Also update document for this change on pre-commit hook config
2018-08-21 12:52:37 -04:00

145 lines
3.9 KiB
Rust

// Copyright 2018 The Grin Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Build hooks to spit out version+build time info
extern crate built;
extern crate flate2;
extern crate reqwest;
extern crate tar;
use flate2::read::GzDecoder;
use std::env;
use std::fs::{self, File};
use std::io::prelude::*;
use std::io::Read;
use std::path::{self, Path, PathBuf};
use std::process::Command;
use tar::Archive;
const WEB_WALLET_TAG: &str = "0.3.0.1";
fn main() {
// Setting up git hooks in the project: rustfmt and so on.
let git_hooks = format!(
"git config core.hooksPath {}",
PathBuf::from("./.hooks").to_str().unwrap()
);
if cfg!(target_os = "windows") {
Command::new("cmd")
.args(&["/C", &git_hooks])
.output()
.expect("failed to execute git config for hooks");
} else {
Command::new("sh")
.args(&["-c", &git_hooks])
.output()
.expect("failed to execute git config for hooks");
}
// build and versioning information
let mut opts = built::Options::default();
opts.set_dependencies(true);
built::write_built_file_with_opts(
&opts,
env!("CARGO_MANIFEST_DIR"),
format!("{}{}", env::var("OUT_DIR").unwrap(), "/built.rs"),
).expect("Failed to acquire build-time information");
install_web_wallet();
}
fn download_and_decompress(target_file: &str) {
let req_path = format!("https://github.com/mimblewimble/grin-web-wallet/releases/download/{}/grin-web-wallet.tar.gz", WEB_WALLET_TAG);
let resp = reqwest::get(&req_path);
// don't interfere if this doesn't work
if resp.is_err() {
println!("Warning: Failed to download grin-web-wallet. Web wallet will not be available");
return;
}
let mut resp = resp.unwrap();
if resp.status().is_success() {
// read response
let mut out: Vec<u8> = vec![];
let r2 = resp.read_to_end(&mut out);
if r2.is_err() {
println!(
"Warning: Failed to download grin-web-wallet. Web wallet will not be available"
);
return;
}
// Gunzip
let mut d = GzDecoder::new(&out[..]);
let mut decomp: Vec<u8> = vec![];
d.read_to_end(&mut decomp).unwrap();
// write temp file
let mut buffer = File::create(target_file.clone()).unwrap();
buffer.write_all(&decomp).unwrap();
buffer.flush().unwrap();
}
}
/// Download and unzip tagged web-wallet build
fn install_web_wallet() {
let target_file = format!(
"{}/grin-web-wallet-{}.tar",
env::var("OUT_DIR").unwrap(),
WEB_WALLET_TAG
);
let out_dir = env::var("OUT_DIR").unwrap();
let mut out_path = PathBuf::from(&out_dir);
out_path.pop();
out_path.pop();
out_path.pop();
// only re-download if needed
if !Path::new(&target_file).is_file() {
download_and_decompress(&target_file);
}
// remove old version
let mut remove_path = out_path.clone();
remove_path.push("grin-wallet");
let _ = fs::remove_dir_all(remove_path);
// Untar
let file = File::open(target_file).unwrap();
let mut a = Archive::new(file);
for file in a.entries().unwrap() {
let mut file = file.unwrap();
let h = file.header().clone();
let path = h.path().unwrap().clone().into_owned();
let is_dir = path.to_str().unwrap().ends_with(path::MAIN_SEPARATOR);
let path = path.strip_prefix("dist").unwrap();
let mut final_path = out_path.clone();
final_path.push(path);
let mut tmp: Vec<u8> = vec![];
file.read_to_end(&mut tmp).unwrap();
if is_dir {
fs::create_dir_all(final_path).unwrap();
} else {
let mut buffer = File::create(final_path).unwrap();
buffer.write_all(&tmp).unwrap();
buffer.flush().unwrap();
}
}
}