build2cmake/src/torch/ops_identifier.rs (31 lines of code) (raw):
use std::path::Path;
use eyre::{Result, WrapErr};
use git2::Repository;
use rand::Rng;
fn random_identifier() -> String {
// Generate a random string when no ops_id is provided
let mut rng = rand::thread_rng();
let build_id: u64 = rng.gen();
base32::encode(
base32::Alphabet::Rfc4648Lower { padding: false },
&build_id.to_le_bytes(),
)
}
fn git_identifier(target_dir: impl AsRef<Path>) -> Result<String> {
let repo = Repository::discover(target_dir.as_ref()).context("Cannot open git repository")?;
let head = repo.head()?;
let commit = head.peel_to_commit()?;
let rev = commit.tree_id().to_string().chars().take(7).collect();
let dirty = !repo.statuses(None)?.is_empty();
Ok(if dirty { format!("{rev}_dirty") } else { rev })
}
pub fn kernel_ops_identifier(
target_dir: impl AsRef<Path>,
name: &str,
ops_id: Option<String>,
) -> String {
let identifier = ops_id.unwrap_or_else(|| match git_identifier(target_dir.as_ref()) {
Ok(rev) => rev,
Err(_) => random_identifier(),
});
format!("_{name}_{identifier}")
}