]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - adapter.sh
- allow $CVS_COMMAND from env too not just ~/.builderrc
[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%% *}
18VERSION="v0.31/$rev"
19VERSIONSTRING="\
20Adapter adapts .spec files for PLD Linux.
21$VERSION (C) 1999-2008 Free Penguins".
22
5dcb40f6 23self=$(basename "$0")
cc0b76cd 24adapter=$(dirname "$0")/adapter.awk
0de62947
ER
25usage="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
4da58b99
ER
35-o
36 do not do any diffing, just dump the output
0de62947 37"
2ce02c4e 38
cb71b7bb 39if [ ! -x /usr/bin/getopt ]; then
2ce02c4e
ER
40 echo >&1 "You need to install util-linux to use adapter"
41 exit 1
cb71b7bb 42fi
2ce02c4e 43
434dadba
ER
44if [ ! -x /usr/bin/patch ]; then
45 echo >&1 "You need to install patch to use adapter"
46 exit 1
47fi
48
4da58b99 49t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$self" -- "$@") || exit $?
5dcb40f6
ER
50eval set -- "$t"
51
52while true; do
53 case "$1" in
54 -h|--help)
55 echo 2>&1 "$usage"
56 exit 1
57 ;;
0de62947
ER
58 -s|--no-sort|--skip-sort)
59 export SKIP_SORTBR=1
5dcb40f6 60 ;;
ff9e2987
ER
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 ;;
b8f9e95a
ER
70 -V|--version)
71 echo "$VERSIONSTRING"
72 exit 0
4da58b99
ER
73 ;;
74 -o)
75 outputonly=1
b8f9e95a 76 ;;
5dcb40f6
ER
77 --)
78 shift
8afece54 79 break
5dcb40f6
ER
80 ;;
81 *)
82 echo 2>&1 "$self: Internal error: [$1] not recognized!"
83 exit 1
8afece54 84 ;;
5dcb40f6
ER
85 esac
86 shift
87done
88
d5f65bb3
ER
89diffcol()
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&,;
65b4350a 99 s,\r,\e[44m^M\e[49m,g;
d5f65bb3
ER
100 s, , ,g;
101 s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\e[41m\2\e[49m,g;
102 s,$,\e[0m,
103 ' "$@"
104}
105
106diff2hunks()
107{
108 # diff2hunks orignally by dig
109 perl -e '
110#! /usr/bin/perl -w
111
112use strict;
113
114for my $filename (@ARGV) {
8afece54
ER
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 }
d5f65bb3
ER
142}
143' "$@"
144}
145
dfff3476
ER
146# import selected macros for adapter.awk
147# you should update the list also in adapter.awk when making changes here
148import_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
5fbedd3e 185 ruby_rdocdir
dfff3476
ER
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
207adapterize() {
208 local workdir
209 workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit
8afece54
ER
210 if grep -q '\.UTF-8' $SPECFILE; then
211 awk=gawk
212 else
213 awk=awk
214 fi
8afece54 215
dfff3476
ER
216 local tmp=$workdir/$(basename $SPECFILE) || exit
217
218 import_rpm_macros
219
2864da1a
ER
220 $awk -f $adapter $SPECFILE > $tmp || exit
221
4da58b99
ER
222 if [ "$outputonly" = 1 ]; then
223 cat $tmp
224
225 elif [ "$(diff --brief $SPECFILE $tmp)" ]; then
2864da1a 226 diff -u $SPECFILE $tmp > $tmp.diff
8afece54 227 if [ -t 1 ]; then
2864da1a 228 diffcol $tmp.diff | less -r
d5f65bb3 229 while : ; do
8afece54
ER
230 echo -n "Accept? (Yes, No, Confirm each chunk)? "
231 read ans
232 case "$ans" in
233 [yYoO]) # y0 mama
2864da1a 234 mv -f $tmp $SPECFILE
8afece54
ER
235 echo "Ok, adapterized."
236 break
237 ;;
238 [cC]) # confirm each chunk
2864da1a
ER
239 diff2hunks $tmp.diff
240 for t in $(ls $tmp-*.diff); do
d5f65bb3 241 diffcol $t | less -r
4f4ec912 242 echo -n "Accept? (Yes, [N]o, Quit)? "
d5f65bb3
ER
243 read ans
244 case "$ans" in
245 [yYoO]) # y0 mama
246 patch < $t
247 ;;
8afece54 248 [Q]) # Abort
4f4ec912
ER
249 break
250 ;;
d5f65bb3 251 esac
8afece54
ER
252 done
253 break
254 ;;
255 [QqnNsS])
256 echo "Ok, exiting."
257 break
258 ;;
259 esac
d5f65bb3 260 done
8afece54 261 else
2864da1a 262 cat $tmp.diff
8afece54
ER
263 fi
264 else
265 echo "The SPEC is perfect ;)"
266 fi
d5f65bb3 267
dfff3476 268 rm -rf $workdir
d5f65bb3
ER
269}
270
9ec85f5b
AG
271SPECFILE="$1"
272[ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec"
273
274if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then
5dcb40f6
ER
275 echo "$usage"
276 exit 1
3c92ff73 277fi
278
d5f65bb3 279adapterize
This page took 0.2357 seconds and 4 git commands to generate.