Hello community,

here is the log from the commit of package obs-service-format_spec_file for 
openSUSE:Factory checked in at 2011-12-12 16:58:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/obs-service-format_spec_file (Old)
 and      /work/SRC/openSUSE:Factory/.obs-service-format_spec_file.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "obs-service-format_spec_file", Maintainer is ""

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/obs-service-format_spec_file/obs-service-format_spec_file.changes
        2011-09-23 02:14:58.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.obs-service-format_spec_file.new/obs-service-format_spec_file.changes
   2011-12-12 17:03:19.000000000 +0100
@@ -1,0 +2,20 @@
+Wed Dec  7 14:04:46 UTC 2011 - co...@suse.com
+
+- move pkgconfig() and co to the end of the buildrequires
+
+-------------------------------------------------------------------
+Wed Dec  7 08:22:29 UTC 2011 - co...@suse.com
+
+- another update from git to replace way more licenses (0.4)
+
+-------------------------------------------------------------------
+Tue Dec  6 08:50:41 UTC 2011 - co...@suse.com
+
+- update from https://github.com/openSUSE/obs-service-format_spec_file
+
+-------------------------------------------------------------------
+Thu Dec  1 14:10:52 UTC 2011 - adr...@suse.de
+
+- allow to specify a defined spec file (version 0.2)
+
+-------------------------------------------------------------------

New:
----
  licenses_changes.txt
  patch_license

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ obs-service-format_spec_file.spec ++++++
--- /var/tmp/diff_new_pack.vtghOV/_old  2011-12-12 17:03:22.000000000 +0100
+++ /var/tmp/diff_new_pack.vtghOV/_new  2011-12-12 17:03:22.000000000 +0100
@@ -16,16 +16,18 @@
 #
 
 
-
 Name:           obs-service-format_spec_file
-License:        GPL v2 or later
+Summary:        An OBS source service: reformats a spec file to SUSE standard
+License:        GPL-2.0+
 Group:          Development/Tools/Building
-Summary:        An OBS source service: reformats a spec file to SUSE standard.
-Version:        0.1
-Release:        11
+Version:        0.4
+Release:        0
+Url:            https://github.com/openSUSE/obs-service-format_spec_file
 Source:         format_spec_file
 Source1:        format_spec_file.service
 Source2:        prepare_spec
+Source3:        patch_license
+Source4:        licenses_changes.txt
 Requires:       osc-source_validator
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildArch:      noarch
@@ -49,7 +51,8 @@
 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
+install -m 0755 %{SOURCE2} %{SOURCE3} 
$RPM_BUILD_ROOT/usr/lib/obs/service/format_spec_file.files
+install -m 0644 %{SOURCE4} 
$RPM_BUILD_ROOT/usr/lib/obs/service/format_spec_file.files
 
 %files
 %defattr(-,root,root)

++++++ format_spec_file ++++++
--- /var/tmp/diff_new_pack.vtghOV/_old  2011-12-12 17:03:22.000000000 +0100
+++ /var/tmp/diff_new_pack.vtghOV/_new  2011-12-12 17:03:22.000000000 +0100
@@ -9,6 +9,10 @@
       MYOUTDIR="$2"
       shift
     ;;
+    *-specfile)
+      MYSPECFILES="$MYSPECFILES $2"
+      shift
+    ;;
     *)
       echo Unknown parameter $1.
       echo 'Usage: this service is not excepting parameters'
@@ -19,7 +23,10 @@
 done
 
 RETURN=0
-for i in *.spec; do
+if [ -z "$MYSPECFILES" ]; then
+  MYSPECFILES=`echo *.spec`
+fi
+for i in $MYSPECFILES; do
   if [ "$i" == '*.spec' ]; then
     echo "WARNING: no spec file found"
     exit 0

++++++ format_spec_file.service ++++++
--- /var/tmp/diff_new_pack.vtghOV/_old  2011-12-12 17:03:22.000000000 +0100
+++ /var/tmp/diff_new_pack.vtghOV/_new  2011-12-12 17:03:22.000000000 +0100
@@ -1,5 +1,8 @@
-<service name="source_validator">
-  <summary>Validate sources</summary>
-  <description>The default SUSE source validator which catches common pitfalls 
before build.</description>
+<service name="format_spec_file">
+  <summary>Format the spec files</summary>
+  <description>Formatting the spec files</description>
+  <parameter name="specfile">
+    <description>Just run on specified spec file instead all 
available</description>
+  </parameter>
 </service>
 

