Documentation
¶
Overview ¶
* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: MIT
Index ¶
- Variables
- func CheckLatestVersionWithContext(ctx context.Context) (string, bool, error)
- func ExtractBaseVersion(version string) string
- func FormatVersionInfo(info VersionInfo, latest string, hasUpdate bool, checkErr error) string
- func GetBuildInfo() (string, string, string)
- func NeedsUpdate(currentVersion, latestVersion string) bool
- type VersionInfo
Constants ¶
This section is empty.
Variables ¶
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" )
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)
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
CheckLatestVersionWithContext é o wrapper exportado (mantém a API inalterada)
func ExtractBaseVersion ¶ added in v1.25.1
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 NeedsUpdate ¶ added in v1.25.1
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