summaryrefslogtreecommitdiffhomepage
path: root/docs/chapters/special.xml
blob: 8e4ec3f4a03d8a752c4d2001b1c028267950cffa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
    <chapter id="gbp.special">
    <title>Special Use Cases</title>
    <sect1 id="gbp.special.dfsgfree">
    <title>Handling non-DFSG clean upstream sources</title>
    <para>If you have to handle non-DFSG clean upstream sources, you can use a
    different branch which you have to create once:
    </para>
<programlisting>
  &gitcmd; branch dfsg_clean upstream
</programlisting>
    <para>
    This creates the <emphasis>dfsg_clean</emphasis> branch from the tip of a
    branch called <emphasis>upstream</emphasis>.  Then, when importing a new
    upstream version, you import the new version on the
    <option>upstream-branch</option> (by default named
    <emphasis>upstream</emphasis>) as usual and just don't merge to the
    <emphasis>debian-branch</emphasis>  (by default named
    <emphasis>master</emphasis>):
    </para>
<programlisting>
  &gbp-import-orig; --no-merge <filename>/path/to/nondfsg-clean-package_10.4.orig.tar.gz</filename>
  &gitcmd; <option>tag</option> 10.4
</programlisting>
    <para>
    After the import, you can switch to the <emphasis>dfsg_clean</emphasis>
    branch and get the newly imported changes from the upstream branch:
    </para>
<programlisting>
  &gitcmd; <option>checkout</option> dfsg_clean
  &gitcmd; <option>pull</option> <filename>.</filename> upstream
</programlisting>
    <para>Now make this checkout dfsg clean (preferably by a cleanup script), commit
    your changes and merge to your <option>debian-branch</option>:</para>
<programlisting>
  cleanup-script.sh
  &gitcmd; commit -a -m "Make source dfsg clean"
  &gitcmd; tag <replaceable>10.4.dfsg</replaceable>
  &gitcmd; checkout <replaceable>master</replaceable>
  &gitcmd; pull <replaceable>.</replaceable> <replaceable>dfsg_clean</replaceable>
</programlisting>
    </sect1>

    <sect1 id="gbp.special.nmus">
    <title>Importing NMUs</title>
    <para>
    First, create a branch that holds the NMUs from the tip of your
    <option>debian-branch</option> (default is <emphasis>master</emphasis>) once:
    </para>
<programlisting>
  &gitcmd; <option>branch</option> <replaceable>nmu</replaceable> <replaceable>master</replaceable>
</programlisting>
    <para>
    To import an NMU, change into the git repository and use &gbp-import-dsc;:
    </para>
<programlisting>
  &gitcmd; checkout <replaceable>master</replaceable>
  &gbp-import-dsc; <option>--debian-branch</option>=<replaceable>nmu</replaceable> <filename>/path/to/package_1.0-1nmu0.dsc</filename>
</programlisting>
    <para>
    This will import the NMU onto the branched named <emphasis>nmu</emphasis>
    instead of the default <option>master</option>. This method can also
    be used to import "old" releases into the &git; repository when migrating
    to &git; from another VCS.
    </para>
    </sect1>

    <sect1 id="gbp.special.pbuilder">
    <title>Building with &cowbuilder;</title>
    <para>
      &cowbuilder; is nice tool to build Debian packages in a defined
      environment.  It makes sure all build-dependencies are specified
      correctly by building the package in a clean chroot. As its
      cousin &pbuilder; it can be extended via hooks to (e.g. run
      autopkg tests) but doesn't need a tarball unpacked but uses copy
      on write tree to speed up the build.
    </para>

    <para>
      Since &cowbuilder; uses different command line arguments than
      &debuild; and &dpkg-buildpackage;, we can't simply pass the
      options to run it on the command line. To simplifiy the
      integration we use a separate helper named &git-pbuilder;.
      &gbp; has it's own command line option for this:
    </para>
<programlisting>
  &gbp-buildpackage; <option>--git-pbuilder</option>
</programlisting>
    <para>
      This will set the build command to run &git-pbuilder; (which
      invokes &cowbuilder; by default) and the clean command
      to <command>/bin/true</command>. It also activates the parsing
      of several &git-pbuilder; related options
      like <option>--git-dist</option>, <option>--git-arch</option> and
      <option>--git-pbuilder-options</option>.
    </para>

    <para>
      We can make &git-pbuilder; usage the default by adding it to
      <filename>~/.gbp.conf</filename>:
    </para>
<programlisting>
cat &lt;&lt;EOF &gt; <filename>~/.gbp.conf</filename>
[DEFAULT]
# We invoke cowbuilder via git-pbuilder. Arguments passed to &gbp-buildpackage;
# will be passed to dpkg-buildpackage in the chroot
pbuilder = True
EOF
</programlisting>
      <para>
	<command>git-pbuilder</command> defaults to building a package for the
	<envar>sid</envar> distribution. If you want to build for another
	distribution, pass this in the <option>--git-dist</option> option:

<programlisting>
  &gbp-buildpackage; --git-pbuilder --git-dist=jessie