++++++ licenses_changes.txt ++++++
SPDX    Name in Spec File
AAL     AAL
AFL-2.1 Academic Free License 2.1
AGPL-3.0        Affero GPL
AFL-2.1 AFL 2.1
AFL-1.2 AFL-1.2
AFL-2.0 AFL-2.0
AFL-2.1 AFL-2.1
AFL-3.0 AFL-3.0
AGPL-3.0        AGPL-3.0
AGPL-3.0        AGPLv3
SUSE-AGPL-3.0+  AGPLv3+
ANTLR-PD        ANTLR-PD
Apache-1.1      Apache 1.1 (Indiana University)
Apache-2.0      Apache 2.0
Apache-2.0      Apache License
Apache-2.0      Apache License 2.0
Apache-2.0      Apache License, Version 2.0
Apache-2.0      Apache Software License ..
Apache-2.0      Apache Software License
Apache-2.0      Apache v2.0
Apache-1.0      Apache-1.0
Apache-1.1      Apache-1.1
Apache-2.0      Apache-2.0
APL-1.0 APL-1.0
APL-1.0 APL-1.0 (spdx.org/licenses)
APSL-1.0        APSL-1.0
APSL-1.1        APSL-1.1
APSL-1.2        APSL-1.2
APSL-2.0        APSL-2.0
Artistic-1.0    Artistic
Artistic-1.0    Artistic 1.0
Artistic-2.0    Artistic 2.0
Artistic-1.0    Artistic license
Artistic-1.0    Artistic License
Artistic-1.0    Artistic License ..
Artistic-1.0    Artistic-1.0
SUSE-Artistic-1.0+      Artistic-1.0+
Artistic-2.0    Artistic-2.0
Apache-1.1      ASL 1.1
Apache-2.0      ASL 2.0
Apache-2.0      ASL2
Apache-2.0      ASLv..
Apache-2.0      ASLv2
Apache-2.0      ASLv2.0
SUSE-Apache-2.0+        ASLv2.0+
BSD-3-Clause    BSD (3-Clause)
BSD-2-Clause    BSD 2 clause
BSD-2-Clause    BSD 2 Clause
BSD-2-Clause    BSD 2-clause
BSD-2-Clause    BSD 2-Clause
BSD-3-Clause    BSD 3-Clause
BSD-3-Clause    BSD 3-clause (or similar)
BSD-2-Clause    BSD-2-Clause
BSD-2-Clause    BSD-2c
BSD-3-Clause    BSD-3
BSD-3-Clause    BSD-3-Clause
BSD-3-Clause    BSD-3-clause (or similar)
BSD-4-Clause    BSD-4-Clause
BSD-2-Clause    BSD2c
BSD-3-Clause    BSD3
BSD-3-Clause    BSD3c
BSD-3-Clause    BSD3c (or similar)
BSD-3-Clause    BSD3c(or similar)
BSD-4-Clause    BSD4c
BSD-4-Clause    BSD4c(or similar)
BSL-1.0 BSL-1.0
CATOSL-1.1      CATOSL-1.1
CC-BY-SA-3.0    CC BY-SA 3.0
CC-BY-SA-2.5    CC by-sa V2.5
CC-BY-SA-3.0    CC BY-SA V3.0
CC-BY-1.0       CC-BY-1.0
CC-BY-2.0       CC-BY-2.0
CC-BY-2.5       CC-BY-2.5
CC-BY-3.0       CC-BY-3.0
CC-BY-NC-1.0    CC-BY-NC-1.0
CC-BY-NC-2.0    CC-BY-NC-2.0
CC-BY-NC-2.5    CC-BY-NC-2.5
CC-BY-NC-3.0    CC-BY-NC-3.0
CC-BY-NC-ND-1.0 CC-BY-NC-ND-1.0
CC-BY-NC-ND-2.0 CC-BY-NC-ND-2.0
CC-BY-NC-ND-2.5 CC-BY-NC-ND-2.5
CC-BY-NC-ND-3.0 CC-BY-NC-ND-3.0
CC-BY-NC-SA-1.0 CC-BY-NC-SA-1.0
CC-BY-NC-SA-2.0 CC-BY-NC-SA-2.0
CC-BY-NC-SA-2.5 CC-BY-NC-SA-2.5
CC-BY-NC-SA-3.0 CC-BY-NC-SA-3.0
CC-BY-ND-1.0    CC-BY-ND-1.0
CC-BY-ND-2.0    CC-BY-ND-2.0
CC-BY-ND-2.5    CC-BY-ND-2.5
CC-BY-ND-3.0    CC-BY-ND-3.0
CC-BY-SA-1.0    CC-BY-SA-1.0
CC-BY-SA-2.0    CC-BY-SA-2.0
CC-BY-SA-2.5    CC-BY-SA-2.5
CC-BY-SA-3.0    CC-BY-SA-3.0
CC0-1.0 CC0-1.0
CDDL-1.0        CDDL
CDDL-1.0        CDDL 1.0
CDDL-1.0        CDDL-1.0
CDDL-1.0 or LGPL-2.1    CDDLv1.0 | LGPLv2.1
CECILL-1.0      CECILL-1.0
CECILL-1.1English       CECILL-1.1English
CECILL-2.0      CECILL-2.0
CECILL-B        CECILL-B
CECILL-C        CECILL-C
ClArtistic      ClArtistic
CPL-1.0 Common Public License - v 1.0
CPL-1.0 Common Public License v1.0
CPL-1.0 Common Public License v1.0 (CPL)
CPL-1.0 Common Public License Version 1.0
CPL-1.0 Common Public License Version 1.0 (CPL1.0)
CPAL-1.0        CPAL-1.0
CPL-1.0 CPL (Common Public License) v1
CPL-1.0 CPL 1.0
CPL-1.0 CPL 1.0 ...
CPL-1.0 CPL-1.0
CUA-OPL-1.0     CUA-OPL-1.0
ECL-1.0 ECL-1.0
ECL-2.0 ECL-2.0
EPL-1.0 Eclipse Public License
EPL-1.0 Eclipse-1.0
EPL-1.0 Eclipse Public License 1.0
eCos-2.0        eCos-2.0
EFL-1.0 EFL-1.0
EFL-2.0 EFL-2.0
Entessa Entessa
EPL-1.0 EPL
EPL-1.0 EPL 1.0
EPL-1.0 EPL 1.0 ...
EPL-1.0 EPL v1.0
EPL-1.0 EPL-1
EPL-1.0 EPL-1.0
ErlPL-1.1       Erlang Public License
ErlPL-1.1       ErlPL-1.1
EUDatagrid      EUDatagrid
EUPL-1.0        EUPL-1.0
EUPL-1.1        EUPL-1.1
MIT     Expat
MIT     Expat License
Fair    Fair
SUSE-GFDL-1.1   FDL v1.1 or later
SUSE-GFDL-1.2+  FDL-1.2+
SUSE-GFDL-1.3+  FDL-1.3+
SUSE-GFDL-1.2+  FDLv1.2+
Frameworx-1.0   Frameworx-1.0
SUSE-Freeware   Freeware
SUSE-Freeware   Freeware license
GFDL-1.1        GFDL 1.1
GFDL-1.2        GFDL 1.2
GFDL-1.1        GFDL v1.1
GFDL-1.2        GFDL v1.2
GFDL-1.1        GFDL-1.1
GFDL-1.2        GFDL-1.2
GFDL-1.3        GFDL-1.3
GFDL-1.1        GFDLv1.1
GFDL-1.2        GFDLv1.2
SUSE-GFDL-1.2+  GFDLv1.2+
GPL-2.0 GLPv2
GFDL-1.1        GNU Free Documentation License, Version 1.1 (GFDL 1.1)
GFDL-1.2        GNU Free Documentation License, Version 1.2 (GFDL 1.2)
GFDL-1.3        GNU Free Documentation License, Version 1.3 (GFDL 1.3)
GPL-2.0 GNU General Public License (GPL) v2
GPL-2.0 GNU General Public License version 2 (GPL v2)
GPL-2.0+        GNU General Public License version 2 or later
GPL-2.0+        GNU General Public License version 2 or later (GPL v2 or later)
GPL-2.0+        GNU General Public License version 2 or later (GPLv2 or later)
GPL-3.0 GNU General Public License version 3 (GPLv3)
GPL-2.0 GNU GPL v2
GPL-3.0+        GNU GPL v3 or later
GPL-3.0 GNU GPL version 3
LGPL-3.0        GNU Lesser General Public License (LGPL), Version 3
LGPL-2.1        GNU Lesser General Public License version 2.1 (LGPL v2.1)
LGPL-3.0        GNU Lesser General Public License version 3 (LGPL v3)
LGPL-2.1+       GNU LGPL v2.1 or later
LGPL-2.1        GNU LGPLv2.1
GPL-2.0 GPL 2.0
GPL-3.0 GPL 3
GPL-2.0 GPL v2
GPL-2.0 GPL v2 only
GPL-2.0+        GPL v2 or later
GPL-2.0+        GPL v2 or later  
GPL-2.0 GPL v2.0
GPL-2.0+        GPL v2.0 or later
GPL-2.0+        GPL v2+
GPL-3.0 GPL v3
GPL-3.0 GPL v3 only
GPL-3.0+        GPL v3 or later
GPL-1.0 GPL-1.0
GPL-1.0+        GPL-1.0+
GPL-2.0 GPL-2
GPL-2.0 GPL-2.0
GPL-2.0; GPL-2.0+       GPL-2.0 GPL-2.0+
GPL-2.0+        GPL-2.0 or later
GPL-2.0-with-autoconf-exception GPL-2.0-with-autoconf-exception
GPL-2.0-with-bison-exception    GPL-2.0-with-bison-exception
GPL-2.0-with-classpath-exception        GPL-2.0-with-classpath-exception
GPL-2.0-with-font-exception     GPL-2.0-with-font-exception
GPL-2.0-with-GCC-exception      GPL-2.0-with-GCC-exception
GPL-2.0; GPL-2.0+       GPL-2.0, GPL-2.0+
GPL-2.0+        GPL-2.0+
Apache-2.0; GPL-2.0+    GPL-2.0+, Apache-2.0
GPL-2.0+; LGPL-2.0+     GPL-2.0+,LGPL-2.0+
GPL-2.0 GPL-2.Ã0
GPL-2.0+        GPL-2+
GPL-3.0 GPL-3
GPL-3.0 GPL-3.0
GPL-3.0-with-autoconf-exception GPL-3.0-with-autoconf-exception
GPL-3.0-with-GCC-exception      GPL-3.0-with-GCC-exception
GPL-3.0; GPL-2.0+       GPL-3.0, GPL-2.0+
GPL-3.0+        GPL-3.0+
GPL-3.0+        GPL-3+
GPL-1.0+        GPL+
GPL-2.0 GPL2
GPL-2.0+        GPL2+
GPL-3.0 GPL3
GPL-1.0+        GPLv1+
GPL-2.0 GPLv2
GPL-2.0 or GPL-3.0      GPLv2 || GPLv3
GPL-2.0+        GPLv2 or later
GPL-2.0+        GPLv2+
GPL-3.0 GPLv3
GPL-3.0+        GPLv3+
gSOAP-1.3b      gSOAP-1.3b
HPND    HPND
IPL-1.0 IBM PL
IPL-1.0 IBM Public License
IPL-1.0 IBM Public License ..
IPA     IPA
IPL-1.0 IPL-1.0
ISC     ISC
ISC     ISC License
LGPL-2.1        LGPL 2.1
LGPL-2.0        LGPL v2
LGPL-2.0+       LGPL v2 or later
LGPL-2.0        LGPL v2.0 only
LGPL-2.0+       LGPL v2.0 or later
LGPL-2.1        LGPL v2.1
LGPL-2.1        LGPL v2.1 only
LGPL-2.1+       LGPL v2.1 or later
LGPL-2.1+       LGPL v2.1+
LGPL-2.1+       LGPL v2+
LGPL-2.1+       LGPL V2+
LGPL-3.0+       LGPL v3 or later
LGPL-2.0        LGPL-2.0
LGPL-2.1+       LGPL-2.0.1 or later
LGPL-2.0+       LGPL-2.0+
LGPL-2.1        LGPL-2.1
LGPL-2.1+       LGPL-2.1+
LGPL-3.0        LGPL-3.0
LGPL-3.0+       LGPL-3.0+
LGPL-2.1        LGPL2.1
LGPL-2.0        LGPLv2
LGPL-2.0        LGPLv2.0
LGPL-2.0+       LGPLv2.0+
LGPL-2.1        LGPLv2.1
LGPL-2.1+       LGPLv2.1+
LGPL-2.1+       LGPLv2+
LGPL-3.0        LGPLv3
LGPL-3.0+       LGPLv3+
GPL-2.0+        libGeoIPUpdate is GPLv2 or later
Libpng  Libpng
LPL-1.02        LPL-1.02
LPPL-1.3c       LPPL ..
LPPL-1.0        LPPL-1.0
LPPL-1.1        LPPL-1.1
LPPL-1.2        LPPL-1.2
LPPL-1.3c       LPPL-1.3c
MirOS   MirOS
MIT     MIT
MIT     MIT licence
MIT     MIT license
MIT     MIT License
MIT     MIT License (or similar)
MIT     MIT-Licence
MIT     MIT/X Consortium License
MIT     MIT/X License
MIT     MIT/X11
Motosoto        Motosoto
MPL-1.1 MOZILLA PUBLIC LICENSE (MPL/NPL)
MPL-1.1 Mozilla Public License 1.1
SUSE-MPL-1.1+   MPL 1.1 or later
MPL-1.0 MPL-1.0
MPL-1.1 MPL-1.1
MPL-1.0 MPLv1.0
MPL-1.1 MPLv1.1
MPL-1.1 MPLv1.1 ..
SUSE-MPL-1.1+   MPLv1.1+
MS-PL   Ms-Pl
MS-PL   MS-PL
MS-RL   MS-RL
Multics Multics
NASA-1.3        NASA-1.3
Naumen  Naumen
NCSA    NCSA
NGPL    NGPL
Nokia   Nokia
NPOSL-3.0       NPOSL-3.0
NTP     NTP
OCLC-2.0        OCLC-2.0
ODbL-1.0        ODbL-1.0
OFL-1.1 OFL
OFL-1.1 OFL-1.1
OGTSL   OGTSL
OLDAP-2.8       OLDAP-2.8
OFL-1.1 Open Font License
OLDAP-2.8       openldap 2.8
OpenSSL OpenSSL
OSL-1.0 OSL-1.0
OSL-2.0 OSL-2.0
OSL-3.0 OSL-3.0
PDDL-1.0        PDDL-1.0
Artistic-1.0 or GPL-1.0+        Perl License
PHP-3.0.1       PHP License
PostgreSQL      PostgreSQL
SUSE-Public-Domain      Public domain
SUSE-Public-Domain      Public Domain
SUSE-Public-Domain      Public Domain, Freeware
SUSE-Public-Domain      Public Domain. See http://www.sentex.ca/~mw
Python-2.0      Python
Python-2.0      Python ..
Python-2.0      Python Copyright
Python-2.0      Python License ..
Python-2.0      Python Software Foundation License
Python-2.0      Python-2.0
QPL-1.0 QPL
QPL-1.0 QPL ..
QPL-1.0 QPL-1.0
RHeCos-1.1      RHeCos-1.1
RPL-1.5 RPL-1.5
RPSL-1.0        RPSL-1.0
RSCPL   RSCPL
Ruby    Ruby
SAX-PD  SAX-PD
IPA     see IPA_Font_License_Agreement_v1.0.txt
OFL-1.1 SIL Open Font License
OFL-1.1 SIL Open Font License 1.1
SimPL-2.0       SimPL-2.0
Sleepycat       Sleepycat
SPL-1.0 SPL-1.0
SugarCRM-1.1.3  SugarCRM-1.1.3
LPPL-1.3c       TeX-License ..
Apache-2.0      The Apache Software License
PHP-3.0.1       The PHP License, version 3.01
VSL-1.0 VSL-1.0
W3C     W3C
W3C     W3C Software License
Watcom-1.0      Watcom-1.0
WXwindows       WXwindows
MIT     X11
MIT     X11 (BSD like)
MIT     X11 MIT
MIT     X11/MIT
XFree86-1.1     XFree86-1.1
Xnet    Xnet
YPL-1.1 YPL-1.1
Zimbra-1.3      Zimbra-1.3
Zlib    Zlib
Zlib    zlib
Zlib    Zlib License
Zlib    zlib/libpng License
ZPL-2.0 Zope Public License
ZPL-2.0 ZPL
ZPL-2.1 ZPL 2.1
ZPL-1.1 ZPL-1.1
ZPL-2.0 ZPL-2.0
ZPL-2.1 ZPL-2.1
++++++ patch_license ++++++
#! /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 $icecreamforbuild = "";
my @copyrights = ();
my $needsrootforbuild = 0;
my $needsbinariesforbuild = 0;
my $nodebuginfo = 0;
my $vim_modeline;
my $nosrc_result = 0;
my $current_section = "header";
my $had_debug_package = 0;
my %pkg_version = ();
my $main_license;
my %seen_licenses = ();
my $main_group;
my %seen_groups = ();
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',
 'Group',
 'Name',
 'NoPatch',
 'NoSource',
 'Obsoletes', 
 'Patch\d*',
 'Prefix',
 'PreReq',
 'Provides',
 'Recommends',
 'Requires',
 'Source\d*',
 'Suggests',
 'Summary',
 '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 compare_arrays {
    my ($first, $second) = @_;
    return 0 unless @$first == @$second;
    for (my $i = 0; $i < @$first; $i++) {
        return 0 if $first->[$i] ne $second->[$i];
    }
    return 1;
}  

