]> git.pld-linux.org Git - packages/rpm-build-tools.git/blobdiff - pearize.sh
- bugfix
[packages/rpm-build-tools.git] / pearize.sh
index 7e7099af939d2100dbce3ae92bd306355d2cebca..cb2717c24f56100ca45fa3f8423f518212806384 100644 (file)
 #!/bin/sh
-# creates .spec using pear makerpm command.
-# requires tarball to exist in ../SOURCES.
+# updates php-pear .spec with Requires/Conflicts lines.
+# the items are added randomly to the preamble, but once added their order is left intact.
+# it is still better than nothing. if somebody wishes to add sorting in this
+# script. i'd be just glad :)
 #
+# needs 'pear' for 'pear makerpm' command, ./builder for fetching sources.
+# You should have all PEAR packages installed to get best results.
+#
+# todo: adjust similiarily noautoreqdeps
+# bugs: the beta portions in version deps could be wrong (php-4.3.0b1 and alike)
+# see php-pear-DBA_Relational.spec
+# Something strange: Requires: php-common < 4:3:5.1
+#
+# NOTE: old version of this script which was used to convert to new package format is in CVS branch MIGRATE.
+#
+# Send blames and beer\b\b\b\bideas to glen@pld-linux.org
+
 set -e
 spec="$1"
-echo "Processing $spec"
-tarball=$(rpm -q --qf '../SOURCES/%{name}-%{version}.tgz\n' --specfile "$spec" | head -n 1 | sed -e 's,php-pear-,,')
-template=$(rpm -q --qf '%{name}-%{version}.spec\n' --specfile "$spec" | head -n 1)
-
-if [ ! -f $tarball ]; then
-       ./builder -g $spec
+if [ -z "$spec" ]; then
+       echo >&2 "Usage: $0 SPECFILE"
+       exit 0
 fi
-pear makerpm $tarball
-ls -l $spec $template
-
-# adjust template
-# remove false sectons
-sed -i -e '/^%if 0/,/%endif/d' $template
-# and reversed true sections
-sed -i -e '/^%if !1/,/%endif/d' $template
-# kill consequtive blank lines
-# http://info.ccone.at/INFO/Mail-Archives/procmail/Jul-2004/msg00132.html
-sed -i -e '/./,$ !d;/^$/N;/\n$/D' $template
-
-rpm=$(rpm -q --qf '../RPMS/%{name}-%{version}-%{release}.noarch.rpm\n' --specfile "$spec" | head -n 1)
-if [ ! -f $rpm ]; then
-       rpmbuild -bb $spec
+if [ ! -f "$spec" ]; then
+       echo >&2 "$spec doesn't exist?"
+       exit 1
 fi
+echo "Processing $spec"
 
-# prepare original spec
-sed -i -e '
-# simple changes
-s/^%setup -q -c/%pear_package_setup/
-/^BuildRequires:/s/rpm-php-pearprov >= 4.0.2-98/rpm-php-pearprov >= 4.4.2-11/g
-/^%doc %{_pearname}-%{version}/d
-
-# make new %install section
-/^%install$/,/^%clean$/{
-/^%\(install\|clean\)/p
-
-/^rm -rf/{p
-a\
-install -d $RPM_BUILD_ROOT%{php_pear_dir}\
-%pear_package_install\
-
-}
-
-d
-}
-
-' $spec
-
-instdoc=$(grep '^%doc install' $template || :)
-sed -i -e "
-/%defattr(644,root,root,755)/a\
-$instdoc
-" $spec
+rc=$(awk '/^%define.*_rc/{print $NF}' $spec)
+pre=$(awk '/^%define.*_pre/{print $NF}' $spec)
+beta=$(awk '/^%define.*_beta/{print $NF}' $spec)
+tarball=$(rpm -q --qf "../SOURCES/%{name}-%{version}$rc$pre$beta.tgz\n" --specfile "$spec" | head -n 1 | sed -e 's,php-pear-,,')
 
-doc=$(grep '^%doc docs/%{_pearname}/' $template || :)
-if [ "$doc" ]; then
-sed -i -e '/^%doc/a\
-%doc docs/%{_pearname}/*
-' $spec
+if [ ! -f $tarball ]; then
+       ./builder -g "$spec"
 fi
 
