mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-01-29 07:52:50 -05:00
core: fix golang-ci lints and add a config
This commit is contained in:
77
core/.golangci.yml
Normal file
77
core/.golangci.yml
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
linters-settings:
|
||||||
|
errcheck:
|
||||||
|
check-type-assertions: false
|
||||||
|
check-blank: false
|
||||||
|
exclude-functions:
|
||||||
|
# Cleanup/destroy operations
|
||||||
|
- (io.Closer).Close
|
||||||
|
- (*os.File).Close
|
||||||
|
- (net.Conn).Close
|
||||||
|
- (*net.Conn).Close
|
||||||
|
# Signal handling
|
||||||
|
- (*os.Process).Signal
|
||||||
|
- (*os.Process).Kill
|
||||||
|
# DBus cleanup
|
||||||
|
- (*github.com/godbus/dbus/v5.Conn).RemoveMatchSignal
|
||||||
|
- (*github.com/godbus/dbus/v5.Conn).RemoveSignal
|
||||||
|
# Encoding to network connections (if conn is bad, nothing we can do)
|
||||||
|
- (*encoding/json.Encoder).Encode
|
||||||
|
- (net.Conn).Write
|
||||||
|
# Command execution where failure is expected/ignored
|
||||||
|
- (*os/exec.Cmd).Run
|
||||||
|
- (*os/exec.Cmd).Start
|
||||||
|
# Flush operations
|
||||||
|
- (*bufio.Writer).Flush
|
||||||
|
# Scanning user input
|
||||||
|
- fmt.Scanln
|
||||||
|
- fmt.Scanf
|
||||||
|
# Parse operations where default value is acceptable
|
||||||
|
- fmt.Sscanf
|
||||||
|
# Flag operations
|
||||||
|
- (*github.com/spf13/pflag.FlagSet).MarkHidden
|
||||||
|
# Binary encoding to buffer (can't fail for basic types)
|
||||||
|
- binary.Write
|
||||||
|
# File operations in cleanup paths
|
||||||
|
- os.Rename
|
||||||
|
- os.Remove
|
||||||
|
- (*os.File).WriteString
|
||||||
|
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- path: _test\.go
|
||||||
|
linters:
|
||||||
|
- errcheck
|
||||||
|
- govet
|
||||||
|
- unused
|
||||||
|
- ineffassign
|
||||||
|
- staticcheck
|
||||||
|
- gosimple
|
||||||
|
# Exclude cleanup/teardown method calls from errcheck
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Error return value of `.+\\.(Destroy|Release|Stop|Close|Roundtrip|Store)` is not checked"
|
||||||
|
# Exclude internal state update methods that are best-effort
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Error return value of `[mb]\\.\\w*(update|initialize|recreate|acquire|enumerate|list|List|Ensure|refresh|Lock)\\w*` is not checked"
|
||||||
|
# Exclude SetMode on wayland power controls (best-effort)
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Error return value of `.+\\.SetMode` is not checked"
|
||||||
|
# Exclude AddMatchSignal which is best-effort monitoring setup
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Error return value of `.+\\.AddMatchSignal` is not checked"
|
||||||
|
# Exclude wayland pkg from errcheck and ineffassign (generated code patterns)
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
- ineffassign
|
||||||
|
path: pkg/go-wayland/
|
||||||
|
# Exclude proto pkg from ineffassign (generated protocol code)
|
||||||
|
- linters:
|
||||||
|
- ineffassign
|
||||||
|
path: internal/proto/
|
||||||
|
# binary.Write to bytes.Buffer can't fail
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Error return value of `binary\\.Write` is not checked"
|
||||||
@@ -11,6 +11,8 @@ import (
|
|||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/greeter"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/greeter"
|
||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|
||||||
var greeterCmd = &cobra.Command{
|
var greeterCmd = &cobra.Command{
|
||||||
@@ -258,7 +260,7 @@ func disableDisplayManager(dmName string) (bool, error) {
|
|||||||
} else if shouldDisable {
|
} else if shouldDisable {
|
||||||
return actionTaken, fmt.Errorf("%s is still in state '%s' after %s operation", dmName, enabledState, actionVerb)
|
return actionTaken, fmt.Errorf("%s is still in state '%s' after %s operation", dmName, enabledState, actionVerb)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf(" ✓ %s %s (now: %s)\n", strings.Title(actionVerb), dmName, enabledState)
|
fmt.Printf(" ✓ %s %s (now: %s)\n", cases.Title(language.English).String(actionVerb), dmName, enabledState)
|
||||||
}
|
}
|
||||||
|
|
||||||
actionTaken = true
|
actionTaken = true
|
||||||
|
|||||||
@@ -367,7 +367,7 @@ func SyncDMSConfigs(dmsPath string, logFunc func(string), sudoPassword string) e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
runSudoCmd(sudoPassword, "rm", "-f", link.target)
|
runSudoCmd(sudoPassword, "rm", "-f", link.target) //nolint:errcheck
|
||||||
|
|
||||||
if err := runSudoCmd(sudoPassword, "ln", "-sf", link.source, link.target); err != nil {
|
if err := runSudoCmd(sudoPassword, "ln", "-sf", link.source, link.target); err != nil {
|
||||||
logFunc(fmt.Sprintf("⚠ Warning: Failed to create symlink for %s: %v", link.desc, err))
|
logFunc(fmt.Sprintf("⚠ Warning: Failed to create symlink for %s: %v", link.desc, err))
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func (d *DiscoveryConfig) FindJSONFiles() ([]string, error) {
|
|||||||
func expandPath(path string) (string, error) {
|
func expandPath(path string) (string, error) {
|
||||||
expandedPath := os.ExpandEnv(path)
|
expandedPath := os.ExpandEnv(path)
|
||||||
|
|
||||||
if filepath.HasPrefix(expandedPath, "~") {
|
if strings.HasPrefix(expandedPath, "~") {
|
||||||
home, err := os.UserHomeDir()
|
home, err := os.UserHomeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
|
||||||
)
|
)
|
||||||
@@ -118,7 +119,7 @@ func (j *JSONFileProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
|
|||||||
func expandPath(path string) (string, error) {
|
func expandPath(path string) (string, error) {
|
||||||
expandedPath := os.ExpandEnv(path)
|
expandedPath := os.ExpandEnv(path)
|
||||||
|
|
||||||
if filepath.HasPrefix(expandedPath, "~") {
|
if strings.HasPrefix(expandedPath, "~") {
|
||||||
home, err := os.UserHomeDir()
|
home, err := os.UserHomeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ func (l *FileLogger) writeToFile(message string) {
|
|||||||
redacted := l.redactPassword(message)
|
redacted := l.redactPassword(message)
|
||||||
timestamp := time.Now().Format("15:04:05.000")
|
timestamp := time.Now().Format("15:04:05.000")
|
||||||
|
|
||||||
l.writer.WriteString(fmt.Sprintf("[%s] %s\n", timestamp, redacted))
|
l.writer.WriteString(fmt.Sprintf("[%s] %s\n", timestamp, redacted)) //nolint:errcheck
|
||||||
l.writer.Flush()
|
l.writer.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ func (l *FileLogger) Close() error {
|
|||||||
defer l.mu.Unlock()
|
defer l.mu.Unlock()
|
||||||
|
|
||||||
footer := fmt.Sprintf("\n=== DankInstall Log End ===\nCompleted: %s\n", time.Now().Format(time.RFC3339))
|
footer := fmt.Sprintf("\n=== DankInstall Log End ===\nCompleted: %s\n", time.Now().Format(time.RFC3339))
|
||||||
l.writer.WriteString(footer)
|
l.writer.WriteString(footer) //nolint:errcheck
|
||||||
l.writer.Flush()
|
l.writer.Flush()
|
||||||
|
|
||||||
if err := l.file.Sync(); err != nil {
|
if err := l.file.Sync(); err != nil {
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ func (m *Manager) Install(plugin Plugin) error {
|
|||||||
|
|
||||||
if !repoExists {
|
if !repoExists {
|
||||||
if err := m.gitClient.PlainClone(repoPath, plugin.Repo); err != nil {
|
if err := m.gitClient.PlainClone(repoPath, plugin.Repo); err != nil {
|
||||||
m.fs.RemoveAll(repoPath)
|
m.fs.RemoveAll(repoPath) //nolint:errcheck
|
||||||
return fmt.Errorf("failed to clone repository: %w", err)
|
return fmt.Errorf("failed to clone repository: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -130,7 +130,7 @@ func (m *Manager) Install(plugin Plugin) error {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if err := m.gitClient.PlainClone(pluginPath, plugin.Repo); err != nil {
|
if err := m.gitClient.PlainClone(pluginPath, plugin.Repo); err != nil {
|
||||||
m.fs.RemoveAll(pluginPath)
|
m.fs.RemoveAll(pluginPath) //nolint:errcheck
|
||||||
return fmt.Errorf("failed to clone plugin: %w", err)
|
return fmt.Errorf("failed to clone plugin: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func (b *DDCBackend) probeDDCDevice(bus int) (*ddcDevice, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dummy := make([]byte, 32)
|
dummy := make([]byte, 32)
|
||||||
syscall.Read(fd, dummy)
|
syscall.Read(fd, dummy) //nolint:errcheck
|
||||||
|
|
||||||
writebuf := []byte{0x00}
|
writebuf := []byte{0x00}
|
||||||
n, err := syscall.Write(fd, writebuf)
|
n, err := syscall.Write(fd, writebuf)
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ type DBusConn interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type LogindBackend struct {
|
type LogindBackend struct {
|
||||||
conn DBusConn
|
conn DBusConn
|
||||||
connOnce bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLogindBackend() (*LogindBackend, error) {
|
func NewLogindBackend() (*LogindBackend, error) {
|
||||||
|
|||||||
@@ -251,14 +251,14 @@ func (m *Manager) CreatePrinter(name, deviceURI, ppd string, shared bool, errorP
|
|||||||
}
|
}
|
||||||
|
|
||||||
if usedPkHelper {
|
if usedPkHelper {
|
||||||
m.pkHelper.PrinterSetEnabled(name, true)
|
m.pkHelper.PrinterSetEnabled(name, true) //nolint:errcheck
|
||||||
m.pkHelper.PrinterSetAcceptJobs(name, true, "")
|
m.pkHelper.PrinterSetAcceptJobs(name, true, "") //nolint:errcheck
|
||||||
} else {
|
} else {
|
||||||
if err := m.client.ResumePrinter(name); isAuthError(err) && m.pkHelper != nil {
|
if err := m.client.ResumePrinter(name); isAuthError(err) && m.pkHelper != nil {
|
||||||
m.pkHelper.PrinterSetEnabled(name, true)
|
m.pkHelper.PrinterSetEnabled(name, true) //nolint:errcheck
|
||||||
}
|
}
|
||||||
if err := m.client.AcceptJobs(name); isAuthError(err) && m.pkHelper != nil {
|
if err := m.client.AcceptJobs(name); isAuthError(err) && m.pkHelper != nil {
|
||||||
m.pkHelper.PrinterSetAcceptJobs(name, true, "")
|
m.pkHelper.PrinterSetAcceptJobs(name, true, "") //nolint:errcheck
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import (
|
|||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/errdefs"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/errdefs"
|
||||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
"golang.org/x/text/cases"
|
||||||
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -118,12 +120,6 @@ func (a *SecretAgent) GetSecrets(
|
|||||||
log.Infof("[SecretAgent] GetSecrets called: path=%s, setting=%s, hints=%v, flags=%d",
|
log.Infof("[SecretAgent] GetSecrets called: path=%s, setting=%s, hints=%v, flags=%d",
|
||||||
path, settingName, hints, flags)
|
path, settingName, hints, flags)
|
||||||
|
|
||||||
const (
|
|
||||||
NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION = 0x1
|
|
||||||
NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW = 0x2
|
|
||||||
NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED = 0x4
|
|
||||||
)
|
|
||||||
|
|
||||||
connType, displayName, vpnSvc := readConnTypeAndName(conn)
|
connType, displayName, vpnSvc := readConnTypeAndName(conn)
|
||||||
ssid := readSSID(conn)
|
ssid := readSSID(conn)
|
||||||
fields := fieldsNeeded(settingName, hints)
|
fields := fieldsNeeded(settingName, hints)
|
||||||
@@ -378,7 +374,7 @@ func (a *SecretAgent) GetSecrets(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if settingName == "vpn" && a.backend != nil && (vpnUsername != "" || reply.Save) {
|
if settingName == "vpn" && a.backend != nil && (vpnUsername != "" || reply.Save) {
|
||||||
pw, _ := reply.Secrets["password"]
|
pw := reply.Secrets["password"]
|
||||||
a.backend.pendingVPNSaveMu.Lock()
|
a.backend.pendingVPNSaveMu.Lock()
|
||||||
a.backend.pendingVPNSave = &pendingVPNCredentials{
|
a.backend.pendingVPNSave = &pendingVPNCredentials{
|
||||||
ConnectionPath: string(path),
|
ConnectionPath: string(path),
|
||||||
@@ -620,11 +616,12 @@ func vpnFieldMeta(field, vpnService string) (label string, isSecret bool) {
|
|||||||
case "private-key-password":
|
case "private-key-password":
|
||||||
return "Private Key Password", true
|
return "Private Key Password", true
|
||||||
}
|
}
|
||||||
|
titleCaser := cases.Title(language.English)
|
||||||
if strings.HasSuffix(field, "password") || strings.HasSuffix(field, "secret") ||
|
if strings.HasSuffix(field, "password") || strings.HasSuffix(field, "secret") ||
|
||||||
strings.HasSuffix(field, "pass") || strings.HasSuffix(field, "psk") {
|
strings.HasSuffix(field, "pass") || strings.HasSuffix(field, "psk") {
|
||||||
return strings.Title(strings.ReplaceAll(field, "-", " ")), true
|
return titleCaser.String(strings.ReplaceAll(field, "-", " ")), true
|
||||||
}
|
}
|
||||||
return strings.Title(strings.ReplaceAll(field, "-", " ")), false
|
return titleCaser.String(strings.ReplaceAll(field, "-", " ")), false
|
||||||
}
|
}
|
||||||
|
|
||||||
func readVPNPasswordFlags(conn map[string]nmVariantMap, settingName string) uint32 {
|
func readVPNPasswordFlags(conn map[string]nmVariantMap, settingName string) uint32 {
|
||||||
|
|||||||
@@ -2,14 +2,12 @@ package network
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type HybridIwdNetworkdBackend struct {
|
type HybridIwdNetworkdBackend struct {
|
||||||
wifi *IWDBackend
|
wifi *IWDBackend
|
||||||
l3 *SystemdNetworkdBackend
|
l3 *SystemdNetworkdBackend
|
||||||
onStateChange func()
|
onStateChange func()
|
||||||
stateMutex sync.RWMutex
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHybridIwdNetworkdBackend(w *IWDBackend, n *SystemdNetworkdBackend) (*HybridIwdNetworkdBackend, error) {
|
func NewHybridIwdNetworkdBackend(w *IWDBackend, n *SystemdNetworkdBackend) (*HybridIwdNetworkdBackend, error) {
|
||||||
@@ -120,7 +118,7 @@ func (b *HybridIwdNetworkdBackend) ConnectWiFi(req ConnectionRequest) error {
|
|||||||
|
|
||||||
ws, err := b.wifi.GetCurrentState()
|
ws, err := b.wifi.GetCurrentState()
|
||||||
if err == nil && ws.WiFiDevice != "" {
|
if err == nil && ws.WiFiDevice != "" {
|
||||||
b.l3.EnsureDhcpUp(ws.WiFiDevice)
|
b.l3.EnsureDhcpUp(ws.WiFiDevice) //nolint:errcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -159,6 +160,7 @@ func (b *IWDBackend) OnUserCanceledPrompt() {
|
|||||||
|
|
||||||
if cancelledSSID != "" {
|
if cancelledSSID != "" {
|
||||||
if err := b.ForgetWiFiNetwork(cancelledSSID); err != nil {
|
if err := b.ForgetWiFiNetwork(cancelledSSID); err != nil {
|
||||||
|
log.Warnf("failed to forget cancelled WiFi network %s: %v", cancelledSSID, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -319,7 +319,6 @@ func handleConnection(conn net.Conn) {
|
|||||||
capsData, _ := json.Marshal(caps)
|
capsData, _ := json.Marshal(caps)
|
||||||
conn.Write(capsData)
|
conn.Write(capsData)
|
||||||
conn.Write([]byte("\n"))
|
conn.Write([]byte("\n"))
|
||||||
|
|
||||||
scanner := bufio.NewScanner(conn)
|
scanner := bufio.NewScanner(conn)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Bytes()
|
line := scanner.Bytes()
|
||||||
|
|||||||
@@ -72,10 +72,10 @@ func (m Model) viewSelectTerminal() string {
|
|||||||
b.WriteString(title)
|
b.WriteString(title)
|
||||||
b.WriteString("\n\n")
|
b.WriteString("\n\n")
|
||||||
|
|
||||||
options := []struct {
|
var options []struct {
|
||||||
name string
|
name string
|
||||||
description string
|
description string
|
||||||
}{}
|
}
|
||||||
|
|
||||||
if m.osInfo != nil && m.osInfo.Distribution.ID == "gentoo" {
|
if m.osInfo != nil && m.osInfo.Distribution.ID == "gentoo" {
|
||||||
options = []struct {
|
options = []struct {
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type VersionInfo struct {
|
type VersionInfo struct {
|
||||||
@@ -33,7 +35,11 @@ func (d *DefaultVersionFetcher) GetCurrentVersion(dmsPath string) (string, error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer os.Chdir(originalDir)
|
defer func() {
|
||||||
|
if err := os.Chdir(originalDir); err != nil {
|
||||||
|
log.Warnf("failed to change back to original directory: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if err := os.Chdir(dmsPath); err != nil {
|
if err := os.Chdir(dmsPath); err != nil {
|
||||||
return "", fmt.Errorf("failed to change to DMS directory: %w", err)
|
return "", fmt.Errorf("failed to change to DMS directory: %w", err)
|
||||||
@@ -70,7 +76,11 @@ func (d *DefaultVersionFetcher) GetLatestVersion(dmsPath string) (string, error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer os.Chdir(originalDir)
|
defer func() {
|
||||||
|
if err := os.Chdir(originalDir); err != nil {
|
||||||
|
log.Warnf("failed to change back to original directory: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if err := os.Chdir(dmsPath); err != nil {
|
if err := os.Chdir(dmsPath); err != nil {
|
||||||
return "", fmt.Errorf("failed to change to DMS directory: %w", err)
|
return "", fmt.Errorf("failed to change to DMS directory: %w", err)
|
||||||
@@ -85,7 +95,9 @@ func (d *DefaultVersionFetcher) GetLatestVersion(dmsPath string) (string, error)
|
|||||||
if _, err := tagCmd.Output(); err == nil {
|
if _, err := tagCmd.Output(); err == nil {
|
||||||
// Add timeout to git fetch to prevent hanging
|
// Add timeout to git fetch to prevent hanging
|
||||||
fetchCmd := exec.Command("timeout", "5s", "git", "fetch", "origin", "--tags", "--quiet")
|
fetchCmd := exec.Command("timeout", "5s", "git", "fetch", "origin", "--tags", "--quiet")
|
||||||
fetchCmd.Run()
|
if err := fetchCmd.Run(); err != nil {
|
||||||
|
log.Debugf("git fetch tags failed (continuing with local tags): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
latestTagCmd := exec.Command("git", "tag", "-l", "v*", "--sort=-version:refname")
|
latestTagCmd := exec.Command("git", "tag", "-l", "v*", "--sort=-version:refname")
|
||||||
latestTagOutput, err := latestTagCmd.Output()
|
latestTagOutput, err := latestTagCmd.Output()
|
||||||
@@ -109,7 +121,9 @@ func (d *DefaultVersionFetcher) GetLatestVersion(dmsPath string) (string, error)
|
|||||||
|
|
||||||
// Add timeout to git fetch to prevent hanging
|
// Add timeout to git fetch to prevent hanging
|
||||||
fetchCmd := exec.Command("timeout", "5s", "git", "fetch", "origin", currentBranch, "--quiet")
|
fetchCmd := exec.Command("timeout", "5s", "git", "fetch", "origin", currentBranch, "--quiet")
|
||||||
fetchCmd.Run()
|
if err := fetchCmd.Run(); err != nil {
|
||||||
|
log.Debugf("git fetch branch failed (continuing with local ref): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
remoteRevCmd := exec.Command("git", "rev-parse", "--short", fmt.Sprintf("origin/%s", currentBranch))
|
remoteRevCmd := exec.Command("git", "rev-parse", "--short", fmt.Sprintf("origin/%s", currentBranch))
|
||||||
remoteRevOutput, err := remoteRevCmd.Output()
|
remoteRevOutput, err := remoteRevCmd.Output()
|
||||||
@@ -236,10 +250,10 @@ func CompareVersions(v1, v2 string) int {
|
|||||||
for i := 0; i < maxLen; i++ {
|
for i := 0; i < maxLen; i++ {
|
||||||
var p1, p2 int
|
var p1, p2 int
|
||||||
if i < len(parts1) {
|
if i < len(parts1) {
|
||||||
fmt.Sscanf(parts1[i], "%d", &p1)
|
fmt.Sscanf(parts1[i], "%d", &p1) //nolint:errcheck
|
||||||
}
|
}
|
||||||
if i < len(parts2) {
|
if i < len(parts2) {
|
||||||
fmt.Sscanf(parts2[i], "%d", &p2)
|
fmt.Sscanf(parts2[i], "%d", &p2) //nolint:errcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
if p1 < p2 {
|
if p1 < p2 {
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ func (i *Display) Sync() (*Callback, error) {
|
|||||||
PutUint32(_reqBuf[l:l+4], uint32(_reqBufLen<<16|opcode&0x0000ffff))
|
PutUint32(_reqBuf[l:l+4], uint32(_reqBufLen<<16|opcode&0x0000ffff))
|
||||||
l += 4
|
l += 4
|
||||||
PutUint32(_reqBuf[l:l+4], callback.ID())
|
PutUint32(_reqBuf[l:l+4], callback.ID())
|
||||||
l += 4
|
|
||||||
err := i.Context().WriteMsg(_reqBuf[:], nil)
|
err := i.Context().WriteMsg(_reqBuf[:], nil)
|
||||||
return callback, err
|
return callback, err
|
||||||
}
|
}
|
||||||
@@ -109,7 +108,6 @@ func (i *Display) GetRegistry() (*Registry, error) {
|
|||||||
PutUint32(_reqBuf[l:l+4], uint32(_reqBufLen<<16|opcode&0x0000ffff))
|
PutUint32(_reqBuf[l:l+4], uint32(_reqBufLen<<16|opcode&0x0000ffff))
|
||||||
l += 4
|
l += 4
|
||||||
PutUint32(_reqBuf[l:l+4], registry.ID())
|
PutUint32(_reqBuf[l:l+4], registry.ID())
|
||||||
l += 4
|
|
||||||
err := i.Context().WriteMsg(_reqBuf[:], nil)
|
err := i.Context().WriteMsg(_reqBuf[:], nil)
|
||||||
return registry, err
|
return registry, err
|
||||||
}
|
}
|
||||||
@@ -223,7 +221,6 @@ func (i *Display) Dispatch(opcode uint32, fd int, data []byte) {
|
|||||||
messageLen := PaddedLen(int(Uint32(data[l : l+4])))
|
messageLen := PaddedLen(int(Uint32(data[l : l+4])))
|
||||||
l += 4
|
l += 4
|
||||||
e.Message = String(data[l : l+messageLen])
|
e.Message = String(data[l : l+messageLen])
|
||||||
l += messageLen
|
|
||||||
|
|
||||||
i.errorHandler(e)
|
i.errorHandler(e)
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
Reference in New Issue
Block a user