sub maybe_add_empty_line()
{
  push @oldspec, "XXXBLANKLINE" 
    if ($current_section ne "description" && $oldspec[-1] !~ /^\s*$/ && 
$oldspec[-1] !~ /^[#%]/);
}

sub change_section($)
{
  my ($new_section) = @_;

  maybe_add_empty_line();

  $current_section = $new_section;
  warn "section changed to $current_section\n" if $debug;
}

my %license_replace = ();
use File::Basename;

sub load_license_map()
{
    return if defined $license_replace{"GPL-2.0"};
    my $scriptdir = File::Basename::dirname($0);
    open(MAP, "$scriptdir/licenses_changes.txt") || die "can't open 
licenses_changes.txt";
    # ignore header
    readline(*MAP);
    my %spdx;
    while (<MAP>) {
        chomp;
        my ($license, $oldstring) = split(/\t/, $_, 2);
        #$license =~ s,\s*$,,;
        #$oldstring =~ s,\s*$,,;
        next unless length($license);
        #print STDERR "$license\t$oldstring\n";
        die "$oldstring is given twice in $_" if defined 
$license_replace{$oldstring};
        $license_replace{$oldstring} = $license;
        $spdx{$license} = 1;
    }
    close(MAP);
    for (keys %spdx) {
        $license_replace{$_} = $_;
    }
}

sub replace_single_spdx($)
{
    my ($l) = @_;

    return '' if $l eq '';

    load_license_map();
    $l =~ s,ORlater,or later,g;
    $l =~ s,ORsim,or similar,g;
    $l =~ s,^\s+,,;
    $l =~ s,\s+$,,;

    if (defined $license_replace{$l}) {
        $l = $license_replace{$l};
    } else {
        print STDERR "Unknown license '$l'\n";
        exit(1);
    }
    return $l;
}

sub replace_spdx_and($);
sub replace_spdx_and($)
{
    my ($license) = @_;

    # special case as or later is common in our spec files
    $license =~ s,or later,ORlater,g;
    $license =~ s,or similar,ORsim,g;
    
    #print STDERR "ORIG '$license'\n";
    my @licenses = ();
    if ( $license =~ /^(.*?)\(([^)]*)\)(.*?)$/ ) {
        my ($head, $paren, $tail) = ($1, $2, $3);
        if ($paren =~ /and|or/) {
            $head = replace_spdx_and($head);
            $tail = replace_spdx_and($tail);
            $paren = replace_spdx_and($paren);
            #print STDERR "AFTE '$head($paren)$tail'\n";
            return "$head($paren)$tail";
        }
    }

    for (split(/(\s+(?:and|or)\s+)/, $license, -1)) {
        $_ = replace_single_spdx($_) unless $_ eq '' || /(\s+(?:and|or)\s+)/;
        s/\s+/ /g;
        push @licenses, $_;
    }
    #print STDERR "AFTE '" . join('', @licenses) . "'\n";
    return join('', @licenses);
}

sub replace_spdx($)
{
    my ($license) = @_;

    my @licenses = ();
    for (split(/\s*;\s*/, $license)) {
        push @licenses, replace_spdx_and($_);
    }
    return join(' ; ', @licenses);
}

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") {
        # stop preamble parsing on two blank lines
        if ($print_comments eq "false" && $oldspec[0] && $oldspec[-1] eq 
"XXXBLANKLINE") {
                $print_comments = "true";
                push @oldspec, "XXXDOUBLELINE";
                next;
        }
        push @oldspec, "XXXBLANKLINE";
        next;
    }

    if ( /^# vim:/ ) {
        $vim_modeline = $_;
        next;
    }
    
    if ( /^#\s*needsrootforbuild\s*$/ ) {
        $needsrootforbuild = 1;
        next;
    }
    if ( /^#\s*needsbinariesforbuild\s*$/ ) {
        $needsbinariesforbuild = 1;
        next;
    }
    if ( /^#\s*norootforbuild/ ) {
        next;
    }

    if ( /^#\s*nodebuginfo\s*$/ ) {
        $nodebuginfo = 1;
        next;
    }
    if ( /^#\s*icecream/ ) {
        $icecreamforbuild = $_;
        $icecreamforbuild =~ s/^#\s*icecream\s*//;
        next;
    }
    if ( /^#\s*Copyright\s*/ ) {
        my $lastlineblank = 0;
        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*$_/ } 
