diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 0000000..881f664 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,14 @@ +name: Lint Commit Messages +on: [pull_request] + +jobs: + commit_lint: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run linter + uses: wagoid/commitlint-github-action@v6 \ No newline at end of file diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 0000000..7d2370b --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,28 @@ +name: golangci-lint + +on: + push: + tags: + - v* + branches: + - main + pull_request: + +jobs: + golangci_lint: + name: Golang-CI (lint) + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 # action page: + with: + go-version: '1.23' + + - name: Run linter + uses: golangci/golangci-lint-action@v6 + with: + version: v1.60 + args: -v --build-tags=race --timeout=5m \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..6140408 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,16 @@ +name: Releases + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Create Release + uses: ncipollo/release-action@v1 \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cb113c8 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +ALL_GO_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | sort) + +test: + set -e; for dir in $(ALL_GO_MOD_DIRS); do \ + echo "go test in $${dir}"; \ + (cd "$${dir}" && \ + go test && \ + go vet); \ + done + +go_mod_tidy: + set -e; for dir in $(ALL_GO_MOD_DIRS); do \ + echo "go mod tidy in $${dir}"; \ + (cd "$${dir}" && \ + go get -u ./... && \ + go mod tidy); \ + done + +fmt: + gofmt -w -s ./ + goimports -w -local github.com/gowool/theme ./ \ No newline at end of file diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..ca77dee --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +set -e + +help() { + cat <<- EOF +Usage: TAG=tag $0 + +Updates version in go.mod files and pushes a new branch to GitHub. + +VARIABLES: + TAG git tag, for example, v1.0.0 +EOF + exit 0 +} + +if [ -z "$TAG" ] +then + printf "TAG is required\n\n" + help +fi + +TAG_REGEX="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$" +if ! [[ "${TAG}" =~ ${TAG_REGEX} ]]; then + printf "TAG is not valid: %s\n\n" "${TAG}" + exit 1 +fi + +TAG_FOUND=$(git tag --list "${TAG}") +if [[ ${TAG_FOUND} = ${TAG} ]] ; then + printf "tag %s already exists\n\n" "${TAG}" + exit 1 +fi + +if ! git diff --quiet +then + printf "working tree is not clean\n\n" + git status + exit 1 +fi + +git checkout main +make go_mod_tidy + +PACKAGE_DIRS=$(find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \; \ + | sed 's/^\.\///' \ + | sort) + +for dir in $PACKAGE_DIRS +do + sed -i '' "s@gowool/theme\([^ ]*\) v.*@gowool/theme\1 ${TAG}@" "${dir}/go.mod" +done + +git checkout -b "release/${TAG}" main +git add -u +git commit -m "chore: release $TAG (release.sh)" +git push origin "release/${TAG}" \ No newline at end of file diff --git a/scripts/tag.sh b/scripts/tag.sh new file mode 100755 index 0000000..8ed4fe8 --- /dev/null +++ b/scripts/tag.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -e + +help() { + cat <<- EOF +Usage: TAG=tag $0 + +Creates git tags for public Go packages. + +VARIABLES: + TAG git tag, for example, v1.0.0 +EOF + exit 0 +} + +if [ -z "$TAG" ] +then + printf "TAG env var is required\n\n"; + help +fi + +PACKAGE_DIRS=$(find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \; \ + | sed 's/^\.\///' \ + | sort) + +git tag "${TAG}" +git push origin "${TAG}" + +for dir in $PACKAGE_DIRS +do + printf "tagging %s/%s\n" "${dir}" "${TAG}" + git tag "${dir}/${TAG}" + git push origin "${dir}/${TAG}" +done \ No newline at end of file