Accepting request 71284 from openSUSE:Tools:Unstable

move to stable project

OBS-URL: https://build.opensuse.org/request/show/71284
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-format_spec_file?expand=0&rev=1
This commit is contained in:
Adrian Schröter 2011-05-25 12:17:35 +00:00 committed by Git OBS Bridge
commit 419a9e9feb
7 changed files with 715 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

27
format_spec_file Normal file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# just a wrapper for the perl script.
while test $# -gt 0; do
case $1 in
*-outdir)
MYOUTDIR="$2"
shift
;;
*)
echo Unknown parameter $1.
echo 'Usage: this service is not excepting parameters'
exit 1
;;
esac
shift
done
RETURN=0
for i in *.spec; do
/usr/lib/obs/service/format_spec_file.files/prepare_spec "$i" > "$MYOUTDIR/$i" || RETURN=1
done
exit $RETURN

5
format_spec_file.service Normal file
View File

@ -0,0 +1,5 @@
<service name="source_validator">
<summary>Validate sources</summary>
<description>The default SUSE source validator which catches common pitfalls before build.</description>
</service>

View File

@ -0,0 +1,17 @@
-------------------------------------------------------------------
Wed May 25 14:00:35 CEST 2011 - ro@suse.de
- fix uninitialized warning in prepare_spec
-------------------------------------------------------------------
Wed May 4 01:55:04 CEST 2011 - ro@suse.de
- cleanup prepare_spec, drop Needed.pm
- make it ready for public usage
-------------------------------------------------------------------
Wed Jan 26 17:02:42 UTC 2011 - adrian@suse.de
- initial version.
not usable outside of SUSE network yet.

View File

@ -0,0 +1,38 @@
Name: obs-service-format_spec_file
License: GPL v2 or later
Group: Development/Tools/Building
Summary: An OBS source service: reformats a spec file to SUSE standard.
Version: 0.1
Release: 1
Source: format_spec_file
Source1: format_spec_file.service
Source2: prepare_spec
Requires: osc-source_validator
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildArch: noarch
%description
This is a source service for openSUSE Build Service.
This source service is formating the spec file to SUSE standard. The rational
behind is to make it easier to review spec files from unknown packagers.
This should be used in "trylocal" mode, so that osc is adapting the existing
spec file instead of creating a new one.
%prep
%setup -q -D -T 0 -n .
%build
%install
mkdir -p $RPM_BUILD_ROOT/usr/lib/obs/service/format_spec_file.files
install -m 0755 %{SOURCE0} $RPM_BUILD_ROOT/usr/lib/obs/service
install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT/usr/lib/obs/service
install -m 0755 %{SOURCE2} $RPM_BUILD_ROOT/usr/lib/obs/service/format_spec_file.files
%files
%defattr(-,root,root)
%dir /usr/lib/obs
/usr/lib/obs/service

604
prepare_spec Normal file
View File

