]>
Commit | Line | Data |
---|---|---|
d1c51977 | 1 | #!/bin/sh |
115a3045 | 2 | # |
115a3045 | 3 | # Authors: |
b4e337d9 | 4 | # Michał Kuratczyk <kura@pld.org.pl> |
115a3045 | 5 | # Sebastian Zagrodzki <s.zagrodzki@mimuw.edu.pl> |
b4e337d9 | 6 | # Tomasz Kłoczko <kloczek@rudy.mif.pg.gda.pl> |
115a3045 ER |
7 | # Artur Frysiak <wiget@pld-linux.org> |
8 | # Michal Kochanowicz <mkochano@pld.org.pl> | |
b4e337d9 | 9 | # Elan Ruusamäe <glen@pld-linux.org> |
115a3045 ER |
10 | # |
11 | # See cvs log adapter{,.awk} for list of contributors | |
12 | # | |
13 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | |
de8cc9a2 | 14 | |
18f95017 ER |
15 | RCSID='$Id$' |
16 | r=${RCSID#* * } | |
17 | rev=${r%% *} | |
18 | VERSION="v0.31/$rev" | |
19 | VERSIONSTRING="\ | |
20 | Adapter adapts .spec files for PLD Linux. | |
21 | $VERSION (C) 1999-2008 Free Penguins". | |
22 | ||
ea91b16c | 23 | self=$(basename "$0") |
9f10696c | 24 | adapter=$(dirname "$0")/adapter.awk |
bd6bff92 ER |
25 | usage="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 | |
deb09aaa ER |
35 | -o |
36 | do not do any diffing, just dump the output | |
bd6bff92 | 37 | " |
af0e64d6 | 38 | |
6668d124 | 39 | if [ ! -x /usr/bin/getopt ]; then |
937febc5 | 40 | echo >&2 "You need to install util-linux to use adapter" |
af0e64d6 | 41 | exit 1 |
6668d124 | 42 | fi |
af0e64d6 | 43 | |
d26e80ce | 44 | if [ ! -x /usr/bin/patch ]; then |
937febc5 | 45 | echo >&2 "You need to install patch to use adapter" |
d26e80ce ER |
46 | exit 1 |
47 | fi | |
48 | ||
deb09aaa | 49 | t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$self" -- "$@") || exit $? |
ea91b16c ER |
50 | eval set -- "$t" |
51 | ||
52 | while true; do | |
53 | case "$1" in | |
54 | -h|--help) | |
55 | echo 2>&1 "$usage" | |
56 | exit 1 | |
57 | ;; | |
bd6bff92 ER |
58 | -s|--no-sort|--skip-sort) |
59 | export SKIP_SORTBR=1 | |
ea91b16c | 60 | ;; |
13b24a87 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 | ;; | |
18f95017 ER |
70 | -V|--version) |
71 | echo "$VERSIONSTRING" | |
72 | exit 0 | |
deb09aaa ER |
73 | ;; |
74 | -o) | |
75 | outputonly=1 | |
18f95017 | 76 | ;; |
ea91b16c ER |
77 | --) |
78 | shift | |
c6185e54 | 79 | break |
ea91b16c ER |
80 | ;; |
81 | *) | |
937febc5 | 82 | echo >&2 "$self: Internal error: [$1] not recognized!" |
ea91b16c | 83 | exit 1 |
c6185e54 | 84 | ;; |
ea91b16c ER |
85 | esac |
86 | shift | |
87 | done | |
88 | ||
115a3045 ER |
89 | diffcol() |
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&,; | |
844f76c1 | 99 | s,\r,\e[44m^M\e[49m,g; |
115a3045 ER |
100 | s, , ,g; |
101 | s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\e[41m\2\e[49m,g; | |
102 | s,$,\e[0m, | |
103 | ' "$@" | |
104 | } | |
105 | ||
106 | diff2hunks() | |
107 | { | |
108 | # diff2hunks orignally by dig | |
109 | perl -e ' | |
110 | #! /usr/bin/perl -w | |
111 | ||
112 | use strict; | |
113 | ||
114 | for my $filename (@ARGV) { | |
c6185e54 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 | } | |
115a3045 ER |
142 | } |
143 | ' "$@" | |
144 | } | |
145 | ||
683ce9e3 ER |
146 | # import selected macros for adapter.awk |
147 | # you should update the list also in adapter.awk when making changes here | |
148 | import_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 | |
51847161 | 185 | ruby_rdocdir |
683ce9e3 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 | ||
207 | adapterize() { | |
208 | local workdir | |
209 | workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit | |
807339c5 | 210 | awk=gawk |
c6185e54 | 211 | |
683ce9e3 ER |
212 | local tmp=$workdir/$(basename $SPECFILE) || exit |
213 | ||
214 | import_rpm_macros | |
215 | ||
deadca7d | 216 | LC_ALL=en_US.UTF-8 $awk -f $adapter $SPECFILE > $tmp || exit |
e5f205a4 | 217 | |
deb09aaa ER |
218 | if [ "$outputonly" = 1 ]; then |
219 | cat $tmp | |
220 | ||
221 | elif [ "$(diff --brief $SPECFILE $tmp)" ]; then | |
e5f205a4 | 222 | diff -u $SPECFILE $tmp > $tmp.diff |
c6185e54 | 223 | if [ -t 1 ]; then |
e5f205a4 | 224 | diffcol $tmp.diff | less -r |
115a3045 | 225 | while : ; do |
c6185e54 ER |
226 | echo -n "Accept? (Yes, No, Confirm each chunk)? " |
227 | read ans | |
228 | case "$ans" in | |
229 | [yYoO]) # y0 mama | |
e5f205a4 | 230 | mv -f $tmp $SPECFILE |
c6185e54 ER |
231 | echo "Ok, adapterized." |
232 | break | |
233 | ;; | |
234 | [cC]) # confirm each chunk | |
e5f205a4 ER |
235 | diff2hunks $tmp.diff |
236 | for t in $(ls $tmp-*.diff); do | |
115a3045 | 237 | diffcol $t | less -r |
9ebf8751 | 238 | echo -n "Accept? (Yes, [N]o, Quit)? " |
115a3045 ER |
239 | read ans |
240 | case "$ans" in | |
241 | [yYoO]) # y0 mama | |
242 | patch < $t | |
243 | ;; | |
c6185e54 | 244 | [Q]) # Abort |
9ebf8751 ER |
245 | break |
246 | ;; | |
115a3045 | 247 | esac |
c6185e54 ER |
248 | done |
249 | break | |
250 | ;; | |
251 | [QqnNsS]) | |
252 | echo "Ok, exiting." | |
253 | break | |
254 | ;; | |
255 | esac | |
115a3045 | 256 | done |
c6185e54 | 257 | else |
e5f205a4 | 258 | cat $tmp.diff |
c6185e54 ER |
259 | fi |
260 | else | |
261 | echo "The SPEC is perfect ;)" | |
262 | fi | |
115a3045 | 263 | |
683ce9e3 | 264 | rm -rf $workdir |
115a3045 ER |
265 | } |
266 | ||
b4d9acca AG |
267 | SPECFILE="$1" |
268 | [ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" | |
269 | ||
270 | if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then | |
ea91b16c ER |
271 | echo "$usage" |
272 | exit 1 | |
de8cc9a2 | 273 | fi |
274 | ||
115a3045 | 275 | adapterize |