diff --git a/src/cmd/fetch.zig b/src/cmd/fetch.zig index d4acbc9ad331bfefd1ea90cee8211f0dfa6b79a2..a0e3e731a5e7f491fafb40d0d9b4d26f00bfab6b 100644 --- a/src/cmd/fetch.zig +++ b/src/cmd/fetch.zig @@ -128,7 +128,7 @@ fn create_lockfile(list: *std.ArrayList(u.Module), dir: string) !void { } if (md.type == .system_lib) continue; const mpath = try std.fs.path.join(gpa, &.{ dir, m.clean_path }); - const version = if (md.version.len > 0) md.version else (try md.type.exact_version(mpath)); + const version = try md.exact_version(mpath); try wl.print("{s} {s} {s}\n", .{ @tagName(md.type), md.path, version }); } } diff --git a/src/util/dep.zig b/src/util/dep.zig index 486487fdc9218ce7318b7bc2b50c67bb8c44da60..a9e184b419ff76e77b152b68abd70846520469c8 100644 --- a/src/util/dep.zig +++ b/src/util/dep.zig @@ -57,4 +57,18 @@ pub const Dep = struct { } return true; } + + pub fn exact_version(self: Dep, dpath: []const u8) ![]const u8 { + if (self.version.len == 0) { + return try self.type.exact_version(dpath); + } + return switch (self.type) { + .git => blk: { + const vers = try u.parse_split(u.GitVersionType, "-").do(self.version); + if (vers.id.frozen()) break :blk self.version; + break :blk try self.type.exact_version(dpath); + }, + else => self.version, + }; + } }; diff --git a/src/util/dep_type.zig b/src/util/dep_type.zig index b065f8931878686cced034055587df8a3c8ea749..435f589b7de582293fd60cc4a0da5c423e7c6a63 100644 --- a/src/util/dep_type.zig +++ b/src/util/dep_type.zig @@ -94,4 +94,12 @@ pub const GitVersionType = enum { branch, tag, commit, + + pub fn frozen(self: GitVersionType) bool { + return switch (self) { + .branch => false, + .tag => true, + .commit => true, + }; + } };