diff --git a/.circleci/config.yml b/.circleci/config.yml index 84a6482..416a316 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,55 +1,16 @@ version: 2.1 parameters: - fingerprint: - type: string - default: SHA256:OkxsH8Z6Iim6WDJBaII9eTT9aaO1f3eDc6IpsgYYPVg min_rust_version: type: string default: "1.88" - release_flag: - type: boolean - default: false - description: "If true, the release workflow will be executed." - success_flag: - type: boolean - default: false - description: "If true, the success pipeline will be executed." - validation_flag: - type: boolean - default: false - description: "If true, the validation pipeline will be executed." orbs: - toolkit: jerus-org/circleci-toolkit@4.4.2 - -# Custom executors removed - using toolkit rolling executors instead + toolkit: jerus-org/circleci-toolkit@4.9.6 workflows: - check_last_commit: - when: - and: - - not: - equal: [scheduled_pipeline, << pipeline.trigger_source >>] - - not: << pipeline.parameters.success_flag >> - - not: << pipeline.parameters.release_flag >> - - not: << pipeline.parameters.validation_flag >> - - jobs: - - toolkit/choose_pipeline: - name: choose pipeline based on committer - context: bot-check - validation: - when: - and: - - not: - equal: [scheduled_pipeline, << pipeline.trigger_source >>] - - not: << pipeline.parameters.success_flag >> - - << pipeline.parameters.validation_flag >> - - not: << pipeline.parameters.release_flag >> jobs: - # Signature verification for trusted PRs (with write access for comments) - toolkit/verify_commit_signatures: name: verify_commit_signatures_trusted context: bot-check @@ -60,121 +21,70 @@ workflows: ignore: - main - /pull\/[0-9]+/ - # Signature verification for forked PRs (read-only, no comments) + - toolkit/verify_commit_signatures: name: verify_commit_signatures_forked post_comment: false update_pcu: false filters: branches: - only: /pull\/[0-9]+/ - - toolkit/label: + only: + - /pull\/[0-9]+/ + + - toolkit/required_builds_rolling: min_rust_version: << pipeline.parameters.min_rust_version >> - context: pcu-app - update_pcu: true + + - toolkit/optional_builds: + min_rust_version: << pipeline.parameters.min_rust_version >> + filters: + branches: + ignore: main + + - toolkit/test_doc_build: + min_rust_version: << pipeline.parameters.min_rust_version >> + filters: + branches: + ignore: main + + - toolkit/idiomatic_rust: + min_rust_version: << pipeline.parameters.min_rust_version >> + filters: + branches: + ignore: main + + - toolkit/common_tests_rolling: + min_rust_version: << pipeline.parameters.min_rust_version >> + + - toolkit/security: + name: security audit only + sonarcloud: false + # RUSTSEC-2025-0066: google-apis-common unmaintained — core transitive + # dependency of google-gmail1; no maintained Gmail API alternative exists. + ignore_advisories: RUSTSEC-2025-0066 filters: branches: only: - main - - toolkit/required_builds: - min_rust_version: << pipeline.parameters.min_rust_version >> - - toolkit/optional_builds: - min_rust_version: << pipeline.parameters.min_rust_version >> - - toolkit/test_doc_build: - min_rust_version: << pipeline.parameters.min_rust_version >> - - toolkit/common_tests: - min_rust_version: << pipeline.parameters.min_rust_version >> - test_runner: nextest - nextest_profile: ci - post-steps: - - store_test_results: - path: target/nextest/ci/junit.xml - - toolkit/idiomatic_rust: - min_rust_version: << pipeline.parameters.min_rust_version >> - - toolkit/security: - name: security audit only - sonarcloud: false - ignore_advisories: RUSTSEC-2025-0066 - filters: - branches: - only: /pull\/[0-9]+/ + - /pull\/[0-9]+/ + - toolkit/security: name: security with sonarcloud context: SonarCloud + # RUSTSEC-2025-0066: google-apis-common unmaintained — core transitive + # dependency of google-gmail1; no maintained Gmail API alternative exists. ignore_advisories: RUSTSEC-2025-0066 filters: branches: ignore: - /pull\/[0-9]+/ - main - - toolkit/update_prlog: + + - toolkit/code_coverage: + min_rust_version: << pipeline.parameters.min_rust_version >> + package: cull-gmail + context: SonarCloud filters: branches: ignore: - /pull\/[0-9]+/ - main - requires: - - verify_commit_signatures_trusted - - toolkit/required_builds - - toolkit/test_doc_build - - toolkit/idiomatic_rust - - security audit only - - security with sonarcloud - - toolkit/common_tests - context: - - release - - bot-check - ssh_fingerprint: << pipeline.parameters.fingerprint >> - min_rust_version: << pipeline.parameters.min_rust_version >> - - on_success: - when: - and: - - not: - equal: [scheduled_pipeline, << pipeline.trigger_source >>] - - << pipeline.parameters.success_flag >> - - not: << pipeline.parameters.validation_flag >> - - not: << pipeline.parameters.release_flag >> - - jobs: - - toolkit/end_success - - release: - when: - and: - - or: - - and: - - equal: [scheduled_pipeline, << pipeline.trigger_source >>] - - equal: ["release check", << pipeline.schedule.name >>] - - << pipeline.parameters.release_flag >> - - not: << pipeline.parameters.success_flag >> - - not: << pipeline.parameters.validation_flag >> - jobs: - - toolkit/save_next_version: - min_rust_version: << pipeline.parameters.min_rust_version >> - - - toolkit/make_release: - requires: - - toolkit/save_next_version - pre-steps: - - attach_workspace: - at: /tmp/workspace - - run: - name: Set SEMVER based on next-version file - command: | - set +ex - export SEMVER=$(cat /tmp/workspace/next-version) - echo $SEMVER - echo "export SEMVER=$SEMVER" >> "$BASH_ENV" - context: - - release - - bot-check - ssh_fingerprint: << pipeline.parameters.fingerprint >> - min_rust_version: << pipeline.parameters.min_rust_version >> - when_get_version: false - - - toolkit/no_release: - min_rust_version: << pipeline.parameters.min_rust_version >> - requires: - - toolkit/save_next_version: - - failed diff --git a/.circleci/release.yml b/.circleci/release.yml index d26db80..b816dbf 100644 --- a/.circleci/release.yml +++ b/.circleci/release.yml @@ -1,419 +1,21 @@ version: 2.1 parameters: - fingerprint: - type: string - default: SHA256:OkxsH8Z6Iim6WDJBaII9eTT9aaO1f3eDc6IpsgYYPVg - min_rust_version: - type: string - default: "1.88" - # Version override for crate release (used when nextsv cannot calculate) - # Set to empty string "" to use nextsv auto-detection - crate_version_override: + cull_gmail_version: type: string default: "" - # Version override for workspace/PRLOG release - # Set to empty string "" to use nextsv auto-detection - workspace_version_override: + description: "Override cull-gmail crate version (empty = nextsv auto-detect)" + workspace_version: type: string default: "" + description: "Override workspace v* version (empty = nextsv auto-detect)" orbs: - toolkit: jerus-org/circleci-toolkit@4.4.2 - -# Commands designed for future migration to circleci-toolkit -# These extend existing toolkit patterns with backward-compatible parameters -commands: - # New command: Check if version exists on crates.io - # Used for recovery scenarios where publish succeeded but workflow failed - check_crates_io_version: - description: > - Check if a version already exists on crates.io. - Sets SKIP_PUBLISH=true if version exists, false otherwise. - Used for recovery scenarios where crates.io publish succeeded but workflow failed afterward. - parameters: - package: - type: string - description: "Crate name on crates.io" - steps: - - run: - name: install kdeets - command: cargo install kdeets - - run: - name: Check crates.io for << parameters.package >> - command: | - set -eo pipefail - - # Use SEMVER or NEXT_VERSION (whichever is set) - VERSION="${SEMVER:-${NEXT_VERSION:-none}}" - - if [ "$VERSION" = "none" ]; then - echo "No version to check" - echo "export SKIP_PUBLISH=false" >> "$BASH_ENV" - exit 0 - fi - - USER_AGENT="circleci-toolkit/1.0 (https://github.com/jerus-org/circleci-toolkit)" - - most_recent_published="$(kdeets crate -br cull-gmail)" - - if [[ ${most_recent_published} == ${VERSION} ]]; then - echo "Version ${VERSION} exists on crates.io - will skip publish" - echo "export SKIP_PUBLISH=true" >> "$BASH_ENV" - else - echo "Version ${VERSION} not found on crates.io - will publish" - echo "export SKIP_PUBLISH=false" >> "$BASH_ENV" - fi - - # New command: Check if release tag already exists - # Used for recovery scenarios where tag was created but workflow failed - check_tag_exists: - description: > - Check if the release tag already exists. - Sets SKIP_RELEASE=true if tag exists, false otherwise. - Used for recovery scenarios where release partially succeeded. - parameters: - package: - type: string - description: "Package name (used to construct tag name)" - steps: - - run: - name: Check if tag exists for << parameters.package >> - command: | - set -eo pipefail - - # Use SEMVER or NEXT_VERSION (whichever is set) - VERSION="${SEMVER:-${NEXT_VERSION:-none}}" - - if [ "$VERSION" = "none" ]; then - echo "No version to check" - echo "export SKIP_RELEASE=false" >> "$BASH_ENV" - exit 0 - fi - - if [ "" = "<< parameters.package >>" ]; then - TAG="v${VERSION}" - else - TAG="<< parameters.package >>-v${VERSION}" - fi - - # Fetch tags from remote - git fetch --tags - - if git tag -l "$TAG" | grep -q .; then - echo "Tag ${TAG} already exists - will skip release" - echo "export SKIP_RELEASE=true" >> "$BASH_ENV" - else - echo "Tag ${TAG} not found - will proceed with release" - echo "export SKIP_RELEASE=false" >> "$BASH_ENV" - fi - - # Enhanced make_cargo_release with conditional publish support - # Backward compatible: publishes by default unless SKIP_PUBLISH=true or publish=false - # Also respects SKIP_RELEASE=true to skip entirely when tag already exists - make_cargo_release: - description: > - Make a release using cargo release. - Enhanced version that respects SKIP_PUBLISH environment variable for recovery scenarios. - When SKIP_PUBLISH=true, adds --no-publish flag to skip crates.io publish. - The publish parameter controls default behavior; SKIP_PUBLISH overrides it at runtime. - parameters: - package: - type: string - default: "" - description: "Package to release" - verbosity: - type: string - default: "-vv" - description: "Verbosity for cargo release" - publish: - type: boolean - default: true - description: "If true, the release will be published to crates.io" - no_push: - type: boolean - default: false - description: "Whether cargo release should push the changes" - steps: - - run: - name: List changes using cargo release - command: | - set -exo pipefail - cargo release changes - - run: - name: Execute cargo release - command: | - set -exo pipefail - - # Check if release should be skipped (tag already exists) - if [ "$SKIP_RELEASE" = "true" ]; then - echo "Skipping release (tag already exists)" - exit 0 - fi - - # Use SEMVER or NEXT_VERSION - VERSION="${SEMVER:-${NEXT_VERSION:-none}}" - - if [ "$VERSION" = "none" ]; then - echo "No version to release - skipping" - exit 0 - fi - - echo "Releasing version: $VERSION" - - # Build cargo release arguments - release_args="--execute --no-confirm --sign-tag" - - if [ "<< parameters.package >>" != "" ]; then - release_args="$release_args --package << parameters.package >>" - fi - - if [ "<< parameters.no_push >>" = "true" ]; then - release_args="$release_args --no-push" - fi - - # Handle publish: parameter controls default, SKIP_PUBLISH overrides at runtime - if [ "<< parameters.publish >>" = "false" ]; then - release_args="$release_args --no-publish" - echo "Publishing disabled by parameter" - elif [ "$SKIP_PUBLISH" = "true" ]; then - release_args="$release_args --no-publish" - echo "Skipping publish (version already on crates.io)" - fi - - # Map verbosity - case "<< parameters.verbosity >>" in - "-vvv"|"-vvvv") - release_args="-vv $release_args" - ;; - esac - - cargo release $release_args "$VERSION" - - # Enhanced make_github_release with package support - make_github_release: - description: > - Create a GitHub release using the pcu utility. - When package is provided, uses 'pcu release package' which derives the correct tag prefix. - When package is empty, uses 'pcu release version' with the specified prefix. - parameters: - prefix: - type: string - default: "v" - description: "Tag prefix for the release (used when package is empty)" - package: - type: string - default: "" - description: "Package name - when provided, derives tag prefix automatically" - verbosity: - type: string - default: "-vv" - description: "Verbosity for pcu command" - update_prlog: - type: boolean - default: false - description: "Update PRLOG when creating the release" - steps: - - run: - name: Create GitHub release - command: | - set -exo pipefail - - # Use SEMVER or NEXT_VERSION - VERSION="${SEMVER:-${NEXT_VERSION:-none}}" - - if [ "$VERSION" = "none" ]; then - echo "No version to release - skipping GitHub release" - exit 0 - fi - - # Determine the tag name - if [ "<< parameters.package >>" != "" ]; then - TAG="<< parameters.package >>-v${VERSION}" - else - TAG="<< parameters.prefix >>${VERSION}" - fi - - # Check if GitHub release already exists using API - # Extract owner/repo from git remote - REPO_URL=$(git remote get-url origin) - REPO_PATH=$(echo "$REPO_URL" | sed -E 's|.*github\.com[:/]||' | sed 's|\.git$||') - - HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ - -H "Authorization: token ${GITHUB_TOKEN}" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/${REPO_PATH}/releases/tags/${TAG}") - - if [ "$HTTP_STATUS" = "200" ]; then - echo "GitHub release ${TAG} already exists - skipping" - exit 0 - fi - echo "GitHub release ${TAG} not found (HTTP ${HTTP_STATUS}) - will create" - - pcu_args="<< parameters.verbosity >> release" - - if [ "<< parameters.package >>" != "" ]; then - pcu_args="$pcu_args package << parameters.package >>" - else - pcu_args="$pcu_args --prefix << parameters.prefix >> version" - fi - - if [ "<< parameters.update_prlog >>" = "true" ]; then - pcu_args="$pcu_args --update-prlog" - fi - - pcu $pcu_args ${VERSION} - - # Build a release binary using cargo. - # Requires VERSION environment variable (skips if "none"). - build_release_binary: - description: > - Build a release-optimised binary using cargo build --release. - Expects VERSION to be set in BASH_ENV; skips when VERSION is "none". - steps: - - run: - name: Build release binary - command: | - set -eo pipefail - - if [ "$VERSION" = "none" ]; then - echo "No version to release - skipping" - exit 0 - fi - - cargo build --release - - # Package a binary from target/release into a .tar.gz archive. - # Sets ASSET_NAME in BASH_ENV for use by upload_release_asset. - package_binary: - description: > - Package a binary from target/release into a .tar.gz archive named - -.tar.gz. Sets ASSET_NAME in BASH_ENV. - parameters: - binary_name: - type: string - description: "Name of the binary in target/release" - target: - type: string - default: x86_64-unknown-linux-gnu - description: "Rust target triple for the archive name" - steps: - - run: - name: Package binary as tar.gz - command: | - set -eo pipefail - - if [ "$VERSION" = "none" ]; then - echo "No version to release - skipping" - exit 0 - fi - - ASSET_NAME="<< parameters.binary_name >>-<< parameters.target >>.tar.gz" - - tar czf "$ASSET_NAME" -C target/release "<< parameters.binary_name >>" - echo "Created $ASSET_NAME ($(du -h "$ASSET_NAME" | cut -f1))" - - echo "export ASSET_NAME=$ASSET_NAME" >> "$BASH_ENV" - - # Upload a binary asset to a GitHub release. - # Adapted from toolkit/upload_release_asset with release_tag parameter - # so it works in pipelines where CIRCLE_TAG is not set. - # TODO: Replace with toolkit/upload_release_asset once it accepts a - # release_tag parameter (circleci-toolkit#333). - upload_release_asset: - description: > - Upload a binary asset to a GitHub release. Accepts a release_tag - parameter instead of relying on CIRCLE_TAG, making it usable in - scheduled/manual pipelines. Requires GITHUB_TOKEN environment variable. - parameters: - asset_path: - type: string - description: "Path to the asset file to upload" - asset_name: - type: string - default: "" - description: "Name for the asset in the release (defaults to filename)" - release_tag: - type: string - description: "Git tag identifying the GitHub release" - github_token_var: - type: env_var_name - default: GITHUB_TOKEN - description: "Environment variable containing the GitHub token" - steps: - - run: - name: Upload asset to GitHub release - command: | - set -eo pipefail - - if [ "$VERSION" = "none" ]; then - echo "No version to release - skipping" - exit 0 - fi - - ASSET_PATH="<< parameters.asset_path >>" - ASSET_NAME="<< parameters.asset_name >>" - TOKEN="${<< parameters.github_token_var >>}" - TAG="<< parameters.release_tag >>" - - if [ -z "${ASSET_NAME}" ]; then - ASSET_NAME="$(basename "${ASSET_PATH}")" - fi - - if [ ! -f "${ASSET_PATH}" ]; then - echo "ERROR: Asset file not found: ${ASSET_PATH}" >&2 - exit 1 - fi - - # Derive repo slug from git remote - REPO_URL=$(git remote get-url origin) - REPO_SLUG=$(echo "$REPO_URL" | sed -E 's|.*github\.com[:/]||' | sed 's|\.git$||') - echo "Repository: ${REPO_SLUG}" - echo "Looking up release for tag ${TAG}..." - - RELEASE_RESPONSE=$(curl -s -w "\n%{http_code}" \ - -H "Authorization: Bearer ${TOKEN}" \ - "https://api.github.com/repos/${REPO_SLUG}/releases/tags/${TAG}") - - HTTP_CODE=$(echo "${RELEASE_RESPONSE}" | tail -1) - RELEASE_BODY=$(echo "${RELEASE_RESPONSE}" | sed '$d') - - if [ "${HTTP_CODE}" != "200" ]; then - echo "ERROR: GitHub API returned HTTP ${HTTP_CODE}" >&2 - echo "${RELEASE_BODY}" | jq -r '.message // .' >&2 - exit 1 - fi - - RELEASE_ID=$(echo "${RELEASE_BODY}" | jq -r '.id') - - if [ -z "${RELEASE_ID}" ] || [ "${RELEASE_ID}" = "null" ]; then - echo "ERROR: Could not find GitHub release for tag ${TAG}" >&2 - exit 1 - fi - - echo "Uploading ${ASSET_NAME} to release ${RELEASE_ID}..." - UPLOAD_RESPONSE=$(curl -s -w "\n%{http_code}" \ - -X POST \ - -H "Authorization: Bearer ${TOKEN}" \ - -H "Content-Type: application/octet-stream" \ - "https://uploads.github.com/repos/${REPO_SLUG}/releases/${RELEASE_ID}/assets?name=${ASSET_NAME}" \ - --data-binary "@${ASSET_PATH}") - - HTTP_CODE=$(echo "${UPLOAD_RESPONSE}" | tail -1) - UPLOAD_BODY=$(echo "${UPLOAD_RESPONSE}" | sed '$d') - - if [ "${HTTP_CODE}" != "201" ]; then - echo "ERROR: Upload failed with HTTP ${HTTP_CODE}" >&2 - echo "${UPLOAD_BODY}" | jq -r '.message // .' >&2 - exit 1 - fi - - echo "Upload complete: ${ASSET_NAME}" + toolkit: jerus-org/circleci-toolkit@4.9.6 jobs: tools: - executor: - name: toolkit/rust_env_rolling + executor: toolkit/rust_env_rolling steps: - run: name: Verify tools @@ -423,314 +25,39 @@ jobs: pcu --version cargo release --version jq --version - - # Calculate and display versions for approval - # Persists calculated versions to workspace for downstream jobs - calculate-versions: - parameters: - crate_version: - type: string - default: "" - description: "Override version for crate release (empty = auto-detect)" - workspace_version: - type: string - default: "" - description: "Override version for workspace/PRLOG release (empty = auto-detect)" - executor: - name: toolkit/rust_env_rolling - steps: - - checkout - - run: - name: Calculate release versions - command: | - set -eo pipefail - - echo "==============================================" - echo " RELEASE VERSION CALCULATION" - echo "==============================================" - echo "" - - # Check for version override (passed from workflow) - VERSION_OVERRIDE="<< parameters.crate_version >>" - - # Calculate crate version - echo "--- Crate: cull-gmail ---" - if [ -n "$VERSION_OVERRIDE" ]; then - CRATE_VERSION="$VERSION_OVERRIDE" - echo "Result: Will release version $CRATE_VERSION (OVERRIDE)" - echo "Note: Version explicitly set via crate_version parameter" - NEXTSV_VERSION=$(nextsv -bn calculate 2>/dev/null || echo "none") - echo " (nextsv would have calculated: $NEXTSV_VERSION)" - else - CRATE_VERSION=$(nextsv -bn calculate 2>/dev/null || echo "") - if [ -z "$CRATE_VERSION" ]; then - CRATE_VERSION="none" - echo "Result: No crate release needed" - echo "Reason: No changes to crates/cull-gmail/ or its dependencies" - else - echo "Result: Will release version $CRATE_VERSION" - echo "Changes detected in crate scope (code, deps, or Cargo.lock)" - fi - fi - echo "" - - # Calculate workspace version - echo "--- Workspace (PRLOG) ---" - WORKSPACE_OVERRIDE="<< parameters.workspace_version >>" - if [ -n "$WORKSPACE_OVERRIDE" ]; then - WORKSPACE_VERSION="$WORKSPACE_OVERRIDE" - echo "Result: Will release version $WORKSPACE_VERSION (OVERRIDE)" - echo "Note: Version explicitly set via workspace_version parameter" - NEXTSV_WS=$(nextsv -bn calculate --prefix "v" 2>/dev/null || echo "none") - echo " (nextsv would have calculated: $NEXTSV_WS)" - else - WORKSPACE_VERSION=$(nextsv -bn calculate --prefix "v" 2>/dev/null || echo "") - if [ -z "$WORKSPACE_VERSION" ]; then - WORKSPACE_VERSION="none" - echo "Result: No workspace release needed" - echo "Reason: No changes since last v* tag" - else - echo "Result: Will release version $WORKSPACE_VERSION" - echo "Changes detected in workspace scope" - fi - fi - echo "" - - echo "==============================================" - echo " SUMMARY" - echo "==============================================" - echo "Crate (cull-gmail): $CRATE_VERSION" - echo "Workspace (PRLOG): $WORKSPACE_VERSION" - echo "==============================================" - echo "" - - # Validation rules - echo "--- Validation ---" - if [ "$CRATE_VERSION" != "none" ] && [ "$WORKSPACE_VERSION" = "none" ]; then - echo "WARNING: Crate release without workspace release is unusual" - echo " Workspace should increment when crate changes" - fi - - if [ "$CRATE_VERSION" = "none" ] && [ "$WORKSPACE_VERSION" = "none" ]; then - echo "INFO: No releases needed - workflow will skip release steps" - fi - - echo "" - echo "Please review the versions above and approve to proceed." - - # Persist versions to workspace for downstream jobs - mkdir -p /tmp/release-versions - echo "$CRATE_VERSION" > /tmp/release-versions/crate-version - echo "$WORKSPACE_VERSION" > /tmp/release-versions/workspace-version - echo "Versions persisted to workspace for release jobs" - - persist_to_workspace: - root: /tmp - paths: - - release-versions - - # Release a single crate - # Reads version from workspace (calculated by calculate-versions job) - release-crate: - parameters: - package: - type: string - default: "" - executor: - name: toolkit/rust_env_rolling - steps: - - checkout - - attach_workspace: - at: /tmp - - add_ssh_keys: - fingerprints: - - << pipeline.parameters.fingerprint >> - - run: - name: Remove original SSH key from agent - command: | - ssh-add -l - # GitHub App integration doesn't create id_rsa.pub, handle gracefully - if [ -f ~/.ssh/id_rsa.pub ]; then - ssh-add -d ~/.ssh/id_rsa.pub - else - echo "No id_rsa.pub found (GitHub App integration) - skipping removal" - fi - ssh-add -l - - toolkit/gpg_key - - toolkit/git_config - # Step 1: Load version from workspace (calculated by calculate-versions) - - run: - name: Load version from workspace - command: | - set -eo pipefail - VERSION_FILE="/tmp/release-versions/crate-version" - if [ -f "$VERSION_FILE" ]; then - VERSION=$(cat "$VERSION_FILE") - echo "Loaded version from workspace: $VERSION" - echo "export NEXT_VERSION=$VERSION" >> "$BASH_ENV" - echo "export SEMVER=$VERSION" >> "$BASH_ENV" - else - echo "ERROR: Version file not found at $VERSION_FILE" - echo "This job requires calculate-versions to run first" - exit 1 - fi - # Step 2: Check crates.io for recovery scenarios - - check_crates_io_version: - package: << parameters.package >> - # Step 3: Check if tag already exists for recovery scenarios - - check_tag_exists: - package: << parameters.package >> - # Step 4: Run cargo release (respects SKIP_PUBLISH and SKIP_RELEASE) - - make_cargo_release: - package: << parameters.package >> - verbosity: "-vv" - # Step 5: Update pcu to latest version (command not yet in toolkit release) - - run: - name: Update to latest pcu - command: | - cargo install --force --git https://github.com/jerus-org/pcu --branch main - # Step 6: Create GitHub release - - make_github_release: - package: << parameters.package >> - verbosity: "-vv" - - # # Release PRLOG/workspace - # # Reads version from workspace (calculated by calculate-versions job) - # release-prlog: - # executor: - # name: toolkit/rust_env_rolling - # steps: - # - checkout - # - attach_workspace: - # at: /tmp - # - add_ssh_keys: - # fingerprints: - # - << pipeline.parameters.fingerprint >> - # - run: - # name: Remove original SSH key from agent - # command: | - # ssh-add -l - # # GitHub App integration doesn't create id_rsa.pub, handle gracefully - # if [ -f ~/.ssh/id_rsa.pub ]; then - # ssh-add -d ~/.ssh/id_rsa.pub - # else - # echo "No id_rsa.pub found (GitHub App integration) - skipping removal" - # fi - # ssh-add -l - # - toolkit/gpg_key - # - toolkit/git_config - # - run: - # name: Release PRLOG - # command: | - # set -exo pipefail - # chmod +x scripts/*.sh - - # # Load version from workspace (calculated by calculate-versions) - # VERSION_FILE="/tmp/release-versions/workspace-version" - # if [ -f "$VERSION_FILE" ]; then - # VERSION=$(cat "$VERSION_FILE") - # echo "Loaded workspace version from workspace: $VERSION" - # else - # echo "ERROR: Version file not found at $VERSION_FILE" - # echo "This job requires calculate-versions to run first" - # exit 1 - # fi - - # if [ "$VERSION" = "none" ]; then - # echo "No PRLOG release needed" - # exit 0 - # fi - - # # Check if tag already exists - # TAG="v${VERSION}" - # git fetch --tags origin main - - # # Pull latest main (release-crate may have pushed commits) - # git pull --rebase origin main - - # if git tag -l "$TAG" | grep -q .; then - # echo "Tag $TAG already exists - updating PRLOG without new tag" - # # Update PRLOG.md with the release date but don't create new tag - # ./scripts/release-prlog.sh "$VERSION" --no-tag 2>/dev/null || \ - # ./scripts/release-prlog.sh "$VERSION" - # git push origin main || echo "No changes to push" - # else - # echo "Creating new release for version $VERSION" - # ./scripts/release-prlog.sh "$VERSION" - # git push origin main --tags - # fi - - # Build release binary and upload to GitHub release for cargo-binstall - release-binary: - executor: - name: toolkit/rust_env_rolling - steps: - - checkout - - attach_workspace: - at: /tmp - - run: - name: Load version from workspace - command: | - set -eo pipefail - VERSION_FILE="/tmp/release-versions/crate-version" - if [ -f "$VERSION_FILE" ]; then - VERSION=$(cat "$VERSION_FILE") - echo "Loaded version from workspace: $VERSION" - echo "export VERSION=$VERSION" >> "$BASH_ENV" - else - echo "ERROR: Version file not found at $VERSION_FILE" - exit 1 - fi - - build_release_binary - - package_binary: - binary_name: cull-gmail - - upload_release_asset: - asset_path: cull-gmail-x86_64-unknown-linux-gnu.tar.gz - release_tag: v${VERSION} + rsign --version workflows: release: jobs: - tools - # Calculate and display versions for review - # Pass pipeline parameters to job for version overrides - - calculate-versions: + - toolkit/calculate_versions: + name: calculate-versions requires: [tools] - crate_version: << pipeline.parameters.crate_version_override >> - workspace_version: << pipeline.parameters.workspace_version_override >> + crates: "cull-gmail:cull-gmail-v" + crate_version_overrides: "cull-gmail:<< pipeline.parameters.cull_gmail_version >>" + workspace_version_override: << pipeline.parameters.workspace_version >> - # Manual approval gate - review calculated versions before release - approve-release: type: approval requires: [calculate-versions] - # Release cull-gmail crate - # Version is read from workspace (set by calculate-versions) - # Pipeline parameter crate_version_override controls the override - # Set parameter to "" to resume nextsv auto-detection - - release-crate: + - toolkit/release_crate: name: release-cull-gmail requires: [approve-release] + package: cull-gmail + crate_tag_prefix: cull-gmail-v + build_binary: true + binary_name: cull-gmail context: - release - bot-check + - pcu-app - # Build and upload release binary for cargo-binstall - - release-binary: + - toolkit/release_prlog: requires: [release-cull-gmail] context: - release - bot-check - - # Release PRLOG (after crate released) - - toolkit/make_release: - requires: [release-cull-gmail] - context: - - release - - bot-check - ssh_fingerprint: << pipeline.parameters.fingerprint >> - min_rust_version: << pipeline.parameters.min_rust_version >> - when_cargo_release: false - when_use_workspace: false - pcu_update_prlog: true - remove_ssh_key: false + - pcu-app diff --git a/.circleci/update_prlog.yml b/.circleci/update_prlog.yml new file mode 100644 index 0000000..4c2882f --- /dev/null +++ b/.circleci/update_prlog.yml @@ -0,0 +1,30 @@ +version: 2.1 + +parameters: + update_pcu: + type: boolean + default: false + description: "If true, pcu is updated from its main github branch before running." + +orbs: + toolkit: jerus-org/circleci-toolkit@4.9.6 + +workflows: + update_prlog: + jobs: + - toolkit/update_prlog: + name: update-prlog-on-main + context: + - release + - bot-check + - pcu-app + min_rust_version: "1.88" + target_branch: "main" + pcu_from_merge: --from-merge + update_pcu: << pipeline.parameters.update_pcu >> + pcu_verbosity: "-vvv" + - toolkit/label: + min_rust_version: "1.88" + context: pcu-app + requires: + - update-prlog-on-main diff --git a/Cargo.toml b/Cargo.toml index cf61510..2e219e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,73 +1,49 @@ -[package] -name = "cull-gmail" -description = "Cull emails from a gmail account using the gmail API" -version = "0.1.4" -authors = ["Jeremiah Russell "] +[workspace] +members = ["crates/cull-gmail"] +resolver = "2" + +[workspace.package] edition = "2024" +authors = ["Jeremiah Russell "] rust-version = "1.88" +license = "MIT" +repository = "https://github.com/jerus-org/cull-gmail" keywords = ["gmail", "gmail-api", "management"] categories = ["command-line-utilities"] -license = "MIT" -readme = "README.md" -repository = "https://github.com/jerus-org/cull-gmail" -include = [ - "**/*.rs", - "Cargo.toml", - "README.md", - "LICENSE-MIT", - "LICENSE-APACHE", - "CHANGELOG.md", - "docs", -] -[dependencies] +[workspace.dependencies] +base64 = "0.22.1" chrono = "0.4.43" clap = { version = "4.5.58", features = ["derive"] } clap-verbosity-flag = { version = "3.0.4", features = ["tracing"] } -config = { version = "0.15.19", default-features = false, features = [ - "json", - "toml", -] } +config = { version = "0.15.19", default-features = false, features = ["json", "toml"] } +dialoguer = "0.12.0" env_logger = "0.11.9" +flate2 = "1.1.9" +futures = "0.3.31" google-gmail1 = { version = "7.0.0", default-features = false, features = ["yup-oauth2", "aws-lc-rs"] } hyper-rustls = { version = "0.27.7", features = ["http1"] } +indicatif = "0.18.3" lazy-regex = "3.6.0" log = "0.4.29" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" thiserror = "2.0.18" -tokio = { version = "1.49.0", features = [ - "macros", - "rt-multi-thread", - "process", -] } +tokio = { version = "1.49.0", features = ["macros", "rt-multi-thread", "process"] } toml = "1.0.0" -base64 = "0.22.1" -flate2 = "1.1.9" -dialoguer = "0.12.0" -indicatif = "0.18.3" -[dev-dependencies] -httpmock = "0.8.3" -tokio-test = "0.4.5" -temp-env = "0.3.6" -tempfile = "3.25.0" -futures = "0.3.31" +# dev-dependencies assert_cmd = "2.1.2" assert_fs = "1.1.3" +httpmock = "0.8.3" predicates = "3.1.4" +temp-env = "0.3.6" +tempfile = "3.25.0" +tokio-test = "0.4.5" -[lints.clippy] +[workspace.lints.clippy] uninlined-format-args = "warn" unnecessary_semicolon = "warn" -[lints.rust] -dead-code = "allow" # allow temporarily while developing initial code - -[lib] -name = "cull_gmail" -path = "src/lib.rs" - -[[bin]] -name = "cull-gmail" -path = "src/cli/main.rs" +[workspace.lints.rust] +dead-code = "allow" diff --git a/PRLOG.md b/PRLOG.md index 764d5ff..095e2cd 100644 --- a/PRLOG.md +++ b/PRLOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [0.1.4] - 2026-02-14 ### Changed @@ -477,8 +479,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#161]: https://github.com/jerus-org/cull-gmail/pull/161 [#162]: https://github.com/jerus-org/cull-gmail/pull/162 [#163]: https://github.com/jerus-org/cull-gmail/pull/163 -[0.1.4]: https://github.com/jerus-org/cull-gmail/compare/v0.1.3...v0.1.4 -[0.1.3]: https://github.com/jerus-org/cull-gmail/compare/v0.1.2...v0.1.3 +[Unreleased]: https://github.com/jerus-org/cull-gmail/compare/cull-gmail-v0.1.4...HEAD +[0.1.4]: https://github.com/jerus-org/cull-gmail/compare/cull-gmail-v0.1.3...cull-gmail-v0.1.4 +[0.1.3]: https://github.com/jerus-org/cull-gmail/compare/cull-gmail-v0.1.2...cull-gmail-v0.1.3 [0.1.2]: https://github.com/jerus-org/cull-gmail/compare/v0.1.1...v0.1.2 [0.1.1]: https://github.com/jerus-org/cull-gmail/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/jerus-org/cull-gmail/compare/v0.0.16...v0.1.0 diff --git a/CHANGELOG.md b/crates/cull-gmail/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to crates/cull-gmail/CHANGELOG.md diff --git a/crates/cull-gmail/Cargo.toml b/crates/cull-gmail/Cargo.toml new file mode 100644 index 0000000..c44e824 --- /dev/null +++ b/crates/cull-gmail/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "cull-gmail" +description = "Cull emails from a gmail account using the gmail API" +version = "0.1.4" +edition.workspace = true +authors.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true +readme = "README.md" +include = [ + "**/*.rs", + "Cargo.toml", + "README.md", + "LICENSE-MIT", + "LICENSE-APACHE", + "CHANGELOG.md", + "docs", +] + +[dependencies] +base64.workspace = true +chrono.workspace = true +clap.workspace = true +clap-verbosity-flag.workspace = true +config.workspace = true +dialoguer.workspace = true +env_logger.workspace = true +flate2.workspace = true +google-gmail1.workspace = true +hyper-rustls.workspace = true +indicatif.workspace = true +lazy-regex.workspace = true +log.workspace = true +serde.workspace = true +serde_json.workspace = true +thiserror.workspace = true +tokio.workspace = true +toml.workspace = true + +[dev-dependencies] +assert_cmd.workspace = true +assert_fs.workspace = true +futures.workspace = true +httpmock.workspace = true +predicates.workspace = true +temp-env.workspace = true +tempfile.workspace = true +tokio-test.workspace = true + +[lints] +workspace = true + +[lib] +name = "cull_gmail" +path = "src/lib.rs" + +[[bin]] +name = "cull-gmail" +path = "src/cli/main.rs" diff --git a/docs/lib/lib.md b/crates/cull-gmail/docs/lib/lib.md similarity index 100% rename from docs/lib/lib.md rename to crates/cull-gmail/docs/lib/lib.md diff --git a/crates/cull-gmail/release-hook.sh b/crates/cull-gmail/release-hook.sh new file mode 100755 index 0000000..08f6f4b --- /dev/null +++ b/crates/cull-gmail/release-hook.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# Build an updated README +cat ../../docs/readme/head.md > ../../README.md +# shellcheck disable=SC2129 +cat ../../docs/main.md >> ../../README.md +cat ../../docs/lib.md >> ../../README.md +cat ../../docs/readme/tail.md >> ../../README.md + +# Build Changelog +gen-changelog generate \ + --display-summaries \ + --name "CHANGELOG.md" \ + --package "cull-gmail" \ + --repository-dir "../.." \ + --next-version "${NEW_VERSION:-${SEMVER}}" diff --git a/crates/cull-gmail/release.toml b/crates/cull-gmail/release.toml new file mode 100644 index 0000000..c288f4b --- /dev/null +++ b/crates/cull-gmail/release.toml @@ -0,0 +1,7 @@ +pre-release-commit-message = "chore: Release cull-gmail v{{version}}" +tag-message = "{{tag_name}}" +tag-name = "cull-gmail-v{{version}}" +pre-release-hook = ["./release-hook.sh"] +pre-release-replacements = [ + { file = "../../docs/lib.md", search = "cull-gmail = \"\\d+\\.\\d+\\.\\d+\"", replace = "cull-gmail = \"{{version}}\"", exactly = 1 }, +] diff --git a/src/cli/init_cli.rs b/crates/cull-gmail/src/cli/init_cli.rs similarity index 100% rename from src/cli/init_cli.rs rename to crates/cull-gmail/src/cli/init_cli.rs diff --git a/src/cli/init_cli/tests.rs b/crates/cull-gmail/src/cli/init_cli/tests.rs similarity index 100% rename from src/cli/init_cli/tests.rs rename to crates/cull-gmail/src/cli/init_cli/tests.rs diff --git a/src/cli/labels_cli.rs b/crates/cull-gmail/src/cli/labels_cli.rs similarity index 100% rename from src/cli/labels_cli.rs rename to crates/cull-gmail/src/cli/labels_cli.rs diff --git a/src/cli/main.rs b/crates/cull-gmail/src/cli/main.rs similarity index 100% rename from src/cli/main.rs rename to crates/cull-gmail/src/cli/main.rs diff --git a/src/cli/messages_cli.rs b/crates/cull-gmail/src/cli/messages_cli.rs similarity index 100% rename from src/cli/messages_cli.rs rename to crates/cull-gmail/src/cli/messages_cli.rs diff --git a/src/cli/rules_cli.rs b/crates/cull-gmail/src/cli/rules_cli.rs similarity index 100% rename from src/cli/rules_cli.rs rename to crates/cull-gmail/src/cli/rules_cli.rs diff --git a/src/cli/rules_cli/config_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli.rs diff --git a/src/cli/rules_cli/config_cli/action_rule_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/action_rule_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/action_rule_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/action_rule_cli.rs diff --git a/src/cli/rules_cli/config_cli/add_label_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/add_label_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/add_label_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/add_label_cli.rs diff --git a/src/cli/rules_cli/config_cli/add_rule_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/add_rule_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/add_rule_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/add_rule_cli.rs diff --git a/src/cli/rules_cli/config_cli/list_label_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/list_label_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/list_label_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/list_label_cli.rs diff --git a/src/cli/rules_cli/config_cli/remove_label_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/remove_label_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/remove_label_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/remove_label_cli.rs diff --git a/src/cli/rules_cli/config_cli/rm_rule_cli.rs b/crates/cull-gmail/src/cli/rules_cli/config_cli/rm_rule_cli.rs similarity index 100% rename from src/cli/rules_cli/config_cli/rm_rule_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/config_cli/rm_rule_cli.rs diff --git a/src/cli/rules_cli/run_cli.rs b/crates/cull-gmail/src/cli/rules_cli/run_cli.rs similarity index 100% rename from src/cli/rules_cli/run_cli.rs rename to crates/cull-gmail/src/cli/rules_cli/run_cli.rs diff --git a/src/cli/token_cli.rs b/crates/cull-gmail/src/cli/token_cli.rs similarity index 100% rename from src/cli/token_cli.rs rename to crates/cull-gmail/src/cli/token_cli.rs diff --git a/src/client_config.rs b/crates/cull-gmail/src/client_config.rs similarity index 100% rename from src/client_config.rs rename to crates/cull-gmail/src/client_config.rs diff --git a/src/client_config/config_root.rs b/crates/cull-gmail/src/client_config/config_root.rs similarity index 100% rename from src/client_config/config_root.rs rename to crates/cull-gmail/src/client_config/config_root.rs diff --git a/src/eol_action.rs b/crates/cull-gmail/src/eol_action.rs similarity index 100% rename from src/eol_action.rs rename to crates/cull-gmail/src/eol_action.rs diff --git a/src/error.rs b/crates/cull-gmail/src/error.rs similarity index 100% rename from src/error.rs rename to crates/cull-gmail/src/error.rs diff --git a/src/gmail_client.rs b/crates/cull-gmail/src/gmail_client.rs similarity index 100% rename from src/gmail_client.rs rename to crates/cull-gmail/src/gmail_client.rs diff --git a/src/gmail_client/message_summary.rs b/crates/cull-gmail/src/gmail_client/message_summary.rs similarity index 100% rename from src/gmail_client/message_summary.rs rename to crates/cull-gmail/src/gmail_client/message_summary.rs diff --git a/src/lib.rs b/crates/cull-gmail/src/lib.rs similarity index 100% rename from src/lib.rs rename to crates/cull-gmail/src/lib.rs diff --git a/src/message_list.rs b/crates/cull-gmail/src/message_list.rs similarity index 100% rename from src/message_list.rs rename to crates/cull-gmail/src/message_list.rs diff --git a/src/retention.rs b/crates/cull-gmail/src/retention.rs similarity index 100% rename from src/retention.rs rename to crates/cull-gmail/src/retention.rs diff --git a/src/retention/message_age.rs b/crates/cull-gmail/src/retention/message_age.rs similarity index 100% rename from src/retention/message_age.rs rename to crates/cull-gmail/src/retention/message_age.rs diff --git a/src/rule_processor.rs b/crates/cull-gmail/src/rule_processor.rs similarity index 100% rename from src/rule_processor.rs rename to crates/cull-gmail/src/rule_processor.rs diff --git a/src/rules.rs b/crates/cull-gmail/src/rules.rs similarity index 99% rename from src/rules.rs rename to crates/cull-gmail/src/rules.rs index d5d2211..a9ff98a 100644 --- a/src/rules.rs +++ b/crates/cull-gmail/src/rules.rs @@ -361,13 +361,13 @@ impl Rules { /// # Examples /// /// ``` - /// use cull_gmail::{Rules, Retention, MessageAge}; + /// use cull_gmail::{Rules, Retention, MessageAge, EolAction}; /// /// let mut rules = Rules::new(); /// let retention = Retention::new(MessageAge::Days(30), false); /// rules.add_rule(retention, Some("test"), false); /// - /// let label_map = rules.get_rules_by_label(EolAction::Trash); + /// let label_map = rules.get_rules_by_label_for_action(EolAction::Trash); /// if let Some(rule) = label_map.get("test") { /// println!("Rule for 'test' label: {}", rule.describe()); /// } diff --git a/src/rules/eol_rule.rs b/crates/cull-gmail/src/rules/eol_rule.rs similarity index 100% rename from src/rules/eol_rule.rs rename to crates/cull-gmail/src/rules/eol_rule.rs diff --git a/src/test_utils.rs b/crates/cull-gmail/src/test_utils.rs similarity index 100% rename from src/test_utils.rs rename to crates/cull-gmail/src/test_utils.rs diff --git a/src/utils.rs b/crates/cull-gmail/src/utils.rs similarity index 100% rename from src/utils.rs rename to crates/cull-gmail/src/utils.rs diff --git a/tests/cli_integration_tests.rs b/crates/cull-gmail/tests/cli_integration_tests.rs similarity index 95% rename from tests/cli_integration_tests.rs rename to crates/cull-gmail/tests/cli_integration_tests.rs index ef0229d..dbbfa87 100644 --- a/tests/cli_integration_tests.rs +++ b/crates/cull-gmail/tests/cli_integration_tests.rs @@ -29,41 +29,10 @@ mod test_utils { let config_dir = temp_dir.path().join(".config").join("cull-gmail"); fs::create_dir_all(&config_dir)?; - // Get the path to the compiled binary - try multiple locations - let binary_path = if let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") { - // Running under cargo test - try release first, then debug - let release_binary = PathBuf::from(&manifest_dir) - .join("target") - .join("release") - .join("cull-gmail"); - if release_binary.exists() { - release_binary - } else { - PathBuf::from(&manifest_dir) - .join("target") - .join("debug") - .join("cull-gmail") - } - } else if let Ok(target_dir) = std::env::var("CARGO_TARGET_DIR") { - // CI environments may set CARGO_TARGET_DIR - let release_binary = PathBuf::from(&target_dir) - .join("release") - .join("cull-gmail"); - if release_binary.exists() { - release_binary - } else { - PathBuf::from(&target_dir).join("debug").join("cull-gmail") - } - } else { - // Fallback for other scenarios - std::env::current_exe() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap() - .join("cull-gmail") - }; + // Use CARGO_BIN_EXE_cull-gmail, set by Cargo at compile time to the + // actual binary path. Works correctly in workspaces and with tools + // that override the target directory (e.g. cargo llvm-cov). + let binary_path = PathBuf::from(env!("CARGO_BIN_EXE_cull-gmail")); // Validate that the binary exists if !binary_path.exists() { diff --git a/tests/gmail_client_unit_tests.rs b/crates/cull-gmail/tests/gmail_client_unit_tests.rs similarity index 100% rename from tests/gmail_client_unit_tests.rs rename to crates/cull-gmail/tests/gmail_client_unit_tests.rs diff --git a/tests/gmail_message_list_integration.rs b/crates/cull-gmail/tests/gmail_message_list_integration.rs similarity index 100% rename from tests/gmail_message_list_integration.rs rename to crates/cull-gmail/tests/gmail_message_list_integration.rs diff --git a/tests/init_integration_tests.rs b/crates/cull-gmail/tests/init_integration_tests.rs similarity index 100% rename from tests/init_integration_tests.rs rename to crates/cull-gmail/tests/init_integration_tests.rs diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..7935ebb --- /dev/null +++ b/deny.toml @@ -0,0 +1,26 @@ +# https://embarkstudios.github.io/cargo-deny/ + +[advisories] +ignore = [ + # google-apis-common 8.0.0: project unmaintained (RUSTSEC-2025-0066). + # Core transitive dependency of google-gmail1 which is the only available + # Rust client for the Gmail API. No alternative available upstream. + { id = "RUSTSEC-2025-0066", reason = "transitive via google-gmail1; no maintained alternative for Gmail API access" }, +] + +[licenses] +allow = [ + "Apache-2.0", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "MIT", + "Unicode-3.0", +] + +[bans] +multiple-versions = "allow" + +[sources] +unknown-registry = "deny" +unknown-git = "deny" diff --git a/release.toml b/release.toml index 94ea48f..68dc787 100644 --- a/release.toml +++ b/release.toml @@ -1,14 +1,5 @@ -pre-release-replacements = [ - { file = "docs/lib.md", search = """cull-gmail = "\\d+.\\d+.\\d+"""", replace = "{{crate_name}} = \"{{version}}\"", exactly = 1 }, - { file = "PRLOG.md", search = "## \\[Unreleased\\]", replace = "## [{{version}}] - {{date}}", exactly = 1 }, - { file = "PRLOG.md", search = "\\[Unreleased\\]:", replace = "[{{version}}]:", exactly = 1 }, - { file = "PRLOG.md", search = "\\.\\.\\.HEAD", replace = "...{{tag_name}}", exactly = 1 }, -] -pre-release-commit-message = "chore: Release {{crate_name}} v{{version}}" -tag-message = "{{tag_name}}" -tag-name = "{{prefix}}v{{version}}" sign-tag = true sign-commit = true -consolidate-commits = false +consolidate-commits = true allow-branch = ["main"] -pre-release-hook = ["./release-hook.sh"] +pre-release-replacements = []