Commit ec8c25fd8f

Andrew Kelley <andrew@ziglang.org>
2021-01-02 05:01:51
Restore the reverted semantic versioning commits
restore "Comply with semantic versioning pre-release format" restore "stage2: SemVer compliance for development builds" restore "Remove 'g' prefix from commit hash in Zig semver" This reverts commit d96d8639e592b4bb4b2e330c4bd7412256b297d2. This reverts commit e8810f579406673edad0c9780c9d990f3034717a. This reverts commit 9afe5859a3e428b259a306c36a860e4d82dbb4bb.
1 parent 993f4b5
src/config.zig.in
@@ -1,11 +1,6 @@
 pub const have_llvm = true;
 pub const version: [:0]const u8 = "@ZIG_VERSION@";
-pub const semver: @import("std").SemanticVersion = .{
-    .major = @ZIG_VERSION_MAJOR@,
-    .minor = @ZIG_VERSION_MINOR@,
-    .patch = @ZIG_VERSION_PATCH@,
-    .build = "@ZIG_GIT_REV@",
-};
+pub const semver = try @import("std").SemanticVersion.parse(version);
 pub const log_scopes: []const []const u8 = &[_][]const u8{};
 pub const zir_dumps: []const []const u8 = &[_][]const u8{};
 pub const enable_tracy = false;
build.zig
@@ -11,7 +11,7 @@ const fs = std.fs;
 const InstallDirectoryOptions = std.build.InstallDirectoryOptions;
 const assert = std.debug.assert;
 
