Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ jobs:

build_time="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
commit_hash="${GITHUB_SHA::7}"
ldflags="-X 'github.com/Format-C-eft/git-update/internal/config.branch=${GITHUB_REF_NAME}' -X 'github.com/Format-C-eft/git-update/internal/config.commitHash=${commit_hash}' -X 'github.com/Format-C-eft/git-update/internal/config.timeBuild=${build_time}'"
version="${{ steps.version.outputs.tag }}"
ldflags="-X 'github.com/Format-C-eft/git-update/internal/config.version=${version}' -X 'github.com/Format-C-eft/git-update/internal/config.branch=${GITHUB_REF_NAME}' -X 'github.com/Format-C-eft/git-update/internal/config.commitHash=${commit_hash}' -X 'github.com/Format-C-eft/git-update/internal/config.timeBuild=${build_time}'"

for target in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64; do
goos="${target%/*}"
Expand Down
7 changes: 6 additions & 1 deletion build.mk
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ ifndef BUILD_TS
BUILD_TS:=$(shell date +%FT%T%z)
endif

LDFLAGS = -X 'github.com/Format-C-eft/git-update/internal/config.branch=$(GIT_BRANCH)'\
ifndef VERSION
VERSION:=$(shell git describe --tags --dirty --always 2> /dev/null || echo "-")
endif

LDFLAGS = -X 'github.com/Format-C-eft/git-update/internal/config.version=$(VERSION)'\
-X 'github.com/Format-C-eft/git-update/internal/config.branch=$(GIT_BRANCH)'\
-X 'github.com/Format-C-eft/git-update/internal/config.commitHash=$(GIT_HASH)'\
-X 'github.com/Format-C-eft/git-update/internal/config.timeBuild=$(BUILD_TS)'

Expand Down
11 changes: 7 additions & 4 deletions cmd/git-update/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@ func main() {
}

func showVersion() {
fmt.Printf("Name - '%s'\n", config.GetVersion().Name)
fmt.Printf("Branch - '%s'\n", config.GetVersion().Branch)
fmt.Printf("Commit hash - '%s'\n", config.GetVersion().CommitHash)
fmt.Printf("Time build - '%s'\n", config.GetVersion().TimeBuild)
version := config.GetVersion()

fmt.Printf("Name - '%s'\n", version.Name)
fmt.Printf("Version - '%s'\n", version.Version)
fmt.Printf("Branch - '%s'\n", version.Branch)
fmt.Printf("Commit hash - '%s'\n", version.CommitHash)
fmt.Printf("Time build - '%s'\n", version.TimeBuild)
}
51 changes: 47 additions & 4 deletions internal/config/dto.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,69 @@
package config

import "runtime/debug"

const AppName = "git-update"

const (
buildInfoVCSRevision = "vcs.revision"
buildInfoVCSTime = "vcs.time"
unknownBuildValue = "-"
)

// Build information -ldflags .
var (
branch = "dev"
commitHash = "-"
timeBuild = "-"
version = unknownBuildValue
branch = unknownBuildValue
commitHash = unknownBuildValue
timeBuild = unknownBuildValue
)

type Version struct {
Name string `json:"name,omitempty"`
Version string `json:"version,omitempty"`
Branch string `json:"branch,omitempty"`
CommitHash string `json:"commitHash,omitempty"`
TimeBuild string `json:"timeBuild,omitempty"`
}