@ -0,0 +1,604 @@
#! /usr/bin/perl -w
#
# vim:sw=2:et
#
BEGIN {
unshift @INC, ".";
unshift @INC, "/usr/lib/build/";
}
use Time::localtime;
use Data::Dumper;
use strict;
my @oldspec = ();
my @newspec = ();
my $base_package = "";
my $neededforbuild = "";
my $icecreamforbuild = "";
my $norootforbuild = 0;
my @copyrights = ();
my $needsrootforbuild = 0;
my $needsbinariesforbuild = 0;
my $nodebuginfo = 0;
my %multiline_macros = ();
my $nosrc_result = 0;
my $current_section = "header";
my $had_debug_package = 0;
my %pkg_version = ();
my %pkg_release = ();
my %please_replace = ();
my %replace_hash = ();
my $build_root = $ENV{'BUILD_ROOT'};
my $disabled_packs;
my $ifhandler;
my $definelist;
my $debug = 0;
my @global_tags_list =
(
'Autoreq',
'Autoreqprov',
'BuildArch',
'BuildArchitectures',
'BuildRequires',
'Conflicts',
'DocDir',
'Enhances',
'Enhances',
'EssentialFor',
'ExcludeArch',
'ExclusiveArch',
'Freshens',
'NoPatch',
'NoSource',
'Obsoletes',
'Patch\d*',
'Prefix',
'PreReq',
'Provides',
'Recommends',
'Requires',
'Source\d*',
'Suggests',
'Supplements',
'Url',
);
my $global_tags_re = '^\s*(' . join("|", @global_tags_list) . ')\s*:';
my $section_tags_re ='^\s*%(?:clean|check|prep|build|install|pre|post|preun|postun|posttrans|package|' .
'description|files|triggerin|triggerun|triggerpostun)\b';
sub unify {
my %h = map {$_ => 1} @_;
return grep(delete($h{$_}), @_);
}
sub capitalize_case($)
{
my ($tag) = @_;
$tag = lc($tag);
$tag =~ s/docdir/DocDir/i;
$tag =~ s/arch/Arch/i;
$tag =~ s/patch/Patch/i;
$tag =~ s/source/Source/i;
$tag =~ s/req/Req/i;
$tag =~ s/prov/Prov/i;
$tag =~ s/^(\w)/uc($1)/e;
return $tag;
}
sub maybe_add_empty_line()
{
push @oldspec, ""
if ($current_section ne "description" && $oldspec[-1] !~ /^\s*$/);
}
sub maybe_add_debug_package()
{
if ( $ENV{'BUILD_DEBUG_FLAGS'}
&& ( !$nosrc_result || $base_package =~ /^kernel/ || $base_package =~ /^java/ || $base_package =~ /^texlive-bin/ || $base_package =~ /^glibc/ )
&& !$nodebuginfo
&& !$had_debug_package )
{
my @spec_back;
while(1) {
my $line = pop @oldspec;
unshift @spec_back, $line;
next if ($line =~ /^\s*$/);
next if ($line =~ /^\s*%if\b/);
last;
}
# insert the %debug_package just before the first %if
push @oldspec, shift @spec_back;
push @oldspec, "%debug_package", @spec_back;
$had_debug_package = 1;
}
}
sub change_section($)
{
my ($new_section) = @_;
maybe_add_empty_line();
$current_section = $new_section;
warn "section changed to $current_section\n" if $debug;
}
sub set_current_pkg {
my ( $arg ) = @_;
print "DEBUG: set_current_pkg receiving $arg\n" if $debug;
my ( @argarray ) = split ( '\s+' , $arg );
my $curpack = $base_package;
my $curlang = "";
while (my $carg = shift @argarray) {
next if ($carg eq "%description" || $carg eq "%package" || $carg eq "%prep");
if ($carg eq "-l") {
$curlang = shift @argarray;
} elsif ($carg eq "-n") {
$curpack = shift @argarray;
} else {
$curpack = "$base_package-" if $base_package;
$curpack .= $carg;
}
}
print "DEBUG: set_current_pkg returning $curpack, $curlang\n" if $debug;
return ($curpack, $curlang);
}
sub read_and_parse_old_spec {
my ( $specfile, $base_package ) = @_;
my $current_package = $base_package;
my $current_lang = "";
my $check_printed = "false";
my $print_comments = "false";
my %version;
my $ifhandler;
$ifhandler->{"disabled"} = 0;
my @readspec;
open ( SPEC , "$specfile" ) || die "can't read specfile";
@readspec = <SPEC>;
close SPEC;
chomp @readspec;
while (@readspec) {
$_ = shift @readspec;
if ( /^\s*$/ && $current_section ne "description") {
push @oldspec, "XXXBLANKLINE";
next;
}
if ( /^#\s*norootforbuild\s*$/ ) {
$norootforbuild = 1;
next;
}
if ( /^#\s*needsrootforbuild\s*$/ ) {
$needsrootforbuild = 1;
next;
}
if ( /^#\s*needsbinariesforbuild\s*$/ ) {
$needsbinariesforbuild = 1;
next;
}
if ( /^#\s*nodebuginfo\s*$/ ) {
$nodebuginfo = 1;
next;
}
if ( /^#\s*icecream/ ) {
$icecreamforbuild = $_;
$icecreamforbuild =~ s/^#\s*icecream\s*//;
next;
}
if ( /^#\s*Copyright\s*/ ) {
for (;;)
{
# check if line is ONLY a standard copyright line, if so, ignore.
my $c = $_;
$c =~ s{\s*(\d+|copyrights?|\(c\)|suse|linux|products|gmbh|nuremberg|n..?rnberg|germany|\W+)\s*}{}gi;
push(@copyrights, $_) if length $c > 5;
last if length $readspec[0] < 10 || $readspec[0] =~ m{modifications and additions}i || $readspec[0] !~ /^[\#\s]/
|| grep { $readspec[0] =~ /^#\s*$_/ } ("norootforbuild","needsrootforbuild","needsbinariesforbuild","nodebuginfo","icecream","neededforbuild","usedforbuild","Commandline","MD5SUM","!BuildIgnore");
$_ = shift @readspec;
}
next;
}
if ( /^#\s*neededforbuild/ ) {
$neededforbuild = $_;
$neededforbuild =~ s/^#\s*neededforbuild\s*//;
my (%aa) = ();
foreach my $x (split(' ',$neededforbuild)){
$aa{$x}=1;
}
$neededforbuild = join(' ',sort keys (%aa));
next;
}
# evil epoch removal
next if ( /^Epoch:/ );
$_ =~ s/%{?epoch}?[:-]//g;
$_ =~ s/ 0:/ /g if ( /^requires/i || /^buildreq/i );
if ( /^BuildRequires:/ ) {
my $cur_buildreq = $_;
$cur_buildreq =~ s/^BuildRequires:\s*//;
my %aa;
while ($cur_buildreq =~ m{([^,\s]+(\s*[<=>]+\s*[^,\s]+)?)}g) {
$aa{$1}=1;
}
# ignore line if it looks like a "usedforbuild" line, i.e.
# if it contains too many base packages
next if (grep {$aa{$_}} qw{gcc rpm glibc bash}) > 2;
push @oldspec, "BuildRequires: ".join(' ',sort keys(%aa));
next;
}
next if ( /^#\s*usedforbuild/ );
if ( /^%\?__\*BuildRequires:/ ) {
push @oldspec, $_;
next;
}
if ( /^#!__\*BuildRequires:/ ) {
push @oldspec, $_;
next;
}
if ( /^#!BuildIgnore:/ ) {
push @oldspec, $_;
next;
}
if ( /^#/ && $current_section ne "description") {
warn "$_ $current_section\n" if $debug;
if ( $print_comments eq "true" || $readspec[0] =~ /^%define/ || $readspec[0] =~ /^%if/) {
push @oldspec, $_;
}
next;
}
if ( /^%debug_package/ ) {
# remove, we add this ourselves
next;
}
$print_comments = "true" unless /^#/;
if ( /^%define\s*vendor\s/ || /^%define\s*distribution\s/ ) {
next;
}
if ( /^%define\s+(\w[\w\d]+).*\\$/ ) {
$multiline_macros{$1} = 1;
}
if ( /^\s*%if/ || /^\s*%\{/ || /^\s*%define/ || /^\s*%el/ || /^\s*%endif/ ) {
change_section("header") if ($current_section eq "description");
push @oldspec, $_;
if ( /^\s*%if\s/ ) {
my @args = split (/\s+/,$_);
$_ =~ s/[\{\}\"]//g for (@args);
$ifhandler->{"last_if_disabled"} = 0;
$ifhandler->{"last_if_if"} = 1;
$ifhandler->{"depth"}++;
my $if_not = 0;
if ( $args[1] =~ /^\!/ ) {
$args[1] =~ s/^\!//;
$if_not = 1;
}
if ( ($args[1] eq "0")
|| ($args[1] eq "%name" && $args[2] eq "!=" && $args[3] eq $base_package)
|| ($args[1] eq "%name" && $args[2] eq "==" && $args[3] ne $base_package)
|| ($args[1] && !$args[3] && !$if_not && $definelist->{$args[1]} && $definelist->{$args[1]} eq "0")
|| ($args[2] eq "==" && $args[3] ne "0" && $definelist->{$args[1]} && $definelist->{$args[1]} eq "0")
|| ($args[2] eq "!=" && $args[3] eq "0" && $definelist->{$args[1]} && $definelist->{$args[1]} eq "0")
|| ($args[1] && !$args[3] && $if_not && $definelist->{$args[1]} && $definelist->{$args[1]} eq "1")
|| ($args[1] && $args[2] eq "!=" && $args[3] eq "1" && $definelist->{$args[1]} && $definelist->{$args[1]} eq "1") ) {
$ifhandler->{"disabled"} = $ifhandler->{"depth"};
$ifhandler->{"last_if_disabled"} = 1;
}
} elsif ( /^\s*%if/ ) {
$ifhandler->{"last_if_disabled"} = 0;
$ifhandler->{"last_if_if"} = 0;
$ifhandler->{"depth"}++;
} elsif ( /^\s*%endif/ ) {
$ifhandler->{"disabled"} = 0 if $ifhandler->{"disabled"} == $ifhandler->{"depth"};
$ifhandler->{"depth"}--;
} elsif ( /^\s*%else/ ) {
if ($ifhandler->{"disabled"} == $ifhandler->{"depth"} && $ifhandler->{"last_if_disabled"} == 1) {
$ifhandler->{"disabled"} = 0;
} elsif ($ifhandler->{"disabled"} == 0 && $ifhandler->{"depth"} == 1 && $ifhandler->{"last_if_if"} == 1) {
$ifhandler->{"disabled"} = 1;
}
} elsif ( /^\s*%define\s/ ) {
my @args = split (/\s+/,$_);
$_ =~ s/[\{\}\"]//g for (@args);
$args[2] =~ s/\Q$_\E/$definelist->{$_}/g for sort { length($b) <=> length($a) } keys (%{$definelist});
if ( $args[2] !~ /[\(\)\{\}\@\%\"\\]/ ) {
$definelist->{"%".$args[1]} = $args[2] if $ifhandler->{"disabled"} == 0;
$definelist->{"%{".$args[1]."}"} = $args[2] if $ifhandler->{"disabled"} == 0;
$definelist->{"%{?".$args[1]."}"} = $args[2] if $ifhandler->{"disabled"} == 0;
}
while ($_ =~ /\\$/) {
$_ = shift @readspec;
push @oldspec, $_;
}
}
next;
}
if ( /^%package\b/i or /^%prep\b/i ) {
if (/^%package\b/i) {
change_section("header");
} else {
change_section("prep");
}
maybe_add_debug_package();
$_ =~ s/^(%\w+)/lc($1)/e;
if ($debug) {
warn "key: $_ value: $definelist->{$_}\n" for (sort { length($b) <=> length($a) } keys (%{$definelist}));
}
push @oldspec, $_;
for my $xx (sort { length($b) <=> length($a) } keys (%{$definelist})) {
$_ =~ s/\Q$xx\E/$definelist->{$xx}/;
}
$_ =~ s/%{\?[^\}]*}//;
if ($debug) {
warn "after: $_\n";
}
($current_package, $current_lang) = set_current_pkg ( $_ );
$disabled_packs->{$current_package} = 1 if $ifhandler->{"disabled"};
warn "$current_package is disabled\n" if $ifhandler->{"disabled"} && $debug;
next;
}
if ( /^%description\b/i ) {
change_section("description");
$_ =~ s/^(%\w+)/lc($1)/e;
push @oldspec, $_;
($current_package, $current_lang) = set_current_pkg ( $_ );
my $target = $current_package;
$target .= "_$current_lang" if $current_lang;
$target .= "_disabled" if $ifhandler->{"disabled"};
push @oldspec, "XXXDESCRIPTION $target";
next;
}
if ( /^%install\b/i ) {
change_section("install");
push @oldspec, $_;
next;
}
if ( /^%changelog\b/i ) {
change_section("changelog");
# changelog comes always from *.changes. Skip what is in spec file
# at the moment.
next;
}
if (/^%files\b/i) {
change_section("files");
$current_section = "files";
}
if ( /^%/ ) {
if ( m/$section_tags_re/oi ) {
$_ =~ s/^(%\w+)/lc($1)/e;
change_section("header") if (! m/\s*%files/i && !m/\s*%build/i);
change_section("build") if m/\s*%build/i;
warn "changed to $current_section for $_\n" if $debug;
}
push @oldspec, $_;
# multiline macros need an extra newline with old RPMs
if (/^%(\w[\w\d]+).*[^\\]$/) {
push @oldspec, "" if (defined($multiline_macros{$1}));
}
next;
}
if ($current_section eq "header") {
if ( /^Summary\b\s*:\s*(.*)/i ) {
$replace_hash{"XXXSUMMARY $current_package"} = sprintf("%-16s%s","Summary:", $1);
push @oldspec, "XXXSUMMARY $current_package";
next;
}
if ( /^Group\b\s*:\s*(.*)/i ) {
$replace_hash{"XXXGROUP $current_package"} = sprintf("%-16s%s", "Group:", $1);
push @oldspec, "XXXGROUP $current_package";
next;
}
if ( /^Vendor:/ || /^Distribution:/ || /^Packager:/ ) {
next;
}
if ( /^Name\s*:\s*(.*)/i ) {
my $orig_name = $1;
my $changed_name = $orig_name;
$changed_name =~ s/\Q$_\E/$definelist->{$_}/ for (sort { length($b) <=> length($a) } keys (%{$definelist}));
if ($changed_name eq $base_package) {
push @oldspec, sprintf("\n%-16s%s","Name:", $orig_name);
} else {
push @oldspec, sprintf("\n%-16s%s","Name:", $base_package);
}
$definelist->{"%name"} = $base_package if $ifhandler->{"disabled"} == 0;
$definelist->{"%{name}"} = $base_package if $ifhandler->{"disabled"} == 0;
warn ("line is $_, orig_name is $orig_name, base_package is $base_package\n") if $ifhandler->{"disabled"} == 0 && $debug;
next;
}
if ( /^BuildArchitectures\s*:/i ) {
$_ =~ s/^[^:]+:/BuildArch:/;
}
if ( /^Release\s*:\s*(.*)/i ) {
$pkg_release{$current_package} = $_;
$replace_hash{"XXXRELEASE $current_package"} = sprintf("%-16s%s","Release:", $1);
next;
}
if ( /^BuildRoot\s*:/i ) {
push @oldspec, "BuildRoot: %{_tmppath}/%{name}-%{version}-build";
next;
}
if ( /^Copyright\s*:\s*(.*)/i || /^License\s*:\s*(.*)/i ) {
$replace_hash{"XXXLICENSE $current_package"} = sprintf("%-16s%s","License:", $1);
push @oldspec, "XXXLICENSE $current_package";
next;
}
if ( /^Url\s*:\s*(.*)/i ) {
$replace_hash{"XXXURL $current_package"} = sprintf("%-16s%s","Url:", $1);
push @oldspec, "XXXURL $current_package";
next;
}
if ( m/$global_tags_re\s*(.*)/oi ) {
my ($tag, $value) = ($1, $2);
$nosrc_result = 1 if ($tag =~ /(?:nosource|nopatch)/i);
push @oldspec, sprintf("%-16s%s", capitalize_case($tag) . ":", $value);
next;
}
if ( /^Version:/ ) {
warn "found Version, section = $current_section\n" if $debug;
$version{$current_package} = $_;
$version{$current_package} =~ s/^Version:\s*(.*)\s*/$1/;
$replace_hash{"XXXVERSION $current_package"} = sprintf("%-16s%s","Version:",$version{$current_package});
push @oldspec, "XXXVERSION $current_package";
push @oldspec, "XXXRELEASE $current_package";
next;
}
}
if ( $current_section eq "description" ) {
my $target = $current_package;
$target .= "_$current_lang" if $current_lang;
$target .= "_disabled" if $ifhandler->{"disabled"};
$replace_hash{"XXXDESCRIPTION $target"} .= "\n" if ( $replace_hash{"XXXDESCRIPTION $target"} );
$replace_hash{"XXXDESCRIPTION $target"} .= $_;
next;
}
if ( $current_section ne "description" && $current_section ne "changelog" ) {
push @oldspec, $_;
}
}
}
if ($ARGV[0] eq '--debug') {
$debug = 1;
shift @ARGV;
}
my $specfile = shift ( @ARGV );
if ( ! stat($specfile) ) {
die "$specfile is no file";
}
my @specpath = split ('/' ,$specfile);
my $specbase = pop @specpath;
my $specdir = join ('/', @specpath);
if ( $specdir eq "" ) {
$specdir = ".";
}
my $xdefinelist;
my $seen_name = 0;
open ( SPE , "$specfile" );
while ( <SPE> ) {
chomp();
if ( /^%define/ ) {
my @args = split (/\s+/,$_);
$_ =~ s/[\{\}\"]//g for (@args);
$args[2] =~ s/\Q$_\E/$xdefinelist->{$_}/ for (sort { length($b) <=> length($a) } keys (%{$xdefinelist}));
if ( $args[2] !~ /[\(\)\{\}\@\%\"\\]/ ) {
$xdefinelist->{"%".$args[1]} = $args[2];
$xdefinelist->{"%{".$args[1]."}"} = $args[2];
}
}
if ( /^\s*Name:/ ) {
next if $seen_name;
$seen_name = 1;
$base_package = $_;
$base_package =~ s/^\s*Name:\s*(\S*)\s*/$1/;
$base_package =~ s/\Q$_\E/$xdefinelist->{$_}/ for (sort { length($b) <=> length($a) } keys (%{$xdefinelist}));
if ($debug) {
warn "DEBUG: base_package = $base_package\n";
warn Dumper($xdefinelist);
}
last;
}
}
close ( SPE );
warn ("base_package is $base_package\n") if $debug;
if ( ! stat ((glob("$specdir/$base_package*.spec"))[0] || "") ) {
$base_package =~ s/[0-9]$//;
}
if ( ! stat ((glob("$specdir/$base_package*.spec"))[0] || "") ) {
$base_package =~ s/\-[^\-]*$//;
}
warn ("base_package is $base_package\n") if $debug;
if ( ! stat ((glob("$specdir/$base_package*.spec"))[0] || "") ) {
$base_package = $specbase;
$base_package =~ s/\.spec$//;
$base_package =~ s/\-.*$//;
}
read_and_parse_old_spec ( $specfile, $base_package );
for (@oldspec) {
next unless /^XXX/;
$please_replace{$_} = 1;
}
my $thisyear = localtime->year() + 1900;
unshift @copyrights, "# Copyright (c) $thisyear SUSE LINUX Products GmbH, Nuernberg, Germany.";
my $copy_list = join("\n", @copyrights);
print <<EOF;
#
# spec file for package $base_package
#
$copy_list
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
EOF
print "# norootforbuild\n" if $norootforbuild;
print "# needsrootforbuild\n" if $needsrootforbuild;
print "# needsbinariesforbuild\n" if $needsbinariesforbuild;
print "# nodebuginfo\n" if $nodebuginfo;
print "# icecream $icecreamforbuild\n" if $icecreamforbuild ne '';
print "\n";
while ($oldspec[0] eq "XXXBLANKLINE") {
shift @oldspec;
}
my $line;
while (@oldspec) {
$line = shift @oldspec;
if ($line eq "XXXBLANKLINE") {
print "\n" unless $oldspec[0] && ($oldspec[0] eq "XXXBLANKLINE" || $oldspec[0] =~ /^\s*$/ || $oldspec[0] =~ /^\n/);
} elsif ($line =~ /^XXX/) {
print "DEBUG: replacing $line\n" if $debug;
print "$replace_hash{$line}\n";
} else {
print "$line\n";
# a package line with no license tag found for it yet
# if line ends with "\", we are probably in a macro definition
if ($line =~ /^%package/ && $line !~ /\\$/) {
$line =~ s/^(%\w+)/lc($1)/e;
my ($current_package, $current_lang) = set_current_pkg ( $line );
unless ($please_replace{"XXXLICENSE $current_package"}) {
print $replace_hash{"XXXLICENSE $current_package"}."\n";
}
}
}
}
print "\n" unless $line eq "XXXBLANKLINE";
print "%changelog\n";