snapshot of https://github.com/casbin/casbin.git (master, 2026-09-15; blobs > 131072B omitted)
Some checks failed
Build / test (1.21) (push) Successful in 2m21s
Build / benchmark (1.21) (push) Failing after 2m28s
golangci-lint / golangci (push) Successful in 19m40s

This commit is contained in:
upstream-mirror
2026-09-15 21:46:19 +05:00
commit d8971e16fb
234 changed files with 28137 additions and 0 deletions

37
.github/workflows/comment.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Post Benchmark Comment
on:
workflow_run:
workflows: ["Performance Comparison for Pull Requests"]
types:
- completed
permissions:
pull-requests: write
jobs:
comment:
runs-on: ubuntu-latest
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: 'Download artifact'
uses: actions/github-script@v7
with:
script: |
const script = require('./.github/scripts/download_artifact.js')
await script({github, context, core})
- name: 'Unzip artifact'
run: unzip benchmark-results.zip
- name: 'Post comment'
uses: actions/github-script@v7
with:
script: |
const script = require('./.github/scripts/post_comment.js')
await script({github, context, core})

44
.github/workflows/default.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: Build
on:
push:
branches:
- master
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
go: ['1.21']
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go }}
- name: Run go test
run: make test
benchmark:
runs-on: ubuntu-latest
strategy:
matrix:
go: ['1.21']
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: ${{ matrix.go }}
- name: Run go test bench
run: make benchmark

26
.github/workflows/golangci-lint.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: golangci-lint
on:
push:
branches:
- master
- main
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
golangci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
- name: golangci-lint
uses: golangci/golangci-lint-action@v8

97
.github/workflows/performance-pr.yml vendored Normal file
View File

@@ -0,0 +1,97 @@
name: Performance Comparison for Pull Requests
on:
pull_request:
branches: [master]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
benchmark-pr:
name: Performance benchmark comparison
runs-on: ubuntu-latest
steps:
- name: Checkout PR branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 'stable'
# Save commit SHAs for display
- name: Save commit info
id: commits
run: |
BASE_SHA="${{ github.event.pull_request.base.sha }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
echo "base_short=${BASE_SHA:0:7}" >> $GITHUB_OUTPUT
echo "head_short=${HEAD_SHA:0:7}" >> $GITHUB_OUTPUT
# Run benchmark on PR branch
- name: Run benchmark on PR branch
run: |
go test -bench '.' -benchtime=2s -benchmem ./... | tee pr-bench.txt
# Checkout base branch and run benchmark
- name: Checkout base branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.base.sha }}
clean: false
path: base
- name: Run benchmark on base branch
working-directory: base
run: |
go test -bench '.' -benchtime=2s -benchmem ./... | \
tee ../base-bench.txt
# Install benchstat for comparison
- name: Install benchstat
run: go install golang.org/x/perf/cmd/benchstat@latest
# Compare benchmarks using benchstat
- name: Compare benchmarks with benchstat
id: benchstat
run: |
cat > comparison.md << 'EOF'
## Benchmark Comparison
Comparing base branch (`${{ steps.commits.outputs.base_short }}`)
vs PR branch (`${{ steps.commits.outputs.head_short }}`)
```
EOF
benchstat base-bench.txt pr-bench.txt >> comparison.md || true
echo '```' >> comparison.md
# Post-process to append percentage + emoji column (🚀 faster < -10%, 🐌 slower > +10%, otherwise ➡️)
if [ ! -f comparison.md ]; then
echo "comparison.md not found after benchstat." >&2
exit 1
fi
python3 .github/scripts/benchmark_formatter.py
# Save PR number
- name: Save PR number
run: |
PR_NUMBER="${{ github.event.pull_request.number }}"
if [ -z "$PR_NUMBER" ]; then
echo "Error: Pull request number is not available in event payload." >&2
exit 1
fi
echo "$PR_NUMBER" > pr_number.txt
# Upload benchmark results
- name: Upload benchmark results
uses: actions/upload-artifact@v4
with:
name: benchmark-results
path: |
comparison.md
pr_number.txt

