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