contrib/rpm: add comments to build.sh to list script arguments
[NetworkManager.git] / contrib / fedora / rpm / build.sh
1 #!/bin/bash
2
3 #set -vx
4
5 # Set arguments via environment variables.
6 # Argument can be omited and defaults will be detected.
7 #
8 #   BUILDTYPE=|SRPM
9 #   NM_RPMBUILD_ARGS=<additional argus for rpmbuild>
10 #   RELEASE_VERSION=
11 #   VERSION=
12 #   COMMIT_FULL=
13 #   COMMIT=
14 #   USERNAME=
15 #   SPECFILE=
16 #   SOURCE=<path>
17 #   SOURCE_FROM_GIT=|1|0
18 #   SOURCE_NETWORKMANAGER_CONF=
19 #   SOURCE_CONFIG_SERVER=
20 #   SOURCE_CONFIG_CONNECTIVITY_FEDORA=
21
22 die() {
23     echo "$*" >&2
24     exit 1
25 }
26
27 # copy output also to logfile
28 LOG() {
29     echo "$*"
30 }
31
32 coerce_bool() {
33     case "$1" in
34         no|n|NO|N|0)
35             echo 0
36             ;;
37         yes|y|YES|Y|1)
38             echo 1
39             ;;
40         "")
41             printf '%s' "$2"
42             ;;
43     esac
44 }
45
46 abs_path() {
47     local F="$1"
48
49     if [[ "$F" != "" ]]; then
50         F="$(cd "$ORIGDIR" && readlink -f "$F")" || exit 55
51         [[ -f "$F" ]] || exit 55
52     else
53         F="$2"
54     fi
55     printf '%s' "$F"
56     exit 0
57 }
58
59 get_version() {
60     local major minor micro
61     local F="${1:-"$GITDIR/configure.ac"}"
62
63     vars="$(sed -n 's/^m4_define(\[nm_\(major\|minor\|micro\)_version\], *\[\([0-9]\+\)\]) *$/local \1='\''\2'\''/p' "$F" 2>/dev/null)"
64     eval "$vars"
65
66     [[ -n "$major" && -n "$minor" && "$micro" ]] || return 1
67     echo "$major.$minor.$micro"
68 }
69
70 write_changelog() {
71     if [[ "x$CHANGELOG" == x ]]; then
72         cat <<- EOF
73         * $(LC_TIME=C date '+%a %b %d %Y') $USERNAME - %{epoch_version}:%{version}-%{release_version}%{snapshot}%{git_sha_version}
74         - build of NetworkManager ($DATE, uuid: $UUID, git: $COMMIT_FULL)
75         $(git log -n20 --date=local --format='- %h %s [%an] (%ci)')
76         - ...
77         EOF
78     else
79         echo "$CHANGELOG"
80     fi > "$TEMP/SOURCES/CHANGELOG"
81 }
82
83 ORIGDIR="$(readlink -f "$PWD")"
84 SCRIPTDIR="$(dirname "$(readlink -f "$0")")"
85 LOG "Change to directory \"$SCRIPTDIR\""
86 cd "$SCRIPTDIR" || die "could not change into $SCRIPTDIR"
87 GITDIR="$(cd "$SCRIPTDIR" && git rev-parse --show-toplevel || die "Could not get GITDIR")"
88
89 DATE="$(date '+%Y%m%d-%H%M%S')"
90
91 BUILDLOG="$(mktemp ./.build.log.XXXXXXX)"
92 chmod +r "$BUILDLOG"
93
94 exec > >(tee "$BUILDLOG")
95 exec 2>&1
96
97 UUID=`uuidgen`
98 RELEASE_VERSION="${RELEASE_VERSION:-$(git rev-list HEAD | wc -l)}"
99 VERSION="${VERSION:-$(get_version || die "Could not read $VERSION")}"
100 COMMIT_FULL="${COMMIT_FULL:-$(git rev-parse --verify HEAD || die "Error reading HEAD revision")}"
101 COMMIT="${COMMIT:-$(printf '%s' "$COMMIT_FULL" | sed 's/^\(.\{10\}\).*/\1/' || die "Error reading HEAD revision")}"
102 USERNAME="${USERNAME:-"$(git config user.name) <$(git config user.email)>"}"
103 SPECFILE="$(abs_path "$SPECFILE" "$SCRIPTDIR/NetworkManager.spec")" || die "invalid \$SPECFILE argument"
104 SOURCE_FROM_GIT="$(coerce_bool "$SOURCE_FROM_GIT" "")"
105 SOURCE="$(abs_path "$SOURCE")" || die "invalid \$SOURCE argument"
106 if [ -n "$SOURCE" ]; then
107     [[ "$SOURCE_FROM_GIT" == 1 ]] && die "Cannot set both \$SOURCE and \$SOURCE_FROM_GIT=1"
108     SOURCE_FROM_GIT=0
109 elif [[ "$SOURCE_FROM_GIT" != "0" ]]; then
110     SOURCE="$GITDIR/NetworkManager-${VERSION}.tar."*
111     if [ -f "$SOURCE" ]; then
112         SOURCE_FROM_GIT=0
113     else
114         SOURCE_FROM_GIT=1
115         SOURCE=
116     fi
117 fi
118
119 if [[ -z "$SOURCE" && "$SOURCE_FROM_GIT" == "0" ]]; then
120     die "Either set \$SOURCE or set \$SOURCE_FROM_GIT=1"
121 fi
122
123 SOURCE_NETWORKMANAGER_CONF="$(abs_path "$SOURCE_NETWORKMANAGER_CONF" "$SCRIPTDIR/NetworkManager.conf")" || die "invalid \$SOURCE_NETWORKMANAGER_CONF argument"
124 SOURCE_CONFIG_SERVER="$(abs_path "$SOURCE_CONFIG_SERVER" "$SCRIPTDIR/00-server.conf")" || die "invalid \$SOURCE_CONFIG_SERVER argument"
125 SOURCE_CONFIG_CONNECTIVITY_FEDORA="$(abs_path "$SOURCE_CONFIG_CONNECTIVITY_FEDORA" "$SCRIPTDIR/20-connectivity-fedora.conf")" || die "invalid \$SOURCE_CONFIG_CONNECTIVITY_FEDORA argument"
126
127 TEMP="$(mktemp -d "$SCRIPTDIR/NetworkManager.$DATE.XXXXXX")"
128 TEMPBASE="$(basename "$TEMP")"
129
130 if [[ "$SOURCE_FROM_GIT" == "1" ]]; then
131     SOURCE="$TEMP/NetworkManager-${VERSION}.tar.xz"
132     (cd "$GITDIR" && git archive --prefix="NetworkManager-$VERSION"/ "$COMMIT_FULL") | xz > "$SOURCE"
133 fi
134
135 LOG "VERSION=$VERSION"
136 LOG "RELEASE_VERSION=$RELEASE_VERSION"
137 LOG "COMMIT_FULL=$COMMIT_FULL"
138 LOG "COMMIT=$COMMIT"
139 LOG "USERNAME=$USERNAME"
140 LOG "SPECFILE=$SPECFILE"
141 LOG "SOURCE=$SOURCE"
142 LOG "SOURCE_FROM_GIT=$SOURCE_FROM_GIT"
143 LOG "SOURCE_NETWORKMANAGER_CONF=$SOURCE_NETWORKMANAGER_CONF"
144 LOG "SOURCE_CONFIG_SERVER=$SOURCE_CONFIG_SERVER"
145 LOG "SOURCE_CONFIG_CONNECTIVITY_FEDORA=$SOURCE_CONFIG_CONNECTIVITY_FEDORA"
146 LOG "BUILDTYPE=$BUILDTYPE"
147 LOG "NM_RPMBUILD_ARGS=$NM_RPMBUILD_ARGS"
148 LOG ""
149 LOG "UUID=$UUID"
150 LOG "BASEDIR=$TEMP"
151
152 ln -snf "$TEMPBASE" ./latest0
153 ln "$BUILDLOG" "$TEMPBASE/build.log"
154 rm -f "$BUILDLOG"
155
156 TEMPSPEC="$TEMP/SPECS/NetworkManager.spec"
157 mkdir -p "$TEMP/SOURCES/" "$TEMP/SPECS/" || die "error creating SPECS directoy"
158
159 cp "$SOURCE" "$TEMP/SOURCES/" || die "Could not copy source $SOURCE to $TEMP/SOURCES"
160 cp "$SOURCE_NETWORKMANAGER_CONF" "$TEMP/SOURCES/NetworkManager.conf" || die "Could not copy source $SOURCE_NETWORKMANAGER_CONF to $TEMP/SOURCES"
161 cp "$SOURCE_CONFIG_SERVER" "$TEMP/SOURCES/00-server.conf" || die "Could not copy source $SOURCE_CONFIG_SERVER to $TEMP/SOURCES"
162 cp "$SOURCE_CONFIG_CONNECTIVITY_FEDORA" "$TEMP/SOURCES/20-connectivity-fedora.conf" || die "Could not copy source $SOURCE_CONFIG_CONNECTIVITY_FEDORA to $TEMP/SOURCES"
163
164 write_changelog
165
166 sed -e "s/__VERSION__/$VERSION/g" \
167     -e "s/__RELEASE_VERSION__/$RELEASE_VERSION/g" \
168     -e "s/__COMMIT__/$COMMIT/g" \
169     -e "s/__COMMIT_FULL__/$COMMIT_FULL/g" \
170     -e "s/__SOURCE1__/$(basename "$SOURCE")/g" \
171    "$SPECFILE" |
172 sed -e "/^__CHANGELOG__$/ \
173         {
174             r $TEMPBASE/SOURCES/CHANGELOG
175             d
176         }" > "$TEMPSPEC" || die "Error reading spec file"
177
178 case "$BUILDTYPE" in
179     "SRPM")
180         RPM_BUILD_OPTION=-bs
181         ;;
182     *)
183         RPM_BUILD_OPTION=-ba
184         ;;
185 esac
186
187 rpmbuild --define "_topdir $TEMP" $RPM_BUILD_OPTION "$TEMPSPEC" $NM_RPMBUILD_ARGS || die "ERROR: rpmbuild FAILED"
188
189 ln -snf "$TEMPBASE" ./latest
190 TEMP_LATEST="$(readlink -f .)"/latest
191
192 LOG
193 LOG
194 LOG "Finished with success."
195 LOG
196 LOG "See \"$TEMP_LATEST/\" which symlinks to \"$TEMPBASE\""
197 LOG
198 LOG "Result:"
199 ls -dla "$TEMP_LATEST" "$(dirname "$TEMP_LATEST")/$TEMPBASE/" "$TEMP_LATEST"/RPMS/*/ "$TEMP_LATEST"/RPMS/*/*.rpm "$TEMP_LATEST"/SRPMS/ "$TEMP_LATEST"/SRPMS/*.rpm 2>/dev/null | sed 's/^/    /'
200 LOG
201 LOG "sudo $(which dnf &>/dev/null && echo dnf || echo yum) install '$TEMP_LATEST/RPMS'/*/*.rpm"
202 LOG
203