204
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,204 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Releases are driven by manually pushed tags only. Nothing is published
# automatically when a pull request is merged.
#
# v<X>.<Y>.<Z>-rc<N> GitHub pre-release only.
# v<X>.<Y>.<Z> GitHub release plus the Go module proxy.
name: Release
on:
push:
tags:
- "v*"
permissions:
contents: write
jobs:
release:
if: ${{ github.repository == 'apache/casbin' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Compute release metadata
id: release
run: |
set -euo pipefail
TAG_NAME="${GITHUB_REF_NAME}"
if [[ "${TAG_NAME}" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
IS_RC="false"
elif [[ "${TAG_NAME}" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)-rc[0-9]+$ ]]; then
IS_RC="true"
else
echo "::error::Unsupported release tag: ${TAG_NAME}. Expected vX.Y.Z or vX.Y.Z-rcN."
exit 1
fi
VERSION="${BASH_REMATCH[1]}"
BASENAME="apache-casbin-incubating-${VERSION}-src"
# Previous release, used as the start of the change log range.
PREVIOUS_TAG="$(
{
git tag --list 'v*' | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' || true
echo "v${VERSION}"
} |
sort -V -u |
awk -v current="v${VERSION}" '
$0 == current {
print previous
exit
}
{
previous = $0
}
'
)"
{
echo "tag=${TAG_NAME}"
echo "version=${VERSION}"
echo "is_rc=${IS_RC}"
echo "basename=${BASENAME}"
echo "previous_tag=${PREVIOUS_TAG}"
} >> "${GITHUB_OUTPUT}"
- name: Generate release notes
run: |
set -euo pipefail
CURRENT_TAG="${{ steps.release.outputs.tag }}"
CURRENT_VERSION="${CURRENT_TAG#v}"
PREVIOUS_TAG="${{ steps.release.outputs.previous_tag }}"
RELEASE_DATE="$(date -u +%F)"
RANGE="${CURRENT_TAG}"
if [ -n "${PREVIOUS_TAG}" ]; then
RANGE="${PREVIOUS_TAG}..${CURRENT_TAG}"
fi
FEATURES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(feat)(\(.+\))?: ' || true)"
FIXES="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(fix)(\(.+\))?: ' || true)"
DOCS="$(git log --pretty=format:'%s (%h)' "${RANGE}" | grep -Ei '^(docs?|doc)(\(.+\))?: ' || true)"
{
if [ -n "${PREVIOUS_TAG}" ]; then
echo "# [${CURRENT_VERSION}](https://github.com/${GITHUB_REPOSITORY}/compare/${PREVIOUS_TAG}...${CURRENT_TAG}) (${RELEASE_DATE})"
else
echo "# ${CURRENT_VERSION} (${RELEASE_DATE})"
fi
echo
if [ "${{ steps.release.outputs.is_rc }}" = "true" ]; then
echo "Release candidate for ${{ steps.release.outputs.version }}. This is not an official release."
echo
fi
if [ -n "${FEATURES}" ]; then
echo "## Features"
echo
printf '%s\n' "${FEATURES}" | sed 's/^/- /'
echo
fi
if [ -n "${FIXES}" ]; then
echo "## Fixes"
echo
printf '%s\n' "${FIXES}" | sed 's/^/- /'
echo
fi
if [ -n "${DOCS}" ]; then
echo "## Docs"
echo
printf '%s\n' "${DOCS}" | sed 's/^/- /'
echo
fi
if [ -z "${FEATURES}${FIXES}${DOCS}" ]; then
echo "## Notes"
echo
echo "- No feat/fix/doc commits were found in this release range."
fi
} > RELEASE_NOTES.md
- name: Create source archives
run: |
set -euo pipefail
BASENAME="${{ steps.release.outputs.basename }}"
mkdir -p dist
git archive --format=tar.gz --prefix="${BASENAME}/" -o "dist/${BASENAME}.tar.gz" "${{ steps.release.outputs.tag }}"
git archive --format=zip --prefix="${BASENAME}/" -o "dist/${BASENAME}.zip" "${{ steps.release.outputs.tag }}"
cd dist
for archive in "${BASENAME}.tar.gz" "${BASENAME}.zip"; do
sha512sum "${archive}" > "${archive}.sha512"
done
sha512sum --check ./*.sha512
- name: Publish GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
if [ "${{ steps.release.outputs.is_rc }}" = "true" ]; then
TITLE="Apache Casbin (Incubating) ${{ steps.release.outputs.version }} (release candidate ${{ steps.release.outputs.tag }})"
FLAGS=(--prerelease)
else
TITLE="Apache Casbin (Incubating) ${{ steps.release.outputs.version }}"
FLAGS=(--latest)
fi
gh release create "${{ steps.release.outputs.tag }}" \
--verify-tag \
--title "${TITLE}" \
--notes-file RELEASE_NOTES.md \
"${FLAGS[@]}" \
dist/*
- name: Publish to the Go module proxy
if: ${{ steps.release.outputs.is_rc == 'false' }}
run: |
set -euo pipefail
MODULE_PATH="$(awk '/^module /{print $2; exit}' go.mod)"
TAG="${{ steps.release.outputs.tag }}"
# Requesting the version makes the proxy fetch and cache it, which is
# what publishes the release to the Go module ecosystem.
for attempt in 1 2 3; do
if curl --fail --silent --show-error --location \
"https://proxy.golang.org/${MODULE_PATH}/@v/${TAG}.info"; then
echo
echo "Published ${MODULE_PATH}@${TAG} to proxy.golang.org."
exit 0
fi
echo "Attempt ${attempt} failed, retrying in 30s..."
sleep 30
done
echo "::error::Failed to publish ${MODULE_PATH}@${TAG} to proxy.golang.org."
exit 1