]> git.pld-linux.org Git - packages/adapter.git/blob - adapter.sh
- import rpm macros in one rpm invocation (via env from shell)
[packages/adapter.git] / adapter.sh
1 #!/bin/sh
2 #
3 # Authors:
4 #       Michał Kuratczyk <kura@pld.org.pl>
5 #       Sebastian Zagrodzki <s.zagrodzki@mimuw.edu.pl>
6 #       Tomasz Kłoczko <kloczek@rudy.mif.pg.gda.pl>
7 #       Artur Frysiak <wiget@pld-linux.org>
8 #       Michal Kochanowicz <mkochano@pld.org.pl>
9 #       Elan Ruusamäe <glen@pld-linux.org>
10 #
11 # See cvs log adapter{,.awk} for list of contributors
12 #
13 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
14
15 RCSID='$Id$'
16 r=${RCSID#* * }
17 rev=${r%% *}
18 VERSION="v0.31/$rev"
19 VERSIONSTRING="\
20 Adapter adapts .spec files for PLD Linux.
21 $VERSION (C) 1999-2008 Free Penguins".
22
23 self=$(basename "$0")
24 adapter=$(dirname "$0")/adapter.awk
25 usage="Usage: $self [FLAGS] SPECFILE
26
27 -s|--no-sort|--skip-sort
28         skip BuildRequires, Requires sorting
29 -m|--no-macros|--skip-macros
30         skip use_macros() substitutions
31 -d|--skip-desc
32         skip desc wrapping
33 -a|--skip-defattr
34         skip %defattr corrections
35
36 "
37
38 if [ ! -x /usr/bin/getopt ]; then
39         echo >&1 "You need to install util-linux to use adapter"
40         exit 1
41 fi
42
43 if [ ! -x /usr/bin/patch ]; then
44         echo >&1 "You need to install patch to use adapter"
45         exit 1
46 fi
47
48 t=$(getopt -o hsmdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$self" -- "$@") || exit $?
49 eval set -- "$t"
50
51 while true; do
52         case "$1" in
53         -h|--help)
54                 echo 2>&1 "$usage"
55                 exit 1
56         ;;
57         -s|--no-sort|--skip-sort)
58                 export SKIP_SORTBR=1
59         ;;
60         -m|--no-macros|--skip-macros)
61                 export SKIP_MACROS=1
62         ;;
63         -d|--skip-desc)
64                 export SKIP_DESC=1
65         ;;
66         -a|--skip-defattr)
67                 export SKIP_DEFATTR=1
68         ;;
69         -V|--version)
70                 echo "$VERSIONSTRING"
71                 exit 0
72         ;;
73         --)
74                 shift
75                 break
76         ;;
77         *)
78                 echo 2>&1 "$self: Internal error: [$1] not recognized!"
79                 exit 1
80                 ;;
81         esac
82         shift
83 done
84
85 diffcol()
86 {
87          # vim like diff colourization
88          sed -e '
89          s,\e,\e[44m^[\e[49m,g;
90          s,\a,\e[44m^G\e[49m,g;
91          s,^\(Index:\|diff\|---\|+++\) .*$,\e[32m&,;
92          s,^@@ ,\e[33m&,g;
93          s,^-,\e[35m&,;
94          s,^+,\e[36m&,;
95          s,\r,\e[44m^M\e[49m,g;
96          s,     ,    ,g;
97          s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\e[41m\2\e[49m,g;
98          s,$,\e[0m,
99          ' "$@"
100 }
101
102 diff2hunks()
103 {
104          # diff2hunks orignally by dig
105          perl -e '
106 #! /usr/bin/perl -w
107
108 use strict;
109
110 for my $filename (@ARGV) {
111         my $counter = 1;
112         my $fh;
113         open $fh, "<", $filename or die "$filename: open for reading: $!";
114         my @lines = <$fh>;
115         my @hunks;
116         my @curheader;
117         for my $i (0 ... $#lines) {
118                 next unless $lines[$i] =~ m/^\@\@ /;
119                 if ($i >= 2 and $lines[$i - 2] =~ m/^--- / and $lines[$i - 1] =~ m/^\+\+\+ /) {
120                         @curheader = @lines[$i - 2 ... $i - 1];
121                 }
122                 next unless @curheader;
123                 my $j = $i + 1;
124                 while ($j < @lines and $lines[$j] !~ m/^\@\@ /) {$j++}
125                 $j -= 2
126                         if $j >= 3 and $j < @lines
127                                 and $lines[$j - 2] =~ m/^--- /
128                                 and $lines[$j - 1] =~ m/^\+\+\+ /;
129                 $j--;
130                 $j-- until $lines[$j] =~ m/^[ @+-]/;
131                 my $hunkfilename = $filename;
132                 $hunkfilename =~ s/((\.(pat(ch)?|diff?))?)$/"-".sprintf("%03i",$counter++).$1/ei;
133                 my $ofh;
134                 open $ofh, ">", $hunkfilename or die "$hunkfilename: open for writing: $!";
135                 print $ofh @curheader, @lines[$i ... $j];
136                 close $ofh;
137         }
138 }
139 ' "$@"
140 }
141
142 # import selected macros for adapter.awk
143 # you should update the list also in adapter.awk when making changes here
144 import_rpm_macros() {
145         macros="
146         _sourcedir
147         _prefix
148         _bindir
149         _sbindir
150         _libdir
151         _sysconfdir
152         _datadir
153         _includedir
154         _mandir
155         _infodir
156         _examplesdir
157         _defaultdocdir
158         _kdedocdir
159         _gtkdocdir
160         _desktopdir
161         _pixmapsdir
162         _javadir
163
164         perl_sitearch
165         perl_archlib
166         perl_privlib
167         perl_vendorlib
168         perl_vendorarch
169         perl_sitelib
170
171         py_sitescriptdir
172         py_sitedir
173         py_scriptdir
174         py_ver
175
176         ruby_archdir
177         ruby_ridir
178         ruby_rubylibdir
179         ruby_sitearchdir
180         ruby_sitelibdir
181
182         php_pear_dir
183         php_data_dir
184         tmpdir
185 "
186         eval_expr=""
187         for macro in $macros; do
188                 eval_expr="$eval_expr\nexport $macro='%{$macro}'"
189         done
190
191
192         # get cvsaddress for changelog section
193         # using rpm macros as too lazy to add ~/.adapterrc parsing support.
194         eval_expr="$eval_expr
195         export _cvsmaildomain='%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}'
196         export _cvsmailfeedback='%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team <feedback@pld-linux.org>}'
197         "
198
199         eval $(rpm --eval "$(echo -e $eval_expr)")
200 }
201
202 adapterize() {
203         local workdir
204         workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit
205         if grep -q '\.UTF-8' $SPECFILE; then
206                 awk=gawk
207         else
208                 awk=awk
209         fi
210
211         local tmp=$workdir/$(basename $SPECFILE) || exit
212
213         import_rpm_macros
214
215         $awk -f $adapter $SPECFILE > $tmp || exit
216
217         if [ "$(diff --brief $SPECFILE $tmp)" ]; then
218                 diff -u $SPECFILE $tmp > $tmp.diff
219                 if [ -t 1 ]; then
220                                 diffcol $tmp.diff | less -r
221                                 while : ; do
222                                         echo -n "Accept? (Yes, No, Confirm each chunk)? "
223                                         read ans
224                                         case "$ans" in
225                                         [yYoO]) # y0 mama
226                                                 mv -f $tmp $SPECFILE
227                                                 echo "Ok, adapterized."
228                                                 break
229                                         ;;
230                                         [cC]) # confirm each chunk
231                                                 diff2hunks $tmp.diff
232                                                 for t in $(ls $tmp-*.diff); do
233                                                                 diffcol $t | less -r
234                                                                 echo -n "Accept? (Yes, [N]o, Quit)? "
235                                                                 read ans
236                                                                 case "$ans" in
237                                                                 [yYoO]) # y0 mama
238                                                                         patch < $t
239                                                                         ;;
240                                                                 [Q]) # Abort
241                                                                         break
242                                                                         ;;
243                                                                 esac
244                                                 done
245                                                 break
246                                         ;;
247                                         [QqnNsS])
248                                                 echo "Ok, exiting."
249                                                 break
250                                         ;;
251                                         esac
252                                 done
253                 else
254                                 cat $tmp.diff
255                 fi
256         else
257                 echo "The SPEC is perfect ;)"
258         fi
259
260         rm -rf $workdir
261 }
262
263 SPECFILE="$1"
264 [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec"
265
266 if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then
267         echo "$usage"
268         exit 1
269 fi
270
271 adapterize
This page took 0.088799 seconds and 4 git commands to generate.