diff --git a/format_spec_file b/format_spec_file index e6da271..1554799 100644 --- a/format_spec_file +++ b/format_spec_file @@ -9,6 +9,10 @@ while test $# -gt 0; do MYOUTDIR="$2" shift ;; + *-specfile) + MYSPECFILES="$MYSPECFILES $2" + shift + ;; *) echo Unknown parameter $1. echo 'Usage: this service is not excepting parameters' @@ -19,7 +23,10 @@ while test $# -gt 0; do 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 diff --git a/format_spec_file.service b/format_spec_file.service index 8b502ac..4379d57 100644 --- a/format_spec_file.service +++ b/format_spec_file.service @@ -1,5 +1,8 @@ - - Validate sources - The default SUSE source validator which catches common pitfalls before build. + + Format the spec files + Formatting the spec files + + Just run on specified spec file instead all available + diff --git a/licenses_changes.txt b/licenses_changes.txt new file mode 100644 index 0000000..c2ee98a --- /dev/null +++ b/licenses_changes.txt @@ -0,0 +1,366 @@ +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 diff --git a/obs-service-format_spec_file.changes b/obs-service-format_spec_file.changes index a94cf35..b3b8073 100644 --- a/obs-service-format_spec_file.changes +++ b/obs-service-format_spec_file.changes @@ -1,3 +1,23 @@ +------------------------------------------------------------------- +Wed Dec 7 14:04:46 UTC 2011 - coolo@suse.com + +- move pkgconfig() and co to the end of the buildrequires + +------------------------------------------------------------------- +Wed Dec 7 08:22:29 UTC 2011 - coolo@suse.com + +- another update from git to replace way more licenses (0.4) + +------------------------------------------------------------------- +Tue Dec 6 08:50:41 UTC 2011 - coolo@suse.com + +- update from https://github.com/openSUSE/obs-service-format_spec_file + +------------------------------------------------------------------- +Thu Dec 1 14:10:52 UTC 2011 - adrian@suse.de + +- allow to specify a defined spec file (version 0.2) + ------------------------------------------------------------------- Wed Sep 7 13:34:45 CEST 2011 - dmueller@suse.de diff --git a/obs-service-format_spec_file.spec b/obs-service-format_spec_file.spec index b151eb7..cf1b31f 100644 --- a/obs-service-format_spec_file.spec +++ b/obs-service-format_spec_file.spec @@ -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 @@ spec file instead of creating a new one. 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) diff --git a/patch_license b/patch_license new file mode 100644 index 0000000..6cdb58a --- /dev/null +++ b/patch_license @@ -0,0 +1,564 @@ +#! /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 () { + 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 = ; + 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 ( ) { + chomp; + + if ( m/^License\s*:\s*(.*)\s*$/ ) { + printf("%-16s%s\n","License:", replace_spdx($1)); + } else { + print "$_\n"; + } +} + diff --git a/prepare_spec b/prepare_spec index 5c6517b..6393469 100644 --- a/prepare_spec +++ b/prepare_spec @@ -15,21 +15,20 @@ 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 $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 @@ my @global_tags_list = 'ExcludeArch', 'ExclusiveArch', 'Freshens', + 'Group', + 'Name', 'NoPatch', 'NoSource', 'Obsoletes', @@ -62,6 +63,7 @@ my @global_tags_list = 'Requires', 'Source\d*', 'Suggests', + 'Summary', 'Supplements', 'Url', ); @@ -93,10 +95,19 @@ sub capitalize_case($) 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 @@ sub change_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 () { + 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 @@ sub set_current_pkg { 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 @@ sub read_and_parse_old_spec { 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 @@ sub read_and_parse_old_spec { $needsbinariesforbuild = 1; next; } + if ( /^#\s*norootforbuild/ ) { + next; + } + if ( /^#\s*nodebuginfo\s*$/ ) { $nodebuginfo = 1; next; @@ -175,6 +300,7 @@ sub read_and_parse_old_spec { 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 @@ sub read_and_parse_old_spec { $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 @@ sub read_and_parse_old_spec { # 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 @@ sub read_and_parse_old_spec { 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 @@ sub read_and_parse_old_spec { } next; } + if ( /^%debug_package/ ) { # remove, we add this ourselves next; @@ -245,9 +364,7 @@ sub read_and_parse_old_spec { 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 @@ sub read_and_parse_old_spec { } 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 @@ sub read_and_parse_old_spec { } 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"; - next; - } - if ( /^Group\b\s*:\s*(.*)/i ) { - $replace_hash{"XXXGROUP $c_pack"} = sprintf("%-16s%s", "Group:", $1); - push @oldspec, "XXXGROUP $c_pack"; - 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; + # 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 ( /^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 @@ sub read_and_parse_old_spec { 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"} .= $_; + if ( $current_section ne "changelog" ) { + push @oldspec, $_; next; } - if ( $current_section ne "description" && $current_section ne "changelog" ) { - push @oldspec, $_; - } } + } if ($ARGV[0] eq '--debug') { @@ -518,16 +614,40 @@ if ( ! stat ((glob("$specdir/$base_package*.spec"))[0] || "") ) { 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 <