Lately I have been working on quite a few WordPress plugins that are hosted in the WordPress.org plugin repository, and since Github is my go to version control system, I like it a lot and we use at WooThemes as well, I got a bit fed up with having to keep a local SVN copy and doing things manually.
After some googling I eventually found a bash script that enables you to deploy directly from your Github repository without the need to keep a local copy of the SVN repository, it is as simple as adding the script below to your Github repo, changing a few lines in the script and then executing it when you want to deploy to the WordPress.org plugin repository/
I take no credit for this script, in fact it was created by a fellow WooCommerce plugin developer, Brent Shepherd, he developed and maintains the awesome WooCommerce Subscriptions extension.
To deploy straight from your Github repository to your WordPress.org Plugins SVN repository, simply copy the bash script below and place it in a new file in your Github repository, I use deploy.sh, once the file is there you can commit it to Github so it is always part of your plugin, then open up the file and edit the following parameters.
PLUGINSLUG – Change this to the slug of the plugin on WordPress.org
MAINFILE – Change this to the main PHP file that contains the WordPress version number of the plugin
SVNUSER – Change this to the WordPress.org username of the user who owns the plugin, it will be commit under this user.
And that is it, once you have modified the file, you will have to make it executable by (chmod u+x deploy.sh
) it via terminal, then when you are ready to deploy it, go to your Github repository where you stored the deploy.sh file and run the following command via terminal ./deploy.sh
It will ask you a few questions along the way and do some checks as well as tag the version on Github for you.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
# A modification of Dean Clatworthy's deploy script as found here: https://github.com/deanc/wordpress-plugin-git-svn | |
# The difference is that this script lives in the plugin's git repo & doesn't require an existing SVN repo. | |
# main config | |
PLUGINSLUG="camptix-payfast-gateway" | |
CURRENTDIR=`pwd` | |
MAINFILE="camptix-payfast.php" # this should be the name of your main php file in the wordpress plugin | |
# git config | |
GITPATH="$CURRENTDIR/" # this file should be in the base of your git repository | |
# svn config | |
SVNPATH="/tmp/$PLUGINSLUG" # path to a temp SVN repo. No trailing slash required and don't add trunk. | |
SVNURL="http://plugins.svn.wordpress.org/$PLUGINSLUG/" # Remote SVN repo on wordpress.org, with no trailing slash | |
SVNUSER="Kloon" # your svn username | |
# Let's begin… | |
echo "……………………………………" | |
echo | |
echo "Preparing to deploy wordpress plugin" | |
echo | |
echo "……………………………………" | |
echo | |
# Check version in readme.txt is the same as plugin file after translating both to unix line breaks to work around grep's failure to identify mac line breaks | |
NEWVERSION1=`grep "^Stable tag:" $GITPATH/readme.txt | awk -F' ' '{print $NF}'` | |
echo "readme.txt version: $NEWVERSION1" | |
echo "$GITPATH$MAINFILE" | |
NEWVERSION2=`grep "Version:" $GITPATH$MAINFILE | awk -F' ' '{print $NF}'` | |
echo "$MAINFILE version: $NEWVERSION2" | |
if [ "$NEWVERSION1" -ne "$NEWVERSION2" ]; then echo "Version in readme.txt & $MAINFILE don't match. Exiting…."; exit 1; fi | |
echo "Versions match in readme.txt and $MAINFILE. Let's proceed…" | |
if git show-ref –tags –quiet –verify — "refs/tags/$NEWVERSION1" | |
then | |
echo "Version $NEWVERSION1 already exists as git tag. Exiting…."; | |
exit 1; | |
else | |
echo "Git version does not exist. Let's proceed…" | |
fi | |
cd $GITPATH | |
echo -e "Enter a commit message for this new version: \c" | |
read COMMITMSG | |
git commit -am "$COMMITMSG" | |
echo "Tagging new version in git" | |
git tag -a "$NEWVERSION1" -m "Tagging version $NEWVERSION1" | |
echo "Pushing latest commit to origin, with tags" | |
git push origin master | |
git push origin master –tags | |
echo | |
echo "Creating local copy of SVN repo …" | |
svn co $SVNURL $SVNPATH | |
echo "Exporting the HEAD of master from git to the trunk of SVN" | |
git checkout-index -a -f –prefix=$SVNPATH/trunk/ | |
echo "Ignoring github specific files and deployment script" | |
svn propset svn:ignore "deploy.sh | |
README.md | |
.git | |
.gitignore" "$SVNPATH/trunk/" | |
echo "Changing directory to SVN and committing to trunk" | |
cd $SVNPATH/trunk/ | |
# Add all new files that are not set to be ignored | |
svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add | |
svn commit –username=$SVNUSER -m "$COMMITMSG" | |
echo "Creating new SVN tag & committing it" | |
cd $SVNPATH | |
svn copy trunk/ tags/$NEWVERSION1/ | |
cd $SVNPATH/tags/$NEWVERSION1 | |
svn commit –username=$SVNUSER -m "Tagging version $NEWVERSION1" | |
echo "Removing temporary directory $SVNPATH" | |
rm -fr $SVNPATH/ | |
echo "*** FIN ***" |
Thank you for this tutorial – it is working quite well for me!
Hi Ryan, glad it’s working for you. I use it myself without any issues for all my WordPress.org plugins and makes it much hassle free.
This script is really time saver!
Just noticed there is bug in script on line 34. != is now working can you change it to -ne
from
if [ “$NEWVERSION1” != “$NEWVERSION2” ]; then echo “Version in readme.txt & $MAINFILE don’t match. Exiting….”; exit 1; fi
To
if [ “$NEWVERSION1” -ne “$NEWVERSION2” ]; then echo “Version in readme.txt & $MAINFILE don’t match. Exiting….”; exit 1; fi
Thanks
Thanks, have updated the script to include that.
0 Pingbacks