chiark / gitweb /
6a3d5343f394716a7c5ab49a925be0217aa54b02
[dgit.git] / dgit-user.7.pod
1 =head1 NAME
2
3 dgit-user - making and sharing changes to Debian packages, with git
4
5 =head1 INTRODUCTION
6
7 dgit lets you fetch the source code to every package on your
8 system
9 as if your distro used git to maintain all of it.
10
11 You can then edit it,
12 build updated binary packages (.debs)
13 and install and run them.
14 You can also share your work with others.
15
16 This tutorial gives some recipes and hints for this.
17 It assumes you have basic familiarity with git.
18 It does not assume any initial familiarity with
19 Debian's packaging processes.
20
21 If you are a package maintainer within Debian; a DM or DD;
22 and/or a sponsee:
23 this tutorial is not for you.
24 Try L<dgit-nmu-simple(7)>, L<dgit-maint-*(7)>,
25 or L<dgit(1)> and L<dgit(7)>.
26
27 =head1 SUMMARY
28
29 (These runes will be discussed later.)
30
31 =over 4
32
33     % dgit clone glibc jessie,-security
34     % cd glibc
35     % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u
36     % git commit -a -m 'Fix libc lost output bug'
37     % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit
38     % sudo apt-get build-dep glibc
39     % dpkg-buildpackage -uc -b
40     % sudo dpkg -i ../libc6_*.deb
41
42 =back
43
44 Occasionally:
45
46 =over 4
47
48     % git clean -xdf
49     % git reset --hard
50
51 =back
52
53 Later:
54
55 =over 4
56
57     % cd glibc
58     % dgit pull jessie,-security
59     % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit
60     % dpkg-buildpackage -uc -b
61     % sudo dpkg -i ../libc6_*.deb
62
63 =back
64
65 =head1 FINDING THE RIGHT SOURCE CODE - DGIT CLONE
66
67 =over 4
68
69     % dgit clone glibc jessie,-security
70     % cd glibc
71
72 =back
73
74 dgit clone needs to be told the source package name
75 (which might be different to the binary package name,
76 which was the name you passed to "apt-get install")
77 and the codename or alias of the Debian release
78 (this is called the "suite").
79
80 =head2 Finding the source package name
81
82 For many packages, the source package name is obvious.
83 Otherwise, if you know a file that's in the package,
84 you can look it up with dpkg:
85
86 =over 4
87
88     % dpkg -S /lib/i386-linux-gnu/libc.so.6 
89     libc6:i386: /lib/i386-linux-gnu/libc.so.6
90     % dpkg -s libc6:i386
91     Package: libc6
92     Status: install ok installed
93     ...
94     Source: glibc
95
96 =back
97
98 (In this example,
99 libc6 is a "multi-arch: allowed" package,
100  which means that it exists in several different builds
101  for different architectures.
102 That's where C<:i386> comes from.)
103
104 =head2 Finding the Debian release (the "suite")
105
106 Internally,
107 Debian (and derived) distros normally refer to their releases by codenames.
108 Debian also has aliases which refer to the current stable release etc.
109 So for example, at the time of writing
110 Debian C<jessie> (Debian 8) is Debian C<stable>; and
111 the current version of Ubuntu is C<yakkety> (Yakkety Yak, 16.10).
112 You can specify either
113 the codename C<jessie> or the alias C<stable>.
114 If you don't say, you get C<sid>,
115 which is Debian C<unstable> - the main work-in progress branch.
116
117 If you don't know what you're running, try this:
118
119 =over 4
120
121     % grep '^deb' /etc/apt/sources.list
122     deb http://the.earth.li/debian/ jessie main non-free contrib
123     ...
124     %
125
126 =back
127
128 For Debian, you should add C<,-security>
129 to the end of the suite name,
130 unless you're on unstable or testing.
131 Hence, in our example
132 C<jessie> becomes C<jessie,-security>.
133 (Yes, with a comma.)
134
135 =head1 WHAT DGIT CLONE PRODUCES
136
137 =head2 What branches are there
138
139 dgit clone will give you a new working tree,
140 and arrange for you to be on a branch named like
141 C<dgit/jessie,-security> (yes, with a comma in the branch name).
142
143 For each release (like C<jessie>)
144 there is a tracking branch for the contents of the archive, called
145 C<remotes/dgit/dgit/jessie>
146 (and similarly for other suites).  This can be updated with
147 C<dgit fetch jessie>.
148 This, the I<remote suite branch>,
149 is synthesized by your local copy of dgit.
150 It is fast forwarding.
151
152 Debian separates out the security updates, into C<debian-security>.
153 Telling dgit C<debian,-security> means that it should include 
154 any updates available in C<debian-security>.
155
156 (You can also dgit fetch in a tree that wasn't made by dgit clone.
157 If there's no C<debian/changelog>
158 you'll have to supply a C<-p>I<package> option to dgit fetch.)
159
160 =head2 What kind of source tree do you get
161
162 If the Debian package is based on some upstream release,
163 the code layout should be like the upstream version.
164 You should find C<git grep> helpful to find where to edit.
165
166 The package's Debian metadata and the scripts for building binary
167 packages are under C<debian/>.
168 C<debian/control>, C<debian/changelog> and C<debian/rules> are the
169 starting points.
170 The Debian Policy Manual has most of the in-depth
171 technical details.
172
173 For many Debian packages,
174 there will also be some things in C<debian/patches/>.
175 It is best to ignore these.
176 Insofar as they are relevant
177 the changes there will have been applied to the actual files,
178 probably by means of actual comments in the git history.
179 The contents of debian/patches are ignored
180 when building binaries
181 from dgitish git branches.
182
183 (For Debian afficionados:
184 the git trees that come out of dgit are
185 "patches-applied packaging branches
186 without a .pc directory".)
187
188 =head2 What kind of history you get
189
190 If you're lucky, the history will be a version of,
191 or based on,
192 the Debian maintainer's own git history,
193 or upstream's git history.
194
195 But for many packages the real git history
196 does not exist,
197 or has not been published in a dgitish form.
198 So yuu may find that the history is a rather short
199 history invented by dgit.
200
201 dgit histories often contain automatically-generated commits,
202 including commits which make no changes but just serve
203 to make a rebasing branch fast-forward.
204 This is particularly true of
205 combining branches like
206 C<jessie,-security>.
207
208 If the package maintainer is using git then
209 after dgit clone
210 you may find that there is a useful C<vcs-git> remote
211 referring to the Debian package maintainer's repository
212 for the package.
213 You can see what's there with C<git fetch vcs-git>.
214 But use what you find there with care:
215 Debian maintainers' git repositories often have
216 contents which are very confusing and idiosyncratic.
217 In particular, you may need to manually apply the patches
218 that are in debian/patches before you do anything else!
219
220 =head1 BUILDING
221
222 =head2 Always commit before building
223
224 =over 4
225
226     % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u
227     % git commit -a -m 'Fix libc lost output bug'
228
229 =back
230
231 Debian package builds are often quite messy:
232 they may modify files which are also committed to git,
233 or leave outputs and teporary files not covered by C<.gitignore>.
234
235 Kf you always commit,
236 you can use
237
238 =over 4
239
240     % git clean -xdf
241     % git reset --hard
242
243 =back
244
245 to tidy up after a build.
246 (If you forgot to commit, don't use those commands;
247 instead, you may find that you can use C<git add -p>
248 to help commit what you actually wanted to keep.)
249
250 These are destructive commands which delete all new files
251 (so you B<must> remember to say C<git add>)
252 and throw away edits to every file
253 (so you B<must> remember to commit).
254
255 =head2 Update the changelog (at least once) before building
256
257 =over 4
258
259     % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit
260
261 =back
262
263 The binaries you build will have a version number which ultimately
264 comes from the C<debian/changelog>.
265 You want to be able to tell your
266 binaries apart from your distro's.
267
268 So you should update C<debian/changelog>
269 to add a new stanza at the top,
270 for your build.
271
272 This rune provides an easy way to do this.
273 It adds a new changelog
274 entry with an uninformative message and a plausible version number
275 (containing a bit of your git commit id).
276
277 If you want to be more sophisticated,
278 the package C<dpkg-dev-el> has a good Emacs mode
279 for editing changelogs.
280 Alternatively, you could edit the changelog with another text editor,
281 or run C<dch> or C<gbp dch> with different options.
282 Choosing a good version number is slightly tricky and
283 a complete treatment is beyond the scope of this tutorial.
284
285 =head2 Actually building
286
287 =over 4
288
289     % sudo apt-get build-dep glibc
290     % dpkg-buildpackage -uc -b
291
292 =back
293
294 apt-get build-dep installs the build dependencies according to the
295 official package, not your modified one.  So if you've changed the
296 build dependencies you might have to install some of them by hand.
297
298 dpkg-buildpackage is the primary tool for building a Debian source
299 package.
300 C<-uc> means not to pgp-sign the results.
301 C<-b> means build all binary packages,
302 but not to build a source package.
303
304 =head1 INSTALLING
305
306 =head2 Debian Jessie or older
307
308 =over 4
309
310     % sudo dpkg -i ../libc6_*.deb
311
312 =back
313
314 You can use C<dpkg -i> to install the
315 .debs that came out of your package.
316
317 If the dependencies aren't installed,
318 you will get an error, which can usually be fixed with
319 C<apt-get -f install>.
320
321 =head2 Debian Stretch or newer
322
323 =over 4
324
325     % sudo apt install ../libc6_*.deb
326
327 =back
328
329 =head1 Multiarch
330
331 If you're working on a library package and your system has multiple
332 architectures enabled,
333 you may see something like this:
334
335 =over 4
336
337     dpkg: error processing package libpcre3-dev:amd64 (--configure):
338      package libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 cannot be configured because libpcre3-dev:i386 is at a different version (2:8.39-2)
339
340 =back
341
342 The multiarch system used by Debian requires each package which is
343 present for multiple architectures to be exactly the same across
344 all the architectures for which it is installed.
345
346 The proper solution
347 is to build the package for all the architectures you
348 have enabled.
349 You'll need a chroot for each of the secondary architectures.
350 This iw somewhat tiresome,
351 even though Debian has excellent tools for managing chroots.
352 C<sbuild-createchroot> from the sbuild package is a
353 good starting point.
354
355 Otherwise you could deinstall the packages of interest
356 for those other architectures
357 with something like C<dpkg --remove libpcre3:i386>.
358
359 If neither of those are an option,
360 your desperate last resort is to try
361 using the same version number
362 as the official package for your own package.
363 (The verseion is controlled by C<debian/changelog> - see above,)
364 This is not ideal because it makes it hard to tell what is installed,
365 because it will mislead and confuse apt.
366
367 With the "same number" approach you may still get errors like
368
369 =over 4
370
371 trying to overwrite shared '/usr/include/pcreposix.h', which is different from other instances of package libpcre3-dev
372
373 =back
374
375 but passing C<--force-overwrite> to dpkg will help
376 - assuming you know what you're doing.
377
378 =head1 SHARING YOUR WORK
379
380 The C<dgit/jessie,-security> branch (or whatever) is a normal git branch.
381 You can use C<git push> to publish it on any suitable git server.
382
383 Anyone who gets that git branch from you
384 will be able to build binary packages (.deb)
385 just as you did.
386
387 If you want to contribute your changes back to Debian,
388 you should probably send them as attachments to 
389 an email to the
390 L<Debian Bug System|https://bugs.debian.org/>
391 (either a followup to an existing bug, or a new bug).
392 Patches in C<git-format-patch> format are usually very welcome.
393
394 =head2 Source packages
395
396 The
397 git branch is not sufficient to build a source package
398 the way Debian does.
399 Source packages are somewhat awkward to work with.
400 Indeed many plausible git histories or git trees
401 cannot be converted into a suitable source package.
402 So I recommend you share your git branch instead.
403
404 If a git branch is not enough, and
405 you need to provide a source package
406 but don't care about its format/layout
407 (for example because some software you have consumes source packages,
408 not git histories)
409 you can use this recipe to generate a C<3.0 (native)>
410 source package, which is just a tarball
411 with accompanying .dsc metadata file:
412
413 =over 4
414
415     % echo '3.0 (native)' >debian/source/format
416     % git commit -m 'switch to native source format' debian/source/format
417     % dgit -wgf build-source
418
419 =back
420
421 If you need to provide a good-looking source package,
422 be prepared for a lot more work.
423 You will need to read much more, perhaps starting with
424 L<dgit-nmu-simple(7)>,
425 L<dgit-sponsorship(7)> or
426 L<dgit-maint-*(7)>
427
428 =head1 SEE ALSO
429
430 dgit(1), dgit(7)