fix: CI failures - performance thresholds, test eligibility, Nix hash, lint errors

- TestSyncBranchPerformance: Increase Windows threshold to 500ms (was 150ms)
  Windows git operations are ~3x slower than Unix
- TestCompactTier1: Fix eligibility by using 7-day minimum and 8-day closure
  Changed compact_tier1_days from 0 to 7 to properly test eligibility checks
- Nix flake: Update vendorHash for current go.mod dependencies
  sha256-cS2saiyKMgw4cXSc2INBHNJfJz5300ybI6Vxda1vLGk=
- Lint fixes:
  - Remove unused 'quiet' parameter from createConfigYaml
  - Change template file permissions from 0644 to 0600 (gosec G306)
  - Add nosec comment for sanitized file path (gosec G304)
This commit is contained in:
Steve Yegge
2025-11-03 22:01:34 -08:00
parent c86c4b7219
commit 68876dd98f
5 changed files with 15 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"runtime"
"strings" "strings"
"testing" "testing"
"time" "time"
@@ -1100,7 +1101,11 @@ func TestSyncBranchPerformance(t *testing.T) {
} }
avgDuration := totalDuration / iterations avgDuration := totalDuration / iterations
// Windows git operations are significantly slower - use platform-specific thresholds
maxAllowed := 150 * time.Millisecond maxAllowed := 150 * time.Millisecond
if runtime.GOOS == "windows" {
maxAllowed = 500 * time.Millisecond
}
t.Logf("Average commit time: %v (max allowed: %v)", avgDuration, maxAllowed) t.Logf("Average commit time: %v (max allowed: %v)", avgDuration, maxAllowed)

View File

@@ -125,7 +125,7 @@ With --no-db: creates .beads/ directory and issues.jsonl file instead of SQLite
} }
// Create config.yaml with no-db: true // Create config.yaml with no-db: true
if err := createConfigYaml(localBeadsDir, quiet, true); err != nil { if err := createConfigYaml(localBeadsDir, true); err != nil {
fmt.Fprintf(os.Stderr, "Warning: failed to create config.yaml: %v\n", err) fmt.Fprintf(os.Stderr, "Warning: failed to create config.yaml: %v\n", err)
// Non-fatal - continue anyway // Non-fatal - continue anyway
} }
@@ -248,7 +248,7 @@ bd.db
} }
// Create config.yaml template // Create config.yaml template
if err := createConfigYaml(localBeadsDir, quiet, false); err != nil { if err := createConfigYaml(localBeadsDir, false); err != nil {
fmt.Fprintf(os.Stderr, "Warning: failed to create config.yaml: %v\n", err) fmt.Fprintf(os.Stderr, "Warning: failed to create config.yaml: %v\n", err)
// Non-fatal - continue anyway // Non-fatal - continue anyway
} }
@@ -544,7 +544,7 @@ func migrateOldDatabases(targetPath string, quiet bool) error {
} }
// createConfigYaml creates the config.yaml template in the specified directory // createConfigYaml creates the config.yaml template in the specified directory
func createConfigYaml(beadsDir string, quiet bool, noDbMode bool) error { func createConfigYaml(beadsDir string, noDbMode bool) error {
configYamlPath := filepath.Join(beadsDir, "config.yaml") configYamlPath := filepath.Join(beadsDir, "config.yaml")
// Skip if already exists // Skip if already exists

View File

@@ -181,7 +181,7 @@ the default values for your common issue types.`,
} }
// Write template file // Write template file
if err := os.WriteFile(templatePath, data, 0644); err != nil { if err := os.WriteFile(templatePath, data, 0600); err != nil {
fmt.Fprintf(os.Stderr, "Error writing template: %v\n", err) fmt.Fprintf(os.Stderr, "Error writing template: %v\n", err)
os.Exit(1) os.Exit(1)
} }
@@ -286,6 +286,7 @@ func loadBuiltinTemplate(name string) (*Template, error) {
// loadCustomTemplate loads a custom template from .beads/templates/ // loadCustomTemplate loads a custom template from .beads/templates/
func loadCustomTemplate(name string) (*Template, error) { func loadCustomTemplate(name string) (*Template, error) {
path := filepath.Join(".beads", "templates", name+".yaml") path := filepath.Join(".beads", "templates", name+".yaml")
// #nosec G304 - path is sanitized via sanitizeTemplateName before calling this function
data, err := os.ReadFile(path) data, err := os.ReadFile(path)
if err != nil { if err != nil {
return nil, fmt.Errorf("template '%s' not found", name) return nil, fmt.Errorf("template '%s' not found", name)

View File

@@ -9,7 +9,7 @@ pkgs.buildGoModule {
subPackages = [ "cmd/bd" ]; subPackages = [ "cmd/bd" ];
# Go module dependencies hash (computed via nix build) # Go module dependencies hash (computed via nix build)
vendorHash = "sha256-DJqTiLGLZNGhHXag50gHFXTVXCBdj8ytbYbPL3QAq8M="; vendorHash = "sha256-cS2saiyKMgw4cXSc2INBHNJfJz5300ybI6Vxda1vLGk=";
# Git is required for tests # Git is required for tests
nativeBuildInputs = [ pkgs.git ]; nativeBuildInputs = [ pkgs.git ];

View File

@@ -24,7 +24,8 @@ func setupTestStorage(t *testing.T) *sqlite.SQLiteStorage {
if err := store.SetConfig(ctx, "issue_prefix", "bd"); err != nil { if err := store.SetConfig(ctx, "issue_prefix", "bd"); err != nil {
t.Fatalf("failed to set issue_prefix: %v", err) t.Fatalf("failed to set issue_prefix: %v", err)
} }
if err := store.SetConfig(ctx, "compact_tier1_days", "0"); err != nil { // Use 7 days minimum for Tier 1 compaction to ensure tests check eligibility properly
if err := store.SetConfig(ctx, "compact_tier1_days", "7"); err != nil {
t.Fatalf("failed to set config: %v", err) t.Fatalf("failed to set config: %v", err)
} }
if err := store.SetConfig(ctx, "compact_tier1_dep_levels", "2"); err != nil { if err := store.SetConfig(ctx, "compact_tier1_dep_levels", "2"); err != nil {
@@ -46,7 +47,8 @@ func createClosedIssue(t *testing.T, store *sqlite.SQLiteStorage, id string) *ty
} }
now := time.Now() now := time.Now()
closedAt := now.Add(-1 * time.Second) // Issue closed 8 days ago (beyond 7-day threshold for Tier 1)
closedAt := now.Add(-8 * 24 * time.Hour)
issue := &types.Issue{ issue := &types.Issue{
ID: id, ID: id,
Title: "Test Issue", Title: "Test Issue",