]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - adapter.sh
- man.szczecin.pl unresponsive
[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
743ddbbb 15REVISION=1.52
0314a444 16VERSION="v0.35/$REVISION"
b8f9e95a
ER
17VERSIONSTRING="\
18Adapter adapts .spec files for PLD Linux.
a517c926 19$VERSION (C) 1999-2013 Free Penguins".
b8f9e95a 20
78941c1c 21PROGRAM=${0##*/}
84f95106 22dir=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d")
78941c1c 23adapter=$dir/adapter.awk
78b27ed8 24usage="Usage: $PROGRAM [FLAGS] SPECFILEs
0de62947
ER
25
26-s|--no-sort|--skip-sort
27 skip BuildRequires, Requires sorting
28-m|--no-macros|--skip-macros
29 skip use_macros() substitutions
30-d|--skip-desc
31 skip desc wrapping
32-a|--skip-defattr
33 skip %defattr corrections
4da58b99
ER
34-o
35 do not do any diffing, just dump the output
0de62947 36"
2ce02c4e 37
cb71b7bb 38if [ ! -x /usr/bin/getopt ]; then
38c3baf3 39 echo >&2 "You need to install util-linux to use adapter"
2ce02c4e 40 exit 1
cb71b7bb 41fi
2ce02c4e 42
434dadba 43if [ ! -x /usr/bin/patch ]; then
38c3baf3 44 echo >&2 "You need to install patch to use adapter"
434dadba
ER
45 exit 1
46fi
47
89b372bb 48[ -n "$PAGER" ] || PAGER="/usr/bin/less -r"
49
50if [ -n "$CONFIG_DIR" ]; then
51 USER_CFG="$CONFIG_DIR/.adapterrc"
52elif [ -n "$HOME_ETC" ]; then
53 USER_CFG="$HOME_ETC/.adapterrc"
54else
55 USER_CFG=~/.adapterrc
56fi
57
58[ -f $USER_CFG ] && . $USER_CFG
59
78941c1c 60t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$PROGRAM" -- "$@") || exit $?
5dcb40f6
ER
61eval set -- "$t"
62
78b27ed8 63while :; do
5dcb40f6
ER
64 case "$1" in
65 -h|--help)
3148f79c 66 echo 2>&1 "$usage"
5dcb40f6
ER
67 exit 1
68 ;;
0de62947
ER
69 -s|--no-sort|--skip-sort)
70 export SKIP_SORTBR=1
5dcb40f6 71 ;;
ff9e2987
ER
72 -m|--no-macros|--skip-macros)
73 export SKIP_MACROS=1
74 ;;
75 -d|--skip-desc)
76 export SKIP_DESC=1
77 ;;
78 -a|--skip-defattr)
79 export SKIP_DEFATTR=1
80 ;;
b8f9e95a
ER
81 -V|--version)
82 echo "$VERSIONSTRING"
83 exit 0
4da58b99
ER
84 ;;
85 -o)
86 outputonly=1
b8f9e95a 87 ;;
5dcb40f6
ER
88 --)
89 shift
8afece54 90 break
5dcb40f6
ER
91 ;;
92 *)
78941c1c 93 echo >&2 "$PROGRAM: Internal error: \`$1' not recognized!"
5dcb40f6 94 exit 1
8afece54 95 ;;
5dcb40f6
ER
96 esac
97 shift
98done
99
d5f65bb3
ER
100diffcol()
101{
3148f79c 102 # vim like diff colourization
103LC_ALL=en_US.UTF-8 gawk ' {
104 split( $0, S, /\t/ );
105 $0 = S[ 1 ];
106 for ( i = 2; i in S; i++ ) {
107 spaces = 7 - ( (length( $0 ) - 1) % 8 );
108 $0 = $0 "\xE2\x9E\x94";
109 for ( y = 0; y < spaces; y++ )
110 $0 = $0 "\xE2\x87\xBE";
111 $0 = $0 S[ i ];
112 }
113 gsub( /\033/, "\033[44m^[\033[49m" );
114 cmd = "";
115 if ( sub( /^ /, "" ) )
116 cmd = " ";
117 sub( /(\xE2\x9E\x94(\xE2\x87\xBE)*| )+$/, "\033[31;41m&\033[39;49m" );
118 gsub( /\xE2\x9E\x94(\xE2\x87\xBE)*/, "\033[7m&\033[27m" );
119 gsub( /\xE2\x87\xBE/, " " );
120 # uncomment if you do not like utf-8 arrow
121 # gsub( /\xE2\x9E\x94/, ">" );
122 $0 = cmd $0;
123 gsub( /\007/, "\033[44m^G\033[49m" );
124 gsub( /\r/, "\033[44m^M\033[49m" );
125}
126/^(Index:|diff|---|\+\+\+) / { $0 = "\033[32m" $0 }
127/^@@ / { $0 = "\033[33m" $0 }
128/^-/ { $0 = "\033[35m" $0 }
129/^+/ { $0 = "\033[36m" $0 }
130{ $0 = $0 "\033[0m"; print }
131' "$@"
d5f65bb3
ER
132}
133
134diff2hunks()
135{
3148f79c 136 # diff2hunks orignally by dig
137 perl -e '
d5f65bb3
ER
138#! /usr/bin/perl -w
139
140use strict;
141
142for my $filename (@ARGV) {
8afece54
ER
143 my $counter = 1;
144 my $fh;
145 open $fh, "<", $filename or die "$filename: open for reading: $!";
146 my @lines = <$fh>;
147 my @hunks;
148 my @curheader;
149 for my $i (0 ... $#lines) {
150 next unless $lines[$i] =~ m/^\@\@ /;
151 if ($i >= 2 and $lines[$i - 2] =~ m/^--- / and $lines[$i - 1] =~ m/^\+\+\+ /) {
152 @curheader = @lines[$i - 2 ... $i - 1];
153 }
154 next unless @curheader;
155 my $j = $i + 1;
156 while ($j < @lines and $lines[$j] !~ m/^\@\@ /) {$j++}
157 $j -= 2
158 if $j >= 3 and $j < @lines
159 and $lines[$j - 2] =~ m/^--- /
160 and $lines[$j - 1] =~ m/^\+\+\+ /;
161 $j--;
162 $j-- until $lines[$j] =~ m/^[ @+-]/;
163 my $hunkfilename = $filename;
164 $hunkfilename =~ s/((\.(pat(ch)?|diff?))?)$/"-".sprintf("%03i",$counter++).$1/ei;
165 my $ofh;
166 open $ofh, ">", $hunkfilename or die "$hunkfilename: open for writing: $!";
167 print $ofh @curheader, @lines[$i ... $j];
168 close $ofh;
169 }
d5f65bb3
ER
170}
171' "$@"
172}
173
dfff3476
ER
174# import selected macros for adapter.awk
175# you should update the list also in adapter.awk when making changes here
176import_rpm_macros() {
177 macros="
202b96a2 178 _topdir
dfff3476
ER
179 _prefix
180 _bindir
181 _sbindir
182 _libdir
183 _sysconfdir
184 _datadir
185 _includedir
186 _mandir
187 _infodir
188 _examplesdir
189 _defaultdocdir
190 _kdedocdir
191 _gtkdocdir
192 _desktopdir
193 _pixmapsdir
194 _javadir
0314a444 195 _pkgconfigdir
36a00f28 196 _npkgconfigdir
639225be 197 _localedir
dfff3476
ER
198
199 perl_sitearch
200 perl_archlib
201 perl_privlib
202 perl_vendorlib
203 perl_vendorarch
204 perl_sitelib
205
206 py_sitescriptdir
207 py_sitedir
208 py_scriptdir
209 py_ver
210
70661105
ER
211 py3_sitescriptdir
212 py3_sitedir
213 py3_scriptdir
214 py3_ver
215
dfff3476 216 ruby_archdir
a517c926
ER
217 ruby_libdir
218 ruby_sitedir
dfff3476
ER
219 ruby_sitearchdir
220 ruby_sitelibdir
a517c926
ER
221 ruby_vendordir
222 ruby_vendorarchdir
223 ruby_vendorlibdir
224 ruby_rubylibdir
5fbedd3e 225 ruby_rdocdir
a517c926 226 ruby_ridir
d2c31aee 227 ruby_specdir
dfff3476
ER
228
229 php_pear_dir
230 php_data_dir
231 tmpdir
99956d12
JR
232
233 systemdunitdir
743ddbbb 234 systemduserunitdir
99956d12 235 systemdtmpfilesdir
dfff3476
ER
236"
237 eval_expr=""
238 for macro in $macros; do
239 eval_expr="$eval_expr\nexport $macro='%{$macro}'"
240 done
241
242
243 # get cvsaddress for changelog section
244 # using rpm macros as too lazy to add ~/.adapterrc parsing support.
245 eval_expr="$eval_expr
246 export _cvsmaildomain='%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}'
247 export _cvsmailfeedback='%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team <feedback@pld-linux.org>}'
248 "
249
0314a444
ER
250 export ADAPTER_REVISION=$REVISION
251
dfff3476
ER
252 eval $(rpm --eval "$(echo -e $eval_expr)")
253}
254
255adapterize() {
78b27ed8
ER
256 local SPECFILE="$1"
257 [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec"
258
dfff3476 259 local workdir
0314a444 260 workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit $?
faa9052b 261 awk=gawk
8afece54 262
0314a444 263 local tmp=$workdir/$(basename $SPECFILE) || exit $?
dfff3476
ER
264
265 import_rpm_macros
266
0314a444 267 LC_ALL=en_US.UTF-8 $awk -f $adapter $SPECFILE > $tmp || exit $?
2864da1a 268
4da58b99
ER
269 if [ "$outputonly" = 1 ]; then
270 cat $tmp
271
272 elif [ "$(diff --brief $SPECFILE $tmp)" ]; then
2864da1a 273 diff -u $SPECFILE $tmp > $tmp.diff
8afece54 274 if [ -t 1 ]; then
89b372bb 275 diffcol $tmp.diff | $PAGER
d5f65bb3 276 while : ; do
8afece54
ER
277 echo -n "Accept? (Yes, No, Confirm each chunk)? "
278 read ans
279 case "$ans" in
280 [yYoO]) # y0 mama
2864da1a 281 mv -f $tmp $SPECFILE
8afece54
ER
282 echo "Ok, adapterized."
283 break
284 ;;
285 [cC]) # confirm each chunk
2864da1a
ER
286 diff2hunks $tmp.diff
287 for t in $(ls $tmp-*.diff); do
89b372bb 288 diffcol $t | $PAGER
4f4ec912 289 echo -n "Accept? (Yes, [N]o, Quit)? "
d5f65bb3
ER
290 read ans
291 case "$ans" in
292 [yYoO]) # y0 mama
f17d6bd1 293 patch -p0 < $t
d5f65bb3 294 ;;
8afece54 295 [Q]) # Abort
4f4ec912
ER
296 break
297 ;;
d5f65bb3 298 esac
8afece54
ER
299 done
300 break
301 ;;
302 [QqnNsS])
303 echo "Ok, exiting."
304 break
305 ;;
306 esac
d5f65bb3 307 done
8afece54 308 else
2864da1a 309 cat $tmp.diff
8afece54
ER
310 fi
311 else
78b27ed8 312 echo "The spec $SPECFILE is perfect ;)"
8afece54 313 fi
d5f65bb3 314
dfff3476 315 rm -rf $workdir
d5f65bb3
ER
316}
317
78b27ed8 318if [ $# -eq 0 ]; then
5dcb40f6
ER
319 echo "$usage"
320 exit 1
3c92ff73 321fi
322
78b27ed8
ER
323for SPECFILE in "$@"; do
324 adapterize $SPECFILE
325done
f17d6bd1 326
327# vim: ts=4:sw=4
This page took 0.1074 seconds and 4 git commands to generate.