Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

linter: copy over Go version check scripts from LND #1080

Merged
merged 1 commit into from
Aug 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,11 @@ fmt: $(GOIMPORTS_BIN)

check-go-version-yaml:
@$(call print, "Checking for target Go version (v$(GO_VERSION)) in YAML files (*.yaml, *.yml)")
./tools/check-go-version-yaml.sh $(GO_VERSION)
./scripts/check-go-version-yaml.sh $(GO_VERSION)

check-go-version-dockerfile:
@$(call print, "Checking for target Go version (v$(GO_VERSION)) in Dockerfile files (*Dockerfile)")
./tools/check-go-version-dockerfile.sh $(GO_VERSION)
./scripts/check-go-version-dockerfile.sh $(GO_VERSION)

lint-source: docker-tools
@$(call print, "Linting source.")
Expand Down
64 changes: 64 additions & 0 deletions scripts/check-go-version-dockerfile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/bin/bash

# Function to check if the Dockerfile contains only the specified Go version.
check_go_version() {
local dockerfile="$1"
local required_go_version="$2"

# Use grep to find lines with 'FROM golang:'
local go_lines=$(grep -i '^FROM golang:' "$dockerfile")

# Check if all lines have the required Go version.
if [ -z "$go_lines" ]; then
# No Go version found in the file. Skip the check.
return
elif echo "$go_lines" | grep -q -v "$required_go_version"; then
echo "$go_lines"
echo "Error: $dockerfile does not use Go version $required_go_version exclusively."
exit 1
else
echo "$dockerfile is using Go version $required_go_version."
fi
}

# Check if the target Go version argument is provided.
if [ $# -eq 0 ]; then
echo "Usage: $0 <target_go_version>"
exit 1
fi

target_go_version="$1"

# File paths to be excluded from the check.
exception_list=(
# Exclude the tools Dockerfile as otherwise the linter may need to be
# considered every time the Go version is updated.
"./tools/Dockerfile"
)

# is_exception checks if a file is in the exception list.
is_exception() {
local file="$1"
for exception in "${exception_list[@]}"; do
if [ "$file" == "$exception" ]; then
return 0
fi
done
return 1
}

# Search for Dockerfiles in the current directory and its subdirectories.
dockerfiles=$(find . -type f -name "*.Dockerfile" -o -name "Dockerfile")

# Check each Dockerfile
for file in $dockerfiles; do
# Skip the file if it is in the exception list.
if is_exception "$file"; then
echo "Skipping $file"
continue
fi

check_go_version "$file" "$target_go_version"
done

echo "All Dockerfiles pass the Go version check for Go version $target_go_version."
75 changes: 75 additions & 0 deletions scripts/check-go-version-yaml.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/bin/bash

# Function to check if the YAML file contains the specified Go version after
# field 'go:'.
check_go_version_yaml() {
local yamlfile="$1"
local required_go_version="$2"

# Use grep to find lines with 'go:'. The grep exist status is ignored.
local go_lines=$(grep -i '^\s*go:\s*"[0-9]\+\.[0-9]\+\(\.[0-9]\+\)\?"' "$yamlfile" || true)

# Check if any lines specify the Go version.
if [ -n "$go_lines" ]; then
# Extract the Go version from the file's lines. Example matching strings:
# go: "1.21.0"
local extracted_go_version=$(echo "$go_lines" | sed -n 's/.*go: "\([^"]*\)".*/\1/p')

# Check if the extracted Go version matches the required version.
if [ "$extracted_go_version" != "$required_go_version" ]; then
echo "Error finding pattern 'go:': $yamlfile specifies Go version '$extracted_go_version', but required version is '$required_go_version'."
exit 1
else
echo "$yamlfile specifies Go version $required_go_version."
fi
fi
}

# Function to check if the YAML file contains the specified Go version after
# environment variable 'GO_VERSION:'.
check_go_version_env_variable() {
local yamlfile="$1"
local required_go_version="$2"

# Use grep to find lines with 'GO_VERSION:'. The grep exist status is
# ignored.
local go_lines=$(grep -i 'GO_VERSION:' "$yamlfile" || true)

# Check if any lines specify the Go version.
if [ -n "$go_lines" ]; then
# Extract the Go version from the file's lines. Example matching strings:
# GO_VERSION: "1.21.0"
# GO_VERSION: '1.21.0'
# GO_VERSION: 1.21.0
# GO_VERSION:1.21.0
# GO_VERSION:1.21.0
local extracted_go_version=$(echo "$go_lines" | sed -n 's/.*GO_VERSION[: ]*["'\'']*\([0-9.]*\).*/\1/p')

# Check if the extracted Go version matches the required version.
if [ "$extracted_go_version" != "$required_go_version" ]; then
echo "Error finding pattern 'GO_VERSION:': $yamlfile specifies Go version '$extracted_go_version', but required version is '$required_go_version'."
exit 1
else
echo "$yamlfile specifies Go version $required_go_version."
fi
fi
}

# Check if the target Go version argument is provided.
if [ $# -eq 0 ]; then
echo "Usage: $0 <target_go_version>"
exit 1
fi

target_go_version="$1"

# Search for YAML files in the current directory and its subdirectories.
yaml_files=$(find . -type f \( -name "*.yaml" -o -name "*.yml" \))

# Check each YAML file.
for file in $yaml_files; do
check_go_version_yaml "$file" "$target_go_version"
check_go_version_env_variable "$file" "$target_go_version"
done

echo "All YAML files pass the Go version check for Go version $target_go_version."
53 changes: 0 additions & 53 deletions tools/check-go-version-dockerfile.sh

This file was deleted.

63 changes: 0 additions & 63 deletions tools/check-go-version-yaml.sh

This file was deleted.

Loading