Checkoutmanager is a
five-year old tool that I still use daily. The idea? A simple
~/.checkoutmanager.cfg ini file that lists your checkouts/clones. Like
this (only much longer):
[local] vcs = git basedir = ~/local/ checkouts = email@example.com:nens/syseggrecipe.git firstname.lastname@example.org:buildout/buildout.git email@example.com:reinout/reinout-media.git firstname.lastname@example.org:rvanlaar/djangorecipe.git [svn] vcs = svn basedir = ~/svn/ checkouts = svn+ssh://email@example.com/repos/main/z3c.recipe.usercrontab/trunk
In the morning, I’ll normally do a
checkoutmanager up and it’ll go through
the list and do
hg pull -u, depending on the
version control system. Much better than going though a number of them by
Regularly, I’ll do
checkoutmanager st to see if I’ve got something I still
need to commit. If you just work on one project, no problem. But if you need
to do quick fixes on several projects and perhaps also store your laptop’s
configuration in git… it is easy to forget something:
$ checkoutmanager st /Users/reinout/vm/veertien/efcis-site M README.rst
And did you ever commit something but forgot to push it to the server?
checkoutmanager out tells you if you did :-)
Porting to python 3. The repo was originally on bitbucket, but nowadays I keep having to look all over my screen, looking for buttons, to get anything done there. I’m just too used to github, it seems. So after merging a pull request I finally got down to moving it to github.
I also copied over the issues and added one that told me to make sure it runs on python 3, too. Why? Well, it is the good thing to do. And… we had a work meeting last week where we said that ideally we’d want to run everything on python 3.
Two years ago I started a django site with python 3. No real problems there. I had to fix two buildout recipes myself. And the python LDAP package didn’t work, but I could work around it. And supervisord didn’t run so I had to use the apt-get-installed global one. For the rest: fine.
Recently I got zest.releaser to work on python 3 (that is: someone else did most of the hard work, I helped getting the pull request properly merged :-) ). For that, several test dependencies needed to be fixed for python 3 (which, again, someone else did). Checkoutmanager had the same test dependencies, so getting the test machinery to run was just a matter of updating dependencies.
What had to be done?
print 'something' is now a function:
work, but easy.
__future__ imports, mostly for the print function and unicode
(There’s also ‘tox’ you can use for local multi-python-version testing in case you really really need that all the time, I don’t use it myself though.)
from six.moves import xyz to work around changed imports between 2
and 3. Easy peasy, just look at the list in the documentation.
It is now
try... except SomeError as e instead of
SomeError, e. The new syntax already works in 2.7, so there’s no problem
The one tricky part was that checkoutmanager uses doctests instead of “regular” tests. And getting string comparison/printing right on both python 2 and 3 is a pain. You need an ugly change like this one to get it working. Bah.
But: most people don’t use doctests, so they won’t have this problem :-)
The full list of changes is in this pull request: https://github.com/reinout/checkoutmanager/pull/9 .
A handy resource is http://python3porting.com/problems.html . Many common problems are mentioned there. Including solution.
Django’s porting tips at https://docs.djangoproject.com/en/1.8/topics/python3/ are what I recommended to my colleagues as a useful initial guide on what to do. Sane, short advice.
Anyway… Another python 3 package! (And if I’ve written something that’s still used but that hasn’t been ported yet: feel free to bug me or to send a pull request!)
My name is Reinout van Rees and I work a lot with Python (programming language) and Django (website framework). I live in The Netherlands and I'm happily married to Annie van Rees-Kooiman.
Most of my website content is in my weblog. You can keep up to date by subscribing to the automatic feeds (for instance with Google reader):