Present Perfect


Picture Gallery
Present Perfect

git workflow question

Filed under: GStreamer,Hacking,Python,Twisted — Thomas @ 10:34 pm

10:34 pm

I’m trying to integrate git into my workflow. I’ve been reading documentation and tutorials (there sure are a lot), but I’m not sure they cover the use case I want to try and implement. So I’m explaining it here in the hopes that some experienced gits will be able to show me the way.

The basic use case is simple: I want to hack on GStreamer, which uses git, from various computers (laptop, work machine, home machine), and have my private and/or public hacking in sync between those three machines.

Basically, when I create a branch on my laptop, hack in it, commit stuff, and push it out to my private or public repo, I then want to pull all those changes on my home desktop and continue hacking.

It looks like I should be able to do it with a magic combination of a bare repository on some server, and the right incantation of git remote add lines on all of my machines. But so far, my experiments have only led me to some abomination of a bare repository where my home machine sees a branch created on my laptop with the name ‘thomas’ as a branch named ‘private/thomas’. In other words, the names don’t match up. And for now it looks like the content doesn’t match up either; I somehow merged the thomas branch into my master on my home desktop. Also, it looks like pulls from that private bare repo end up as an actual commit, which seems a bit messy.

I’ll retry my experiment to see if I might have screwed something up, but in the meantime, if you recognize the use case I’m going for and know how to implement it, feel free to throw me a bone.

Moules Frites

Filed under: Conference,Fluendo,Flumotion,Python,Twisted,Work — Thomas @ 5:49 pm

5:49 pm

It went a little something like this.

I wrote a mail to our internal mailing list saying ‘if anyone’s coming to FOSDEM, I invite you to my place and I’ll make moules frites for you.’

I was expecting, oh, I don’t know, maybe four or five people.

After that, Pierre, our development manager started negotiating with our CEO to invite all the developers to FOSDEM. And he succeeded. And then the support team wanted to come too.

The result is now there are 14 people coming over for mussels and fries tonight.

This is what 14 kilos of mussels and 7.5 kilos of potatoes look like before preparing.

By the way, if you like mussels, you like programming (especially Python), and you like Barcelona, we are hiring again. (Actually, we also hire people that don’t like mussels). You can also come talk to anyone on our team if you happen to be at FOSDEM so you don’t have to take my word for how awesome working at Flumotion is. You should be able to recognize them by their shirts.

ways in which git makes the opposite of sense to me

Filed under: Hacking,Python,Twisted — Thomas @ 2:05 pm

2:05 pm

DISCLAIMER: I originally wrote this post 18 months ago but never posted it because it was unusually negative.

Recently, with GStreamer switching to git, and GNOME thinking of moving to it as well, I thought I’d pick the post back up and see if git had improved since writing it. For me, the most frustrating things about git are:

  • the user interface experience is the absolute worst of all of them since tla was around
  • there is no obvious way to do it – clearly shown by the 50 different git tutorials, and the myriads of git commands that are very similar-sounding and have strange descriptions that to the layman sound like they would do the same thing

Personally, I remain convinced that it would be easy to start a git hater’s blog (much like the linux hater’s one) and fill it with content, though I doubt that will stop me from using it in practice.

Feel free to rush to the defense of git, insult me, call me stupid, whatever you want! I just thought it’d be an interesting exercise to see if my frustrated vitriol from last time still held up.

I’ll annotate each part with today’s experience in italics, and finish off with a final git score.

Exhibit A:

[thomas@ana git]$ git init
Initialized empty Git repository in .git/
[thomas@ana git]$ mkdir t
[thomas@ana git]$ git add t
The following paths are ignored by one of your .gitignore files:
t (directory)
Use -f if you really want to add them.
[thomas@ana git]$ find . -name ".gitignore"

There is no .gitignore file, so what are you talking about ?

2009: this now actually works without problems. Score one for git! 1 out of 1 for git usability improvements.

Exhibit B:

[thomas@ana tmp]$ git clone gt clone
Initialized empty Git repository in /home/thomas/tmp/clone/.git/
fatal: 'gt': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly
fetch-pack from 'gt' failed.

Ok, so I have a typo. But this is how you choose to let me know ?
“unable to chdir” OR “not a git archive”. Hey, YOU’re the computer. And git, you’re the program tracking these things, you can’t tell the difference between a git archive and something that is not ? Why don’t YOU tell me which of the two it is instead of failing to handle errors in a logical way.

Also, I have no idea how it knew that I was on the phone with my mom and my mom got angry at something I said and ended the conversation. Oh ,wait, that wasn’t what you were referring to when talking about unexpected hangups ?

And I thought fatal meant fatal. Apparently the first fatal was not fatal enough to already stop, you prefer confusing me with another fatal. Which one of the two should I be fixing ?

Kudos though for cleaning up the failed creation of the clone repository.

Please, when I make this simple mistake, tell me only: “The repository ‘gt’ does not exist.”

