]> ruderich.org/simon Gitweb - safcm/safcm.git/commitdiff
Update dependencies, static checkers and Go to 1.24
authorSimon Ruderich <simon@ruderich.org>
Fri, 17 Oct 2025 15:44:33 +0000 (17:44 +0200)
committerSimon Ruderich <simon@ruderich.org>
Fri, 17 Oct 2025 15:44:33 +0000 (17:44 +0200)
20 files changed:
.gitlab-ci.yml
.golangci.yml
ci/run
cmd/safcm/config/files_test.go
cmd/safcm/config/groups_test.go
cmd/safcm/config/hosts_test.go
cmd/safcm/config/permissions_test.go
cmd/safcm/config/templates_test.go
cmd/safcm/config/triggers_test.go
cmd/safcm/fixperms.go
cmd/safcm/main_sync_test.go
cmd/safcm/sync_sync_test.go
cmd/safcm/sync_test.go
frontend/loop.go
go.mod
go.sum
remote/ainsl/ainsl.go
remote/ainsl/ainsl_test.go
remote/sync/files.go
remote/sync/files_test.go

index aee2114240ae8008ce950f43d96b265c0769b841..4874f9f8fede98768ad9ee84ab969ac179ec8f97 100644 (file)
@@ -1,7 +1,7 @@
 .template-docker: &template-docker
   before_script:
     - apt-get update
-    - apt-get install --no-install-recommends --yes build-essential ca-certificates git golang golang-golang-x-tools make openssh-server shellcheck
+    - apt-get install --no-install-recommends --yes build-essential ca-certificates git make openssh-server shellcheck
   script:
     # Gitlab-runner uses umask 0000 (wtf?!) and mixes nobody and root user
     # when setting up the environment. This breaks ssh's permission check on
@@ -9,11 +9,10 @@
     - chown -R root:root /builds
     - chmod -R go-w /builds
     #
-    - mkdir /run/sshd
     - ./ci/run
     # Windows is not really supported, but at least check building works
     - PATH=$HOME/go/bin:$PATH make GOOS=windows GOFLAGS=
 
-debian-sid:
+debian:
   <<: *template-docker
-  image: debian:sid
+  image: golang:1.24-trixie
index 13bcd7f72c31e4b5170413b2caf52d5c06059185..8fd35868404154020e2eb3461df976d5f40e7a81 100644 (file)
@@ -1,37 +1,70 @@
+version: "2"
+
 linters:
-  disable-all: true
+  default: none
   enable:
     # Enabled by default
-    - deadcode
     - errcheck
-    - gosimple
     - govet
     - ineffassign
     - staticcheck
-    - structcheck
-    - typecheck
     - unused
-    - varcheck
     # Additional checks
     - bodyclose
+    - containedctx
     - contextcheck
+    - copyloopvar
     - durationcheck
     - errname
     - exhaustive
-    - exportloopref
-    - gofmt
+    - exptostd
+    - gocheckcompilerdirectives
+    - gocritic
+    - iface
+    - importas
     - nilerr
+    - nilnesserr
     - nolintlint
+    - nonamedreturns
+    - nosprintfhostport
     - predeclared
+    - reassign
+    - recvcheck
     - rowserrcheck
+    - thelper
+    - tparallel
     - unconvert
+    - usestdlibvars
+    - usetesting
     - wastedassign
 
-  issues:
-    # Don't hide potential important issues
-    exclude-use-default: false
+  settings:
+    exhaustive:
+      # "default" is good enough to be exhaustive
+      default-signifies-exhaustive: true
+    gocritic:
+      disabled-checks:
+        - exitAfterDefer
+        - ifElseChain
+        - singleCaseSwitch
+    staticcheck:
+      checks:
+        # Defaults
+        - "all"
+        - "-ST1000"
+        - "-ST1003"
+        - "-ST1016"
+        - "-ST1020"
+        - "-ST1021"
+        - "-ST1022"
+        #
+        - "-QF1001"
+        - "-QF1003"
+        - "-QF1003"
+        - "-QF1007"
+    usestdlibvars:
+      http-method: false
+
 
