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.
 
 
 
 
 

166 lines
4.8 KiB

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