aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLeonardo H. Neumann <leonardohn@null.net>2021-07-27 09:48:01 -0300
committerGeorgy Yakovlev <gyakovlev@gentoo.org>2021-08-02 21:57:25 -0700
commitf9ad9ccf26dda0d1b50aa8e6a7befbc771245534 (patch)
tree0567f0265f1f63e3916272586f982f8dec21b5d6 /src
parentUpdate the CI badge (diff)
downloadcargo-ebuild-f9ad9ccf26dda0d1b50aa8e6a7befbc771245534.tar.gz
cargo-ebuild-f9ad9ccf26dda0d1b50aa8e6a7befbc771245534.tar.bz2
cargo-ebuild-f9ad9ccf26dda0d1b50aa8e6a7befbc771245534.zip
Initial support for license mapping
Closes: https://github.com/gentoo/cargo-ebuild/pull/8 Signed-off-by: Georgy Yakovlev <gyakovlev@gentoo.org>
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs22
-rw-r--r--src/license.rs168
2 files changed, 179 insertions, 11 deletions
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<PathBuf>) -> Result<()> {
let cargo = std::env::var("CARGO")
.map(PathBuf::from)
@@ -86,9 +79,16 @@ pub fn gen_ebuild_data(manifest_path: Option<PathBuf>) -> Result<EbuildConfig> {
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()
+}