]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - pearize.sh
unset GIT_EDITOR together with other GIT_* vars
[packages/rpm-build-tools.git] / pearize.sh
1 #!/bin/sh
2 # updates php-pear .spec with Requires/Conflicts lines.
3 # the items are added randomly to the preamble, but once added their order is left intact.
4 # it is still better than nothing. if somebody wishes to add sorting in this
5 # script. i'd be just glad :)
6 #
7 # needs 'pear' for 'pear make-rpm-spec' command, ./builder for fetching sources.
8 # You should have all PEAR packages installed to get best results (needed for epoch autodetection)
9 # So far there are 3 packages with epoch > 0:
10 # $ grep ^Epoch:.* php-pear-*.spec | grep -v 'Epoch:.*0'
11 # php-pear-MDB2.spec:Epoch:               1
12 # php-pear-MDB.spec:Epoch:                1
13 # php-pear-PEAR.spec:Epoch:               1
14 #
15 # To create completely new PEAR package spec, follow something like this:
16 # $ pear download RDF-alpha
17 # File RDF-0.1.0alpha1.tgz downloaded
18 # $ pear make-rpm-spec RDF-0.1.0alpha1.tgz
19 # Wrote RPM spec file php-pear-RDF.spec
20 # $
21 #
22 # TODO: adjust similiarily noautoreqdeps
23 # BUGS: the beta portions in version deps could be wrong (php-4.3.0b1 and alike)
24 # see php-pear-DBA_Relational.spec
25 # Something strange: Requires:  php-common < 4:3:5.1
26 #
27 # NOTE: old version of this script which was used to convert to new package format is in CVS branch MIGRATE.
28 #
29 # Send blames and beer\b\b\b\bideas to glen@pld-linux.org
30
31 PROGRAM=${0##*/}
32 APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d")
33
34 set -e
35 spec="$1"
36 if [ -z "$spec" ]; then
37         echo >&2 "Usage: $0 SPECFILE"
38         exit 0
39 fi
40 if [ ! -f "$spec" ]; then
41         echo >&2 "$spec doesn't exist?"
42         exit 1
43 fi
44
45 if [[ "$(rpm -q php-pear-PEAR_Command_Packaging)" == *is?not* ]]; then
46         echo >&2 "Please install php-pear-PEAR_Command_Packaging"
47         exit 1
48 fi
49 echo "Processing $spec"
50
51 getsource() {
52         local spec="$1"
53         local NR="$2"
54         rpmbuild --nodigest --nosignature -bp --define 'prep %dump' $spec 2>&1 | awk  "/SOURCE$NR\t/ {print \$3}"
55 }
56
57 tarball=$(getsource $spec 0)
58 if [ -z "$tarball" ]; then
59         echo >&2 "Spec is missing Source0!"
60         exit 1
61 fi
62
63 if [ ! -f $tarball ]; then
64         $APPDIR/builder -g "$spec"
65 fi
66
67 stmp=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
68 template=pearize.spec
69 cat > $stmp <<'EOF'
70 @extra_headers@
71 License: @release_license@
72 State: @release_state@
73 EOF
74 pear make-rpm-spec --spec-template=$stmp --output=$template $tarball
75 rm -f $stmp
76
77 mv $template .$template~
78 template=.$template~
79
80 # take as argument dependency in form NAME EQUALITY VERSION
81 # adds rpm epoch to VERSION if the package is installed and has epoch bigger than zero.
82 add_epoch() {
83         local dep="$@"
84         local pkg="$1"
85         local ver="$3"
86
87         # already have epoch
88         if [[ "$ver" = *:* ]]; then
89                 echo "$dep"
90                 return
91         fi
92
93         query=$(rpm -q --qf '%{epoch}\n' $pkg || :)
94         epoch=$(echo "$query" | grep -v 'installed' || :)
95         if [ "$epoch" ] && [ "$epoch" -gt 0 ]; then
96                 echo "$dep" | sed -e "s, [<>=]\+ ,&$epoch:,"
97         else
98                 echo "$dep"
99         fi
100 }
101
102 preamble=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
103 # take just main package preamble, preamble of tests (and other) subpackage(s) just confuses things.
104 sed -ne '/^Name:/,/^BuildRoot/p' $spec > $preamble
105
106 # create backup
107 bak=$(LC_ALL=C cp -fbv $spec $spec | awk '{print $NF}' | tr -d "['\`]" )
108
109 # ensure rpm-build-macros is present
110 if ! grep -q "^BuildRequires:.*rpmbuild(macros)" $preamble; then
111         sed -i -e "/^BuildRequires:.*rpm-php-pearprov/aBuildRequires:\trpmbuild(macros) >= 1.300" $spec
112 fi
113 # parse requires
114 requires=$(grep '^BuildRequires:' $template || :)
115 if [ -n "$requires" ]; then
116         echo "$requires" | while read tag dep; do
117                 dep=$(add_epoch $dep)
118                 if ! grep -q "^BuildRequires:.*$dep" $preamble; then
119                         sed -i -e "/^BuildRoot/iBuildRequires:\t$dep" $spec
120                 fi
121         done
122 fi
123
124 requires=$(grep '^Requires:' $template || :)
125 if [ -n "$requires" ]; then
126         echo "$requires" | while read tag dep; do
127                 dep=$(add_epoch $dep)
128                 if ! grep -q "^Requires:.*$dep" $preamble; then
129                         dep=$(echo "$dep" | sed -e 's,php-pear-PEAR\b,php-pear-PEAR-core,')
130                         sed -i -e "/^BuildRoot/iRequires:\t$dep" $spec
131                 fi
132         done
133 fi
134
135 # parse conflicts
136 conflicts=$(grep '^Conflicts:' $template || :)
137 if [ -n "$conflicts" ]; then
138         echo "$conflicts" | while read tag dep; do
139                 dep=$(add_epoch $dep)
140                 if ! grep -q "^Conflicts:.*$req" $preamble; then
141                         sed -i -e "/^BuildRoot/iConflicts:\t$dep" $spec
142                 fi
143         done
144 fi
145
146 # parse optional deps
147 optional=$(grep '^Suggests:' $template || :)
148 if [ -n "$optional" ]; then
149         echo "$optional" | while read tag dep; do
150                 dep=$(add_epoch $dep)
151                 if ! grep -q "^Suggests:.*$dep" $preamble; then
152                         sed -i -e "/^BuildRoot/iSuggests:\t$dep" $spec
153                 fi
154
155                 for req in $dep; do
156                         case "$req" in
157                         php-pear-*)
158                                 # convert pear package name to file pattern
159                                 req=$(echo "$req" | sed -e 's,^php-pear-,pear(,;y,_,/,;s,$,.*),')
160                                 ;;
161                         *)
162                                 # process only php-pear-* packages
163                                 continue
164                                 ;;
165                         esac
166
167                         m=$(grep "^%define.*_noautoreq" $spec || :)
168                         if [ -z "$m" ]; then
169                                 sed -i -e "/^BuildRoot:/{
170                                         a
171                                         a# exclude optional dependencies
172                                         a%define\       \       _noautoreq\     $req
173                                 }
174                                 " $spec
175                         else
176                                 m=$(echo "$m" | grep -o "$req" || :)
177                                 if [ -z "$m" ]; then
178                                         sed -i -e "/^%define.*_noautoreq/s,$, $req," $spec
179                                 fi
180                         fi
181                 done
182         done
183 fi
184
185 optional=$(grep '^Optional-ext:' $template || :)
186 if [ -n "$optional" ]; then
187         tmp=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
188         echo "$optional" | while read tag ext; do
189                 grep -q "PHP extension .$ext" && continue
190                 cat > $tmp <<-EOF
191                 echo '%{name} can optionally use PHP extension "$ext"' >> optional-packages.txt
192                 EOF
193                 sed -i -e "
194                 /%pear_package_setup/ {
195                         r $tmp
196                 }
197                 " $spec
198         done
199         rm -f .ext.tmp
200 fi
201
202 has_opt=$(grep -Ec '^Optional-(pkg|ext):' $template || :)
203 if [ "$has_opt" -gt 0 ]; then
204         if ! grep -q 'rpmbuild(macros)' $spec; then
205                 sed -i -e '
206                 /rpm-php-pearprov/{
207                         aBuildRequires: rpmbuild(macros) >= 1.300
208                 }
209                 ' $spec
210         fi
211         if ! grep -Eq '%{_docdir}/.*/optional-packages.txt|%pear_package_print_optionalpackages' $spec; then
212                 sed -i -e '
213                 /^%files$/{
214                         i%post -p <lua>
215                         i%pear_package_print_optionalpackages
216                         i
217                 }
218                 /rpmbuild(macros)/{
219                         s/>=.*/>= 1.571/
220                 }
221                 ' $spec
222         fi
223         if ! grep -q '%doc.*optional-packages.txt' $spec; then
224                 sed -i -e '
225                 /^%doc install.log/{
226                 s/$/ optional-packages.txt/
227                 }
228                 ' $spec
229         fi
230 fi
231
232 # parse state
233 state=$(awk '/^State:/{print $2}' $template)
234 sed -i -e "/^%define.*_\?status/{
235         s/%define[[:space:]]*_status.*/%define\t\t_status\t\t$state/
236         s/%define[[:space:]]*status.*/%define\t\tstatus\t\t$state/
237 }" $spec
238
239 # parse license
240 #license=$(awk '/^License:/{print $2}' $template)
241 #sed -i -e "s/^License:.*/License:\t$license/" $spec
242
243 rm -f $preamble
244
245 diff=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
246 if ! diff -u $bak $spec > $diff; then
247         vim -o $spec $diff
248         rm -f $diff
249 else
250         echo "$spec: No diffs"
251 fi
This page took 0.094135 seconds and 3 git commands to generate.