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):
vcs = git
basedir = ~/local/
vcs = svn
basedir = ~/svn/
In the morning, I'll normally do a checkoutmanager up and it'll go through
the list and do svn up, git pull, 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
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
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: print('something'). Boring
work, but easy.
Some __future__ imports, mostly for the print function and unicode
Oh, and setting up travis-ci.org testing. Very easy to get both
python 2.7 and 3.4 testing your software that
way. Otherwise you keep on switching back/forth between versions
(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
Some 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 try... except
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:
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