-linters-settings:
-  exhaustive:
-    # "default" is good enough to be exhaustive
-    default-signifies-exhaustive: true
+run:
+  timeout: 10m
diff --git a/ci/run b/ci/run
index 354e398d3bc81102aec63c6d9b1ba51b814613ee..02c4f64659c5775f9cfcce94d659e315d215b15c 100755 (executable)
--- a/ci/run
+++ b/ci/run
@@ -37,9 +37,7 @@ make test $flags
 # Additional static checks only run in CI
 go install golang.org/x/vuln/cmd/govulncheck@latest
 govulncheck ./...
-go install honnef.co/go/tools/cmd/staticcheck@v0.4.6
-staticcheck ./...
-go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2
+go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0
 golangci-lint run
 
 test -z "$(git clean -nd)" # any untracked files left?
index caea5d03aef36556a208eb0aa56f9a2622c81d2b..de9a2ad0a65ac5d119b466166d412fa49de1bf5a 100644 (file)
@@ -23,16 +23,7 @@ func chmod(name string, mode fs.FileMode) {
 }
 
 func TestLoadFiles(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir("../testdata/project")
 
        // Regular users cannot create sticky files
        skipInvalidSticky := os.Getuid() != 0 &&
@@ -59,7 +50,7 @@ func TestLoadFiles(t *testing.T) {
        }
 
        ft.CreateFifo("files-invalid-type/files/invalid", 0644)
-       defer os.Remove("files-invalid-type/files/invalid")
+       defer os.Remove("files-invalid-type/files/invalid") //nolint:errcheck
 
        const errMsg = `
 
index ef309320ce904db626ee9d57e60a69c06275c212..6f08d1ceb5abbca8d7973598c739b1b3baa06ae1 100644 (file)
@@ -5,32 +5,21 @@ package config
 
 import (
        "fmt"
-       "os"
-       "path/filepath"
        "testing"
 
        "ruderich.org/simon/safcm/testutil"
 )
 
 func TestLoadGroups(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
-       hosts, err := LoadHosts()
-       if err != nil {
-               t.Fatal(err)
-       }
-       err = os.Chdir(cwd)
-       if err != nil {
-               t.Fatal(err)
-       }
+       var hosts *Hosts
+       t.Run("load hosts", func(t *testing.T) {
+               t.Chdir("../testdata/project")
+               x, err := LoadHosts()
+               if err != nil {
+                       t.Fatal(err)
+               }
+               hosts = x
+       })
 
        tests := []struct {
                path   string
@@ -187,11 +176,7 @@ func TestLoadGroups(t *testing.T) {
 
        for _, tc := range tests {
                t.Run(tc.path, func(t *testing.T) {
-                       err := os.Chdir(filepath.Join(cwd, tc.path))
-                       if err != nil {
-                               t.Fatal(err)
-                       }
-
+                       t.Chdir(tc.path)
                        res, err := LoadGroups(tc.cfg, tc.hosts)
                        testutil.AssertEqual(t, "res", res, tc.exp)
                        testutil.AssertErrorEqual(t, "err", err, tc.expErr)
@@ -200,16 +185,8 @@ func TestLoadGroups(t *testing.T) {
 }
 
 func TestResolveHostGroups(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
+       t.Chdir("../testdata/project")
 
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
        allHosts, err := LoadHosts()
        if err != nil {
                t.Fatal(err)
index 98815c7f07c2c80951950e9256d8b48175e61e96..0eebc56d5b7244f7fbdd9aee9095ca0091aa5673 100644 (file)
@@ -5,20 +5,12 @@ package config
 
 import (
        "fmt"
-       "os"
-       "path/filepath"
        "testing"
 
        "ruderich.org/simon/safcm/testutil"
 )
 
 func TestLoadHosts(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
        sliceToHosts := func(hosts []*Host) *Hosts {
                res := &Hosts{
                        List: hosts,
@@ -76,11 +68,7 @@ func TestLoadHosts(t *testing.T) {
 
        for _, tc := range tests {
                t.Run(tc.path, func(t *testing.T) {
-                       err := os.Chdir(filepath.Join(cwd, tc.path))
-                       if err != nil {
-                               t.Fatal(err)
-                       }
-
+                       t.Chdir(tc.path)
                        res, err := LoadHosts()
                        testutil.AssertEqual(t, "res", res, tc.exp)
                        testutil.AssertErrorEqual(t, "err", err, tc.expErr)
index bbb888da10dc1a960b1e68d28c21ca0fdaf1e737..3c043f094ca950fecb1e5280b237a348d0ae449f 100644 (file)
@@ -6,7 +6,6 @@ package config
 import (
        "fmt"
        "io/fs"
-       "os"
        "testing"
 
        "ruderich.org/simon/safcm"
@@ -14,16 +13,7 @@ import (
 )
 
 func TestLoadPermissions(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir("../testdata/project")
 
        tests := []struct {
                group  string
index 58ccf2ec0107480dd4e0f5c66991c15b117aeaa3..ff62cdcc1601fe2dec2345ac5f01c03399fc2312 100644 (file)
@@ -6,7 +6,6 @@ package config
 import (
        "fmt"
        "io/fs"
-       "os"
        "testing"
 
        "ruderich.org/simon/safcm"
@@ -14,16 +13,7 @@ import (
 )
 
 func TestLoadTemplates(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir("../testdata/project")
 
        allHosts, err := LoadHosts()
        if err != nil {
index 51afe69db638c4311a12057b74f0d1ac776ceae7..c395249fdb412fdc6b0f748cad1fed4ee1e98045 100644 (file)
@@ -6,7 +6,6 @@ package config
 import (
        "fmt"
        "io/fs"
-       "os"
        "testing"
 
        "ruderich.org/simon/safcm"
@@ -14,16 +13,7 @@ import (
 )
 
 func TestLoadTriggers(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("../testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir("../testdata/project")
 
        tests := []struct {
                group  string
index af9ffe99033a9520f0d6b04d7375473ac2504a91..738261e2ee102c243e48bb945cb52a680821badf 100644 (file)
@@ -93,7 +93,7 @@ func chmodNoFollow(path string, mode fs.FileMode) error {
        if err != nil {
                return err
        }
-       defer x.Close()
+       defer x.Close() //nolint:errcheck
 
        err = x.Chmod(mode)
        if err != nil {
index b0323296140bd42c0568eb3731fe6e0a265e8777..b31b2ef90a4f11a4905c2261685b052aa8c3fd74 100644 (file)
@@ -23,7 +23,6 @@ func TestSyncSshEndToEnd(t *testing.T) {
        if err != nil {
                t.Fatal(err)
        }
-       defer os.Chdir(cwd) //nolint:errcheck
 
        var suffix string
        // Needs different options in sshd_config
@@ -50,16 +49,13 @@ func TestSyncSshEndToEnd(t *testing.T) {
        for i := 0; i < 30; i++ {
                conn, err := net.Dial("tcp", "127.0.0.1:29327")
                if err == nil {
-                       conn.Close()
+                       conn.Close() //nolint:errcheck
                        break
                }
                time.Sleep(time.Second)
        }
 
-       err = os.Chdir(sshDir + "/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir(sshDir + "/project")
 
        ft.CreateDirectoryExists("no-changes.example.org", 0755)
        ft.CreateDirectoryExists("no-changes.example.org/files", 0755)
@@ -338,13 +334,11 @@ executed 2 command(s):
 
        t.Run("error before connection is established", func(t *testing.T) {
                // Fake $PATH so safcm cannot find the `ssh` binary.
-               path := os.Getenv("PATH")
-               os.Setenv("PATH", "")
-               defer os.Setenv("PATH", path)
+               t.Setenv("PATH", "")
 
                cmd := exec.Command("../../../../../safcm",
                        "sync", "-n", "no-settings.example.org")
-               _, err := cmd.CombinedOutput()
+               _, err = cmd.CombinedOutput()
                if err == nil {
                        t.Errorf("err = nil")
                }
@@ -353,7 +347,7 @@ executed 2 command(s):
        for _, tc := range tests {
                t.Run(tc.name, func(t *testing.T) {
                        if tc.remove {
-                               os.Remove(remotePath)
+                               _ = os.Remove(remotePath)
                        }
 
                        args := append([]string{"sync",
@@ -377,5 +371,5 @@ executed 2 command(s):
                })
        }
 
-       os.Remove(remotePath)
+       _ = os.Remove(remotePath)
 }
index 7420bc383c48c37d84d949ff3128b4f205673468..6493fe3cec7282c32e4559cefbdb476afeede938 100644 (file)
@@ -17,12 +17,6 @@ import (
 )
 
 func TestHostSyncReq(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
        tests := []struct {
                name      string
                project   string
@@ -343,11 +337,7 @@ func TestHostSyncReq(t *testing.T) {
 
        for _, tc := range tests {
                t.Run(tc.name, func(t *testing.T) {
-                       err = os.Chdir(filepath.Join(cwd,
-                               "testdata", tc.project))
-                       if err != nil {
-                               t.Fatal(err)
-                       }
+                       t.Chdir(filepath.Join("testdata", tc.project))
 
                        // `safcm fixperms` in case user has strict umask
                        log.SetOutput(io.Discard)
index e292eda362fbb27a718bcf31889fc4c0b32b6921..86774121a9530e1b9f7ac1359bbcd5c151fe84fe 100644 (file)
@@ -5,7 +5,6 @@ package main
 
 import (
        "fmt"
-       "os"
        "testing"
 
        "ruderich.org/simon/safcm/cmd/safcm/config"
@@ -13,16 +12,7 @@ import (
 )
 
 func TestHostsToSync(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.Chdir("testdata/project")
-       if err != nil {
-               t.Fatal(err)
-       }
+       t.Chdir("testdata/project")
        _, allHosts, allGroups, err := LoadBaseFiles()
        if err != nil {
                t.Fatal(err)
index 087d14be2de7edcfcd4da830e25c4442e584a0c3..4e70ed3c3b5ec781cbd5a4a0b0aa8ea6baa65b4f 100644 (file)
@@ -85,8 +85,6 @@ func (l *Loop) Run(hosts []Host) bool {
        // Sync all hosts concurrently
        var wg sync.WaitGroup
        for _, x := range hosts {
-               x := x
-
                // Once in sync.Host() and once in the go func below
                wg.Add(2)
 
diff --git a/go.mod b/go.mod
index d85dcad97384ee6f816f4d44f9f0d028659ed30e..642423582b98bce5048f8eb006d8b5f9d921eaff 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -1,11 +1,11 @@
 module ruderich.org/simon/safcm
 
-go 1.16
+go 1.24.0
 
 require (
-       github.com/google/go-cmp v0.5.5
-       github.com/ianbruene/go-difflib v1.2.0
-       golang.org/x/sys v0.0.0-20210608053332-aa57babbf139
-       golang.org/x/term v0.0.0-20210317153231-de623e64d2a6
+       github.com/google/go-cmp v0.7.0
+       github.com/ianbruene/go-difflib v1.3.0
+       golang.org/x/sys v0.37.0
+       golang.org/x/term v0.36.0
        gopkg.in/yaml.v2 v2.4.0
 )
diff --git a/go.sum b/go.sum
index 5812c8131b004d5e91c55d81cbc8e13b58fe8fca..76145bb3133c35d4cdc45c894d44aff79a6c599d 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -1,14 +1,11 @@
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/ianbruene/go-difflib v1.2.0 h1:iARmgaCq6nW5QptdoFm0PYAyNGix3xw/xRgEwphJSZw=
-github.com/ianbruene/go-difflib v1.2.0/go.mod h1:uJbrQ06VPxjRiRIrync+E6VcWFGW2dWqw2gvQp6HQPY=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210608053332-aa57babbf139 h1:C+AwYEtBp/VQwoLntUmQ/yx3MS9vmZaKNdw5eOpoQe8=
-golang.org/x/sys v0.0.0-20210608053332-aa57babbf139/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs=
-golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/ianbruene/go-difflib v1.3.0 h1:bAz13YotoralrvYAuRGdU6TX/GPYvTjqO2ybVUgw+Bk=
+github.com/ianbruene/go-difflib v1.3.0/go.mod h1:uJbrQ06VPxjRiRIrync+E6VcWFGW2dWqw2gvQp6HQPY=
+golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
+golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
+golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
index 5633b1f491fa59a8cf430ee1e4d7da91e21908ae..01c660e972bfb45870939ce8740c8ecfa71df5df 100644 (file)
@@ -67,7 +67,7 @@ func handle(path string, line string, create bool) ([]string, error) {
        if err != nil {
                return nil, err
        }
-       defer unix.Close(parentFd)
+       defer unix.Close(parentFd) //nolint:errcheck
 
        var changes []string
 
@@ -165,7 +165,7 @@ func readFileAtNoFollow(dirfd int, base string) ([]byte, fs.FileInfo, error) {
        if err != nil {
                return nil, nil, err
        }
-       defer fh.Close()
+       defer fh.Close() //nolint:errcheck
 
        stat, err := fh.Stat()
        if err != nil {
index 1fb69ff195f1e4628d58942a11906e77ad4b51d8..d84659447f6e0ad5983ab1be7cc1e858b6a10865 100644 (file)
@@ -7,7 +7,6 @@ import (
        "fmt"
        "io/fs"
        "os"
-       "path/filepath"
        "runtime"
        "syscall"
        "testing"
@@ -17,21 +16,6 @@ import (
 )
 
 func TestHandle(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.RemoveAll("testdata")
-       if err != nil {
-               t.Fatal(err)
-       }
-       err = os.Mkdir("testdata", 0700)
-       if err != nil {
-               t.Fatal(err)
-       }
-
        // Set umask to test mode for new files
        umask := syscall.Umask(027)
        defer syscall.Umask(umask)
@@ -263,7 +247,7 @@ func TestHandle(t *testing.T) {
                                },
                        },
                        nil,
-                       fmt.Errorf(symlinkExists),
+                       fmt.Errorf("%s", symlinkExists),
                },
                {
                        "exists: fifo",
@@ -288,15 +272,12 @@ func TestHandle(t *testing.T) {
        for _, tc := range tests {
                t.Run(tc.name, func(t *testing.T) {
                        // Create separate test directory for each test case
-                       path := filepath.Join(cwd, "testdata", tc.name)
-                       err = os.Mkdir(path, 0700)
-                       if err != nil {
-                               t.Fatal(err)
-                       }
-                       err = os.Chdir(path)
+                       path := t.TempDir()
+                       err := os.Chmod(path, 0700)
                        if err != nil {
                                t.Fatal(err)
                        }
+                       t.Chdir(path)
 
                        if tc.prepare != nil {
                                tc.prepare()
@@ -314,11 +295,4 @@ func TestHandle(t *testing.T) {
                        testutil.AssertEqual(t, "files", files, tc.expFiles)
                })
        }
-
-       if !t.Failed() {
-               err = os.RemoveAll(filepath.Join(cwd, "testdata"))
-               if err != nil {
-                       t.Fatal(err)
-               }
-       }
 }
index 93cc380bc5e9d043b17324882d0b151bbf2f9977..620890f20631fd76aa0d210b75a7f0da8456a261 100644 (file)
@@ -22,7 +22,6 @@ import (
        "sort"
        "strconv"
        "strings"
-       "time"
 
        "github.com/ianbruene/go-difflib/difflib"
        "golang.org/x/sys/unix"
@@ -42,9 +41,6 @@ import (
 const openReadonlyFlags = unix.O_RDONLY | unix.O_NOFOLLOW | unix.O_NONBLOCK
 
 func (s *Sync) syncFiles() error {
-       // To create random file names for symlinks
-       rand.Seed(time.Now().UnixNano())
-
        // Sort for deterministic order and so parent directories are present
        // when files in them are created
        var files []*safcm.File
@@ -130,7 +126,7 @@ func (s *Sync) syncFile(file *safcm.File, changed *bool) error {
                }
                return err
        }
-       defer unix.Close(parentFd)
+       defer unix.Close(parentFd) //nolint:errcheck
 
        var oldStat unix.Stat_t
 reopen:
@@ -154,7 +150,7 @@ reopen:
                        return err
                }
        } else {
-               defer oldFh.Close()
+               defer oldFh.Close() //nolint:errcheck
 
                err := unix.Fstat(int(oldFh.Fd()), &oldStat)
                if err != nil {
@@ -329,7 +325,7 @@ reopen:
                                if err2 == unix.ENOTDIR {
                                        return err
                                } else if err2 == unix.ENOTEMPTY {
-                                       return fmt.Errorf(msg)
+                                       return fmt.Errorf("%s", msg)
                                } else {
                                        return err2
                                }
@@ -353,7 +349,7 @@ reopen:
                if err != nil {
                        return err
                }
-               defer dh.Close()
+               defer dh.Close() //nolint:errcheck
 
                err = dh.Chmod(file.Mode)
                if err != nil {
@@ -571,7 +567,7 @@ func OpenParentDirectoryNoSymlinks(path string) (int, string, error) {
        for i, name := range parts[:len(parts)-1] {
                fd, err := unix.Openat(dirFd, name, openReadonlyFlags, 0)
                if err != nil {
-                       unix.Close(dirFd)
+                       unix.Close(dirFd) //nolint:errcheck
                        if err == unix.ELOOP || err == unix.EMLINK {
                                x := filepath.Join(append([]string{dir},
                                        parts[:i+1]...)...)
@@ -581,7 +577,10 @@ func OpenParentDirectoryNoSymlinks(path string) (int, string, error) {
                        }
                        return -1, "", err
                }
-               unix.Close(dirFd)
+               err = unix.Close(dirFd)
+               if err != nil {
+                       return -1, "", err
+               }
                dirFd = fd
        }
 
@@ -635,7 +634,7 @@ func OpenFileNoSymlinks(path string) (*os.File, error) {
        if err != nil {
                return nil, err
        }
-       defer unix.Close(parentFd)
+       defer unix.Close(parentFd) //nolint:errcheck
        return OpenAtNoFollow(parentFd, baseName)
 }
 
@@ -657,26 +656,26 @@ func WriteTempAt(dirFd int, base string, data []byte, uid, gid int,
 
        _, err = fh.Write(data)
        if err != nil {
-               fh.Close()
+               fh.Close()                                   //nolint:errcheck
                unix.Unlinkat(dirFd, tmpBase, 0 /* flags */) //nolint:errcheck
                return "", err
        }
        // createTempAt() creates the file with 0600
        err = fh.Chown(uid, gid)
        if err != nil {
-               fh.Close()
+               fh.Close()                       //nolint:errcheck
                unix.Unlinkat(dirFd, tmpBase, 0) //nolint:errcheck
                return "", err
        }
        err = fh.Chmod(mode)
        if err != nil {
-               fh.Close()
+               fh.Close()                       //nolint:errcheck
                unix.Unlinkat(dirFd, tmpBase, 0) //nolint:errcheck
                return "", err
        }
        err = fh.Sync()
        if err != nil {
-               fh.Close()
+               fh.Close()                       //nolint:errcheck
                unix.Unlinkat(dirFd, tmpBase, 0) //nolint:errcheck
                return "", err
        }
index 91fd94c99c786a6392b1004329cd5d387cb3582a..b1c91ef26ee460d466e0f1e044712610282e3bb9 100644 (file)
@@ -8,7 +8,6 @@ import (
        "io/fs"
        "math/rand"
        "os"
-       "path/filepath"
        "regexp"
        "testing"
 
@@ -20,21 +19,6 @@ import (
 var randFilesRegexp = regexp.MustCompile(`\d+"$`)
 
 func TestSyncFiles(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.RemoveAll("testdata")
-       if err != nil {
-               t.Fatal(err)
-       }
-       err = os.Mkdir("testdata", 0700)
-       if err != nil {
-               t.Fatal(err)
-       }
-
        root := ft.File{
                Path: ".",
                Mode: fs.ModeDir | 0700,
@@ -818,15 +802,12 @@ func TestSyncFiles(t *testing.T) {
                        }
 
                        // Create separate test directory for each test case
-                       path := filepath.Join(cwd, "testdata", "files-"+tc.name)
-                       err := os.Mkdir(path, 0700)
-                       if err != nil {
-                               t.Fatal(err)
-                       }
-                       err = os.Chdir(path)
+                       path := t.TempDir()
+                       err := os.Chmod(path, 0700)
                        if err != nil {
                                t.Fatal(err)
                        }
+                       t.Chdir(path)
 
                        if tc.prepare != nil {
                                tc.prepare()
@@ -861,31 +842,10 @@ func TestSyncFiles(t *testing.T) {
                })
        }
 
-       os.Remove(tmpTestFilePath)
-       if !t.Failed() {
-               err = os.RemoveAll(filepath.Join(cwd, "testdata"))
-               if err != nil {
-                       t.Fatal(err)
-               }
-       }
+       _ = os.Remove(tmpTestFilePath)
 }
 
 func TestSyncFile(t *testing.T) {
-       cwd, err := os.Getwd()
-       if err != nil {
-               t.Fatal(err)
-       }
-       defer os.Chdir(cwd) //nolint:errcheck
-
-       err = os.RemoveAll("testdata")
-       if err != nil {
-               t.Fatal(err)
-       }
-       err = os.Mkdir("testdata", 0700)
-       if err != nil {
-               t.Fatal(err)
-       }
-
        root := ft.File{
                Path: ".",
                Mode: fs.ModeDir | 0700,
@@ -1298,7 +1258,6 @@ func TestSyncFile(t *testing.T) {
                                `4: files: "link" (group): will create`,
                                `3: files: "link" (group): creating`,
                                `4: files: "link" (group): creating temporary symlink ".linkRND"`,
-                               `4: files: "link" (group): creating temporary symlink ".linkRND"`,
                                `4: files: "link" (group): renaming ".linkRND"`,
                        },
                        nil,
@@ -2580,15 +2539,12 @@ file
        for _, tc := range tests {
                t.Run(tc.name, func(t *testing.T) {
                        // Create separate test directory for each test case
-                       path := filepath.Join(cwd, "testdata", "file-"+tc.name)
-                       err := os.Mkdir(path, 0700)
-                       if err != nil {
-                               t.Fatal(err)
-                       }
-                       err = os.Chdir(path)
+                       path := t.TempDir()
+                       err := os.Chmod(path, 0700)
                        if err != nil {
                                t.Fatal(err)
                        }
+                       t.Chdir(path)
 
                        if tc.prepare != nil {
                                tc.prepare()
@@ -2603,7 +2559,7 @@ file
                        }
 
                        // Deterministic temporary symlink names
-                       rand.Seed(0)
+                       rand.Seed(0) //nolint:staticcheck // SA1019 need fixed seed
 
                        var changed bool
                        err = s.syncFile(tc.file, &changed)
@@ -2625,11 +2581,4 @@ file
                        testutil.AssertEqual(t, "resp", s.resp, tc.expResp)
                })
        }
-
-       if !t.Failed() {
-               err = os.RemoveAll(filepath.Join(cwd, "testdata"))
-               if err != nil {
-                       t.Fatal(err)
-               }
-       }
 }