]>
Commit | Line | Data |
---|---|---|
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 makerpm' command, ./builder for fetching sources. | |
8 | # You should have all PEAR packages installed to get best results. | |
9 | # | |
10 | # todo: adjust similiarily noautoreqdeps | |
11 | # bugs: the beta portions in version deps could be wrong (php-4.3.0b1 and alike) | |
12 | # see php-pear-DBA_Relational.spec | |
13 | # Something strange: Requires: php-common < 4:3:5.1 | |
14 | # | |
15 | # NOTE: old version of this script which was used to convert to new package format is in CVS branch MIGRATE. | |
16 | # | |
17 | # Send blames and beer\b\b\b\bideas to glen@pld-linux.org | |
18 | ||
19 | set -e | |
20 | spec="$1" | |
21 | if [ -z "$spec" ]; then | |
22 | echo >&2 "Usage: $0 SPECFILE" | |
23 | exit 0 | |
24 | fi | |
25 | if [ ! -f "$spec" ]; then | |
26 | echo >&2 "$spec doesn't exist?" | |
27 | exit 1 | |
28 | fi | |
29 | echo "Processing $spec" | |
30 | ||
31 | getsource() { | |
32 | local spec="$1" | |
33 | local NR="$2" | |
34 | rpmbuild --nodigest --nosignature -bp --define 'prep %dump' $spec 2>&1 | awk "/SOURCE$NR\t/ {print \$3}" | |
35 | } | |
36 | ||
37 | tarball=$(getsource $spec 0) | |
38 | ||
39 | if [ ! -f $tarball ]; then | |
40 | ./builder -g "$spec" | |
41 | fi | |
42 | ||
43 | stmp=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX") | |
44 | cat > $stmp <<'EOF' | |
45 | @extra_headers@ | |
46 | Optional: @optional@ | |
47 | @optional-pkg@ | |
48 | @optional-ext@ | |
49 | License: @release_license@ | |
50 | State: @release_state@ | |
51 | EOF | |
52 | pear makerpm --spec-template=$stmp --rpm-pkgname=pearize $tarball | |
53 | template=pearize.spec | |
54 | rm -f $stmp | |
55 | ||
56 | mv $template .$template~ | |
57 | template=.$template~ | |
58 | ||
59 | # take as argument dependency in form NAME EQUALITY VERSION | |
60 | # adds rpm epoch to VERSION if the package is installed and has epoch bigger than zero. | |
61 | add_epoch() { | |
62 | local dep="$@" | |
63 | local pkg="$1" | |
64 | local ver="$3" | |
65 | ||
66 | # already have epoch | |
67 | if [[ "$ver" = *:* ]]; then | |
68 | echo "$dep" | |
69 | return | |
70 | fi | |
71 | ||
72 | query=$(rpm -q --qf '%{epoch}\n' $pkg || :) | |
73 | epoch=$(echo "$query" | grep -v 'installed' || :) | |
74 | if [ "$epoch" ] && [ "$epoch" -gt 0 ]; then | |
75 | echo "$dep" | sed -e "s, [<>=]\+ ,&$epoch:," | |
76 | else | |
77 | echo "$dep" | |
78 | fi | |
79 | } | |
80 | ||
81 | preamble=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX") | |
82 | # take just main package preamble, preamble of tests (and other) subpackage(s) just confuses things. | |
83 | sed -ne '/^Name:/,/^BuildRoot/p' $spec > $preamble | |
84 | ||
85 | # create backup | |
86 | bak=$(cp -fbv $spec $spec | awk '{print $NF}' | tr -d "['\`]" ) | |
87 | ||
88 | # parse requires | |
89 | requires=$(grep '^Requires:' $template || :) | |
90 | if [ -n "$requires" ]; then | |
91 | echo "$requires" | while read tag dep; do | |
92 | dep=$(add_epoch $dep) | |
93 | if ! grep -q "^Requires:.*$dep" $preamble; then | |
94 | sed -i -e "/^BuildRoot/iRequires:\t$dep" $spec | |
95 | fi | |
96 | done | |
97 | fi | |
98 | ||
99 | # parse conflicts | |
100 | conflicts=$(grep '^Conflicts:' $template || :) | |
101 | if [ -n "$conflicts" ]; then | |
102 | echo "$conflicts" | while read tag dep; do | |
103 | dep=$(add_epoch $dep) | |
104 | if ! grep -q "^Conflicts:.*$req" $preamble; then | |
105 | sed -i -e "/^BuildRoot/iConflicts:\t$dep" $spec | |
106 | fi | |
107 | done | |
108 | fi | |
109 | ||
110 | # parse optional deps | |
111 | optional=$(grep '^Optional:' $template || :) | |
112 | if [ -n "$optional" ]; then | |
113 | echo "$optional" | while read tag dep; do | |
114 | for req in $dep; do | |
115 | m=$(grep "^%define.*_noautoreq" $spec | grep -o "$req" || :) | |
116 | if [ -z "$m" ]; then | |
117 | sed -i -e "/^%define.*_noautoreq/s,$, $req," $spec | |
118 | fi | |
119 | done | |
120 | done | |
121 | fi | |
122 | has_opt=$(egrep -c '^Optional-(pkg|ext):' $template || :) | |
123 | if [ "$has_opt" -gt 0 ]; then | |
124 | if ! grep -q optional-packages.txt $spec; then | |
125 | sed -i -e ' | |
126 | /^%clean/{ | |
127 | i%post | |
128 | iif [ -f %{_docdir}/%{name}-%{version}/optional-packages.txt ]; then | |
129 | i\ cat %{_docdir}/%{name}-%{version}/optional-packages.txt | |
130 | ifi | |
131 | i | |
132 | } | |
133 | /^%doc install.log/{ | |
134 | s/$/ optional-packages.txt/ | |
135 | } | |
136 | ' $spec | |
137 | fi | |
138 | fi | |
139 | ||
140 | # parse state | |
141 | state=$(awk '/^State:/{print $2}' $template) | |
142 | sed -i -e "/^%define.*_status/{ | |
143 | /%define.*_status.*$state/!s/.*/%define\t\t_status\t\t$state/ | |
144 | }" $spec | |
145 | ||
146 | rm -f $preamble | |
147 | ||
148 | diff=$(mktemp "${TMPDIR:-/tmp}/fragXXXXXX") | |
149 | if ! diff -u $bak $spec > $diff; then | |
150 | vim -o $spec $diff | |
151 | rm -f $diff | |
152 | else | |
153 | echo "$spec: No diffs" | |
154 | fi | |
155 | #exit 1 |