< Summary - go-semantic-release Coverage

Line coverage
100%
Covered lines: 86
Uncovered lines: 0
Coverable lines: 86
Total lines: 193
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: DetectCI0%00100%
File 1: IsCI0%00100%
File 2: NewRealClock0%00100%
File 3: NewConsoleLogger0%00100%
File 3: DefaultLogger0%00100%

File(s)

/home/runner/work/go-semantic-release/go-semantic-release/internal/platform/ci.go

#LineLine coverage
 1package platform
 2
 3import "os"
 4
 5// CIEnvironment represents a detected CI/CD platform.
 6type CIEnvironment struct {
 7  Name     string
 8  Detected bool
 9  Branch   string
 10  Commit   string
 11  BuildURL string
 12}
 13
 14// DetectCI checks common CI environment variables and returns the detected environment.
 315func DetectCI() CIEnvironment {
 316  detectors := []struct {
 317    name     string
 318    envVar   string
 319    branch   string
 320    commit   string
 321    buildURL string
 322  }{
 323    {
 324      name:     "GitHub Actions",
 325      envVar:   "GITHUB_ACTIONS",
 326      branch:   "GITHUB_REF_NAME",
 327      commit:   "GITHUB_SHA",
 328      buildURL: "GITHUB_SERVER_URL",
 329    },
 330    {
 331      name:     "GitLab CI",
 332      envVar:   "GITLAB_CI",
 333      branch:   "CI_COMMIT_BRANCH",
 334      commit:   "CI_COMMIT_SHA",
 335      buildURL: "CI_PIPELINE_URL",
 336    },
 337    {
 338      name:     "CircleCI",
 339      envVar:   "CIRCLECI",
 340      branch:   "CIRCLE_BRANCH",
 341      commit:   "CIRCLE_SHA1",
 342      buildURL: "CIRCLE_BUILD_URL",
 343    },
 344    {
 345      name:     "Travis CI",
 346      envVar:   "TRAVIS",
 347      branch:   "TRAVIS_BRANCH",
 348      commit:   "TRAVIS_COMMIT",
 349      buildURL: "TRAVIS_BUILD_WEB_URL",
 350    },
 351    {
 352      name:     "Jenkins",
 353      envVar:   "JENKINS_URL",
 354      branch:   "GIT_BRANCH",
 355      commit:   "GIT_COMMIT",
 356      buildURL: "BUILD_URL",
 357    },
 358    {
 359      name:     "Azure Pipelines",
 360      envVar:   "TF_BUILD",
 361      branch:   "BUILD_SOURCEBRANCH",
 362      commit:   "BUILD_SOURCEVERSION",
 363      buildURL: "SYSTEM_TEAMFOUNDATIONSERVERURI",
 364    },
 365    {
 366      name:     "Bitbucket Pipelines",
 367      envVar:   "BITBUCKET_BUILD_NUMBER",
 368      branch:   "BITBUCKET_BRANCH",
 369      commit:   "BITBUCKET_COMMIT",
 370      buildURL: "BITBUCKET_GIT_HTTP_ORIGIN",
 371    },
 372    {
 373      name:   "Generic CI",
 374      envVar: "CI",
 375    },
 376  }
 377
 378  for _, d := range detectors {
 279    if os.Getenv(d.envVar) != "" {
 280      return CIEnvironment{
 281        Name:     d.name,
 282        Detected: true,
 283        Branch:   os.Getenv(d.branch),
 284        Commit:   os.Getenv(d.commit),
 285        BuildURL: os.Getenv(d.buildURL),
 286      }
 287    }
 88  }
 89
 190  return CIEnvironment{Detected: false}
 91}
 92
 93// IsCI returns true if running in a CI environment.
 194func IsCI() bool {
 195  return DetectCI().Detected
 196}

/home/runner/work/go-semantic-release/go-semantic-release/internal/platform/clock.go

#LineLine coverage
 1package platform
 2
 3import (
 4  "time"
 5
 6  "github.com/jedi-knights/go-semantic-release/internal/ports"
 7)
 8
 9// Compile-time interface compliance check.
 10var _ ports.Clock = (*RealClock)(nil)
 11
 12// RealClock implements ports.Clock using the system clock.
 13type RealClock struct{}
 14
 15// NewRealClock creates a real clock.
 216func NewRealClock() *RealClock {
 217  return &RealClock{}
 218}
 19
 20func (c *RealClock) Now() time.Time {
 21  return time.Now()
 22}

/home/runner/work/go-semantic-release/go-semantic-release/internal/platform/logger.go

#LineLine coverage
 1package platform
 2
 3import (
 4  "fmt"
 5  "io"
 6  "os"
 7  "strings"
 8
 9  "github.com/jedi-knights/go-semantic-release/internal/ports"
 10)
 11
 12// Compile-time interface compliance check.
 13var _ ports.Logger = (*ConsoleLogger)(nil)
 14
 15// ConsoleLogger implements ports.Logger with formatted console output.
 16type ConsoleLogger struct {
 17  out   io.Writer
 18  level LogLevel
 19}
 20
 21// LogLevel controls minimum log level.
 22type LogLevel int
 23
 24const (
 25  LogDebug LogLevel = iota
 26  LogInfo
 27  LogWarn
 28  LogError
 29)
 30
 31// NewConsoleLogger creates a logger that writes to the given writer.
 832func NewConsoleLogger(out io.Writer, level LogLevel) *ConsoleLogger {
 833  return &ConsoleLogger{out: out, level: level}
 834}
 35
 36// DefaultLogger creates a logger writing to stderr at info level.
 137func DefaultLogger() *ConsoleLogger {
 138  return NewConsoleLogger(os.Stderr, LogInfo)
 139}
 40
 41func (l *ConsoleLogger) Debug(msg string, keysAndValues ...any) {
 42  if l.level <= LogDebug {
 43    l.log("DEBUG", msg, keysAndValues...)
 44  }
 45}
 46
 47func (l *ConsoleLogger) Info(msg string, keysAndValues ...any) {
 48  if l.level <= LogInfo {
 49    l.log("INFO", msg, keysAndValues...)
 50  }
 51}
 52
 53func (l *ConsoleLogger) Warn(msg string, keysAndValues ...any) {
 54  if l.level <= LogWarn {
 55    l.log("WARN", msg, keysAndValues...)
 56  }
 57}
 58
 59func (l *ConsoleLogger) Error(msg string, keysAndValues ...any) {
 60  if l.level <= LogError {
 61    l.log("ERROR", msg, keysAndValues...)
 62  }
 63}
 64
 65func (l *ConsoleLogger) log(level, msg string, keysAndValues ...any) {
 66  var sb strings.Builder
 67  _, _ = fmt.Fprintf(&sb, "[%s] %s", level, msg)
 68
 69  for i := 0; i+1 < len(keysAndValues); i += 2 {
 70    _, _ = fmt.Fprintf(&sb, " %v=%v", keysAndValues[i], keysAndValues[i+1])
 71  }
 72  sb.WriteString("\n")
 73
 74  _, _ = fmt.Fprint(l.out, sb.String())
 75}