("needsrootforbuild","needsbinariesforbuild","nodebuginfo","icecream","usedforbuild","Commandline","MD5SUM","!BuildIgnore");
            $_ = shift @readspec;
          }
        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;
        for my $br (sort keys(%aa)) {
            push @oldspec, "BuildRequires:  $br";
        }
        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 ( /^\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;
        }
        $args[2] = "" unless $args[2];
        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");
      }
      $_ =~ 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 ( $_ );
      if ($ifhandler->{"disabled"}) {
        $disabled_packs->{$current_package} = 1;
        warn "$current_package is disabled\n" if $debug;
      }
      next;
    }
    if ( /^%description\b/i ) {
      change_section("description");
      push @oldspec, $_;
      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, "$_";
      next;
    }

    if ($current_section eq "header") {
      my $c_pack = $current_package;
      $c_pack .= "_disabled" if $ifhandler->{"disabled"};

      if ( /^Vendor:/ || /^Distribution:/ || /^Packager:/ ) {
        next;
      }
      # remove default value of Autoreqprov
      if ( /^Autoreqprov\s*:\s*(.*)/i ) {
          next if ( lc($1) eq "on" || lc($1) eq "yes");
      }
      # reset Release
      if ( /^Release\s*:\s*(.*)/i ) {
          # will be after Version
          next;
      }
      if ( /^Summary\s*:\s*(.*)\s*$/i ) {
          push @oldspec, sprintf("%-16s%s", "Summary:", $1);
          push @oldspec, "XXXPOSTSUMMARY $current_package";
          next;
      }

      # remove license and print out after license later
      if ( /^License\s*:\s*(.*)\s*$/i || /^Copyright\s*:\s*(.*)\s*$/i ) {
          my $license = replace_spdx($1);
          $main_license = $license if (!$main_license);
          $seen_licenses{$current_package} = $license;
          next;
      }

      # remove groups and print out after summary later
      if ( /^Group\s*:\s*(.*)\s*$/i ) {
          my $group = $1;
          $main_group = $group if (!$main_group);
          $seen_groups{$current_package} = $group;
          next;
      }

      if ( /^BuildArchitectures\s*:/i ) {
        $_ =~ s/^[^:]+:/BuildArch:/;
      }

      if ( /^BuildRoot\s*:/i ) {
        push @oldspec, "BuildRoot:      %{_tmppath}/%{name}-%{version}-build";
        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{$c_pack} = $_;
        $version{$c_pack} =~ s/^Version:\s*(.*)\s*/$1/;
        push @oldspec, sprintf("%-16s%s","Version:",$version{$c_pack});
        push @oldspec, sprintf("%-16s%s","Release:", "0");
        next;
      }
    }
    if ( $current_section ne "changelog" ) {
      push @oldspec, $_;
      next;
    }
  }

}

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 ( m/^License\s*:\s*(.*)\s*$/ ) {
        printf("%-16s%s\n","License:", replace_spdx($1));
  } else {
        print "$_\n";
  }     
}

