diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41ef26f..efe308b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,143 +18,142 @@ on: - major jobs: - ################################################# TODO Uncomment job -# bump-version: -# name: bump-version -# runs-on: ubuntu-latest -# steps: -# - name: Configure SSH for Git -# if: env.ACT != 'true' -# run: | -# mkdir -p ~/.ssh -# echo "${{ secrets.RELEASE_BOT_SSH_KEY }}" > ~/.ssh/id_ed25519 -# chmod 600 ~/.ssh/id_ed25519 -# ssh-keyscan -H github.com >> ~/.ssh/known_hosts -# -# - name: Checkout repository -# if: env.ACT != 'true' -# uses: actions/checkout@v3 -# with: -# ssh-key: ${{ secrets.RELEASE_BOT_SSH_KEY }} -# fetch-depth: 0 -# -# - name: Checkout repository -# if: env.ACT == 'true' -# uses: actions/checkout@v3 -# with: -# fetch-depth: 0 -# -# - name: Set up Python -# uses: actions/setup-python@v4 -# with: -# python-version: "3.10" -# -# - name: Install Commitizen -# run: | -# python -m pip install --upgrade pip -# pip install commitizen -# npm install -g conventional-changelog-cli -# -# - name: Configure Git user -# run: | -# git config user.name "github-actions[bot]" -# git config user.email "github-actions[bot]@users.noreply.github.com" -# -# - name: Bump version with Commitizen -# run: | -# cz bump --yes --increment ${{ github.event.inputs.bump_type }} -# -# - name: Amend commit message to include '[skip ci]' -# run: | -# git commit --amend --no-edit -m "$(git log -1 --pretty=%B) [skip ci]" -# -# - name: Install Rust stable -# uses: dtolnay/rust-toolchain@stable -# -# - name: Get the new version tag -# id: version -# run: | -# mkdir -p artifacts -# NEW_TAG=$(cz version --project) -# echo "New version: $NEW_TAG" -# echo "version=$NEW_TAG" >> $GITHUB_ENV -# echo "$NEW_TAG" > artifacts/release-version -# -# - name: Get the previous version tag -# id: prev_version -# run: | -# PREV_TAG=$(git describe --tags --abbrev=0 ${GITHUB_SHA}^) -# echo "Previous tag: $PREV_TAG" -# echo "prev_version=$PREV_TAG" >> $GITHUB_ENV -# -# - name: Bump Cargo.toml version -# shell: bash -# working-directory: ${{ github.workspace }} -# env: -# VERSION: ${{ env.version }} -# run: | -# set -euo pipefail -# : "${VERSION:?env.version is empty}" -# -# # Ignore Act's local artifact dir noise -# echo artifacts/ >> .git/info/exclude || true -# -# # Edit the version line right after name="gman" -# sed -E -i ' -# /^[[:space:]]*name[[:space:]]*=[[:space:]]*"gman"[[:space:]]*$/ { -# n -# s|^[[:space:]]*version[[:space:]]*=[[:space:]]*"[^"]*"|version = "'"$VERSION"'"| -# } -# ' Cargo.toml -# -# cargo update || true -# -# # Git config that helps in Act -# git config user.name "github-actions[bot]" -# git config user.email "github-actions[bot]@users.noreply.github.com" -# git config --global --add safe.directory "$GITHUB_WORKSPACE" -# -# git status --porcelain -# git diff --name-only -- Cargo.toml Cargo.lock || true -# -# if ! git diff --quiet -- Cargo.toml Cargo.lock; then -# git add -u -- Cargo.toml Cargo.lock -# git commit -m "chore: bump Cargo.toml to $VERSION" -# else -# echo "No changes to commit (already at $VERSION)" -# fi -# -# - name: Generate changelog for the version bump -# id: changelog -# run: | -# changelog=$(conventional-changelog -p angular -i CHANGELOG.md -s --from ${{ env.prev_version }} --to ${{ env.version }}) -# echo "$changelog" > artifacts/changelog.md -# echo "changelog_body=$(cat artifacts/changelog.md)" >> $GITHUB_ENV -# -# - name: Push changes -# if: env.ACT != 'true' -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# run: | -# git push origin --follow-tags -# -# - name: Upload artifacts -# uses: actions/upload-artifact@v4 -# with: -# path: artifacts -# -# - name: Upload the changed Cargo files (Act) -# if: env.ACT == 'true' -# uses: actions/upload-artifact@v4 -# with: -# name: bumped-cargo-files -# path: | -# Cargo.toml -# Cargo.lock + bump-version: + name: bump-version + runs-on: ubuntu-latest + steps: + - name: Configure SSH for Git + if: env.ACT != 'true' + run: | + mkdir -p ~/.ssh + echo "${{ secrets.RELEASE_BOT_SSH_KEY }}" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/id_ed25519 + ssh-keyscan -H github.com >> ~/.ssh/known_hosts + + - name: Checkout repository + if: env.ACT != 'true' + uses: actions/checkout@v3 + with: + ssh-key: ${{ secrets.RELEASE_BOT_SSH_KEY }} + fetch-depth: 0 + + - name: Checkout repository + if: env.ACT == 'true' + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Install Commitizen + run: | + python -m pip install --upgrade pip + pip install commitizen + npm install -g conventional-changelog-cli + + - name: Configure Git user + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Bump version with Commitizen + run: | + cz bump --yes --increment ${{ github.event.inputs.bump_type }} + + - name: Amend commit message to include '[skip ci]' + run: | + git commit --amend --no-edit -m "$(git log -1 --pretty=%B) [skip ci]" + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + + - name: Get the new version tag + id: version + run: | + mkdir -p artifacts + NEW_TAG=$(cz version --project) + echo "New version: $NEW_TAG" + echo "version=$NEW_TAG" >> $GITHUB_ENV + echo "$NEW_TAG" > artifacts/release-version + + - name: Get the previous version tag + id: prev_version + run: | + PREV_TAG=$(git describe --tags --abbrev=0 ${GITHUB_SHA}^) + echo "Previous tag: $PREV_TAG" + echo "prev_version=$PREV_TAG" >> $GITHUB_ENV + + - name: Bump Cargo.toml version + shell: bash + working-directory: ${{ github.workspace }} + env: + VERSION: ${{ env.version }} + run: | + set -euo pipefail + : "${VERSION:?env.version is empty}" + + # Ignore Act's local artifact dir noise + echo artifacts/ >> .git/info/exclude || true + + # Edit the version line right after name="gman" + sed -E -i ' + /^[[:space:]]*name[[:space:]]*=[[:space:]]*"gman"[[:space:]]*$/ { + n + s|^[[:space:]]*version[[:space:]]*=[[:space:]]*"[^"]*"|version = "'"$VERSION"'"| + } + ' Cargo.toml + + cargo update || true + + # Git config that helps in Act + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git config --global --add safe.directory "$GITHUB_WORKSPACE" + + git status --porcelain + git diff --name-only -- Cargo.toml Cargo.lock || true + + if ! git diff --quiet -- Cargo.toml Cargo.lock; then + git add -u -- Cargo.toml Cargo.lock + git commit -m "chore: bump Cargo.toml to $VERSION" + else + echo "No changes to commit (already at $VERSION)" + fi + + - name: Generate changelog for the version bump + id: changelog + run: | + changelog=$(conventional-changelog -p angular -i CHANGELOG.md -s --from ${{ env.prev_version }} --to ${{ env.version }}) + echo "$changelog" > artifacts/changelog.md + echo "changelog_body=$(cat artifacts/changelog.md)" >> $GITHUB_ENV + + - name: Push changes + if: env.ACT != 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git push origin --follow-tags + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + path: artifacts + + - name: Upload the changed Cargo files (Act) + if: env.ACT == 'true' + uses: actions/upload-artifact@v4 + with: + name: bumped-cargo-files + path: | + Cargo.toml + Cargo.lock build-release-artifacts: name: build-release -# needs: [bump-version] ## TODO uncomment + needs: [bump-version] runs-on: ${{ matrix.os }} env: RUST_BACKTRACE: 1 @@ -166,42 +165,32 @@ jobs: - target: aarch64-unknown-linux-musl os: ubuntu-latest use-cross: true + artifact-suffix: aarch64-musl cargo-flags: "" - target: aarch64-apple-darwin os: macos-latest use-cross: true + artifact-suffix: macos-arm64 cargo-flags: "" - target: aarch64-pc-windows-msvc os: windows-latest use-cross: true + artifact-suffix: windows-aarch64 cargo-flags: "" - target: x86_64-apple-darwin os: macos-latest + artifact-suffix: macos cargo-flags: "" - target: x86_64-pc-windows-msvc os: windows-latest + artifact-suffix: windows cargo-flags: "" - target: x86_64-unknown-linux-musl os: ubuntu-latest + artifact-suffix: linux-musl use-cross: true cargo-flags: "" - # prettier-ignore -# job: -# - { name: "macOS-arm64", os: "macOS-latest", target: "aarch64-apple-darwin", artifact_suffix: "macos-arm64", use-cross: true } -# - { name: "macOS-amd64", os: "macOS-latest", target: "x86_64-apple-darwin", artifact_suffix: "macos" } -# - { name: "windows-amd64", os: "windows-latest", target: "x86_64-pc-windows-msvc", artifact_suffix: "windows" } -# - { name: "windows-aarch64", os: "windows-latest", target: "aarch64-pc-windows-msvc", artifact_suffix: "windows-aarch64", use-cross: true } -# - { name: "linux-gnu", os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", artifact_suffix: "linux" } -# - { name: "linux-musl", os: "ubuntu-latest", target: "x86_64-unknown-linux-musl", artifact_suffix: "linux-musl", use-cross: true, } -# - { name: "linux-aarch64-gnu", os: "ubuntu-latest", target: "aarch64-unknown-linux-gnu", artifact_suffix: "aarch64-gnu", use-cross: true, test-bin: "--bin gman" } -# - { name: "linux-aarch64-musl", os: "ubuntu-latest", target: "aarch64-unknown-linux-musl", artifact_suffix: "aarch64-musl", use-cross: true, test-bin: "--bin gman" } -# - { name: "linux-arm-gnu", os: "ubuntu-latest", target: "arm-unknown-linux-gnueabi", artifact_suffix: "armv6-gnu", use-cross: true, test-bin: "--bin gman" } -# - { name: "linux-arm-musl", os: "ubuntu-latest", target: "arm-unknown-linux-musleabihf", artifact_suffix: "armv6-musl", use-cross: true, test-bin: "--bin gman" } -# - { name: "linux-armv7-gnu", os: "ubuntu-latest", target: "armv7-unknown-linux-gnueabihf", artifact_suffix: "armv7-gnu", use-cross: true, test-bin: "--bin gman" } -# - { name: "linux-armv7-musl", os: "ubuntu-latest", target: "armv7-unknown-linux-musleabihf", artifact_suffix: "armv7-musl", use-cross: true, test-bin: "--bin gman" } -# rust: [stable] - steps: - name: Check if actor is repository owner if: ${{ github.actor != github.repository_owner && env.ACT != 'true' }} @@ -220,39 +209,42 @@ jobs: git fetch --all git pull -## TODO Uncomment for sure -# - name: Get bumped Cargo files (Act) -# if: env.ACT == 'true' -# uses: actions/download-artifact@v4 -# with: -# name: bumped-cargo-files -# path: ${{ github.workspace }} + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + merge-multiple: true -# - uses: actions/cache@v3 -# name: Cache Cargo registry -# with: -# path: ~/.cargo/registry -# key: ${{ runner.os }}-cargo-registry-${{ hashFiles('Cargo.lock') }} + - name: Ensure repository is up-to-date + if: env.ACT != 'true' + run: | + git fetch --all + git pull -# - uses: actions/cache@v3 -# if: startsWith(matrix.job.name, 'linux-') -# with: -# path: ~/.cargo/bin -# key: ${{ runner.os }}-cargo-bin-${{ hashFiles('.github/workflows/release.yml') }} + - name: Set environment variables + run: | + release_version="$(cat ./artifacts/release-version)" + echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV + changelog_body="$(cat ./artifacts/changelog.md)" + echo "changelog_body=$(cat artifacts/changelog.md)" >> $GITHUB_ENV + + - name: Validate release environment variables + run: | + echo "Release version: ${{ env.RELEASE_VERSION }}" + echo "Changelog body: ${{ env.changelog_body }}" + + - name: Get bumped Cargo files (Act) + if: env.ACT == 'true' + uses: actions/download-artifact@v4 + with: + name: bumped-cargo-files + path: ${{ github.workspace }} - uses: dtolnay/rust-toolchain@stable name: Set Rust toolchain with: targets: ${{ matrix.target }} -# - uses: taiki-e/setup-cross-toolchain-action@v1 -# with: -# NB: sets CARGO_BUILD_TARGET evar - do not need --target flag in build -# target: ${{ matrix.job.target }} - -# - uses: taiki-e/install-action@cross - # if: ${{ matrix.job.use-cross }} - - name: Install cross if: matrix.use-cross uses: taiki-e/install-action@v2 @@ -275,93 +267,6 @@ jobs: sudo apt-get update sudo apt-get install -y libclang-20-dev libclang-dev - # Make libclang discoverable by bindgen/clang-sys -# - name: Export LIBCLANG_PATH -# if: matrix.os == 'ubuntu-latest' -# run: | -# echo "LIBCLANG_PATH=$(llvm-config-20 --libdir)" >> "$GITHUB_ENV" -# ls -l "$LIBCLANG_PATH"/libclang*.so || true - -# - name: Installing needed Ubuntu dependencies -# if: matrix.os == 'ubuntu-latest' -# shell: bash -# run: | -# sudo apt-get -y update -# case ${{ matrix.target }} in -# arm*-linux-*) sudo apt-get -y install gcc-arm-linux-gnueabihf ;; -# aarch64-*-linux-*) sudo apt-get -y install gcc-aarch64-linux-gnu ;; -# esac -# -# - name: Install clang + bindgen for musl targets -# if: matrix.job.os == 'ubuntu-latest' -# shell: bash -# run: | -# set -euxo pipefail -# sudo apt-get -y update -# sudo apt-get -y install clang llvm-dev libclang-dev pkg-config cmake make build-essential musl-tools -# # force install to avoid stale cache issues -# cargo install --force --locked bindgen-cli -# echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" -# # help bindgen find libclang -# echo "LIBCLANG_PATH=$(llvm-config --libdir)" >> "$GITHUB_ENV" -# # quick visibility checks (fail early if missing) -# which bindgen -# bindgen --version -# clang --version -# -# - name: Configure bindgen target flags for musl cross-compile -# if: matrix.job.os == 'ubuntu-latest' && contains(matrix.job.target, 'musl') -# shell: bash -# run: | -# set -euo pipefail -# triple='${{ matrix.job.target }}' -# # Bindgen needs explicit target to avoid host header confusion -# echo "BINDGEN_EXTRA_CLANG_ARGS_${triple//-/_}=--target=$triple" >> "$GITHUB_ENV" -# # CC hints help any C sub-builds in the tree -# case "$triple" in -# x86_64-unknown-linux-musl) -# echo "CC_x86_64_unknown_linux_musl=musl-gcc" >> "$GITHUB_ENV" -# ;; -# aarch64-unknown-linux-musl) -# echo "CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc" >> "$GITHUB_ENV" -# ;; -# arm-unknown-linux-musleabihf) -# echo "CC_arm_unknown_linux_musleabihf=arm-linux-musleabihf-gcc" >> "$GITHUB_ENV" -# ;; -# armv7-unknown-linux-musleabihf) -# echo "CC_armv7_unknown_linux_musleabihf=armv7-linux-musleabihf-gcc" >> "$GITHUB_ENV" -# ;; -# esac -# echo "PKG_CONFIG_ALLOW_CROSS=1" >> "$GITHUB_ENV" -# -# - name: OpenSSL (vendored) toolchain for musl -# if: startsWith(matrix.job.name, 'linux-') && contains(matrix.job.target, 'musl') -# shell: bash -# run: | -# # Tools needed for building vendored OpenSSL -# sudo apt-get -y update -# sudo apt-get -y install musl-tools pkg-config perl make cmake -# -# # Let openssl-sys know we're cross-compiling and want static -# echo "OPENSSL_STATIC=1" >> $GITHUB_ENV -# echo "PKG_CONFIG_ALLOW_CROSS=1" >> $GITHUB_ENV -# -# # Set the right C compiler per musl target (some provided by taiki-e/setup-cross-toolchain-action) -# case "${{ matrix.job.target }}" in -# x86_64-unknown-linux-musl) -# echo "CC_x86_64_unknown_linux_musl=musl-gcc" >> $GITHUB_ENV -# ;; -# aarch64-unknown-linux-musl) -# # If your toolchain action installs aarch64-linux-musl-gcc, use that: -# echo "CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc" >> $GITHUB_ENV -# ;; -# arm-unknown-linux-musleabihf) -# echo "CC_arm_unknown_linux_musleabihf=arm-linux-musleabihf-gcc" >> $GITHUB_ENV -# ;; -# armv7-unknown-linux-musleabihf) -# echo "CC_armv7_unknown_linux_musleabihf=armv7-linux-musleabihf-gcc" >> $GITHUB_ENV -# ;; -# esac - name: Show Version Information (Rust, cargo, GCC) shell: bash run: | @@ -372,74 +277,6 @@ jobs: cargo -V rustc -V -# - name: Build -# shell: bash -# run: | -# set -euxo pipefail -# cross build --release --target=${{ matrix.job.target }} -# # if [[ "${{ matrix.job.use-cross || 'false' }}" == 'true' ]]; then -# # cross build --release --locked --target=${{ matrix.job.target }} --verbose -# # else -# # cargo build --release --locked --target=${{ matrix.job.target }} --verbose -# # fi -# -# - name: Verify file -# shell: bash -# run: | -# file target/${{ matrix.job.target }}/release/gman -# -# - name: Test -# if: matrix.job.target != 'aarch64-apple-darwin' && matrix.job.target != 'aarch64-pc-windows-msvc' -# shell: bash -# run: | -# set -euxo pipefail -# if [[ "${{ matrix.job.use-cross || 'false' }}" == 'true' ]]; then -# cross test --release --locked --target=${{ matrix.job.target }} --verbose ${{ matrix.job.test-bin }} -# else -# cargo test --release --locked --target=${{ matrix.job.target }} --verbose ${{ matrix.job.test-bin }} -# fi -# -# - name: Test -# if: matrix.job.target != 'aarch64-apple-darwin' && matrix.job.target != 'aarch64-pc-windows-msvc' -# run: cargo test --release --verbose --target=${{ matrix.job.target }} ${{ matrix.job.test-bin }} -# -# - name: Packaging final binary (Windows) -# if: matrix.job.os == 'windows-latest' -# shell: bash -# run: | -# cd target/${{ matrix.job.target }}/release -# BINARY_NAME=gman.exe -# if [ "${{ matrix.job.target }}" != "aarch64-pc-windows-msvc" ]; then -# # strip the binary -# strip $BINARY_NAME -# fi -# RELEASE_NAME=gman-${{ matrix.job.artifact_suffix }} -# mkdir -p artifacts -# tar czvf $RELEASE_NAME.tar.gz $BINARY_NAME -# # create sha checksum files -# certutil -hashfile $RELEASE_NAME.tar.gz sha256 | grep -E [A-Fa-f0-9]{64} > $RELEASE_NAME.sha256 -# echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV -# -# - name: Packaging final binary (macOS and Linux) -# if: matrix.job.os != 'windows-latest' -# shell: bash -# run: | -# # set the right strip executable -# STRIP="strip"; -# case ${{ matrix.job.target }} in -# arm*-linux-*) STRIP="arm-linux-gnueabihf-strip" ;; -# aarch64-*-linux-*) STRIP="aarch64-linux-gnu-strip" ;; -# esac; -# cd target/${{ matrix.job.target }}/release -# BINARY_NAME=gman -# # strip the binary -# "$STRIP" "$BINARY_NAME" -# RELEASE_NAME=gman-${{ matrix.job.artifact_suffix }} -# tar czvf $RELEASE_NAME.tar.gz $BINARY_NAME -# # create sha checksum files -# shasum -a 256 $RELEASE_NAME.tar.gz > $RELEASE_NAME.sha256 -# echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV - - name: Build shell: bash run: $BUILD_CMD build --locked --release --target=${{ matrix.target }} ${{ matrix.cargo-flags }} @@ -449,7 +286,7 @@ jobs: id: package env: target: ${{ matrix.target }} - version: ${{ steps.check-tag.outputs.version }} + version: ${{ env.RELEASE_VERSION }} run: | set -euxo pipefail @@ -468,34 +305,57 @@ jobs: if [[ "$RUNNER_OS" == "Windows" ]]; then archive=$dist_dir/$name.zip + sha=$dist_dir/$name.sha256 7z a $archive * + certutil -hashfile $archive sha256 | grep -E [A-Fa-f0-9]{64} > $sha echo "archive=dist/$name.zip" >> $GITHUB_OUTPUT + echo "sha=dist/$name.sha256" >> $GITHUB_OUTPUT else archive=$dist_dir/$name.tar.gz + sha=$dist_dir/$name.sha256 tar -czf $archive * + shasum -a 256 $archive > $sha echo "archive=dist/$name.tar.gz" >> $GITHUB_OUTPUT + echo "sha=dist/$name.sha256" >> $GITHUB_OUTPUT fi -# - name: Publish Archive -# uses: softprops/action-gh-release@v2 -# if: ${{ startsWith(github.ref, 'refs/tags/') }} -# with: -# draft: false -# files: ${{ steps.package.outputs.archive }} -# prerelease: ${{ steps.check-tag.outputs.rc == 'true' }} - -# - name: Add artifacts +# - name: Test +# if: matrix.target != 'aarch64-apple-darwin' && matrix.target != 'aarch64-pc-windows-msvc' +# shell: bash # run: | -# mkdir -p artifacts -# cp target/${{ matrix.job.target }}/release/${{ env.RELEASE_NAME }}.tar.gz artifacts/ -# cp target/${{ matrix.job.target }}/release/${{ env.RELEASE_NAME }}.sha256 artifacts/ -# -# - name: Upload artifacts -# uses: actions/upload-artifact@v4 -# with: -# name: artifacts-${{ env.RELEASE_NAME }} -# path: artifacts -# overwrite: true +# set -euxo pipefail +# if [[ "${{ matrix.use-cross || 'false' }}" == 'true' ]]; then +# cross test --release --locked --target=${{ matrix.target }} --verbose +# else +# cargo test --release --locked --target=${{ matrix.target }} --verbose +# fi + + - name: Publish Archive + if: env.ACT != 'true' + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + draft: false + files: ${{ steps.package.outputs.archive }} ${{ steps.package.outputs.sha }} + tag_name: v${{ env.RELEASE_VERSION }} + name: "v${{ env.RELEASE_VERSION }}" + body: ${{ env.changelog_body }} + draft: false + prerelease: false + + - name: Add artifacts + run: | + mkdir -p artifacts + cp ${{ steps.package.outputs.archive }} artifacts/ + cp ${{ steps.package.outputs.sha }} artifacts/ + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: artifacts-${{ env.RELEASE_NAME }} + path: artifacts + overwrite: true ## TODO Uncomment for sure