Blog moved here: http://blog.andialbrecht.de.
Sorry for the inconvenience, but now I can use ReStructured Text to write posts :)
A new maintenance release of hgsvn is available on PyPI. Go and grab it while it’s hot :)
Besides a lot of bug fixes this release includes a few new features and improvements:
- Matt Fowles added the so-called “airplane mode”, when using hgimportsvn with the –local-only flag no network access is required to convert a already checked out Subversion repository to a hgsvn controlled Mercurial repository.
- Commit messages when pushing back to SVN can be edited before committing using the -e/–edit command line flag. Patch by eliterr.
- sterin provided a patch that takes care that no mq patches are applied when running hgpushsvn or hgpullsvn.
Thanks to all contributors for reporting bugs and providing patches!
The e-mail backends allow you to use native Django functions for sending e-mails like django.core.mail.send_mail() on App Engine.
To use pluggable e-mail backends you’ll have to use a recent version of Django. Support for pluggable e-mail backends was introduced in rev11709 and will be released in Django 1.2.
Using the e-mail backend
The e-mail backends are available as a single package on bitbucket. To check out the most recent sources run:
$ hg clone http://bitbucket.org/andialbrecht/appengine_emailbackends/
To use the e-mail backend for App Engine copy the appengine_emailbackend directory to the top-level directory of you App Engine application and add the following line to your settings.py:
EMAIL_BACKEND = 'appengine_emailbackend'
If you prefer asynchronous e-mail delivery use this line in your settings.py instead:
EMAIL_BACKEND = 'appengine_emailbackend.async'
When using the async backend e-mails will not be sent immediately but delivered via a taskqueue.
Running the demo application
There’s also a demo application included in this repository. Run this application using
$ dev_appserver.py .
and open http://localhost:8080 in your web browser. Remember to include a current checkout of the Django SVN repository in the top-level directory of the demo application.
If you’re a regular Dominion player like me, you’re always in search for new card sets. Fortunately I’ve had a little time this weekend to write a simple App Engine application that gives me a random card set on demand.
You can see it in action at http://dominionsets.appspot.com
That’s it, just a short post on this, now back to the next match :)
P.s.: Some technical stuff… There’s Django with it’s i18n support under the hood. The UI is powered by JQuery.
A new bugfix release for CrunchyFrog is out in the wild. There are not much visible changes, but a few bug fixes under the hood. One visible change is the option to give the SQL editor much more space by hiding all other UI elements in the main window. Here’s a screenshot:
The second screenshot shows the new highlighting of errors in the editor. In this case there’s no table called “actor”. When the execution of a statement results in a SQL error, CrunchyFrog now tries to find the position of the error in the SQL editor, highlights the corresponding part in your SQL statement and moves the cursor to the right place. I found it very handy to have the cursor in place to correct the error and run the statement again without searching the error before.
Thanks to everyone who contributed to this release by sending patches and submitting issues on the tracker!
The quote in the title is something that Dana Colley said after giving credits to the members of Orchestra Morphine on some show circulating through the internet about nine years ago. I think this show is still available on the HI-N-DRY website and I strongly recommend to buy it, it’s a fascinating recording.
I’ve choosen this quote because it expresses what I’m thinking today, the 10th anniversary of Mark Sandman’s passing. His music shaped me more than any other music I’m listening too. He had that idea of a unique sound, not to mention the great lyrics. It’s not easy to explain to someone who never listened to Morphine what this idea is about. It’s not even easy to explain it to people that had to hear quite a lot of Morphine the past ten (and more) years (many, many thanks to my family for their patience with my musical taste they call “a bit strange” from time to time :)… Read more…
Yesterday I’ve taken over maintenance of hgsvn from it’s original author Antoine Pitrou. Many thanks to Antoine at this point for doing a great job on this tool!
In case you don’t know, hgsvn is “a set of scripts to work locally on Subversion checkouts using Mercurial.”
My aim is not to make these scripts a full-blown Subversion extensions for Mercurial. hgsubversion or the convert extension will probably do a much better job with tighter integration as it’s in the scope of hgsvn. So the main focus is on fixing bugs and to finish and release the hgpushsvn script that commits changes in your Mercurial repository back to Subversion.
The reason why I decided to work on this project is pretty simple: I’ve made good experiences with it and I still want to keep using it.
With hgpushsvn the tool provides three scripts for the most basic tasks:
hgimportsvn initializes a hg repository and fetches the sources from svn, optionally starting at a specific revision.
hgpullsvn pulls new change sets from svn to your local hg repository.
hgpushsvn pushes back your local commits to the svn repository.
Using hgsvn for a while now, I’m feeling very comfortable with these scripts and they fit very well into my workflow.
The next things I’m about to do are:
- fix the unittests, at least one is broken ATM
- setup a buildbot to have some automated tests
- finish hgpullsvn
If you’re using hgsvn, please file bug reports or submit patches on the issue tracker.
There was a Simpsons episode, I can’t recall correctly, but I think Bart recorded Lisa when her heart broke and he watched it in slow motion to stop exactly at that point.
I thought of this episode yesterday while playing around with my laptop’s webcam and a Python shell. Finally I wrote a little fun script that does almost the same: Just register it as a hg hook and it takes a picture of you exactly at the unique moment when merging fails and it sends it directly and without any further questions to Twitpic and Twitter:
#!/usr/bin/env python import os import sys import tempfile import time from CVtypes import cv from twitpic import TwitPicAPI DEVICE = 0 TWITTER_USER = 'xxx' # CHANGE THIS! TWITTER_PWD = 'xxx' # CHANGE THIS! # This is the time in seconds you need to realize that the merge has # failed. When setting this consider that it already takes about a second # for the camera to take the picture. "0" means no delay ;-) EMOTIONAL_SLUGGISHNESS_RATE = 0.0 def grab_image(fname): camera = cv.CreateCameraCapture(DEVICE) frame = cv.QueryFrame(camera) cv.SaveImage(fname, frame) def how_do_you_look(): failed = bool(os.environ.get('HG_ERROR', 0)) if not failed: return # hmpf, maybe next time... fd, fname = tempfile.mkstemp('.jpg') if EMOTIONAL_SLUGGISHNESS_RATE > 0: time.sleep(EMOTIONAL_SLUGGISHNESS_RATE) grab_image(fname) twit = TwitPicAPI(TWITTER_USER, TWITTER_PWD) retcode = twit.upload(fname, post_to_twitter=True, message='Another merge failed.') os.remove(fname) if __name__ == '__main__': how_do_you_look()
You’ll need the CVtypes OpenCV wrapper and this Twitpic Python module. I’ve patched the twitpic module to support messages. Have a look at this issue if it’s already supported, otherwise a diff that adds the message keyword is attached to the issue. To use it as a Mercurial hook just add to .hg/hgrc:
[hooks] update = /path/to/the/above/script.py
and make the script executable.
The results are pretty good :)
BTW, the way how to access the camera is inspired by this nice blog post about face recognition using OpenCV.
Edit (2009-05-12): It was Ralph, not Lisa. Thanks Florian!