++++++ prepare_spec ++++++
--- /var/tmp/diff_new_pack.vtghOV/_old  2011-12-12 17:03:22.000000000 +0100
+++ /var/tmp/diff_new_pack.vtghOV/_new  2011-12-12 17:03:22.000000000 +0100
@@ -15,21 +15,20 @@
 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 $vim_modeline;
 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 $main_license;
+my %seen_licenses = ();
+my $main_group;
+my %seen_groups = ();
 my $build_root = $ENV{'BUILD_ROOT'};
 my $disabled_packs;
 my $ifhandler;
@@ -51,6 +50,8 @@
  'ExcludeArch',
  'ExclusiveArch',
  'Freshens',
+ 'Group',
+ 'Name',
  'NoPatch',
  'NoSource',
  'Obsoletes', 
@@ -62,6 +63,7 @@
  'Requires',
  'Source\d*',
  'Suggests',
+ 'Summary',
  'Supplements',
  'Url',
 );
@@ -93,10 +95,19 @@
   return $tag;
 }
 
+sub compare_arrays {
+    my ($first, $second) = @_;
+    return 0 unless @$first == @$second;
+    for (my $i = 0; $i < @$first; $i++) {
+       return 0 if $first->[$i] ne $second->[$i];
+    }
+    return 1;
+}  
+
 sub maybe_add_empty_line()
 {
   push @oldspec, "XXXBLANKLINE" 
-    if ($current_section ne "description" && $oldspec[-1] !~ /^\s*$/);
+    if ($current_section ne "description" && $oldspec[-1] !~ /^\s*$/ && 
$oldspec[-1] !~ /^[#%]/);
 }
 
 sub change_section($)
@@ -109,6 +120,96 @@
   warn "section changed to $current_section\n" if $debug;
 }
 
+my %license_replace = ();
+use File::Basename;
+
+sub load_license_map()
+{
+    return if defined $license_replace{"GPL-2.0"};
+    my $scriptdir = File::Basename::dirname($0);
+    open(MAP, "$scriptdir/licenses_changes.txt") || die "can't open 
licenses_changes.txt";
+    # ignore header
+    readline(*MAP);
+    my %spdx;
+    while (<MAP>) {
+       chomp;
+       my ($license, $oldstring) = split(/\t/, $_, 2);
+       #$license =~ s,\s*$,,;
+       #$oldstring =~ s,\s*$,,;
+       next unless length($license);
+       #print STDERR "$license\t$oldstring\n";
+       die "$oldstring is given twice in $_" if defined 
$license_replace{$oldstring};
+       $license_replace{$oldstring} = $license;
+        $spdx{$license} = 1;
+    }
+    close(MAP);
+    for (keys %spdx) {
+       $license_replace{$_} = $_;
+    }
+}
+
+sub replace_single_spdx($)
+{
+    my ($l) = @_;
+
+    return '' if $l eq '';
+
+    load_license_map();
+    $l =~ s,ORlater,or later,g;
+    $l =~ s,ORsim,or similar,g;
+    $l =~ s,^\s+,,;
+    $l =~ s,\s+$,,;
+
+    if (defined $license_replace{$l}) {
+       $l = $license_replace{$l};
+    } else {
+       print STDERR "Unknown license '$l'\n";
+    }
+    return $l;
+}
+
+sub replace_spdx_and($);
+sub replace_spdx_and($)
+{
+    my ($license) = @_;
+
+    # special case as or later is common in our spec files
+    $license =~ s,or later,ORlater,g;
+    $license =~ s,or similar,ORsim,g;
+    
+    #print STDERR "ORIG '$license'\n";
+    my @licenses = ();
+    if ( $license =~ /^(.*?)\(([^)]*)\)(.*?)$/ ) {
+       my ($head, $paren, $tail) = ($1, $2, $3);
+        if ($paren =~ /and|or/) {
+           $head = replace_spdx_and($head);
+           $tail = replace_spdx_and($tail);
+           $paren = replace_spdx_and($paren);
+           #print STDERR "AFTE '$head($paren)$tail'\n";
+           return "$head($paren)$tail";
+        }
+    }
+
+    for (split(/(\s+(?:and|or)\s+)/, $license, -1)) {
+       $_ = replace_single_spdx($_) unless $_ eq '' || /(\s+(?:and|or)\s+)/;
+        s/\s+/ /g;
+       push @licenses, $_;
+    }
+    #print STDERR "AFTE '" . join('', @licenses) . "'\n";
+    return join('', @licenses);
+}
+
+sub replace_spdx($)
+{
+    my ($license) = @_;
+
+    my @licenses = ();
+    for (split(/\s*;\s*/, $license)) {
+       push @licenses, replace_spdx_and($_);
+    }
+    return join(' ; ', @licenses);
+}
+
 sub set_current_pkg {
   my ( $arg ) = @_;
   print "DEBUG: set_current_pkg receiving $arg\n" if $debug;
@@ -130,6 +231,18 @@
   return ($curpack, $curlang);
 }
 
