diff --git a/_service:format_spec_file:obs-service-format_spec_file.spec b/_service:format_spec_file:obs-service-format_spec_file.spec index 7613a14..c61d7c8 100644 --- a/_service:format_spec_file:obs-service-format_spec_file.spec +++ b/_service:format_spec_file:obs-service-format_spec_file.spec @@ -18,14 +18,16 @@ Name: obs-service-format_spec_file -Summary: An OBS source service: reformats a spec file to SUSE standard. +Summary: An OBS source service: reformats a spec file to SUSE standard License: GPL-2.0+ Group: Development/Tools/Building -Version: 0.3 +Version: 0.4 Release: 0 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/format_spec_file.service b/format_spec_file.service index e6607d9..4379d57 100644 --- a/format_spec_file.service +++ b/format_spec_file.service @@ -1,6 +1,6 @@ Format the spec files - The default SUSE source validator which catches common pitfalls before build. + 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..7aeebb7 --- /dev/null +++ b/licenses_changes.txt @@ -0,0 +1,366 @@ +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 +SPDX Name in Spec File +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 1aa0934..3e8307b 100644 --- a/obs-service-format_spec_file.changes +++ b/obs-service-format_spec_file.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +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 diff --git a/obs-service-format_spec_file.spec b/obs-service-format_spec_file.spec index 4463c72..3e352a1 100644 --- a/obs-service-format_spec_file.spec +++ b/obs-service-format_spec_file.spec @@ -17,14 +17,16 @@ Name: obs-service-format_spec_file -Summary: An OBS source service: reformats a spec file to SUSE standard. +Summary: An OBS source service: reformats a spec file to SUSE standard License: GPL-2.0+ Group: Development/Tools/Building -Version: 0.3 +Version: 0.4 Release: 0 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 @@ -48,7 +50,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 43615d0..c954a9d 100644 --- a/prepare_spec +++ b/prepare_spec @@ -120,136 +120,83 @@ 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) = @_; - my %replace = ( - "lgplv2.1only" =>"LGPL-2.1", - "lgplv2.1orlater" => "LGPL-2.1+", - "lgplv2.1+" => "LGPL-2.1+", - "lgplv2.1" => "LGPL-2.1", - "lgplv2.0+" => "LGPL-2.0+", - "lgplv2.0" => "LGPL-2.0", - "lgplv2+" => "LGPL-2.1+", + return '' if $l eq ''; - 'lgplv3' => "LGPL-3.0", - 'lgplv3+' => "LGPL-3.0+", - 'gnulgplv2.1orlater' => "LGPL-2.1+", - 'gnulgplv2.1' => "LGPL-2.1", - 'lgplv2.0orlater' => 'LGPL-2.0+', - 'lgplv2orlater' => 'LGPL-2.0+', + load_license_map(); + $l =~ s,ORlater,or later,g; + $l =~ s,ORsim,or similar,g; + $l =~ s,^\s+,,; + $l =~ s,\s+$,,; - "lgplv3only" => "LGPL-3.0", - "lgplv3orlater" => "LGPL-3.0+", - - "gpl" => "GPL-1.0", - "gpl+" => "GPL-1.0+", - "gplv2only" => "GPL-2.0", - "gplv2" => "GPL-2.0", - "gpl2" => "GPL-2.0", - "gplv2orlater" => "GPL-2.0+", - "gplv2.0orlater" => "GPL-2.0+", - "gplv2+" => "GPL-2.0+", - "gpl-2+" => "GPL-2.0+", - "gplv3only" => "GPL-3.0", - "gplv3orlater" => "GPL-3.0+", - "gplv3+" => "GPL-3.0+", - "gplv3" => "GPL-3.0", - "gpl-3+" => "GPL-3.0+", - "gnugplversion3" => "GPL-3.0", - - "fdl1.1" => "GFDL-1.1", - "gfdlv1.1" => "GFDL-1.1", - 'gnufreedocumentationlicense,version1.1(fdl1.1)' => "GFDL-1.1", - 'gnufreedocumentationlicense,version1.1(gfdl1.1)' => "GFDL-1.1", - "fdl1.2" => "GFDL-1.2", - "gfdl1.2" => "GFDL-1.2", - "gfdlv1.2" => "GFDL-1.2", - 'gnufreedocumentationlicense,version1.2(fdl1.2)' => "GFDL-1.2", - 'gnufreedocumentationlicense,version1.2(gfdl1.2)' => "GFDL-1.2", - "fdl1.3" => "GFDL-1.3", - - "bsd-2c" => "BSD-2-Clause", - "bsd3-clause" => "BSD-3-Clause", - "bsd3c" => "BSD-3-Clause", - "bsd3c(orsimilar)" => "BSD-3-Clause", - "bsd3-clause(orsimilar)" => "BSD-3-Clause", - - "bsd4c" => "BSD-4-Clause", - "bsd4c(orsimilar)" => "BSD-4-Clause", - - "x11/mit" => "MIT", - "X11mit" => "MIT", - "mitlicense(orsimilar)" => "MIT", - - "asl2.0" => "Apache-2.0", - 'apachelicense2.0' => "Apache-2.0", - 'apachelicense' => "Apache-2.0", - 'theapachesoftwarelicense' => "Apache-2.0", - "apachesoftwarelicense.." => "Apache-2.0", - 'apachesoftware license..' => "Apache-2.0", - 'aslv..' => "Apache-2.0", - 'aslv2' => "Apache-2.0", - - "artistic" => "Artistic-1.0", - "artistic2.0" => "Artistic-2.0", - - "thephplicense,version3.01" => "PHP-3.01", - "phplicense" => "PHP-3.01", - "mplv1.0" => "MPL-1.0", - "mplv1.1" => "MPL-1.1", - - "ibmpubliclicense.." => "IPL-1.0", - "ibmpl" => "IPL-1.0", - - "eclipsepubliclicense" => "EPL-1.0", - - "openldap2.8" => "OLDAP-2.8", - - "zliblicense" => "Zlib" - - ); - - my $tl = lc $l; - $tl =~ s, ,,g; - if (defined $replace{$tl}) { - $l = $replace{$tl}; + if (defined $license_replace{$l}) { + $l = $license_replace{$l}; } else { - my @m = grep(lc($_) eq lc($l), values(%replace)); - if (@m) { - $l = $m[0]; - } else { - print STDERR "unknown license '$l'\n"; - } + print STDERR "Unknown license '$l'\n"; } return $l; } -sub replace_spdx_or($) -{ - my ($license) = @_; - - # special case as or later is common in our spec files - $license =~ s, or later, orlater,g; - - my @licenses = (); - for (split(/\s+or\s+/, $license)) { - push @licenses, replace_single_spdx($_); - } - - return join(' or ', sort(@licenses)); -} - +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 = (); - for (split(/\s*and\s*/, $license)) { - push @licenses, replace_spdx_or($_); + 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"; + } } - return join(' and ', sort(@licenses)); + + 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($) @@ -260,7 +207,7 @@ sub replace_spdx($) for (split(/\s*;\s*/, $license)) { push @licenses, replace_spdx_and($_); } - return join(' ; ', sort(@licenses)); + return join(' ; ', @licenses); } sub set_current_pkg {