2009: behaviour exactly the same. 1 out of 2 for git usability improvements.

Exhibit C:

[thomas@ana clone]$ ls /usr/bin/git-* | wc
139     139    3158

Compared with

[thomas@ana clone]$ ls /usr/bin/e* | wc
69      69    1244

I would say that the Lobby For Commands In /usr/bin Starting With G has gone a little overboard here.

2009: only 131 commands left for git. In the interest of preserving my sanity I’m not even going to try figure out which ones got removed or replaced or folded. 1 out of 3 for git usability improvements.

Exhibit D

Maybe that last one was an unfair stab ? Maybe 139 binaries come for free anyway so I should not complain ? I wasn’t sure either first. Until I took two random entries from there and ran:

[thomas@ana clone]$ git whatchanged -h
fatal: unrecognized argument: -h
[thomas@ana clone]$ git citool -h
usage: /usr/bin/git-citool
[thomas@ana clone]$

Care to guess how many of these binaries have no useful -h output ? I sure don’t want to find out, there’s 139 binaries to check. 130 of them have manpages though – I guess that could be one reason why git implements “git command” by having a binary “git-command” – how else are you going to document this monster ?

What I *really* wanted to do when finding this out is to find a command that would show me which files are not under version control and give that to me in the most easy to parse way. git status is something, but maybe one of those 138 other commands gives me something better ?

(answer after some random command ‘bisecting’: git ls-files –others)

2009: behaviour has changed, but is still unhelpful

[thomas@ana git]$ git whatchanged -h
fatal: bad default revision 'HEAD'
[thomas@ana git]$ git citool -h

The last one now pops up a TK dialog box that says “couldn’t open /usr/share/git-gui/lib/tclIndex”: no such file or directory. 1 out of 4 for git usability improvements.

Exhibit E:

In my quest to figure out what some git commands do without wading through the man pages, I’ve resigned myself to the black box approach.

[thomas@ana clone]$ git describe
fatal: cannot describe '02d3a05f1e9710f9a6683ed8a62c9bd2ff3680a8'

For once I must side with git on this one. I have no way to describe that hex string either.

2009: output changed, but equally unhelpful:

fatal: Not a valid object name HEAD

Still inclined to side with git, I don’t name my objects HEAD either. 1 out of 5 for git usability improvements.

Exhibit F:
I’m following this simple tutorial and it suggests that git has a slightly different model for committing. Most VCS systems have you “add” paths to tell the VCS you want to track them. Git seems to have something in addition – it has “files that it tracks”, “files that it tracks and is going to commit in the next changeset”, and “files that it doesn’t track”. git add then seems to be used to add to “the next changeset”, and as a result also add it to “files that it tracks”. A little confusing, but OK. So basically, to do a commit, you must add files to the commit.

The tutorial explains that you can do both at once by using git commit -a. Obviously the two step process of committing was so unintuitive that they made an option do to both, and the tutorial thinks this shortcut is important enough to mention.

Except that this happens:

[thomas@ana git]$ touch 1
[thomas@ana git]$ git commit 1
error: pathspec '1' did not match any file(s) known to git.
Did you forget to 'git add'?
[thomas@ana git]$ git add 1
[thomas@ana git]$ git commit 1
Created commit 79e67c26b27c80f7f0ddc37293cbc022f932c968
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1
[thomas@ana git]$ touch 2
[thomas@ana git]$ git commit -a 2
Paths with -a does not make sense.
[thomas@ana git]$

I guess I should be lucky it didn’t call me stupid outright. It may not make sense to you, git, but I guess this is how my intuition works when I read your tutorial and you’ve already made it clear to me that you’re not planning to have your help or usage output to be helpful or useful or for that matter even be period.

As a hint, here’s what I expect to happen when I run git commit -a 2:

  1. git adds the file 2 to the next commit
  2. git commits the change to file 2

That wasn’t so hard to make sense of now, was it ?

2009: slightly different behaviour. First off, the actually helpful suggestion from before (did you forget to add 1) is now gone. Why ? The second part is still the same, exactly as is. 1 out of 6 for git usability improvements (and actually a step back).

Exhibit G:

[thomas@otto git]$ ls /home/thomas/tmp/git/repo/.git/
branches/    description  hooks/       objects/
config       HEAD         info/        refs/
[thomas@otto git]$ git checkout /home/thomas/tmp/git/repo
fatal: Not a git repository

What do you mean, not a git repository ? I gave you one argument that clearly is a repository. Could you try and tell me what is wrong in a way that us humans can read ?

2009: different error:

[thomas@ana git]$ git checkout /home/thomas/tmp/git
error: pathspec '' did not match any file(s) known to git.

I’m guessing I should be giving it an additional argument. Hey, wouldn’t that be a nice understandable error message instead ? 1 out of 7 for git usability improvements.

Exhibit H:

