mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-04-18 21:40:29 +00:00
build: generate a version number, show in log on startup
This commit is contained in:
53
src/build/Version.zig
Normal file
53
src/build/Version.zig
Normal file
@@ -0,0 +1,53 @@
|
||||
const Version = @This();
|
||||
|
||||
const std = @import("std");
|
||||
|
||||
/// The short hash (7 characters) of the latest commit.
|
||||
short_hash: []const u8,
|
||||
|
||||
/// True if there was a diff at build time.
|
||||
changes: bool,
|
||||
|
||||
/// The tag -- if any -- that this commit is a part of.
|
||||
tag: ?[]const u8,
|
||||
|
||||
/// The branch that was checked out at the time of the build.
|
||||
branch: []const u8,
|
||||
|
||||
/// Initialize the version and detect it from the Git environment. This
|
||||
/// allocates using the build allocator and doesn't free.
|
||||
pub fn detect(b: *std.Build) !Version {
|
||||
// Execute a bunch of git commands to determine the automatic version.
|
||||
var code: u8 = 0;
|
||||
const branch = try b.execAllowFail(&[_][]const u8{ "git", "-C", b.build_root.path orelse ".", "rev-parse", "--abbrev-ref", "HEAD" }, &code, .Ignore);
|
||||
|
||||
const short_hash = short_hash: {
|
||||
const output = try b.execAllowFail(&[_][]const u8{ "git", "-C", b.build_root.path orelse ".", "log", "--pretty=format:%h", "-n", "1" }, &code, .Ignore);
|
||||
break :short_hash std.mem.trimRight(u8, output, "\r\n ");
|
||||
};
|
||||
|
||||
const tag = b.execAllowFail(&[_][]const u8{ "git", "-C", b.build_root.path orelse ".", "describe", "--exact-match", "--tags" }, &code, .Ignore) catch |err| switch (err) {
|
||||
error.ExitCodeFailure => "", // expected
|
||||
else => return err,
|
||||
};
|
||||
|
||||
_ = b.execAllowFail(&[_][]const u8{
|
||||
"git",
|
||||
"-C",
|
||||
b.build_root.path orelse ".",
|
||||
"diff",
|
||||
"--quiet",
|
||||
"--exit-code",
|
||||
}, &code, .Ignore) catch |err| switch (err) {
|
||||
error.ExitCodeFailure => {}, // expected
|
||||
else => return err,
|
||||
};
|
||||
const changes = code != 0;
|
||||
|
||||
return .{
|
||||
.short_hash = short_hash,
|
||||
.changes = changes,
|
||||
.tag = if (tag.len > 0) std.mem.trimRight(u8, tag, "\r\n ") else null,
|
||||
.branch = std.mem.trimRight(u8, branch, "\r\n "),
|
||||
};
|
||||
}
|
||||
@@ -9,6 +9,10 @@ const assert = std.debug.assert;
|
||||
const apprt = @import("apprt.zig");
|
||||
const font = @import("font/main.zig");
|
||||
|
||||
/// The semantic version of this build.
|
||||
pub const version = options.app_version;
|
||||
pub const version_string = options.app_version_string;
|
||||
|
||||
/// The artifact we're producing. This can be used to determine if we're
|
||||
/// building a standalone exe, an embedded lib, etc.
|
||||
pub const artifact = Artifact.detect();
|
||||
|
||||
@@ -128,6 +128,7 @@ pub const GlobalState = struct {
|
||||
|
||||
pub fn init(self: *GlobalState) void {
|
||||
// Output some debug information right away
|
||||
std.log.info("ghostty version={s}", .{build_config.version_string});
|
||||
std.log.info("runtime={}", .{build_config.app_runtime});
|
||||
std.log.info("font_backend={}", .{build_config.font_backend});
|
||||
std.log.info("dependency harfbuzz={s}", .{harfbuzz.versionString()});
|
||||
|
||||
Reference in New Issue
Block a user