]>
Commit | Line | Data |
---|---|---|
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 | 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 |