X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=adapter.sh;h=ecf0f77dc4e3fac8be7d22cea60394ea1a87a398;hb=15e34b635b27a3f5ebb391035ac759015cad5d73;hp=af8bf0ad3d59270d89439d982ee631ba1599b88b;hpb=519916c3251bc48fb40c50ffc3a19667045e439a;p=packages%2Frpm-build-tools.git diff --git a/adapter.sh b/adapter.sh index af8bf0a..ecf0f77 100644 --- a/adapter.sh +++ b/adapter.sh @@ -1,20 +1,315 @@ -#!/bin/bash +#!/bin/sh +# +# Authors: +# Michał Kuratczyk +# Sebastian Zagrodzki +# Tomasz Kłoczko +# Artur Frysiak +# Michal Kochanowicz +# Elan Ruusamäe +# +# See cvs log adapter{,.awk} for list of contributors +# +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -if [ $# -ne 1 -o ! -f "$1" ]; then - echo "Usage: $0 filename" - exit 1 +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 +-m|--no-macros|--skip-macros + skip use_macros() substitutions +-d|--skip-desc + 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 >&2 "You need to install util-linux to use adapter" + exit 1 fi -./adapter.awk "$1" > "$1.adapter" -diff -u "$1" "$1.adapter"|less -echo -n "Are the changes OK? [yNs] " +if [ ! -x /usr/bin/patch ]; then + echo >&2 "You need to install patch to use adapter" + exit 1 +fi -read -n 1 OK -echo +[ -n "$PAGER" ] || PAGER="/usr/bin/less -r" -if [ "$OK" == "y" -o "$OK" == "Y" ]; then - mv "$1.adapter" "$1" - cvs ci "$1" -elif [ "$OK" != "s" -a "$OK" != "S" ];then - rm "$1.adapter" +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" + exit 1 + ;; + -s|--no-sort|--skip-sort) + export SKIP_SORTBR=1 + ;; + -m|--no-macros|--skip-macros) + export SKIP_MACROS=1 + ;; + -d|--skip-desc) + export SKIP_DESC=1 + ;; + -a|--skip-defattr) + export SKIP_DEFATTR=1 + ;; + -V|--version) + echo "$VERSIONSTRING" + exit 0 + ;; + -o) + outputonly=1 + ;; + --) + shift + break + ;; + *) + echo >&2 "$PROGRAM: Internal error: \`$1' not recognized!" + exit 1 + ;; + esac + shift +done + +diffcol() +{ + # 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 ' +#! /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; + } +} +' "$@" +} + +# 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 $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 -p0 < $t + ;; + [Q]) # Abort + break + ;; + esac + done + break + ;; + [QqnNsS]) + echo "Ok, exiting." + break + ;; + esac + done + else + cat $tmp.diff + fi + else + echo "The SPEC is perfect ;)" + fi + + rm -rf $workdir +} + +SPECFILE="$1" +[ -f "$SPECFILE" ] || SPECFILE="$(basename $SPECFILE .spec).spec" + +if [ $# -ne 1 -o ! -f "$SPECFILE" ]; then + echo "$usage" + exit 1 +fi + +adapterize + +# vim: ts=4:sw=4