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