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
|
#!/bin/bash
# Prepare systemd source package in current directory for testing an upstream
# commit, branch, or PR, without Debian patches. This replaces everything
# except the debian/ directory with an upstream checkout.
# NEVER run this in your actual packaging work directory! This is only meant
# for upstream CI.
#
# Author: Martin Pitt <martin.pitt@ubuntu.com>
set -eu
test -x debian/rules
case "${DEB_BUILD_PROFILES:-}" in
*pkg.systemd.upstream*) ;;
*)
echo "Not in upstream testing mode. Do *not* run this script unless you know what you are doing." >&2
exit 1
esac
if [ -n "${UPSTREAM_PULL_REQUEST:-}" ]; then
FETCH="git fetch -fu origin refs/pull/$UPSTREAM_PULL_REQUEST/head:pr"
CO='git checkout pr'
DESC="PR #$UPSTREAM_PULL_REQUEST"
elif [ -n "${UPSTREAM_HEAD:-}" ]; then
FETCH=''
CO="git checkout $UPSTREAM_HEAD"
DESC="$UPSTREAM_HEAD"
else
echo "WARNING: $0: Neither UPSTREAM_PULL_REQUEST nor UPSTREAM_HEAD set, ignoring" >&2
exit 0
fi
DUMMY_USER_NAME="Merge dummy user"
DUMMY_USER_EMAIL="invalid@example.com"
UPSTREAM_REPO="${UPSTREAM_REPO:-https://github.com/systemd/systemd.git}"
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
# Use git, if in a git repo
if [ -d .git ]; then
# make sure user.name/user.email are set, git commit wants them
git config --get user.name || git config user.name "$DUMMY_USER_NAME"
git config --get user.email || git config user.email "$DUMMY_USER_EMAIL"
fi
mkdir -p debian/tmp
(cd debian/tmp
git clone "${UPSTREAM_REPO}" upstream || (rm -rf upstream; sleep 60; git clone "${UPSTREAM_REPO}" upstream)
cd upstream
$FETCH
$CO
git config user.email "$DUMMY_USER_EMAIL"
git config user.name "$DUMMY_USER_NAME"
if [ -f meson.version ]; then
UPSTREAM_VER=$(cat meson.version)
else
UPSTREAM_VER=$(git describe | sed 's/^v//;s/-/./g')
fi
if [ -n "${UPSTREAM_PULL_REQUEST:-}" ] && [ "${UPSTREAM_REPO}" != "https://github.com/systemd/systemd-stable.git" ] && ! echo "$UPSTREAM_VER" | grep -q '\.'; then
git rebase main || git rebase --abort
fi
)
if [ -f debian/tmp/upstream/meson.version ]; then
UPSTREAM_VER=$(cat debian/tmp/upstream/meson.version)
else
UPSTREAM_VER=$(cd debian/tmp/upstream; git describe | sed 's/^v//;s/-/./g')
fi
# If we are on a stable branch, check out the corresponding packaging branch. For some settings like
# build dependencies it is already too late, but this is mostly relevant for the dh_install files and
# the tests.
if [ -d .git ] && echo "$UPSTREAM_VER" | grep -q '\.'; then
rm -rf .pc
git reset --hard "origin/ci/v${UPSTREAM_VER%%.*}-stable"
fi
if [ -n "${KEEP_DEBIAN_PATCHES:-}" ]; then
# set up pq branch if it does not exist
if [ "$BRANCH_NAME" = HEAD ]; then
echo "ERROR: $0 must be started from a branch when using KEEP_DEBIAN_PATCHES" >&2
exit 1
fi
( gbp pq import 2> /dev/null && gbp pq switch ) || true
if ! git branch --contains "$BRANCH_NAME" | grep -q patch-queue/"$BRANCH_NAME"; then
echo "ERROR: patch-queue/$BRANCH_NAME exists but it is not rebased, please rebase it." >&2
exit 1
fi
fi
# switch to native instead of quilt
echo '3.0 (native)' > debian/source/format
# drop our patches
rm -rf debian/patches
# disable tests which are not for upstream
[ -n "${KEEP_DEBIAN_TESTS:-}" ] || sed -i '/# NOUPSTREAM/ q' debian/tests/control
# create new git commit with debian/ changes
if [ -d .git ] && [ -n "$(git status --short debian)" ]; then
git add debian
git commit -n -m "checkout-upstream: edit debian/ files for upstream testing"
fi
# clean out original upstream sources
find . -mindepth 1 -maxdepth 1 -name debian -o -name .git -prune -o -print0 | xargs -0n1 rm -rf
# These options changes are only needed for the upstream CI, and we don't want to pollute d/rules with them.
# Also we want to ensure running on an older branch (e.g.: for the systemd-stable repository) doesn't break.
if grep -q default-timeout-sec debian/tmp/upstream/meson_options.txt; then
sed -i "s/option('default-timeout-sec', type : 'integer', value : 90/option('default-timeout-sec', type : 'integer', value : 180/" debian/tmp/upstream/meson_options.txt
fi
if grep -q log-trace debian/tmp/upstream/meson_options.txt; then
sed -i "s/option('log-trace', type : 'boolean', value : false/option('log-trace', type : 'boolean', value : true/" debian/tmp/upstream/meson_options.txt
fi
# replace with checkout
mv debian/tmp/upstream/* .
rm -rf debian/tmp
# create new git commit with upstream code
if [ -d .git ] && [ -n "$(git status --short)" ] ; then
git add .
git commit -n -m "checkout-upstream: replace with upstream code at version ${UPSTREAM_VER}"
fi
# import Debian patches which apply cleanly
if [ -n "${KEEP_DEBIAN_PATCHES:-}" ]; then
for c in $(git log "$BRANCH_NAME"..patch-queue/"$BRANCH_NAME" --format='%H' --reverse); do
if ! git cherry-pick "$c"; then
git cherry-pick --abort
git reset --hard
git clean -dxf
fi
done
fi
if [ -z "${UPSTREAM_KEEP_CHANGELOG:-}" ] ; then
# craft changelog
cat << EOF > debian/changelog.new
systemd (${UPSTREAM_VER}.0) UNRELEASED; urgency=low
* Automatic build from upstream $DESC
-- systemd test <pkg-systemd-maintainers@lists.alioth.debian.org> $(date -R)
EOF
cat debian/changelog >> debian/changelog.new
mv debian/changelog.new debian/changelog
# create new git commit with changelog entry
if [ -d .git ] ; then
git add debian
git commit -n -m "checkout-upstream: update changelog to version ${UPSTREAM_VER}.0"
fi
fi
|