-perl -pi -e '
-       if (/^%{php_pear_dir}/ && !$done) {
-               print "%{php_pear_dir}/.registry/*.reg\n";
-               $done = 1;
-       }
-' $spec
-
-if grep -q '^%files tests' $template; then
-       sed -i -e '
-/^%define.*date.*%/{
-i\
-%files tests\
-%defattr(644,root,root,755)\
-%{php_pear_dir}/tests/*\
-
+stmp=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
+cat > $stmp <<'EOF'
+@extra_headers@
+Optional: @optional@
+@optional-pkg@
+@optional-ext@
+License: @release_license@
+State: @release_state@
+EOF
+template=$(pear makerpm --spec-template=$stmp $tarball | awk '/Wrote RPM spec file/{print $NF}{print $0 > "/dev/stderr"}')
+rm -f $stmp
+
+mv $template .$template~
+template=.$template~
+
+# take as argument dependency in form NAME EQUALITY VERSION
+# adds rpm epoch to VERSION if the package is installed and has epoch bigger than zero.
+add_epoch() {
+       local dep="$@"
+       local pkg="$1"
+       local ver="$3"
+
+       # already have epoch
+       if [[ "$ver" = *:* ]]; then
+               echo "$dep"
+               return
+       fi
+
+       query=$(rpm -q --qf '%{epoch}\n' $pkg || :)
+       epoch=$(echo "$query" | grep -v 'installed' || :)
+       if [ "$epoch" ] && [ "$epoch" -gt 0 ]; then
+               echo "$dep" | sed -e "s, [<>=]\+ ,&$epoch:,"
+       else
+               echo "$dep"
+       fi
 }
 
-/^%prep/{
-i\
-%package tests\
-Summary:       Tests for PEAR::%{_pearname}\
-Summary(pl):   Testy dla PEAR::%{_pearname}\
-Group:         Development\
-Requires:      %{name} = %{epoch}:%{version}-%{release}\
-AutoReq:       no\
-\
-%description tests\
-Tests for PEAR::%{_pearname}.\
-\
-%description tests -l pl\
-Testy dla PEAR::%{_pearname}.\
+preamble=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
+# take just main package preamble, preamble of tests (and other) subpackage(s) just confuses things.
+sed -ne '/^Name:/,/^BuildRoot/p' $spec > $preamble
+
+# create backup
+bak=$(cp -fbv $spec $spec | awk '{print $NF}' | tr -d "['\`]" )
+
+# parse requires
+requires=$(grep '^Requires:' $template || :)
+if [ -n "$requires" ]; then
+       echo "$requires" | while read tag dep; do
+               dep=$(add_epoch $dep)
+               if ! grep -q "^Requires:.*$dep" $preamble; then
+                       sed -i -e "/^BuildRoot/iRequires:\t$dep" $spec
+               fi
+       done
+fi
 
-}
-' $spec
+# parse conflicts
+conflicts=$(grep '^Conflicts:' $template || :)
+if [ -n "$conflicts" ]; then
+       echo "$conflicts" | while read tag dep; do
+               dep=$(add_epoch $dep)
+               if ! grep -q "^Conflicts:.*$req" $preamble; then
+                       sed -i -e "/^BuildRoot/iConflicts:\t$dep" $spec
+               fi
+       done
 fi
 
-_noautoreq=$(grep '%define.*_noautoreq' $template || :)
-if [ "$_noautoreq" ]; then
-       sed -i -e "/^BuildRoot:/{
-a\\
-\\
-# exclude optional dependencies\\
-$_noautoreq
-}
-" $spec
+# parse optional deps
+optional=$(grep '^Optional:' $template || :)
+if [ -n "$optional" ]; then
+       echo "$optional" | while read tag dep; do
+               for req in $dep; do
+                       m=$(grep "^%define.*_noautoreq" $spec | grep -o "$req" || :)
+                       if [ -z "$m" ]; then
+                               sed -i -e "/^%define.*_noautoreq/s,$, $req," $spec
+                       fi
+               done
+       done
+fi
+has_opt=$(egrep -c '^Optional-(pkg|ext):' $template || :)
+if [ "$has_opt" -gt 0 ]; then
+       if ! grep -q optional-packages.txt $spec; then
+               sed -i -e '
+               /^%clean/{
+                       i%post
+                       iif [ -f %{_docdir}/%{name}-%{version}/optional-packages.txt ]; then
+                       i\      cat %{_docdir}/%{name}-%{version}/optional-packages.txt
+                       ifi
+                       i
+               }
+               /^%doc install.log/{
+               s/$/ optional-packages.txt/
+               }
+               ' $spec
+       fi
+fi
 
-       sed -i -e '/^%files$/{
-i\
-%post\
-if [ -f %{_docdir}/%{name}-%{version}/optional-packages.txt ]; then\
-       cat %{_docdir}/%{name}-%{version}/optional-packages.txt\
-fi\
+# parse state
+state=$(awk '/^State:/{print $2}' $template)
+sed -i -e "/^%define.*_status/{
+       /%define.*_status.*$state/!s/.*/%define\t\t_status\t\t$state/
+}" $spec
 
-}
-' $spec
+rm -f $preamble
 
+diff=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX")
+if ! diff -u $bak $spec > $diff; then
+       vim -o $spec $diff
+       rm -f $diff
+else
+       echo "$spec: No diffs"
 fi
-
-vim -o $spec $template
+#exit 1
This page took 0.047552 seconds and 4 git commands to generate.