| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- // SPDX-FileCopyrightText: 2024 Christina Sørensen
- // SPDX-License-Identifier: EUPL-1.2
- //
- // SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors
- // SPDX-FileCopyrightText: 2014 Benjamin Sago
- // SPDX-License-Identifier: MIT
- /// The version string isn’t the simplest: we want to show the version,
- /// current Git hash, and compilation date when building *debug* versions, but
- /// just the version for *release* versions so the builds are reproducible.
- ///
- /// This script generates the string from the environment variables that Cargo
- /// adds (<http://doc.crates.io/environment-variables.html>) and runs `git` to
- /// get the SHA1 hash. It then writes the string into a file, which exa then
- /// includes at build-time.
- ///
- /// - <https://stackoverflow.com/q/43753491/3484614>
- /// - <https://crates.io/crates/vergen>
- use std::env;
- use std::fs::File;
- use std::io::{self, Write};
- use std::path::PathBuf;
- use chrono::prelude::*;
- /// The build script entry point.
- fn main() -> io::Result<()> {
- #![allow(clippy::write_with_newline)]
- let tagline = "eza - A modern, maintained replacement for ls";
- let url = "https://github.com/eza-community/eza";
- let ver = if is_debug_build() {
- format!(
- "{}\nv{} \\1;31m(pre-release debug build!)\\0m\n\\1;4;34m{}\\0m",
- tagline,
- version_string(),
- url
- )
- } else if is_development_version() {
- format!(
- "{}\nv{} [{}] built on {} \\1;31m(pre-release!)\\0m\n\\1;4;34m{}\\0m",
- tagline,
- version_string(),
- git_hash(),
- build_date(),
- url
- )
- } else {
- format!("{}\nv{}\n\\1;4;34m{}\\0m", tagline, version_string(), url)
- };
- // We need to create these files in the Cargo output directory.
- let out = PathBuf::from(env::var("OUT_DIR").unwrap());
- let path = &out.join("version_string.txt");
- // Bland version text
- let mut f =
- File::create(path).unwrap_or_else(|_| panic!("{}", path.to_string_lossy().to_string()));
- writeln!(f, "{}", strip_codes(&ver))?;
- Ok(())
- }
- /// Removes escape codes from a string.
- fn strip_codes(input: &str) -> String {
- input
- .replace("\\0m", "")
- .replace("\\1;31m", "")
- .replace("\\1;4;34m", "")
- }
- /// Retrieve the project’s current Git hash, as a string.
- fn git_hash() -> String {
- use std::process::Command;
- String::from_utf8_lossy(
- &Command::new("git")
- .args(["rev-parse", "--short", "HEAD"])
- .output()
- .unwrap()
- .stdout,
- )
- .trim()
- .to_string()
- }
- /// Whether we should show pre-release info in the version string.
- ///
- /// Both weekly releases and actual releases are --release releases,
- /// but actual releases will have a proper version number.
- fn is_development_version() -> bool {
- cargo_version().ends_with("-pre") || env::var("PROFILE").unwrap() == "debug"
- }
- /// Whether we are building in debug mode.
- fn is_debug_build() -> bool {
- env::var("PROFILE").unwrap() == "debug"
- }
- /// Retrieves the [package] version in Cargo.toml as a string.
- fn cargo_version() -> String {
- env::var("CARGO_PKG_VERSION").unwrap()
- }
- /// Returns the version and build parameters string.
- fn version_string() -> String {
- let mut ver = cargo_version();
- let feats = nonstandard_features_string();
- if !feats.is_empty() {
- ver.push_str(&format!(" [{}]", &feats));
- }
- ver
- }
- /// Finds whether a feature is enabled by examining the Cargo variable.
- fn feature_enabled(name: &str) -> bool {
- env::var(format!("CARGO_FEATURE_{name}"))
- .map(|e| !e.is_empty())
- .unwrap_or(false)
- }
- /// A comma-separated list of non-standard feature choices.
- fn nonstandard_features_string() -> String {
- let mut s = Vec::new();
- if feature_enabled("GIT") {
- s.push("+git");
- } else {
- s.push("-git");
- }
- s.join(", ")
- }
- /// Formats the current date as an ISO 8601 string.
- fn build_date() -> String {
- let now = Local::now();
- now.date_naive().format("%Y-%m-%d").to_string()
- }
|