From cdad22c5fdc6579ea6aeccf67372e81372e857b1 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Thu, 8 Mar 2018 14:04:43 +0000 Subject: Update the SPDX license list to v3.0 The SPDX team have decided to rename quite a few common tags (with the '-only' and '-or-later') suffixes and this unfortunately breaks the world. Convert the new-style v3 style IDs to the v2 style and thus accept both forms. Fixes https://github.com/hughsie/appstream-glib/issues/225 --- libappstream-glib/as-license-ids.txt | 246 +++++++++++++++++++---------------- libappstream-glib/as-self-test.c | 7 + libappstream-glib/as-utils.c | 27 +++- 3 files changed, 164 insertions(+), 116 deletions(-) diff --git a/libappstream-glib/as-license-ids.txt b/libappstream-glib/as-license-ids.txt index 794751e..aac4b08 100644 --- a/libappstream-glib/as-license-ids.txt +++ b/libappstream-glib/as-license-ids.txt @@ -1,87 +1,69 @@ -# the list of licenses from http://spdx.org/licenses/ version: 2.6 -Glide +# the list of licenses from http://spdx.org/licenses/ version: 3.0 +0BSD +AAL Abstyles +Adobe-2006 +Adobe-Glyph +ADSL AFL-1.1 AFL-1.2 AFL-2.0 AFL-2.1 AFL-3.0 -AMPAS -APL-1.0 -Adobe-Glyph -APAFML -Adobe-2006 -AGPL-1.0 Afmparse +AGPL-1.0 +AGPL-3.0-only +AGPL-3.0-or-later Aladdin -ADSL AMDPLPA +AML +AMPAS ANTLR-PD Apache-1.0 Apache-1.1 Apache-2.0 -AML +APAFML +APL-1.0 APSL-1.0 APSL-1.1 APSL-1.2 APSL-2.0 -Artistic-1.0 -Artistic-1.0-Perl Artistic-1.0-cl8 +Artistic-1.0-Perl +Artistic-1.0 Artistic-2.0 -AAL Bahyph Barr Beerware BitTorrent-1.0 BitTorrent-1.1 -BSL-1.0 Borceux -BSD-2-Clause +BSD-1-Clause BSD-2-Clause-FreeBSD BSD-2-Clause-NetBSD -BSD-3-Clause +BSD-2-Clause-Patent +BSD-2-Clause +BSD-3-Clause-Attribution BSD-3-Clause-Clear -BSD-3-Clause-No-Nuclear-License +BSD-3-Clause-LBNL BSD-3-Clause-No-Nuclear-License-2014 +BSD-3-Clause-No-Nuclear-License BSD-3-Clause-No-Nuclear-Warranty +BSD-3-Clause +BSD-4-Clause-UC BSD-4-Clause BSD-Protection BSD-Source-Code -BSD-3-Clause-Attribution -0BSD -BSD-4-Clause-UC +BSL-1.0 bzip2-1.0.5 bzip2-1.0.6 Caldera -CECILL-1.0 -CECILL-1.1 -CECILL-2.0 -CECILL-2.1 -CECILL-B -CECILL-C -ClArtistic -MIT-CMU -CNRI-Jython -CNRI-Python -CNRI-Python-GPL-Compatible -CPOL-1.02 -CDDL-1.0 -CDDL-1.1 -CPAL-1.0 -CPL-1.0 CATOSL-1.1 -Condor-1.1 CC-BY-1.0 CC-BY-2.0 CC-BY-2.5 CC-BY-3.0 CC-BY-4.0 -CC-BY-ND-1.0 -CC-BY-ND-2.0 -CC-BY-ND-2.5 -CC-BY-ND-3.0 -CC-BY-ND-4.0 CC-BY-NC-1.0 CC-BY-NC-2.0 CC-BY-NC-2.5 @@ -97,12 +79,35 @@ CC-BY-NC-SA-2.0 CC-BY-NC-SA-2.5 CC-BY-NC-SA-3.0 CC-BY-NC-SA-4.0 +CC-BY-ND-1.0 +CC-BY-ND-2.0 +CC-BY-ND-2.5 +CC-BY-ND-3.0 +CC-BY-ND-4.0 CC-BY-SA-1.0 CC-BY-SA-2.0 CC-BY-SA-2.5 CC-BY-SA-3.0 CC-BY-SA-4.0 CC0-1.0 +CDDL-1.0 +CDDL-1.1 +CDLA-Permissive-1.0 +CDLA-Sharing-1.0 +CECILL-1.0 +CECILL-1.1 +CECILL-2.0 +CECILL-2.1 +CECILL-B +CECILL-C +ClArtistic +CNRI-Jython +CNRI-Python-GPL-Compatible +CNRI-Python +Condor-1.1 +CPAL-1.0 +CPL-1.0 +CPOL-1.02 Crossword CrystalStacker CUA-OPL-1.0 @@ -110,131 +115,142 @@ Cube curl D-FSL-1.0 diffmark -WTFPL DOC Dotseqn DSDP dvipdfm -EPL-1.0 ECL-1.0 ECL-2.0 -eGenix EFL-1.0 EFL-2.0 -MIT-advertising -MIT-enna +eGenix Entessa +EPL-1.0 +EPL-2.0 ErlPL-1.1 EUDatagrid EUPL-1.0 EUPL-1.1 +EUPL-1.2 Eurosym Fair -MIT-feh Frameworx-1.0 FreeImage -FTL FSFAP FSFUL FSFULLR +FTL +GFDL-1.1-only +GFDL-1.1-or-later +GFDL-1.2-only +GFDL-1.2-or-later +GFDL-1.3-only +GFDL-1.3-or-later Giftware GL2PS +Glide Glulxe -AGPL-3.0 -GFDL-1.1 -GFDL-1.2 -GFDL-1.3 -GPL-1.0 -GPL-2.0 -GPL-3.0 -LGPL-2.1 -LGPL-3.0 -LGPL-2.0 gnuplot +GPL-1.0-only +GPL-1.0-or-later +GPL-2.0-only +GPL-2.0-or-later +GPL-3.0-only +GPL-3.0-or-later gSOAP-1.3b HaskellReport HPND IBM-pibs -IPL-1.0 ICU +IJG ImageMagick iMatix Imlib2 -IJG Info-ZIP Intel-ACPI Intel Interbase-1.0 IPA +IPL-1.0 ISC JasPer-2.0 JSON -LPPL-1.0 -LPPL-1.1 -LPPL-1.2 -LPPL-1.3a -LPPL-1.3c +LAL-1.2 +LAL-1.3 Latex2e -BSD-3-Clause-LBNL Leptonica +LGPL-2.0-only +LGPL-2.0-or-later +LGPL-2.1-only +LGPL-2.1-or-later +LGPL-3.0-only +LGPL-3.0-or-later LGPLLR Libpng libtiff -LAL-1.2 -LAL-1.3 LiLiQ-P-1.1 -LiLiQ-Rplus-1.1 LiLiQ-R-1.1 -LPL-1.02 +LiLiQ-Rplus-1.1 LPL-1.0 +LPL-1.02 +LPPL-1.0 +LPPL-1.1 +LPPL-1.2 +LPPL-1.3a +LPPL-1.3c MakeIndex -MTLL -MS-PL -MS-RL MirOS -MITNFA +MIT-advertising +MIT-CMU +MIT-enna +MIT-feh MIT +MITNFA Motosoto +mpich2 MPL-1.0 MPL-1.1 -MPL-2.0 MPL-2.0-no-copyleft-exception -mpich2 +MPL-2.0 +MS-PL +MS-RL +MTLL Multics Mup NASA-1.3 Naumen NBPL-1.0 +NCSA Net-SNMP NetCDF +Newsletr NGPL +NLOD-1.0 +NLPL +Nokia NOSL +Noweb NPL-1.0 NPL-1.1 -Newsletr -NLPL -Nokia NPOSL-3.0 -NLOD-1.0 -Noweb NRL NTP -Nunit +OCCT-PL OCLC-2.0 ODbL-1.0 -PDDL-1.0 -OCCT-PL +OFL-1.0 +OFL-1.1 OGTSL -OLDAP-2.2.2 OLDAP-1.1 OLDAP-1.2 OLDAP-1.3 OLDAP-1.4 -OLDAP-2.0 OLDAP-2.0.1 +OLDAP-2.0 OLDAP-2.1 -OLDAP-2.2 OLDAP-2.2.1 +OLDAP-2.2.2 +OLDAP-2.2 OLDAP-2.3 OLDAP-2.4 OLDAP-2.5 @@ -242,14 +258,15 @@ OLDAP-2.6 OLDAP-2.7 OLDAP-2.8 OML +OpenSSL OPL-1.0 +OSET-PL-2.1 OSL-1.0 OSL-1.1 OSL-2.0 OSL-2.1 OSL-3.0 -OpenSSL -OSET-PL-2.1 +PDDL-1.0 PHP-3.0 PHP-3.01 Plexus @@ -257,62 +274,60 @@ PostgreSQL psfrag psutils Python-2.0 -QPL-1.0 Qhull +QPL-1.0 Rdisc -RPSL-1.0 +RHeCos-1.1 RPL-1.1 RPL-1.5 -RHeCos-1.1 -RSCPL +RPSL-1.0 RSA-MD +RSCPL Ruby SAX-PD Saxpath SCEA -SWL -SMPPL Sendmail SGI-B-1.0 SGI-B-1.1 SGI-B-2.0 -OFL-1.0 -OFL-1.1 SimPL-2.0 +SISSL-1.2 +SISSL Sleepycat +SMLNJ +SMPPL SNIA Spencer-86 Spencer-94 Spencer-99 -SMLNJ -SugarCRM-1.1.3 -SISSL -SISSL-1.2 SPL-1.0 -Watcom-1.0 +SugarCRM-1.1.3 +SWL TCL TCP-wrappers -Unlicense TMate TORQUE-1.1 TOSL Unicode-DFS-2015 Unicode-DFS-2016 Unicode-TOU +Unlicense UPL-1.0 -NCSA Vim VOSTROM VSL-1.0 -W3C-20150513 W3C-19980720 +W3C-20150513 W3C +Watcom-1.0 Wsuipa -Xnet +WTFPL X11 Xerox XFree86-1.1 xinetd +Xnet xpp XSkat YPL-1.0 @@ -321,24 +336,35 @@ Zed Zend-2.0 Zimbra-1.3 Zimbra-1.4 -Zlib zlib-acknowledgement +Zlib ZPL-1.1 ZPL-2.0 ZPL-2.1 +AGPL-3.0 eCos-2.0 +GFDL-1.1 +GFDL-1.2 +GFDL-1.3 GPL-1.0+ +GPL-1.0 GPL-2.0+ GPL-2.0-with-autoconf-exception GPL-2.0-with-bison-exception GPL-2.0-with-classpath-exception GPL-2.0-with-font-exception GPL-2.0-with-GCC-exception +GPL-2.0 GPL-3.0+ GPL-3.0-with-autoconf-exception GPL-3.0-with-GCC-exception +GPL-3.0 +LGPL-2.0+ +LGPL-2.0 LGPL-2.1+ +LGPL-2.1 LGPL-3.0+ -LGPL-2.0+ +LGPL-3.0 +Nunit StandardML-NJ -WXwindows +wxWindows diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index d5fa597..a6edd49 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -4386,6 +4386,13 @@ as_test_utils_spdx_token_func (void) g_strfreev (tok); g_free (tmp); + /* multiple licences, using the new style */ + tok = as_utils_spdx_license_tokenize ("LGPL-2.0-or-later AND GPL-2.0-only"); + tmp = g_strjoinv (" ", tok); + g_assert_cmpstr (tmp, ==, "@LGPL-2.0+ & @GPL-2.0"); + g_strfreev (tok); + g_free (tmp); + /* multiple licences, deprectated 'and' & 'or' */ tok = as_utils_spdx_license_tokenize ("LGPL-2.0+ and GPL-2.0 or LGPL-3.0"); tmp = g_strjoinv (" ", tok); diff --git a/libappstream-glib/as-utils.c b/libappstream-glib/as-utils.c index 5526a2d..5516eca 100644 --- a/libappstream-glib/as-utils.c +++ b/libappstream-glib/as-utils.c @@ -394,6 +394,17 @@ as_utils_spdx_license_tokenize_drop (AsUtilsSpdxHelper *helper) g_string_truncate (helper->collect, 0); } +/* SPDX decided to rename some of the really common license IDs in v3 + * which broke a lot of tools that we cannot really fix now */ +static gchar * +as_utils_spdx_license_3to2 (const gchar *license3) +{ + GString *license2 = g_string_new (license3); + as_utils_string_replace (license2, "-only", ""); + as_utils_string_replace (license2, "-or-later", "+"); + return license2; +} + /** * as_utils_spdx_license_tokenize: * @license: a license string, e.g. "LGPLv2+ and (QPL or GPLv2) and MIT" @@ -411,32 +422,36 @@ as_utils_spdx_license_tokenize_drop (AsUtilsSpdxHelper *helper) gchar ** as_utils_spdx_license_tokenize (const gchar *license) { - guint i; AsUtilsSpdxHelper helper; + g_autoptr(GString) license2 = NULL; /* handle invalid */ if (license == NULL) return NULL; + /* SPDX broke the world with v3 */ + license2 = as_utils_spdx_license_3to2 (license); + helper.last_token_literal = FALSE; helper.collect = g_string_new (""); helper.array = g_ptr_array_new_with_free_func (g_free); - for (i = 0; license[i] != '\0'; i++) { + for (guint i = 0; i < license2->len; i++) { /* handle brackets */ - if (license[i] == '(' || license[i] == ')') { + const gchar tmp = license2->str[i]; + if (tmp == '(' || tmp == ')') { as_utils_spdx_license_tokenize_drop (&helper); - g_ptr_array_add (helper.array, g_strdup_printf ("%c", license[i])); + g_ptr_array_add (helper.array, g_strdup_printf ("%c", tmp)); helper.last_token_literal = FALSE; continue; } /* space, so dump queue */ - if (license[i] == ' ') { + if (tmp == ' ') { as_utils_spdx_license_tokenize_drop (&helper); continue; } - g_string_append_c (helper.collect, license[i]); + g_string_append_c (helper.collect, tmp); } /* dump anything remaining */ -- cgit v1.2.1