This is a continuation from
before.
Before I go plunging into writing code for a generic
vcs-pkg implementation, I wanted to take a close look
at my current, working, non-generic implementation: making sure
that the generic implementation can support at least this one
concrete work-flow will keep me grounded.
One of the features of my home grown porcelain for building
package has been that I use a fixed layout for all the packages I
maintain. There is a top level directory for all working trees.
Each package gets a sub-directory under this working area. And in
each package sub-directory, are the upstream versions, the checked
out VCS working directory, and anything else package related. With
this layout, knowing the package name is enough to locate the
working directory. This enable me to, for example, hack away at a
package in Emacs, and when done, go to any open terminal window,
and say stage_release kernel-package or
tag_releases ucf without needing to know what the
current directory is (usually, the packages working directory is
several levels deep
/usr/local/git/debian/make-dfsg/make-dfsg-3.91, for
instance.
However, this is less palatable for a generic tool imposing a
directory structure layout is pretty heavy. And I guess I can
always create a function called cdwd, or something, to
take away the tedium of typing out long cd
commands.
Anyway, looking at my code, there is the information that the
scripts seem to need in order to do their work.
rpm based sources, look for the
spec filedebian/rulesspec or
debian/rules in the current directory, and parse
either the spec file or
debian/changelog.tla tree-rootbzr infogit rev-parse --show cduphg rootdebian directory, and
changelog and rules files existspec file or
debian/rules in the base directory
spec or changelog files.pristine-tar is in use, given two trees
(branches, commits. etc), namely:
tar archive.dpkg-buildpackage imposes this too).pristine-tar or have the upstream
tar archive in the parent directory of the working
directorygitpkg has a different
concept: it works purely on the git objects, you feed it upto three
tree objects, the first being the tree with sources to build, and
the second and third trees being looked at only if the upstream tar
archive can not be located, and passes the trees to pristine tar to
re-construct the upstram tar. The package name and version are
constructed after
the source-tar archive is extracted to the staging area. I like the
minimality of this.
This is continued
here.
Update: It turns out that the original PSB code is still on the moblin site - I just failed to notice that there's two pages of git repositories. I fail. Last update is from March 2008, though.
I have been involved in vcs-pkg.org since around
the time it started, a couple of years ago. The discussion has been
interesting, and I learned a lot about the benefits and
disadvantages of serializing patches (and collecting integration
deltas in the feature branches and the specific ordering of
the feature branches) and maintaining integration branches (where
the integration deltas are collected purely in the integration
branch, but might tend to get lost in the history, and a fresh
integration branch having to re-invent the integration deltas
afresh).
However, one of the things we have been lax about is getting
down to brass tacks and getting around to being able to create
generic packaging tools (though for the folks on the serializing
patches side of the debate we have the excellent quilt
and the topgit packages).
I have recently mostly automated my git based work-flow, and
have built fancy porcelain around my git repository setup. During
IRC discussion, the gitpkg script came up. This seems
almost usable, apart from not having any built-in
pristine-tar support, and also not supporting
git submodules, which make is less useful an
alternative than my current porcelain.
But it seems to me that we are pretty close to being able to
create a distribution, layout, and patch handler agnostic script
that builds distribution packages directly from version control, as
long as we take care not to bind people into distributions or tool
specific straitjackets. To these ends, I wanted to see what are the
tasks that we want a package building script to perform. Here is
what I came up with.
dpkg-buildpackage or
rpm. There are a number of already mature mechanisms
to take a source directory and upstream tar archive and produce
packages from that point, and the wheel need not be
re-invented.
So the hardest part of the task is to present, in the staging
area, for further processing, a directory tree of the source
package, ready for the distribution specific build commands. This
part of the solution is likely to be VCS specific.
This post is getting long, so I ll defer presenting my evolving
implementation of a generic vcs-pkg tool,
git flavour, to the next blog post.
This is continued
here.
mypkg.candidate = max(mypkg.versions). And you can now pass file descriptors to functions previously only working with file() objects.
But we re not done yet. The complete API change is pending, renaming everything to PEP-8 compliant names and deprecating the old ones, which will be removed at a later time (after the release of Squeeze). The module apt.debfile is not affected by this change, because it already used the correct names. But for Python 3, we will not keep backward compatibility, in order to make coding easier and to make it clear that applications should be ported to the new API.
And if you want to get your feature into python-apt now is your time. If you want something merged, provide the code, the documentation (with example) and a list of use cases; and report a wishlist bug in the Debian BTS.
And if you want to write a tutorial about python-apt, write it in reStructuredText and I will add it to the documentation. The documentation is currently basically an API reference and there could be much more text.
Python-apt 0.7.90 is currently uploading. The whole development will result in python-apt 0.8.
Posted in Debian 
I've started to develop awesome more than 18 months ago, and somehow I feel it's time to stop a bit and think where we come from and where we are going to.
The motivation
I never though I'd be written a window manager one day. That seems kinda stupid when you see how many window manager there's around.
As many people, I've tested and have been using tons of window manager: Window Maker, Fluxbox, etc.
In August 2007, I was using fvwm since 2004 and was quite happy with it. I used the famous fvwm-crystalhttp://www.fvwm-crystal... as a configuration starter and then rewrote lots of stuff. Digging into fvwm configuration files was boring, and since I'm lazy, I never really configured it to fit entirely my needs.
The thing is that, in July 2007, my workstation died. I bought a new one based on the amd64 architecture. Too bad, with this new box, fvwm decided that it will not longer runs and was segfaulting almost every time I logged in.
I was really upset. Another failure in the window manager world. So I decided to get the yearly ride of testing many window managers. I went on the no more developed stuff like the *boxes, ion3, etc but well, I did not like them, there were not powerful enough, too bugged or upstream was insane.
Then I found xmonad. The Haskell configuration file format made my cry. I did not want to learn Haskell, it seemed too obfuscated to me. At that time it was even not packaged for Debian, so I gave up. But I found dwm in the meantime, and I loved it. It was simple, and the source code was almost understandable and easy to hack.
I subscribed to the dwm mailing-list, in order to participate to its development, etc But I got really disappointed. No patch were welcome and the development seemed to be almost finish in this sight. People patches were lying around, but no one really care. Each user was managing its own set of patches.
That's not what I learnt and what I love in free software. So, as many users, I began to maintain my patches in my corner. But I began to have more ideas
The jdwm
I just added a 'j' in front of dwm and started to hack it days and nights to add many feature I missed, like multi-head, etc On 5th September 2007, I created a git repository to host my code.
That's gonna be awesome.
Five days later, on 10th September, I finally found a name for my new pet: awesome, borrowed from Barney Stinson who heavily uses and abuses this word.
The 1.x branch
The first releases until December were noted 1.x. It was just a better dwm with a simple flat configuration file..
The configuration file used libconfig, but it was a very poor choice. And I was not able to put in into Debian because of name clash.
The 2.x branch
The 2.x branch came in January 2008 with a brand new configuration file format based on libconfuse, which was a bit more powerful. Many concepts and features that have been added in this branch are still used in the current 3.x branch.
At this time, between December 2007 and April 2008, the community was growing smoothly.
But as I said, awesome 2 was based on a flat configuration file. That raised a problem very soon: users expectation were growing and the development team (me and a couple of regular contributors) was unable to cope with them.
One of the event that started to change my mind was the support for titlebars.
When I've added titlebar support, it was minimal. It was on top of a window, with the window title. Dot. Then I've started to add a lot of options, like the application icon drawing, the position (left, right, bottom) etc.
And then users started to ask for more, like: "add titlebar on windows only when the window is floating".
That's ok, but that's complicated: that's again another option to do some stuff conditionally. And then, why don't add titlebar on windows when <insert random events here>?
The 3.x branch
Why
At that time, around April 2008, I'd totally stopped development. I was trying to find a solution which was simple and powerful. But after 2 weeks of thinking, I was not able to find anything else than: use a real language for configuration.
So, I've started prototyping awesome 3 using Lua. The choice was not obvious, and despite the problem Lua might suffer, it's one of the easiest language to integrate into an existing application. There's still a video of a first version here.
But, let's go a little back: in January 2008, Arnaud Fontaine contacted me because he was interested to use awesome as one of its school project. He decided to port awesome from Xlib to XCB, a modern asynchronous X library.
His work took some time, but in May 2008, Arnaud did finished to port git master version of awesome to use XCB.
Consequently, I decided to start a new major branch, using XCB instead of Xlib (no change for users in this regard) and Lua instead of our previous flat configuration file format.
Development
It took me a while to get from here to there, but in September 2008, it was ready. We had a simple Lua API, and the XCB port was working perfectly.
It took us some time to release and have something totally working, because we had to work on XCB and contribute back to the project. It was really not ready to use by an application, but we did great work in this area and it's now really fine.
We're still here
Releases continue to happens, 3.1 around December 2008, and 3.2 around March 2009. 3.3 should be here in June.
One of the drawback we had, is that we moved many stuff from C to Lua. Why? Because writing things in Lua is quicker and easier to maintain than C, and makes thing more configurable for the user.
For example, the layout algorithm used to organize window were written in C until 3.2 came out. At that time, users had no choice than using a set of predefined layout to organize their windows.
Starting with 3.2, if they have minimal knowledge about geometry, they can start writing a layout function organising windows on the screen.
But this kind of API changes was a bit rough for users, since they had to port some part of their configuration file to the new API.
The thing is that the project was still a teenager at that time, not really knowing were it will go. But I'm happy to announce that API breakage are more and more rare (so far only one minor between 3.2 and 3.3), and anyway always for the Good.
But I admit that it built a bad reputation around awesome 3.x during its first month of existence.
Future direction
I am currently working on 3.3 development. We have still many things to do. Time passing, we get more idea, and more users. And more users bring more ideas.
We also have many more contributors, and some guys are even taking maintainer-ship of some code area.
Conclusion
My post title is "Taking the other direction" because I feel this way.
I've got that feeling that some approaches in projects like GNOME are sometimes bad. Please don't misread me, I know we are not playing in the same yard.
When adding a key shortcut for starting an application makes you dig into gconf, I wonder how this is a win for the user.
Well, it's probably a win for the end-user, but I surely am not one of them. And I don't intend to target them with my software, anyway.
And now, when I hear things like GNOME 3.0 and the "desktop shell" approach, that makes me smile.
Guys, it was time, but have luck. What I see from here, is that any desktop control interface is wrong somehow, and that there's no approach that can fulfill all users wishes.
I think that we, the awesome development team (no pun intended) took the direction of building a frame-work window manager rather than a solution written in marble.
We (partially) solved the issue of UI ergonomic by not writing one and allowing the user to write his own. I don't say that's easy to do for most of users, but it's doable.
And I think it's worth it: I use window managers since I use Linux, around 1998. If something like awesome came 5 years ago, I'd be using it so far, because you can write Fluxbox or WindowMaker using awesome in a hundred of Lua code. And you can write your own version of it. And it starts in less than 3 seconds, supporting almost all standard desktop specification (ICCCM, EWMH, XDG, system tray, message notification, D-Bus, etc), whereas many of the window mangers do not.
You can even write and play space invaders.
Finally, I'm happy about the the road we took so far, and hope we will continue into that direction. The rants I read about our project are not that big, compared to the kudos we received.
I've started to develop awesome more than 18 months ago, and somehow I feel it's time to stop a bit and think where we come from and where we are going to.
The motivation
I never though I'd be written a window manager one day. That seems kinda stupid when you see how many window manager there's around.
As many people, I've tested and have been using tons of window manager: Window Maker, Fluxbox, etc.
In August 2007, I was using fvwm since 2004 and was quite happy with it. I used the famous fvwm crystal as a configuration starter and then rewrote lots of stuff. Digging into fvwm configuration files was boring, and since I'm lazy, I never really configured it to fit entirely my needs.
The thing is that, in July 2007, my workstation died. I bought a new one based on the amd64 architecture. Too bad, with this new box, fvwm decided that it will not longer runs and was segfaulting almost every time I logged in.
I was really upset. Another failure in the window manager world. So I decided to get the yearly ride of testing many window managers. I went on the no more developed stuff like the *boxes, ion3, etc but well, I did not like them, there were not powerful enough, too bugged or upstream was insane.
Then I found xmonad. The Haskell configuration file format made my cry. I did not want to learn Haskell, it seemed too obfuscated to me. At that time it was even not packaged for Debian, so I gave up. But I found dwm in the meantime, and I loved it. It was simple, and the source code was almost understandable and easy to hack.
I subscribed to the dwm mailing-list, in order to participate to its development, etc But I got really disappointed. No patch were welcome and the development seemed to be almost finish in this sight. People patches were lying around, but no one really care. Each user was managing its own set of patches.
That's not what I learnt and what I love in free software. So, as many users, I began to maintain my patches in my corner. But I began to have more ideas
The jdwm
I just added a 'j' in front of dwm and started to hack it days and nights to add many feature I missed, like multi-head, etc On 5th September 2007, I created a git repository to host my code.
That's gonna be awesome.
Five days later, on 10th September, I finally found a name for my new pet: awesome, borrowed from Barney Stinson who heavily uses and abuses this word.
The 1.x branch
The first releases until December were noted 1.x. It was just a better dwm with a simple flat configuration file..
The configuration file used libconfig, but it was a very poor choice. And I was not able to put in into Debian because of name clash.
The 2.x branch
The 2.x branch came in January 2008 with a brand new configuration file format based on libconfuse, which was a bit more powerful. Many concepts and features that have been added in this branch are still used in the current 3.x branch.
At this time, between December 2007 and April 2008, the community was growing smoothly.
But as I said, awesome 2 was based on a flat configuration file. That raised a problem very soon: users expectation were growing and the development team (me and a couple of regular contributors) was unable to cope with them.
One of the event that started to change my mind was the support for titlebars.
When I've added titlebar support, it was minimal. It was on top of a window, with the window title. Dot. Then I've started to add a lot of options, like the application icon drawing, the position (left, right, bottom) etc.
And then users started to ask for more, like: "add titlebar on windows only when the window is floating".
That's ok, but that's complicated: that's again another option to do some stuff conditionally. And then, why don't add titlebar on windows when <insert random events here>?
The 3.x branch
Why
At that time, around April 2008, I'd totally stopped development. I was trying to find a solution which was simple and powerful. But after 2 weeks of thinking, I was not able to find anything else than: use a real language for configuration.
So, I've started prototyping awesome 3 using Lua. The choice was not obvious, and despite the problem Lua might suffer, it's one of the easiest language to integrate into an existing application. There's still a video of a first version here.
But, let's go a little back: in January 2008, Arnaud Fontaine contacted me because he was interested to use awesome as one of its school project. He decided to port awesome from Xlib to XCB, a modern asynchronous X library.
His work took some time, but in May 2008, Arnaud did finished to port git master version of awesome to use XCB.
Consequently, I decided to start a new major branch, using XCB instead of Xlib (no change for users in this regard) and Lua instead of our previous flat configuration file format.
Development
It took me a while to get from here to there, but in September 2008, it was ready. We had a simple Lua API, and the XCB port was working perfectly.
It took us some time to release and have something totally working, because we had to work on XCB and contribute back to the project. It was really not ready to use by an application, but we did great work in this area and it's now really fine.
We're still here
Releases continue to happens, 3.1 around December 2008, and 3.2 around March 2009. 3.3 should be here in June.
One of the drawback we had, is that we moved many stuff from C to Lua. Why? Because writing things in Lua is quicker and easier to maintain than C, and makes thing more configurable for the user.
For example, the layout algorithm used to organize window were written in C until 3.2 came out. At that time, users had no choice than using a set of predefined layout to organize their windows.
Starting with 3.2, if they have minimal knowledge about geometry, they can start writing a layout function organising windows on the screen.
But this kind of API changes was a bit rough for users, since they had to port some part of their configuration file to the new API.
The thing is that the project was still a teenager at that time, not really knowing were it will go. But I'm happy to announce that API breakage are more and more rare (so far only one minor between 3.2 and 3.3), and anyway always for the Good.
But I admit that it built a bad reputation around awesome 3.x during its first month of existence.
Future direction
I am currently working on 3.3 development. We have still many things to do. Time passing, we get more idea, and more users. And more users bring more ideas.
We also have many more contributors, and some guys are even taking maintainer-ship of some code area.
Conclusion
My post title is "Taking the other direction" because I feel this way.
I've got that feeling that some approaches in projects like GNOME are sometimes bad. Please don't misread me, I know we are not playing in the same yard.
When adding a key shortcut for starting an application makes you dig into gconf, I wonder how this is a win for the user.
Well, it's probably a win for the end-user, but I surely am not one of them. And I don't intend to target them with my software, anyway.
And now, when I hear things like GNOME 3.0 and the "desktop shell" approach, that makes me smile.
Guys, it was time, but have luck. What I see from here, is that any desktop control interface is wrong somehow, and that there's no approach that can fulfill all users wishes.
I think that we, the awesome development team (no pun intended) took the direction of building a frame-work window manager rather than a solution written in marble.
We (partially) solved the issue of UI ergonomic by not writing one and allowing the user to write his own. I don't say that's easy to do for most of users, but it's doable.
And I think it's worth it: I use window managers since I use Linux, around 1998. If something like awesome came 5 years ago, I'd be using it so far, because you can write Fluxbox or WindowMaker using awesome in a hundred of Lua code. And you can write your own version of it. And it starts in less than 3 seconds, supporting almost all standard desktop specification (ICCCM, EWMH, XDG, system tray, message notification, D-Bus, etc), whereas many of the window mangers do not.
You can even write and play space invaders.
Finally, I'm happy about the the road we took so far, and hope we will continue into that direction. The rants I read about our project are not that big, compared to the kudos we received.
django-dumpslow is a reusable Django application that logs requests that take a long time to execute and provides an tool to summarise the resulting data.
Modelled on mysqldumpslow, django-dumpslow is intended as a tool to determine which parts of a project might benefit most from optimisation and to provide valuable empirical data.
The tool groups requests that are similar by exploiting Django's ability to reverse URLs - requests that use the same view are not counted distinctly. Views can then be grouped by the total accumulated time spent by that view or simply by their raw frequency in the logs.
An example output is:
$ ./manage.py dumpslow View Accumulated time ============================================================= example.views.slow 92.88 /unknown (unreversible url) 16.84If the log entries contain timestamps then django-dumpslow can optionally limit queries by a user-defined interval. This can be useful for generating regular reports of slow pages, perhaps by regularly emailing the "top 10 worst pages" to a development mailing list. Source, tarballs, etc. Patches welcome.
Myon recently posted a nice statistic about popular single
letter package name prefixes. Just out of curiosity I started
wondering about popular single letter package name suffixes:
On a machine with Debian oldstable, stable, testing, unstable and
experimental in its sources.list, I ran the following command:
$ apt-cache search -n . \
awk ' print $1 ' \
sed -e 's/.$//' \
sort \
uniq -c \
sort -n
And to my surprise there is a non-obvious winner:
$ apt-cache search -n '^gp.$' gpa - GNU Privacy Assistant gpc - The GNU Pascal compiler gpe - The G Palmtop Environment (GPE) metapackage gpm - General Purpose Mouse interface gpp - a general-purpose preprocessor with customizable syntax gpr - GUI for lpr: print files and configure printer-specific options gps - Graphical Process Statistics using GTK+ gpt - G-Portugol is a portuguese structured programming language gpw - Trigraph Password GeneratorBut since I searched through the binary packages many other hits are more obvious, like the seven packages hbf-cns40-1 to hbf-cns40-7:
[...]
4 ar
4 aspell-f
4 automake1.
4 cpp-4.
4 e
4 g++-4.
4 gappletviewer-4.
4 gcc-4.
4 gcj-4.
4 gcompris-sound-e
4 gfortran-4.
4 gij-4.
4 go
4 gobjc-4.
4 gobjc++-4.
4 h
4 iceweasel-l10n-e
4 iceweasel-l10n-k
4 kde-i18n-f
4 kde-i18n-h
4 kde-l10n-e
4 kde-l10n-s
4 kile-i18n-e
4 koffice-i18n-e
4 koffice-i18n-s
4 koffice-l10n-e
4 koffice-l10n-f
4 libqbanking
4 myspell-f
4 myspell-h
4 openoffice.org-help-e
4 openoffice.org-l10n-b
4 openoffice.org-l10n-h
4 openoffice.org-l10n-k
4 sd
4 tcl8.
4 tk8.
5 aspell-e
5 aspell-h
5 iceweasel-l10n-s
5 kde-i18n-b
5 kde-i18n-e
5 kde-i18n-t
5 kde-l10n-k
5 openoffice.org-l10n-e
5 openoffice.org-l10n-t
5 pa
5 tc
6 gc
6 kde-i18n-s
6 libdb4.
6 m
6 openoffice.org-l10n-n
6 openoffice.org-l10n-s
6 s
7 hbf-cns40-
9 gp
But there are also some other interesting observations to make:
~/.xmonad/xmonad.hs. That file is a
full fledged Haskell program, which gets compiled to obtain your
own xmonad executable which you run as your own window manager.
/usr/bin/xmonad is the executable you initially run,
but is just a wrapper around the compilation + run mechanism
import XMonad
import XMonad.Config.Gnome
main = xmonad $ gnomeConfig
modMask = mod4Mask
\o/.
killall metacity ; xmonad
& . For the next session runs you will have to remember
the running xmonad in your Gnome session, as usual.mod-p will get you a
gnome-run dialog box, and appropriate padding for the (upper!)
Gnome panel.
The only glitch is that you will get 9 desktops which can
clutter your workspace switched. My solution is to have the appler
show workspaces on 2 rows but beware of bug 524065,
which is really annoying.
xcompmgr -c &. No wonder that it is way faster
than compositing manager support in metacity.
import XMonad
import XMonad.Config.Gnome
myManageHook = composeAll [
(className =? "Pidgin" <&&> title =? "Buddy List") --> doFloat
, (className =? "Gnome-panel" <&&> title =? "Run Application") --> doFloat
-- , (className =? "XEyes") --> doShift "7"
]
main = xmonad $ gnomeConfig
modMask = mod4Mask
, manageHook = myManageHook <+> manageHook gnomeConfig
xprop egrep "CLASS NAME".
Note that you don't need to care about panel placement because
it is already taken care of by the default gnome config. Still
beware of not using myManageHook as your only management
hook, you should update the default one using the
<+> monad as I did above.
xmonad rant
So, what's wrong with xmonad + Gnome in Debian? Well, the fact
that it will take about 200 Mb of disk space on amd64 by default.
o_O
Why so? Because xmonad is affected by the static linking
hell which seems to be shared by modern statically typed
functional languages, including in the category both Haskell and my
beloved OCaml. In short, applications written for those language
link statically code written in the implementation language in most
cases; they rely on legacy shared libraries only for bindings to C
libraries.
For xmonad that means that if you are fine with the default
configuration you will get a cheap 2 Mb binary package. If you are
not, you will need to write your conffile ... which is a Haskell
program ... using several contrib libraries ... and needing ghc6 to
be compiled and run as your own window manager executable.
This is plainly dumb and induces all the usual problems of
static linking, like disk consumption due to non-shared (Haskell)
code, and worries about staying up to date with the latest library
release in case of fixes (including security fixes) need
to be propagated to user executables.
Truth to be said, /usr/bin/xmonad does a wonderful
job in hiding all this to the final user, but still the design
choice is an unpleasant one.
This is a short summary of how I'm currently experimenting with dpkg to generate, check and install TDebs in a pbuilder chroot. Do NOT use my modified version of dpkg outside a chroot!. Also, I don't expect any of this to be useful or usable by anyone not running Debian sid. If you're reading this via an aggregator other than planet.debian.org, please don't try this on your own systems. (Comments complaining that it breaks Ubuntu will be deleted - I'll have good fun laughing at you but the comments will still be deleted.)sudo make installto copy the executables into the right places in the chroot. I find that quite simple to do via the terminal plugin in Anjuta.
The Lord bless you,My uncle had read this blessing to her the last time he talked to her. And the KMMC for years has ended their concerts with a beautiful benediction based on this passage. Grandma heard it at the concert I attended with her. It has been a favorite of my mom for years, too. So I had the thought: we really ought to sing it as a benediction at her funeral. It was hard to find the right mix of people on short notice, but we wound up with me singing baritone, my brother singing 2nd tenor (we both normally sing bass), and his wife both playing piano and singing 1st tenor, and relying on the piano to fill in the bass part. We had a little chance to practice before the funeral, but not a lot. The two of them have done a lot musically, but I haven t nearly as much, so I got in some extra practice at home, too. When it came time to sing, it was an emotional moment for sure more than a bit hard to focus, knowing the history and meaning of these words. When we got to and give you peace , and moved into the chorus of amen that finishes the song, I almost broke down right there, but didn t quite. We didn t give a perfect performance, for sure, on such short notice. (And they had me singing with them, so we wouldn t have been perfect even with plenty of notice!) But it didn t have to be perfect. After we ended the last, quiet amen , I think I heard about a half-dozen noses blowing all at once. My band teacher was right about music speaking to the heart. Later, during lunch, my aunt said to me, Wow, John, I ve never heard you sing before! That s right, and this may be the last time you hear me sing, too! I don t normally sing in a small group like this. A few minutes later, my uncle that gave the message came over and talked to the three of us. John, today you three brainwashed me. Oh? Yes. For years, I thought that there was no music as beautiful as the trumpet. After hearing you three sing, I have to reconsider. And so my band teacher was also right: music is life. My grandma was a person that could hardly speak without touching the heart. That beautiful melody of her life didn t stop when she died Tuesday afternoon. I ve been hearing it all week.
The Lord keep you,
Make his face to shine upon you and be gracious unto you,
The Lord life up his countenance upon you and give you peace.
At work, we have a bit of a vested interest in the Puppet and Facter packages
that are in Debian, because we ultimately consume them in Ubuntu.
We noticed that what was in Debian unstable was lagging a bit behind what
was released upstream, and when one of my co-workers tried getting in
contact with the Debian developers that were maintaining the Puppet package
and got no response, I got involved.
I got in touch with Micah Anderson and got myself and Nigel Kersten added to the Alioth project for
Puppet.
Despite Jamie Wilkinson being
listed as the maintainer of the facter package in Debian, he
claimed this was news to him, and Matt Palmer, who was listed
as an uploader, didn't really claim much knowledge of maintaining the
package either, so we took that as blessing to take over that package as
well.
This is where the fun begins.
I've been meaning to try out Git ever
since Debconf 7, where all the
cool kids were using it and raving about it.
I've been meaning to make the Debian DHCP package
collaboratively-maintained, and use Git for the revision control, but I
haven't quite gotten off my good intentions and done it yet. Part of the
problem is not knowing exactly what workflow I should use, and suffering
from paralysis by analysis, reluctant to experiment, because I don't want to
go down the wrong path.
Anyway, this is about Puppet, not DHCP. The Puppet package, as it turns out,
is already
maintained in Git on Alioth, so the problem here was more one of
figuring out what the current workflow was, and trying to follow it.
This is where Nigel came in. Conveniently, the upstream Puppet development
is done in Git also, and Nigel is a contributor to Puppet upstream, so he
had some Git-fu. So between the instructions
on how to get started with Git on Alioth and what he knew, we could
start fumbling around.
It seems like the Alioth Git repository was also tracking the upstream
Puppet repository, as there were commits in the Alioth one by Luke Kanies,
and we didn't really imagine that he was doing Debian-specific stuff.
Here's what we ended up doing to try and get what was in the Alioth
repository up to the upstream version 0.24.8 of Puppet:
git clone ssh://apollock@git.debian.org/git/pkg-puppet/puppet.gitThis part was fairly straight forward. Clone what's in Alioth locally.
git remote add reductive git://reductivelabs.com/puppet git remote update git fetch --tags reductiveNext, we added a remote branch that tracked upstream. We called it "reductive", and we updated it. The bit that took some fiddling with was fetching the tags. Nigel later figured out that tags are inherently private to a repository, and normally stay that way. So if I have a local clone of say the upstream Puppet repository, I can tag it to my heart's content, and normally those tags would stay in my local repository, because they're probably only meaningful to me.
git checkout -b upstream/0.24.8 0.24.8This bit took a bit of work to arrive at as well. What we wanted to do was create a new branch called upstream/0.24.8, which was at what was tagged 0.24.8 in the reductive repository. Nigel pondered what would happen if you already had a tag or a branch called "0.24.8" before you added the remote repository. This is also why we had to fetch the tags from the remote repository, so we had something to check out.
git checkout master git merge upstream/0.24.8Next, we switched back to the master branch and merged the contents of our local upstream/0.24.8 branch that we just created. This now got the Puppet source in the master branch up to what was released as version 0.24.8. (and this is better than just running uupdate?) We did some fiddling with the debian/control file and debian/changelog and fixed up a few things that Lintian was bitching about, and were done. I'd set up a sid chroot with cowdancer previously, and had to do some faffing around with git-buildpackage to convince it to use pbuilder. I ended up using
git-buildpackage --git-builder="pdebuild --debbuildopts '-i\.git -I.git' --basepath /var/cache/pbuilder/base-unstable.cow"So now we've got most of what we want to ship checked into Git on Alioth. I have no idea if we've done it "right", I suspect we may have done something wrong by operating on the master branch. Looking at the revision history in the Git repository on Alioth, it looks like previously things have been done a few different ways. I certainly want to write up a definitive workflow once we've figured one out. We haven't uploaded the new package to unstable yet, because we're still trying to give it a modicum of testing, and we'd like to sort out the Facter package as well. The Facter package was a more greenfield exercise, as while there was already a Git repository on Alioth for it, it was empty. So Nigel had to do some futzing around to get it checked in the right way to make git-buildpackage want to build it. He did this by himself, so I'm not sure exactly what he did. I've since discovered that it's probably lacking some dependencies it needs, so that'll need to get fixed before it gets uploaded. I look forward to reading blog posts from the smart people who actually know how to use Git properly, telling me how we should have done it. I'm still very interested in coming up with a proper workflow for preparing packages and committing the changes, and for doing code review.
Yeah, proprietary software is bad, but let's at least install it the Debian way. The following walkthrough assumes Debian lenny.
Install some prerequisites:
$ sudo apt-get install mysql-server-5.0 apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php-pear mono-gmcs php5-imap curl dh-make-php dpkg-dev fakeroot build-essential cdbs php-http-request php-mail php-net-smtp php-db php-auth
Download and extract FogBugz:
$ cp ~/Downloads/fogbugz-setup-php-6.1.44.tar.gz . $ tar xvfz fogbugz-setup-php-6.1.44.tar.gz $ cd fogbugz
If you do not wish to install FogBugz to /opt/fogbugz, modify INSTALL_DIR at the top of install.sh to point to your intended target (e.g. /srv/bugs.example.com).
Create Debian packages of the missing PEAR libraries. For some reason, the php-mail-mime package in lenny is not recognised by FogBugz's install.sh, so we create a replacement.
#!/bin/sh set -e for PEAR_PKG in Auth_SASL HTTP_Client Mail_Mime XML_Tree do PKG_TEMP=$(mktemp -d) cd $ PKG_TEMP pear download $ PEAR_PKG dh-make-pear $ PEAR_PKG *.tgz cd $(find -mindepth 1 -type d head -n1) dpkg-buildpackage -uc -us -rfakeroot sudo dpkg -i ../*.deb rm -rf $ PKG_TEMP done
$ sudo ./install.sh /***************************************\ * FogBugz 6 Setup \***************************************/ -- Checking for required tools + found mono 1.9.1 [..]
FogBugz will offer to mangle your Apache configuration. Choose no and run the following, replacing /srv/bugs.example.com where appropriate:
$ sudo ln -s /srv/bugs.example.com/Accessories/fogbugz.conf /etc/apache2/sites-available/fogbugz $ sudo a2ensite fogbugz
FogBugz will then offer to mangle your PHP configuration. Choose yes; but move the last handful of lines from (e.g. /etc/php5/apache2) into /etc/conf.d/fogbugz.ini.
After restarting Apache, you should be able to visit http://bugs.example.com/fogbugz/install1.php to continue installation.
On first run, FogBugz will "warn" about the lack of missing eAccelerator, a PHP JIT. Unfortunately, whilst eAccelerator is "open-source", useful distribution of it is illegal. Alternatives available in lenny would include php-apc and php-xcache.
After far too long (too many holidays away from my keyboard :-) I've released DAViCal 0.9.6.3 and AWL 0.36. This is mostly a stability release, fixing all those little niggles that might only affect a few corner cases, but it frees me up now to concentrate on adding more functionality for a 0.9.7 release in due course. Hopefully this will be the last in the 0.9.6.x series.
More information in the DAViCal release notes on the wiki.
There are quite a few changes to the AWL libraries which this release depends on, but most of those changes have been driven by my Work Request Management System and Capital APMS projects, rather than from DAViCal.
Copy of http://lists.debian.org/debian-devel/2009/04/msg00421.html.
Hi folks,
We have been pretty busy these past few weeks with the whole Google Summer of Code 2009 student application process.Next.