+sub sort_buildrequires_helper {
+  if (($a =~ /^[^#]*\(/) != ($b =~ /^[^#]*\(/)) {
+    if ($a =~ /^[^#]*\(/) {
+      1;
+    } else {
+      -1;
+    }
+  } else {
+    $a cmp $b;
+  }
+}
+
 sub read_and_parse_old_spec {
   my ( $specfile, $base_package ) = @_;
   my $current_package = $base_package;
@@ -148,15 +261,23 @@
 
   while (@readspec) {
     $_ = shift @readspec;
+
     if ( /^\s*$/ && $current_section ne "description") {
+       # stop preamble parsing on two blank lines
+        if ($print_comments eq "false" && $oldspec[0] && $oldspec[-1] eq 
"XXXBLANKLINE") {
+               $print_comments = "true";
+               push @oldspec, "XXXDOUBLELINE";
+               next;
+       }
        push @oldspec, "XXXBLANKLINE";
        next;
     }
-    
-    if ( /^#\s*norootforbuild\s*$/ ) {
-        $norootforbuild = 1;
-        next;
+
+    if ( /^# vim:/ ) {
+       $vim_modeline = $_;
+       next;
     }
+    
     if ( /^#\s*needsrootforbuild\s*$/ ) {
         $needsrootforbuild = 1;
         next;
@@ -165,6 +286,10 @@
         $needsbinariesforbuild = 1;
         next;
     }
+    if ( /^#\s*norootforbuild/ ) {
+       next;
+    }
+
     if ( /^#\s*nodebuginfo\s*$/ ) {
         $nodebuginfo = 1;
         next;
@@ -175,6 +300,7 @@
         next;
     }
     if ( /^#\s*Copyright\s*/ ) {
+        my $lastlineblank = 0;
         for (;;)
           {
             # check if line is ONLY a standard copyright line, if so, ignore.
@@ -182,22 +308,11 @@
             $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");
+               || grep { $readspec[0] =~ /^#\s*$_/ } 
("needsrootforbuild","needsbinariesforbuild","nodebuginfo","icecream","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;
@@ -213,7 +328,9 @@
        # 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));
+       for my $br (sort keys(%aa)) {
+           push @oldspec, "BuildRequires:  $br";
+       }
        next;
     }
     next if ( /^#\s*usedforbuild/ );
@@ -229,6 +346,7 @@
       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/) {
@@ -236,6 +354,7 @@
       }
       next;
     }
+
     if ( /^%debug_package/ ) {
        # remove, we add this ourselves
        next;
@@ -245,9 +364,7 @@
     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, $_;
@@ -330,13 +447,7 @@
     }
     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 ) {
@@ -363,64 +474,56 @@
       }
 
       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") {
       my $c_pack = $current_package;
       $c_pack .= "_disabled" if $ifhandler->{"disabled"};
-      if ( /^Summary\b\s*:\s*(.*)/i ) {
-        $replace_hash{"XXXSUMMARY $c_pack"} = sprintf("%-16s%s","Summary:", 
$1);
-        push @oldspec, "XXXSUMMARY $c_pack";
+
+      if ( /^Vendor:/ || /^Distribution:/ || /^Packager:/ ) {
         next;
       }
-      if ( /^Group\b\s*:\s*(.*)/i ) {
-        $replace_hash{"XXXGROUP $c_pack"} = sprintf("%-16s%s", "Group:", $1);
-        push @oldspec, "XXXGROUP $c_pack";
-        next;
+      # remove default value of Autoreqprov
+      if ( /^Autoreqprov\s*:\s*(.*)/i ) {
+         next if ( lc($1) eq "on" || lc($1) eq "yes");
       }
-      if ( /^Vendor:/ || /^Distribution:/ || /^Packager:/ ) {
-        next;
+      # reset Release
+      if ( /^Release\s*:\s*(.*)/i ) {
+         # will be after Version
+         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 ( /^Summary\s*:\s*(.*)\s*$/i ) {
+         push @oldspec, sprintf("%-16s%s", "Summary:", $1);
+         push @oldspec, "XXXPOSTSUMMARY $current_package";
+         next;
+      }
+
+      # remove license and print out after license later
+      if ( /^License\s*:\s*(.*)\s*$/i || /^Copyright\s*:\s*(.*)\s*$/i ) {
+         my $license = replace_spdx($1);
+         $main_license = $license if (!$main_license);
+         $seen_licenses{$current_package} = $license;
+         next;
+      }
+
+      # remove groups and print out after summary later
+      if ( /^Group\s*:\s*(.*)\s*$/i ) {
+         my $group = $1;
+         $main_group = $group if (!$main_group);
+         $seen_groups{$current_package} = $group;
+         next;
       }
+
       if ( /^BuildArchitectures\s*:/i ) {
         $_ =~ s/^[^:]+:/BuildArch:/;
       }
-      if ( /^Release\s*:\s*(.*)/i ) {
-        $pkg_release{$c_pack} = $_;
-        $replace_hash{"XXXRELEASE $c_pack"} = 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 $c_pack"} = sprintf("%-16s%s","License:", 
$1);
-        push @oldspec, "XXXLICENSE $c_pack";
-        next;
-      }
-      if ( /^Url\s*:\s*(.*)/i ) {
-        $replace_hash{"XXXURL $c_pack"} = sprintf("%-16s%s","Url:", $1);
-        push @oldspec, "XXXURL $c_pack";
-        next;
-      }
+
       if ( m/$global_tags_re\s*(.*)/oi ) {
         my ($tag, $value) = ($1, $2);
         $nosrc_result = 1 if ($tag =~ /(?:nosource|nopatch)/i);
@@ -431,24 +534,17 @@
        warn "found Version, section = $current_section\n" if $debug;
         $version{$c_pack} = $_;
         $version{$c_pack} =~ s/^Version:\s*(.*)\s*/$1/;
-        $replace_hash{"XXXVERSION $c_pack"} = 
sprintf("%-16s%s","Version:",$version{$c_pack});
-        push @oldspec, $replace_hash{"XXXVERSION $c_pack"};
-        push @oldspec, "XXXRELEASE $c_pack";
+        push @oldspec, sprintf("%-16s%s","Version:",$version{$c_pack});
+       push @oldspec, sprintf("%-16s%s","Release:", "0");
         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" 
) {
+    if ( $current_section ne "changelog" ) {
       push @oldspec, $_;
+      next;
     }
   }
+
 }
 
 if ($ARGV[0] eq '--debug') {
@@ -518,16 +614,40 @@
 
 read_and_parse_old_spec ( $specfile, $base_package );
 
-for (@oldspec) {
-  next unless /^XXX/;
-  $please_replace{$_} = 1;
+my $linesmoved = 1;
+while ($linesmoved) {
+    $linesmoved = 0;
+    my @firstlines = ();
+    my @buildrequires = ();
+    while ($oldspec[0]) {
+       my $l = shift @oldspec;
+       if ($l =~ m/^BuildRequires:/ ) {
+           push(@buildrequires, $l);
+       } else {
+           # if there are already buildrequires, we need to sort and exit
+           if (@buildrequires > 0) {
+               my @sortedbrs = sort sort_buildrequires_helper @buildrequires;
+               $linesmoved = !compare_arrays(\@buildrequires, \@sortedbrs);
+               @oldspec = (@firstlines, @sortedbrs, $l, @oldspec);
+               @firstlines = ();
+               @buildrequires = ();
+               last;
+           } else {
+               push(@firstlines, $l);
+           }
+       }
+    }
+    @oldspec = (@firstlines, @oldspec);
 }
 
+
 my $thisyear = localtime->year() + 1900;
 
 unshift @copyrights, "# Copyright (c) $thisyear SUSE LINUX Products GmbH, 
Nuernberg, Germany.";
 
 my $copy_list = join("\n", @copyrights);
+
+print $vim_modeline . "\n" if (defined $vim_modeline);
 print <<EOF;
 #
 # spec file for package $base_package
@@ -545,40 +665,39 @@
 
 # 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";
+print "\n" if ($needsrootforbuild || $needsbinariesforbuild || $nodebuginfo || 
$icecreamforbuild ne '');
 
 while ($oldspec[0] eq "XXXBLANKLINE") {
   shift @oldspec;
 }
 
+my $license_unique = !grep { $_ ne $main_license } values %seen_licenses;
+my $groups_unique = !grep { $_ ne $main_group } values %seen_groups;
+my $first_summary = 1;
+
 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"} || 
!$replace_hash{"XXXLICENSE $current_package"}) {
-               print $replace_hash{"XXXLICENSE $current_package"}."\n";
-       }
+    $line = shift @oldspec;
+    if ($line eq "XXXBLANKLINE") {
+       print "\n" unless $oldspec[0] && ($oldspec[0] =~ m/^XXX.*LINE/ || 
$oldspec[0] =~ /^\s*$/ || $oldspec[0] =~ /^\n/);
+    } elsif ($line eq "XXXDOUBLELINE") {
+       print "\n\n" unless $oldspec[0] && ($oldspec[0] =~ m/^XXX.*LINE/ || 
$oldspec[0] =~ /^\s*$/ || $oldspec[0] =~ /^\n/);
+    } elsif ($line =~ m/XXXPOSTSUMMARY (.*)$/) {
+       my $current_package = $1;
+       my $license = $seen_licenses{$current_package} || $main_license;
+       printf("%-16s%s\n", "License:", $license) if (!$license_unique || 
$first_summary);
+       my $group = $seen_groups{$current_package} || $main_group;
+       printf("%-16s%s\n", "Group:", $group) if (!$groups_unique || 
$first_summary);
+       $first_summary = 0;
+    } else {
+       print "$line\n";
     }
-  }
 }
 
 print "\n" unless $line eq "XXXBLANKLINE";

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to