fix: Windows build + gosec lint errors (#585)

Fixes Windows build by adding platform-specific inode handling via build tags. Also fixes gosec lint warnings in migrate_tombstones.go.

Thanks @deblasis!
This commit is contained in:
Alessandro De Blasis
2025-12-16 22:26:51 +01:00
committed by GitHub
parent aed166fe85
commit 1ba12e1620
4 changed files with 41 additions and 16 deletions

View File

@@ -42,7 +42,7 @@ func MigrateTombstones(path string) error {
// Load existing JSONL to check for already-existing tombstones // Load existing JSONL to check for already-existing tombstones
existingTombstones := make(map[string]bool) existingTombstones := make(map[string]bool)
if file, err := os.Open(jsonlPath); err == nil { if file, err := os.Open(filepath.Clean(jsonlPath)); err == nil {
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
scanner.Buffer(make([]byte, 0, 64*1024), 10*1024*1024) scanner.Buffer(make([]byte, 0, 64*1024), 10*1024*1024)
for scanner.Scan() { for scanner.Scan() {
@@ -56,7 +56,7 @@ func MigrateTombstones(path string) error {
} }
} }
} }
file.Close() _ = file.Close()
} }
// Convert deletions to tombstones // Convert deletions to tombstones
@@ -74,7 +74,7 @@ func MigrateTombstones(path string) error {
fmt.Printf(" All %d deletion(s) already have tombstones - archiving deletions.jsonl\n", skipped) fmt.Printf(" All %d deletion(s) already have tombstones - archiving deletions.jsonl\n", skipped)
} else { } else {
// Append tombstones to issues.jsonl // Append tombstones to issues.jsonl
file, err := os.OpenFile(jsonlPath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644) file, err := os.OpenFile(filepath.Clean(jsonlPath), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil { if err != nil {
return fmt.Errorf("failed to open issues.jsonl: %w", err) return fmt.Errorf("failed to open issues.jsonl: %w", err)
} }

View File

@@ -4,7 +4,6 @@ package sqlite
import ( import (
"os" "os"
"sync" "sync"
"syscall"
"time" "time"
) )
@@ -49,12 +48,8 @@ func (fc *FreshnessChecker) captureFileState() {
fc.lastMtime = info.ModTime() fc.lastMtime = info.ModTime()
fc.lastSize = info.Size() fc.lastSize = info.Size()
// Get inode on Unix systems // Get inode (Unix only, returns 0 on Windows)
if sys := info.Sys(); sys != nil { fc.lastInode = getFileInode(info)
if stat, ok := sys.(*syscall.Stat_t); ok {
fc.lastInode = stat.Ino
}
}
} }
// Check examines the database file for changes and triggers reconnection if needed. // Check examines the database file for changes and triggers reconnection if needed.
@@ -75,12 +70,7 @@ func (fc *FreshnessChecker) Check() bool {
} }
// Check if file was replaced by comparing inode // Check if file was replaced by comparing inode
var currentInode uint64 currentInode := getFileInode(info)
if sys := info.Sys(); sys != nil {
if stat, ok := sys.(*syscall.Stat_t); ok {
currentInode = stat.Ino
}
}
// Detect file replacement: // Detect file replacement:
// 1. Inode changed (file was replaced, most reliable on Unix) // 1. Inode changed (file was replaced, most reliable on Unix)

View File

@@ -0,0 +1,19 @@
//go:build !windows
// Package sqlite implements the storage interface using SQLite.
package sqlite
import (
"os"
"syscall"
)
// getFileInode extracts the inode from file info on Unix systems.
func getFileInode(info os.FileInfo) uint64 {
if sys := info.Sys(); sys != nil {
if stat, ok := sys.(*syscall.Stat_t); ok {
return stat.Ino
}
}
return 0
}

View File

@@ -0,0 +1,16 @@
//go:build windows
// Package sqlite implements the storage interface using SQLite.
package sqlite
import (
"os"
)
// getFileInode returns 0 on Windows since inodes are not available.
// File replacement detection will rely on mtime/size instead.
func getFileInode(info os.FileInfo) uint64 {
// Windows doesn't have inodes, return 0 to skip inode-based detection.
// The FreshnessChecker will fall back to mtime-based detection.
return 0
}