guitone 1.0rc3 released

I’m proud to announce the third release candidate of guitone 1.0.
This release fixes some critical bugs and also adds support for
drag’n’drop renames in the workspace amongst other minor improvements.

The complete list of changes is as always listed in NEWS. A Mac OS X
binary is also already available, a package for Windows will follow

I’m still looking for translators – if you’re interested, please drop me
a note.

guitone 1.0rc2 released

I’m proud to announce the immediate release of guitone-1.0rc2. This is the second release in a series of smaller releases which aims at the stabilization of the guitone codebase. A lot of bug fixes went into the code, only a few outstanding issues remain. The addition of an
annotation view is the most visible new feature of this release. Please test and report bugs if possible.

The complete list of changes is written down in the NEWS file as
always. I’ll try and prepare a Windows binary tomorrow, a binary for Mac OS X should arrive shortly as well.

guitone 1.0rc1 released

I’m proud to announce the immediate release of guitone-1.0rc1. This is the first release in a series of smaller releases which aims at the stabilization of the guitone codebase. Many (if not most) of the features one would consider needed for a “1.0” release have been implemented, a couple of outstanding bugs (noticable FS#39, FS#41 and
FS#42) have to get fixed beforehand though before that happens. Please test and report bugs if possible.

Outstanding news of this release:

  • Synchronization with other monotone nodes is no possible
  • Workspace action implementation almost feature-complete (add, drop, revert, rename, ignore, unignore and update finally work)
  • guitone can now create new monotone databases and setup new projects
  • Much improved key management with the ability to change the passphrase of keys, filter the key output and also drop keys
  • Many more bugfixes and smaller improvements as well as stabilization of the codebase

For a complete list of changes please check the NEWS file. I’ll try and prepare a Windows binary in the next couple of days, but probably won’t get to that before Wednesday, so if you want to help out, drop me
a note. A binary for Mac OS X should arrive shortly as well.

monotone / guitone update

Thanks to Timothy (and probably also thanks to the bad weather) we’ve seen some development activity for monotone recently. It started out with the “key-by-hash” changes: keys are no longer identified by its name, but their unique ID which finally solves the “I have lost my monotone private key – help!” issues from the past. This already went into monotone 0.45 which was released about a month ago.

Now the upcoming monotone release includes another long-awaited feature which is in the trunk as of yesterday: being able to query database contents from remote monotone servers. This is particularily useful if you want to check what branches are available server-side before you fetch them all. I’ve teamed up with Timothy and made a “single-shot” version of his new `automate remote_stdio` command which can be used as follows:

 # this picks your default netsync server stored in the database
 $ mtn au remote branches
 # ... alternatively, give it an optional hostname
 $ mtn au remote --remote-stdio-host branches

Since both `automate remote_stdio` and `automate remote` can execute any available remote automate command through this, a little lua guard was implemented which allows the server administrator to pick certain commands which he wants to make available. By default, no command can be executed:

function get_remote_automate_permitted(key_identity, command, options)

where `key_identity` identifies the calling user, command points to a table which contains the command’s name and arguments, and options points to another table which contains the options for the given command.

Now what has all this to do with guitone?

Especially the changes in 0.45 forced me already to pick my old pet project up again, because key-related commands changed their output in an incompatible manner and therefor my code needed to adapt to that as well. I’m also planning to finalize other features in the upcoming weeks, amongst that netsync support (whose automate versions incidentally have to be implemented in monotone at first as well), an improved changeset browser and probably other minor things and bugs which have been on hold since February.

Netsync dialog

The next guitone version won’t be out before monotone 0.46 hits the streets though, simply because I have to wait (and implement) a couple of things in monotone first and because I want to publish a release which does not explode the first time you’ll look at it. But hey, since I’m the release manager for monotone as well, its in my hands when it will be out 🙂
Its also likely that I’ll introduce a beta release cycle for the next guitone release and make a couple of binaries so people get their hands on it easier and earlier.

So, stay tuned for more updates on both projects!

Development of guitone has been abandoned

For several, mostly personal, reasons the development of guitone has been abandoned. There are a couple of unfinished features and bugfixes waiting in the trunk which are now not released, but I’d rather want to make a major release than another minor one and there is way too much left to do for a single person with way too little time to really make a sound release.

Maybe I’ll pick it up again in a few months, but I can’t guarantee that. For now, my thanks go to all the users and packagers for their time and for the support!

Windows binary available and Outlook

I’ve just uploaded a windows binary for guitone 0.9 – sorry that it took a little longer this time. I’ve been quite busy during the past days and having no windows machine at home doesn’t help much either 😉
Of course if there are other people willing to package guitone on windows, drop me a note. Its actually not much work. A detailed explanation and a InnoSetup installer script are already in place.

On a related note I’m working on a couple of new features for guitone. The next version will be able to create new monotone database and also create new projects from existing ones (basically a frontend for `mtn setup`). Furthermore I decided I should finally implement some workspace commands, so at least the equivalent of `mtn add` and `mtn drop` should be possible, `mtn revert` and `mtn rename` probably as well.

The monotone additions for netsync automation still not made it into trunk, mainly because I was not in the mood to finally fix the anticipated lua testing for stdio traffic (I really should not push this task further away, because the branch where the automate netsync stuff resides in diverges more and more over time…). And of course before this is not in monotone’s trunk it makes no sense to implement it in guitone either – so yeah, if you particularily wait for this feature, give me a kick in the butt so I get finally around.

guitone 0.9 – “long time no see” release [updated]

I’ve released guitone-0.9 today. This is mainly a bugfix release which
contains only two new features:

  1. People can select the correct encoding for a file which is
    displayed in guitone’s diff dialog. Guitone is capable of setting
    and restoring a custom file attribute for diffed workspace files
    and automatically render the file with the correct encoding next
    time it is diffed.
  2. There is now a “Node information” dubbed info window which displays
    a couple of interesting information for selected workspace paths.

The usual download location for the new release is

Check the NEWS file there for a complete set of changes.

And before you ask – the Win32 setup file should be ready on Monday – I
don’t have access to a windows machine before… 😉

Update Unfortunately a small glitch made it into the 0.9 tarball release where qmake bailed out with a monotone error message “mtn: misuse: workspace required but not found” – this should be fixed now. Sorry for the inconvenience./Update

Hacking on the Train back Home

I’ve been in Hamburg today with two other colleques to show off a milestone of our current project at work. Since the customer was quite satisfied, I was in the mood and finished a short hack for the next guitone release: A node info panel. Here is the obligatory screenshot:

The panel shows a particular new monotone feature which just popped up in 0.41, but was implemented months ago on the Summit: Information in which revision a particular file or directory was created (“Added in”). People can click this and go straight to the revision selector in which they can retrieve more information about the revision, compare it with others and so on.

The panel probably needs some more polishing (i.e. I don’t know if the icons render so pretty in 64x64px on Windows and Linux as well, or if I have to downscale them to 32×32 there), but it should basically work.

I’m yet undecided if I should do another point release for guitone. Not much has changed since then, a few minor bugs have been fixed and preliminary encoding support has been added for the file diff dialog. My plan was to add support for the automate netsync commands in 0.9, but since they haven’t yet landed on mainline, it makes no sense to implement support for them on guitone’s side. (Thats the drawback if you have to implement stuff on monotone’s side yourself before you can actually continue with your main goal.)

But since I just got a note from Ulf Ochsenfahrt today that he built Ubuntu 8.04 debs of guitone I’m now egged enough to do finally finish the missing tests for the nvm.automate-netsync branch and get this hopefully implemented later on in guitone as well.

guitone 0.8 released – spring time is hacking time!

guitone 0.8 has been released today. Major improvements happened under the hood, the outstanding changes are:

  • guitone is now licensed under GNU GPL Version 3 or later. Please note that you’re now only allowed to legally distribute binaries which you’ve built with Qt 4.3.4 or later, since earlier versions of Qt are GPLv2-only
  • new “driver” interface to call certain dialogs of guitone from the outside, which should help for all sorts of integration wishes ondifferent platforms. A “TortoiseMonotone” project has already been kicked off at the last summit – currently residing on the net.venge.monotone.tortoise branch – and this project is still looking for help from people which are fluent in Python and / or the Windows API
  • numerous improvement in workspace handling (faster, prettier, more configurable, yatta, yatta…)
  • for a full list of changes check the NEWS file

You can download guitone at the usual location, a win32 installer (yes, we’ll have one!) should follow shortly.

Hide Qt GUI applications from the Mac OS X dock and menu

Starting with Qt 4.4 which was released a few days ago Qt now honors the


setting in the Info.plist file of the application bundle. This is particularily useful to create bundled application which should not pop up in the global dock or menu, f.e. daemons which run in the background or applications like Quicksilver which are only accessible via a global key stroke or an icon in systray area of the menu bar.

Now, with guitone I recently had the problem that I wanted exactly this mode under OSX in its new “driver” mode, which lets you automate / script the access to internal dialogs (check the branch for more information), but it should not interfere with the “standalone” mode, i.e. the dock icon and menu bar should be of course shown there.

One way of accomplishing that would have been to create a separate binary just for this usage and only set the setting in this property list. However, even without knowing much of OSX’ Carbon API, I came up with a better solution, inspired by what Qt does itself deep inside qapplication_mac.cpp if it stumbles upon the LSUIElement entry:

GuitoneStandalone::GuitoneStandalone(int & argc, char** argv)
: GuitoneCore(argc, argv),
#ifdef Q_WS_MACX
ProcessSerialNumber psn;
if (GetCurrentProcess(&psn) == noErr)


This unconditionally transforms such a background application to a foreground application with a dock icon and menu bar. So all I had to do was to check my calling arguments if the driver interface should be used and if not, create the correct QApplication instance which brings the application to the foreground. Nice!

Now I only have to fix this one, very weird behaviour of QMetaMethod::invokeMethod which does not accept my argument list… *grumbles*