]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - relup.sh
Make sure readable file is uploaded.
[packages/rpm-build-tools.git] / relup.sh
1 #!/bin/sh
2 # script to run after "release bump" style change.
3 # takes Release from spec and creates commit with message
4 # groups similiar commits together.
5 # "- release $rel"
6
7 set -e
8
9 get_dump() {
10         local specfile="$1"
11         if ! out=$(rpm --specfile "$specfile" --define 'prep %dump' -q 2>&1); then
12                 echo >&2 "$out"
13                 echo >&2 "You need icon files being present in SOURCES."
14                 exit 1
15         fi
16         echo "$out"
17 }
18
19 usage="Usage:
20 ${0##*/} [-i] [-g] [-u] [-t|-n] [-m <MESSAGE>] <SPECLIST>
21
22 Options:
23 -i
24   Try to increment package release
25 -g
26  get packages if missing, do nothing else
27 -u
28  update packages (git pull)
29 -t | -n
30   Test mode (dry-run). do not commit
31 -m
32   Specify commit message
33
34 "
35
36 get_release() {
37         local specfile="$1"
38         rel=$(awk '/^%define[   ]+_?rel[        ]+/{print $NF}' $specfile)
39         if [ -z "$rel" ]; then
40                 dump=$(get_dump "$specfile")
41                 rel=$(echo "$dump" | awk '/PACKAGE_RELEASE/{print $NF; exit}')
42         fi
43         echo $rel
44 }
45
46 set_release() {
47         local specfile="$1"
48         local rel="$2"
49         local newrel="$3"
50         sed -i -e "
51                 s/^\(%define[ \t]\+_\?rel[ \t]\+\)$rel\$/\1$newrel/
52                 s/^\(Release:[ \t]\+\)$rel\$/\1$newrel/
53         " $specfile
54 }
55
56 bump_release() {
57         local release=$1 rel
58
59         rel=$(expr ${release} + 1)
60         echo $rel
61 }
62
63 # normalize spec
64 # takes as input:
65 # - PACKAGE/
66 # - ./PACKAGE/
67 # - PACKAGE
68 # - PACKAGE.spec
69 # - ./PACKAGE.spec
70 # - PACKAGE/PACKAGE
71 # - PACKAGE/PACKAGE.spec
72 # - ./PACKAGE/PACKAGE.spec
73 # - rpm/PACKAGE/PACKAGE
74 # - rpm/PACKAGE/PACKAGE.spec
75 # - ./rpm/PACKAGE/PACKAGE.spec
76 # returns PACKAGE
77 package_name() {
78         local specfile="${1%/}" package
79
80         # basename
81         specfile=${specfile##*/}
82         # strip .spec
83         package=${specfile%.spec}
84
85         echo $package
86 }
87
88 if [ ! -x /usr/bin/getopt ]; then
89         echo >&1 "You need to install util-linux to use relup.sh"
90         exit 1
91 fi
92
93 t=$(getopt -o 'm:inguth' -n "${0##*/}" -- "$@") || exit $?
94 # Note the quotes around `$t': they are essential!
95 eval set -- "$t"
96
97 while true; do
98         case "$1" in
99         -i)
100                 inc=1
101                 ;;
102         -u)
103                 update=1
104                 ;;
105         -g)
106                 get=1
107                 ;;
108         -t | -n)
109                 test=1
110                 ;;
111         -m)
112                 shift
113                 message="${1#- }"
114                 ;;
115         -h)
116                 echo "$usage"
117                 exit 0
118                 ;;
119         --)
120                 shift
121                 break
122         ;;
123         *)
124                 echo 2>&1 "Internal error: [$1] not recognized!"
125                 exit 1
126                 ;;
127         esac
128         shift
129 done
130
131 topdir=$(rpm -E '%{_topdir}')
132
133 n="$(echo -e '\nn')"
134 n="${n%%n}"
135
136 cd "$topdir"
137 for pkg in "$@"; do
138         # pkg: package %{name}
139         pkg=$(package_name "$pkg")
140
141         # spec: package/package.spec
142         spec=$(rpm -D "name $pkg" -E '%{_specdir}/%{name}.spec')
143         spec=${spec#$topdir/}
144
145         # pkgdir: package/
146         pkgdir=${spec%/*}
147
148         # specname: only spec filename
149         specname=${spec##*/}
150
151         # start real work
152         echo "$pkg ..."
153
154         # get package
155         [ "$get" = 1 -a -d "$pkgdir" ] && continue
156
157         if [ "$update" = "1" -o "$get" = "1" ]; then
158                 ./builder -g -ns "$spec"
159         fi
160
161         [ "$get" = 1 ] && continue
162
163         # update .spec files
164         rel=$(get_release "$spec")
165         if [ "$inc" = 1 ]; then
166                 if [[ $rel = *%* ]]; then
167                         relmacro=${rel#*%}
168                         newrel=$(bump_release ${rel%%%*})
169                         set_release "$spec" $rel "${newrel}%${relmacro}"
170                 else
171                         newrel=$(bump_release ${rel})
172                         set_release "$spec" $rel $newrel
173                 fi
174
175                 # refetch release
176                 rel=$(get_release "$spec")
177         fi
178
179         # commit the changes
180         msg=""
181         [ -n "$message" ] && msg="$msg- $message$n"
182         msg="$msg- release ${rel%%%*} (by relup.sh)"
183         echo git commit -m "$msg" $spec
184         if [ "$test" != 1 ]; then
185                 cd $pkgdir
186                 git commit -m "$msg" $specname
187                 git push
188                 cd ..
189         fi
190 done
This page took 0.063287 seconds and 3 git commands to generate.