X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=adapter.sh;h=ecf0f77dc4e3fac8be7d22cea60394ea1a87a398;hb=15e34b635b27a3f5ebb391035ac759015cad5d73;hp=4a90576f89f10d73507f111b3c3ad3bba18e8574;hpb=434dadba41c71cd80f55646b7779e91079ce6f8e;p=packages%2Frpm-build-tools.git diff --git a/adapter.sh b/adapter.sh index 4a90576..ecf0f77 100644 --- a/adapter.sh +++ b/adapter.sh @@ -1,8 +1,5 @@ #!/bin/sh # -# This is adapter v0.28. Adapter adapts .spec files for PLD Linux. -# -# Copyright (C) 1999-2003 PLD-Team # Authors: # Michał Kuratczyk # Sebastian Zagrodzki @@ -15,8 +12,17 @@ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -self=$(basename "$0") -usage="Usage: $self [FLAGS] SPECFILE +RCSID='$Id$' +REVISION=${RCSID#* * } REVISION=${REVISION%% *} +VERSION="v0.35/$REVISION" +VERSIONSTRING="\ +Adapter adapts .spec files for PLD Linux. +$VERSION (C) 1999-2010 Free Penguins". + +PROGRAM=${0##*/} +dir=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") +adapter=$dir/adapter.awk +usage="Usage: $PROGRAM [FLAGS] SPECFILE -s|--no-sort|--skip-sort skip BuildRequires, Requires sorting @@ -26,26 +32,39 @@ usage="Usage: $self [FLAGS] SPECFILE skip desc wrapping -a|--skip-defattr skip %defattr corrections - +-o + do not do any diffing, just dump the output " if [ ! -x /usr/bin/getopt ]; then - echo >&1 "You need to install util-linux to use adapter" + echo >&2 "You need to install util-linux to use adapter" exit 1 fi if [ ! -x /usr/bin/patch ]; then - echo >&1 "You need to install patch to use adapter" + echo >&2 "You need to install patch to use adapter" exit 1 fi -t=`getopt -o hsmda --long help,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$self" -- "$@"` || exit $? +[ -n "$PAGER" ] || PAGER="/usr/bin/less -r" + +if [ -n "$CONFIG_DIR" ]; then + USER_CFG="$CONFIG_DIR/.adapterrc" +elif [ -n "$HOME_ETC" ]; then + USER_CFG="$HOME_ETC/.adapterrc" +else + USER_CFG=~/.adapterrc +fi + +[ -f $USER_CFG ] && . $USER_CFG + +t=$(getopt -o hsomdaV --long help,version,sort,sort-br,no-macros,skip-macros,skip-desc,skip-defattr -n "$PROGRAM" -- "$@") || exit $? eval set -- "$t" while true; do case "$1" in -h|--help) - echo 2>&1 "$usage" + echo 2>&1 "$usage" exit 1 ;; -s|--no-sort|--skip-sort) @@ -60,131 +79,237 @@ while true; do -a|--skip-defattr) export SKIP_DEFATTR=1 ;; + -V|--version) + echo "$VERSIONSTRING" + exit 0 + ;; + -o) + outputonly=1 + ;; --) shift - break + break ;; *) - echo 2>&1 "$self: Internal error: [$1] not recognized!" + echo >&2 "$PROGRAM: Internal error: \`$1' not recognized!" exit 1 - ;; + ;; esac shift done diffcol() { - # vim like diff colourization - sed -e ' - s,,^[,g; - s,,^G,g; - s,^\(Index:\|diff\|---\|+++\) .*$,&,; - s,^@@ ,&,g; - s,^-,&,; - s,^+,&,; - s, ,^M,g; - s, , ,g; - s,\([^[:space:]]\)\([[:space:]]\+\)$,\1\2,g; - s,$,, - ' "$@" + # vim like diff colourization +LC_ALL=en_US.UTF-8 gawk ' { + split( $0, S, /\t/ ); + $0 = S[ 1 ]; + for ( i = 2; i in S; i++ ) { + spaces = 7 - ( (length( $0 ) - 1) % 8 ); + $0 = $0 "\xE2\x9E\x94"; + for ( y = 0; y < spaces; y++ ) + $0 = $0 "\xE2\x87\xBE"; + $0 = $0 S[ i ]; + } + gsub( /\033/, "\033[44m^[\033[49m" ); + cmd = ""; + if ( sub( /^ /, "" ) ) + cmd = " "; + sub( /(\xE2\x9E\x94(\xE2\x87\xBE)*| )+$/, "\033[31;41m&\033[39;49m" ); + gsub( /\xE2\x9E\x94(\xE2\x87\xBE)*/, "\033[7m&\033[27m" ); + gsub( /\xE2\x87\xBE/, " " ); + # uncomment if you do not like utf-8 arrow + # gsub( /\xE2\x9E\x94/, ">" ); + $0 = cmd $0; + gsub( /\007/, "\033[44m^G\033[49m" ); + gsub( /\r/, "\033[44m^M\033[49m" ); +} +/^(Index:|diff|---|\+\+\+) / { $0 = "\033[32m" $0 } +/^@@ / { $0 = "\033[33m" $0 } +/^-/ { $0 = "\033[35m" $0 } +/^+/ { $0 = "\033[36m" $0 } +{ $0 = $0 "\033[0m"; print } +' "$@" } diff2hunks() { - # diff2hunks orignally by dig - perl -e ' + # diff2hunks orignally by dig + perl -e ' #! /usr/bin/perl -w use strict; for my $filename (@ARGV) { - my $counter = 1; - my $fh; - open $fh, "<", $filename or die "$filename: open for reading: $!"; - my @lines = <$fh>; - my @hunks; - my @curheader; - for my $i (0 ... $#lines) { - next unless $lines[$i] =~ m/^\@\@ /; - if ($i >= 2 and $lines[$i - 2] =~ m/^--- / and $lines[$i - 1] =~ m/^\+\+\+ /) { - @curheader = @lines[$i - 2 ... $i - 1]; - } - next unless @curheader; - my $j = $i + 1; - while ($j < @lines and $lines[$j] !~ m/^\@\@ /) {$j++} - $j -= 2 - if $j >= 3 and $j < @lines - and $lines[$j - 2] =~ m/^--- / - and $lines[$j - 1] =~ m/^\+\+\+ /; - $j--; - $j-- until $lines[$j] =~ m/^[ @+-]/; - my $hunkfilename = $filename; - $hunkfilename =~ s/((\.(pat(ch)?|diff?))?)$/"-".sprintf("%03i",$counter++).$1/ei; - my $ofh; - open $ofh, ">", $hunkfilename or die "$hunkfilename: open for writing: $!"; - print $ofh @curheader, @lines[$i ... $j]; - close $ofh; - } + my $counter = 1; + my $fh; + open $fh, "<", $filename or die "$filename: open for reading: $!"; + my @lines = <$fh>; + my @hunks; + my @curheader; + for my $i (0 ... $#lines) { + next unless $lines[$i] =~ m/^\@\@ /; + if ($i >= 2 and $lines[$i - 2] =~ m/^--- / and $lines[$i - 1] =~ m/^\+\+\+ /) { + @curheader = @lines[$i - 2 ... $i - 1]; + } + next unless @curheader; + my $j = $i + 1; + while ($j < @lines and $lines[$j] !~ m/^\@\@ /) {$j++} + $j -= 2 + if $j >= 3 and $j < @lines + and $lines[$j - 2] =~ m/^--- / + and $lines[$j - 1] =~ m/^\+\+\+ /; + $j--; + $j-- until $lines[$j] =~ m/^[ @+-]/; + my $hunkfilename = $filename; + $hunkfilename =~ s/((\.(pat(ch)?|diff?))?)$/"-".sprintf("%03i",$counter++).$1/ei; + my $ofh; + open $ofh, ">", $hunkfilename or die "$hunkfilename: open for writing: $!"; + print $ofh @curheader, @lines[$i ... $j]; + close $ofh; + } } ' "$@" } -adapterize() -{ - local tmpdir - tmpdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit - gawk -f adapter.awk $SPECFILE > $tmpdir/$SPECFILE || exit - - if [ "`diff --brief $SPECFILE $tmpdir/$SPECFILE`" ]; then - diff -u $SPECFILE $tmpdir/$SPECFILE > $tmpdir/$SPECFILE.diff - if [ -t 1 ]; then - diffcol $tmpdir/$SPECFILE.diff | less -r +# import selected macros for adapter.awk +# you should update the list also in adapter.awk when making changes here +import_rpm_macros() { + macros=" + _topdir + _prefix + _bindir + _sbindir + _libdir + _sysconfdir + _datadir + _includedir + _mandir + _infodir + _examplesdir + _defaultdocdir + _kdedocdir + _gtkdocdir + _desktopdir + _pixmapsdir + _javadir + _pkgconfigdir + _npkgconfigdir + + perl_sitearch + perl_archlib + perl_privlib + perl_vendorlib + perl_vendorarch + perl_sitelib + + py_sitescriptdir + py_sitedir + py_scriptdir + py_ver + + py3_sitescriptdir + py3_sitedir + py3_scriptdir + py3_ver + + ruby_archdir + ruby_ridir + ruby_rubylibdir + ruby_sitearchdir + ruby_sitelibdir + ruby_rdocdir + + php_pear_dir + php_data_dir + tmpdir +" + eval_expr="" + for macro in $macros; do + eval_expr="$eval_expr\nexport $macro='%{$macro}'" + done + + + # get cvsaddress for changelog section + # using rpm macros as too lazy to add ~/.adapterrc parsing support. + eval_expr="$eval_expr + export _cvsmaildomain='%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}' + export _cvsmailfeedback='%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team }' + " + + export ADAPTER_REVISION=$REVISION + + eval $(rpm --eval "$(echo -e $eval_expr)") +} + +adapterize() { + local workdir + workdir=$(mktemp -d ${TMPDIR:-/tmp}/adapter-XXXXXX) || exit $? + awk=gawk + + local tmp=$workdir/$(basename $SPECFILE) || exit $? + + import_rpm_macros + + LC_ALL=en_US.UTF-8 $awk -f $adapter $SPECFILE > $tmp || exit $? + + if [ "$outputonly" = 1 ]; then + cat $tmp + + elif [ "$(diff --brief $SPECFILE $tmp)" ]; then + diff -u $SPECFILE $tmp > $tmp.diff + if [ -t 1 ]; then + diffcol $tmp.diff | $PAGER while : ; do - echo -n "Accept? (Yes, No, Confirm each chunk)? " - read ans - case "$ans" in - [yYoO]) # y0 mama - mv -f $tmpdir/$SPECFILE $SPECFILE - echo "Ok, adapterized." - break - ;; - [cC]) # confirm each chunk - diff2hunks $tmpdir/$SPECFILE.diff - for t in $(ls $tmpdir/$SPECFILE-*.diff); do - diffcol $t | less -r + echo -n "Accept? (Yes, No, Confirm each chunk)? " + read ans + case "$ans" in + [yYoO]) # y0 mama + mv -f $tmp $SPECFILE + echo "Ok, adapterized." + break + ;; + [cC]) # confirm each chunk + diff2hunks $tmp.diff + for t in $(ls $tmp-*.diff); do + diffcol $t | $PAGER echo -n "Accept? (Yes, [N]o, Quit)? " read ans case "$ans" in [yYoO]) # y0 mama - patch < $t + patch -p0 < $t ;; - [Q]) # Abort + [Q]) # Abort break ;; esac - done - break - ;; - [QqnNsS]) - echo "Ok, exiting." - break - ;; - esac + done + break + ;; + [QqnNsS]) + echo "Ok, exiting." + break + ;; + esac done - else - cat $tmpdir/$SPECFILE.diff - fi - else - echo "The SPEC is perfect ;)" - fi - - rm -rf $tmpdir + else + cat $tmp.diff + fi + else + echo "The SPEC is perfect ;)" + fi + + rm -rf $workdir } -if [ $# -ne 1 -o ! -f "$1" ]; then +SPECFILE="$1" +[ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" + +if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then echo "$usage" exit 1 fi -SPECFILE="$1" adapterize + +# vim: ts=4:sw=4