chiark / gitweb /
wip
[talk-2018-dc18-gdr.git] / talk.txt
1 ===== title slide
2
3 Hi.
4
5 ===== context slide
6
7 Sean Whitton and I are here to present a new git workflow tool for
8 Debian packaging.
9
10 Before I tell you all about it I need to show where it fits into
11 the ecosystem of Debian package management software.  On this slide we
12 have you, the maintainer, on the left.  On the right we have the
13 Debian repositories.
14
15 You may have heard me plugging dgit once or twice.  You should all use
16 dgit!  dgit push publishes your git history so Debian's users can use
17 it!  But, that's not actually what I am here to talk about today.
18 git-debrebase does not need dgit, and dgit does not need
19 git-debrebase.
20
21 git-debrebase is an alternative to gbp pq and to git-dpm, and to
22 other tools in the same kind of area like gitkpkg.  And, of course,
23 it's an alternative to using raw quilt.
24
25 git-debrebase is a tool to help manage your git branch containing the
26 Debian version of a package you maintain.  git-debrebase helps you
27 maintain a useful git branch with the contents you need (for building
28 and uploading).
29
30 It maintains your Debian delta queue - that is, that is, the changes
31 you make, for Debian, to the upstream parts of the package - as a
32 series of commits.  It's primarily intended for Debian package
33 maintainers, although you could use it outside of or alongside Debian.
34
35 git-debrebase does not deal with building at all.  You use whatever
36 your existing build tools are.
37
38 Nor does git-debrebase deal with source packages or orig tarballs.  It
39 does not do uploads.  Of course when you actually upload to Debian you
40 need to produce a source package; usually, this would be done
41 automatically for you by dgit push-source.
42
43 Of course you can share your git branch on a service like salsa,
44 without building or uploading.
45
46 ===== usp slide 1
47
48 git-debrebase offers a standard git-rebase workflow, where you edit
49 the whole package all together.  The experience is very like using
50 plain git-rebase to edit a topic branch.  Delta queue editing can be
51 done at any time, interleaved with packaging work.
52
53 As far as I know there are no other tools that offer these features.
54 Both gbp pq and git-dpm require you to switch to a separate view in
55 order to edit the delta queue.  Some tools have specific functions for
56 cherry-pick, but with none of them you can just use plain git cherry
57 pick or git-am onto your usual branch.  With git-debrebase, you can
58 just edit the code and commit it, with git, in the completely usual
59 way.
60
61 Specifically, at any point, you may make commits to upstream files,
62 and commits to packaging, in any order.  So you can just
63 git-cherry-pick from upstream.  You can make fixup commits, and use
64 the git-rebase autosquash syntax to have them automatically folded in
65 by the next rebase.  If you wish, you may make "mixed" commits
66 containing both changes to upstream files and changes to packaging
67 files.
68
69 Of course you can always directly edit the source if you use a plain
70 git merge workflow and non-quilt source package - for example, as
71 described in the dgit-maint-merge tutorial manpage.  But of course
72 that does not maintain the Debian delta as a broken-down series.
73 Supporting you maintaining such a delta queue is what git-rebase is
74 for.
75
76 Also, unlike git-dpm and some other tools, git-debrebase has no
77 in-tree metadata, so it can't get out of date or be desynchronised,
78 or need any manual changing or fixup.
79
80 ===== usp slide 2
81
82 As I said, unlike with gbp pq and git-dpm, there is no need to ever
83 switch branches.  git-debrebase only uses one branch to handle all for
84 your Debian work.
85
86 Of course usually you will have an upstream remote tracking branch as
87 well.  And if you are working in multiple Debian releases, backports
88 for example, you will have branches for those.  But it's only one
89 branch for each line of Debian development, and no temporary branches
90 or alternative views.
91
92 With git-debrebase, yowr working tree is always immediately buildable
93 with dpkg-buildpackage (or whatever other build tool you prefer).  And
94 it is never made dirty by git-debrebase or any of the other tooling:
95 Because your working tree always has the delta queue applied, it is
96 never dirtied by patch application.  Because there is no metadata, you
97 can never get a metadata conflict.
98
99 Because git-debrebase treats the quilt patches in debian/patches/ as
100 an output, and handles them entirely automatically, your tree is never
101 dirtied by the generation of patches.  And you never need to read any
102 diffs of diffs.
103
104
105 ===== usp slide 3
106
107 And, the final part of my plug:
108
109 With git-debrebase, git-blame, and git-log on a file, work entirely
110 properly.  For example, if you do git-log on a file from upstream
111 which was changed in the Debian delta queue, git-log will show the
112 Debian delta queue commits, preceded by the upstream history.
113
114 If you run git-blame you will see a correct indication of which
115 upstream and/or delta queue commits introduced each line.  Or, for a
116 file in the debian directory, you will see a correct reporting of
117 which commits in the package's packaging history introduced each line.
118
119 With git-debrebase, you never need to use the quilt program.  You can
120 mostly ignore the 3.0 quilt source format.  Unfortunately it is not
121 possible to paper over the cracks completely: you will still get
122 trouble if you make changes in git which 3.0 quilt cannot represent.
123
124 On the other hand, when you use git-debrebase with 3.0 quilt, the
125 generated 3.0 quilt source package is perfect pretty, with your delta
126 queue commits converted nicely into pathes - just as other people
127 consuming .dscs have come to expect.
128
129 And finally: of course, git-debrebase is compatible with dgit.  You do
130 not need to pass any quilt mode option to dgit.  And, you always can
131 upload right away.  All necessary bureaucracy is done automatically by
132 dgit push-source.
133
134 ===== demo
135
136 ===== data model slide up to "2" [1]
137
138 Now you've seen it in action, I'm going to quickly run through the
139 data model.
140
141 This slide shows a likely situation, which you might find in the
142 middle of an editing session.
143
144 The horizontal part near the bottom is called the Breakwater.  This
145 branch contains unpatched upstream source code, plus the Debian
146 packaging in the debian directory.  It does not contain any
147 representation of the delta queue.  So it does not contain
148 debian/patches.  In the example, commits A and B are packaging work.
149
150 On top of that, in this example there are two Debian delta queue
151 commits, 1 and 2.  These are commits touching upstream files.  You
152 current master is at 2.  So your tree contains the patched source
153 code plus the packaging.
154
155 Suppose you make a change like the one Sean made in the demo:
156
157 ===== data model slide up to "D3" [2]
158
159 I'm calling this C3.  That's a commit which edits an upstream file and
160 also debian/changelog.  After that, your tree is, of course, still
161 fine: you can build and test it right away.
162
163 But suppose you want to tidy things up, and, in particular, that you
164 wanted the new upstream change to actually come before 2.  You use
165 git-debrebase -i.  The usual git-rebase todo list comes up, and you
166 will see in it what looks like commit C3, and reorder that.  Assuming
167 there are no conflicts, the result looks like this:
168
169 ===== data model slide up to "2'" [3]
170
171 You see that D3 has been split into two commits: C', which contains
172 the changelog change, and 3' which contains the upstream change.  The
173 upstream change is now in the delta queue in the proper place.
174
175 What about a new upstream version ?
176
177 ===== data model slide up to "2''" [4]
178
179 You run git-debrebase new-upstream.  It makes a special merge which
180 folds the new upstream source code, unchanged, into your breakwater
181 branch.  It also updates the changelog for you.  That is the new
182 breakwater.  It then rebases the delta queue commits onto the new
183 breakwater.
184
185 ===== data model slide up to PM [5]
186
187 Finally, let's consider an upload.  The upload has to be fast forward
188 from the previous version of the package.
189
190 So git-debrebase will make a pseudomerge.
191
192 ===== data model zoom in on pseudomerge and add patches 4b
193
194 A pseudomerge is a merge commit which takes its contents from only one
195 of its parents.  You would make one by hand with git-merge -s ours,
196 if you wanted to make your HEAD fast forward, and know that all the
197 wanted changes from the other branch are included.
198
199 git-debrebase records the previous branch state, so that it can make
200 the right pseudomerge.  Your new branch is derived from the previous
201 one, so it is right to declare that it is fast forward, too.
202
203 The branch with the pseudomerge is suitable for pushing to any git
204 server.  It's what you would push to salsa, say.
205
206 Also, when you upload a 3.0 quilt package, the contents of
207 debian/patches need to be right.  That is taken care of automatically:
208 a commit is made adding the delta queue to debian/patches.
209
210 ===== data model slide up to PM [5] AGAIN
211
212 Next time you stark work, using git-debrebase, both the pseudomerge
213 and the patch addition will be stripped, so that you once again have a
214 nice delta queue to edit.
215
216 That'll put you back in a situation like I introduced at the start.
217
218 ===== data model slide merge conflict failure
219
220 What if you have a merge conflict during the upstream rebase ?
221
222 git-rebase users will have seen this kind of situation before.
223 git-rebase stops at the first commit which can't be applied in
224 the new context, and asks the user for help.
225
226 This looks quite bad.  Of course, it's not good.  But, this is an
227 irreducible aspect of maintaining a delta queue on top of a moving
228 target.  Sometimes, you'll need to fix up conflicts.
229
230 At least with git-rebase, you at least get good tools to help you fix
231 it up.  Some of the other workflows can involve trying to resolve
232 merge conflicts during quilt apply.  Much less fun.
233
234 Also, git-debrebase new-upstream is quite low commitment.  Imagine,
235 like on the diagram here, git-rebase has applied commit 1, and stopped
236 because it can't apply commit 3'.
237
238 Now, if you decide that this is too difficult to deal with today, you
239 can just say git rebase --abort and everything just gets put back.
240
241 ===== data model slide merge conflict failure, new stuff greyed out
242
243 The autogenerated special breakwater merge, and changelog entry, are
244 discarded, leaving you just where you were before.  You've wasted no
245 effort because everything you're throwing away was machine-made.
246
247 ===== status and references slide
248
249 git-debrebase is available in testing and stretch-backports and is in
250 good shape.  Since early versions it has been battle-tested to help
251 with security updates to the Debian Xen packages.  The documentation
252 is comprehensive.
253
254 No doubt the user interface and documentation will improve, and new
255 features will will be added, but you can start using it right away.
256
257 The best starting point is probably the tutorial manpage
258 dgit-maint-debrebase (7) (which is in the dgit package).
259
260 Sean and I are holding a workshop on Tuesday morning, where anyone is
261 invited to come and get help with git-debrebase - and also with dgit.
262 So if your questions dun't get answered before then, do drop in.
263
264 And of course I should refer to the reference documentation.
265 git-debrebase(5) has the data model and definition of terminology.
266 git-debrebase(1) is the command line reference.
267
268 But, really, start with the dgit-maint-rebase tutorial, or come to the
269 workshop.