mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-04-20 11:46:04 +09:00
Add functionality to overwrite xml metadata with env var
This commit is contained in:
parent
9444431a61
commit
fafd262230
4 changed files with 94 additions and 41 deletions
|
@ -33,7 +33,7 @@ cargo build --features=bin --bins --release
|
|||
|
||||
`target/release`に入ってるバイナリファイルを実行するか、`cargo run -- <XML> <OUT>`で実行できます。
|
||||
|
||||
詳しくは`--help`を見てください。
|
||||
詳しくは(`-h`ではなく)`--help`を見てください。
|
||||
|
||||
### ライブラリクレートの使い方
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ to build.
|
|||
|
||||
Execute the binary generated in `target/release/`, or run with `cargo run -- <XML> <OUT>`.
|
||||
|
||||
See the `--help` for more information.
|
||||
See the `--help`(not `-h`) for more information.
|
||||
|
||||
### Library crate usage
|
||||
|
||||
|
|
64
src/io.rs
64
src/io.rs
|
@ -1,11 +1,15 @@
|
|||
//! File IO for generated codes.
|
||||
|
||||
use std::{collections::HashMap, fs, io, path, process};
|
||||
use std::{collections::HashMap, env, ffi::OsString, fs, io, path, process};
|
||||
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::types::XmlGitInfo;
|
||||
|
||||
const ENVVAR_XML_GIT_DESCRIBE: &str = "XML_GIT_DESCRIBE";
|
||||
const ENVVAR_XML_GIT_TIMESTAMP: &str = "XML_GIT_TIMESTAMP";
|
||||
const ENVVAR_XML_GIT_SHA: &str = "XML_GIT_SHA";
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum XmlGitInfoError {
|
||||
#[error("io error while getting xml git info: {msg} {source}")]
|
||||
|
@ -16,6 +20,8 @@ pub enum XmlGitInfoError {
|
|||
},
|
||||
#[error("git failed: {msg}: {stderr}")]
|
||||
CommandFailed { msg: &'static str, stderr: String },
|
||||
#[error("env var {var} is not unicode: {}", s.to_string_lossy())]
|
||||
NotUnicodeEnvVar { var: &'static str, s: OsString },
|
||||
}
|
||||
|
||||
impl XmlGitInfoError {
|
||||
|
@ -25,32 +31,69 @@ impl XmlGitInfoError {
|
|||
}
|
||||
|
||||
pub(crate) fn get_xml_gitinfo(xml_path: &path::Path) -> Result<XmlGitInfo, XmlGitInfoError> {
|
||||
let describe = process::Command::new("git")
|
||||
let describe = match env::var(ENVVAR_XML_GIT_DESCRIBE) {
|
||||
Ok(describe) => describe,
|
||||
Err(env::VarError::NotUnicode(s)) => {
|
||||
return Err(XmlGitInfoError::NotUnicodeEnvVar {
|
||||
var: ENVVAR_XML_GIT_DESCRIBE,
|
||||
s,
|
||||
});
|
||||
}
|
||||
Err(env::VarError::NotPresent) => {
|
||||
let out_describe = process::Command::new("git")
|
||||
.args(["describe", "--always", "--dirty"])
|
||||
.current_dir(xml_path.parent().unwrap())
|
||||
.output()
|
||||
.map_err(|e| XmlGitInfoError::io_error(e, "git describe"))?;
|
||||
let describe = if describe.status.success() {
|
||||
String::from_utf8_lossy(&describe.stdout).trim().to_owned()
|
||||
let describe = if out_describe.status.success() {
|
||||
String::from_utf8_lossy(&out_describe.stdout)
|
||||
.trim()
|
||||
.to_owned()
|
||||
} else {
|
||||
return Err(XmlGitInfoError::CommandFailed {
|
||||
msg: "git describe",
|
||||
stderr: String::from_utf8_lossy(&describe.stderr).into_owned(),
|
||||
stderr: String::from_utf8_lossy(&out_describe.stderr).into_owned(),
|
||||
});
|
||||
};
|
||||
let timestamp = process::Command::new("git")
|
||||
describe
|
||||
}
|
||||
};
|
||||
let timestamp = match env::var(ENVVAR_XML_GIT_TIMESTAMP) {
|
||||
Ok(timestamp) => timestamp,
|
||||
Err(env::VarError::NotUnicode(s)) => {
|
||||
return Err(XmlGitInfoError::NotUnicodeEnvVar {
|
||||
var: ENVVAR_XML_GIT_TIMESTAMP,
|
||||
s,
|
||||
});
|
||||
}
|
||||
Err(env::VarError::NotPresent) => {
|
||||
let timestamp_out = process::Command::new("git")
|
||||
.args(["log", "-1", "--pretty=format:'%cI'"])
|
||||
.current_dir(xml_path.parent().unwrap())
|
||||
.output()
|
||||
.map_err(|e| XmlGitInfoError::io_error(e, "git log (timestamp)"))?;
|
||||
let timestamp = if timestamp.status.success() {
|
||||
String::from_utf8_lossy(×tamp.stdout).trim().to_owned()
|
||||
let timestamp = if timestamp_out.status.success() {
|
||||
String::from_utf8_lossy(×tamp_out.stdout)
|
||||
.trim()
|
||||
.to_owned()
|
||||
} else {
|
||||
return Err(XmlGitInfoError::CommandFailed {
|
||||
msg: "git log (timestamp)",
|
||||
stderr: String::from_utf8_lossy(×tamp.stderr).into_owned(),
|
||||
stderr: String::from_utf8_lossy(×tamp_out.stderr).into_owned(),
|
||||
});
|
||||
};
|
||||
timestamp
|
||||
}
|
||||
};
|
||||
let git_sha = match env::var(ENVVAR_XML_GIT_SHA) {
|
||||
Ok(sha) => sha,
|
||||
Err(env::VarError::NotUnicode(s)) => {
|
||||
return Err(XmlGitInfoError::NotUnicodeEnvVar {
|
||||
var: ENVVAR_XML_GIT_SHA,
|
||||
s,
|
||||
});
|
||||
}
|
||||
Err(env::VarError::NotPresent) => {
|
||||
let sha = process::Command::new("git")
|
||||
.args(["rev-parse", "HEAD"])
|
||||
.current_dir(xml_path.parent().unwrap())
|
||||
|
@ -64,6 +107,9 @@ pub(crate) fn get_xml_gitinfo(xml_path: &path::Path) -> Result<XmlGitInfo, XmlGi
|
|||
stderr: String::from_utf8_lossy(&sha.stderr).into_owned(),
|
||||
});
|
||||
};
|
||||
git_sha
|
||||
}
|
||||
};
|
||||
Ok(XmlGitInfo {
|
||||
describe,
|
||||
commit_timestamp: timestamp,
|
||||
|
|
11
src/main.rs
11
src/main.rs
|
@ -3,11 +3,16 @@ use std::path;
|
|||
use anyhow::Result;
|
||||
use clap::{Parser, Subcommand};
|
||||
|
||||
/// Generate register interface from register map xml.
|
||||
/// Validate the register map xml and generate register interface from register map xml.
|
||||
/// See `help` with each commands to see detailed explanations.
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(version, about)]
|
||||
#[command(version, about, long_about)]
|
||||
struct Args {
|
||||
/// Input XML register map.
|
||||
///
|
||||
/// The path must be a valid git repository to get git metadata.
|
||||
/// You can also force these metadata with environmental variables `XML_GIT_DESCRIBE`,
|
||||
/// `XML_GIT_TIMESTAMP` and `XML_GIT_SHA`.
|
||||
xml: path::PathBuf,
|
||||
#[command(subcommand)]
|
||||
command: Commands,
|
||||
|
@ -23,6 +28,8 @@ enum Commands {
|
|||
out: path::PathBuf,
|
||||
},
|
||||
/// Generate flattened register map in CSV.
|
||||
///
|
||||
/// Also run validation before generation.
|
||||
#[cfg(feature = "flatmap")]
|
||||
Flatmap {
|
||||
/// Flattened csv out path.
|
||||
|
|
Loading…
Add table
Reference in a new issue