-const zig_version = std.builtin.Version{ .major = 0, .minor = 7, .patch = 1 };
+const zig_version = std.builtin.Version{ .major = 0, .minor = 8, .patch = 0 };
 
 pub fn build(b: *Builder) !void {
     b.setPreferredReleaseMode(.ReleaseFast);
@@ -227,24 +227,48 @@ pub fn build(b: *Builder) !void {
         const version_string = b.fmt("{}.{}.{}", .{ zig_version.major, zig_version.minor, zig_version.patch });
 
         var code: u8 = undefined;
-        const git_sha_untrimmed = b.execAllowFail(&[_][]const u8{
-            "git",    "-C",          b.build_root,     "name-rev", "HEAD",
-            "--tags", "--name-only", "--no-undefined", "--always",
+        const git_describe_untrimmed = b.execAllowFail(&[_][]const u8{
+            "git", "-C", b.build_root, "describe", "--match", "*.*.*", "--tags",
         }, &code, .Ignore) catch {
             break :v version_string;
         };
-        const git_sha_trimmed = mem.trim(u8, git_sha_untrimmed, " \n\r");
-
-        // This will look like e.g. "0.7.0^0" for a tag commit.
-        if (mem.endsWith(u8, git_sha_trimmed, "^0")) {
-            const git_ver_string = git_sha_trimmed[0 .. git_sha_trimmed.len - 2];
-            if (!mem.eql(u8, git_ver_string, version_string)) {
-                std.debug.print("Expected git tag '{}', found '{}'\n", .{ version_string, git_ver_string });
-                std.process.exit(1);
-            }
-            break :v b.fmt("{}", .{version_string});
-        } else {
-            break :v b.fmt("{}+{}", .{ version_string, git_sha_trimmed });
+        const git_describe = mem.trim(u8, git_describe_untrimmed, " \n\r");
+
+        switch (mem.count(u8, git_describe, "-")) {
+            0 => {
+                // Tagged release version (e.g. 0.7.0).
+                if (!mem.eql(u8, git_describe, version_string)) {
+                    std.debug.print("Zig version '{}' does not match Git tag '{}'\n", .{ version_string, git_describe });
+                    std.process.exit(1);
+                }
+                break :v version_string;
+            },
+            2 => {
+                // Untagged development build (e.g. 0.7.0-684-gbbe2cca1a).
+                var it = mem.split(git_describe, "-");
+                const tagged_ancestor = it.next() orelse unreachable;
+                const commit_height = it.next() orelse unreachable;
+                const commit_id = it.next() orelse unreachable;
+
+                const ancestor_ver = try std.builtin.Version.parse(tagged_ancestor);
+                if (zig_version.order(ancestor_ver) != .gt) {
+                    std.debug.print("Zig version '{}' must be greater than tagged ancestor '{}'\n", .{ zig_version, ancestor_ver });
+                    std.process.exit(1);
+                }
+
+                // Check that the commit hash is prefixed with a 'g' (a Git convention).
+                if (commit_id.len < 1 or commit_id[0] != 'g') {
+                    std.debug.print("Unexpected `git describe` output: {}\n", .{git_describe});
+                    break :v version_string;
+                }
+
+                // The version is reformatted in accordance with the https://semver.org specification.
+                break :v b.fmt("{}-dev.{}+{}", .{ version_string, commit_height, commit_id[1..] });
+            },
+            else => {
+                std.debug.print("Unexpected `git describe` output: {}\n", .{git_describe});
+                break :v version_string;
+            },
         }
     };
     exe.addBuildOption([:0]const u8, "version", try b.allocator.dupeZ(u8, version));
CMakeLists.txt
@@ -25,8 +25,8 @@ project(zig C CXX)
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
 
 set(ZIG_VERSION_MAJOR 0)
-set(ZIG_VERSION_MINOR 7)
-set(ZIG_VERSION_PATCH 1)
+set(ZIG_VERSION_MINOR 8)
+set(ZIG_VERSION_PATCH 0)
 set(ZIG_VERSION "" CACHE STRING "Override Zig version string. Default is to find out with git.")
 
 if("${ZIG_VERSION}" STREQUAL "")
@@ -34,18 +34,31 @@ if("${ZIG_VERSION}" STREQUAL "")
     find_program(GIT_EXE NAMES git)
     if(GIT_EXE)
         execute_process(
-            COMMAND ${GIT_EXE} -C ${CMAKE_SOURCE_DIR} name-rev HEAD --tags --name-only --no-undefined --always
+            COMMAND ${GIT_EXE} -C ${CMAKE_SOURCE_DIR} describe --match *.*.* --tags
             RESULT_VARIABLE EXIT_STATUS
-            OUTPUT_VARIABLE ZIG_GIT_REV
+            OUTPUT_VARIABLE GIT_DESCRIBE
             OUTPUT_STRIP_TRAILING_WHITESPACE
             ERROR_QUIET)
         if(EXIT_STATUS EQUAL "0")
-            if(ZIG_GIT_REV MATCHES "\\^0$")
-                if(NOT("${ZIG_GIT_REV}" STREQUAL "${ZIG_VERSION}^0"))
-                    message("WARNING: Tag does not match configured Zig version")
+            if(GIT_DESCRIBE MATCHES "^v?([0-9]+\\.[0-9]+\\.[0-9]+)$")
+                # Tagged release version.
+                set(GIT_TAG ${CMAKE_MATCH_1})
+                if(NOT GIT_TAG VERSION_EQUAL ZIG_VERSION)
+                    message(SEND_ERROR "Zig version (${ZIG_VERSION}) does not match Git tag (${GIT_TAG}).")
                 endif()
+            elseif(GIT_DESCRIBE MATCHES "^v?([0-9]+\\.[0-9]+\\.[0-9]+)-([0-9]+)-g(.+)$")
+                # Untagged pre-release. The Zig version is updated to include the number of commits
+                # since the last tagged version and the commit hash. The version is formatted in
+                # accordance with the https://semver.org specification.
+                set(GIT_TAG ${CMAKE_MATCH_1})
+                set(GIT_COMMITS_AFTER_TAG ${CMAKE_MATCH_2})
+                set(GIT_COMMIT ${CMAKE_MATCH_3})
+                if(NOT ZIG_VERSION VERSION_GREATER GIT_TAG)
+                    message(SEND_ERROR "Zig version (${ZIG_VERSION}) must be greater than tagged ancestor (${GIT_TAG}).")
+                endif()
+                set(ZIG_VERSION "${ZIG_VERSION}-dev.${GIT_COMMITS_AFTER_TAG}+${GIT_COMMIT}")
             else()
-                set(ZIG_VERSION "${ZIG_VERSION}+${ZIG_GIT_REV}")
+                message(WARNING "Failed to parse version from output of `git describe`.")
             endif()
         endif()
     endif()