Skip to content

Instantly share code, notes, and snippets.

Last active Apr 25, 2022
What would you like to do?
Deploy your plugin to the SVN plugin repository from your GitHub Repository.
#! /bin/bash
# Script to deploy from Github to Plugin Repository
# A modification of a number of different sources:
# @link
# @link
# @link
# Accompanying Tutorial Here:
# @link
# No editing required below this line.
#prompt for plugin slug
echo -e "Plugin Slug: \c"
# main config, set off of plugin slug
MAINFILE="$PLUGINSLUG.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="$PLUGINSLUG/" # Remote SVN repo on, with no trailing slash
# Let's begin...
echo ".........................................."
echo "Preparing to deploy WordPress plugin"
echo ".........................................."
# Check version in readme.txt is the same as plugin file
NEWVERSION1=`grep "^Stable tag" $GITPATH/readme.txt | awk -F' ' '{print $3}'`
echo "readme version: $NEWVERSION1"
NEWVERSION2=`grep "^Version" $GITPATH/$MAINFILE | awk -F' ' '{print $2}'`
echo "$MAINFILE version: $NEWVERSION2"
if [ "$NEWVERSION1" != "$NEWVERSION2" ]; then echo "Versions don't match. Exiting...."; exit 1; fi
echo "Versions match in readme.txt and PHP file. Let's proceed..."
echo -e "Enter a commit message for this new version: \c"
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 "Creating local copy of SVN repo ..."
echo "Ignoring github specific files and deployment script"
svn propset svn:ignore "
.gitignore" "$SVNPATH/trunk/"
#export git -> SVN
echo "Exporting the HEAD of master from git to the trunk of SVN"
git checkout-index -a -f --prefix=$SVNPATH/trunk/
#if submodule exist, recursively check out their indexes
if [ -f ".gitmodules" ]
echo "Exporting the HEAD of each submodule from git to the trunk of SVN"
git submodule init
git submodule update
git submodule foreach --recursive 'git checkout-index -a -f --prefix=$SVNPATH/trunk/$path/'
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"
svn copy trunk/ tags/$NEWVERSION1/
svn commit --username=$SVNUSER -m "Tagging version $NEWVERSION1"
echo "Removing temporary directory $SVNPATH"
rm -fr $SVNPATH/
echo "*** FIN ***"
Copy link

cameronjonesweb commented Jun 4, 2019

Grep throws a few errors with parent directories that have spaces in them, also doesn't seem to be able to pick up versions in a docblock but aside from that it works well.

Copy link

Life saver this script!
I also ran into a few issues on my Mac due to spaces in the parent folders, as well as trying to find the version number in the PHP file. Here's some comments/fixes for future users....

  1. Line 13 - Username case is important. Use whatever is shown as your username in your WordPress dot org profile.
  2. Line 42 - wrap the $GITPATH variable in double quotes. The new line becomes: NEWVERSION1=`grep "^Stable tag" "$GITPATH"/readme.t...
  3. Line 44 - Same issue as the one above, but I also wrap my plugin header the way WordPress shows it, ie with an * on a new line within the main opening and closing comment tags. As a result the script wasn't able to pick up the version number in the PHP file. To be clear, mine is written as * Version: 2.0. The '{print $2}' at the end of the line also needs to be adjusted for this. All in, the new line 44 looks like this: NEWVERSION2=`grep "^\* Version" "$GITPATH"/$MAINFILE | awk -F' ' '{print $3}'`
  4. Line 51 - $GITPATH should also be wrapped in quotes - so the whole line should be: cd "$GITPATH"
  5. Lastly, my Mac version no longer includes svn by default, so this will need to be installed. This SO answer saved the day, noting I went with the brew version on Catalina.

Copy link

@nickpagz Cool, glad it helped and thanks for sharing your modifications!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment