From f9ad9ccf26dda0d1b50aa8e6a7befbc771245534 Mon Sep 17 00:00:00 2001 From: "Leonardo H. Neumann" Date: Tue, 27 Jul 2021 09:48:01 -0300 Subject: Initial support for license mapping Closes: https://github.com/gentoo/cargo-ebuild/pull/8 Signed-off-by: Georgy Yakovlev --- src/lib.rs | 22 ++++---- src/license.rs | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 src/license.rs (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index b7616b7..01d915b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ * except according to those terms. */ +mod license; mod metadata; use anyhow::{format_err, Context, Result}; @@ -20,17 +21,9 @@ use std::io::Write; use std::path::{Path, PathBuf}; use std::process::Command; +use license::{normalize_license, split_spdx_license}; use metadata::EbuildConfig; -fn parse_license<'a>(lic_str: &'a str) -> Vec<&'a str> { - lic_str - .split('/') - .flat_map(|l| l.split(" OR ")) - .flat_map(|l| l.split(" AND ")) - .map(str::trim) - .collect() -} - fn generate_lockfile(manifest_path: Option) -> Result<()> { let cargo = std::env::var("CARGO") .map(PathBuf::from) @@ -86,9 +79,16 @@ pub fn gen_ebuild_data(manifest_path: Option) -> Result { root_pkg = Some(pkg.clone()); } - if let Some(lic_list) = pkg.license.as_ref().map(|l| parse_license(&l)) { + if let Some(lic_list) = pkg.license.as_ref().map(|l| split_spdx_license(&l)) { for lic in lic_list.iter() { - licenses.insert(lic.to_string()); + if let Some(norm) = normalize_license(&lic) { + // Add the normalized license name + licenses.insert(norm.to_string()); + } else { + // Add the unknown license name to be corrected manually + println!("WARNING: unknown license \"{}\", please correct manually", &lic); + licenses.insert(lic.to_string()); + } } } diff --git a/src/license.rs b/src/license.rs new file mode 100644 index 0000000..0789829 --- /dev/null +++ b/src/license.rs @@ -0,0 +1,168 @@ +use phf::phf_map; + +static SPDX_TO_LICENSE: phf::Map<&'static str, &'static str> = phf_map! { + "0BSD" => "0BSD", + "AFL-2.1" => "AFL-2.1", + "AFL-3.0" => "AFL-3.0", + "AGPL-3.0" => "AGPL-3", + "AGPL-3.0-only" => "AGPL-3", + "AGPL-3.0-or-later" => "AGPL-3+", + "Aladdin" => "Aladdin", + "AMPAS" => "AMPAS", + "Apache-1.0" => "Apache-1.0", + "Apache-1.1" => "Apache-1.1", + "Apache-2.0" => "Apache-2.0", + "APL-1.0" => "APL-1.0", + "APSL-2.0" => "APSL-2", + "Artistic-1.0" => "Artistic", + "Artistic-2.0" => "Artistic-2", + "Beerware" => "BEER-WARE", + "BSD-1-Clause" => "BSD-1", + "BSD-2-Clause" => "BSD-2", + "BSD-3-Clause" => "BSD", + "BSD-4-Clause" => "BSD-4", + "BSL-1.0" => "Boost-1.0", + "bzip2-1.0.5" => "BZIP2", + "bzip2-1.0.6" => "BZIP2", + "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-4.0" => "CC-BY-4.0", + "CC-BY-NC-4.0" => "CC-BY-NC-4.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-ND-4.0" => "CC-BY-NC-ND-4.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-NC-SA-4.0" => "CC-BY-NC-SA-4.0", + "CC-BY-ND-3.0" => "CC-BY-ND-3.0", + "CC-BY-ND-4.0" => "CC-BY-ND-4.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", + "CC-BY-SA-4.0" => "CC-BY-SA-4.0", + "CC-PD" => "CC-PDDC", + "CC0-1.0" => "CC0-1.0", + "CDDL-1.0" => "CDDL", + "CDDL-1.1" => "CDDL-1.1", + "CECILL-2.0" => "CeCILL-2", + "CECILL-B" => "CeCILL-B", + "CECILL-C" => "CeCILL-C", + "CPAL-1.0" => "CPAL-1.0", + "CPL-1.0" => "CPL-1.0", + "CPOL-1.02" => "CPOL", + "curl" => "curl", + "ECL-2.0" => "ECL-2.0", + "EPL-1.0" => "EPL-1.0", + "EPL-2.0" => "EPL-2.0", + "ErlPL-1.1" => "ErlPL-1.1", + "EUPL-1.1" => "EUPL-1.1", + "EUPL-1.2" => "EUPL-1.2", + "Fair" => "fairuse", + "FSFAP" => "FSFAP", + "FTL" => "FTL", + "GD" => "gd", + "Glulxe" => "Glulxe", + "gnuplot" => "gnuplot", + "GPL-1.0" => "GPL-1", + "GPL-1.0+" => "GPL-1+", + "GPL-1.0-only" => "GPL-1", + "GPL-1.0-or-later" => "GPL-1+", + "GPL-2.0" => "GPL-2", + "GPL-2.0+" => "GPL-2+", + "GPL-2.0-only" => "GPL-2", + "GPL-2.0-or-later" => "GPL-2+", + "GPL-2.0-with-classpath-exception" => "GPL-2-with-classpath-exception", + "GPL-2.0-with-font-exception" => "GPL-2-with-font-exception", + "GPL-3.0" => "GPL-3", + "GPL-3.0+" => "GPL-3+", + "GPL-3.0-only" => "GPL-3", + "GPL-3.0-or-later" => "GPL-3+", + "GPL-3.0-with-autoconf-exception" => "GPL-3-with-autoconf-exception", + "gSOAP-1.3b" => "gSOAP", + "HPND" => "HPND", + "ICU" => "icu", + "IJG" => "IJG", + "ImageMagick" => "imagemagick", + "Info-ZIP" => "Info-ZIP", + "Interbase-1.0" => "Interbase-1.0", + "IPA" => "IPAfont", + "ISC" => "ISC", + "JSON" => "JSON", + "LGPL-2.0" => "LGPL-2", + "LGPL-2.0+" => "LGPL-2+", + "LGPL-2.0-only" => "LGPL-2", + "LGPL-2.0-or-later" => "LGPL-2+", + "LGPL-2.1" => "LGPL-2.1", + "LGPL-2.1+" => "LGPL-2.1+", + "LGPL-2.1-only" => "LGPL-2.1", + "LGPL-2.1-or-later" => "LGPL-2.1+", + "LGPL-3.0" => "LGPL-3", + "LGPL-3.0+" => "LGPL-3+", + "LGPL-3.0-only" => "LGPL-3", + "LGPL-3.0-or-later" => "LGPL-3+", + "Libpng" => "libpng", + "libpng-2.0" => "libpng2", + "libtiff" => "libtiff", + "LPPL-1.2" => "LPPL-1.2", + "LPPL-1.3a" => "LPPL-1.3", + "LPPL-1.3c" => "LPPL-1.3c", + "MirOS" => "MirOS", + "MIT" => "MIT", + "MIT-advertising" => "MIT-with-advertising", + "mpich2" => "mpich2", + "MPL-1.0" => "MPL-1.0", + "MPL-1.1" => "MPL-1.1", + "MPL-2.0" => "MPL-2.0", + "MS-PL" => "Ms-PL", + "NPL-1.1" => "NPL-1.1", + "OFL-1.0" => "OFL", + "OFL-1.1" => "OFL-1.1", + "OLDAP-2.7" => "OPENLDAP", + "OpenSSL" => "openssl", + "OPL-1.0" => "OPL", + "OSL-1.1" => "OSL-1.1", + "OSL-2.0" => "OSL-2.0", + "OSL-2.1" => "OSL-2.1", + "PHP-3.0" => "PHP-3", + "PHP-3.01" => "PHP-3.01", + "PostgreSQL" => "POSTGRESQL", + "PSF-2.0" => "PSF-2", + "psutils" => "psutils", + "Python-2.0" => "PYTHON", + "QPL-1.0" => "QPL-1.0", + "Rdisc" => "rdisc", + "RSA-MD" => "RSA", + "Ruby" => "Ruby", + "Sendmail" => "Sendmail", + "SGI-B-2.0" => "SGI-B-2.0", + "Sleepycat" => "Sleepycat", + "SSPL-1.0" => "SSPL-1", + "TCL" => "tcltk", + "TCP-wrappers" => "tcp_wrappers_license", + "Unlicense" => "Unlicense", + "Vim" => "vim", + "VOSTROM" => "VOSTROM", + "W3C" => "W3C", + "W3C-19980720" => "W3C-document", + "Watcom-1.0" => "Watcom-1.0", + "WTFPL" => "WTFPL-2", + "wxWindows" => "wxWinLL-3.1", + "Zend-2.0" => "Zend-2.0", + "Zlib" => "ZLIB", + "ZPL-2.1" => "ZPL", +}; + +pub fn split_spdx_license(str: &str) -> Vec<&str> { + str.split('/') + .flat_map(|l| l.split(" OR ")) + .flat_map(|l| l.split(" AND ")) + .map(str::trim) + .collect() +} + +pub fn normalize_license(str: &str) -> Option<&'static str> { + SPDX_TO_LICENSE.get(str).copied() +} -- cgit v1.2.3-65-gdbad