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 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
|
DFSG-repackaging
----------------
The source code of Qt is repackaged to get rid of the non-DFSG compliant
RFCs that are bundled with zlib's source code inside src/3rdparty/zlib/doc/.
Additional similar removed files in Qt 5 are:
tests/manual/network_stresstest/qtest/bigfile
tests/auto/network/access/qnetworkreply/bigfile
tests/auto/network/access/qnetworkreply/rfc3252.txt
tests/auto/network/access/qnetworkreply/resource
tests/auto/network/access/qftp/rfc3252.txt
tests/auto/corelib/tools/qbytearray/rfc3252.txt
tests/auto/corelib/io/qtextstream/rfc3261.txt
Bootstrapping the docs packages
-------------------------------
In Qt 5.6 the qdoc tool was moved to qttools source, so qtbase got a
Build-Depends-Indep on qttools5-dev-tools. Thus you need to do the following
steps if you want to rebuild the whole Qt stack from scratch:
* Build only arch-dependent packages from these sources:
- qtbase-opensource-src
- qtdeclarative-opensource-src
- qtlocation-opensource-src
- qtsensors-opensource-src
- qtwebsockets-opensource-src
- qtwebchannel-opensource-src
- qtwebkit-opensource-src
- qttools-opensource-src
* Build the arch-independent packages (-doc and -doc-html) of the above sources.
* Build the rest of the Qt stack in the usual way.
Note: the docs packages should not be a problem when bootstrapping a new
Debian architecture, because the arch-independent packages are already available
in Debian archive.
Managing private ABI version
----------------------------
When upstream ABI breaks, update qtbase-abi-x-y-z version in debian/control
and in the symbols files.
Patches to the original source code
-----------------------------------
Debian patches to the package original source must be stored in debian/patches
directory. Debian patches are applied when the package is built and unapplied
when the package is cleaned. The package uses quilt [1] for managing those
patches. Various tasks of patch management (adding, removing etc.) are
described in /usr/share/doc/quilt/README.source (provided by quilt package of
version 0.46-4.1 or later).
Public VCS repository of Debian packaging
-----------------------------------------
Debian packaging history of this package is stored in Git [2] repository.
Repository policy and packaging workflow are described below. This information
is mostly for Debian package maintainers or people following packaging process.
If you are merely preparing a NMU which changes upstream code, feel free to
follow a standard patch creation procedure with quilt as described in the
section above.
Pushing permissions and occasional contributions
------------------------------------------------
* People in debian/control Maintainer and Uploaders (co-maintainers) fields may
freely push changes to public repository.
* Other members of packaging group should request permission of the current
co-maintainers (via IRC or mailing list) before adding yourself to the list of
Uploaders or pushing any other kind of changes.
* Occasional contributors may send patches. Preferably, patches should be
formatted with `git format-patch` in order to retain commit authorship
information.
* Pushed commits and patches must not violate repository policy as defined
below.
Committing policy and guidelines
--------------------------------
* Work-in-progress debian/changelog entry must have its distribution field set to
UNRELEASED. That's DEBCHANGE_RELEASE_HEURISTIC=changelog setting for dch.
* New packaging changes must be committed together with the change description
in the debian/changelog entry (if applicable). Sentences should end with dots.
* The guidelines below are *highly* recommended to follow in order to reduce
conflicts in debian/changelog when cherry-picking and merging between
branches:
* Commits should be self-contained (i.e. one change - one commit).
* It is a good idea to open a new revision with an empty changelog entry (two
empty lines between entry header and trailer) as its own commit. When
packaging a new upstream release, such first commit should include a new
changelog entry with "New upstream release." as the only change.
* dch should be configured with DEBCHANGE_MULTIMAINT_MERGE=yes or called with
--mainttrailer/-t option in order to reduce maintainer trailer changes.
As a result, dch --release should be used to update the date in the trailer
when releasing the package to Debian.
* Commit message must be meaningful (typically, debcommit is OK). The first
commit message line must be short (up to 72-80 characters) and end with a
dot. More detailed description might be provided in paragraphs wrapped at 80
characters after a empty line (e.g. like a well formatted standard Git commit
message).
Branching policy
----------------
Debian packaging branches must not contain original source and must not have
been merged with a branch containing original source code (referred by name
"upstream" in the rest of this document) in any point of their history. If
necessary, it is recommended to keep a private upstream branch in the private
local repository or just track upstream remote Git repository locally.
Debian packaging branches must only contain debian/ subdirectory in their root
directory in order to avoid potential conflicts with upstream source. This
restriction applies even to Git-specific files like .gitignore.
Branches should be named as follows:
* master - main packaging branch. It typically contains packaging aimed at
unstable. However, if unstable is (semi-)frozen, it may even contain
packaging for experimental. It is up package maintainers what is considered
"current" release.
* Other mainline branches must be named after Debian release codenames (e.g.
lenny, squeeze, sid, experimental etc.) that they contain packaging of.
When such a branch (e.g. experimental) is merged to master, it does not
need to be deleted from the remote repository.
* Other packaging "work" branches may be pushed to the remote repository at
discretion of package maintainer(s). These branches should be deleted from
the public repository when they are no longer needed.
Non-fast-forwarding pushes (e.g. rebase of already published history) are
forbidden to all mainline packaging branches unless they are absolutely
necessary and have previously been agreed upon by co-maintainers of the
package.
Tagging policy
--------------
Tag namespace "debian" is reserved for tagging package releases to Debian.
Preferably, public repository should not contain any other tags unless
otherwise agreed upon.
Each official package release must be tagged. The tag must meet the following
requirements:
* The tag must mark the state of packaging as uploaded to Debian archive.
Re-tagging is allowed if necessary.
* The tag must be annotated and preferably signed with the key of uploader.
* The tag must be named like "debian/<version>" where <version> is a full
debian package version without epoch. All occurrences of the ~ character in
<version> should be replaced with the - character because Git does not
support ~ character in tag names.
* The tag must be assigned the message with content like
"<version>/<distribution>" where <version> is a full debian version of the
package (without any modifications including epoch) and <distribution>
is the distribution this package is uploaded to (as per the latest debian
changelog entry).
For example, in order to tag the tip of current packaging branch as upload of
the package version 4:4.6.0~beta1-1 to experimental, the following command may
be used:
$ git tag debian/4.6.0-beta1-1 -sm "4:4.6.0~beta1-1/experimental"
Versioning of upstream snapshots
--------------------------------
Since Git commit IDs are not sequential, it is recommended to use a sequential
number (number of commits since the latest tag) that `git describe` returns at
the tip of the upstream snapshot being packaged.
For example, if:
$ git describe
v1.2-beta1-45-67890abc
then Debian package upstream version part of this snapshot could be
1.2~beta1+git45+67890abc.
Cloning public packaging repository
-----------------------------------
# For users with ssh access to salsa.debian.org:
$ git clone git@salsa.debian.org:qt-kde-team/subgroup/repository.git
# For anonymous users:
$ git clone <Vcs-Git URL from debian/control>
Wait a bit. You will end up with full clone of the public repository and a
local branch master will be setup to track remote master branch
(origin/master). Change to the directory of the repository.
In order to track another packaging branch (e.g. lenny) locally, run:
$ git checkout -b lenny origin/lenny
Now let's setup `git push` to push all packaging branches and debian tags by
default:
$ git config --add remote.origin.push "refs/heads/master"
$ git config --add remote.origin.push "refs/heads/lenny"
$ git config --add remote.origin.push "refs/tags/debian/*"
Pulling changes
---------------
In order to avoid pointless merge commits, it is recommended to use --rebase
option to `git pull` when pulling changes from the remote repository if your
local master contains not-yet-pushed and rather trivial commits:
$ git checkout master
$ git pull --rebase
Integrating original source into local repository
-------------------------------------------------
Obviously, packaging process requires to have original source next to the
debian/ directory. Since it is not allowed to ship upstream source in the
public packaging branches, it needs to be retrieved and managed outside
packaging branches. Basically, there are a couple of options:
1) Original source is extracted to the packaging branch working tree from
the tarball:
# (only once) Ignore everything (upstream source) but files under debian/.
$ git config core.excludesfile debian/upstreamignore
# Checkout a packaging branch
$ git checkout master
# Remove all untracked files including ignored ones. This cleans up the
# root directory from old upstream sources (if any)
$ git clean -xdff
# Extract upstream source code into packaging branch working tree
$ tar zxvf ../qtbase-opensource-src_5.4.2.orig.tar.gz --strip=1
# Do packaging, committing, finally push...
2) Original source is maintained in the separate (local) branch(es) and is
read into the packaging branch as needed:
a) If original source comes in the form of the tarball, it can be
maintained in the local 'upstream' branch. When creating such a new
disjoint upstream branch, execute:
# Switch HEAD to not-yet-created upstream branch
$ git symbolic-ref HEAD refs/heads/upstream
When updating an existing upstream branch to a new release, just do:
# Clean current branch before checkout
$ git clean -xdff
$ git checkout upstream
Then do something like this:
# Remove all tracked files (e.g. old sources)
$ git rm -r '*'
# Extract tarball into the repository
$ tar zxvf ../qtbase-opensource-src_5.4.2.orig.tar.gz --strip=1
# Add all files to the index and commit the result
$ git add -A
$ git commit -m "Import upstream 5.4.2 release."
b) Original source can be fetched from the remote upstream repository.
For example, let's define a new remote 'qt' for original Qt sources.
$ git remote add qt git://code.qt.io/qt/qtbase.git
$ git remote update
# Wait ...
$ git branch upstream qt/dev # optional
Finally, read upstream tree to the packaging branch working tree, do:
# (only once) Ignore everything (upstream source) but files under
# debian/.
$ git config core.excludesfile debian/upstreamignore
# Make sure there are no dangling untracked files
$ git clean -xdff
# Checkout packaging branch
$ git checkout master
# Read upstream (can be any git commit'ish/tree'ish reference) sources
# into the working tree
$ git read-tree upstream
$ git checkout-index -a
$ git reset
# Do packaging, committing, finally push...
3) Do all packaging work in the private 'build' branch which is a merge of
upstream (2a or 2b) and packaging branch. This scenario might be quite
error prone and time consuming since packaging commits must be done in the
packaging branch rather than build branch or later cherry-picked from the
build to master branch.
a) Committing to master directly:
$ git checkout build # (or git checkout -b build upstream)
$ git merge upstream # (or git reset --hard upstream)
$ git merge master
# Do work
$ git checkout master
$ git commit
$ git checkout build
$ git merge master
# Do more work
$ git checkout master
$ git commit
...
b) Cherry-picking (or rebasing) from build branch:
$ git checkout build # (or git checkout -b build upstream)
$ git merge upstream # (or git reset --hard upstream)
$ git merge master
# Do work
$ git commit
# Do more work
$ git commit
...
# Done. Now merge packaging changes back to master.
# Either
$ git checkout master
$ git cherry-pick commit1
$ git cherry-pick commit2
...
$ git branch -D build # build branch becomes useless
# OR convert build branch into master using rebase
$ git rebase -i --onto master `git merge-base upstream master`
$ git checkout master
$ git reset --hard build
# Tag, push etc.
Feel free to use whatever workflow you like most (or any other). In general,
workflow #3 looks more cumbersome but it's nearer the proper Git way.
However, workflows #1 are #2 are somewhat simpler even if lower level git
commands are used. What is more, they give you less headache when managing
patches with quilt because Git is told to ignore everything but debian/
subdirectory hence it won't track changes made by `quilt push`. This way you
can always be sure that `git commit -a` won't pick up any raw patches to
upstream source regardless if anything is quilt pushed or not.
[1] Available in the quilt package on Debian based systems. quilt must be
invoked with QUILT_PATCHES environment variables set to debian/patches.
[2] Available in the git-core package on Debian based systems.
|