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