]>
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 | |
b8f9e95a ER |
15 | RCSID='$Id$' |
16 | r=${RCSID#* * } | |
17 | rev=${r%% *} | |
b0f031e7 | 18 | VERSION="v0.35/$rev" |
b8f9e95a ER |
19 | VERSIONSTRING="\ |
20 | Adapter adapts .spec files for PLD Linux. | |
78941c1c | 21 | $VERSION (C) 1999-2009 Free Penguins". |
b8f9e95a | 22 | |
78941c1c ER |
23 | PROGRAM=${0##*/} |
24 | dir=$(d=$0; [ -L "$d" ] && d=$(readlink "$d"); dirname "$d") | |
25 | adapter=$dir/adapter.awk | |
26 | usage="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 | 40 | if [ ! -x /usr/bin/getopt ]; then |
38c3baf3 | 41 | echo >&2 "You need to install util-linux to use adapter" |
2ce02c4e | 42 | exit 1 |
cb71b7bb | 43 | fi |
2ce02c4e | 44 | |
434dadba | 45 | if [ ! -x /usr/bin/patch ]; then |
38c3baf3 | 46 | echo >&2 "You need to install patch to use adapter" |
434dadba ER |
47 | exit 1 |
48 | fi | |
49 | ||
78941c1c | 50 | t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$PROGRAM" -- "$@") || exit $? |
5dcb40f6 ER |
51 | eval set -- "$t" |
52 | ||
53 | while 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 | |
88 | done | |
89 | ||
d5f65bb3 ER |
90 | diffcol() |
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 | 107 | showdiff() |
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 |
118 | diff2hunks() |
119 | { | |
120 | # diff2hunks orignally by dig | |
121 | perl -e ' | |
122 | #! /usr/bin/perl -w | |
123 | ||
124 | use strict; | |
125 | ||
126 | for 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 | |
160 | import_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 | ||
219 | adapterize() { | |
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 |
279 | SPECFILE="$1" |
280 | [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" | |
281 | ||
282 | if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then | |
5dcb40f6 ER |
283 | echo "$usage" |
284 | exit 1 | |
3c92ff73 | 285 | fi |
286 | ||
d5f65bb3 | 287 | adapterize |
f17d6bd1 | 288 | |
289 | # vim: ts=4:sw=4 |