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