Bazaar is a great tool for distributed development, but distros are built on packages, and so packages are what distro developer care about. That’s why many of you who have followed my previous blogs have probably been asked for patches to the package itself, not to the bzr branch.
Why the difference? Well for package maintainers, it’s easier and faster to import upstream changes if they keep their source code clean. To do that, any changes made by the distro are applied on top of the unmodified upstream code in the form of patches. There are many tools designed specifically to make this easy for the package maintainers.
Below I’m going to show you how to turn your code change into a package patch that is easy for Ubuntu developers to add to the distro’s packages. Only do this if your submitted branch is to a package in main and it hasn’t already been merged.
0) Check your source package format
The following instructions will only work on source packages using quilt 3.0 for managing patches. Before you do anything else, check that the file debian/source/format contains the following:
1) Find your revisions
Starting from your existing code branch, we first need to identify which revisions in your branch we need to turn into a patch. To do that, we simply check for revisions in your branch that don’t exist in the main one. Here is what I used for geany:
bzr missing --mine-only ubuntu:geany
You just need to replace ‘geany’ with your application’s branch name (the same you bzr branched in my earlier articles). The –mine-only will limit the result to only revisions in your branch just to keep things simple. You’ll want to make note of the first and last revisions in this output. If, like me, you only had one revision missing, that makes it even easier.
2) Generate the patch
Fortunately the package “bzr-builddeb” provides a command that makes this step easy.
mkdir -p debian/patches bzr dep3-patch -d ubuntu:geany . > debian/patches/add_keywords.patch
Again, just replace ‘geany’ with your application’s branch name, and dep3-patch will find the differences in your branch and convert them into a patch file.
Now that you have a patch file, we need to add it to the list of patches for this package. To do that, all you need is to add it’s name to the end of the debian/patches/series file like this:
echo add_keywords.patch >> debian/patches/series
3) Convert your source changes
Now that your changes are in a patch file, we need remove those changes from the source code itself. This is where those revision numbers from step 1 come in, you will need the highest revision number and one less than the lowest. Since I only had one revision, rev 32, my numbers are 32 and 31.
bzr diff -r 32..31 | bzr patch
This causes bzr to generate a reverse-diff of your changes (by going from the higher to the lower revision), and then apply that reverse-diff to your current code, effectively undoing your changes.
Now you need to apply your new patch file using quilt, so that quilt knows about it:
quilt push -a
Which should give you the following output if everything applies cleanly (if not, then your package is going to need some extra work, and you should ask for help from someone in #ubuntu-devel on freenode IRC).
Applying patch add_keywords.patch patching file geany.desktop.in Now at patch add_keywords.patch
4) Log your changes
Since you are making changes to the package itself now, you need to add that information to the debian/changelog:
export DEBFULLNAME="Michael Hall" export DEBEMAIL="email@example.com" dch -i
You will, of course, want to replace my name and email with your own (Hint: you can put those 2 export lines into ~/.bashrc for future packaging work). This will create a new entry in the chanelog for you, with one higher version number. All you need to do it add in the comments:
* Add search keywords to .desktop file (LP: #942154)
Be sure to use the proper bug number for your changes. Also, if you are not running on Precise, you will need to change the release target at the top of the file to ‘precise’. Here’s what my new record looks like:
geany (0.21.dfsg-1ubuntu4) precise; urgency=low * Add search keywords to .desktop file (LP: #942154) -- Michael Hall <firstname.lastname@example.org> Wed, 07 Mar 2012 14:40:32 -0500
5) Commit and push
Now it’s time to put everything back into your bzr branch. First you need to add your patch file:
bzr add debian/patches/add_keywords.patch bzr add debian/patches/series bzr add .pc/
If your package branch didn’t already have a ‘series’ file, my instructions in step 2 will have created one, so I’m adding it here just in case. If it already existed, bzr add won’t do anything.
Next, commit and push your changes back to your submitted branch:
bzr commit -m "Convert source changes into a package patch file" bzr push lp:~mhall119/ubuntu/precise/geany/add_keywords