From a76cbfd583192bc3943e50ed02dee10695624f91 Mon Sep 17 00:00:00 2001 From: Guillaume Rousse Date: Fri, 1 Jan 2010 22:06:32 +0000 Subject: replace shell script + python script by a single perl script --- gprintify | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 159 insertions(+), 22 deletions(-) (limited to 'gprintify') diff --git a/gprintify b/gprintify index dd40de9..99da1b0 100755 --- a/gprintify +++ b/gprintify @@ -1,24 +1,161 @@ -#!/bin/sh +#!/usr/bin/perl # $Id$ +# convert end of line patterns from DOS to UNIX -if [ -z "$RPM_BUILD_ROOT" ]; then - echo "No build root defined" >&2 - exit 1 -fi - -if [ ! -d "$RPM_BUILD_ROOT" ]; then - echo "Invalid build root" >&2 - exit 1 -fi - -scripts= -for f in `ls $RPM_BUILD_ROOT/etc/rc.d/init.d/* $RPM_BUILD_ROOT/etc/init.d/* 2> /dev/null`; do - test -f $f || continue - egrep -q '[[:space:]]*\.[[:space:]]+.*/functions' $f || continue - scripts="$scripts $f" -done -if [ -n "$scripts" ]; then - echo -n "Gprintifying init scripts..." - /usr/share/spec-helper/gprintify.py $scripts - echo "done" -fi +use strict; +use warnings; +use File::Find; +use File::Temp; +use File::Slurp; +use List::MoreUtils qw(none); + +my $string_pattern = qr/ + ^ + ([^"]*) + \$? + " + ( + (?: + \\. # an escaped character + | # or + [^\\"] # anything but a backslash or a quote + )* + ) + " + ([^>|\[\]]*|.*\|\|.*) + $ + /x; +my $echo_pattern = qr/ + ^ + (.*) + echo + \s+ + (-[en]+)? + /x; +my $initfunc_pattern = qr/ + ( + .* + (?:action|success|failure|passed) + \s* + .* + ) + /x; + +my $var_pattern = qr/ + (?, <$initrddir2/*>) { + # skip everything but files + next unless -f $file; + + # skip excluded files + next if $exclude_pattern && $file =~ $exclude_pattern; + + my @lines = read_file($file); + + # skip scripts not sourcing /etc/init.d/functions + next if none { m{\s* \. \s+ /etc/(rc.d/)?init.d/functions}x } @lines; + + # convert lines + @lines = map { process_line($_) } @lines; + + # rewrite script + open(my $out, '>', $file) or die "Unable to open file $file: $!"; + print $out @lines; + close($out); + } +} + +sub process_line { + my ($line) = @_; + + if ($line =~ /$string_pattern/) { + my $start = $1; + my $string = $2; + my $end = $3; + + my ($new_start, $string_end) = process_start($start); + return $line if !$new_start; + + my ($new_string, $variables) = process_string($string); + chomp $end; + my $final = $new_start . $new_string . $string_end . $variables; + + if ($end =~ /$string_pattern/) { + my $start2 = $1; + my $string2 = $2; + my $end2 = $2; + my ($new_start2, $string_end2) = process_start($start2); + return $final . $end . "\n" + if !$new_start2; + + my ($new_string2, $variables2) = process_string($string2); + my $final2 = $new_start2 . $new_string2 . $string_end2 . $variables2; + return $final . $final2 . "\n"; + } else { + return $final . $end . "\n"; + } + + } else { + return $line; + } + +} + +sub process_start { + my ($start) = @_; + + if ($start =~ /$echo_pattern/) { + my $before = $1; + my $option = $2; + my $new_start = $before . 'gprintf "'; + my $string_end = ($option && $option eq '-n') ? '"' : '\\n"'; + return ($new_start, $string_end); + } + + if ($start =~ /$initfunc_pattern/) { + return ($1 . '"', '"'); + } + + return (); +} + +sub process_string { + my ($string) = @_; + + my $variables = ''; + while ($string =~ m/$var_pattern/g) { + $variables .= ' "' . $1 . '"'; + } + $string =~ s/$var_pattern/\%s/g; + + return ($string, $variables); +} + +1; -- cgit v1.2.1