diff --git a/.github/actions/run_tests/action.yaml b/.github/actions/run_tests/action.yaml
index 490a00c4..d72d70c1 100644
--- a/.github/actions/run_tests/action.yaml
+++ b/.github/actions/run_tests/action.yaml
@@ -34,7 +34,7 @@ runs:
echo '::endgroup::'
echo '::group::Other dependencies'
- poetry sync
+ poetry install --remove-untracked
echo '::endgroup::'
echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV
diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index 3f5fe714..30adcd79 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -65,7 +65,7 @@ jobs:
run: |
pip install poetry
poetry config --local virtualenvs.in-project true
- poetry sync --no-root
+ poetry install --no-root --remove-untracked
npm install
echo "node_modules/.bin" >> "$GITHUB_PATH"
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index f8e203b2..5f694d25 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -19,6 +19,11 @@ on:
type: boolean
required: true
default: true
+ include_brew:
+ description: 'Publish to Homebrew?'
+ type: boolean
+ required: true
+ default: true
jobs:
validate:
@@ -63,7 +68,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
- python-version: '3.13'
+ python-version: '3.12'
- name: Checkout repo
uses: actions/checkout@v4
@@ -107,3 +112,111 @@ jobs:
run: |
pypi_version="$(find dist/jrnl-*.tar.gz | sed -r 's!dist/jrnl-(.*)\.tar\.gz!\1!')"
echo "pypi_version=$pypi_version" >> "$GITHUB_OUTPUT"
+
+ release_homebrew:
+ if: ${{ github.event.inputs.include_brew == 'true' }}
+ needs: release_pypi
+ name: "Release to Homebrew"
+ runs-on: macos-latest
+ env:
+ HOMEBREW_NO_AUTO_UPDATE: 1
+ HOMEBREW_NO_INSTALL_CLEANUP: 1
+ HOME_REPO: ${{ secrets.HOME_REPO }}
+ steps:
+ - name: Get version
+ run: |
+ JRNL_VERSION="${{ github.event.inputs.version }}"
+ PYPI_VERSION="${{ needs.release_pypi.outputs.pypi_version }}"
+
+ echo "::debug::jrnl version: $JRNL_VERSION"
+ echo "::debug::pypi version: $PYPI_VERSION"
+
+ echo "JRNL_VERSION=$JRNL_VERSION" >> "$GITHUB_ENV"
+ echo "PYPI_VERSION=$PYPI_VERSION" >> "$GITHUB_ENV"
+
+ - name: Set env variables
+ env:
+ REPO_OWNER: ${{ github.repository_owner }}
+ run: |
+ if [[ $JRNL_VERSION =~ (alpha|beta) ]]; then
+ echo '::debug::Prerelease (not a full release)'
+ {
+ echo "RELEASE_TYPE=pre"
+ echo "FORMULA_REPO=${REPO_OWNER}/homebrew-prerelease"
+ echo "BOT_REPO=jrnl-bot/homebrew-prerelease"
+ echo "FORMULA_NAME=jrnl-beta"
+ } >> "$GITHUB_ENV"
+ else
+ echo '::debug::Full release (not a prerelease)'
+ if [[ "${{ github.repository }}" == "${HOME_REPO}" ]]; then
+ REPO_OWNER="homebrew"
+ fi
+ {
+ echo "RELEASE_TYPE=full"
+ echo "FORMULA_REPO=${REPO_OWNER}/homebrew-core"
+ echo "BOT_REPO=jrnl-bot/homebrew-core"
+ echo "FORMULA_NAME=jrnl"
+ } >> "$GITHUB_ENV"
+ fi
+
+ - name: Tap formula
+ run: |
+ brew tap "${FORMULA_REPO}"
+ echo '::debug::Set tap directory'
+ echo "BREW_TAP_DIRECTORY=$(brew --repo "${FORMULA_REPO}")" >> "$GITHUB_ENV"
+ - name: Install dependencies
+ run: brew install pipgrip
+
+ - name: Query PyPI API
+ uses: nick-invision/retry@v3
+ with:
+ timeout_seconds: 10
+ max_attempts: 30
+ retry_wait_seconds: 10
+ command: |
+ curl -Ls https://pypi.org/pypi/jrnl/json > api_response.json
+ # if query doesn't have our version yet, give it some time before trying again
+ if [[ "null" == "$(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)" ]]; then
+ echo "::debug::PYPI_VERSION: $PYPI_VERSION"
+ echo "::debug::JQ VALUE: $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)"
+ echo "::group::cat api_response.json"
+ cat api_response.json
+ echo "::endgroup::"
+ exit 1
+ fi
+
+ - name: Update Homebrew Formula
+ uses: nick-invision/retry@v3
+ with:
+ timeout_minutes: 8
+ max_attempts: 6
+ retry_wait_seconds: 30
+ command: >
+ brew bump-formula-pr "${FORMULA_NAME}"
+ --url $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)
+ --sha256 $(jq ".releases[\"${PYPI_VERSION}\"][1].digests.sha256" -r api_response.json)
+ --no-audit
+ --write-only
+ --force
+
+ - name: Create Pull Request
+ uses: peter-evans/create-pull-request@v7
+ with:
+ path: ${{ env.BREW_TAP_DIRECTORY }}
+ token: ${{ secrets.JRNL_BOT_TOKEN }}
+ push-to-fork: ${{ env.BOT_REPO }}
+
+ committer: ${{ secrets.JRNL_BOT_NAME }} <${{ secrets.JRNL_BOT_EMAIL }}>
+ author: ${{ secrets.JRNL_BOT_NAME }} <${{ secrets.JRNL_BOT_EMAIL }}>
+
+ title: jrnl ${{ env.JRNL_VERSION }}
+ body: Created with `brew bump-formula-pr`
+
+ branch: jrnl-${{ env.JRNL_VERSION }}--
+ branch-suffix: random
+ commit-message: |
+ jrnl ${{ env.JRNL_VERSION }}
+
+ Update jrnl to ${{ env.JRNL_VERSION }}
+
+ ${{ secrets.RELEASE_COAUTHORS }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba714328..9de01281 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,55 +2,7 @@
## [Unreleased](https://github.com/jrnl-org/jrnl/)
-[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2.1...HEAD)
-
-**Fixed bugs:**
-
-- poetry warning - "poetry.dev-dependencies" section is deprecated [\#1975](https://github.com/jrnl-org/jrnl/issues/1975)
-- Homebrew autobump error on jrnl release [\#1961](https://github.com/jrnl-org/jrnl/issues/1961)
-
-**Build:**
-
-- Remove release step to publish to Homebrew [\#1994](https://github.com/jrnl-org/jrnl/pull/1994) ([micahellison](https://github.com/micahellison))
-
-**Packaging:**
-
-- Update dependency rich to v14 [\#1989](https://github.com/jrnl-org/jrnl/pull/1989) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency python to 3.13 [\#1988](https://github.com/jrnl-org/jrnl/pull/1988) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency tox to v4.25.0 [\#1986](https://github.com/jrnl-org/jrnl/pull/1986) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency tzlocal to v5.3.1 [\#1984](https://github.com/jrnl-org/jrnl/pull/1984) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency jinja2 to v3.1.6 [\#1983](https://github.com/jrnl-org/jrnl/pull/1983) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency poethepoet to v0.33.1 [\#1982](https://github.com/jrnl-org/jrnl/pull/1982) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency pytest to v8.3.5 [\#1981](https://github.com/jrnl-org/jrnl/pull/1981) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency cryptography to v44.0.2 [\#1980](https://github.com/jrnl-org/jrnl/pull/1980) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency ruff to v0.11.3 [\#1978](https://github.com/jrnl-org/jrnl/pull/1978) ([renovate[bot]](https://github.com/apps/renovate))
-
-## [v4.2.1](https://pypi.org/project/jrnl/v4.2.1/) (2025-02-25)
-
-[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2...v4.2.1)
-
-**Documentation:**
-
-- Typing animation in landing page is broken [\#1969](https://github.com/jrnl-org/jrnl/issues/1969)
-
-**Packaging:**
-
-- Update dependency pytest to \>=8.1.1 [\#1974](https://github.com/jrnl-org/jrnl/pull/1974) ([wren](https://github.com/wren))
-- Update dependency black to v25 [\#1973](https://github.com/jrnl-org/jrnl/pull/1973) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency tzlocal to v5.3 [\#1972](https://github.com/jrnl-org/jrnl/pull/1972) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency ruamel.yaml to v0.18.10 [\#1967](https://github.com/jrnl-org/jrnl/pull/1967) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency jinja2 to v3.1.5 [\#1966](https://github.com/jrnl-org/jrnl/pull/1966) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency cryptography to v44 [\#1962](https://github.com/jrnl-org/jrnl/pull/1962) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency pytest-bdd to v8.1.0 [\#1952](https://github.com/jrnl-org/jrnl/pull/1952) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency poethepoet to v0.32.2 [\#1951](https://github.com/jrnl-org/jrnl/pull/1951) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency keyring to v25.6.0 [\#1948](https://github.com/jrnl-org/jrnl/pull/1948) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency ruff to v0.9.7 [\#1947](https://github.com/jrnl-org/jrnl/pull/1947) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency rich to v13.9.4 [\#1946](https://github.com/jrnl-org/jrnl/pull/1946) ([renovate[bot]](https://github.com/apps/renovate))
-- Update dependency tox to v4.24.1 [\#1945](https://github.com/jrnl-org/jrnl/pull/1945) ([renovate[bot]](https://github.com/apps/renovate))
-
-## [v4.2](https://pypi.org/project/jrnl/v4.2/) (2024-11-17)
-
-[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.2-beta...v4.2)
+[Full Changelog](https://github.com/jrnl-org/jrnl/compare/v4.1...HEAD)
**Implemented enhancements:**
diff --git a/docs_theme/index.html b/docs_theme/index.html
index 94ae2006..8e7f3d1f 100644
--- a/docs_theme/index.html
+++ b/docs_theme/index.html
@@ -103,7 +103,7 @@ License: https://www.gnu.org/licenses/gpl-3.0.html
-
+