Make git sha optional at build time

Fixes #352
This commit is contained in:
Max Brunsfeld 2019-06-06 13:06:28 -07:00
parent dbecdf6c2e
commit fa68ef4cea
2 changed files with 43 additions and 27 deletions

View file

@ -1,9 +1,10 @@
use std::path::PathBuf;
use std::{env, fs, io};
use std::{env, fs};
fn main() {
let git_sha = read_git_sha().unwrap();
println!("cargo:rustc-env={}={}", "BUILD_SHA", git_sha);
if let Some(git_sha) = read_git_sha() {
println!("cargo:rustc-env={}={}", "BUILD_SHA", git_sha);
}
println!(
"cargo:rustc-env=BUILD_TARGET={}",
@ -11,32 +12,43 @@ fn main() {
);
}
fn read_git_sha() -> io::Result<String> {
fn read_git_sha() -> Option<String> {
let mut repo_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let mut git_path;
loop {
git_path = repo_path.join(".git");
if git_path.exists() {
break;
} else {
assert!(repo_path.pop());
} else if !repo_path.pop() {
return None;
}
}
let git_head_path = git_path.join("HEAD");
println!("cargo:rerun-if-changed={}", git_head_path.to_str().unwrap());
let mut head_content = fs::read_to_string(&git_head_path)?;
assert!(head_content.ends_with("\n"));
head_content.pop();
if head_content.starts_with("ref: ") {
// We're on a branch. Read the SHA from the ref file.
head_content.replace_range(0.."ref: ".len(), "");
let ref_filename = git_path.join(&head_content);
println!("cargo:rerun-if-changed={}", ref_filename.to_str().unwrap());
fs::read_to_string(&ref_filename)
} else {
// We're not on a branch. The `HEAD` file itself contains the sha.
assert_eq!(head_content.len(), 40);
Ok(head_content)
let git_head_path = git_path.join("HEAD");
if let Some(path) = git_head_path.to_str() {
println!("cargo:rerun-if-changed={}", path);
}
if let Ok(mut head_content) = fs::read_to_string(&git_head_path) {
if head_content.ends_with("\n") {
head_content.pop();
}
// If we're on a branch, read the SHA from the ref file.
if head_content.starts_with("ref: ") {
head_content.replace_range(0.."ref: ".len(), "");
let ref_filename = git_path.join(&head_content);
if let Some(path) = ref_filename.to_str() {
println!("cargo:rerun-if-changed={}", path);
}
return fs::read_to_string(&ref_filename).ok();
}
// If we're on a detached commit, then the `HEAD` file itself contains the sha.
else if head_content.len() == 40 {
return Some(head_content);
}
}
None
}

View file

@ -9,6 +9,9 @@ use tree_sitter_cli::{
config, error, generate, highlight, loader, logger, parse, properties, test, wasm, web_ui,
};
const BUILD_VERSION: &'static str = env!("CARGO_PKG_VERSION");
const BUILD_SHA: Option<&'static str> = option_env!("BUILD_SHA");
fn main() {
if let Err(e) = run() {
eprintln!("{}", e.message());
@ -17,13 +20,14 @@ fn main() {
}
fn run() -> error::Result<()> {
let version = if let Some(build_sha) = BUILD_SHA {
format!("{} ({})", BUILD_VERSION, build_sha)
} else {
BUILD_VERSION.to_string()
};
let matches = App::new("tree-sitter")
.version(concat!(
env!("CARGO_PKG_VERSION"),
" (",
env!("BUILD_SHA"),
")"
))
.version(version.as_str())
.setting(AppSettings::SubcommandRequiredElseHelp)
.author("Max Brunsfeld <maxbrunsfeld@gmail.com>")
.about("Generates and tests parsers")