Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,41 @@ fn main() {
println!("cargo:rerun-if-changed=src/gql/subscriptions/strings");
println!("cargo:rerun-if-changed=src/gql/schema.json");

// Rebuild when git HEAD changes
println!("cargo:rerun-if-changed=.git/HEAD");

// Expose the compile-time target triple so the self-updater fetches the
// correct release asset (respects ABI: gnu vs musl, msvc vs gnu, etc.).
let target = std::env::var("TARGET").unwrap();
println!("cargo:rustc-env=BUILD_TARGET={target}");

// Expose git commit hash
let git_sha = std::process::Command::new("git")
.args(["rev-parse", "--short", "HEAD"])
.output()
.ok()
.and_then(|output| String::from_utf8(output.stdout).ok())
.map(|s| s.trim().to_string())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=GIT_SHA={}", git_sha);

// Expose build date (ISO 8601 format in UTC)
let build_date = std::process::Command::new("date")
.args(["-u", "+%Y-%m-%dT%H:%M:%SZ"])
.output()
.ok()
.and_then(|output| String::from_utf8(output.stdout).ok())
.map(|s| s.trim().to_string())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=BUILD_DATE={}", build_date);

// Expose rustc version
let rustc_version = std::process::Command::new("rustc")
.args(["--version"])
.output()
.ok()
.and_then(|output| String::from_utf8(output.stdout).ok())
.map(|s| s.trim().to_string())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=RUSTC_VERSION={}", rustc_version);
}
1 change: 1 addition & 0 deletions src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ pub mod unlink;
pub mod up;
pub mod upgrade;
pub mod variable;
pub mod version;
pub mod volume;
pub mod whoami;

Expand Down
78 changes: 78 additions & 0 deletions src/commands/version.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
use serde::Serialize;

use super::*;
use crate::util::check_update::check_update;

/// Display version information
#[derive(Parser)]
pub struct Args {
/// Output in JSON format
#[clap(long)]
json: bool,
}

#[derive(Serialize)]
struct VersionJson {
version: String,
git_sha: String,
build_date: String,
rust_version: String,
target: String,
update_available: Option<String>,
}

pub async fn command(args: Args) -> Result<()> {
let version = env!("CARGO_PKG_VERSION").to_string();
let git_sha = env!("GIT_SHA").to_string();
let build_date = env!("BUILD_DATE").to_string();
let target = env!("BUILD_TARGET").to_string();
let rust_version = env!("RUSTC_VERSION").to_string();

// Check for updates (non-blocking, don't fail if check fails)
let update_available = check_update(false).await.ok().flatten();

if args.json {
let output = VersionJson {
version: version.clone(),
git_sha: git_sha.clone(),
build_date: build_date.clone(),
rust_version: rust_version.clone(),
target: target.clone(),
update_available: update_available.clone(),
};
println!("{}", serde_json::to_string_pretty(&output)?);
return Ok(());
}

// Human-readable output
println!(
"{} {}",
"Railway CLI".purple().bold(),
version.green().bold()
);
println!();
println!("{}", "Build Info:".bold());
println!(" Version: {}", version);
println!(" Commit: {}", git_sha.dimmed());
println!(" Build Date: {}", build_date);
println!(" Rust: {}", rust_version);
println!(" Target: {}", target);
println!();
println!("{}", "Update Status:".bold());
match update_available {
Some(new_version) => {
println!(
" {} New version available: {} -> {}",
"*".yellow(),
version.red(),
new_version.green()
);
println!(" Run {} to upgrade", "`railway upgrade`".cyan());
}
None => {
println!(" {} You are on the latest version", "*".green());
}
}

Ok(())
}
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ commands!(
unlink,
up,
upgrade,
version,
variable(variables, vars, var),
whoami,
volume,
Expand Down