]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - relup.sh
relup: accept make-request style branches
[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         # strip branch
81         specfile=${specfile%:*}
82         # basename
83         specfile=${specfile##*/}
84         # strip .spec
85         package=${specfile%.spec}
86
87         echo $package
88 }
89
90 get_branch() {
91         local specfile="${1%/}" branch
92
93         branch=${specfile#*:}
94
95         echo ${branch:-master}
96 }
97
98 if [ ! -x /usr/bin/getopt ]; then
99         echo >&1 "You need to install util-linux to use relup.sh"
100         exit 1
101 fi
102
103 t=$(getopt -o 'm:inguth' -n "${0##*/}" -- "$@") || exit $?
104 # Note the quotes around `$t': they are essential!
105 eval set -- "$t"
106
107 while true; do
108         case "$1" in
109         -i)
110                 inc=1
111                 ;;
112         -u)
113                 update=1
114                 ;;
115         -g)
116                 get=1
117                 ;;
118         -t | -n)
119                 test=1
120                 ;;
121         -m)
122                 shift
123                 message="${1#- }"
124                 ;;
125         -h)
126                 echo "$usage"
127                 exit 0
128                 ;;
129         --)
130                 shift
131                 break
132         ;;
133         *)
134                 echo 2>&1 "Internal error: [$1] not recognized!"
135                 exit 1
136                 ;;
137         esac
138         shift
139 done
140
141 topdir=$(rpm -E '%{_topdir}')
142
143 n="$(echo -e '\nn')"
144 n="${n%%n}"
145
146 cd "$topdir"
147 for pkg in "$@"; do
148         branch=$(get_branch "$pkg")
149         # pkg: package %{name}
150         pkg=$(package_name "$pkg")
151
152         # spec: package/package.spec
153         spec=$(rpm -D "name $pkg" -E '%{_specdir}/%{name}.spec')
154         spec=${spec#$topdir/}
155
156         # pkgdir: package/
157         pkgdir=${spec%/*}
158
159         # specname: only spec filename
160         specname=${spec##*/}
161
162         # start real work
163         echo "$pkg:$branch ..."
164
165         # get package
166         [ "$get" = 1 -a -d "$pkgdir" ] && continue
167
168         if [ "$update" = "1" -o "$get" = "1" ]; then
169                 ./builder -g -ns "$spec" -r $branch
170         fi
171
172         [ "$get" = 1 ] && continue
173
174         # update .spec files
175         rel=$(get_release "$spec")
176         if [ "$inc" = 1 ]; then
177                 if [[ $rel = *%* ]]; then
178                         relmacro=${rel#*%}
179                         newrel=$(bump_release ${rel%%%*})
180                         set_release "$spec" $rel "${newrel}%${relmacro}"
181                 else
182                         newrel=$(bump_release ${rel})
183                         set_release "$spec" $rel $newrel
184                 fi
185
186                 # refetch release
187                 rel=$(get_release "$spec")
188         fi
189
190         # commit the changes
191         msg=""
192         [ -n "$message" ] && msg="$msg- $message$n"
193         msg="$msg- release ${rel%%%*} (by relup.sh)"
194         echo git commit -m "$msg" $spec
195         if [ "$test" != 1 ]; then
196                 cd $pkgdir
197                 git commit -m "$msg" $specname
198                 git push
199                 cd ..
200         fi
201 done
This page took 0.136899 seconds and 4 git commands to generate.