version

package
v1.65.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 3, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: MIT

Index

Constants

This section is empty.

Variables

View Source
var (
	// Essas variáveis serão preenchidas durante a compilação via ldflags
	Version    = "dev"
	CommitHash = "unknown"
	BuildDate  = "unknown"

	// URL para verificar a versão mais recente (GitHub API)
	LatestVersionURL = "https://api.github.com/repos/diillson/chatcli/releases/latest"
)
View Source
var CheckLatestVersionImpl = func(ctx context.Context) (string, bool, error) {
	if strings.EqualFold(os.Getenv("CHATCLI_DISABLE_VERSION_CHECK"), "true") {
		return "", false, nil
	}

	client := &http.Client{
		Timeout: 10 * time.Second,
	}

	url := os.Getenv("CHATCLI_LATEST_VERSION_URL")
	if url == "" {
		url = LatestVersionURL
	}

	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return "", false, err
	}

	req.Header.Set("User-Agent", "ChatCLI-Version-Checker")

	resp, err := client.Do(req)
	if err != nil {
		return "", false, err
	}
	defer func() {
		if closeErr := resp.Body.Close(); closeErr != nil {
			fmt.Fprintf(os.Stderr, "Erro ao fechar response body: %v\n", closeErr)
		}
	}()

	if resp.StatusCode != http.StatusOK {
		return "", false, fmt.Errorf("erro ao verificar versão: status %d", resp.StatusCode)
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", false, err
	}

	var releaseInfo struct {
		TagName string `json:"tag_name"`
	}

	if err := json.Unmarshal(body, &releaseInfo); err != nil {
		return "", false, err
	}

	latestVersion := strings.TrimPrefix(releaseInfo.TagName, "v")
	currentVersionFull, _, _ := GetBuildInfo()
	currentVersionBase := ExtractBaseVersion(currentVersionFull)
	needsUpdate := NeedsUpdate(currentVersionBase, latestVersion)

	return latestVersion, needsUpdate, nil
}

CheckLatestVersionImpl é a implementação injetável para checagem de versão (pode ser mocked)

View Source
var GetBuildInfoImpl = func() (string, string, string) {
	version := Version
	commitHash := CommitHash
	buildDate := BuildDate

	if version == "dev" || version == "unknown" ||
		commitHash == "unknown" || buildDate == "unknown" {

		if info, ok := debug.ReadBuildInfo(); ok {

			if (version == "dev" || version == "unknown") && info.Main.Version != "" && info.Main.Version != "(devel)" {
				version = strings.TrimPrefix(info.Main.Version, "v")
			}

			if (commitHash == "unknown" || len(commitHash) < 7) && info.Main.Version != "" {
				parts := strings.Split(info.Main.Version, "-")
				if len(parts) >= 3 {
					possibleCommit := parts[len(parts)-1]
					if len(possibleCommit) >= 7 {
						commitHash = possibleCommit
					}
				}
			}

			if buildDate == "unknown" {
				for _, setting := range info.Settings {
					if setting.Key == "vcs.time" {
						if t, err := time.Parse(time.RFC3339, setting.Value); err == nil {
							buildDate = t.Format("2006-01-02 15:04:05")
						} else {
							buildDate = setting.Value
						}
					}
				}
			}
		}
	}

	if buildDate == "unknown" {
		if execPath, err := os.Executable(); err == nil {
			if info, err := os.Stat(execPath); err == nil {
				modTime := info.ModTime()
				buildDate = fmt.Sprintf("%s (aproximado pela data do binário)", modTime.Format("2006-01-02 15:04:05"))
			}
		}
	}
	return version, commitHash, buildDate
}

GetBuildInfoImpl é a implementação injetável para GetBuildInfo (pode ser mocked)

Functions

func CheckLatestVersionWithContext added in v1.25.1

func CheckLatestVersionWithContext(ctx context.Context) (string, bool, error)

CheckLatestVersionWithContext é o wrapper exportado (mantém a API inalterada)

func ExtractBaseVersion added in v1.25.1

func ExtractBaseVersion(version string) string

ExtractBaseVersion extrai a parte base da versão, sem prefixo 'v' e sem sufixos de desenvolvimento Exemplo: "v1.9.0-5-g1b6ecaa-dirty" -> "1.9.0"

func FormatVersionInfo

func FormatVersionInfo(info VersionInfo, latest string, hasUpdate bool, checkErr error) string

FormatVersionInfo retorna uma string formatada com as informações de versão

func GetBuildInfo

func GetBuildInfo() (string, string, string)

GetBuildInfo é o wrapper exportado

func NeedsUpdate added in v1.25.1

func NeedsUpdate(currentVersion, latestVersion string) bool

NeedsUpdate verifica semanticamente se a versão atual precisa ser atualizada.

Types

type VersionInfo

type VersionInfo struct {
	Version    string `json:"version"`
	CommitHash string `json:"commit_hash"`
	BuildDate  string `json:"build_date"`
}

Info retorna informações estruturadas sobre a versão atual

func GetCurrentVersion

func GetCurrentVersion() VersionInfo

GetCurrentVersion retorna as informações de versão atuais

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL