X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Flicenses.c;h=45684974f528a506ef2a7be9b09db2ea877ce434;hp=9bfa1d2b8d57b3bb005fccc653ba4d209cebf5c8;hb=dc8042b42500f79f613b1197df6cdf739615a89f;hpb=e67de75f0d64096956ad40ecb09462dac6fc5f03 diff --git a/tools/ccanlint/licenses.c b/tools/ccanlint/licenses.c index 9bfa1d2b..45684974 100644 --- a/tools/ccanlint/licenses.c +++ b/tools/ccanlint/licenses.c @@ -1,7 +1,8 @@ #include "licenses.h" #include "ccanlint.h" -#include #include +#include +#include const struct license_info licenses[] = { { "LGPLv2+", "LGPL", @@ -64,6 +65,12 @@ const struct license_info licenses[] = { "without warranty" } }, + { "CC0", "CC0", + { "Waiver.", + "unconditionally waives", + NULL + } + }, { "Public domain", "Public domain", { NULL, NULL, NULL } }, @@ -72,13 +79,98 @@ const struct license_info licenses[] = { }, }; +/* License compatibilty chart (simplified: we don't test that licenses between + * files are compatible). */ +#define O true +#define X false +bool license_compatible[LICENSE_UNKNOWN+1][LICENSE_UNKNOWN] = { +/* LGPL2+ LGPL3 GPL2+ GPL3 BSD CC0 + LGPL2 LGPL GPL2 GPL MIT PD */ +/* _info says: LGPL2+ */ + { O, X, X, O, X, X, X, X, O, O, O, O }, +/* _info says: LGPL2 only */ + { O, O, X, O, X, X, X, X, O, O, O, O }, +/* _info says: LGPL3 (or any later version) */ + { O, X, O, O, X, X, X, X, O, O, O, O }, +/* _info says: LGPL (no version specified) */ + { O, O, O, O, X, X, X, X, O, O, O, O }, +/* _info says: GPL2+ */ + { O, O, O, O, O, X, X, O, O, O, O, O }, +/* _info says: GPL2 only */ + { O, O, O, O, O, O, X, O, O, O, O, O }, +/* _info says: GPL3 (or any later version) */ + { O, O, O, O, O, X, O, O, O, O, O, O }, +/* _info says: GPL (unknown version) */ + { O, O, O, O, O, O, O, O, O, O, O, O }, +/* _info says: BSD (3-clause) */ + { X, X, X, X, X, X, X, X, O, O, O, O }, +/* _info says: MIT */ + { X, X, X, X, X, X, X, X, X, O, O, O }, +/* _info says: CC0 */ + { X, X, X, X, X, X, X, X, X, X, O, O }, +/* _info says: Public domain */ + { X, X, X, X, X, X, X, X, X, X, O, O }, +/* _info says something we don't understand */ + { X, X, X, X, X, X, X, X, X, X, O, O } +}; +#undef X +#undef O + +/* See GPLv2 and v2 (basically same wording) for interpreting versions: + * the "any later version" means the recepient can choose. */ +enum license which_license(struct doc_section *d) +{ + if (!d) + return LICENSE_UNKNOWN; + + /* This means "user chooses what version", including GPLv1! */ + if (streq(d->lines[0], "GPL")) + return LICENSE_GPL; + /* This means "v2 only". */ + if (streq(d->lines[0], "GPLv2")) + return LICENSE_GPLv2; + /* This means "v2 or above" at user's choice. */ + if (streq(d->lines[0], "GPL (v2 or any later version)")) + return LICENSE_GPLv2_PLUS; + /* This means "v3 or above" at user's choice. */ + if (streq(d->lines[0], "GPL (v3 or any later version)")) + return LICENSE_GPLv3; + + /* This means "user chooses what version" */ + if (streq(d->lines[0], "LGPL")) + return LICENSE_LGPL; + /* This means "v2.1 only". */ + if (streq(d->lines[0], "LGPLv2.1")) + return LICENSE_LGPLv2; + /* This means "v2.1 or above" at user's choice. */ + if (streq(d->lines[0], "LGPL (v2.1 or any later version)")) + return LICENSE_LGPLv2_PLUS; + /* This means "v3 or above" at user's choice. */ + if (streq(d->lines[0], "LGPL (v3 or any later version)")) + return LICENSE_LGPLv3; + + if (streq(d->lines[0], "BSD-MIT") || streq(d->lines[0], "MIT")) + return LICENSE_MIT; + if (streq(d->lines[0], "BSD (3 clause)")) + return LICENSE_BSD; + if (streq(d->lines[0], "CC0")) + return LICENSE_CC0; + if (tal_strreg(NULL, d->lines[0], "CC0 \\([Pp]ublic [Dd]omain\\)", + NULL)) + return LICENSE_CC0; + if (tal_strreg(NULL, d->lines[0], "[Pp]ublic [Dd]omain")) + return LICENSE_PUBLIC_DOMAIN; + + return LICENSE_UNKNOWN; +} + const char *get_ccan_simplified(struct ccan_file *f) { if (!f->simplified) { unsigned int i, j; /* Simplify for easy matching: only alnum and single spaces. */ - f->simplified = talloc_strdup(f, get_ccan_file_contents(f)); + f->simplified = tal_strdup(f, get_ccan_file_contents(f)); for (i = 0, j = 0; f->simplified[i]; i++) { if (cisupper(f->simplified[i])) f->simplified[j++] = tolower(f->simplified[i]); @@ -111,3 +203,16 @@ bool find_boilerplate(struct ccan_file *f, enum license license) } return true; } + +struct doc_section *find_license_tag(const struct manifest *m) +{ + struct doc_section *d; + + list_for_each(get_ccan_file_docs(m->info_file), d, list) { + if (!streq(d->function, m->modname)) + continue; + if (streq(d->type, "license")) + return d; + } + return NULL; +}