I never learned how to use Subversion which is why publishing my work on WordPress becomes such a chore. Thankfully, I found a script that can deploy a local Git repository to WordPress.org. This script assumes you have the following setup and working in your Windows environment already:
- SVN, in this case I use TortoiseSVN
- GIT, I use the GIT-SCM and Github Windows client
- Already have a WordPress.org account and existing repository for your project
The script is originally from GaryJones from github which I modified to suit my needs. Simply put the script in the repository folder and change out the CHANGE_ME values before running the script.
You have the option to set the path of the local repository within the script or in the prompt, what I prefer to do is to just drop the script in the working directory and run the script there.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
VAR_CURRENTDIR=$(pwd) VAR_PLUGINSLUG="CHANGE_ME" VAR_SVN_USERNAME="CHANGE_ME" default_svnpath="$VAR_CURRENTDIR/tmp" default_svnurl="https://plugins.svn.wordpress.org/$VAR_PLUGINSLUG" default_plugindir="$VAR_CURRENTDIR" default_mainfile="$VAR_PLUGINSLUG.php" echo echo "WordPress Plugin SVN Deploy v3.1.0" echo echo "Let's collect some information first. There are six questions." echo echo "Default values are in brackets - just hit enter to accept them." echo # Get some user input # Can't use the -i flag for read, since that doesn't work for bash 3 printf "Q1. WordPress Repo Plugin Slug e.g. my-awesome-plugin: " printf "($VAR_PLUGINSLUG): " read -e input input="${input%/}" # Strip trailing slash echo echo "Q2. Your local plugin root directory (the Git repo)." printf "($default_plugindir): " read -e input input="${input%/}" # Strip trailing slash PLUGINDIR="${input:-$default_plugindir}" # Populate with default if empty echo # Check directory exists. if [ ! -d "$PLUGINDIR" ]; then echo "Directory $PLUGINDIR not found. Aborting." exit 1; fi printf "Q3. Name of the main plugin file ($default_mainfile): " read -e input MAINFILE="${input:-$default_mainfile}" # Populate with default if empty echo # Check main plugin file exists. if [ ! -f "$PLUGINDIR/$MAINFILE" ]; then echo "Plugin file $PLUGINDIR/$MAINFILE not found. Aborting." exit 1; fi echo "Checking version in main plugin file matches version in readme.txt file..." 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 PLUGINVERSION=$(grep -i "Version:" $PLUGINDIR/$MAINFILE | awk -F' ' '{print $NF}' | tr -d '\r') echo "$MAINFILE version: $PLUGINVERSION" READMEVERSION=$(grep -i "Stable tag:" $PLUGINDIR/readme.txt | awk -F' ' '{print $NF}' | tr -d '\r') echo "readme.txt version: $READMEVERSION" if [ "$READMEVERSION" = "trunk" ]; then echo "Version in readme.txt & $MAINFILE don't match, but Stable tag is trunk. Let's continue..." elif [ "$PLUGINVERSION" != "$READMEVERSION" ]; then echo "Version in readme.txt & $MAINFILE don't match. Exiting...." exit 1; elif [ "$PLUGINVERSION" = "$READMEVERSION" ]; then echo "Versions match in readme.txt and $MAINFILE. Let's continue..." fi echo echo "Q4. Path to a local directory where a temporary SVN checkout can be made." printf "Don't add trunk ($default_svnpath): " read -e input input="${input%/}" # Strip trailing slash SVNPATH="${input:-$default_svnpath}" # Populate with default if empty echo echo "Q5. Remote SVN repo on WordPress.org." printf "($default_svnurl): " read -e input input="${input%/}" # Strip trailing slash SVNURL="${input:-$default_svnurl}" # Populate with default if empty echo printf "Q6. Your WordPress repo SVN username ($VAR_SVN_USERNAME): " read -e input SVNUSER="${input:-$VAR_SVN_USERNAME}" # Populate with default if empty echo echo "That's all of the data collected." echo echo "Slug: $VAR_PLUGINSLUG" echo "Plugin directory: $PLUGINDIR" echo "Main file: $MAINFILE" echo "Temp checkout path: $SVNPATH" echo "Remote SVN repo: $SVNURL" echo "SVN username: $SVNUSER" echo printf "OK to proceed (Y|n)? " read -e input PROCEED="${input:-y}" echo # Allow user cancellation if [ $(echo "$PROCEED" |tr [:upper:] [:lower:]) != "y" ]; then echo "Aborting..."; exit 1; fi # Let's begin... echo ".........................................." echo echo "Preparing to deploy WordPress plugin" echo echo ".........................................." echo echo echo "Changing to $PLUGINDIR" cd $PLUGINDIR # Check for git tag (may need to allow for leading "v"?) # if git show-ref --tags --quiet --verify -- "refs/tags/$PLUGINVERSION" if git show-ref --tags --quiet --verify -- "refs/tags/$PLUGINVERSION" then echo "Git tag $PLUGINVERSION does exist. Let's continue..." else echo "$PLUGINVERSION does not exist as a git tag. Aborting."; exit 1; fi echo echo "Creating local copy of SVN repo trunk..." svn checkout $SVNURL $SVNPATH --depth immediates svn update --quiet $SVNPATH/trunk --set-depth infinity echo "Ignoring GitHub specific files" # Use local .svnignore if present if [ -f ".svnignore" ]; then echo "Using local .svnignore" SVNIGNORE=$( <.svnignore ) else echo "Using default .svnignore" SVNIGNORE="README.md Thumbs.db .github .git .gitattributes .gitignore composer.lock" fi svn propset svn:ignore \""$SVNIGNORE"\" "$SVNPATH/trunk/" 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" ] then echo "Exporting the HEAD of each submodule from git to the trunk of SVN" git submodule init git submodule update git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | while read path_key path do #url_key=$(echo $path_key | sed 's/\.path/.url/') #url=$(git config -f .gitmodules --get "$url_key") #git submodule add $url $path echo "This is the submodule path: $path" echo "The following line is the command to checkout the submodule." echo "git submodule foreach --recursive 'git checkout-index -a -f --prefix=$SVNPATH/trunk/$path/'" git submodule foreach --recursive 'git checkout-index -a -f --prefix=$SVNPATH/trunk/$path/' done fi echo # Support for the /assets folder on the .org repo. echo "Moving assets." # Make the directory if it doesn't already exist mkdir -p $SVNPATH/assets/ mv $SVNPATH/trunk/assets/* $SVNPATH/assets/ svn add --force-interactive $SVNPATH/assets/ svn delete --force-interactive $SVNPATH/trunk/assets echo echo "Changing directory to SVN and committing to trunk." cd $SVNPATH/trunk/ # Delete all files that should not now be added. # Use $SVNIGNORE for `rm -rf`. Setting propset svn:ignore seems flaky. echo "$SVNIGNORE" | awk '{print $0}' | xargs rm -rf svn status | grep -v "^.[ \t]*\..*" | grep "^\!" | awk '{print $2"@"}' | xargs svn del # 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 "Preparing for $PLUGINVERSION release" echo echo "Updating WordPress plugin repo assets and committing." cd $SVNPATH/assets/ # Delete all new files that are not set to be ignored svn status | grep -v "^.[ \t]*\..*" | grep "^\!" | awk '{print $2"@"}' | xargs svn del # Add all new files that are not set to be ignored svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2"@"}' | xargs svn add svn update --quiet --accept working $SVNPATH/assets/* svn resolve --accept working $SVNPATH/assets/* svn commit --username=$SVNUSER -m "Updating assets" echo echo "Creating new SVN tag and committing it." cd $SVNPATH svn copy --quiet trunk/ tags/$PLUGINVERSION/ # Remove assets and trunk directories from tag directory svn delete --force-interactive --quiet $SVNPATH/tags/$PLUGINVERSION/assets svn delete --force-interactive --quiet $SVNPATH/tags/$PLUGINVERSION/trunk svn update --force-interactive --accept working $SVNPATH/tags/$PLUGINVERSION #svn resolve --accept working $SVNPATH/tags/$PLUGINVERSION/* cd $SVNPATH/tags/$PLUGINVERSION svn commit --username=$SVNUSER -m "Tagging version $PLUGINVERSION" echo echo "Removing temporary directory $SVNPATH." cd $SVNPATH cd .. rm -fr $SVNPATH/ echo "*** FIN ***" |