A Python parser for MediaWiki wikicode https://mwparserfromhell.readthedocs.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

170 lines
4.9 KiB

  1. #! /usr/bin/env bash
  2. if [[ -z "$1" ]]; then
  3. echo "usage: $0 1.2.3"
  4. exit 1
  5. fi
  6. set -euo pipefail
  7. VERSION=$1
  8. SCRIPT_DIR=$(dirname "$0")
  9. RELEASE_DATE=$(date +"%B %-d, %Y")
  10. check_git() {
  11. if [[ -n "$(git status --porcelain --untracked-files=no)" ]]; then
  12. echo "Aborting: dirty working directory."
  13. exit 1
  14. fi
  15. if [[ "$(git rev-parse --abbrev-ref HEAD)" != "develop" ]]; then
  16. echo "Aborting: not on develop."
  17. exit 1
  18. fi
  19. echo -n "Are you absolutely ready to release? [yN] "
  20. read confirm
  21. if [[ ${confirm,,} != "y" ]]; then
  22. exit 1
  23. fi
  24. }
  25. update_version() {
  26. echo -n "Updating mwparserfromhell.__version__..."
  27. sed -e 's/__version__ = .*/__version__ = "'$VERSION'"/' -i "" src/mwparserfromhell/__init__.py
  28. echo " done."
  29. }
  30. update_appveyor() {
  31. filename="appveyor.yml"
  32. echo -n "Updating $filename..."
  33. sed -e "s/version: .*/version: $VERSION-b{build}/" -i "" $filename
  34. echo " done."
  35. }
  36. update_changelog() {
  37. filename="CHANGELOG"
  38. echo -n "Updating $filename..."
  39. sed -e "1s/.*/v$VERSION (released $RELEASE_DATE):/" -i "" $filename
  40. echo " done."
  41. }
  42. update_docs_changelog() {
  43. filename="docs/changelog.rst"
  44. echo -n "Updating $filename..."
  45. dashes=$(seq 1 $(expr ${#VERSION} + 1) | sed 's/.*/-/' | tr -d '\n')
  46. previous_lineno=$(expr $(grep -n -e "^---" $filename | sed '2q;d' | cut -d ':' -f 1) - 1)
  47. previous_version=$(sed $previous_lineno'q;d' $filename)
  48. sed \
  49. -e "4s/.*/v$VERSION/" \
  50. -e "5s/.*/$dashes/" \
  51. -e "7s/.*/\`Released $RELEASE_DATE <https:\/\/github.com\/earwig\/mwparserfromhell\/tree\/v$VERSION>\`_/" \
  52. -e "8s/.*/(\`changes <https:\/\/github.com\/earwig\/mwparserfromhell\/compare\/$previous_version...v$VERSION>\`__):/" \
  53. -i "" $filename
  54. echo " done."
  55. }
  56. do_git_stuff() {
  57. echo -n "Git: committing, tagging, and merging release..."
  58. git commit -qam "release/$VERSION"
  59. git tag v$VERSION -s -m "version $VERSION"
  60. git checkout -q master
  61. git merge -q --no-ff develop -m "Merge develop into master (release/$VERSION)"
  62. echo -n " pushing..."
  63. git push -q --tags origin master
  64. git checkout -q develop
  65. git push -q origin develop
  66. echo " done."
  67. }
  68. upload_to_pypi() {
  69. echo -n "PyPI: uploading source tarball..."
  70. python setup.py -q sdist
  71. twine upload -s dist/mwparserfromhell-$VERSION*
  72. echo " done."
  73. }
  74. post_release() {
  75. echo
  76. echo "*** Release completed."
  77. echo "*** Update: https://github.com/earwig/mwparserfromhell/releases/tag/v$VERSION"
  78. echo "*** Verify: https://pypi.org/project/mwparserfromhell"
  79. echo "*** Verify: https://ci.appveyor.com/project/earwig/mwparserfromhell"
  80. echo "*** Verify: https://mwparserfromhell.readthedocs.io"
  81. echo "*** Press enter to sanity-check the release."
  82. read
  83. }
  84. test_release() {
  85. echo
  86. echo "Checking mwparserfromhell v$VERSION..."
  87. echo -n "Creating a virtualenv..."
  88. virtdir="mwparser-test-env"
  89. python -m venv $virtdir
  90. cd $virtdir
  91. source bin/activate
  92. echo " done."
  93. echo -n "Installing mwparserfromhell with pip..."
  94. pip -q install --upgrade pip
  95. pip -q install mwparserfromhell pytest
  96. echo " done."
  97. echo -n "Checking version..."
  98. reported_version=$(python -c 'print(__import__("mwparserfromhell").__version__)')
  99. if [[ "$reported_version" != "$VERSION" ]]; then
  100. echo " error."
  101. echo "*** ERROR: mwparserfromhell is reporting its version as $reported_version, not $VERSION!"
  102. deactivate
  103. cd ..
  104. rm -rf $virtdir
  105. exit 1
  106. else
  107. echo " done."
  108. fi
  109. pip -q uninstall -y mwparserfromhell
  110. echo -n "Downloading mwparserfromhell source tarball and GPG signature..."
  111. curl -sL "https://pypi.io/packages/source/m/mwparserfromhell/mwparserfromhell-$VERSION.tar.gz" -o "mwparserfromhell.tar.gz"
  112. curl -sL "https://pypi.io/packages/source/m/mwparserfromhell/mwparserfromhell-$VERSION.tar.gz.asc" -o "mwparserfromhell.tar.gz.asc"
  113. echo " done."
  114. echo "Verifying tarball..."
  115. gpg --verify mwparserfromhell.tar.gz.asc mwparserfromhell.tar.gz
  116. if [[ "$?" != "0" ]]; then
  117. echo "*** ERROR: GPG signature verification failed!"
  118. deactivate
  119. cd ..
  120. rm -rf $virtdir
  121. exit 1
  122. fi
  123. tar -xf mwparserfromhell.tar.gz
  124. rm mwparserfromhell.tar.gz mwparserfromhell.tar.gz.asc
  125. cd mwparserfromhell-$VERSION
  126. echo "Running unit tests..."
  127. python setup.py -q install
  128. python -m pytest
  129. if [[ "$?" != "0" ]]; then
  130. echo "*** ERROR: Unit tests failed!"
  131. deactivate
  132. cd ../..
  133. rm -rf $virtdir
  134. exit 1
  135. fi
  136. echo -n "Everything looks good. Cleaning up..."
  137. deactivate
  138. cd ../..
  139. rm -rf $virtdir
  140. echo " done."
  141. }
  142. echo "Preparing mwparserfromhell v$VERSION..."
  143. cd "$SCRIPT_DIR/.."
  144. check_git
  145. update_version
  146. update_appveyor
  147. update_changelog
  148. update_docs_changelog
  149. do_git_stuff
  150. upload_to_pypi
  151. post_release
  152. test_release
  153. echo "All done."
  154. exit 0