gitk is in Tk. Tk !!! 1991 called and they … Oh never mind, not even going there. No, really. Start it up and click on ‘File’. Then move the mouse pointer to ‘Edit’. Is it just me, expecting the logical thing to happen, while nothing happens at all ? At a guess, this behaviour was probably for those people who were logging in to a remote X server over a 300 baud modem.

2009: still the same. To be fair, the application is actually pretty useful, you’d almost forgive it being written in tk. Still, 1 out of 8 for git usability improvements.

If you’re still here, feel free to point out where git’s behaviour really was my fault. I’m all for learning more about why things are the way they are. I’m just not convinced at all yet that git has made huge inroads on the usability level as its defenders often claim when discussing git vs. bzr.

Scrolling LED Marquee part two

Filed under: Hacking,Python,Twisted — Thomas @ 10:39 am

10:39 am

Following up on a previous post, I’ve been writing some code to do useful things with my scrolling LED marquee.

It gave me a chance to try my hand at implementing another protocol in Twisted, and it was a pleasurable experience. I still firmly believe that Twisted’s code and design combines so much knowledge about these things that I will now never have to have in my life because I can rely on it being designed properly for the task.

I got it working quite quickly, reusing some activatestate code for a feedparser, and now I have my marquee following a bunch of feeds like StackOverflow‘s python tags, SlashDot and VRT news.

Here is a link to the video of the marquee showing (old) news from slashdot (using Cortado to watch it), or a link to a playlist to open in a player, or a link to the Ogg file directly.

I had the original version working over the serial port, but these days a serial port is a hassle. The marquee also included a USB plug which has a built-in serial port, and it didn’t work out of the box with that. After some fiddling I realized that for some reason, over USB the replies of the device (which sends ‘ACK’ to acknowledge) come in separate packets (sometimes two, sometimes three, one per letter). It was simple to fix in the protocol implementation, and that’s where Twisted’s levels of abstraction really shine – a simple fix in one location at exactly the right logical level.

Last night I added a quick and dirty hack to have it also display what song Elisa is playing. I should start worrying about managing the marquee’s different pages now so that it can easily mix different information sources.

Oh yeah, the code. Not sure you’d find anything interesting there if you don’t actually have a scrolling marquee, but here it is. If you have a similar device, I’d be happy to help you out get this set up and add support for it.

And if any Twisted people want to comment and help me improve my probably poorly implemented protocol, comments appreciated!

Scrolling LED Marquee part one

Filed under: Belgium,Hacking,Twisted — Thomas @ 2:16 pm

2:16 pm

When we moved into the new apartment, one of the things I definitely wanted to maintain the nerd quotient in the place was a scrolling LED marquee in the kitchen pointing to the living room:


I got the idea when we bought a marquee such as this one as the perfect gift for Peter’s 30th birthday some time ago. I remember racking my brain trying to come up with a good gift for us to give him, and at some point it hit me that one of these things would be awesome for him.

We didn’t just give it to him either – he had a birthday party at the Charlatan, a bar in Gent, and we installed the marquee there as part of the DJ booth, putting up increasingly weird messages until he finally realized that it was a present for him. Good times!

Anyway, having that thing at home for a few days and playing with it convinced me I should get one for myself for the new apartment and use it for news updates. We installed the thing in the ceiling spanner and, apart from some tedious remote control entering of texts for some occasions, I haven’t used it much since. I tried once in a while to control it from the computer but I never really got it to work.

Until last week I had some spare time and decided to figure out what the problem is with the computer control. After a lot of twiddling, I realized that the serial-to-jack cable had a 6P6C jack, instead of the usual 6P4C for RJ-11 use. I hadn’t actually ever seen a cable like that, someone suggested it might have been used for ISDN connections, but I have no idea. Hooking it up directly to a computer made the software work under VMWare and Wine to control the device. After that, controlling it directly from Linux was easy.

Of course, I want to use the marquee in its place in the kitchen, not by my computer. After all, that’s why I invested in the Abitana network I installed. I went to my favourite electronics store in Barcelona, where they had to custom-make the cable because apparently it’s hard to get stock cable like this.

Took it back home, tried it, still didn’t work. After inspecting the cable more closely it seems the guy had put one end on the wrong way. Luckily, one end is supposed to go in the 8P8C RJ-45 wall socket, so I crimped a standard connector on that end, and bingo! Finally have the LED marquee in place and controlled from Linux from my computer!

Next step, to write some Twisted-using software to implement the protocol, and write some code to get RSS feeds and display some news! I considered using LCDProc (which I’ve used on my Dave/Dina box), but it looks like that’s mostly geared towards small LCD displays with multiple lines and characters, and some control buttons.

I need to figure out how I am going to prioritize incoming information (RSS feeds, buildbot status, nagios alerts, incoming mail, …) and create a message queue out of those spread across the 26 pages the marquee offers. If you know any software doing this sort of thing, feel free to comment!

« Previous Page