From f18c917ef83e90c6fcd3cb2579cc9e63b881796c Mon Sep 17 00:00:00 2001
From: Kir Kolyshkin <kolyshkin@gmail.com>
Date: Mon, 31 Mar 2025 13:52:06 -0700
Subject: [PATCH] ci: run golangci-lint on freebsd

This could have been done by simply running

	GOOS=freebsd ./bin/golangci-lint run [options] ./...

on Linux, but some freebsd code is using cgo (i.e. is linked to C
libraries), so real freebsd environment is required.

This also fixes the issue of ignoring linter errors for Windows and
Darwin (exit 0), introduced by commit c9b108d5b38.

Fixes: c9b108d5b38 ("Bump golangci-lint to v2.0.2")
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
---
 .cirrus.yml                            |  2 ++
 hack/golangci-lint.sh                  | 38 +++++++++++++++-----------
 pkg/machine/e2e/config_freebsd_test.go |  7 +++++
 3 files changed, 31 insertions(+), 16 deletions(-)
 create mode 100644 pkg/machine/e2e/config_freebsd_test.go

diff --git a/.cirrus.yml b/.cirrus.yml
index eefed89ac4..2f7be8f50a 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -330,6 +330,8 @@ freebsd_alt_build_task:
         image_family: freebsd-13-4
     setup_script:
         - pkg install -y gpgme bash go-md2man gmake gsed gnugrep go pkgconf zstd
+    lint_script:
+        - gmake golangci-lint
     build_amd64_script:
         - gmake podman-release
     # This task cannot make use of the shared repo.tar.zst artifact and must
diff --git a/hack/golangci-lint.sh b/hack/golangci-lint.sh
index a7b11e5115..457d56e7a1 100755
--- a/hack/golangci-lint.sh
+++ b/hack/golangci-lint.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 # Run golangci-lint with different sets of build tags.
 set -e
@@ -8,23 +8,29 @@ set -e
 # a very old version, where modern features (like `declare -A`) are
 # absent.
 
-echo "Linting for GOOS=$GOOS"
-# Special case: for Darwin and Windows only "remote" linting is possible and required.
-if [[ "$GOOS" == "windows" || "$GOOS" == "darwin" ]]; then
-  (
-    set -x
-    ./bin/golangci-lint run --build-tags="remote,containers_image_openpgp" "$@"
-  )
-  exit 0
-fi
+declare -a EXTRA_TAGS
 
-# Normal case (Linux): run linter for various sets of build tags.
-TAGS="apparmor,seccomp,selinux"
-for EXTRA_TAGS in "" ",systemd" ",remote"; do
+echo "Linting for GOOS=$GOOS"
+case "$GOOS" in
+  windows|darwin)
+    # For Darwin and Windows, only "remote" linting is possible and required.
+    TAGS="remote,containers_image_openpgp"
+    ;;
+  freebsd)
+    TAGS="containers_image_openpgp"
+    EXTRA_TAGS=(",remote")
+    ;;
+  *)
+    # Assume Linux: run linter for various sets of build tags.
+    TAGS="apparmor,seccomp,selinux"
+    EXTRA_TAGS=(",systemd" ",remote")
+esac
+
+for EXTRA in "" "${EXTRA_TAGS[@]}"; do
+  # Use set -x in a subshell to make it easy for a developer to copy-paste
+  # the command-line to focus or debug a single, specific linting category.
   (
-    # Make it really easy for a developer to copy-paste the command-line
-    # to focus or debug a single, specific linting category.
     set -x
-    ./bin/golangci-lint run --build-tags="${TAGS}${EXTRA_TAGS}" "$@"
+    ./bin/golangci-lint run --build-tags="${TAGS}${EXTRA}" "$@"
   )
 done
diff --git a/pkg/machine/e2e/config_freebsd_test.go b/pkg/machine/e2e/config_freebsd_test.go
new file mode 100644
index 0000000000..46107a10dd
--- /dev/null
+++ b/pkg/machine/e2e/config_freebsd_test.go
@@ -0,0 +1,7 @@
+package e2e_test
+
+const podmanBinary = "../../../bin/podman-remote"
+
+func getOtherProvider() string {
+	return ""
+}