</programlisting>

	If you want to use <command>debuild</command> again (without
	modifying <filename>~/.gbp.conf</filename>), you can use:
      </para>
<programlisting>
  &gbp-buildpackage; --git-no-pbuilder
</programlisting>
      <para>
	In order for all of the above to work you have to create a
	base chroot first using &git-pbuilder;:
      </para>
<programlisting>
  <command>git-pbuilder</command> create
</programlisting>
      <para>
	This can later be updated using:
      </para>
<programlisting>
  <command>git-pbuilder</command> update
</programlisting>
    </sect1>

    <sect1 id="gbp.special.hacking">
    <title>Working on random packages</title>
    <para>
    Whenever you need to work on an arbitrary &debian; package, you can check it
    right into &git; with one command:
<programlisting>
  &gbp-import-dsc; apt:<filename>package</filename>
  cd <filename>package</filename>
  &gitcmd; branch debian
</programlisting>
    </para>
    <para>
    This uses <command>apt-get</command> to download the source package,
    puts the orig tarball on the <option>upstream-branch</option> and the
    &debian; changes on the <option>debian-branch</option> (by default
    <emphasis>master</emphasis>). The second command
    creates a branch called <emphasis>debian</emphasis>. Now you can easily
    modify the package, revert changes you made, create other branches for
    testing, see what changes you made, etc.  When finished, just do</para>
<programlisting>
  &gitcmd; commit -a
  &gitcmd; diff debian --
</programlisting>
    <para>
    to get a nice patch that can be submitted to the &debian; BTS. You can also
    fetch the source package from a URL:

<programlisting>
  &gbp-import-dsc; <filename>http://mentors.debian.net/debian/pool/main/i/ipsec-tools/ipsec-tools_0.7.3-9.dsc</filename>
</programlisting>

   The import works incrementally; you can import new versions on top of
   already imported ones for e.g. easy review of changes.
    </para>

    </sect1>
    <sect1 id="gbp.special.sloppytarball">
    <title>Sloppy tarball creation</title>
    <para>
      By default &gbp-buildpackage; uses <filename>debian/changelog</filename> to detect
      the upstream version and build the corrsponding tarball either via &pristine-tar; or
      by using <command>git archive</command> directly. This ensures that the tarball matches
      what's in the Debian archive already.
    </para>
    <para>
      But there might be cases where you don't want to follow these
      packaging practice and create a fresh <emphasis>dirty</emphasis>
      tarball that contains additional changes. Such tarballs are not
      suitable for upload into the archive but might be helpful in local testing.
    </para>
    <para>
      Especially when getting started and when you first want to get a
      package built and dive into &gbp-dch;, &git-pbuilder; and the 3.0
      (quilt) format later to find out what exactly
<programlisting>
dpkg-source: info: local changes detected, the modified files are:
 hello-debhelper/configure
dpkg-source: error: aborting due to unexpected upstream changes, see /tmp/hello-debhelper_2.8-1.diff.har2Xx
dpkg-source: info: you can integrate the local changes with dpkg-source --commit
</programlisting>
means.
    </para>
    <para>
      For that you can force &gbp-buildpackage; to create a tarball
      from the <emphasis>debian-branch</emphasis> dropping
      the <filename>debian/</filename> directory. This will give you a
      tarball that is very close to your current working copy except
      for the packaging.
    </para>
<programlisting>
  &gbp-buildpackage; --git-ignore-new --git-force-create --git-upstream-tree=SLOPPY --git-no-pristine-tar
</programlisting>
    <para>
      The important part is the <emphasis>SLOPPY</emphasis> above. The
      other options are there to prevent &gbp-buildpackage; from using
      &pristine-tar;, to force the creation of a new tarball and to
      not abort if you have changes in your current working copy.

      If you're still getting an error about <emphasis>unexpected
      upstream changes</emphasis> make sure you have no uncommitted
      changes in you workig copy (changes in
      the <filename>debian/</filename> directory are o.k.) and no
      files that are ignored by git
      via <filename>.gitignore</filename>. A <command>git clean
      -dfx</command> can help here.
    </para>
    <para>
      Please don't use this tarball to upload to the Debian archive
      since changes outside <filename>debian/</filename> need to be
      represented by patches in <filename>debian/patches</filename>.
      See the <command>dpkg-source</command> manpage for
      details.
   </para>
    </sect1>

    <sect1 id="gbp.special.pk4">
      <title>Integrating with pk4</title>
      <para>
	&pk4; provides an easy way to fetch the sources of packages
	currently installed on the system. In order to let pk4 provide
	these packages as &git; repositories you can enable &gbp;'s
	unpack hook:
      </para>
      <programlisting>
mkdir -p ~/.config/pk4/hooks-enabled/unpack/
ln -s /usr/share/pk4/hooks-available/unpack/gbp ~/.config/pk4/hooks-enabled/unpack/
      </programlisting>
      <para>
	This will make sure packages are imported into a git respository after download.
      </para>
    </sect1>
</chapter>