Since Mozilla has started using Mercurial for source control, I thought I shoud get some hands on experience with it. My Wordpress dashboard has been nagging me to upgrade to the latest version for quite a while now. I was running 2.5.1 up until today, which was released back in April. I've been putting off upgrading because it's always such a pain if you follow the recommended instructions, and I inevitably end up forgetting to migrate some customization I made to the old version. So, to kill two birds with one stone, I decided to try my hand at upgrading Wordpress by using Mercurial to track my changes to the default install, as well as the changes between versions of Wordpress. Preparation: First, start off with a copy of my blog's code in a directory called 'blog'. Download Wordpress 2.5.1 and 2.6.3 (the version I want to upgrade to). Import initial Wordpress code:
tar zxf wordpress-2.5.1.tar.gz # NB: unpacks into wordpress/ mv wordpress wordpress-2.5.1 cd wordpress-2.5.1 hg init hg commit -A -m 'wordpress 2.5.1' cd ..Apply my changes:
hg clone wordpress-2.5.1 wordpress-mine cd wordpress-mine hg qnew -m 'my blog' my-blog.patch hg locate -0 | xargs -0 rm cp -ar ../blog/* . hg addremove hg qrefresh cd ..The 'hg locate -0' line removes all the files currently tracked by Mercurial. This is needed so that any files I deleted from my copy of Wordpress also are deleted in my Mercurial repository. The result of these two steps is that I have a repository that has the original Wordpress source code as one revision, with my changes applied as a Mercurial Queue patch. Now I need to tell Mercurial what's changed between versions 2.5.1 and 2.6.3. To do this, I'll make a copy (or clone) of the 2.5.1 repository, and then put all the 2.6.3 files into it. Again, I use 'hg locate -0 | xargs -0 rm' to delete all the files from the old version before copying the new files in. Mercurial is smart enough to notice if files haven't changed, and the subsequent commit with the '-A' flag will add any new files or delete any files that were removed between 2.5.1 and 2.6.3. Upgrade the pristine 2.5.1 to 2.6.3:
hg clone wordpress-2.5.1 wordpress-2.6.3 tar zxf wordpress-2.6.3 # NB: Unpacks into wordpress/ cd wordpress-2.6.3 hg locate -0 | xargs -0 rm cp -ar ../wordpress/* . hg commit -A -m 'wordpress-2.6.3' cd ..Now I need to perform the actual upgrade to my blog. First I save the state of the current modifications, then pull in the 2.5.1 -> 2.6.3 changes from the wordpress-2.6.3 repository. Then I reapply my changes to the new 2.6.3 code. Pull in 2.6.3 to my blog:
cd wordpress-mine hg qsave -e -c hg pull ../wordpress-2.6.3 hg update -C hg qpush -a -mVoilÃ ! A quick rsync to my website, and the upgrade is complete! I have to admit, I don't fully grok some of these Mercurial commands. It took a few tries to work out this series of steps, so there's probably a better way of doing it. I'm pretty happy overall though; I managed a successful Wordpress upgrade, and learned something about Mercurial in the process! The next upgrade should go much more smoothly now that I've figured things out a bit better.