func GetVersion() Version {
return Version{
result := Version{
Name: AppName,
Version: version,
Branch: branch,
CommitHash: commitHash,
TimeBuild: timeBuild,
}

buildInfo, ok := debug.ReadBuildInfo()
if !ok {
return result
}

return enrichVersionFromBuildInfo(result, buildInfo)
}

func enrichVersionFromBuildInfo(result Version, buildInfo *debug.BuildInfo) Version {
if result.Version == unknownBuildValue && buildInfo.Main.Version != "" && buildInfo.Main.Version != "(devel)" {
result.Version = buildInfo.Main.Version
}

for _, setting := range buildInfo.Settings {
if setting.Value == "" {
continue
}

switch setting.Key {
case buildInfoVCSRevision:
if result.CommitHash == unknownBuildValue {
result.CommitHash = setting.Value
}
case buildInfoVCSTime:
if result.TimeBuild == unknownBuildValue {
result.TimeBuild = setting.Value
}
}
}

return result
}
81 changes: 79 additions & 2 deletions internal/config/dto_test.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,48 @@
package config

import (
"runtime/debug"
"testing"
"time"
)

const (
testCommitHash = "abc123"
testModuleVersion = "v0.1.1"
testOverrideVersion = "v9.9.9"
testRevision = "1234567890abcdef"
testTimeBuild = "2026-05-27T12:00:00+0500"
testVCSTime = "2026-05-27T08:00:00Z"
)

func TestGetVersion(t *testing.T) {
oldVersion := version
oldBranch := branch
oldCommitHash := commitHash
oldTimeBuild := timeBuild

t.Cleanup(func() {
version = oldVersion
branch = oldBranch
commitHash = oldCommitHash
timeBuild = oldTimeBuild
})

version = "v1.2.3"
branch = "test-branch"
commitHash = "abc123"
timeBuild = "2026-05-27T12:00:00+0500"
commitHash = testCommitHash
timeBuild = testTimeBuild

got := GetVersion()

if got.Name != AppName {
t.Fatalf("Name = %q, want %q", got.Name, AppName)
}

if got.Version != version {
t.Fatalf("Version = %q, want %q", got.Version, version)
}

if got.Branch != branch {
t.Fatalf("Branch = %q, want %q", got.Branch, branch)
}
Expand All @@ -39,6 +56,66 @@ func TestGetVersion(t *testing.T) {
}
}

func TestEnrichVersionFromBuildInfo(t *testing.T) {
got := enrichVersionFromBuildInfo(Version{
Name: AppName,
Version: unknownBuildValue,
Branch: unknownBuildValue,
CommitHash: unknownBuildValue,
TimeBuild: unknownBuildValue,
}, &debug.BuildInfo{
Main: debug.Module{
Version: testModuleVersion,
},
Settings: []debug.BuildSetting{
{Key: buildInfoVCSRevision, Value: testRevision},
{Key: buildInfoVCSTime, Value: testVCSTime},
},
})

if got.Version != testModuleVersion {
t.Fatalf("Version = %q, want %q", got.Version, testModuleVersion)
}

if got.CommitHash != testRevision {
t.Fatalf("CommitHash = %q, want %q", got.CommitHash, testRevision)
}

if got.TimeBuild != testVCSTime {
t.Fatalf("TimeBuild = %q, want %q", got.TimeBuild, testVCSTime)
}
}

func TestEnrichVersionFromBuildInfoKeepsLdflagsValues(t *testing.T) {
got := enrichVersionFromBuildInfo(Version{
Name: AppName,
Version: testOverrideVersion,
Branch: "main",
CommitHash: testCommitHash,
TimeBuild: testTimeBuild,
}, &debug.BuildInfo{
Main: debug.Module{
Version: testModuleVersion,
},
Settings: []debug.BuildSetting{
{Key: buildInfoVCSRevision, Value: testRevision},
{Key: buildInfoVCSTime, Value: testVCSTime},
},
})

if got.Version != testOverrideVersion {
t.Fatalf("Version = %q, want %q", got.Version, testOverrideVersion)
}

if got.CommitHash != testCommitHash {
t.Fatalf("CommitHash = %q, want %q", got.CommitHash, testCommitHash)
}

if got.TimeBuild != testTimeBuild {
t.Fatalf("TimeBuild = %q, want %q", got.TimeBuild, testTimeBuild)
}
}

func TestDefaultFlags(t *testing.T) {
if FlagDir != "../" {
t.Fatalf("FlagDir = %q, want %q", FlagDir, "../")
Expand Down