From f4ebfe5365c32fc060fe5f156bb9ec6dd3f929c1 Mon Sep 17 00:00:00 2001 From: Yuta Kasai Date: Thu, 21 Nov 2024 12:27:04 +0900 Subject: [PATCH] Add script to update and verify version --- .github/workflows/auto-testing.yml | 3 +- .github/workflows/publish-to-pypi.yml | 15 ++++-- tools/update_version.py | 66 +++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100755 tools/update_version.py diff --git a/.github/workflows/auto-testing.yml b/.github/workflows/auto-testing.yml index 8ba0bafe7..35c374ece 100644 --- a/.github/workflows/auto-testing.yml +++ b/.github/workflows/auto-testing.yml @@ -44,8 +44,7 @@ jobs: - name: Update version in linebot/__about__.py run: | VERSION="123.456.789" - sed -i "s/__version__ = '.*'/__version__ = '$VERSION'/g" linebot/__about__.py - cat linebot/__about__.py + python tools/update_version.py $VERSION check-import: runs-on: ubuntu-latest diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index b24f2a541..8b2c35bab 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -6,6 +6,11 @@ name: Upload Python Package on: release: types: [published] + workflow_dispatch: + inputs: + version: + description: 'The version to release' + required: true jobs: deploy: @@ -26,10 +31,14 @@ jobs: pip install setuptools wheel twine - name: Update version in linebot/__about__.py run: | - VERSION=${{ github.event.release.tag_name }} + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + VERSION=${{ github.event.inputs.version }} + else + VERSION=${{ github.event.release.tag_name }} + fi + VERSION=${VERSION#v} - sed -i "s/__version__ = '.*'/__version__ = '$VERSION'/g" linebot/__about__.py - cat linebot/__about__.py + python tools/update_and_verify_version.py $VERSION - name: Build and publish env: TWINE_USERNAME: ${{ secrets.PYPI_API_USER }} diff --git a/tools/update_version.py b/tools/update_version.py new file mode 100755 index 000000000..db3fe0f42 --- /dev/null +++ b/tools/update_version.py @@ -0,0 +1,66 @@ +import sys +import re +import subprocess + +def update_and_verify_version(new_version): + file_path = 'linebot/__about__.py' + + # Update version + with open(file_path, 'r') as file: + content = file.read() + + new_content = re.sub( + r"__version__ = '.*?'", + f"__version__ = '{new_version}'", + content + ) + + with open(file_path, 'w') as file: + file.write(new_content) + + print(f"Updated version to {new_version} in {file_path}") + + # verify version + match = re.search(r"__version__ = '(.*?)'", new_content) + if not match: + raise ValueError("Version string not found in the file.") + + actual_version = match.group(1) + if actual_version != new_version: + raise ValueError(f"Version mismatch: expected {new_version}, found {actual_version}") + + print(f"Version verified: {actual_version}") + + # diff check just in case + try: + result = subprocess.run(['git', 'diff', '--numstat', file_path], capture_output=True, text=True, check=True) + changed_lines = result.stdout.strip().split('\n') + added_lines = 0 + deleted_lines = 0 + + for line in changed_lines: + added, deleted = map(int, line.split('\t')[:2]) + added_lines += added + deleted_lines += deleted + + if added_lines != 1 or deleted_lines != 1: + raise ValueError(f"Unexpected number of changed lines: expected 1 added and 1 deleted, found {added_lines} added and {deleted_lines} deleted") + + print('Git diff verification passed: 1 line added and 1 line deleted.') + + except subprocess.CalledProcessError as e: + print(f"Error during git diff verification: {e}") + sys.exit(1) + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python update_and_verify_version.py ") + sys.exit(1) + + new_version = sys.argv[1] + + try: + update_and_verify_version(new_version) + except ValueError as e: + print(e) + sys.exit(1)