]>
Commit | Line | Data |
---|---|---|
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 | |
d2c31aee | 15 | REVISION=1.51 |
0314a444 | 16 | VERSION="v0.35/$REVISION" |
b8f9e95a ER |
17 | VERSIONSTRING="\ |
18 | Adapter adapts .spec files for PLD Linux. | |
a517c926 | 19 | $VERSION (C) 1999-2013 Free Penguins". |
b8f9e95a | 20 | |
78941c1c | 21 | PROGRAM=${0##*/} |
84f95106 | 22 | dir=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") |
78941c1c | 23 | adapter=$dir/adapter.awk |
78b27ed8 | 24 | usage="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 | 38 | if [ ! -x /usr/bin/getopt ]; then |
38c3baf3 | 39 | echo >&2 "You need to install util-linux to use adapter" |
2ce02c4e | 40 | exit 1 |
cb71b7bb | 41 | fi |
2ce02c4e | 42 | |
434dadba | 43 | if [ ! -x /usr/bin/patch ]; then |
38c3baf3 | 44 | echo >&2 "You need to install patch to use adapter" |
434dadba ER |
45 | exit 1 |
46 | fi | |
47 | ||
89b372bb | 48 | [ -n "$PAGER" ] || PAGER="/usr/bin/less -r" |
49 | ||
50 | if [ -n "$CONFIG_DIR" ]; then | |
51 | USER_CFG="$CONFIG_DIR/.adapterrc" | |
52 | elif [ -n "$HOME_ETC" ]; then | |
53 | USER_CFG="$HOME_ETC/.adapterrc" | |
54 | else | |
55 | USER_CFG=~/.adapterrc | |
56 | fi | |
57 | ||
58 | [ -f $USER_CFG ] && . $USER_CFG | |
59 | ||
78941c1c | 60 | t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$PROGRAM" -- "$@") || exit $? |
5dcb40f6 ER |
61 | eval set -- "$t" |
62 | ||
78b27ed8 | 63 | while :; 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 | |
98 | done | |
99 | ||
d5f65bb3 ER |
100 | diffcol() |
101 | { | |
3148f79c | 102 | # vim like diff colourization |
103 | LC_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 | ||
134 | diff2hunks() | |
135 | { | |
3148f79c | 136 | # diff2hunks orignally by dig |
137 | perl -e ' | |
d5f65bb3 ER |
138 | #! /usr/bin/perl -w |
139 | ||
140 | use strict; | |
141 | ||
142 | for 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 | |
176 | import_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 | |
234 | systemdtmpfilesdir | |
dfff3476 ER |
235 | " |
236 | eval_expr="" | |
237 | for macro in $macros; do | |
238 | eval_expr="$eval_expr\nexport $macro='%{$macro}'" | |
239 | done | |
240 | ||
241 | ||
242 | # get cvsaddress for changelog section | |
243 | # using rpm macros as too lazy to add ~/.adapterrc parsing support. | |
244 | eval_expr="$eval_expr | |
245 | export _cvsmaildomain='%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}' | |
246 | export _cvsmailfeedback='%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team <feedback@pld-linux.org>}' | |
247 | " | |
248 | ||
0314a444 ER |
249 | export ADAPTER_REVISION=$REVISION |
250 | ||
dfff3476 ER |
251 | eval $(rpm --eval "$(echo -e $eval_expr)") |
252 | } | |
253 | ||
254 | adapterize() { | |
78b27ed8 ER |
255 | local SPECFILE="$1" |
256 | [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" | |
257 | ||
dfff3476 | 258 | local workdir |
0314a444 | 259 | workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit $? |
faa9052b | 260 | awk=gawk |
8afece54 | 261 | |
0314a444 | 262 | local tmp=$workdir/$(basename $SPECFILE) || exit $? |
dfff3476 ER |
263 | |
264 | import_rpm_macros | |
265 | ||
0314a444 | 266 | LC_ALL=en_US.UTF-8 $awk -f $adapter $SPECFILE > $tmp || exit $? |
2864da1a | 267 | |
4da58b99 ER |
268 | if [ "$outputonly" = 1 ]; then |
269 | cat $tmp | |
270 | ||
271 | elif [ "$(diff --brief $SPECFILE $tmp)" ]; then | |
2864da1a | 272 | diff -u $SPECFILE $tmp > $tmp.diff |
8afece54 | 273 | if [ -t 1 ]; then |
89b372bb | 274 | diffcol $tmp.diff | $PAGER |
d5f65bb3 | 275 | while : ; do |
8afece54 ER |
276 | echo -n "Accept? (Yes, No, Confirm each chunk)? " |
277 | read ans | |
278 | case "$ans" in | |
279 | [yYoO]) # y0 mama | |
2864da1a | 280 | mv -f $tmp $SPECFILE |
8afece54 ER |
281 | echo "Ok, adapterized." |
282 | break | |
283 | ;; | |
284 | [cC]) # confirm each chunk | |
2864da1a ER |
285 | diff2hunks $tmp.diff |
286 | for t in $(ls $tmp-*.diff); do | |
89b372bb | 287 | diffcol $t | $PAGER |
4f4ec912 | 288 | echo -n "Accept? (Yes, [N]o, Quit)? " |
d5f65bb3 ER |
289 | read ans |
290 | case "$ans" in | |
291 | [yYoO]) # y0 mama | |
f17d6bd1 | 292 | patch -p0 < $t |
d5f65bb3 | 293 | ;; |
8afece54 | 294 | [Q]) # Abort |
4f4ec912 ER |
295 | break |
296 | ;; | |
d5f65bb3 | 297 | esac |
8afece54 ER |
298 | done |
299 | break | |
300 | ;; | |
301 | [QqnNsS]) | |
302 | echo "Ok, exiting." | |
303 | break | |
304 | ;; | |
305 | esac | |
d5f65bb3 | 306 | done |
8afece54 | 307 | else |
2864da1a | 308 | cat $tmp.diff |
8afece54 ER |
309 | fi |
310 | else | |
78b27ed8 | 311 | echo "The spec $SPECFILE is perfect ;)" |
8afece54 | 312 | fi |
d5f65bb3 | 313 | |
dfff3476 | 314 | rm -rf $workdir |
d5f65bb3 ER |
315 | } |
316 | ||
78b27ed8 | 317 | if [ $# -eq 0 ]; then |
5dcb40f6 ER |
318 | echo "$usage" |
319 | exit 1 | |
3c92ff73 | 320 | fi |
321 | ||
78b27ed8 ER |
322 | for SPECFILE in "$@"; do |
323 | adapterize $SPECFILE | |
324 | done | |
f17d6bd1 | 325 | |
326 | # vim: ts=4:sw=4 |