Skip to content

Commit

Permalink
[[FEAT]] Update project license
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike committed Aug 2, 2020
1 parent a683c10 commit d65513c
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 11 deletions.
14 changes: 8 additions & 6 deletions README.md
Expand Up @@ -87,12 +87,14 @@ And many more!

## License

Most files are published using [the standard MIT Expat
license](https://www.gnu.org/licenses/license-list.html#Expat). One file,
however, is provided under a slightly modified version of that license. The
so-called [JSON license](https://www.gnu.org/licenses/license-list.html#JSON)
is a non-free license, and unfortunately, we can't change it due to historical
reasons. This license is included as an in-line within the file it concerns.
JSHint is licensed under [the MIT Expat
license](https://www.gnu.org/licenses/license-list.html#Expat).

Prior to version 2.12.0 (release in August 2020), JSHint was partially licensed
under the non-free [JSON
license](https://www.gnu.org/licenses/license-list.html#JSON). [The 2020
Relicensing document](http://jshint.com/relicensing-2020/) details the process
maintainers followed to change the license.

## The JSHint Team

Expand Down
86 changes: 86 additions & 0 deletions docs/relicensing-2020-commits-lacking-signatures.csv
@@ -0,0 +1,86 @@
8accbaed,LMLB@users.noreply.github.com,DOCS-Replace-Private-Use-Area-character,Non-substantive
862f00b0,artem@artnez.com,Do-not-assume-JSON-block-when-mapping-array,"(signed, just erroneously switched e-mail address and name in form)"
e8137dfa,oleg.grenrus@iki.fi,Issue-350-Make-shadow-check-for-outer-scopes-as-well,granted permission via a GPG-signed e-mail sent to project maintainers
e2c876d5,oleg.grenrus@iki.fi,Fixed-1243-Detect-comparisons-with-typeof-x-and-check-the-other-operand,granted permission via a GPG-signed e-mail sent to project maintainers
6038e4e2,artem@artnez.com,Fixed-1253-Limit-parseInt-radix-check-to-ES3-only,"(signed, just erroneously switched e-mail address and name in form)"
dd0effc7,will.lawrence@gmail.com,Fixed-1221-Add-globals-to-the-valOptions-list,Non-substantive
a17ae9ed,lapo@lapo.it,Fixed-1189-Support-spaces-in-global,Rewritten via e542f67722430318e9d4804d9f4089b84507b45a
537dcbd4,code@frantsev.ru,Fixed-1164-Add-codes-to-errors-generated-by-quit,Rewritten via 94d7f239da4b2ae300b2342af0b777a489f63765
87e3e6cc,timruffles@googlemail.com,Fixed-1138-Count-ternary-and-or-operators-for-complexity,Rewritten via 7a5948c64b5b3937e422843c0234f7a4685bba68 and 8a205a808582579592d5301bba587894e3a824c8
66f3e4c1,smath23@gmail.com,Fixed-1133-Make-shelljs-imply-node,Non-substantive
88c862df,usrbincc@yahoo.com,Fixed-1109-Parse-yield-expressions,Rewritten via 6fdb4f60586fce156d62633845ca5a19417379c3
b3d054e0,usrbincc@yahoo.com,Fixed-1105-two-unrelated-bugs-with-a-parser.-See-1106-for-more-info,Rewritten via 691dbdc1970bc1f1406a0d0ab68e184a0f20ece2
88644e3d,smath23@gmail.com,Fixes-1124-Add-shelljs-option,Non-substantive
813de6cb,usrbincc@yahoo.com,Don-t-try-to-parse-expression-closure-bodies-as-comma-expressions,Non-substantive
807db5e3,usrbincc@yahoo.com,Try-directly-setting-x.paren-from-nud-of-prefix,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
72f5f371,usrbincc@yahoo.com,An-attempt-to-ignore-assigns-in-conditionals-when-in-parens,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
6de20a3b,usrbincc@yahoo.com,Break-out-of-comma-expression-parsing-when-a-reserved-word-is-seen,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
21b77a5e,usrbincc@yahoo.com,Update-precedence-for-expression-calls-that-cannot-include-commas,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
48a0ae6a,usrbincc@yahoo.com,Use-the-new-comma-parsing-code-in-if-conditions,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
2865994b,usrbincc@yahoo.com,Make-comma-an-infix-operator,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
2ea9d842,usrbincc@yahoo.com,Handle-assignments-in-switch-conditions,Rewritten via 9b8cec9a2afc5d53adb965824b42e626607d44fc
abbbad5e,usrbincc@yahoo.com,Slightly-cleaner-solution,Non-substantive
8ccd8275,usrbincc@yahoo.com,Fix-read-of-property-use-strict-of-undefined,Non-substantive
cd03a564,usrbincc@yahoo.com,Always-do-the-unstack-and-after-the-last-advance-for-good-measure,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce
b4e146e2,usrbincc@yahoo.com,Add-spec-comment-for-strictness-of-ClassBody,Non-substantive
6b99d1d0,usrbincc@yahoo.com,Remove-explicit-check-for-class-names-eval-or-arguments,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
dfeaebec,usrbincc@yahoo.com,Code-cleanup-reduce-diff-with-master,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
19aa8a10,usrbincc@yahoo.com,expression-should-only-warn-about-future-reserved-words-in-labels,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
9d3abc80,usrbincc@yahoo.com,Remove-unnecessary-esnextReserved-meta-tag,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
9b992412,usrbincc@yahoo.com,Mark-interface-as-an-es5-strictOnly-keyword,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
4d6f9540,usrbincc@yahoo.com,Make-only-class-bodies-strict-by-default-not-the-entire-declaration,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
75b06d7e,usrbincc@yahoo.com,Accept-class-C-extends-AssignmentExpression,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
b6190c8e,usrbincc@yahoo.com,Use-function-param-isclassdef-not-function-classdef-in-conditional,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
bbfa15d1,usrbincc@yahoo.com,Simpler-to-do-one-unstack-here-blockscope-already-has-one-stack,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce
5ac92c2f,usrbincc@yahoo.com,Recognize-unused-let-at-the-global-scope,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce
181f1c80,usrbincc@yahoo.com,Update-class-getter-setter-naming-error-messages-to-be-more-specific,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
c658a4c0,usrbincc@yahoo.com,Fix-error-message-calls,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
ab3a40ba,usrbincc@yahoo.com,Fix-indentation,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
955da17d,usrbincc@yahoo.com,Comments-reformat-and-add-some-more-relevant-quotes-from-the-ES6-spec,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
0235f38d,usrbincc@yahoo.com,Limit-constructor-getter-setter-checks-to-class-definitions,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
cd04ea7b,usrbincc@yahoo.com,Check-for-methods-named-prototype,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
adc4ffe6,usrbincc@yahoo.com,Require-that-constructors-be-regular-methods,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
3c5acdc7,usrbincc@yahoo.com,Treat-methods-and-static-methods-separately-in-checking-for-duplicates,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
df6e0337,usrbincc@yahoo.com,Formatting-only-add-newline,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
0ffccb97,usrbincc@yahoo.com,Remove-unused-vars,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
eacc3bd9,usrbincc@yahoo.com,Extend-strictness-to-cover-the-entire-class-definition,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
8dfa1b64,usrbincc@yahoo.com,Factor-out-common-code-for-class-statements-and-class-expressions,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
93a5120e,usrbincc@yahoo.com,Rename-function-param-classdef-to-isclassdef,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
f8869f14,usrbincc@yahoo.com,Forgot-to-make-class-bodies-strict,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
2fb046e5,usrbincc@yahoo.com,Add-classexpression-handling,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
db6bcc9d,usrbincc@yahoo.com,Handle-class-statements.-Reuses-the-code-for-handling-object-literals,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
fec1bf88,usrbincc@yahoo.com,Treat-class-extends-import-export-as-reserved-when-inESNext,Rewritten via 6759ac902928c32e0c798134abe1fbd1353ad3a3
ebe8156a,code@frantsev.ru,Don-t-warn-about-uncapitalized-global-functions-used-as-constructors,Rewritten via 08eb4e25962eb71f94c09f79b3b08288b91a7bce
b0f3198b,Jason.More@gmail.com,Added-broken-test-for-Node-and-NodeFilter,Non-substantive
e82c83b4,code@frantsev.ru,Add-DOMParser-global-to-browser,Non-substantive
56b998a9,code@frantsev.ru,Add-XMLSerializer-global-to-browser,Non-substantive
2a2c9461,code@frantsev.ru,Add-atob-and-btoa-globals-to-browser,Non-substantive
e2dc30a6,dominic@dbarnes.info,adding-provides-to-couch-env,Non-substantive
fc83cf97,hello@rondevera.com,Add-missing-comma-in-members-list,Non-substantive
6dd6052f,dionyziz@kamibu.com,Adding-HTML-canvas-and-video-tags-for-HTML5,Non-substantive
09c1982c,dionyziz@kamibu.com,Added-predefined-browser-classes-for-various-HTML-object-types,Non-substantive
f9a2dfee,dionyziz@kamibu.com,Added-predefined-browser-classes-for-various-HTML-object-types,Non-substantive
b30bfa89,tom@rixth.org,Separate-check-for-trailing-whitespace-in-to-its-own-function-along-with-tests,removed via 0c0e19319b276b019d285bdfd2cfc49126abd814
38ccb0fb,cmcculloh@gmail.com,Corrected-misspelled-specigic,Non-substantive
6c238084,sky@skyb.us,new-Array-expression-is-valid,Rewritten via 9c07e4c5764a564073433265edcaa3b823fbf41d
7c327bf6,douglas@crockford.com,Tolerate-stupid-blockless-blocks,relicensed via Eclipse
5675d2c6,douglas@crockford.com,http-tech.groups.yahoo.com-group-jslint_com-message-1730,relicensed via Eclipse
73c2fe36,douglas@crockford.com,indent,relicensed via Eclipse
d7896b2c,douglas@crockford.com,step_in-step_out,relicensed via Eclipse
85c95acb,douglas@crockford.com,for-var,relicensed via Eclipse
caa8885a,douglas@crockford.com,use-strict,relicensed via Eclipse
1da55dd6,douglas@crockford.com,http-www.yuiblog.com-blog-2010-12-14-strict-mode-is-coming-to-town,relicensed via Eclipse
b6d8b251,douglas@crockford.com,use-strict,relicensed via Eclipse
dc4a0133,douglas@crockford.com,JSON-escape-v,relicensed via Eclipse
80a22526,douglas@crockford.com,JSON-escape-single-quote,relicensed via Eclipse
bdd35767,douglas@crockford.com,k,relicensed via Eclipse
6735394d,douglas@crockford.com,Cleanup,relicensed via Eclipse
6af839a6,douglas@crockford.com,option.predef,relicensed via Eclipse
c9332068,douglas@crockford.com,Warn-on-new-Array-NUMBER,relicensed via Eclipse
523956b6,douglas@crockford.com,Removing-rhino.js-and-wsh.js.-Other-projects-are-providing-better-alternatives,relicensed via Eclipse
d98f7530,douglas@crockford.com,dangerous-comments,relicensed via Eclipse
35ec4a53,douglas@crockford.com,groove,relicensed via Eclipse
d4a0702b,douglas@crockford.com,More-css-colors,relicensed via Eclipse
eb939e7f,douglas@crockford.com,Use-charAt-instead-of-in-line-1786,relicensed via Eclipse
af040fb1,douglas@crockford.com,Use-.charAt-instead-of-in-line-1786,relicensed via Eclipse
ca120a73,douglas@crockford.com,first-commit,relicensed via Eclipse
111 changes: 111 additions & 0 deletions docs/relicensing-2020.md
@@ -0,0 +1,111 @@
# 2020 Relicensing

In August of 2020, the JSHint project maintainers relicensed the project. This
was the culmination of a years-long effort where great care was taken to
respect the practice of software licensing and the intent of all contributors.
By summarizing the process followed by the maintainers, this document
demonstrates the legitimacy of the change.

## Origin: JSLint

The JSLint project was first made publicly available in 2002. It was
distributed free-of-charge, but it was licensed with the so-called "JSON
License" [1]. Code published under this license is not recognized as "free
software" by the Free Software Foundation [2], nor is it recognized as "open
source" by the Open Source Initiative [3] due to the following clause:

> The Software shall be used for Good, not Evil.
After the initial release, JSLint's creator iteratively improved it through a
series of patches to its one-and-only source code file. Throughout this time,
the owner was the sole contributor to the project.

## The fork

In 2011, another developer made improvements of their own and published the
result as a new project named "JSHint" [4]. This was permissible under the
terms of JSLint's license provided that the new project used the same license
for the code it inherited.

The second developer continued to modify JSHint and also accepted contributions
from others. To promote the maintainability of the source code, new features
were occasionally introduced in distinct files that were designed to be
included at runtime. Referred to as "modules," these files were made available
under the terms of the MIT "Expat" license [5]. As automated tests were written
and included in the project, they too were licensed under MIT "Expat."

In the years that followed, the JSHint project accepted direct code
contributions from hundreds of developers. Many of these patches modified the
original JSON-licensed file. Meanwhile, the author of JSLint permitted the
Eclipse Foundation to relicense a version of JSLint using the MIT Expat license
so that it could be included in their project named Orion [6].

## Injecting a FOSS starting point

In 2013, a user of JSHint requested that the project be relicensed [7]. The
JSHint maintainers obliged via the following procedure:

1. Using the git version control software, they reverted all of the changes
that were submitted to JSHint. (The resulting code was identical to JSLint
at the moment JSHint was created.)
2. They replaced the JSON-licensed version of the code with the MIT-licensed
version published by the Eclipse Foundation. (The resulting code differed
from JSLint only in the license header.)
3. They re-applied all of the changes that were submitted to JSHint.

While this operation created an "alternate history" which demonstrated how
JSHint could have been created as a free software project, it did not
necessarily reflect the intentions of the contributors. JSHint did not at that
time maintain a Contributors Licensing Agreement, so the maintainers did not
have the authority to modify the terms under which the JSHint-specific patches
were submitted.

To address this, the maintainers first introduced a Contributors Licensing
Agreement ("CLA"). They ensured all subsequent contributors agreed to the terms
of the agreement prior to accepting their patches. They contacted every
contributor who had modified the JSON-licensed `jshint.js` file and requested
they they sign the agreement. Although most responded by signing the agreement,
a few refused and still others did not respond.

## Rewriting

A full listing of the patches whose authors have not signed the CLA is
available alongside this document in the JSHint project source code repository.

The maintainers reviewed each patch which could not be relicensed. Many
involved non-substantive changes such as code comment amendments, spelling
corrections, or the introduction of references to standardized APIs. Because
these contributions did not meaningfully alter the behavior of the software,
there could be no claim to ownership, so explicit permission to relicense was
not necessary.

However, a total of six patches included non-trivial changes to `jshint.js`.
The maintainers arranged for each of these to be re-written.

Three contributions were rewritten by four volunteers who never reviewed the
implementation they were rewriting. The project maintainers prepared an
alternate version of the project for each volunteer--one that omitted each
patch that needed to be reimplemented.

Three additional contributions were rewritten by a JSHint project maintainer.
The uniqueness of his work was verified by the other maintainers.

In all cases, correctness of the new implementation was verified by the
project's existing automated tests (because as described above, their licensing
was not subject to change).

## Finalization

With this work complete, every line of code in the JSHint project has been
permitted by its contributor to be licensed using the MIT "Expat" license. The
"alternate history" is available in a Git tag named `relicensing-2020`.

As of version 2.12.0, JSHint is a free software project.

[1] https://www.gnu.org/licenses/license-list.en.html#JSON
[2] *Ibid.*
[3] https://opensource.org/licenses/alphabetical
[4] https://web.archive.org/web/20110224022052/http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to-jshint/
[5] https://www.gnu.org/licenses/license-list.en.html#Expat
[6] http://git.eclipse.org/c/orion/org.eclipse.orion.client.git/tree/lib/jslint/jslint-2011-01-09.js
[7] https://github.com/jshint/jshint/issues/1234
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -67,7 +67,7 @@
"unicode-5.2.0": "^0.7.5",
"unicode-11.0.0": "0.7.x"
},
"license": "(MIT AND JSON)",
"license": "MIT",
"preferGlobal": true,
"files": [
"bin",
Expand Down
7 changes: 3 additions & 4 deletions src/jshint.js
@@ -1,8 +1,9 @@
/*!
* JSHint, by JSHint Community.
*
* This file (and this file only) is licensed under the same slightly modified
* MIT license that JSLint is. It stops evil-doers everywhere:
* Licensed under the MIT license.
*
* JSHint is a derivative work of JSLint:
*
* Copyright (c) 2002 Douglas Crockford (www.JSLint.com)
*
Expand All @@ -16,8 +17,6 @@
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* The Software shall be used for Good, not Evil.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Expand Down

0 comments on commit d65513c

Please sign in to comment.